diff --git a/dist/index.bundle.js b/dist/index.bundle.js index 3ec4175..0f6b590 100644 --- a/dist/index.bundle.js +++ b/dist/index.bundle.js @@ -106889,7 +106889,7 @@ function PrayerCircle(_a) { } var tmp = React.memo(PrayerCircle); exports.PrayerCircle = tmp; -cordova_sites_1.Sites.addInitialization(function (app) { return app.addDeepLink('/PrayerCircle', tmp); }); +// Sites.addInitialization((app) => app.addDeepLink('/PrayerCircle', tmp)); /***/ }), @@ -111517,4 +111517,4 @@ store_1.store.subscribe(function () { /***/ }) /******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0UGFyZW50Tm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRTY3JvbGxQYXJlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Vmlld3BvcnRSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLWJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2Zvcm1hdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VuaXF1ZUJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy93aXRoaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1hcmlhL3Nzci9kaXN0L21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlZHV4anMvdG9vbGtpdC9kaXN0L3JlZHV4LXRvb2xraXQuZXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ2FsbGJhY2tSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VDb21taXR0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VFdmVudENhbGxiYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlSXNvbW9ycGhpY0VmZmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1lcmdlZFJlZnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNb3VudGVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlVGltZW91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZUVmZmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VXaWxsVW5tb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0FuY2hvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0RhdGFLZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Ecm9wZG93bi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duSXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duTWVudS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duVG9nZ2xlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vTW9kYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Nb2RhbE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXZDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vTmF2SXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL05vb3BUcmFuc2l0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL1NlbGVjdGFibGVDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vVGFiQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL1RhYlBhbmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vVGFicy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL2dldFNjcm9sbGJhcldpZHRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3BvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3Nzci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVBvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVJvb3RDbG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVdhaXRGb3JET01SZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS91c2VXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ2FsbGJhY2tSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ29tbWl0dGVkUmVmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZUV2ZW50Q2FsbGJhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VGb3JjZVVwZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VHbG9iYWxMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJc29tb3JwaGljRWZmZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1lcmdlU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlTWVyZ2VTdGF0ZUZyb21Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNZXJnZWRSZWZzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1vdW50ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUHJldmlvdXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUmFmSW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUmVzaXplT2JzZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlU2FmZVN0YXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlV2lsbFVubW91bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvY3NzL2Jvb3RzdHJhcC5taW4uY3NzPzk0NDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL0RlZXBMaW5rcy9EZWVwTGlua0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL0RlZXBMaW5rcy9Sb3V0ZURlZXBMaW5rSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZG92YS1zaXRlcy9kaXN0L2NsaWVudC9BcHAvSG9va3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vQ2xhc3NTaXRlQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0FwcC9TaXRlQW5pbWF0aW9uL0RlZmF1bHRTaXRlQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0FwcC9TaXRlQW5pbWF0aW9uL1NpdGVBbmltYXRpb25JbnRlcmZhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVJZENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0RldmljZVJlYWR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L05hdGl2ZVN0b3JhZ2VQcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvRmluaXNoU2l0ZUxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvU2l0ZS9TaXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvU2l0ZUNvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZG92YS1zaXRlcy9kaXN0L2NsaWVudC9TaXRlL1NpdGVMaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvVG9wQmFyL0JhY2tCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvU2l0ZS9Ub3BCYXIvVG9wQmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVxdWFsL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWN0aXZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2FkZENsYXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWRkRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2NhbWVsaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY2FuVXNlRE9NLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9jc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9nZXRDb21wdXRlZFN0eWxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vaGFzQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9oeXBoZW5hdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9oeXBoZW5hdGVTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2lzVHJhbnNmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vbGlzdGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vb3duZXJEb2N1bWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL293bmVyV2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcXVlcnlTZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL3JlbW92ZUNsYXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcmVtb3ZlRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL3Njcm9sbGJhclNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS90cmFuc2l0aW9uRW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vdHJpZ2dlckV2ZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzLWhlbHBlci9kaXN0L3NoYXJlZC9BcnJheUhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0NvdW50ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzLWhlbHBlci9kaXN0L3NoYXJlZC9EYXRlSGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvSGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvSnNvbkhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL01pZ3JhdGlvbkhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL09iamVjdEhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1ByaW9yaXRpemVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1JhbmRvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1hTU0hlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtbGlicy1icm93c2VyL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy1leHRyYS9saWIvYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzLWV4dHJhL2xpYi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3h5LWNvbXBhcmUvZGlzdC9pbmRleC5tb2Rlcm4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3h5LW1lbW9pemUvZGlzdC9pbmRleC5tb2Rlcm4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9ib290c3RyYXBSZWFjdE1vYmlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9DYXJkL0NhcmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL0J1dHRvbi9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL0NoZWNrQm94L0NoZWNrYm94LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL0Zvcm1FbGVtZW50cy9FdmVudFR5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL0Zvcm1FbGVtZW50cy9JbnB1dC9IaWRkZW5JbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9Gb3JtRWxlbWVudHMvSW5wdXQvSW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL1N3aXRjaC9Td2l0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGF5b3V0L0ZsZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGF5b3V0L0dyb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGlzdC9MaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1JibUNvbXBvbmVudFByb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RhYmxlL1RhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RleHQvQm9keS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9Ub3BCYXIvVG9wQmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RvcEJhci9Ub3BCYXJCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvVHlwZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvaGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Fic3RyYWN0TW9kYWxIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkJvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uQnV0dG9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkNvbGxhcHNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uSGVhZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkl0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uSXRlbUNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWxlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQW5jaG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0JhZGdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Jvb3RzdHJhcE1vZGFsTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CcmVhZGNydW1iLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0JyZWFkY3J1bWJJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CdXR0b25Hcm91cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CdXR0b25Ub29sYmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NhcmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NhcmRIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEhlYWRlckNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEltZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DYXJvdXNlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DYXJvdXNlbENhcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2Fyb3VzZWxJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Nsb3NlQnV0dG9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Db2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Db250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25CdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25Db250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Ryb3Bkb3duSXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93bk1lbnUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25Ub2dnbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRWxlbWVudENoaWxkcmVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0ZhZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmVlZGJhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmlndXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0ZpZ3VyZUNhcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmlndXJlSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmxvYXRpbmdMYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Zvcm1DaGVjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ2hlY2tJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ2hlY2tMYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ29udHJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtRmxvYXRpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRm9ybUdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Zvcm1MYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRm9ybVNlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtVGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9JbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9JbnB1dEdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0lucHV0R3JvdXBDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0xpc3RHcm91cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9MaXN0R3JvdXBJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL01vZGFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL01vZGFsQm9keS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Nb2RhbENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxEaWFsb2cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxGb290ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxUaXRsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2RHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2SXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZMaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdmJhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJCcmFuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJDb2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdmJhck9mZmNhbnZhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJUb2dnbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc0JvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzSGVhZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc1RpdGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc1RvZ2dsaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL092ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT3ZlcmxheVRyaWdnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUGFnZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9QbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9QbGFjZWhvbGRlckJ1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Qb3BvdmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1BvcG92ZXJCb2R5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1BvcG92ZXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUHJvZ3Jlc3NCYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUmF0aW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUm93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1NTUlByb3ZpZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1NwaW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3BsaXRCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3RhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3dpdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UYWJDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVGFiQ29udGVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UYWJQYW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVGhlbWVQcm92aWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdEJvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9hc3RDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9hc3RDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RvYXN0RmFkZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdEhlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2dnbGVCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9nZ2xlQnV0dG9uR3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UcmFuc2l0aW9uV3JhcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9jcmVhdGVDaGFpbmVkRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vY3JlYXRlVXRpbGl0eUNsYXNzZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vY3JlYXRlV2l0aEJzUHJlZml4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL2RpdldpdGhDbGFzc05hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL3NhZmVGaW5kRE9NTm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS90cmFuc2l0aW9uRW5kTGlzdGVuZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdHJpZ2dlckJyb3dzZXJSZWZsb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdXNlT3ZlcmxheU9mZnNldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS91c2VQbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS91c2VXcmFwcGVkUmVmV2l0aFdhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0L3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0LmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL0NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L2Nvbm5lY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2V4cG9ydHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZURpc3BhdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVNlbGVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10YWJsZS9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10YWJsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vVHJhbnNpdGlvbkdyb3VwQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vY29uZmlnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL2VzbS91dGlscy9Qcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC1wZXJzaXN0L2VzL2NyZWF0ZU1pZ3JhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvY3JlYXRlUGVyc2lzdG9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9jcmVhdGVUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvZ2V0U3RvcmVkU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvaW50ZWdyYXRpb24vcmVhY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvcGVyc2lzdENvbWJpbmVSZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9wZXJzaXN0UmVkdWNlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9wZXJzaXN0U3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvcHVyZ2VTdG9yZWRTdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9zdGF0ZVJlY29uY2lsZXIvYXV0b01lcmdlTGV2ZWwxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC1wZXJzaXN0L2VzL3N0YXRlUmVjb25jaWxlci9hdXRvTWVyZ2VMZXZlbDIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVmbGVjdC1tZXRhZGF0YS9SZWZsZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZXNlbGVjdC9lcy9kZWZhdWx0TWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVzZWxlY3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvdHJhY2luZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL2hhc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyMjQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyNTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEzODQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGE1MTIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NhY2hlL0RiUXVlcnlSZXN1bHRDYWNoZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NhY2hlL1F1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY2FjaGUvUmVkaXNRdWVyeVJlc3VsdENhY2hlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL0RlZXBQYXJ0aWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL0VudGl0eVRhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NvbW1vbi9PYmplY3RMaXRlcmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL09iamVjdFR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9jb25uZWN0aW9uL0Nvbm5lY3Rpb25NYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29ubmVjdGlvbi9Db25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29udGFpbmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0NoZWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0VudGl0eVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvRXhjbHVzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0dlbmVyYXRlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9JbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9VbmlxdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9Db2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9DcmVhdGVEYXRlQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvRGVsZXRlRGF0ZUNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL09iamVjdElkQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvUHJpbWFyeUNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9VcGRhdGVEYXRlQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvVmVyc2lvbkNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL1ZpZXdDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvZW50aXR5LXZpZXcvVmlld0VudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9lbnRpdHkvQ2hpbGRFbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvZW50aXR5L0VudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9lbnRpdHkvVGFibGVJbmhlcml0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQWZ0ZXJJbnNlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyTG9hZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQWZ0ZXJSZW1vdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyVXBkYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2xpc3RlbmVycy9CZWZvcmVJbnNlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0JlZm9yZVJlbW92ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQmVmb3JlVXBkYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2xpc3RlbmVycy9FdmVudFN1YnNjcmliZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL29wdGlvbnMvRW50aXR5T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL0luZGV4T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL0pvaW5Db2x1bW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL29wdGlvbnMvSm9pblRhYmxlT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL1JlbGF0aW9uT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL1ZhbHVlVHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5Db2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5UYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9yZWxhdGlvbnMvTWFueVRvTWFueS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9yZWxhdGlvbnMvTWFueVRvT25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9PbmVUb01hbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL09uZVRvT25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbkNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbklkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvdHJlZS9UcmVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZUNoaWxkcmVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZUxldmVsQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZVBhcmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9Ecml2ZXJGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL0RyaXZlclV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL1F1ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL1NxbEluTWVtb3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS1wZy9BdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2NhcGFjaXRvci9DYXBhY2l0b3JEcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvY2FwYWNpdG9yL0NhcGFjaXRvclF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2NvcmRvdmEvQ29yZG92YURyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9jb3Jkb3ZhL0NvcmRvdmFRdWVyeVJ1bm5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9leHBvL0V4cG9Ecml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvZXhwby9FeHBvUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvbW9uZ29kYi90eXBpbmdzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL25hdGl2ZXNjcmlwdC9OYXRpdmVzY3JpcHREcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvbmF0aXZlc2NyaXB0L05hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvcmVhY3QtbmF0aXZlL1JlYWN0TmF0aXZlRHJpdmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3JlYWN0LW5hdGl2ZS9SZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3NxbGl0ZS1hYnN0cmFjdC9BYnN0cmFjdFNxbGl0ZURyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxqcy9TcWxqc0RyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxqcy9TcWxqc1F1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3NxbHNlcnZlci9Nc3NxbFBhcmFtZXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci90eXBlcy9EYXRhYmFzZVR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvdHlwZXMvTWV0YWRhdGFUYWJsZVR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvdHlwZXMvUmVwbGljYXRpb25Nb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LW1hbmFnZXIvRW50aXR5TWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2VudGl0eS1tYW5hZ2VyL0VudGl0eU1hbmFnZXJGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LW1hbmFnZXIvU3FsanNFbnRpdHlNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DaXJjdWxhclJlbGF0aW9uc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ29ubmVjdGlvbklzTm90U2V0RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Db25uZWN0aW9uTm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0N1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0RhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0RyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0VudGl0eUNvbHVtbk5vdEZvdW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvRW50aXR5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0ZpbmRSZWxhdGlvbnNOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9NaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWlzc2luZ0RyaXZlckVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWlzc2luZ0pvaW5Db2x1bW5FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01pc3NpbmdKb2luVGFibGVFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9NdXN0QmVFbnRpdHlFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL05hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL05lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTm9Db25uZWN0aW9uRm9yUmVwb3NpdG9yeUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ob05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL09mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL09wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9QZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9SZXBvc2l0b3J5Tm90VHJlZUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1N1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9UcmVlUmVwb3NpdG9yeU5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHlwZU9STUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Vc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1VzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0ZpbmRDb25kaXRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0ZpbmRNYW55T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT25lT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT3BlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvRmluZE9wZXJhdG9yVHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0pvaW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0JldHdlZW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSXNOdWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuT3JFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9MaWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuT3JFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9Ob3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvUmF3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZ2xvYmFscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbG9nZ2VyL0FkdmFuY2VkQ29uc29sZUxvZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9EZWJ1Z0xvZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9Mb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9sb2dnZXIvTG9nZ2VyRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9Mb2dnZXJPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbG9nZ2VyL1NpbXBsZUNvbnNvbGVMb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1hcmdzL01ldGFkYXRhQXJnc1N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL0Nsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhLWJ1aWxkZXIvRW50aXR5TWV0YWRhdGFCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEtYnVpbGRlci9FbnRpdHlNZXRhZGF0YVZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhLWJ1aWxkZXIvSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL01ldGFkYXRhVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL1JlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9DaGVja01ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9FbWJlZGRlZE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvRW50aXR5TGlzdGVuZXJNZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvRXhjbHVzaW9uTWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9Gb3JlaWduS2V5TWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9JbmRleE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25Db3VudE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25JZE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25NZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhL1VuaXF1ZU1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvdHlwZXMvRXZlbnRMaXN0ZW5lclR5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWlncmF0aW9uL01pZ3JhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21pZ3JhdGlvbi9NaWdyYXRpb25FeGVjdXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL25hbWluZy1zdHJhdGVneS9EZWZhdWx0TmFtaW5nU3RyYXRlZ3kuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9FbnRpdHlQZXJzaXN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvQ2FzY2FkZXNTdWJqZWN0QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3BlcnNpc3RlbmNlL3N1YmplY3QtYnVpbGRlci9NYW55VG9NYW55U3ViamVjdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvT25lVG9NYW55U3ViamVjdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9DbG9zdXJlU3ViamVjdEV4ZWN1dG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9NYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9OZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXJEdW1teS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3BsYXRmb3JtL0Jyb3dzZXJEaXJlY3RvcnlFeHBvcnRlZENsYXNzZXNMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyRGlzYWJsZWREcml2ZXJzRHVtbXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyRmlsZUxvZ2dlckR1bW15LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGxhdGZvcm0vQnJvd3NlclBsYXRmb3JtVG9vbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL0FsaWFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9CcmFja2V0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvRGVsZXRlUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9JbnNlcnRRdWVyeUJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL0pvaW5BdHRyaWJ1dGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1F1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUXVlcnlCdWlsZGVyVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1F1ZXJ5RXhwcmVzc2lvbk1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25Mb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1JlbGF0aW9uUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9SZWxhdGlvblJlbW92ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1JlbGF0aW9uVXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvVXBkYXRlUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50QXR0cmlidXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkQXR0cmlidXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvRGVsZXRlUmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvSW5zZXJ0UmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvVXBkYXRlUmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci90cmFuc2Zvcm1lci9QbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvdHJhbnNmb3JtZXIvUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci90cmFuc2Zvcm1lci9SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LXJ1bm5lci9CYXNlUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9yZXBvc2l0b3J5L0Fic3RyYWN0UmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvQmFzZUVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVtb3ZlT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9yZXBvc2l0b3J5L1NhdmVPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcmVwb3NpdG9yeS9UcmVlUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL1JkYm1zU2NoZW1hQnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVDaGVja09wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ29sdW1uT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVFeGNsdXNpb25PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUZvcmVpZ25LZXlPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUluZGV4T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZVVuaXF1ZU9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1ZpZXdPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUV4Y2x1c2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRm9yZWlnbktleS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlSW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZVVuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3V0aWwvVGFibGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3V0aWwvVmlld1V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdmlldy9WaWV3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc3Vic2NyaWJlci9Ccm9hZGNhc3Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJSZXN1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL0RhdGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvRGVwR3JhcGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL09iamVjdFV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvdXRpbC9Pcm1VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvUmFuZG9tR2VuZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvdXRpbC9TdHJpbmdVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvVmVyc2lvblV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91bmNvbnRyb2xsYWJsZS9saWIvZXNtL2hvb2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vdW5jb250cm9sbGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvc2Fzcy9pbmRleC5zY3NzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL01lbWJlckxpc3QudHN4Iiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL1BhcnRuZXJUYWJsZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9QcmF5ZXJDaXJjbGUvUHJheWVyQ2lyY2xlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1ByYXllckNpcmNsZS9QcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL1ByYXllcmNpcmNsZVNldHRpbmdzLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1ByYXllckNpcmNsZS9wcmF5ZXJDaXJjbGVTbGljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1NldHRpbmdzL3NldHRpbmdzU2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9TdG9yZS9yZWR1eEhvb2tzLnRzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvU3RvcmUvc3RvcmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9pbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDYkE7QUFBQTtBQUFlO0FBQ2Y7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQzs7Ozs7Ozs7QUNoQkE7QUFBQTtBQUFBO0FBQWlEO0FBQ2xDO0FBQ2Y7QUFDQTtBQUNBLEVBQUUsa0VBQWM7QUFDaEIsQzs7Ozs7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBaUQ7O0FBRWpEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVlO0FBQ2YsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0EsUUFBUSxrRUFBYztBQUN0QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDdENBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsdUJBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQzs7Ozs7Ozs7QUNiQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDUEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDTjtBQUNRO0FBQ0o7QUFDRTtBQUNSO0FBQ1o7QUFDa0I7QUFDbEI7QUFDZ0I7QUFDVjtBQUNNO0FBQ0Q7QUFDcEI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxRUFBcUUsYUFBYTtBQUNsRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQix1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQSxxQkFBcUIsMkVBQVMsY0FBYywrRUFBaUIseUNBQXlDLCtFQUFpQjtBQUN2SCxrQkFBa0IsK0VBQWlCO0FBQ25DLFVBQVU7QUFDVjs7QUFFQSwrQkFBK0Isd0VBQWMsQ0FBQyxzRUFBVyx3REFBd0Q7O0FBRWpIO0FBQ0E7QUFDQSxTQUFTLEVBQUU7QUFDWDs7QUFFQSxZQUFZLElBQXFDO0FBQ2pELDBCQUEwQixrRUFBUTtBQUNsQztBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVUsMkVBQWlCOztBQUUzQixjQUFjLDBFQUFnQiw4QkFBOEIsK0NBQUk7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MsOEVBQWdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7O0FBR0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBLGNBQWMsSUFBcUM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0EscUJBQXFCLDhFQUFnQixZQUFZLDZFQUFlO0FBQ2hFLGtCQUFrQiwyRUFBYTtBQUMvQixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBLDZDQUE2QyxLQUFLOztBQUVsRDtBQUNBLHNFQUFzRTtBQUN0RSxTQUFTO0FBQ1Q7O0FBRUEsMkJBQTJCLHVDQUF1QztBQUNsRSxjQUFjLElBQXFDO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLGNBQWMsa0VBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ08sa0RBQWtEOzs7Ozs7Ozs7O0FDaFF6RDtBQUFBO0FBQUE7QUFBK0M7QUFDaEM7QUFDZiwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsdUJBQXVCLG1FQUFZO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0EsT0FBTztBQUNQLEtBQUs7OztBQUdMO0FBQ0EsQzs7Ozs7Ozs7QUN0QkE7QUFBQTtBQUFBO0FBQUE7QUFBZ0Q7QUFDUDtBQUMxQjtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTSxvRUFBYTtBQUNuQjtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBLGVBQWUsNERBQUs7QUFDcEI7O0FBRUE7QUFDQSxlQUFlLDREQUFLO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ25DQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF1QztBQUNZO0FBQ0E7QUFDSTtBQUNKO0FBQ007QUFDSjtBQUNNO0FBQ0k7QUFDaEI7QUFDVjtBQUNNO0FBQ2lCO0FBQ2hCOztBQUU1QztBQUNBLGFBQWEseUVBQXFCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLGtEQUFRLEdBQUcsMkVBQWdCLENBQUMsbUVBQWUsYUFBYSxnRUFBUyxnRUFBZ0UsMkVBQWdCLENBQUMsbUVBQWUsQ0FBQyxzRUFBa0I7QUFDaE4sQ0FBQztBQUNEO0FBQ0E7OztBQUdBO0FBQ0Esd0JBQXdCLHFFQUFpQixDQUFDLGlFQUFhO0FBQ3ZELHdEQUF3RCxvRUFBZ0I7QUFDeEUsNENBQTRDLG9FQUFhLFlBQVksbUVBQWU7O0FBRXBGLE9BQU8sZ0VBQVM7QUFDaEI7QUFDQSxHQUFHOzs7QUFHSDtBQUNBLFdBQVcsZ0VBQVMsb0JBQW9CLDZEQUFRLG9DQUFvQyxnRUFBVyxvREFBb0Qsb0VBQWdCO0FBQ25LLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7OztBQUdlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyREFBRztBQUNyQixvQkFBb0IsMkRBQUc7QUFDdkIscUJBQXFCLDJEQUFHO0FBQ3hCLG1CQUFtQiwyREFBRztBQUN0QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUNyRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDaEI7QUFDSjtBQUNLO0FBQ1c7QUFDRjtBQUNSO0FBQ1I7O0FBRXpDO0FBQ0E7QUFDQSxlQUFlLDREQUFLO0FBQ3BCLGVBQWUsNERBQUs7QUFDcEI7QUFDQSxDQUFDO0FBQ0Q7OztBQUdlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyxvRUFBYTtBQUM3Qyw2QkFBNkIsb0VBQWE7QUFDMUMsd0JBQXdCLHNFQUFrQjtBQUMxQyxhQUFhLHlFQUFxQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSwrREFBVztBQUNuQixJQUFJLGtFQUFjO0FBQ2xCLGVBQWUsaUVBQWE7QUFDNUI7O0FBRUEsUUFBUSxvRUFBYTtBQUNyQixnQkFBZ0IseUVBQXFCO0FBQ3JDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsa0JBQWtCLHVFQUFtQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7O0FDekRBO0FBQUE7QUFBQTtBQUF1QztBQUN4QjtBQUNmLFNBQVMsNkRBQVM7QUFDbEIsQzs7Ozs7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBNEM7QUFDN0I7QUFDZjtBQUNBLFdBQVcsZ0VBQVM7QUFDcEI7QUFDQSxDOzs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXlEO0FBQ0o7QUFDTTtBQUNSO0FBQ1o7QUFDdkM7O0FBRWU7QUFDZjs7QUFFQSxhQUFhLHNFQUFrQjtBQUMvQixrQkFBa0IsbUVBQWU7QUFDakM7QUFDQSxjQUFjLDBEQUFHO0FBQ2pCLGVBQWUsMERBQUc7QUFDbEIsa0NBQWtDLHVFQUFtQjtBQUNyRDs7QUFFQSxNQUFNLG9FQUFnQjtBQUN0QixTQUFTLDBEQUFHO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUM1QkE7QUFBQTtBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUErRDtBQUMvRDs7QUFFZTtBQUNmLG1CQUFtQix5RUFBcUIsVUFBVTtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUN4QkE7QUFBQTtBQUFlO0FBQ2Y7QUFDQSxDOzs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFtRDtBQUNaO0FBQ1M7QUFDYTtBQUM5QztBQUNmLGVBQWUsNkRBQVMsV0FBVyxvRUFBYTtBQUNoRCxXQUFXLG1FQUFlO0FBQzFCLEdBQUc7QUFDSCxXQUFXLHdFQUFvQjtBQUMvQjtBQUNBLEM7Ozs7Ozs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF1QztBQUNJO0FBQ1U7QUFDTDtBQUNDO0FBQ0Y7O0FBRS9DO0FBQ0EsT0FBTyxvRUFBYTtBQUNwQixFQUFFLG9FQUFnQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxvRUFBYTtBQUMzQjtBQUNBLHFCQUFxQixvRUFBZ0I7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpRUFBYTs7QUFFakMsU0FBUyxvRUFBYSwwQ0FBMEMsK0RBQVc7QUFDM0UsY0FBYyxvRUFBZ0IsY0FBYztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHZTtBQUNmLGVBQWUsNkRBQVM7QUFDeEI7O0FBRUEseUJBQXlCLGtFQUFjLGtCQUFrQixvRUFBZ0I7QUFDekU7QUFDQTs7QUFFQSx1QkFBdUIsK0RBQVcsNkJBQTZCLCtEQUFXLDZCQUE2QixvRUFBZ0I7QUFDdkg7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDL0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMkM7QUFDYztBQUNWO0FBQ2hDO0FBQ2YsTUFBTSwrREFBVztBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1FQUFZO0FBQ2hCO0FBQ0EsSUFBSSxzRUFBa0I7O0FBRXRCO0FBQ0EsQzs7Ozs7Ozs7QUNsQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStDO0FBQ0U7QUFDTjtBQUNLO0FBQ2pDO0FBQ2YsNENBQTRDLCtEQUFXO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLG9FQUFhLFVBQVUsa0VBQWM7QUFDM0M7QUFDQTs7QUFFQSx5QkFBeUIsaUVBQWE7QUFDdEMsQzs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVDO0FBQ2tCO0FBQ0U7QUFDNUM7QUFDZixZQUFZLDZEQUFTO0FBQ3JCLGFBQWEsc0VBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsc0NBQXNDO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1RUFBbUI7QUFDOUI7QUFDQTtBQUNBLEM7Ozs7Ozs7O0FDdkNBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDWEE7QUFBQTtBQUFBO0FBQXVDO0FBQ3hCO0FBQ2YsWUFBWSw2REFBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDTjtBQUNOO0FBQ3BDO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlFQUFxQixDQUFDLHNFQUFrQixrQkFBa0IsbUVBQWU7QUFDbEYsQzs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVDOztBQUV2QztBQUNBLG1CQUFtQiw2REFBUztBQUM1QjtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLDZEQUFTO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsNkRBQVM7QUFDNUI7QUFDQTs7Ozs7Ozs7OztBQ3BCQTtBQUFBO0FBQUE7QUFBcUQ7QUFDdEM7QUFDZjtBQUNBLDBCQUEwQixvRUFBZ0I7QUFDMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBMkM7QUFDNUI7QUFDZix1Q0FBdUMsK0RBQVc7QUFDbEQsQzs7Ozs7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUQ7QUFDSjtBQUNSO0FBQ1U7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixtRUFBZTtBQUNwQztBQUNBLFlBQVksNkRBQVM7QUFDckIsK0RBQStELGtFQUFjO0FBQzdFO0FBQ0E7QUFDQSx1Q0FBdUMsaUVBQWE7QUFDcEQsQzs7Ozs7Ozs7QUN6QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ0EsQ0FBQztBQUNNO0FBQ1A7QUFDQSxDQUFDLE1BQU07O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0EsZ0g7Ozs7Ozs7O0FDOUJQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEQ7QUFDRjtBQUNWO0FBQ2M7QUFDYztBQUNoQztBQUNvQjtBQUNOO0FBQ2E7QUFDWjs7QUFFM0Q7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQSxHQUFHO0FBQ0gsU0FBUyw0RUFBa0IseUNBQXlDLHlFQUFlLFVBQVUsd0RBQWM7QUFDM0c7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBFQUFnQjtBQUN0QyxhQUFhLGtGQUF3QjtBQUNyQyxvQkFBb0IsOENBQUksRUFBRSwrQ0FBSztBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMkVBQWE7QUFDL0IsK0JBQStCLDZDQUFHLEdBQUcsOENBQUk7QUFDekMsK0JBQStCLGdEQUFNLEdBQUcsK0NBQUs7QUFDN0M7QUFDQTtBQUNBLDBCQUEwQiw2RUFBZTtBQUN6QztBQUNBLHNEQUFzRDtBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLCtEQUFNLG1CQUFtQjs7QUFFeEM7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLElBQXFDO0FBQzNDLFNBQVMsOEVBQWE7QUFDdEI7QUFDQTtBQUNBOztBQUVBLE9BQU8sc0VBQVE7QUFDZixRQUFRLElBQXFDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7O0FDcEdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTREO0FBQ0U7QUFDWjtBQUNrQjtBQUNKO0FBQ0o7QUFDUjtBQUNYOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyw0REFBSztBQUNaLE9BQU8sNERBQUs7QUFDWjtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw4Q0FBSTtBQUNsQixjQUFjLDZDQUFHO0FBQ2pCOztBQUVBO0FBQ0EsdUJBQXVCLDZFQUFlO0FBQ3RDO0FBQ0E7O0FBRUEseUJBQXlCLHVFQUFTO0FBQ2xDLHFCQUFxQixnRkFBa0I7O0FBRXZDLFVBQVUsOEVBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBLHNCQUFzQiw2Q0FBRyxtQkFBbUIsOENBQUksa0JBQWtCLCtDQUFLLG1CQUFtQiw2Q0FBRztBQUM3RixjQUFjLGdEQUFNO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDhDQUFJLG1CQUFtQiw2Q0FBRyxrQkFBa0IsZ0RBQU0sbUJBQW1CLDZDQUFHO0FBQzlGLGNBQWMsK0NBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsMkJBQTJCLG9DQUFvQztBQUMvRDs7QUFFQSx5QkFBeUIscUNBQXFDO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLElBQXFDO0FBQzNDLDZCQUE2Qiw4RUFBZ0I7O0FBRTdDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSwwRUFBZ0I7QUFDL0IsZUFBZSxzRUFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLG1EQUFtRDtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHlDQUF5QyxrREFBa0Q7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0EsR0FBRztBQUNILENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7QUNqS0Q7QUFBQTtBQUFrRDs7QUFFbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVFQUFTO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHYztBQUNmO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQyxFOzs7Ozs7OztBQ2hERDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ1I7QUFDMEI7QUFDOUI7QUFDWTtBQUNBO0FBQ2hCOztBQUVwRDtBQUNBLE1BQU0sMEVBQWdCLGdCQUFnQiw4Q0FBSTtBQUMxQztBQUNBOztBQUVBLDBCQUEwQiw4RUFBb0I7QUFDOUMsVUFBVSx1RkFBNkIsZ0NBQWdDLHVGQUE2QjtBQUNwRzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEVBQWdCO0FBQ3RDO0FBQ0EsaUdBQWlHLDhFQUFvQjtBQUNySDtBQUNBLHNCQUFzQiwwRUFBZ0IsZ0JBQWdCLDhDQUFJLEdBQUcsOEVBQW9CO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsdUJBQXVCO0FBQ3hDOztBQUVBLHlCQUF5QiwwRUFBZ0I7O0FBRXpDLDJCQUEyQixzRUFBWSxnQkFBZ0IsK0NBQUs7QUFDNUQsc0JBQXNCLDZDQUFHLEVBQUUsZ0RBQU07QUFDakM7QUFDQSxtQkFBbUIsd0VBQWM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCw0REFBNEQsK0NBQUssR0FBRyw4Q0FBSSxzQkFBc0IsZ0RBQU0sR0FBRyw2Q0FBRzs7QUFFMUc7QUFDQSwwQkFBMEIsOEVBQW9CO0FBQzlDOztBQUVBLDJCQUEyQiw4RUFBb0I7QUFDL0M7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLFFBQVE7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7O0FDbEpEO0FBQUE7QUFBQTtBQUF1RDtBQUNDOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsNkNBQUcsRUFBRSwrQ0FBSyxFQUFFLGdEQUFNLEVBQUUsOENBQUk7QUFDbEM7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHdFQUFjO0FBQ3hDO0FBQ0EsR0FBRztBQUNILDBCQUEwQix3RUFBYztBQUN4QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7QUM1REQ7QUFBQTtBQUFBO0FBQUE7QUFBNEQ7QUFDRDs7QUFFcEQ7QUFDUCxzQkFBc0IsMEVBQWdCO0FBQ3RDLHdCQUF3Qiw4Q0FBSSxFQUFFLDZDQUFHOztBQUVqQyxtRUFBbUU7QUFDbkU7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSw4Q0FBSSxFQUFFLCtDQUFLO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvREFBVTtBQUN2QjtBQUNBO0FBQ0EsR0FBRyxJQUFJO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7O0FBR2M7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOzs7Ozs7OztBQ3JERDtBQUFBO0FBQXdEOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix3RUFBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOzs7QUFHYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7O0FDeEJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4RDtBQUNGO0FBQ2dCO0FBQzVCO0FBQ1k7QUFDRjtBQUNJO0FBQ047QUFDSjtBQUNZO0FBQ0U7O0FBRWxFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHdFQUFjO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiwwRUFBZ0I7QUFDdEMsa0JBQWtCLHNFQUFZO0FBQzlCO0FBQ0EsaUJBQWlCLGtGQUF3QjtBQUN6QyxnQkFBZ0Isb0VBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsc0NBQXNDLDZDQUFHLEdBQUcsOENBQUk7QUFDaEQscUNBQXFDLGdEQUFNLEdBQUcsK0NBQUs7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwrQ0FBSztBQUNwQywrQkFBK0IsK0NBQUssMENBQTBDO0FBQzlFOztBQUVBO0FBQ0EsNkNBQTZDLDJFQUFhO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLHlIQUF5SCw0RUFBa0I7QUFDM0k7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLCtEQUFNO0FBQ3pCO0FBQ0E7QUFDQSxvREFBb0QsNkVBQWU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsK0RBQU0sVUFBVSwyREFBTyx5Q0FBeUMsMkRBQU87QUFDakc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLDZDQUFHLEdBQUcsOENBQUk7O0FBRWpELHNDQUFzQyxnREFBTSxHQUFHLCtDQUFLOztBQUVwRDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSx3QkFBd0IsNkNBQUcsRUFBRSw4Q0FBSTs7QUFFakM7O0FBRUE7O0FBRUE7O0FBRUEsb0RBQW9ELHVFQUFjLG9DQUFvQywrREFBTTs7QUFFNUc7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7O0FBR2M7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFOzs7Ozs7OztBQzdJRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtGO0FBQ2xGOzs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkM7QUFDa0Q7QUFDOUM7QUFDSTtBQUN0QztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxvREFBYTtBQUM5RSxrQkFBa0IsZ0VBQVk7QUFDOUIsZ0RBQWdELDZEQUFtQixHQUFHLDZEQUFtQjtBQUN6RixXQUFXLGdFQUFZO0FBQ3ZCLEdBQUcsSUFBSSx3REFBYztBQUNyQjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EscUJBQXFCLGtFQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFLG9FQUFnQjtBQUN2QjtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQzs7Ozs7Ozs7QUM5Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFEO0FBQ1I7QUFDd0I7QUFDRjtBQUNwRDtBQUNmO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvRUFBZ0I7QUFDbEQsOEJBQThCLGdFQUFZO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVMsNkNBQUc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsZ0RBQU07QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsK0NBQUs7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsOENBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsNEVBQXdCOztBQUV6RDtBQUNBOztBQUVBO0FBQ0EsV0FBVywrQ0FBSztBQUNoQjtBQUNBOztBQUVBLFdBQVcsNkNBQUc7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDckVBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUNkQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThEO0FBQ007QUFDTTtBQUN6QjtBQUNJO0FBQzBEO0FBQ3hEO0FBQ0U7QUFDTjs7QUFFcEM7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QseURBQWU7QUFDL0Q7QUFDQSx3REFBd0Qsa0RBQVE7QUFDaEU7QUFDQSwwREFBMEQsZ0RBQU07QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0VBQWtCLHlDQUF5QyxtRUFBZSxVQUFVLHdEQUFjO0FBQ3hILHNDQUFzQyxnREFBTSxHQUFHLG1EQUFTLEdBQUcsZ0RBQU07QUFDakU7QUFDQTtBQUNBLDJCQUEyQiw2RUFBZSxDQUFDLDBFQUFTLGdEQUFnRCxnRkFBa0I7QUFDdEgsNEJBQTRCLG1GQUFxQjtBQUNqRCxzQkFBc0Isa0VBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gseUJBQXlCLG9FQUFnQixpQkFBaUI7QUFDMUQsNkNBQTZDLGdEQUFNLDBDQUEwQztBQUM3Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDLHlCQUF5QixnREFBTTtBQUMvQjtBQUNBO0FBQ0Esc0JBQXNCLCtDQUFLLEVBQUUsZ0RBQU07QUFDbkMsa0JBQWtCLDZDQUFHLEVBQUUsZ0RBQU07QUFDN0I7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDOzs7Ozs7OztBQzlEQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUCxDOzs7Ozs7OztBQ0xBO0FBQUE7QUFBZTtBQUNmLHdGQUF3RixhQUFhO0FBQ3JHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ1JBO0FBQUE7QUFBZTtBQUNmO0FBQ0EsQzs7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBbUM7QUFDcEI7QUFDZjtBQUNBLEM7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUNQQTtBQUFBO0FBQWU7QUFDZjtBQUNBLEM7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ1JBO0FBQUE7QUFBZTtBQUNmO0FBQ0EsQzs7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBQTtBQUFPO0FBQ0E7QUFDQSx1Qjs7Ozs7Ozs7QUNGUDtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELCtCQUErQjtBQUMvQiw0QkFBNEI7QUFDNUIsS0FBSztBQUNMO0FBQ0EsR0FBRyxJQUFJLEVBQUU7O0FBRVQ7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ2JBO0FBQUE7QUFBQTtBQUF5RDtBQUMxQztBQUNmLHlCQUF5QixFQUFFLHNFQUFrQjtBQUM3QyxDOzs7Ozs7OztBQ0hBO0FBQUE7QUFBQTtBQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFZTtBQUNmO0FBQ0EsMENBQTBDOztBQUUxQyxTQUFTLHdEQUFjO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEM7Ozs7Ozs7O0FDM0NBO0FBQUE7QUFBZTtBQUNmLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ1BBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ1k7QUFDN0M7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQU07QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQiwwREFBTTtBQUNoQzs7QUFFQTs7QUFFQTtBQUNBLGNBQWMsd0RBQWM7QUFDNUIsMEJBQTBCLDBEQUFNLCtEQUErRCx3REFBYztBQUM3Rzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFNO0FBQ2hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQU07QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQiwwREFBTTtBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFNO0FBQ2hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCLDBEQUFNO0FBQzlCO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQzs7Ozs7Ozs7QUNoRkE7QUFBQTtBQUFBO0FBQUE7QUFBMkQ7QUFDcEQ7QUFDUCxTQUFTLG9EQUFPLE1BQU0sb0RBQU87QUFDN0I7QUFDTztBQUNQO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ1BBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFLDRDQUFNOztBQUUzRTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsWUFBWSx3REFBVTtBQUN0QixjQUFjLHFEQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw0Q0FBTTtBQUM1QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRU87QUFDUCxZQUFZLHdEQUFVLGtEQUFrRDtBQUN4RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxxREFBTztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUCxZQUFZLHdEQUFVO0FBQ3RCO0FBQ0EsMEJBQTBCLHNEQUFRLGlCQUFpQjtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksNkRBQWU7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUNqRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0I7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCLHNDQUFzQyxpQkFBaUIsRUFBRTtBQUN2Riw2QkFBNkIsOEVBQThFO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBLENBQUM7QUFDRCxtQkFBbUIsU0FBSSxJQUFJLFNBQUk7QUFDL0IsYUFBYSw2QkFBNkIsMEJBQTBCLGFBQWEsRUFBRSxxQkFBcUI7QUFDeEcsZ0JBQWdCLHFEQUFxRCxvRUFBb0UsYUFBYSxFQUFFO0FBQ3hKLHNCQUFzQixzQkFBc0IscUJBQXFCLEdBQUc7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLGtDQUFrQyxTQUFTO0FBQzNDLGtDQUFrQyxXQUFXLFVBQVU7QUFDdkQseUNBQXlDLGNBQWM7QUFDdkQ7QUFDQSw2R0FBNkcsT0FBTyxVQUFVO0FBQzlILGdGQUFnRixpQkFBaUIsT0FBTztBQUN4Ryx3REFBd0QsZ0JBQWdCLFFBQVEsT0FBTztBQUN2Riw4Q0FBOEMsZ0JBQWdCLGdCQUFnQixPQUFPO0FBQ3JGO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxTQUFTLFlBQVksYUFBYSxPQUFPLEVBQUUsVUFBVSxXQUFXO0FBQ2hFLG1DQUFtQyxTQUFTO0FBQzVDO0FBQ0E7QUFDQSxxQkFBcUIsU0FBSSxJQUFJLFNBQUk7QUFDakMsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELDBDQUEwQyxxRUFBcUUscUJBQXFCO0FBQ3RMO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLDRDQUE0QztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsdUZBQXVGO0FBQ3hIO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDa0M7QUFDWjtBQUNrRjtBQUMzQztBQUM3RDtBQUN5QztBQUNDO0FBQzFDO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQSxtQkFBbUIsdURBQWM7QUFDakM7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBLHFEQUFxRCxxREFBTyxVQUFVLHFEQUFPO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQzJGO0FBQzNGO0FBQ2dDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSw2Q0FBTztBQUN0QixXQUFXLDZDQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsbUJBQW1CLGFBQW9CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtCQUFrQjtBQUNuRCwwQkFBMEIsV0FBVztBQUNyQyxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0JBQWtCO0FBQ25ELG1DQUFtQyx1QkFBdUI7QUFDMUQsMEJBQTBCLFdBQVc7QUFDckM7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYztBQUMzQyxRQUFRLEtBQXFDLEVBQUUsRUFFMUM7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFdBQVc7QUFDckMsb0NBQW9DLDBCQUEwQjtBQUM5RCxrQ0FBa0MsbUJBQW1CO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx1QkFBdUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGNBQWM7QUFDM0MsUUFBUSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0w7QUFDQSxnQ0FBZ0MseUJBQXlCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxNQUFNLEdBQUc7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGNBQWM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsbURBQWU7QUFDaEQ7QUFDQTtBQUNBLGlDQUFpQyxtREFBZTtBQUNoRDtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsYUFBb0I7QUFDeEM7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDZEQUFlO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsbUNBQW1DLEVBQUU7QUFDckc7QUFDQTtBQUNBLDZCQUE2QixxREFBZTtBQUM1Qyx1QkFBdUIsNkNBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcseURBQVc7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHlCQUF5QixzQkFBc0IsMkJBQTJCLHdCQUF3QjtBQUMvRztBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLDBDQUEwQyxrQkFBa0I7QUFDNUQ7QUFDQSw2Q0FBNkMsNkJBQTZCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixJQUFxQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLGdCQUFnQixJQUFxQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxxQ0FBcUM7QUFDdEU7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxnQkFBZ0IsSUFBcUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MscUJBQXFCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRLHFEQUFlO0FBQzlELFNBQVMsRUFBRTtBQUNYO0FBQ0E7QUFDQSxtQ0FBbUMscURBQWU7QUFDbEQsU0FBUztBQUNULHVDQUF1Qyw2QkFBNkI7QUFDcEU7QUFDQTtBQUNBLCtCQUErQiwyQkFBMkI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULCtDQUErQyxhQUFhLEVBQUU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscURBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIseURBQVc7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIscURBQWU7QUFDMUM7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLHFEQUFRO0FBQ2xHLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsNkxBQTZMO0FBQzdMLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHNCQUFzQjtBQUMvRDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGtCQUFrQjtBQUM1RCwrQ0FBK0MsdUJBQXVCO0FBQ3RFLHFHQUFxRywrQkFBK0IscUJBQXFCLEVBQUUsRUFBRSxFQUFFO0FBQy9KLHlDQUF5QyxXQUFXO0FBQ3BELGtEQUFrRCxxQkFBcUI7QUFDdkUsNkVBQTZFLG1CQUFtQixFQUFFO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQzhEO0FBQzlEO0FBQ0EsNERBQTRELHVCQUF1QixFQUFFO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFEQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFEQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsMkJBQTJCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsMkJBQTJCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELDJCQUEyQjtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0Esd0RBQXdELDZCQUE2QixFQUFFO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxpRUFBaUUsMkNBQTJDLEVBQUU7QUFDOUc7QUFDQSx5REFBeUQsMEJBQTBCLEVBQUU7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsNERBQTRELEVBQUU7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGdEQUFnRCxFQUFFO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhCQUE4QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUFjO0FBQzNDO0FBQ0E7QUFDQSx1Q0FBdUMsb0JBQW9CO0FBQzNELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsV0FBVztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsZ0NBQWdDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxzR0FBc0c7QUFDdEc7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSyxFQUFFLEVBQUU7QUFDVCx5RkFBeUY7QUFDekY7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSyxFQUFFLEVBQUU7QUFDVCwyR0FBMkc7QUFDM0c7QUFDQTtBQUNBLDZDQUE2QyxZQUFZO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLLEVBQUUsRUFBRTtBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBcUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxzRUFBc0UsZ0JBQWdCLHdEQUF3RCxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3pOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnSkFBZ0osbUNBQW1DO0FBQ25MO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0pBQStKLGlDQUFpQyxHQUFHLG1DQUFtQztBQUN0TztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQ0FBaUMsRUFBRTtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGlDQUFpQyxFQUFFO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx3REFBd0Q7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCwyQkFBMkIsRUFBRTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx5REFBeUQ7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCw0QkFBNEIsRUFBRTtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDBEQUEwRDtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELDZCQUE2QixFQUFFO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGlGQUFpRjtBQUNuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsMkJBQTJCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBUztBQUMya0I7QUFDcGxCLDZDOzs7Ozs7OztBQ3owQ0E7QUFBQTtBQUFBO0FBQUE7QUFBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2YsU0FBUyxzREFBUTtBQUNqQixDOzs7Ozs7OztBQzVCQTtBQUFBO0FBQUE7QUFBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxvREFBTTtBQUNsQixFQUFFLHVEQUFTO0FBQ1g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFZSw4RUFBZSxFOzs7Ozs7OztBQ25COUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNZO0FBQ2pDO0FBQ2YsWUFBWSxnRUFBZTtBQUMzQixTQUFTLHlEQUFXO0FBQ3BCO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7O0FDUEE7QUFBQTtBQUFBO0FBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZSx3RkFBeUIscURBQWUsR0FBRywrQ0FBUyxFOzs7Ozs7Ozs7QUNkbkU7QUFBQTtBQUFBO0FBQUE7QUFBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsVUFBVSxFQUFFLFNBQVM7QUFDOUMsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVMscURBQU87QUFDaEI7QUFDQSxHQUFHO0FBQ0g7O0FBRWUsNEVBQWEsRTs7Ozs7Ozs7QUN2QzVCO0FBQUE7QUFBQTtBQUFBO0FBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBOztBQUVlO0FBQ2YsZ0JBQWdCLG9EQUFNO0FBQ3RCLGtCQUFrQixvREFBTTtBQUN4QjtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQzs7Ozs7Ozs7QUNqQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXdDO0FBQ0Y7QUFDUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGFBQWE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR2U7QUFDZixrQkFBa0IsMkRBQVUsR0FBRzs7QUFFL0Isa0JBQWtCLG9EQUFNO0FBQ3hCLEVBQUUsK0RBQWM7QUFDaEI7QUFDQSxHQUFHO0FBQ0gsU0FBUyxxREFBTztBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7O0FDekVBO0FBQUE7QUFBQTtBQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEIsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVlLDhFQUFlLEU7Ozs7Ozs7O0FDbEM5QjtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZixpQkFBaUIsb0RBQU07QUFDdkI7QUFDQTtBQUNBLEM7Ozs7Ozs7O0FDWkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE0QztBQUNWO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmLGtCQUFrQiw4REFBYTtBQUMvQixFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7O0FDaEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQSwwREFBMEQsK0JBQStCLGlCQUFpQixzQ0FBc0MsWUFBWSxZQUFZLHVCQUF1QixPQUFPLHFCQUFxQiwwQ0FBMEMsMkJBQTJCLEVBQUUsZUFBZTs7QUFFalQ7O0FBRUE7QUFDK0I7QUFDbUI7QUFDUjtBQUNNO0FBQ3pDO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnREFBZ0I7QUFDNUM7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSx3QkFBd0IsOERBQWM7QUFDdEM7QUFDQSxHQUFHO0FBQ0gsd0JBQXdCLHVFQUFnQjtBQUN4QztBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLHdCQUF3Qiw2REFBSTtBQUM1QjtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQSxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UscUVBQU0sRTs7Ozs7Ozs7QUNoRHJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUEsMERBQTBELCtCQUErQixpQkFBaUIsc0NBQXNDLFlBQVksWUFBWSx1QkFBdUIsT0FBTyxxQkFBcUIsMENBQTBDLDJCQUEyQixFQUFFLGVBQWU7O0FBRWxSO0FBQ2lCO0FBQ3pDO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUyxFQUFFLGFBQWE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDRCQUE0QixnREFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUksNEJBQTRCO0FBQ3REO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLHFFQUFNLEU7Ozs7Ozs7O0FDMUZyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQU87QUFDQTtBQUNBO0FBQ1AsWUFBWSxpQkFBaUIsRUFBRSxTQUFTO0FBQ3hDO0FBQ087QUFDUCxZQUFZLGdCQUFnQixFQUFFLFNBQVM7QUFDdkMsQzs7Ozs7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQztBQUNhO0FBQ2dCO0FBQzdDO0FBQ3NCO0FBQ0E7QUFDTTtBQUNJO0FBQ0E7QUFDZjtBQUNOO0FBQ29CO0FBQ3BCO0FBQ1U7QUFDZjtBQUNEO0FBQ1k7O0FBRWhEO0FBQ0Esc0JBQXNCLDZFQUFjO0FBQ3BDLGNBQWMsb0RBQU07QUFDcEIsb0JBQW9CLHlEQUFXO0FBQy9CLDBCQUEwQjs7QUFFMUI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDBEQUFRLGtCQUFrQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLDJEQUFTO0FBQzFCLDJCQUEyQiwwRUFBbUIsb0NBQW9DO0FBQ2xGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMEVBQVc7QUFDOUIsMEJBQTBCLG9EQUFNO0FBQ2hDLDBCQUEwQixvREFBTTtBQUNoQyxzQkFBc0Isd0RBQVUsQ0FBQywyREFBaUI7QUFDbEQsaUJBQWlCLHlEQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsdUJBQXVCLCtFQUFnQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQkFBa0IscURBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsK0VBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwwQkFBMEIsK0VBQWdCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUMsbUVBQVU7QUFDL0M7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw0RUFBRztBQUNyQjtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1gsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsdURBQVM7QUFDWDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLGtCQUFrQiw0RUFBRztBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLCtFQUFnQixDQUFDLHlEQUFXO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHVIQUF1SDtBQUN2SDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0RUFBZ0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw4REFBSSxDQUFDLDJEQUFpQjtBQUM1QztBQUNBLDJCQUEyQiw4REFBSSxDQUFDLHdEQUFlO0FBQy9DO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0EsZ0JBQWdCLHFEQUFZO0FBQzVCLGtCQUFrQix3REFBYztBQUNoQyxnQkFBZ0Isc0RBQVk7QUFDYix1RUFBUSxFOzs7Ozs7OztBQ3hOdkI7QUFBQTtBQUFBO0FBQStCO0FBQy9CLHFDQUFxQyxtREFBbUI7QUFDekMsOEVBQWUsRTs7Ozs7Ozs7QUNGOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBLDBEQUEwRCwrQkFBK0IsaUJBQWlCLHNDQUFzQyxZQUFZLFlBQVksdUJBQXVCLE9BQU8scUJBQXFCLDBDQUEwQywyQkFBMkIsRUFBRSxlQUFlOztBQUVsUjtBQUNJO0FBQzRCO0FBQ087QUFDaEM7QUFDUjtBQUNPO0FBQ1c7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHNCQUFzQix3REFBVSxDQUFDLDBEQUFpQjtBQUNsRCxxQkFBcUIsd0RBQVUsQ0FBQyxtREFBVTtBQUMxQztBQUNBO0FBQ0EsR0FBRztBQUNILG1CQUFtQix1RUFBWTtBQUMvQixtREFBbUQsdUVBQVk7QUFDL0Qsc0JBQXNCLCtFQUFnQjtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUsseURBQVE7QUFDYixHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxrQ0FBa0MsZ0RBQWdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsK0NBQU07QUFDMUIsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUksNEJBQTRCO0FBQ3REO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDJFQUFZLEU7Ozs7Ozs7O0FDdEUzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUEsMERBQTBELCtCQUErQixpQkFBaUIsc0NBQXNDLFlBQVksWUFBWSx1QkFBdUIsT0FBTyxxQkFBcUIsMENBQTBDLDJCQUEyQixFQUFFLGVBQWU7O0FBRXRRO0FBQ1o7QUFDNEI7QUFDWDtBQUNaO0FBQ007QUFDZ0M7QUFDaEI7QUFDVjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLGlCQUFpQjtBQUM1QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7OztBQUdPLHFDQUFxQztBQUM1QyxrQkFBa0Isd0RBQVUsQ0FBQyx3REFBZTtBQUM1Qyx5Q0FBeUMsNkVBQWM7QUFDdkQsc0JBQXNCLG9EQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQkFBaUIsMERBQVMsNkJBQTZCLDZFQUE0QjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsRUFBRSw2REFBWTtBQUNkO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxzQkFBc0IsNkRBQUksQ0FBQywwREFBUztBQUNwQztBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRWUsMkVBQVksRTs7Ozs7Ozs7QUNySDNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFnRDtBQUNqQjtBQUNNO0FBQ1c7QUFDVTtBQUNWO0FBQ3pDO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR087QUFDUCxhQUFhLHlEQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsd0RBQVUsQ0FBQyx3REFBZTtBQUNoQyxzQkFBc0IseURBQVc7QUFDakM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLHNCQUFzQiw2REFBSSxDQUFDLDBEQUFTO0FBQ3BDO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRWUsNkVBQWMsRTs7Ozs7Ozs7QUNyRTdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBLDBEQUEwRCwrQkFBK0IsaUJBQWlCLHNDQUFzQyxZQUFZLFlBQVksdUJBQXVCLE9BQU8scUJBQXFCLDBDQUEwQywyQkFBMkIsRUFBRSxlQUFlOztBQUVqVDtBQUNzRDtBQUNWO0FBQ0U7QUFDTjtBQUMwRDtBQUNuRTtBQUNFO0FBQ2tCO0FBQ1E7QUFDTjtBQUNVO0FBQ3JCO0FBQ1E7QUFDZDtBQUNZO0FBQ1U7QUFDUjtBQUNsRDs7QUFFQTtBQUNBLDhCQUE4QixzREFBWTtBQUMxQztBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLDJEQUFTO0FBQzFCO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseURBQVc7QUFDN0I7QUFDQSxLQUFLO0FBQ0wsb0JBQW9CLHlEQUFXO0FBQy9CO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQSwyQkFBMkIsd0RBQVU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyw4REFBSSx3QkFBd0I7QUFDdkU7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxvQkFBb0Isa0VBQWdCO0FBQ3BDO0FBQ0Esb0JBQW9CLHlFQUFVO0FBQzlCLG1CQUFtQiwwRUFBVztBQUM5Qiw4QkFBOEIsc0RBQVE7QUFDdEMsdUJBQXVCLG9EQUFNO0FBQzdCLEVBQUUsaUVBQW1COztBQUVyQixNQUFNLDZEQUFTO0FBQ2YsMkJBQTJCLHlFQUFhO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxxQkFBcUIsK0VBQWdCO0FBQ3JDO0FBQ0EsdUNBQXVDLGtFQUFNO0FBQzdDLHFDQUFxQyxrRUFBTTtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0EsbUNBQW1DLHlFQUFhOztBQUVoRCxtREFBbUQsb0VBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gscUJBQXFCLCtFQUFnQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7O0FBRUEsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7QUFFQSxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLDZFQUFjO0FBQ2hCO0FBQ0EsR0FBRyxFQUFFOztBQUVMLDZCQUE2QiwrRUFBZ0I7QUFDN0M7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyx5RUFBYTs7QUFFOUMsaURBQWlELG9FQUFRO0FBQ3pEO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsOEJBQThCLCtFQUFnQjtBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGdDQUFnQywrRUFBZ0I7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQ0FBaUMsb0RBQU07QUFDdkMsbUNBQW1DLG9EQUFNOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsdUVBQXVFLDhEQUFJLHdCQUF3QjtBQUNuRywyQkFBMkIsa0RBQWtCO0FBQzdDO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQSwwQkFBMEIsOERBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxxQ0FBcUMsOERBQUk7QUFDekM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsc0JBQXNCLDhEQUFJLENBQUMsMkRBQVM7QUFDcEMsMkJBQTJCLGdEQUFRLDRCQUE0QiwrREFBSyxDQUFDLDJEQUFTO0FBQzlFO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmLFdBQVcsc0RBQVk7QUFDdkIsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDblFGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0M7QUFDRztBQUNtQjtBQUNqRCw0QkFBNEIseURBQVE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsS0FBSztBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLGtFQUFxQjtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixTQUFTLCtEQUFHLHFFQUFxRTtBQUMvRzs7QUFFQTtBQUNBLElBQUksK0RBQUc7QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRWUsMkVBQVksRTs7Ozs7Ozs7QUN0SDNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUEsMERBQTBELCtCQUErQixpQkFBaUIsc0NBQXNDLFlBQVksWUFBWSx1QkFBdUIsT0FBTyxxQkFBcUIsMENBQTBDLDJCQUEyQixFQUFFLGVBQWU7O0FBRWxRO0FBQ2hCO0FBQ3VCO0FBQ0s7QUFDRjtBQUNuQjtBQUNnQztBQUNoQztBQUNTO0FBQ2Y7QUFDZ0I7O0FBRWhEO0FBQ0E7O0FBRUEsdUJBQXVCLHlEQUFRO0FBQy9CLHlCQUF5QixnREFBZ0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQiw2RUFBYztBQUNwQywwQkFBMEIsb0RBQU07QUFDaEMseUJBQXlCLHdEQUFVLENBQUMsMERBQWlCO0FBQ3JELHFCQUFxQix3REFBVSxDQUFDLG1EQUFVO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsb0RBQU07O0FBRXpCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0RUFBRyxzQkFBc0IsZUFBZTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLHlEQUFRO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHVEQUFTO0FBQ1g7QUFDQSw2REFBNkQsZUFBZTtBQUM1RTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNILG9CQUFvQiw0RUFBYTtBQUNqQyxzQkFBc0IsNkRBQUksQ0FBQywwREFBaUI7QUFDNUM7QUFDQSwyQkFBMkIsNkRBQUksQ0FBQyxtREFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUVBQVk7QUFDL0I7QUFDQTtBQUNBLE9BQU87QUFDUCw2QkFBNkIsNkRBQUksNEJBQTRCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlO0FBQ2YsUUFBUSxnREFBTztBQUNmLENBQUMsQ0FBQyxFOzs7Ozs7OztBQ2xJRjtBQUFBO0FBQUE7QUFBK0I7QUFDL0IsZ0NBQWdDLG1EQUFtQjtBQUNuRDtBQUNlLHlFQUFVLEU7Ozs7Ozs7O0FDSHpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQSwwREFBMEQsK0JBQStCLGlCQUFpQixzQ0FBc0MsWUFBWSxZQUFZLHVCQUF1QixPQUFPLHFCQUFxQiwwQ0FBMEMsMkJBQTJCLEVBQUUsZUFBZTs7QUFFbFI7QUFDSTtBQUM0QjtBQUN6QjtBQUNnQztBQUN4QztBQUNPO0FBQ1c7QUFDekM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QseUJBQXlCLHdEQUFVLENBQUMsMERBQWlCO0FBQ3JELHFCQUFxQix3REFBVSxDQUFDLG1EQUFVO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjs7QUFFckYsVUFBVSx5REFBUTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiwrRUFBZ0I7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSw2QkFBNkIsZ0RBQWdCO0FBQzdDO0FBQ0Esb0JBQW9CLCtDQUFNO0FBQzFCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxTQUFTLHVFQUFZO0FBQ3JCO0FBQ0EsR0FBRyxZQUFZOztBQUVmLFFBQVEseURBQVE7QUFDaEIsc0JBQXNCLDZEQUFJLDRCQUE0QjtBQUN0RDtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSxzRUFBTyxFOzs7Ozs7OztBQ3RGdEI7QUFBQTtBQUFBO0FBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHdCQUF3QixvREFBTTtBQUM5QixFQUFFLHVEQUFTO0FBQ1g7QUFDQSxHQUFHO0FBQ0gsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFZSw2RUFBYyxFOzs7Ozs7OztBQzdCN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDRTtBQUMwQjtBQUNGO0FBQ3hCO0FBQ0c7QUFDTTtBQUNRO0FBQ3dCO0FBQzFCOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixnREFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLEdBQUc7QUFDSCxtQ0FBbUMsNkVBQWM7QUFDakQseUNBQXlDLDZFQUFjO0FBQ3ZELG9CQUFvQiw0RUFBYTtBQUNqQyxvQkFBb0IsaUVBQWdCO0FBQ3BDLGlCQUFpQixpRUFBZ0I7QUFDakMsOEJBQThCLHNEQUFRO0FBQ3RDLGlCQUFpQiwwREFBUyxzQkFBc0IsNkVBQTRCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBLEVBQUUsNkRBQVk7QUFDZDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHlCQUF5Qiw2REFBSTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsa0NBQWtDLGdEQUFRO0FBQzFDLENBQUM7QUFDRDtBQUNlLHNFQUFPLEU7Ozs7Ozs7O0FDdkd0QjtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUMvQix1Q0FBdUMsbURBQW1CO0FBQ25EO0FBQ1A7QUFDQTtBQUNBO0FBQ2UsZ0ZBQWlCLEU7Ozs7Ozs7O0FDTmhDO0FBQUE7QUFBQTtBQUErQjtBQUMvQixnQ0FBZ0MsbURBQW1CO0FBQ3BDLHlFQUFVLEU7Ozs7Ozs7O0FDRnpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQSwwREFBMEQsK0JBQStCLGlCQUFpQixzQ0FBc0MsWUFBWSxZQUFZLHVCQUF1QixPQUFPLHFCQUFxQiwwQ0FBMEMsMkJBQTJCLEVBQUUsZUFBZTs7QUFFbFI7QUFDSTtBQUNHO0FBQ2dDO0FBQ3hCO0FBQ0U7QUFDekM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsa0JBQWtCLHdEQUFVLENBQUMsbURBQVU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSxjQUFjLHVFQUFZO0FBQzFCLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsOENBQThDLHVFQUFZO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDhCQUE4QixnREFBZ0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHVEQUFjO0FBQzNDLEdBQUcsdUJBQXVCO0FBQzFCOztBQUVBLHNCQUFzQiw2REFBSSxDQUFDLG1EQUFVO0FBQ3JDO0FBQ0EsMkJBQTJCLDZEQUFJLENBQUMsMERBQWlCO0FBQ2pEO0FBQ0EsNkJBQTZCLDZEQUFJO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2REFBSSw0QkFBNEI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsdUVBQVEsRTs7Ozs7Ozs7QUNoR3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0M7QUFDcUI7QUFDaEI7QUFDQztBQUNjO0FBQ2xCO0FBQ2M7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZ0NBQWdDLDBFQUFtQjtBQUNuRCxhQUFhLHlEQUFZO0FBQ3pCLDBCQUEwQixxREFBTyx3REFBd0QsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJO0FBQzNHLHFCQUFxQixxREFBTztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUksQ0FBQyxtREFBVTtBQUNyQztBQUNBLDJCQUEyQiw2REFBSSxDQUFDLDBEQUFpQjtBQUNqRDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQSxhQUFhLGlEQUFRO0FBQ04sbUVBQUksRTs7Ozs7Ozs7QUMzQ25CO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ05BO0FBQUE7QUFBQTtBQUFBO0FBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ08saUNBQWlDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsNkJBQTZCO0FBQzdCO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQzs7Ozs7Ozs7QUMvREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF1RDtBQUNnQjtBQUNFO0FBQ3BCO0FBQ0E7QUFDSTtBQUNjO0FBQ0k7QUFDckI7QUFDVztBQUNqRTs7QUFFTyxxQkFBcUIsc0ZBQWU7QUFDM0MscUJBQXFCLHlFQUFJLEVBQUUsa0ZBQWEsRUFBRSxrRkFBYSxFQUFFLG1GQUFjLEVBQUUsMkVBQU0sRUFBRSx5RUFBSSxFQUFFLG9GQUFlLEVBQUUsMEVBQUs7QUFDN0csQ0FBQzs7Ozs7Ozs7O0FDZEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFzRTs7Ozs7Ozs7O0FDQXRFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBLDBEQUEwRCwrQkFBK0IsaUJBQWlCLHNDQUFzQyxZQUFZLFlBQVksdUJBQXVCLE9BQU8scUJBQXFCLDBDQUEwQywyQkFBMkIsRUFBRSxlQUFlOztBQUV2TztBQUMxQztBQUN1QjtBQUNmO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBELElBQUksR0FBRyxVQUFVO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWEsZUFBZTtBQUM1Qjs7QUFFQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSx3QkFBd0Isb0RBQU07QUFDOUIsNEJBQTRCLG9EQUFNO0FBQ2xDLGlCQUFpQix5REFBVztBQUM1Qjs7QUFFQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IseURBQVc7QUFDakM7O0FBRUE7QUFDQSxHQUFHO0FBQ0gsa0NBQWtDLDJFQUFZLENBQUMsc0RBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0gseUJBQXlCLHFEQUFPO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNILHdCQUF3QixxREFBTztBQUMvQixTQUFTLHFEQUFNO0FBQ2Y7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsNERBQVksa0RBQWtEO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qyx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRWUsd0VBQVMsRTs7Ozs7Ozs7QUN4S3hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE0QztBQUNKO0FBQ2M7QUFDQztBQUNRO0FBQ2pDO0FBQzlCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyw4QkFBOEI7QUFDekMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxLQUFLO0FBQ04sbUNBQW1DLG9EQUFNO0FBQ3pDO0FBQ0EsNkJBQTZCLHlEQUFXO0FBQ3hDO0FBQ0EsSUFBSSw4Q0FBTztBQUNYLHlHQUF5RyxvRUFBUTtBQUNqSCxHQUFHO0FBQ0gsc0JBQXNCLCtFQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLCtFQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSx1REFBUztBQUNYO0FBQ0EsZ0JBQWdCLHlFQUFhLG9CQUFvQjtBQUNqRDs7QUFFQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQSx1Q0FBdUMsa0VBQU07QUFDN0MsZ0NBQWdDLGtFQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsZ0NBQWdDLGtFQUFNO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSw2RUFBNkUsa0VBQU07QUFDbkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVlLDJFQUFZLEU7Ozs7Ozs7O0FDaEczQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNEO0FBQ1I7QUFDRjtBQUNSO0FBQzdCO0FBQ1A7O0FBRUEsT0FBTyw2REFBUztBQUNoQix1Q0FBdUMseUVBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2YsaUJBQWlCLDBEQUFTO0FBQzFCLGdDQUFnQyxzREFBUTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQzs7Ozs7Ozs7QUNwQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtEO0FBQ0o7QUFDOUMsNkJBQTZCLDJEQUFhLENBQUMsNkRBQVM7QUFDN0M7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZixTQUFTLHdEQUFVO0FBQ25CLEM7Ozs7Ozs7O0FDYkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDRTtBQUNFO0FBQ0E7QUFDRTtBQUNaO0FBQ007QUFDRjtBQUNrQjtBQUN4QjtBQUNFO0FBQ047QUFDa0I7Ozs7Ozs7OztBQ1pwRDtBQUFBO0FBQUE7QUFBQTtBQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esb0JBQW9CLFVBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZixTQUFTLHNEQUFRO0FBQ2pCLEM7Ozs7Ozs7O0FDNUJBO0FBQUE7QUFBQTtBQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLG9EQUFNO0FBQ2xCLEVBQUUsdURBQVM7QUFDWDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVlLDhFQUFlLEU7Ozs7Ozs7O0FDbkI5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ1k7QUFDakM7QUFDZixZQUFZLGdFQUFlO0FBQzNCLFNBQVMseURBQVc7QUFDcEI7QUFDQSxHQUFHO0FBQ0gsQzs7Ozs7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtDO0FBQ2dCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0IsaUVBQWdCO0FBQ2hDLEVBQUUsdURBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7O0FDekJBO0FBQUE7QUFBQTtBQUFBO0FBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBLG9CQUFvQix3REFBVTtBQUM5QjtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDM0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0Q7QUFDZDs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLHlEQUFXO0FBQ2xDO0FBQ0EsR0FBRztBQUNILFNBQVMsaUVBQWdCO0FBQ3pCLEM7Ozs7Ozs7O0FDMUJBO0FBQUE7QUFBQTtBQUFBO0FBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixvQkFBb0IsSUFBSTtBQUN4QjtBQUNBO0FBQ0E7QUFDZTtBQUNmLGtCQUFrQixzREFBUTtBQUMxQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsRUFBRSx1REFBUztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEM7Ozs7Ozs7O0FDN0VBO0FBQUE7QUFBQTtBQUFBO0FBQWtDO0FBQ2M7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixNQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLGdFQUFlLEtBQUs7QUFDbEM7O0FBRUEsa0JBQWtCLGdFQUFlOztBQUVqQztBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRWUsMEVBQVcsRTs7Ozs7Ozs7QUN6RDFCO0FBQUE7QUFBQTtBQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWUsd0ZBQXlCLHFEQUFlLEdBQUcsK0NBQVMsRTs7Ozs7Ozs7O0FDZG5FO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQXFCLGdEQUFnRCxnQkFBZ0Isc0JBQXNCLE9BQU8sMkJBQTJCLDBCQUEwQix5REFBeUQsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLGVBQWUsR0FBRyx3Q0FBd0M7O0FBRTdROztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMseUJBQXlCO0FBQ3JFO0FBQ0EsYUFBYSxnQkFBZ0IsTUFBTTtBQUNuQztBQUNBLHVCQUF1QixzQkFBc0IsT0FBTztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Ysa0JBQWtCLHNEQUFRO0FBQzFCO0FBQ0E7O0FBRUEsZ0JBQWdCLHlEQUFXO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsMEJBQTBCO0FBQzFCLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBLEM7Ozs7Ozs7O0FDdkNBO0FBQUE7QUFBQTtBQUE0QztBQUM3QjtBQUNmLHVCQUF1Qiw4REFBYTtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQUE7QUFBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsVUFBVSxFQUFFLFNBQVM7QUFDOUMsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVMscURBQU87QUFDaEI7QUFDQSxHQUFHO0FBQ0g7O0FBRWUsNEVBQWEsRTs7Ozs7Ozs7QUN2QzVCO0FBQUE7QUFBQTtBQUFBO0FBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBOztBQUVlO0FBQ2YsZ0JBQWdCLG9EQUFNO0FBQ3RCLGtCQUFrQixvREFBTTtBQUN4QjtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQzs7Ozs7Ozs7QUNqQ0E7QUFBQTtBQUFBO0FBQUE7QUFBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmLFlBQVksb0RBQU07QUFDbEIsRUFBRSx1REFBUztBQUNYO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQzs7Ozs7Ozs7QUN6QkE7QUFBQTtBQUFBO0FBQUE7QUFBa0M7QUFDYzs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsZ0VBQWUsS0FBSztBQUNsQzs7QUFFQSxrQkFBa0IsZ0VBQWU7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRWUsNkVBQWMsRTs7Ozs7Ozs7QUNyQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUM7QUFDYTtBQUM5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVTtBQUN4QixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHZTtBQUNmLGtCQUFrQixzREFBUTtBQUMxQjtBQUNBOztBQUVBLEVBQUUsb0VBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEM7Ozs7Ozs7O0FDbkRBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0U7O0FBRXRDO0FBQ0Esa0JBQWtCLDJEQUFVO0FBQzVCLG9CQUFvQix5REFBVztBQUMvQjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVlLDJFQUFZLEU7Ozs7Ozs7O0FDWDNCO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmLGlCQUFpQixvREFBTTtBQUN2QjtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTRDO0FBQ1Y7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Ysa0JBQWtCLDhEQUFhO0FBQy9CLEVBQUUsdURBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQzs7Ozs7Ozs7QUNoQlk7O0FBRVo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7QUNySkE7QUFBQTs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7O0FBRUEsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEtBQUssS0FBNkI7QUFDbEM7QUFDQTtBQUNBLEVBQUUsVUFBVSxJQUE0RTtBQUN4RjtBQUNBLEVBQUUsaUNBQXFCLEVBQUUsbUNBQUU7QUFDM0I7QUFDQSxHQUFHO0FBQUEsb0dBQUM7QUFDSixFQUFFLE1BQU0sRUFFTjtBQUNGLENBQUM7Ozs7Ozs7OztBQ3pERDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBdUQ7QUFDSztBQUN6QjtBQUMyQjtBQUNFO0FBQ0U7QUFDdkI7QUFDUjtBQUNFO0FBQ1M7QUFDRDtBQUNWO0FBQ1M7QUFDTDtBQUNTO0FBQ0o7QUFDNUMsa0M7Ozs7Ozs7O0FDaEJBO0FBQVU7QUFDViwyQzs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQytCO0FBQ2hDLGdEOzs7Ozs7OztBQ2hJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDZjtBQUN4QixtQkFBbUIsbURBQW1CO0FBQzdDO0FBQ08sMkJBQTJCLG1EQUFtQjtBQUNyRDtBQUNPO0FBQ1AsV0FBVyx3REFBVTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLHdEQUFVO0FBQ3JCO0FBQ087QUFDUDtBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBLGlDOzs7Ozs7OztBQ3RCQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3QiwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ0EsbUJBQW1CLFNBQUksSUFBSSxTQUFJO0FBQy9CLGFBQWEsNkJBQTZCLDBCQUEwQixhQUFhLEVBQUUscUJBQXFCO0FBQ3hHLGdCQUFnQixxREFBcUQsb0VBQW9FLGFBQWEsRUFBRTtBQUN4SixzQkFBc0Isc0JBQXNCLHFCQUFxQixHQUFHO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxrQ0FBa0MsU0FBUztBQUMzQyxrQ0FBa0MsV0FBVyxVQUFVO0FBQ3ZELHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0EsNkdBQTZHLE9BQU8sVUFBVTtBQUM5SCxnRkFBZ0YsaUJBQWlCLE9BQU87QUFDeEcsd0RBQXdELGdCQUFnQixRQUFRLE9BQU87QUFDdkYsOENBQThDLGdCQUFnQixnQkFBZ0IsT0FBTztBQUNyRjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsU0FBUyxZQUFZLGFBQWEsT0FBTyxFQUFFLFVBQVUsV0FBVztBQUNoRSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ21DO0FBQ25DO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsZ0RBQU07QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGdEQUFNO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUM2QjtBQUM5Qiw4Qzs7Ozs7Ozs7QUNyRkE7QUFBQTtBQUFBO0FBQUEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCO0FBQ0E7QUFDQSxjQUFjLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDdkYsNkJBQTZCLDhFQUE4RTtBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQSxDQUFDO0FBQ3lEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxzRUFBa0I7QUFDWTtBQUNoQyxnRDs7Ozs7Ozs7QUN4QkE7QUFBVTtBQUNWLGtEOzs7Ozs7OztBQ0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEM7QUFDbkMsb0JBQW9CLDRDQUFLO0FBQ2hDO0FBQ087QUFDUCxXQUFXLHdEQUFVO0FBQ3JCO0FBQ0EseUM7Ozs7Ozs7O0FDTkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0I7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCLHNDQUFzQyxpQkFBaUIsRUFBRTtBQUN2Riw2QkFBNkIsOEVBQThFO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBLENBQUM7QUFDRCxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLG1CQUFtQixTQUFJLElBQUksU0FBSTtBQUMvQixhQUFhLDZCQUE2QiwwQkFBMEIsYUFBYSxFQUFFLHFCQUFxQjtBQUN4RyxnQkFBZ0IscURBQXFELG9FQUFvRSxhQUFhLEVBQUU7QUFDeEosc0JBQXNCLHNCQUFzQixxQkFBcUIsR0FBRztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsa0NBQWtDLFNBQVM7QUFDM0Msa0NBQWtDLFdBQVcsVUFBVTtBQUN2RCx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBLDZHQUE2RyxPQUFPLFVBQVU7QUFDOUgsZ0ZBQWdGLGlCQUFpQixPQUFPO0FBQ3hHLHdEQUF3RCxnQkFBZ0IsUUFBUSxPQUFPO0FBQ3ZGLDhDQUE4QyxnQkFBZ0IsZ0JBQWdCLE9BQU87QUFDckY7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVMsWUFBWSxhQUFhLE9BQU8sRUFBRSxVQUFVLFdBQVc7QUFDaEUsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUMrQjtBQUNPO0FBQ2dCO0FBQ0U7QUFDZ0I7QUFDSTtBQUNyQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLDZEQUFtQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLG9GQUFvQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLHdGQUFvQjtBQUM3RDtBQUNBLHlCQUF5QixnREFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbURBQW1CLFNBQVMsd0RBQXdEO0FBQzNHLFlBQVksbURBQW1CLENBQUMsbURBQVksWUFBWSxjQUFjO0FBQ3RFLHdCQUF3QixtREFBbUIsQ0FBQyxpRUFBYSxHQUFHLHdZQUF3WTtBQUNwYyxhQUFhO0FBQ2I7QUFDQTtBQUNBLG1CQUFtQixtREFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IseUJBQXlCLEVBQUUsRUFBRTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdEO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLDJCQUEyQjtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyw2REFBbUI7QUFDeEQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHlDQUF5QztBQUNoRjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNkRBQW1CO0FBQ3JEO0FBQ0EsQ0FBQyxDQUFDLG1EQUFhO0FBQ0U7QUFDakIsaUM7Ozs7Ozs7O0FDaFhBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ2E7QUFDckMsa0JBQWtCLDBDQUFVO0FBQ25DO0FBQ0EsYUFBYSxzREFBUTtBQUNyQixJQUFJLHVEQUFTO0FBQ2IsOERBQThELHlCQUF5QixFQUFFO0FBQ3pGLEtBQUs7QUFDTDtBQUNBLGdCQUFnQixtREFBbUIsVUFBVSxxQ0FBcUM7QUFDbEY7QUFDQTtBQUNBLENBQUM7QUFDRCx1Qzs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNBLG1CQUFtQixTQUFJLElBQUksU0FBSTtBQUMvQixhQUFhLDZCQUE2QiwwQkFBMEIsYUFBYSxFQUFFLHFCQUFxQjtBQUN4RyxnQkFBZ0IscURBQXFELG9FQUFvRSxhQUFhLEVBQUU7QUFDeEosc0JBQXNCLHNCQUFzQixxQkFBcUIsR0FBRztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsa0NBQWtDLFNBQVM7QUFDM0Msa0NBQWtDLFdBQVcsVUFBVTtBQUN2RCx5Q0FBeUMsY0FBYztBQUN2RDtBQUNBLDZHQUE2RyxPQUFPLFVBQVU7QUFDOUgsZ0ZBQWdGLGlCQUFpQixPQUFPO0FBQ3hHLHdEQUF3RCxnQkFBZ0IsUUFBUSxPQUFPO0FBQ3ZGLDhDQUE4QyxnQkFBZ0IsZ0JBQWdCLE9BQU87QUFDckY7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLFNBQVMsWUFBWSxhQUFhLE9BQU8sRUFBRSxVQUFVLFdBQVc7QUFDaEUsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNzRDtBQUNRO0FBQ0Q7QUFDekI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxxQ0FBcUM7QUFDckM7QUFDQSxtRkFBbUYsbUVBQW1FLEVBQUU7QUFDeEo7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELG1FQUFNO0FBQ3REO0FBQ0E7QUFDQSxnREFBZ0QsMkVBQVUsbUJBQW1CO0FBQzdFO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSwrRkFBK0YsWUFBWSxtRUFBTSw4QkFBOEIsRUFBRTtBQUNqSiw0Q0FBNEMsbUVBQU07QUFDbEQscUNBQXFDO0FBQ3JDO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRixxQ0FBcUMsRUFBRTtBQUN6SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RSxxQ0FBcUMsRUFBRTtBQUNySDtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxpQ0FBaUM7QUFDakM7QUFDQSwrRUFBK0UsMkRBQTJELEVBQUU7QUFDNUk7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHFEQUFXLG9DQUFvQztBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkIsRUFBRSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHFEQUFXLHVEQUF1RDtBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkIsRUFBRSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxxREFBVyxvQ0FBb0M7QUFDNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkIsRUFBRSxFQUFFO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELDZEQUFtQjtBQUN4RTtBQUNBLENBQUM7QUFDK0I7QUFDaEMsZ0RBQUssZ0NBQWdDLDZEQUE2RCxFQUFFO0FBQ3BHLGdEOzs7Ozs7OztBQy9TQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDSztBQUNhO0FBQ1Q7QUFDakMscUJBQXFCLDBDQUFVO0FBQ3RDO0FBQ0EsYUFBYSxvRUFBUztBQUN0QixnQkFBZ0IsMkRBQVE7QUFDeEIseUJBQXlCLHlEQUFXO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxZQUFZLG1EQUFtQixZQUFZLDhFQUE4RTtBQUN6SCxDQUFDO0FBQ0QsMEM7Ozs7Ozs7O0FDZkE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0I7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCLHNDQUFzQyxpQkFBaUIsRUFBRTtBQUN2Riw2QkFBNkIsOEVBQThFO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBLENBQUM7QUFDcUM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1DQUFtQyxFQUFFO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0EsQ0FBQyxDQUFDLG1EQUFhO0FBQ0M7QUFDaEIsZ0M7Ozs7Ozs7O0FDaEVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0I7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCLHNDQUFzQyxpQkFBaUIsRUFBRTtBQUN2Riw2QkFBNkIsOEVBQThFO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBLENBQUM7QUFDRCxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytCO0FBQ0c7QUFDbUI7QUFDWjtBQUNXO0FBQ1I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1REFBUztBQUNuQyxzQkFBc0IsdURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbURBQW1CLFNBQVMsMEZBQTBGO0FBQ3RJLFlBQVksbURBQW1CLFNBQVMsa0JBQWtCO0FBQzFELGdCQUFnQixtREFBbUIsQ0FBQywrREFBb0IsWUFBWSxjQUFjO0FBQ2xGLG9CQUFvQixtREFBbUIsQ0FBQyxnRUFBYSxZQUFZLFlBQVk7QUFDN0Usd0JBQXdCLG1EQUFtQixDQUFDLHFEQUFNLEdBQUcsNkZBQTZGO0FBQ2xKLHdCQUF3QixtREFBbUIsQ0FBQyx5REFBUyxHQUFHLGVBQWU7QUFDdkUsNEJBQTRCLG1EQUFtQixpQkFBaUIscUNBQXFDLGNBQWMsU0FBUztBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUMsQ0FBQyxtREFBbUI7QUFDSTtBQUN6Qix5Qzs7Ozs7Ozs7QUM3RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTJDO0FBQ2dCO0FBQ1Y7QUFDakQ7QUFDQSxtQkFBbUIsNENBQUs7QUFDeEI7QUFDQSxvQkFBb0IsMkRBQVE7QUFDNUIsNEJBQTRCLG9FQUFTO0FBQ3JDLDZCQUE2Qix5REFBVztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvRUFBaUI7QUFDcEMsZ0JBQWdCLDRDQUFLLHFCQUFxQixvRUFBb0U7QUFDOUcsS0FBSztBQUNMO0FBQ0E7QUFDTztBQUNQLG9DOzs7Ozs7OztBQ3BDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDSztBQUNrQjtBQUNYO0FBQ3BDLGlCQUFpQiwwQ0FBVTtBQUNsQyxnQkFBZ0IsMkRBQVE7QUFDeEIsaUJBQWlCLHlEQUFXLGNBQWMscUVBQXFFLEVBQUU7QUFDakg7QUFDQSxnQkFBZ0IsbURBQW1CLENBQUMsbUVBQVksR0FBRyxrQkFBa0I7QUFDckUsWUFBWSxtREFBbUIsVUFBVSwrQkFBK0I7QUFDeEU7QUFDQTtBQUNBLENBQUM7QUFDRCxzQzs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDVztBQUNrQjtBQUNyRCxhQUFhLDBDQUFVO0FBQzlCO0FBQ0E7QUFDQSxzQkFBc0IsWUFBWSxzREFBVTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtREFBbUIsQ0FBQyw2REFBUSxHQUFHLHFFQUFxRTtBQUMvRyxDQUFDO0FBQ0Qsa0M7Ozs7Ozs7QUNkQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDLGtDQUFVOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQixpQkFBaUI7QUFDcEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxX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QTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwySkFBMko7QUFDM0osa0VBQWtFO0FBQ2xFO0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDNXZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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Q0E7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw2QkFBNkI7QUFDN0IsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQiwyQkFBMkI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLDRGQUE0RixTQUFNO0FBQzdJO0FBQ0E7O0FBRUEsbUJBQW1CLGdDQUFnQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsZ0NBQWdDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7O0FDOWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxJQUFxQztBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQyxrQ0FBVTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsc0RBQTJCO0FBQ3RELENBQUMsTUFBTSxFQUlOOzs7Ozs7Ozs7QUNsQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViOztBQUVBOzs7Ozs7Ozs7QUNYQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFNQUFxTSxTQUFTLGdCQUFnQixPQUFPLGlCQUFpQixzQ0FBc0MsSUFBSSxhQUFhLGlEQUFpRCxVQUFVLDJEQUEyRCxZQUFZLHNDQUFzQyw0Q0FBNEMsYUFBYSxrQkFBa0Isc0hBQXNILGtCQUFrQixrREFBa0QseUNBQXlDLDRDQUE0QyxvQ0FBb0Msa0JBQWtCLHdCQUF3Qix5Q0FBeUMsV0FBVyxnREFBZ0Qsb0RBQW9ELGVBQWUsMkJBQTJCLHlCQUF5QixpQkFBaUIsZUFBZSxNQUFNLGlCQUFpQix5QkFBeUIsU0FBUyxTQUFTLEVBQUUsV0FBVyxrQkFBa0Isc0NBQXNDLGlDQUFpQyxvQ0FBb0MsUUFBUSxJQUFJLHdEQUF3RCxXQUFXLFdBQVcscUJBQXFCLGlCQUFpQixnQkFBZ0IsdUJBQXVCLGdCQUFnQixlQUFpSTtBQUM1bkQ7Ozs7Ozs7OztBQ0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEosa0RBQWtELGtCQUFrQixRQUFRLGtFQUFDLElBQUksaUJBQWlCLCtEQUFDLGdFQUFnRSxlQUFlLHlCQUF5QixNQUFNLGFBQWEsdUJBQXVCLGlCQUFpQixpQkFBaUIsZUFBZSxFQUFFLFdBQVcsTUFBTSw2RUFBNkUsV0FBVyxRQUFRLGtFQUFDLHNCQUFzQiwyQkFBMkIsWUFBWSxXQUFXLE1BQU0sYUFBYSxJQUFJLCtEQUFDLHdDQUF3QyxZQUFZLGlCQUFpQixzQkFBc0IsaUVBQUMsMEJBQTBCLHFDQUFxQyxZQUFZLCtCQUErQixRQUFRLE1BQTJCO0FBQzczQjs7Ozs7Ozs7O0FDREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBZ0M7QUFDaUI7QUFDSTtBQUNQO0FBQ087QUFDTjtBQUNFO0FBQ2Y7QUFDQTtBQUNGO0FBQ1E7QUFDTjtBQUNGO0FBQ0k7QUFDTTtBQUNSO0FBQ0w7QUFDN0IsZ0Q7Ozs7Ozs7O0FDakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFJLElBQUksU0FBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxjQUFjO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0I7QUFDUztBQUNqQyxXQUFXLDBDQUFVO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbURBQW1CLG1CQUFtQixhQUFhLFlBQVksMkRBQVcsc0JBQXNCO0FBQzVHLGdCQUFnQixtREFBbUIsU0FBUyxxQkFBcUI7QUFDakUsUUFBUSxtREFBbUIsU0FBUyx1QkFBdUI7QUFDM0QsQ0FBQztBQUNELGdDOzs7Ozs7OztBQ3pDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFJLElBQUksU0FBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxjQUFjO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0I7QUFDc0I7QUFDVjtBQUNwQyxhQUFhLDBDQUFVO0FBQzlCO0FBQ0EsWUFBWSxtREFBbUIsQ0FBQyxzREFBUSxhQUFhLFVBQVUsV0FBVywyREFBVyxZQUFZO0FBQ2pHLENBQUM7QUFDRCxrQzs7Ozs7Ozs7QUM3QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQUFnQixTQUFJLElBQUksU0FBSTtBQUM1QjtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQUksSUFBSSxTQUFJO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMrQjtBQUNZO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4Q0FBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsMkJBQTJCO0FBQzNGLFFBQVEsbURBQW1CLFdBQVcsdUJBQXVCO0FBQzdELFlBQVksbURBQW1CLFVBQVUsWUFBWSwyREFBVyxvQkFBb0I7QUFDcEYsWUFBWSxtREFBbUIscUJBQXFCLFVBQVUsc0NBQXNDLDJEQUFXLG9CQUFvQjtBQUNuSSxZQUFZLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsd0JBQXdCO0FBQ3hGLFlBQVksbURBQW1CLFVBQVUsWUFBWSwyREFBVyxvQkFBb0I7QUFDcEY7QUFDQSxVQUFVLDBDQUFVO0FBQ087QUFDM0Isb0M7Ozs7Ozs7O0FDbERBO0FBQVU7QUFDVixzQzs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFJLElBQUksU0FBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxjQUFjO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0I7QUFDQztBQUNXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtREFBbUIsQ0FBQyw0Q0FBSyxZQUFZLFlBQVksMkRBQVcsaURBQWlEO0FBQ3hIO0FBQ0EsVUFBVSwwQ0FBVTtBQUNVO0FBQzlCLHVDOzs7Ozs7OztBQ3ZDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQWdCLFNBQUksSUFBSSxTQUFJO0FBQzVCO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBSSxJQUFJLFNBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsY0FBYztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytCO0FBQ0s7QUFDTztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIseURBQVc7QUFDOUI7QUFDQSw4Q0FBOEMsMEJBQTBCO0FBQ3hFO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFlBQVksbURBQW1CLFdBQVcsWUFBWSwyREFBVyxzQkFBc0I7QUFDdkYsZ0JBQWdCLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsaUJBQWlCO0FBQ3JGLFFBQVEsbURBQW1CLHFCQUFxQixhQUFhLFlBQVksMkRBQVcsb0NBQW9DO0FBQ3hIO0FBQ0EsVUFBVSwwQ0FBVTtBQUNJO0FBQ3hCLGlDOzs7Ozs7OztBQzdDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQWdCLFNBQUksSUFBSSxTQUFJO0FBQzVCO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBSSxJQUFJLFNBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsY0FBYztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytCO0FBQ1k7QUFDcEMsYUFBYSwwQ0FBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhDQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsc0RBQXNEO0FBQ3RILFFBQVEsbURBQW1CLFdBQVcsdUJBQXVCO0FBQzdELFlBQVksbURBQW1CLFVBQVUsWUFBWSwyREFBVyxrQkFBa0I7QUFDbEYsWUFBWSxtREFBbUIscUJBQXFCLFVBQVUsMkJBQTJCO0FBQ3pGLFlBQVksbURBQW1CLFNBQVMsWUFBWSwyREFBVyxtQkFBbUI7QUFDbEYsZ0JBQWdCLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsbUJBQW1CO0FBQ3ZGLFlBQVksbURBQW1CLFVBQVUsWUFBWSwyREFBVyxrQkFBa0I7QUFDbEYsQ0FBQztBQUNELGtDOzs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ1M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG1EQUFtQixTQUFTLFlBQVksMkRBQVcsc0JBQXNCO0FBQ3BGO0FBQ0EsVUFBVSwwQ0FBVTtBQUNHO0FBQ3ZCLGdDOzs7Ozs7OztBQ25CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ1M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtREFBbUIsU0FBUyxZQUFZLDJEQUFXLHNCQUFzQjtBQUNwRjtBQUNBLFVBQVUsMENBQVU7QUFDRztBQUN2QixnQzs7Ozs7Ozs7QUNsQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQUFnQixTQUFJLElBQUksU0FBSTtBQUM1QjtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQUksSUFBSSxTQUFJO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMrQjtBQUNTO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbURBQW1CLGtCQUFrQixVQUFVLFlBQVksMkRBQVcscUJBQXFCO0FBQ3ZHO0FBQ0E7QUFDQSxxQkFBcUIsbURBQW1CLFVBQVUsWUFBWSwyREFBVyxzQkFBc0I7QUFDL0Y7QUFDQSxnQkFBZ0IsbURBQW1CLFFBQVEsWUFBWSwyREFBVywrQ0FBK0M7QUFDakg7QUFDQSxZQUFZLG1EQUFtQixVQUFVLFlBQVksMkRBQVcsb0JBQW9CO0FBQ3BGLEtBQUs7QUFDTDtBQUNBLFVBQVUsMENBQVU7QUFDRztBQUN2QixnQzs7Ozs7Ozs7QUM3Q0E7QUFBVTtBQUNWLDZDOzs7Ozs7OztBQ0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQWdCLFNBQUksSUFBSSxTQUFJO0FBQzVCO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMrQjtBQUNRO0FBQ1k7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVEsK0VBQStFLEVBQUU7QUFDL0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxhQUFhLDREQUFRO0FBQ3JCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksbURBQW1CLENBQUMscURBQU8sYUFBYTtBQUM1QyxRQUFRLG1EQUFtQjtBQUMzQjtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBLFFBQVEsbURBQW1CLGtCQUFrQjtBQUM3QztBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLFFBQVEsbURBQW1CLGtCQUFrQjtBQUM3QztBQUNBLGtDQUFrQyxFQUFFLElBQUksRUFBRTtBQUMxQyxRQUFRLG1EQUFtQixxQkFBcUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBbUIsa0JBQWtCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1EQUFtQixrQkFBa0Isd0JBQXdCLGVBQWU7QUFDcEc7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxVQUFVLDBDQUFVO0FBQ0k7QUFDeEIsaUM7Ozs7Ozs7O0FDdkVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDUztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtREFBbUIsVUFBVSxZQUFZLDJEQUFXLHNCQUFzQjtBQUNyRjtBQUNBLFVBQVUsMENBQVU7QUFDRztBQUN2QixnQzs7Ozs7Ozs7QUNwQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFJLElBQUksU0FBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxjQUFjO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0I7QUFDcUI7QUFDTjtBQUNOO0FBQ2pDLGFBQWEsMENBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtREFBbUIsQ0FBQyxzREFBTSxhQUFhLGFBQWEsOEJBQThCLDJEQUFXLHVCQUF1QjtBQUNoSSxRQUFRLG1EQUFtQixDQUFDLHlEQUFTLEdBQUcsZUFBZTtBQUN2RCxZQUFZLG1EQUFtQixTQUFTLFlBQVksMkRBQVcsa0NBQWtDO0FBQ2pHLFlBQVksbURBQW1CLFNBQVMsWUFBWSwyREFBVyw0QkFBNEI7QUFDM0YsZ0JBQWdCLG1EQUFtQixDQUFDLHNEQUFNLFFBQVEsWUFBWSwyREFBVyxrQkFBa0I7QUFDM0YsWUFBWSxtREFBbUIsU0FBUyxZQUFZLDJEQUFXLG1DQUFtQztBQUNsRyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1EQUFtQixhQUFhLHNHQUFzRztBQUMxSjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbURBQW1CLFNBQVMsMkRBQTJEO0FBQzNHO0FBQ0EsZ0JBQWdCLG1EQUFtQixDQUFDLDBEQUFZLEdBQUcsOERBQThEO0FBQ2pILEtBQUs7QUFDTDtBQUNBLGtDOzs7Ozs7OztBQ3BEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQWdCLFNBQUksSUFBSSxTQUFJO0FBQzVCO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBSSxJQUFJLFNBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsY0FBYztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQytCO0FBQ0s7QUFDTTtBQUNuQyxtQkFBbUIsMENBQVU7QUFDcEM7QUFDQSxhQUFhLHlEQUFXLGNBQWMscUNBQXFDLEVBQUU7QUFDN0UsWUFBWSxtREFBbUIsQ0FBQyx1REFBTyxhQUFhLGFBQWEsa0NBQWtDO0FBQ25HLENBQUM7QUFDRCx3Qzs7Ozs7Ozs7QUM5QkE7QUFBVTtBQUNWLHVDOzs7Ozs7OztBQ0RBO0FBQUE7QUFBTztBQUNQO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsd0JBQXdCLEVBQUU7QUFDeEQsMkJBQTJCLHlCQUF5QixFQUFFO0FBQ3REO0FBQ0E7QUFDQSx5RUFBeUUsd0JBQXdCLEVBQUU7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtDOzs7Ozs7OztBQ2xCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0k7QUFDNEI7QUFDdkI7QUFDRTtBQUNNO0FBQ0U7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZ0RBQWdCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBa0Isd0RBQVUsQ0FBQyxxREFBWTtBQUN6QyxzQkFBc0IsK0VBQWdCO0FBQ3RDO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDhEQUFLO0FBQzNCO0FBQ0E7QUFDQSxxREFBcUQsNkRBQUksQ0FBQyxvREFBVztBQUNyRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLGtGQUFtQixFOzs7Ozs7OztBQ25DbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDQztBQUNpQjtBQUNJO0FBQ1Q7QUFDSTtBQUNJO0FBQ0Y7QUFDRjtBQUNKO0FBQ0k7QUFDaEQsK0JBQStCLGdEQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsc0VBQWU7QUFDckI7QUFDQSxHQUFHO0FBQ0gsaUJBQWlCLHlFQUFrQjtBQUNuQyx1QkFBdUIscURBQU87QUFDOUI7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsOERBQUksQ0FBQyx5REFBZ0I7QUFDM0M7QUFDQSwyQkFBMkIsOERBQUk7QUFDL0I7QUFDQTtBQUNBLGlCQUFpQixpREFBVSxnQ0FBZ0MsT0FBTztBQUNsRSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlO0FBQ2YsVUFBVSx3REFBZTtBQUN6QixZQUFZLDBEQUFpQjtBQUM3QixRQUFRLHNEQUFhO0FBQ3JCLFVBQVUsd0RBQWU7QUFDekIsUUFBUSxzREFBYTtBQUNyQixDQUFDLENBQUMsRTs7Ozs7Ozs7QUM5Q0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQ2tCO0FBQ0Q7QUFDTTtBQUNWO0FBQ2hELG1DQUFtQyxnREFBZ0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQjtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMsNkRBQW9CO0FBQ3JDLHNCQUFzQiw2REFBSSxDQUFDLDBEQUFpQjtBQUM1QztBQUNBLDJCQUEyQiw2REFBSTtBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLGlEQUFVO0FBQzNCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsNEVBQWEsRTs7Ozs7Ozs7QUM1QjVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDSTtBQUNDO0FBQ2M7QUFDUTtBQUNMO0FBQ0w7QUFDekM7QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsd0RBQVUsQ0FBQyx5REFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZ0RBQWdCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQjtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMsNkRBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLHlEQUFnQjs7QUFFakM7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw2REFBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDhFQUFlLEU7Ozs7Ozs7O0FDcEQ5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0k7QUFDa0I7QUFDbkI7QUFDZ0I7QUFDRjtBQUNoRCx1Q0FBdUMsZ0RBQWdCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMseURBQWdCO0FBQ2pDLGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxDQUFDLGlEQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIsMkJBQTJCLDZEQUFJO0FBQy9CLGdCQUFnQiw4Q0FBYztBQUM5QixLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLGdGQUFpQixFOzs7Ozs7OztBQzlCaEM7QUFBQTtBQUFBO0FBQStCO0FBQy9CLDZCQUE2QixtREFBbUIsR0FBRztBQUNuRDtBQUNlLHNFQUFPLEU7Ozs7Ozs7O0FDSHRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDQTtBQUNoRCxxQ0FBcUMsZ0RBQWdCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSTtBQUMxQjtBQUNBO0FBQ0EsZUFBZSxpREFBVTtBQUN6QiwyQkFBMkIsNkRBQUksQ0FBQyx3REFBZTtBQUMvQztBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSw4RUFBZSxFOzs7Ozs7OztBQzFCOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDQztBQUNxQjtBQUNLO0FBQ1Y7QUFDaEQsbUNBQW1DLGdEQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0IsdUJBQXVCLHFEQUFPO0FBQzlCO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw2REFBSSxDQUFDLDZEQUFvQjtBQUMvQztBQUNBLDJCQUEyQiw2REFBSTtBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLGlEQUFVO0FBQzNCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsNEVBQWEsRTs7Ozs7Ozs7QUM1QjVCO0FBQUE7QUFBQTtBQUErQjtBQUMvQiw2QkFBNkIsbURBQW1CO0FBQ2hEO0FBQ0EsQ0FBQztBQUNEO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUNMdEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDa0I7QUFDYztBQUN2QjtBQUNhO0FBQzNCO0FBQ2M7QUFDVTtBQUNJO0FBQ047QUFDRTtBQUNsRCxzQkFBc0IsaUVBQWdCO0FBQ3RDO0FBQ0EscUJBQXFCLG1FQUFrQjtBQUN2QztBQUNBLENBQUM7QUFDRCxrQkFBa0IsbUVBQWtCO0FBQ3BDLGFBQWEsMERBQU07QUFDbkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGNBQWMsNkNBQUk7QUFDbEI7QUFDQTtBQUNBLDJCQUEyQixnREFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILGlCQUFpQix5RUFBa0I7QUFDbkMsc0JBQXNCLCtFQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsMkNBQTJDLDZDQUFJOztBQUUvQyw2QkFBNkIsK0RBQUs7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSxrQ0FBa0MsT0FBTyxHQUFHLFFBQVEscUJBQXFCLE9BQU87QUFDekcsMkNBQTJDLDhEQUFJLENBQUMsb0RBQVc7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQSxzQkFBc0IsOERBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLENBQUMsQ0FBQyxFOzs7Ozs7OztBQzVFRjtBQUFBO0FBQXdDO0FBQ3pCLHlIQUFNLEU7Ozs7Ozs7O0FDRHJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdEQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxpQkFBaUIseUVBQWtCO0FBQ25DLHNCQUFzQiw2REFBSTtBQUMxQjtBQUNBO0FBQ0EsZUFBZSxpREFBVSw0REFBNEQsS0FBSyxlQUFlLEdBQUc7QUFDNUcsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2Usb0VBQUssRTs7Ozs7Ozs7QUMxQnBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTRDO0FBQ1Y7QUFDYTtBQUNHO0FBQ0U7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0MsZ0VBQVk7QUFDaEQ7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQSxJQUFJLCtEQUFHO0FBQ1AsaUJBQWlCLFdBQVcsK0RBQUcsMEJBQTBCO0FBQ3pELEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLCtEQUFHO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG9FQUFRO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsSUFBSSw0RUFBRztBQUNQLElBQUksNEVBQUc7QUFDUCxJQUFJLDRFQUFHO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSSx1RUFBVztBQUNmO0FBQ0E7QUFDQSxJQUFJLDRFQUFHO0FBQ1AsSUFBSSw0RUFBRztBQUNQLElBQUksNEVBQUc7QUFDUDs7QUFFQTs7QUFFQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ2Usb0ZBQXFCLEU7Ozs7Ozs7O0FDL0RwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNQO0FBQ0U7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsZ0RBQWdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHlFQUFrQjtBQUNuQyxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkRBQUksUUFBUTtBQUN2QyxpQkFBaUIsaURBQVU7QUFDM0I7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2U7QUFDZixRQUFRLHVEQUFjO0FBQ3RCLENBQUMsQ0FBQyxFOzs7Ozs7OztBQ25DRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNTO0FBQ2E7QUFDTDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxnREFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFNO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHlFQUFrQjtBQUNuQyxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekI7QUFDQSxLQUFLO0FBQ0w7QUFDQSwrQ0FBK0MsNkRBQUksaUJBQWlCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlLDZFQUFjLEU7Ozs7Ozs7O0FDekM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNxQjtBQUNDO0FBQ0w7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnREFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHlFQUFrQjtBQUNuQztBQUNBO0FBQ0EsR0FBRyxJQUFJLHlFQUFjO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxzQkFBc0IsNkRBQUksYUFBYTtBQUN2QztBQUNBO0FBQ0EsZUFBZSxpREFBVSxzREFBc0QsT0FBTyxHQUFHLFFBQVEsY0FBYyxPQUFPLEdBQUcsS0FBSztBQUM5SCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZSxxRUFBTSxFOzs7Ozs7OztBQ25DckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWdCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlCQUFpQix5RUFBa0I7QUFDbkM7QUFDQSwrQkFBK0IsT0FBTztBQUN0QyxzQkFBc0IsNkRBQUksYUFBYTtBQUN2QztBQUNBLGVBQWUsaURBQVUsa0NBQWtDLE9BQU8sR0FBRyxLQUFLO0FBQzFFLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlLDBFQUFXLEU7Ozs7Ozs7O0FDM0IxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDTDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0RBQWdCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxpQkFBaUIseUVBQWtCO0FBQ25DLHNCQUFzQiw2REFBSSxTQUFTO0FBQ25DO0FBQ0EsZUFBZSxpREFBVTtBQUN6QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZSw0RUFBYSxFOzs7Ozs7OztBQ3BCNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDQztBQUNKO0FBQ2xCO0FBQ007QUFDVTtBQUNoRCxzQkFBc0IsaUVBQWdCO0FBQ3RDLHNCQUFzQixpRUFBZ0I7QUFDdEMsaUJBQWlCLG1FQUFrQjtBQUNuQyxrQkFBa0IsbUVBQWtCO0FBQ3BDO0FBQ0EsQ0FBQztBQUNELHFCQUFxQixtRUFBa0I7QUFDdkM7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLG1FQUFrQjtBQUNuQztBQUNBLENBQUM7QUFDRCxpQkFBaUIsbUVBQWtCO0FBQ25DO0FBQ0EsQ0FBQztBQUNELG1CQUFtQixtRUFBa0I7QUFDckMsdUJBQXVCLG1FQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsZ0RBQWdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlCQUFpQix5RUFBa0I7QUFDbkMsc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLGdDQUFnQyxHQUFHLG1CQUFtQixLQUFLLHVCQUF1QixPQUFPO0FBQ2xILGtDQUFrQyw2REFBSTtBQUN0QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZTtBQUNmLE9BQU8sZ0RBQU87QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtREFBVTtBQUNwQjtBQUNBO0FBQ0EsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDOURGO0FBQUE7QUFBc0Q7QUFDdkMsa0lBQWtCLGNBQWMsRTs7Ozs7Ozs7QUNEL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDQztBQUNxQjtBQUNEO0FBQ0o7QUFDaEQsZ0NBQWdDLGdEQUFnQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlCQUFpQix5RUFBa0I7QUFDbkMsdUJBQXVCLHFEQUFPO0FBQzlCO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw2REFBSSxDQUFDLDBEQUFpQjtBQUM1QztBQUNBLDJCQUEyQiw2REFBSTtBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLGlEQUFVO0FBQzNCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UseUVBQVUsRTs7Ozs7Ozs7QUMzQnpCO0FBQUE7QUFBQTtBQUErQjtBQUMvQiw2QkFBNkIsbURBQW1CO0FBQ2hEO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUNIdEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDaEQsNkJBQTZCLGdEQUFnQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHlFQUFrQjtBQUNuQyxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQSxlQUFlLGlEQUFVLGNBQWMsT0FBTyxHQUFHLFFBQVE7QUFDekQ7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUNwQnRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDRjtBQUNBO0FBQ1Y7QUFDWDtBQUNKO0FBQ0w7QUFDZ0U7QUFDOUM7QUFDRDtBQUNOO0FBQ087QUFDYztBQUNIO0FBQ0Y7QUFDTjtBQUNKO0FBQ0U7QUFDUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4REFBSTtBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EseUJBQXlCLDhEQUFJO0FBQzdCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLGdEQUFnQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILGlCQUFpQiwwRUFBa0I7QUFDbkMsZ0JBQWdCLGdFQUFRO0FBQ3hCLDJCQUEyQixvREFBTTtBQUNqQyxvQ0FBb0Msc0RBQVE7QUFDNUMsOEJBQThCLHNEQUFRO0FBQ3RDLG9DQUFvQyxzREFBUTtBQUM1Qyx3REFBd0Qsc0RBQVE7O0FBRWhFO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEVBQUUsdURBQVM7QUFDWDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUEsRUFBRSxpRUFBTztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxpQ0FBaUMsOEVBQWU7QUFDaEQsZUFBZSx5REFBVztBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRyxpRUFBaUU7O0FBRXBFLGVBQWUsK0VBQWdCO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gscUJBQXFCLG9EQUFNO0FBQzNCLEVBQUUsaUVBQW1CO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRzs7QUFFTiwwQkFBMEIsK0VBQWdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLDhFQUFlO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsNEJBQTRCLE9BQU8sUUFBUSxVQUFVO0FBQ3JELGtDQUFrQyxPQUFPLFFBQVEsZUFBZTtBQUNoRSxzQkFBc0IseURBQVc7QUFDakMsSUFBSSxzRUFBb0I7QUFDeEI7QUFDQSxHQUFHO0FBQ0gsd0JBQXdCLHlEQUFXO0FBQ25DO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsd0JBQXdCLHlEQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0gsMEJBQTBCLHlEQUFXO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCx5QkFBeUIseURBQVc7QUFDcEM7QUFDQTtBQUNBLEdBQUc7QUFDSCx5QkFBeUIsb0RBQU07QUFDL0IseUJBQXlCLG9EQUFNO0FBQy9CLDhCQUE4Qix5RUFBVTtBQUN4QywyQkFBMkIseURBQVc7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0gsMEJBQTBCLHlEQUFXO0FBQ3JDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCx5QkFBeUIseURBQVc7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsNEJBQTRCLG9EQUFNO0FBQ2xDLEVBQUUsdURBQVM7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsNEJBQTRCLHFEQUFPO0FBQ25DO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILHNCQUFzQiwrREFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSxpREFBaUQsT0FBTyxzQkFBc0IsT0FBTyxHQUFHLFFBQVE7QUFDekgsMENBQTBDLDhEQUFJO0FBQzlDLG9CQUFvQixPQUFPO0FBQzNCLGdCQUFnQiw2REFBRyxzQ0FBc0MsOERBQUk7QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHLFVBQVU7QUFDdEg7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssZ0JBQWdCLDhEQUFJO0FBQ3pCLG9CQUFvQixPQUFPO0FBQzNCLGdCQUFnQiw2REFBRztBQUNuQjtBQUNBLG9DQUFvQyw4REFBSSxDQUFDLDJEQUFpQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsK0RBQXFCO0FBQy9DLHlEQUF5RCxrREFBa0IsU0FBUztBQUNwRix1QkFBdUIsaURBQVU7QUFDakMsV0FBVztBQUNYLFNBQVMsaUJBQWlCLGtEQUFrQjtBQUM1QyxxQkFBcUIsaURBQVU7QUFDL0IsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLLDRCQUE0QiwrREFBSyxDQUFDLDJEQUFTO0FBQ2hELDZEQUE2RCwrREFBSyxDQUFDLDBEQUFNO0FBQ3pFLHNCQUFzQixPQUFPO0FBQzdCO0FBQ0EsdURBQXVELDhEQUFJO0FBQzNEO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTyw2REFBNkQsK0RBQUssQ0FBQywwREFBTTtBQUNoRixzQkFBc0IsT0FBTztBQUM3QjtBQUNBLHVEQUF1RCw4REFBSTtBQUMzRDtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2U7QUFDZixXQUFXLHdEQUFlO0FBQzFCLFFBQVEscURBQVk7QUFDcEIsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDalhGO0FBQUE7QUFBc0Q7QUFDdkMsa0lBQWtCLG9CQUFvQixFOzs7Ozs7OztBQ0RyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDTDtBQUNoRCxrQ0FBa0MsZ0RBQWdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QseUJBQXlCLGlEQUFVLFlBQVkseUVBQWtCO0FBQ2pFLHNCQUFzQiw2REFBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsMkVBQVksRTs7Ozs7Ozs7QUNuQjNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFtQztBQUNKO0FBQ0s7QUFDWTtBQUNoRDtBQUNBLGdCQUFnQixpREFBUztBQUN6QixXQUFXLGlEQUFTOztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpREFBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBZ0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx1QkFBdUIsNkRBQUk7QUFDNUI7QUFDQTtBQUNBLGFBQWEsaURBQVUsc0NBQXNDLFFBQVE7QUFDckU7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ2UsMEVBQVcsRTs7Ozs7Ozs7QUMvQjFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDaEQ7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRCw0Q0FBNEMsU0FBUyxFQUFFLE1BQU0sT0FBTyxTQUFTLEVBQUUsTUFBTSxHQUFHLEtBQUs7QUFDN0YsNENBQTRDLE1BQU0sR0FBRyxNQUFNO0FBQzNELDhDQUE4QyxNQUFNLEdBQUcsT0FBTztBQUM5RCxHQUFHO0FBQ0gsV0FBVztBQUNYLGVBQWUsaURBQVU7QUFDekIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHlCQUF5QixnREFBZ0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw2REFBSSxhQUFhO0FBQ3ZDO0FBQ0EsZUFBZSxpREFBVTtBQUN6QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2Usa0VBQUcsRTs7Ozs7Ozs7QUM1RGxCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0Y7QUFDSztBQUNnRDtBQUMzQjtBQUNBO0FBQ0Y7QUFDTjtBQUNKO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLDJCQUEyQixFQUFFLG1CQUFtQjtBQUMxRTtBQUNBO0FBQ0E7QUFDQSxXQUFXLCtEQUFHO0FBQ2QsV0FBVywrREFBRztBQUNkOztBQUVBO0FBQ0EsR0FBRyx3RUFBTTtBQUNULEdBQUcseUVBQU87QUFDVixHQUFHLDBFQUFRO0FBQ1gsR0FBRyx5RUFBTztBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw0Q0FBSztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLHFEQUFPLE9BQU8sc0VBQXFCO0FBQ3pEO0FBQ0EsR0FBRztBQUNILHlCQUF5QixxREFBTyxPQUFPLHNFQUFxQjtBQUM1RCw0QkFBNEIsbUNBQW1DLEVBQUUsMkJBQTJCO0FBQzVGLHVDQUF1QyxhQUFhO0FBQ3BELEdBQUc7QUFDSCx3QkFBd0IscURBQU8sT0FBTyxzRUFBcUI7QUFDM0Q7QUFDQSxHQUFHO0FBQ0g7O0FBRUEscUJBQXFCLHFEQUFPLE9BQU8sc0VBQXFCO0FBQ3hELHVDQUF1QywyQ0FBMkM7QUFDbEYsSUFBSSxxRUFBb0I7QUFDeEIsR0FBRztBQUNILHdCQUF3QixxREFBTyxPQUFPLHNFQUFxQjtBQUMzRDtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUksQ0FBQywwREFBaUI7QUFDNUM7QUFDQSxvQkFBb0IsOERBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsNENBQUsseUJBQXlCO0FBQ2hGLGlCQUFpQixpREFBVTtBQUMzQixLQUFLO0FBQ0wsR0FBRztBQUNILENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ2UsdUVBQVEsRTs7Ozs7Ozs7QUMzRnZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnREFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlCQUFpQix5RUFBa0I7QUFDbkMsaURBQWlELE1BQU07QUFDdkQsc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLHVCQUF1QixPQUFPLEVBQUUsT0FBTztBQUNoRSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZSx3RUFBUyxFOzs7Ozs7OztBQ3pCeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDYTtBQUNJO0FBQ0M7QUFDYztBQUNmO0FBQ047QUFDOEI7QUFDMUI7QUFDTTtBQUNXO0FBQ1Q7QUFDZDtBQUNRO0FBQ2hELHVCQUF1QixvRUFBa0I7QUFDekM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHdCQUF3QixvRUFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QseUJBQXlCLG9FQUFrQjtBQUMzQztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGdEQUFnQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILHVCQUF1Qix3REFBVSxDQUFDLDBEQUFpQjtBQUNuRCxpQkFBaUIsMEVBQWtCO0FBQ25DLGdCQUFnQixnRUFBUTs7QUFFeEI7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQsOERBQThEOztBQUU5RDtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLCtFQUFnQjtBQUN2QztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLDhFQUF3QjtBQUM1Qyx1QkFBdUIscURBQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw4REFBSSxDQUFDLHdEQUFlO0FBQzFDO0FBQ0EsMkJBQTJCLDhEQUFJLENBQUMsNERBQVk7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CLDZEQUE2RCw4REFBSSxhQUFhO0FBQzlFO0FBQ0EsbUJBQW1CLGlEQUFVO0FBQzdCLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2U7QUFDZixVQUFVLHVEQUFjO0FBQ3hCLFFBQVEscURBQVk7QUFDcEIsUUFBUSxxREFBWTtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsRTs7Ozs7Ozs7QUN0R0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNJO0FBQ0Q7QUFDWTtBQUNKO0FBQ0Y7QUFDUTtBQUNFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLE1BQU0saURBQVM7O0FBRWY7QUFDQSxRQUFRLGlEQUFTOztBQUVqQjtBQUNBLFdBQVcsaURBQVM7O0FBRXBCO0FBQ0EsU0FBUyxpREFBUzs7QUFFbEI7QUFDQSxZQUFZLGlEQUFTOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxlQUFlLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLG9CQUFvQjtBQUN0STtBQUNBLFNBQVMsb0RBQWE7O0FBRXRCO0FBQ0EsWUFBWSxpREFBUzs7QUFFckI7QUFDQSxxQkFBcUIsaURBQVM7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaURBQVM7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFTOztBQUV4QjtBQUNBLFlBQVksaURBQVM7O0FBRXJCO0FBQ0EsV0FBVyxpREFBUzs7QUFFcEI7QUFDQSxRQUFRLGlEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQyxnREFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHVCQUF1Qiw4REFBSyxDQUFDLGlEQUFRO0FBQ3RDO0FBQ0E7QUFDQSwwQkFBMEIsNkRBQUksQ0FBQyx1REFBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsZ0JBQWdCLDZEQUFJLENBQUMscURBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlLDZFQUFjLEU7Ozs7Ozs7O0FDOUc3QjtBQUFBO0FBQUE7QUFBK0I7QUFDL0IscUNBQXFDLG1EQUFtQixHQUFHO0FBQzNEO0FBQ2UsOEVBQWUsRTs7Ozs7Ozs7QUNIOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUM0QjtBQUNuQjtBQUNhO0FBQ0w7QUFDaEQsa0NBQWtDLGdEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMERBQU07QUFDeEI7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHlFQUFrQjtBQUNuQyxvQ0FBb0MsZ0ZBQWU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUksYUFBYTtBQUN2QztBQUNBO0FBQ0EsZUFBZSxpREFBVTtBQUN6QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsMkVBQVksRTs7Ozs7Ozs7QUMvQjNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDSTtBQUN3QjtBQUNVO0FBQ1o7QUFDM0I7QUFDa0I7QUFDSTtBQUNSO0FBQ1M7QUFDYTtBQUMxQjtBQUNRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLCtFQUErRTtBQUN0SjtBQUNBO0FBQ0Esa0NBQWtDLGdEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxtQkFBbUIsd0RBQVUsQ0FBQyxzREFBYTtBQUMzQyxpQkFBaUIseUVBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMsd0RBQWU7QUFDaEM7QUFDQSx1QkFBdUIsd0RBQVUsQ0FBQywwREFBaUI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyxHQUFHLDhDQUFPLDZGQUE2RixTQUFNOztBQUV4SjtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0EsNkJBQTZCLE9BQU8sR0FBRyxTQUFTLEdBQUcsVUFBVTtBQUM3RDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUFJLGdGQUFlO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGtCQUFrQiw0RUFBYSxDQUFDLDBFQUF3QjtBQUN4RCxFQUFFLGtGQUFtQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZ0VBQWdFOztBQUVoRTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw4REFBSSxhQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZUFBZSxpREFBVSxtREFBbUQsT0FBTyxxQkFBcUIsT0FBTyxHQUFHLFFBQVE7QUFDMUgsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2UsMkVBQVksRTs7Ozs7Ozs7QUNoSTNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQzRCO0FBQ0w7QUFDRDtBQUMzQjtBQUNzQjtBQUNDO0FBQ2E7QUFDbEI7QUFDaEQsb0NBQW9DLGdEQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLCtDQUFNO0FBQ3hCO0FBQ0EsQ0FBQztBQUNELGlCQUFpQix5RUFBa0I7QUFDbkMsMEJBQTBCLHdEQUFVLENBQUMsbUVBQWU7QUFDcEQsdUJBQXVCLHdEQUFVLENBQUMsMERBQWlCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLG9GQUFpQjtBQUN6QyxvQkFBb0IsNEVBQWEsa0JBQWtCLHlFQUF3Qix5QkFBeUI7QUFDcEc7O0FBRUEsc0JBQXNCLDZEQUFJO0FBQzFCLGVBQWUsaURBQVUsZ0NBQWdDLE9BQU87QUFDaEU7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSw2RUFBYyxFOzs7Ozs7OztBQ3ZDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsOENBQWMscUNBQXFDLG9EQUFvQjtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEVBQUUsOENBQWM7QUFDaEIsc0JBQXNCLG9EQUFvQjtBQUMxQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxTQUFTLDhDQUFjLDhDQUE4QyxvREFBb0I7QUFDekY7Ozs7Ozs7Ozs7QUNwQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0s7QUFDa0M7QUFDVjtBQUNGO0FBQ047QUFDSjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRywwRUFBUTtBQUNYLEdBQUcseUVBQU87QUFDVjtBQUNBLDBCQUEwQixnREFBZ0I7QUFDMUM7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLENBQUM7QUFDRCxzQkFBc0IseURBQVc7QUFDakMsSUFBSSxxRUFBb0I7QUFDeEI7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDZEQUFJLENBQUMsMERBQWlCO0FBQzVDO0FBQ0Esb0JBQW9CLDhEQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQSxtREFBbUQsa0RBQWtCLFlBQVk7QUFDakYsaUJBQWlCLGlEQUFVO0FBQzNCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZSxtRUFBSSxFOzs7Ozs7OztBQzFDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDSTtBQUNhO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsUUFBUSxpREFBUzs7QUFFakI7QUFDQSxXQUFXLGlEQUFTO0FBQ3BCLE1BQU0saURBQVM7QUFDZjtBQUNBLDhCQUE4QixnREFBZ0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx1QkFBdUIsNkRBQUksYUFBYTtBQUN6QztBQUNBLGFBQWEsaURBQVUsZUFBZSxLQUFLLEdBQUcsaUNBQWlDO0FBQy9FLENBQUM7QUFDRDtBQUNBO0FBQ2UsdUVBQVEsRTs7Ozs7Ozs7QUM3QnZCO0FBQUE7QUFBQTtBQUFBO0FBQXNEO0FBQ2Q7QUFDSTtBQUM1QyxlQUFlLG1FQUFrQjtBQUNqQztBQUNBLENBQUM7QUFDYztBQUNmLFNBQVMsb0RBQVc7QUFDcEIsV0FBVyxzREFBYTtBQUN4QixDQUFDLENBQUMsRTs7Ozs7Ozs7QUNURjtBQUFBO0FBQXNEO0FBQ3RELHNCQUFzQixtRUFBa0I7QUFDeEM7QUFDQSxDQUFDO0FBQ2MsNEVBQWEsRTs7Ozs7Ozs7QUNKNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQzhCO0FBQ2I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0EsQ0FBQyx1QkFBdUIsNkRBQUksQ0FBQyw4Q0FBSztBQUNsQztBQUNBO0FBQ0EsYUFBYSxpREFBVTtBQUN2QixDQUFDO0FBQ0Q7QUFDQSx3QkFBd0IsZ0RBQWM7QUFDdEM7QUFDZSwwRUFBVyxFOzs7Ozs7OztBQ2xCMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDSztBQUNpQjtBQUNMO0FBQ0U7QUFDbEQsbUNBQW1DLGdEQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isc0JBQXNCLDhEQUFLLENBQUMsa0RBQVM7QUFDckM7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCO0FBQ0E7QUFDQSxzQ0FBc0MsNkRBQUk7QUFDMUM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsNEVBQWEsRTs7Ozs7Ozs7QUMzQjVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0Q7QUFDSjtBQUNLO0FBQ0k7QUFDRTtBQUNOO0FBQ0E7QUFDQTtBQUNFO0FBQ0o7QUFDSjtBQUNjO0FBQ0k7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxRQUFRLGlEQUFTOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaURBQVM7QUFDdEIsTUFBTSxpREFBUztBQUNmO0FBQ0EsMEJBQTBCLGdEQUFnQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx1QkFBdUIsOERBQUksYUFBYTtBQUN6QztBQUNBLGFBQWEsaURBQVU7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDZTtBQUNmLFNBQVMsa0RBQVM7QUFDbEIsV0FBVyxvREFBVztBQUN0QixZQUFZLHFEQUFZO0FBQ3hCLFNBQVMsa0RBQVM7QUFDbEIsRUFBRSx3REFBTTtBQUNSLFNBQVMsa0RBQVM7QUFDbEIsUUFBUSxrREFBUTtBQUNoQixTQUFTLGtEQUFTO0FBQ2xCLFVBQVUsbURBQVU7QUFDcEIsRUFBRSxzRUFBYTtBQUNmLENBQUMsQ0FBQyxFOzs7Ozs7OztBQ3ZERjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ2E7QUFDVjtBQUNZO0FBQ0E7QUFDTjtBQUNhO0FBQ0Y7QUFDSDtBQUNVO0FBQ1I7QUFDbEQsK0JBQStCLGdEQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQixtQkFBbUIseUVBQWtCO0FBQ3JDO0FBQ0E7QUFDQSxHQUFHLEdBQUcsd0RBQVUsQ0FBQyxvREFBVztBQUM1QiwyQkFBMkIscURBQU87QUFDbEM7QUFDQSxHQUFHO0FBQ0gsb0VBQW9FLHVFQUFjLFdBQVcsdURBQWM7O0FBRTNHLDZCQUE2Qiw2REFBSSxDQUFDLHVEQUFjLEdBQUc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxzQkFBc0IsNkRBQUksQ0FBQyxvREFBVztBQUN0QztBQUNBLDJCQUEyQiw2REFBSTtBQUMvQjtBQUNBLGlCQUFpQixpREFBVSwrQ0FBK0MsU0FBUztBQUNuRix5Q0FBeUMsOERBQUssQ0FBQywwREFBUztBQUN4RCxtREFBbUQsNkRBQUksQ0FBQyx1REFBYztBQUN0RTtBQUNBO0FBQ0EsU0FBUyw0QkFBNEIsNkRBQUksQ0FBQyxpREFBUTtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2U7QUFDZixTQUFTLHVEQUFjO0FBQ3ZCLFNBQVMsdURBQWM7QUFDdkIsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDMUVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0k7QUFDSztBQUNhO0FBQ0w7QUFDaEQsb0NBQW9DLGdEQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLG9EQUFXO0FBQzVCLGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxhQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDZFQUFjLEU7Ozs7Ozs7O0FDN0I3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQ0s7QUFDYTtBQUNMO0FBQ2hELG9DQUFvQyxnREFBZ0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLG9EQUFXO0FBQzVCLGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxXQUFXO0FBQ3JDO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSw2RUFBYyxFOzs7Ozs7OztBQ3ZCN0I7QUFBQTtBQUFBO0FBQStCOztBQUUvQixpQ0FBaUMsbURBQW1CLEdBQUc7QUFDeEMsMEVBQVcsRTs7Ozs7Ozs7QUNIMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDSTtBQUNMO0FBQ0k7QUFDTTtBQUNhO0FBQ0w7QUFDaEQsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMsb0RBQVc7QUFDNUIsYUFBYSx5RUFBa0I7QUFDL0I7O0FBRUE7QUFDQTtBQUNBLFVBQVUsU0FBUztBQUNuQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsVUFBVSxTQUFTLEdBQUcsS0FBSztBQUMzQjtBQUNBOztBQUVBLEVBQUUsS0FBcUMsR0FBRyw4Q0FBTyxrR0FBa0csU0FBTTtBQUN6SixzQkFBc0IsNkRBQUksYUFBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSw4RkFBOEYsU0FBUztBQUNoSSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2U7QUFDZixFQUFFLDJEQUFRO0FBQ1YsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDckRGO0FBQUE7QUFBc0Q7QUFDdkMsa0lBQWtCLGlCQUFpQixFOzs7Ozs7OztBQ0RsRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDQztBQUNRO0FBQ1E7QUFDaEQsK0JBQStCLGdEQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBa0IscURBQU87QUFDekI7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDZEQUFJLENBQUMsb0RBQVc7QUFDdEM7QUFDQSwyQkFBMkIsNkRBQUksYUFBYTtBQUM1QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2Usd0VBQVMsRTs7Ozs7Ozs7QUNyQnhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0k7QUFDTDtBQUNOO0FBQ2dCO0FBQ2E7QUFDTDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnREFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVLENBQUMsb0RBQVc7QUFDNUIsYUFBYSx5RUFBa0I7QUFDL0I7QUFDQSxtREFBbUQsWUFBWSxHQUFHLFlBQVksR0FBRyxPQUFPO0FBQ3hGLGtCQUFrQixpREFBVTtBQUM1QixFQUFFLEtBQXFDLEdBQUcsOENBQU8sMEdBQTBHLFNBQU07QUFDaks7QUFDQSxrQ0FBa0MsNkRBQUksQ0FBQyw0Q0FBRztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLElBQUksNkRBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ2Usd0VBQVMsRTs7Ozs7Ozs7QUNuRHhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0k7QUFDa0I7QUFDYjtBQUNRO0FBQ2hELCtCQUErQixnREFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLG9EQUFXO0FBQzVCLGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxXQUFXO0FBQ3JDO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLHdFQUFTLEU7Ozs7Ozs7O0FDeEJ4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQ2tCO0FBQ2I7QUFDUTtBQUNoRCxnQ0FBZ0MsZ0RBQWdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLG9EQUFXO0FBQzVCLGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxZQUFZO0FBQ3RDO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLGlDQUFpQyxTQUFTLEdBQUcsS0FBSztBQUMzRTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSx5RUFBVSxFOzs7Ozs7OztBQzVCekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDaEQsOEJBQThCLGdEQUFnQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isc0JBQXNCLDZEQUFJLGFBQWE7QUFDdkM7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSx1RUFBUSxFOzs7Ozs7OztBQ25CdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ0k7QUFDa0I7QUFDTDtBQUN6QztBQUNQO0FBQ0E7QUFDQTtBQUNBLFlBQVksaURBQVM7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaURBQVM7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaURBQVM7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpREFBUzs7QUFFMUI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxpREFBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnREFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVUsd0JBQXdCLFNBQVMsa0ZBQWtGLFNBQVM7QUFDckosR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2Usb0VBQUssRTs7Ozs7Ozs7QUN4RHBCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNDO0FBQ3NCO0FBQ0Q7QUFDUDtBQUNNO0FBQ0o7QUFDaEQsdUJBQXVCLG1FQUFrQjtBQUN6QztBQUNBLENBQUM7O0FBRUQsaURBQWlELDZEQUFJO0FBQ3JELHlCQUF5Qiw2REFBSSxDQUFDLHVEQUFjO0FBQzVDO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRCw4Q0FBOEMsNkRBQUk7QUFDbEQseUJBQXlCLDZEQUFJLENBQUMsdURBQWM7QUFDNUM7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxtQkFBbUI7QUFDakM7QUFDQSxnQ0FBZ0MsZ0RBQWdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCLDBCQUEwQjtBQUN6RDs7QUFFQSx1QkFBdUIscURBQU8sVUFBVTtBQUN4QyxzQkFBc0IsNkRBQUksQ0FBQywwREFBaUI7QUFDNUM7QUFDQSwyQkFBMkIsNkRBQUk7QUFDL0I7QUFDQTtBQUNBLGlCQUFpQixpREFBVSxpQ0FBaUMsU0FBUyxHQUFHLEtBQUs7QUFDN0UsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxFOzs7Ozs7OztBQzNERjtBQUFBO0FBQUE7QUFBK0I7QUFDL0IsNkJBQTZCLG1EQUFtQjtBQUNoRDtBQUNlLHNFQUFPLEU7Ozs7Ozs7O0FDSHRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDRDtBQUNtQjtBQUNYO0FBQ2U7QUFDVDtBQUNJO0FBQ2hELCtCQUErQixnREFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILG1CQUFtQix5RUFBa0I7QUFDckM7O0FBRUE7QUFDQSwyRUFBMkUsV0FBVztBQUN0Rjs7QUFFQSxFQUFFLEtBQXFDLEdBQUcsOENBQU8sNEdBQTRHLFNBQU07QUFDbkssc0JBQXNCLDZEQUFJLENBQUMsdURBQU87QUFDbEM7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSxvQ0FBb0MsU0FBUyxHQUFHLFFBQVEsMkJBQTJCLFNBQVMsR0FBRyxrQkFBa0Isa0JBQWtCLFNBQVM7QUFDckssR0FBRztBQUNILENBQUM7QUFDRDtBQUNlO0FBQ2YsUUFBUSxzREFBYTtBQUNyQixDQUFDLENBQUMsRTs7Ozs7Ozs7QUN2Q0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ2dDO0FBQ2Q7QUFDWTtBQUNSO0FBQ0w7QUFDaEQsbUNBQW1DLGdEQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0IsK0JBQStCLHNFQUFVO0FBQ3pDLFNBQVMsa0ZBQVk7QUFDckI7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsK0VBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0Esc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSx1RkFBdUYsU0FBUyxHQUFHLFFBQVEsZ0JBQWdCLFNBQVM7QUFDN0osR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDRFQUFhLEU7Ozs7Ozs7O0FDbEQ1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDd0I7QUFDZDtBQUNRO0FBQ1k7QUFDVDtBQUNFO0FBQ0k7QUFDTjtBQUNFO0FBQ0w7QUFDdkI7QUFDZ0M7QUFDckI7QUFDaUI7QUFDakM7QUFDVTtBQUNNO0FBQ0Y7QUFDQTtBQUNBO0FBQ0Y7QUFDeUI7QUFDZjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxREFBVztBQUN2QjtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLDhEQUFJLENBQUMsOENBQUksR0FBRztBQUNsQztBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHNCQUFzQiw4REFBSSxDQUFDLDhDQUFJLEdBQUc7QUFDbEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0EsMkJBQTJCLGlEQUFnQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlDQUFpQyx1REFBUSxHQUFHO0FBQzVDLHNEQUFzRCx1REFBUTtBQUM5RCwrQkFBK0IscURBQU07QUFDckMsaUNBQWlDLHFEQUFNO0FBQ3ZDLHdDQUF3QyxxREFBTTtBQUM5QywrQkFBK0IsNkVBQWM7QUFDN0Msb0JBQW9CLDRFQUFhO0FBQ2pDLHFCQUFxQiwrRUFBZ0I7QUFDckMsZ0JBQWdCLGdFQUFRO0FBQ3hCLGFBQWEsMEVBQWtCO0FBQy9CLHVCQUF1QixzREFBTztBQUM5QjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLFdBQVcsZ0ZBQWdCO0FBQzNCO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsU0FBUyw2REFBUztBQUNsQjtBQUNBLG1EQUFtRCx5RUFBYTtBQUNoRTtBQUNBLG9FQUFvRSx5RUFBZ0I7QUFDcEYsbUVBQW1FLHlFQUFnQjtBQUNuRixLQUFLO0FBQ0w7O0FBRUEsNkJBQTZCLCtFQUFnQjtBQUM3QztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSw2RUFBYztBQUNoQixJQUFJLCtFQUFtQjtBQUN2QjtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QywwRUFBYTtBQUN6RDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdFQUFnRTs7QUFFaEUsSUFBSSw0RUFBZ0I7QUFDcEI7O0FBRUE7QUFDQSxzQ0FBc0M7O0FBRXRDLCtDQUErQzs7QUFFL0MsSUFBSSwrRUFBbUI7QUFDdkI7O0FBRUEseUJBQXlCLDBEQUFXLCtCQUErQiw4REFBSSxTQUFTO0FBQ2hGLGVBQWUsaURBQVUsSUFBSSxTQUFTO0FBQ3RDLEdBQUc7QUFDSCwwQkFBMEI7QUFDMUI7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQSxtREFBbUQsOERBQUk7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSwrQ0FBK0MsU0FBUztBQUNqRjtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsOERBQUksVUFBVTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVILHNCQUFzQiw4REFBSSxDQUFDLHNEQUFZO0FBQ3ZDO0FBQ0EsMkJBQTJCLDhEQUFJLENBQUMsMERBQVM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlO0FBQ2YsUUFBUSxtREFBUztBQUNqQixVQUFVLHFEQUFXO0FBQ3JCLFNBQVMsb0RBQVU7QUFDbkIsVUFBVSxxREFBVztBQUNyQixVQUFVLHFEQUFXO0FBQ3JCO0FBQ0E7QUFDQSxDQUFDLENBQUMsRTs7Ozs7Ozs7QUNqUkY7QUFBQTtBQUFzRDtBQUN2QyxrSUFBa0IsY0FBYyxFOzs7Ozs7OztBQ0QvQztBQUFBO0FBQUE7QUFBK0I7QUFDL0Isa0NBQWtDLG1EQUFtQjtBQUNyRDtBQUNBOztBQUVBLENBQUM7QUFDYywyRUFBWSxFOzs7Ozs7OztBQ04zQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDTDtBQUNoRCxpQ0FBaUMsZ0RBQWdCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQix5QkFBeUIsU0FBUztBQUNsQyw4REFBOEQsU0FBUyxjQUFjLFdBQVcsT0FBTyxTQUFTO0FBQ2hILHNCQUFzQiw2REFBSSxTQUFTO0FBQ25DO0FBQ0EsZUFBZSxpREFBVSxvQ0FBb0MsU0FBUyxHQUFHLEtBQUssa0JBQWtCLFlBQVksNkJBQTZCLFlBQVk7QUFDckosMkJBQTJCLDZEQUFJO0FBQy9CLGlCQUFpQixpREFBVSxJQUFJLFNBQVM7QUFDeEM7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDBFQUFXLEU7Ozs7Ozs7O0FDNUIxQjtBQUFBO0FBQXNEO0FBQ3ZDLGtJQUFrQixnQkFBZ0IsRTs7Ozs7Ozs7QUNEakQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDRztBQUNSO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isc0JBQXNCLDZEQUFJLENBQUMsNERBQW1CO0FBQzlDO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlLDBFQUFXLEU7Ozs7Ozs7O0FDdkIxQjtBQUFBO0FBQUE7QUFBc0Q7QUFDSjtBQUNsRCxzQkFBc0IsaUVBQWdCO0FBQ3ZCLGtJQUFrQjtBQUNqQztBQUNBLENBQUMsQ0FBQyxFOzs7Ozs7OztBQ0xGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ087QUFDWjtBQUNJO0FBQ2M7QUFDWDtBQUNlO0FBQ1Q7QUFDUTtBQUNwQjtBQUNBO0FBQ2dCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGdEQUFnQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILG1CQUFtQix5RUFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdEQUFVLENBQUMsc0RBQWE7QUFDaEQsNEJBQTRCLHdEQUFVLENBQUMsMERBQWlCOztBQUV4RDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxzQkFBc0IsOERBQUksQ0FBQyx1REFBTztBQUNsQztBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCLFVBQVUsZUFBZTtBQUN6QixVQUFVLG1CQUFtQixHQUFHLFFBQVE7QUFDeEMsVUFBVSxTQUFTLEdBQUcsUUFBUTtBQUM5QixVQUFVLFNBQVM7QUFDbkIsVUFBVSxTQUFTO0FBQ25CLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlO0FBQ2YsUUFBUSxnREFBTztBQUNmLFFBQVEsZ0RBQU87QUFDZixDQUFDLENBQUMsRTs7Ozs7Ozs7QUNwRUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNuQjtBQUNGO0FBQ2dCO0FBQ0U7QUFDbEQsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSx3QkFBd0IseUVBQWtCO0FBQzFDLHNCQUFzQiw4REFBSyxDQUFDLGlEQUFRO0FBQ3BDO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCLDRCQUE0Qiw2REFBSSxDQUFDLGlEQUFRO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdEQUFPO0FBQ2pCO0FBQ0EsS0FBSyxnQkFBZ0IsNkRBQUksQ0FBQyxpREFBUTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmLFFBQVEsaURBQVE7QUFDaEIsWUFBWSxpREFBUTtBQUNwQixXQUFXLGlEQUFRO0FBQ25CLFVBQVUsaURBQVE7QUFDbEIsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDbERGO0FBQUE7QUFBc0Q7QUFDdkMsa0lBQWtCLFlBQVksRTs7Ozs7Ozs7QUNEN0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ1M7QUFDUztBQUNZO0FBQ1I7QUFDTDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZ0RBQWdCO0FBQzdDO0FBQ0E7QUFDQSxrQkFBa0IsMERBQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLCtCQUErQixzRUFBVTtBQUN6QyxTQUFTLGtGQUFZO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDZEQUFJLGFBQWE7QUFDdkM7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUNoQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDYztBQUNpQjtBQUNiO0FBQ0s7QUFDZDtBQUNNO0FBQ0o7QUFDTTtBQUNLO0FBQ1Q7QUFDSTtBQUNoRCxtQkFBbUIsbUVBQWtCO0FBQ3JDO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0RBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRyxzRUFBZTtBQUNyQjtBQUNBLEdBQUc7QUFDSCxtQkFBbUIseUVBQWtCO0FBQ3JDLHlCQUF5Qix5REFBVztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLG9EQUFvRDtBQUN2RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsU0FBUztBQUNoQyxtREFBbUQsWUFBWSxHQUFHLE9BQU87QUFDekUsd0JBQXdCLHFEQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsOERBQUksQ0FBQyx1REFBYTtBQUN4QztBQUNBLDJCQUEyQiw4REFBSSxDQUFDLHFFQUFpQjtBQUNqRDtBQUNBLDZCQUE2Qiw4REFBSTtBQUNqQztBQUNBO0FBQ0EsbUJBQW1CLGlEQUFVLDJEQUEyRCxTQUFTLEdBQUcsUUFBUSxlQUFlLEdBQUcsdUJBQXVCLE9BQU8scUJBQXFCLE1BQU07QUFDdkwsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZTtBQUNmLFNBQVMsb0RBQVc7QUFDcEIsWUFBWSx1REFBYztBQUMxQixhQUFhLHdEQUFlO0FBQzVCO0FBQ0EsVUFBVSxxREFBWTtBQUN0QixDQUFDLENBQUMsRTs7Ozs7Ozs7QUNsRkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0w7QUFDaEQsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQjtBQUNBLHNCQUFzQiw2REFBSSxhQUFhO0FBQ3ZDO0FBQ0EsZUFBZSxpREFBVTtBQUN6QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsMEVBQVcsRTs7Ozs7Ozs7QUNsQjFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDSTtBQUNEO0FBQ21CO0FBQ1Q7QUFDSTtBQUNoRCxvQ0FBb0MsZ0RBQWdCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQixrQkFBa0Isd0RBQVUsQ0FBQyxzREFBYTtBQUMxQyxzQkFBc0IsNkRBQUksQ0FBQyxpREFBUTtBQUNuQztBQUNBO0FBQ0EsMkJBQTJCLDZEQUFJO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsNkVBQWMsRTs7Ozs7Ozs7QUN4QjdCO0FBQUE7QUFBQTtBQUErQjs7QUFFL0IsNkJBQTZCLG1EQUFtQjtBQUNoRDtBQUNlLHNFQUFPLEU7Ozs7Ozs7O0FDSnRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0k7QUFDQztBQUNRO0FBQ0k7QUFDaEQscUNBQXFDLGdEQUFnQjtBQUNyRCxrQkFBa0Isd0RBQVUsQ0FBQyxzREFBYTtBQUMxQyxzQkFBc0IsNkRBQUksQ0FBQyxrREFBUztBQUNwQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2UsOEVBQWUsRTs7Ozs7Ozs7QUNkOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQzRCO0FBQ1Y7QUFDVDtBQUNJO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxnREFBZ0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsd0RBQVUsQ0FBQyxzREFBYTtBQUM5QixzQkFBc0IsK0VBQWdCO0FBQ3RDO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsNkRBQUksYUFBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFVO0FBQ3pCLHVDQUF1Qyw2REFBSTtBQUMzQyxvQkFBb0IsU0FBUztBQUM3QixLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2UsMkVBQVksRTs7Ozs7Ozs7QUM5QzNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUMyQjtBQUNoQztBQUNrQztBQUN2QjtBQUNoQjtBQUNrQjtBQUNRO0FBQ1Y7QUFDRTtBQUNJO0FBQ0Y7QUFDTztBQUM2QjtBQUNsQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQiw4REFBSSxDQUFDLDBEQUFpQixHQUFHO0FBQy9DLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHNCQUFzQiw4REFBSSxDQUFDLDZDQUFJLEdBQUc7QUFDbEMsR0FBRztBQUNIOztBQUVBLCtCQUErQixnREFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCx1QkFBdUIsb0RBQU07QUFDN0IsYUFBYSwwRUFBa0I7QUFDL0I7QUFDQTtBQUNBLEdBQUcsR0FBRyx3REFBVSxDQUFDLHNEQUFhO0FBQzlCLHFCQUFxQiwrRUFBZ0I7QUFDckM7QUFDQTtBQUNBLEdBQUc7QUFDSCx1QkFBdUIscURBQU87QUFDOUI7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTRELCtEQUFxQjtBQUNqRjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBLFdBQVcsZ0ZBQWdCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qix5REFBVywrQkFBK0IsOERBQUksU0FBUztBQUNoRixlQUFlLGlEQUFVLElBQUksU0FBUztBQUN0QyxHQUFHOztBQUVILG1EQUFtRCw4REFBSTtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLHlCQUF5QixTQUFTLEdBQUcsVUFBVTtBQUN4RTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxzQkFBc0IsOERBQUksQ0FBQyxxREFBWTtBQUN2QztBQUNBLDJCQUEyQiw4REFBSSxDQUFDLHlEQUFTO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2U7QUFDZixRQUFRLHNEQUFhO0FBQ3JCLFVBQVUsd0RBQWU7QUFDekIsU0FBUyx3REFBYztBQUN2QixDQUFDLENBQUMsRTs7Ozs7Ozs7QUN4SkY7QUFBQTtBQUFzRDtBQUN2QyxrSUFBa0Isa0JBQWtCLEU7Ozs7Ozs7O0FDRG5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ0c7QUFDUjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxnREFBZ0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxDQUFDLDREQUFtQjtBQUM5QztBQUNBO0FBQ0EsZUFBZSxpREFBVTtBQUN6QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDZSw4RUFBZSxFOzs7Ozs7OztBQ3ZCOUI7QUFBQTtBQUFBO0FBQXNEO0FBQ0o7QUFDbEQsc0JBQXNCLGlFQUFnQjtBQUN2QixrSUFBa0I7QUFDakM7QUFDQSxDQUFDLENBQUMsRTs7Ozs7Ozs7QUNMRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDZ0Q7QUFDbkI7QUFDUjtBQUNDO0FBQ0w7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLDBFQUFRO0FBQ1gsR0FBRyx5RUFBTztBQUNWO0FBQ0EsdUNBQXVDLGdEQUFnQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQixzQkFBc0IsNkRBQUksQ0FBQywwREFBaUI7QUFDNUM7QUFDQSxvQkFBb0IsOERBQXFCO0FBQ3pDO0FBQ0E7QUFDQSxtREFBbUQsa0RBQWtCLFlBQVk7QUFDakYsaUJBQWlCLGlEQUFVLGtEQUFrRCwwRUFBUSxlQUFlLHlFQUFPLFFBQVEsU0FBUztBQUM1SCxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2UsZ0ZBQWlCLEU7Ozs7Ozs7O0FDcENoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDQTtBQUNLO0FBQ1U7QUFDVztBQUNQO0FBQ3hCO0FBQ3NCO0FBQ0E7QUFDaEQ7QUFDQSxjQUFjLDZDQUFJO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSCx5REFBeUQsZ0VBQWU7O0FBRXhFLGlFQUFpRSxnRUFBZTtBQUNoRjs7QUFFQSw2QkFBNkIsZ0RBQWdCO0FBQzdDO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxDQUFDO0FBQ0Qsb0JBQW9CLG9EQUFNLEdBQUc7QUFDN0IsMkJBQTJCLGlFQUFnQjtBQUMzQyxvQkFBb0IsNEVBQWE7QUFDakMsaURBQWlELDZDQUFJO0FBQ3JELHNCQUFzQiw2REFBSSxDQUFDLDJEQUFXLEdBQUc7QUFDekM7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUCwwQkFBMEIsa0RBQWtCLFdBQVc7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFVO0FBQzdCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUNuRnRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTRDO0FBQ2I7QUFDMkI7QUFDUDtBQUNyQjtBQUN1QjtBQUNJO0FBQ3pCO0FBQ2dCO0FBQ0E7QUFDVTtBQUNSOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsb0VBQVE7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHlCQUF5QixvREFBTTtBQUMvQixvQkFBb0IsNEVBQWE7QUFDakMsa0JBQWtCLHlFQUFVO0FBQzVCLHdCQUF3QixvREFBTTtBQUM5QiwwQkFBMEIsMEVBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLG9DQUFvQyw4Q0FBYzs7QUFFckQ7QUFDQSxjQUFjLGdFQUFlO0FBQzdCOztBQUVBLHFCQUFxQix5REFBVztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILHFCQUFxQix5REFBVztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILHNCQUFzQix5REFBVztBQUNqQztBQUNBO0FBQ0EsR0FBRztBQUNILHFCQUFxQix5REFBVztBQUNoQztBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQix5REFBVztBQUNqQztBQUNBO0FBQ0EsR0FBRztBQUNILDBCQUEwQix5REFBVztBQUNyQztBQUNBLEdBQUc7QUFDSCx5QkFBeUIseURBQVc7QUFDcEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSSxLQUFxQyxHQUFHLDhDQUFPLDhQQUE4UCxTQUFNO0FBQ3ZUO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOERBQUssQ0FBQywwREFBUztBQUNyQyxzRkFBc0YsMERBQVksdUNBQXVDLDZEQUFJLENBQUMsZ0RBQU8sR0FBRztBQUN4SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDZSw2RUFBYyxFOzs7Ozs7OztBQ25KN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNvQztBQUNMO0FBQ1M7QUFDUTtBQUNFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsZ0RBQWdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGtEQUFrRCwwREFBTTtBQUN4RCxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekI7QUFDQTtBQUNBLEtBQUs7QUFDTCwyQkFBMkIsOERBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLDZEQUFJO0FBQ3JFO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNlLHVFQUFRLEVBQUM7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHdCQUF3Qiw4REFBSyxZQUFZO0FBQ3pDLDhCQUE4Qiw2REFBSTtBQUNsQztBQUNBO0FBQ0EsT0FBTyxnQkFBZ0IsNkRBQUk7QUFDM0I7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVPO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUM7Ozs7Ozs7O0FDbkVQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ29CO0FBQ3pCOztBQUVoRDtBQUNBLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0EsZ0NBQWdDLGdEQUFnQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw0QkFBNEIseUVBQWtCO0FBQzlDLHNCQUFzQiw2REFBSTtBQUMxQjtBQUNBO0FBQ0EsZUFBZSxpREFBVSwwQ0FBMEMsa0JBQWtCLEdBQUcsS0FBSztBQUM3RixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2U7QUFDZixFQUFFLHNEQUFLO0FBQ1AsRUFBRSxvREFBSTtBQUNOLEVBQUUsNERBQVE7QUFDVixRQUFRLGlEQUFRO0FBQ2hCLEVBQUUsb0RBQUk7QUFDTixFQUFFLG9EQUFJO0FBQ04sQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDbkNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ2U7QUFDTTtBQUNKO0FBQ2hELGlDQUFpQyxnREFBZ0I7QUFDakQ7QUFDQTtBQUNBLENBQUM7QUFDRCwyQkFBMkIsK0RBQWM7QUFDekMsc0JBQXNCLDZEQUFJLGFBQWE7QUFDdkM7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2U7QUFDZixVQUFVLDBEQUFpQjtBQUMzQixDQUFDLENBQUMsRTs7Ozs7Ozs7QUNoQkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDRDtBQUNnQjtBQUNFO0FBQ2hELHVDQUF1QyxnREFBZ0I7QUFDdkQsMkJBQTJCLCtEQUFjO0FBQ3pDLHNCQUFzQiw2REFBSSxDQUFDLCtDQUFNLEdBQUc7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLGdGQUFpQixFOzs7Ozs7OztBQ2JoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDZ0M7QUFDbkI7QUFDSjtBQUNRO0FBQ0E7QUFDRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZ0RBQWdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDRCQUE0Qix5RUFBa0I7QUFDOUMsZ0JBQWdCLCtEQUFRO0FBQ3hCO0FBQ0Esc0JBQXNCLG9FQUFtQjtBQUN6QyxzQkFBc0IsOERBQUs7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLGlFQUFpRSxZQUFZO0FBQ3RHO0FBQ0EsNEJBQTRCLDZEQUFJO0FBQ2hDO0FBQ0E7QUFDQSxLQUFLLHVCQUF1Qiw2REFBSSxDQUFDLG9EQUFXO0FBQzVDO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmLFVBQVUsc0RBQWE7QUFDdkIsUUFBUSxvREFBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsRTs7Ozs7Ozs7QUNqREY7QUFBQTtBQUFzRDtBQUN2QyxrSUFBa0IsZ0JBQWdCLEU7Ozs7Ozs7O0FDRGpEO0FBQUE7QUFBc0Q7QUFDdkMsa0lBQWtCLGtCQUFrQixFOzs7Ozs7OztBQ0RuRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNNO0FBQ2dCO0FBQ2I7QUFDUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUUsOENBQWM7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGlDQUFpQyw2REFBSSxnQkFBZ0I7O0FBRXJEO0FBQ0E7QUFDQSx5Q0FBeUMsb0RBQW9CO0FBQzdELHFDQUFxQyxjQUFjLHVEQUF1RCxnQkFBZ0I7QUFDMUgsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSxlQUFlLFNBQVM7QUFDakQsYUFBYSxRQUFRO0FBQ3JCLFVBQVUsU0FBUztBQUNuQixVQUFVLFNBQVM7QUFDbkIsS0FBSztBQUNMO0FBQ0EsZ0JBQWdCLDZCQUE2QjtBQUM3QztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsNkRBQUk7QUFDaEQ7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUEsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0EsQ0FBQztBQUNELG1CQUFtQix5RUFBa0I7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIseUJBQXlCLDREQUFHLGlDQUFpQywwREFBWTtBQUN6RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2UsMEVBQVcsRTs7Ozs7Ozs7QUMxSTFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCLFVBQVU7QUFDbkMsWUFBWSxJQUFJO0FBQ2hCOztBQUVBLDJCQUEyQixnREFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CO0FBQ0Esc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsZUFBZSxpREFBVSwyQ0FBMkMsU0FBUyxHQUFHLFlBQVk7QUFDNUYsY0FBYyw4Q0FBYztBQUM1QixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2Usb0VBQUssRTs7Ozs7Ozs7QUNyQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hEO0FBQ0EseUJBQXlCLGdEQUFnQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDRCQUE0Qix5RUFBa0I7QUFDOUMsd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRCxzQ0FBc0MsV0FBVyxFQUFFLE1BQU0sR0FBRyxLQUFLO0FBQ2pFLEdBQUc7QUFDSCxzQkFBc0IsNkRBQUk7QUFDMUI7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLGtFQUFHLEU7Ozs7Ozs7O0FDdENsQjtBQUFBO0FBQThDO0FBQy9CLDBIQUFXLEU7Ozs7Ozs7O0FDRDFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hELDZCQUE2QixnREFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxhQUFhLHlFQUFrQjtBQUMvQiw2QkFBNkIsU0FBUyxHQUFHLFVBQVU7QUFDbkQsc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLHdDQUF3QyxnQkFBZ0IsR0FBRyxLQUFLLHNCQUFzQixRQUFRO0FBQ3ZILEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSxzRUFBTyxFOzs7Ozs7OztBQ3ZCdEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNJO0FBQ0w7QUFDVTtBQUNOO0FBQ007QUFDUTtBQUNFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsTUFBTSxpREFBUzs7QUFFZjtBQUNBLHFDQUFxQztBQUNyQztBQUNBLGVBQWUsaURBQVM7O0FBRXhCO0FBQ0EsUUFBUSxpREFBUzs7QUFFakI7QUFDQSxVQUFVLGlEQUFTOztBQUVuQjtBQUNBLFdBQVcsaURBQVM7O0FBRXBCO0FBQ0EsU0FBUyxpREFBUzs7QUFFbEI7QUFDQSxRQUFRLGlEQUFTOztBQUVqQjtBQUNBLFlBQVksaURBQVM7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGVBQWUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CO0FBQ3RJO0FBQ0EsU0FBUyxvREFBYTs7QUFFdEI7QUFDQSxZQUFZLGlEQUFTOztBQUVyQjtBQUNBLHFCQUFxQixpREFBUzs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpREFBUzs7QUFFM0I7QUFDQSxZQUFZLGlEQUFTOztBQUVyQjtBQUNBLFdBQVcsaURBQVM7O0FBRXBCO0FBQ0EsUUFBUSxpREFBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGdEQUFnQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHVCQUF1Qiw4REFBSyxDQUFDLGlEQUFRO0FBQ3RDO0FBQ0E7QUFDQSxNQUFNLG9EQUFXO0FBQ2pCLDBCQUEwQiw2REFBSSxDQUFDLCtDQUFNO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsZ0JBQWdCLDZEQUFJLENBQUMsaURBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZEQUFJO0FBQy9CO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRyxnQkFBZ0IsNkRBQUksQ0FBQyxpREFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ2UsMEVBQVcsRTs7Ozs7Ozs7QUN4STFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQytCO0FBQ3BDO0FBQ2hELDJCQUEyQixnREFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw2REFBSSxhQUFhO0FBQ3ZDO0FBQ0EsZUFBZSxpREFBVSx5QkFBeUIscUVBQXNCO0FBQ3hFO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZSxvRUFBSyxFOzs7Ozs7OztBQ3RCcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0s7QUFDWTtBQUNoRCw0QkFBNEIsZ0RBQWdCLDhCQUE4Qiw2REFBSSxDQUFDLGtEQUFTLEdBQUc7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNlO0FBQ2YsU0FBUyxrREFBUztBQUNsQixTQUFTLGtEQUFTO0FBQ2xCLENBQUMsQ0FBQyxFOzs7Ozs7OztBQ1hGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW1DO0FBQ0o7QUFDVztBQUNKO0FBQ047QUFDMEI7QUFDVjs7QUFFaEQ7QUFDQTtBQUNBLFlBQVksaURBQVMsWUFBWSxpREFBUyxTQUFTLGlEQUFTOztBQUU1RDtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlEQUFTOztBQUVsQjtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlEQUFTOztBQUVyQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaURBQVM7QUFDekI7O0FBRUE7QUFDQSwyUEFBMlA7O0FBRTNQLHNCQUFzQiw2REFBSSxDQUFDLDBEQUFTLElBQUk7QUFDeEM7O0FBRUE7QUFDZTtBQUNmLGFBQWEscURBQVk7QUFDekIsV0FBVyxtREFBVTtBQUNyQixRQUFRLGdEQUFPO0FBQ2YsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDdkNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ0s7QUFDZ0M7QUFDcEI7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLDZEQUFJLENBQUMsd0RBQUksR0FBRztBQUMvQixjQUFjLDBFQUF5QjtBQUN2QyxDQUFDOztBQUVEO0FBQ2UsMkVBQVksRTs7Ozs7Ozs7QUNiM0I7QUFBQTtBQUFzRDtBQUN2QyxrSUFBa0IsZUFBZSxFOzs7Ozs7OztBQ0RoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3lCO0FBQ007QUFDZDtBQUNHO0FBQ0U7QUFDZTtBQUNwQjtBQUNoRCw2QkFBNkIsZ0RBQWdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrRUFBYztBQUMzQyxHQUFHLElBQUksd0VBQVcsRUFBRTtBQUNwQixnQkFBZ0IsMEVBQXlCO0FBQ3pDLEdBQUc7QUFDSCxpQkFBaUIseUVBQWtCLHVCQUF1QjtBQUMxRDs7QUFFQSxzQkFBc0IsNkRBQUksQ0FBQyw4REFBVTtBQUNyQztBQUNBLDJCQUEyQiw2REFBSSxDQUFDLHFFQUFpQjtBQUNqRDtBQUNBLDZCQUE2Qiw2REFBSTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkRBQUksYUFBYTtBQUNoRDtBQUNBLHFCQUFxQixpREFBVTtBQUMvQixTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUMzRHRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNzQjtBQUNMO0FBQ2hELDJCQUEyQixnREFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsNEJBQTRCLHlFQUFrQjtBQUM5QyxrQkFBa0IsaURBQVUsNkNBQTZDLGtCQUFrQixHQUFHLFFBQVEsY0FBYyxrQkFBa0IsR0FBRyxLQUFLLGlCQUFpQixrQkFBa0IsMEJBQTBCLGtCQUFrQiw2QkFBNkIsa0JBQWtCLDBCQUEwQixrQkFBa0I7O0FBRXhULDZCQUE2Qiw2REFBSSxXQUFXO0FBQzVDO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsNkJBQTZCLGtCQUFrQjs7QUFFL0M7QUFDQSwyQkFBMkIsZ0JBQWdCLEdBQUcsV0FBVztBQUN6RDs7QUFFQSx3QkFBd0IsNkRBQUk7QUFDNUI7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7QUFDYyxvRUFBSyxFOzs7Ozs7OztBQ3ZDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNrQjtBQUNUO0FBQ2hCO0FBQ1E7QUFDQTtBQUNNO0FBQ047QUFDaUI7QUFDbUI7QUFDcEI7QUFDRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFLGdFQUFPO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOERBQUksQ0FBQyxnREFBTztBQUNsQztBQUNBO0FBQ0EsMkJBQTJCLDhEQUFJLENBQUMsZ0RBQU87QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxHQUFHLHNFQUFlO0FBQ3JCO0FBQ0EsR0FBRztBQUNILHNCQUFzQiwrREFBSyxDQUFDLHdEQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiwwRUFBeUI7QUFDekM7QUFDQTtBQUNBLDRCQUE0Qiw4REFBSSxDQUFDLDRDQUFHLEdBQUc7QUFDdkM7QUFDQTtBQUNBLGdCQUFnQiw0REFBRztBQUNuQixLQUFLLGdCQUFnQiw4REFBSSxDQUFDLG1EQUFVO0FBQ3BDLGdCQUFnQiw0REFBRztBQUNuQiw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsOERBQUksQ0FBQyxnREFBTyxHQUFHO0FBQzNDLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ2UsbUVBQUksRTs7Ozs7Ozs7QUNoR25CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNhO0FBQ0k7QUFDaEQsa0NBQWtDLG1EQUFtQjtBQUNyRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsdUJBQXVCLHFEQUFPO0FBQzlCLGVBQWU7QUFDZixLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRU87QUFDUDtBQUNBO0FBQ0EsR0FBRyxHQUFHLHdEQUFVO0FBQ2hCO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxHQUFHLEdBQUcsd0RBQVU7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTs7QUFFL0U7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILCtCQUErQixnREFBZ0IsR0FBRztBQUNsRCxHQUFHO0FBQ0g7QUFDQTtBQUNBLHdCQUF3Qiw2REFBSSxhQUFhO0FBQ3pDO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxxQ0FBcUMsd0NBQXdDO0FBQzdFO0FBQ0E7O0FBRStEO0FBQ2hELDRFQUFhLEU7Ozs7Ozs7O0FDL0Q1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNpQztBQUM1QjtBQUNlO0FBQ2Y7QUFDSTtBQUNKO0FBQ2lCO0FBQ1g7QUFDTTtBQUNoRCwyQkFBMkIsZ0RBQWdCO0FBQzNDO0FBQ0E7QUFDQSwyQkFBMkIsa0RBQVM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0Isb0JBQW9CO0FBQ25EOztBQUVBLG1CQUFtQixvREFBTTtBQUN6QixxQkFBcUIsb0RBQU07QUFDM0IsRUFBRSx1REFBUztBQUNYO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsMEJBQTBCLHlFQUFVO0FBQ3BDO0FBQ0EsdUJBQXVCLHlEQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFLHVEQUFTO0FBQ1g7QUFDQTtBQUNBLEdBQUc7QUFDSCx1QkFBdUIscURBQU87QUFDOUI7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsNkJBQTZCLDZEQUFJLFNBQVM7QUFDMUM7QUFDQSxlQUFlLGlEQUFVLGtDQUFrQyxHQUFHO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsc0JBQXNCLDZEQUFJLENBQUMscURBQVk7QUFDdkM7QUFDQSx3REFBd0QsNkRBQUk7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmLFFBQVEsa0RBQVM7QUFDakIsVUFBVSxvREFBVztBQUNyQixDQUFDLENBQUMsRTs7Ozs7Ozs7QUNwRUY7QUFBQTtBQUFzRDtBQUN2QyxrSUFBa0IsY0FBYyxFOzs7Ozs7OztBQ0QvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9DO0FBQ0w7QUFDc0I7QUFDTDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGdEQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isc0JBQXNCLDZEQUFJO0FBQzFCO0FBQ0E7QUFDQSxlQUFlLGlEQUFVLDRDQUE0QywwQkFBMEI7QUFDL0YsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDZFQUFjLEU7Ozs7Ozs7O0FDL0I3QjtBQUFBO0FBQUE7QUFBK0I7QUFDL0Isa0NBQWtDLG1EQUFtQjtBQUNyRDtBQUNBOztBQUVBLENBQUM7QUFDYywyRUFBWSxFOzs7Ozs7OztBQ04zQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUN1QztBQUM1QztBQUNzQjtBQUNoRDtBQUNBLEdBQUcsMEVBQVE7QUFDWCxHQUFHLHlFQUFPO0FBQ1Y7QUFDQSwrQkFBK0IsZ0RBQWdCLDhCQUE4Qiw2REFBSSxDQUFDLDZDQUFJLEdBQUc7QUFDekY7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNlLHdFQUFTLEU7Ozs7Ozs7O0FDYnhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0M7QUFDTDtBQUNJO0FBQzRCO0FBQ1Y7QUFDYjtBQUNFO0FBQ007QUFDRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBZ0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsYUFBYSx5RUFBa0I7QUFDL0Isa0JBQWtCLHdEQUFVLENBQUMscURBQVk7QUFDekMsc0JBQXNCLCtFQUFnQjtBQUN0QztBQUNBLEdBQUc7QUFDSCxzQkFBc0IsOERBQUs7QUFDM0I7QUFDQTtBQUNBLGVBQWUsaURBQVU7QUFDekIscURBQXFELDZEQUFJLENBQUMsb0RBQVc7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2UsMEVBQVcsRTs7Ozs7Ozs7QUN6QzFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ3NCO0FBQ3ZCO0FBQ2tCO0FBQ1U7QUFDUjs7QUFFbEQ7O0FBRUEsa0NBQWtDLGdEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLHNCQUFzQiw4REFBSyxDQUFDLDBEQUFTO0FBQ3JDLDRCQUE0Qiw2REFBSTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0JBQWdCLDZEQUFJLENBQUMsK0NBQU0sR0FBRztBQUNuQztBQUNBLGlCQUFpQixpREFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNlLDJFQUFZLEU7Ozs7Ozs7O0FDOUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDRztBQUNlO0FBQ0c7QUFDWjtBQUNBO0FBQ0U7QUFDTTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxnREFBZ0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUcsc0VBQWU7QUFDckI7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLEtBQXFDLEdBQUcsZ0RBQVMscUdBQXFHLFNBQWdCO0FBQ3hNLHNCQUFzQiw2REFBSSxDQUFDLG9EQUFXLEdBQUc7QUFDekM7QUFDQSxjQUFjLDREQUFHO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQSwwQkFBMEIsa0RBQWtCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixzRUFBYTtBQUMvQixPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDZTtBQUNmLFVBQVUscURBQVk7QUFDdEIsQ0FBQyxDQUFDLEU7Ozs7Ozs7O0FDdEVGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNMO0FBQ2dDO0FBQ2Y7QUFDQTtBQUNFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixnREFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWEseUVBQWtCO0FBQy9CLGdCQUFnQiwrREFBUTtBQUN4QjtBQUNBLHNCQUFzQixvRUFBbUI7QUFDekMsc0JBQXNCLDhEQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpREFBVSxvQ0FBb0MsWUFBWTtBQUN6RTtBQUNBLDRCQUE0Qiw2REFBSTtBQUNoQztBQUNBO0FBQ0EsS0FBSyxnQkFBZ0IsNkRBQUk7QUFDekIsb0JBQW9CLFNBQVM7QUFDN0I7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ2Usc0VBQU8sRTs7Ozs7Ozs7QUMxQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUQ7QUFDUTtBQUNGO0FBQ1Q7QUFDQTtBQUNoRDtBQUNBLHVDQUF1Qyw0Q0FBSztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBa0Isb0RBQU07QUFDeEIsb0JBQW9CLDRFQUFhOztBQUVqQztBQUNBLGNBQWMsZ0VBQWU7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxzQkFBc0IseURBQVc7QUFDakMseUJBQXlCLHlEQUFXO0FBQ3BDLHdCQUF3Qix5REFBVztBQUNuQyxxQkFBcUIseURBQVc7QUFDaEMsd0JBQXdCLHlEQUFXO0FBQ25DLHVCQUF1Qix5REFBVztBQUNsQywrQkFBK0IseURBQVc7QUFDMUM7O0FBRUEsc0JBQXNCLDZEQUFJLENBQUMseUVBQVU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBeUY7QUFDekY7QUFDQSxLQUFLLGlCQUFpQiw0Q0FBSztBQUMzQjtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNjLGdGQUFpQixFOzs7Ozs7OztBQzVEaEM7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRWUsb0ZBQXFCLEU7Ozs7Ozs7O0FDekJwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUM7QUFDNUI7QUFDUCxTQUFTLGlEQUFTLHNCQUFzQixpREFBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNRO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtELFNBQVM7QUFDM0QsNEJBQTRCLFNBQVMsRUFBRSxNQUFNLEdBQUcsUUFBUTtBQUN4RDtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1Asd0JBQXdCLFNBQVMsR0FBRyxVQUFVO0FBQzlDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDOzs7Ozs7OztBQy9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQztBQUNRO0FBQ2I7QUFDc0I7QUFDTDs7QUFFaEQsaURBQWlELG9FQUFROztBQUV6RDtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxLQUFLO0FBQ04sbUNBQW1DLGdEQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwyQkFBMkIseUVBQWtCO0FBQzdDLHdCQUF3Qiw2REFBSTtBQUM1QjtBQUNBLGlCQUFpQixpREFBVTtBQUMzQjtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDSztBQUNZO0FBQ2hDLHlGQUEwQixnREFBZ0IsMEJBQTBCLDZEQUFJLFNBQVM7QUFDakc7QUFDQSxhQUFhLGlEQUFVO0FBQ3ZCLENBQUMsRUFBRSxFOzs7Ozs7OztBQ05IO0FBQUE7QUFBQTtBQUEwQjtBQUNYO0FBQ2Y7QUFDQSx3QkFBd0IsNkNBQUk7QUFDNUI7O0FBRUE7QUFDQSxDOzs7Ozs7OztBQ1BBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDeEIsZ0NBQWdDLCtDQUFlLEdBQUc7O0FBRWxEO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EsQzs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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MEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7O0FBRUEsZ0JBQWdCO0FBQ2hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBaUU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsOEJBQThCO0FBQzlCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixxQkFBcUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0EsNERBQTREO0FBQzVELE1BQU0sZ0NBQWdDLEtBQUs7QUFDM0M7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDROQUE0TjtBQUM1TjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEUsWUFBWTtBQUN4RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkhBQTJILDZCQUE2QjtBQUN4SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTywwQ0FBMEM7OztB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksVUFBVTtBQUN0Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCx1RUFBdUU7O0FBRXZFO0FBQ0EsOERBQThEO0FBQzlEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxLQUFLO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixXQUFXLEtBQUs7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHNDQUFzQzs7QUFFdEMsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztB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QUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0EsK0VBQStFO0FBQy9FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZHQUE2RztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSCxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwR0FBMEc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0QsZ1RBQWdUO0FBQ2hUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNB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TztBQUNoQztBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlJQUFpSSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUNsTSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUssb0dBQW9HLGtDQUFrQztBQUMzSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwdkJBQTB2Qjs7QUFFMXZCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEMsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLCtDQUErQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywrQ0FBK0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOzs7QUFHQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdELDBEQUEwRDs7QUFFMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQSwwSEFBMEg7QUFDMUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7O0FBRTlDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhEQUE4RDs7QUFFOUQsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1ELHlEQUF5RDtBQUM1Ryw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyx5QkFBeUI7OztBQUdsQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOzs7QUFHVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtJQUFrSTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0lBQWtJO0FBQ2xJO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SkFBOEoseUNBQXlDO0FBQ3ZNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGtEQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZCQUE2QjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMLHVFQUF1RTs7QUFFdkUsVUFBVSw2QkFBNkI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTCx1RUFBdUU7O0FBRXZFLFVBQVUsWUFBWTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxNQUFNO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRIQUE0SDs7QUFFNUgsb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFD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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCLG9DQUFvQzs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDJDQUEyQztBQUNoRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQzs7QUFFM0MscUNBQXFDO0FBQ3JDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DOztBQUVuQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEdBQUcsb0NBQW9DOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRyx1QkFBdUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLHlLQUF5SywwQ0FBMEM7QUFDbk47QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EseUVBQXlFOztBQUV6RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0EsR0FBRzs7O0FBR0gsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0wsd0NBQXdDOztBQUV4QztBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlOQUF5TixHQUFHOztBQUU1TjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25IOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7O0FBR0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLG9DQUFvQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBLHFIQUFxSDs7QUFFckgsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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RUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7O0FBR0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsZ0hBQWdIO0FBQ2hIO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEMsS0FBSyxNQUFNLEVBS047QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxSEFBcUg7O0FBRXJIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0Esc0VBQXNFOztBQUV0RTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBLEtBQUssa0NBQWtDO0FBQ3ZDOzs7QUFHQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RTs7QUFFekU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYix5TkFBeU4scUNBQXFDLHdGQUF3RiwyQkFBMkIscUJBQXFCLFFBQVEsWUFBWTtBQUMxWixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU8sNElBQTRJO0FBQ25KO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRywrQkFBK0I7QUFDbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsK0JBQStCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87O0FBRVAsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEIsaUNBQWlDOztBQUVqQyw4QkFBOEI7O0FBRTlCLDBCQUEwQjs7QUFFMUIsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEOztBQUVyRCxrREFBa0Q7O0FBRWxELHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDOztBQUVBLDZDQUE2Qzs7QUFFN0MsNkNBQTZDOztBQUU3QztBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUEsK0NBQStDOztBQUUvQyw0R0FBNEc7O0FBRTVHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkY7O0FBRTNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtRUFBbUU7OztBQUduRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3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QTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsMkNBQTJDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx3QkFBd0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrQ0FBK0M7O0FBRS9DLHVDQUF1QztBQUN2Qzs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJELHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJFQUEyRTs7QUFFM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5RUFBeUU7QUFDekU7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0Esa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0QsT0FBTzs7QUFFdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GOztBQUVuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaU1BQWlNLGNBQWM7QUFDL007QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssRUFBRTtBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsNkVBQTZFOztBQUU3RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7O0FDcnB6QmE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxLQUFxQyxFQUFFLEVBSzFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMsdURBQWdDO0FBQzNEOzs7Ozs7Ozs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7OztBQUliLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7QUNwTGE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMscURBQStCO0FBQzFEOzs7Ozs7Ozs7QUNOQTtBQUFBO0FBQUE7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O0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsNkZBQTZGLGFBQWE7QUFDMUc7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakMsb0RBQW9EOztBQUVwRCxxQ0FBcUMsRUFBRTs7QUFFdkMsd0RBQXdEOztBQUV4RCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7OztBQUc3RCxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssNENBQTRDOztBQUVqRDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0Esd0NBQXdDOzs7QUFHeEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxvQ0FBb0M7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTCw4REFBOEQ7QUFDOUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSyxJQUFJOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0EsS0FBSztBQUNMLHFFQUFxRTs7QUFFckU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FB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TztBQUNQO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FB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QUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRix3RUFBd0U7O0FBRXhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLLGNBQWM7QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEU7O0FBRTVFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBIQUEwSDtBQUMxSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLGNBQWM7QUFDekIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLGFBQWE7QUFDekI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEhBQTBIO0FBQzFIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUVBQW1FOztBQUVuRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLEVBQUU7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFF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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUc7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELHVCQUF1QjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCwwQkFBMEI7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxhQUFhO0FBQ2hGLHFFQUFxRSxhQUFhO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7QUMxVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFD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QWUsbUJBQU8sQ0FBQyw2Q0FBVTtBQUNqQyxhQUFhLG1CQUFPLENBQUMsaUNBQVU7QUFDL0IsV0FBVyxtQkFBTyxDQUFDLCtCQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxxQ0FBYTs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7OztBQ3hEQSxlQUFlLG1CQUFPLENBQUMsNkNBQVU7QUFDakMsV0FBVyxtQkFBTyxDQUFDLCtCQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxxQ0FBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQ25RQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsZ0JBQWdC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QUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDdENBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1RUFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDckNBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDO0FBQ3dCO0FBQ2I7QUFDVTtBQUNGO0FBQzFEO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSw0REFBNEQsRUFBRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdURBQVE7QUFDM0IsU0FBUyxJQUFJO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtDQUErQyxFQUFFO0FBQy9HO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBd0Q7QUFDTjtBQUNGO0FBQ0s7QUFDQTtBQUNYO0FBQ0s7QUFDRjtBQUNBO0FBQ0Y7QUFDTztBQUNGO0FBQ0g7QUFDSTtBQUNYO0FBQ1E7QUFDVjtBQUNpQjtBQUNKO0FBQ0k7QUFDVTtBQUNMO0FBQ0o7QUFDRztBQUNWO0FBQ0U7QUFDUjtBQUNhO0FBQ0o7QUFDVDtBQUNHO0FBQ0w7QUFDRjtBQUNZO0FBQ1M7QUFDaEI7QUFDUztBQUNSO0FBQ087QUFDTztBQUNmO0FBQ0c7QUFDSDtBQUNJO0FBQ1k7QUFDakI7QUFDRztBQUNEO0FBQ0g7QUFDTDtBQUNpQjtBQUNPO0FBQ0Q7QUFDVjtBQUNEO0FBQ0k7QUFDUjtBQUNPO0FBQ0k7QUFDTDtBQUNQO0FBQ1g7O0FBRS9COzs7Ozs7Ozs7QUMvREE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MscUJBQXFCO0FBQzNELDRDQUE0Qyw0QkFBNEI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ3VCOztBQUV4Qjs7Ozs7Ozs7O0FDNUdBO0FBQVU7O0FBRVY7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF3RDtBQUN5QjtBQUM3QjtBQUNaO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1EQUFZO0FBQzFDO0FBQ0E7QUFDQSx5Q0FBeUMsc0RBQVEsMENBQTBDLG1CQUFtQjtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixRQUFRLGdCQUFnQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwwQkFBMEI7QUFDdkQ7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDJEQUFhLEtBQUssb0RBQU07QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw0RkFBMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0Esa0NBQWtDLG1EQUFZO0FBQzlDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwyREFBYSxLQUFLLG9EQUFNO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNEZBQTBCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGlDQUFpQyxFQUFFO0FBQ2hGLDBDQUEwQyx1Q0FBdUMsRUFBRTtBQUNuRiw2Q0FBNkMsd0RBQXdELEVBQUU7QUFDdkc7QUFDQTtBQUNBLDRFQUE0RSx3REFBd0QsRUFBRTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBVyxtQ0FBbUMsOEJBQThCO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSw0Q0FBNEMsRUFBRTtBQUMzSDtBQUNBO0FBQ0EsMkVBQTJFLDJDQUEyQyxFQUFFO0FBQ3hIO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsK0RBQVcsbUNBQW1DLGdCQUFnQjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixzREFBUSxrREFBa0QsVUFBVTtBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixRQUFRLGdCQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwQkFBMEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixzREFBUSwyQ0FBMkMsVUFBVTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVEsZ0JBQWdCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBCQUEwQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDMkI7O0FBRTVCOzs7Ozs7Ozs7QUN6VEE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzQkFBc0I7QUFDbkM7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUErQztBQUN4QztBQUNQO0FBQ0EsbUJBQW1CLDBEQUFZO0FBQy9CO0FBQ0EsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStDO0FBQzJCO0FBQ2pCO0FBQ3NCO0FBQ1o7QUFDcEI7QUFDL0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFFQUFhO0FBQ25DO0FBQ0EscURBQXFELHNGQUFtQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFLFdBQVcsdURBQVM7QUFDcEIsZUFBZSx5REFBVztBQUMxQixzQ0FBc0MsMkZBQXVCO0FBQzdELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsbUVBQWdCLENBQUMsK0VBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsdURBQVM7QUFDcEI7QUFDQSxlQUFlLHlEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsdURBQVM7QUFDcEI7QUFDQSxlQUFlLHlEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyRkFBdUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsK0NBQStDLEVBQUU7QUFDbkgsNkZBQTZGLDZCQUE2QixFQUFFO0FBQzVIO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQ3JLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzhCOztBQUUvQjs7Ozs7Ozs7O0FDOUZBO0FBQUE7QUFBQTtBQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FB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RDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDb0M7O0FBRXJDOzs7Ozs7Ozs7QUNsS0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDd0I7O0FBRXpCOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDRjtBQUNnQjtBQUNBO0FBQ1k7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Qjs7Ozs7Ozs7OztBQ3pmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDO0FBQ2M7QUFDcEI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxtQ0FBbUMsRUFBRTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbURBQVk7QUFDOUI7QUFDQTtBQUNBLHlDQUF5Qyx1RUFBVztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywyREFBYSxLQUFLLG9EQUFNO0FBQzlELGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLHdEQUF3RCxFQUFFO0FBQzdIO0FBQ0E7QUFDQSxxRUFBcUUsNERBQTRELEVBQUU7QUFDbkk7QUFDQTtBQUNBLHFFQUFxRSw0REFBNEQsRUFBRTtBQUNuSTtBQUNBO0FBQ0EscUVBQXFFLDBEQUEwRCxFQUFFO0FBQ2pJO0FBQ0E7QUFDQSxxRUFBcUUsMERBQTBELEVBQUU7QUFDakk7QUFDQTtBQUNBLHFFQUFxRSw4REFBOEQsRUFBRTtBQUNySTtBQUNBO0FBQ0EscUVBQXFFLGlFQUFpRSxFQUFFO0FBQ3hJO0FBQ0E7QUFDQSxDQUFDO0FBQzJCOztBQUU1Qjs7Ozs7Ozs7O0FDL01BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1JQUFtSTtBQUNuSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCx1Q0FBdUMsRUFBRTtBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNpQzs7QUFFbEM7Ozs7Ozs7OztBQzVEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4QztBQUNKO0FBQzJDO0FBQ3pDO0FBQ0U7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxtRkFBbUYsRUFBRTtBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCx5RkFBeUYsRUFBRTtBQUNuSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdHQUE0QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0IscUNBQXFDO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxrQkFBa0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVEQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsNkNBQTZDLEVBQUU7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCw2Q0FBNkMsRUFBRTtBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELDZDQUE2QyxFQUFFO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCw2Q0FBNkMsRUFBRTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSwrQ0FBK0MsRUFBRTtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsNkNBQTZDLEVBQUU7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsK0NBQStDLEVBQUU7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCwrQ0FBK0MsRUFBRTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELCtDQUErQyxFQUFFO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsK0NBQStDLEVBQUU7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHNEQUFvQjtBQUM5QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsMEdBQTBHLEVBQUU7QUFDL0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QywyREFBYSxLQUFLLG9EQUFNO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxRQUFRLHVEQUFRLHFDQUFxQyxFQUFFO0FBQ3JILFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVEQUFRO0FBQzNCLFNBQVMsSUFBSTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUVBQU8sK0JBQStCLG1DQUFtQztBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0tBQWtLO0FBQ2xLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLGlEQUFpRCxFQUFFO0FBQzlILHFFQUFxRSx5QkFBeUIsRUFBRTtBQUNoRztBQUNBLDhFQUE4RSxtRUFBbUUsRUFBRTtBQUNuSjtBQUNBO0FBQ0EseUVBQXlFLDhDQUE4QyxFQUFFO0FBQ3pIO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw2QkFBNkI7QUFDM0Q7QUFDQSxxQkFBcUIsMENBQTBDLGdCQUFnQixzQkFBc0I7QUFDckc7QUFDQSxRQUFRLDBCQUEwQiw4QkFBOEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFFBQVEsdURBQVEsNERBQTRELEVBQUU7QUFDOUgsb0RBQW9ELFFBQVEsdURBQVEsZ0VBQWdFLEVBQUU7QUFDdEk7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUN5Qjs7QUFFMUI7Ozs7Ozs7OztBQ2xrQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDNEI7O0FBRTdCOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCw0QkFBNEIsRUFBRTtBQUM3RixtRkFBbUYsNEJBQTRCLEVBQUU7QUFDakg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCOztBQUU5Qjs7Ozs7Ozs7O0FDbkRBO0FBQUE7QUFBQTtBQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHFFQUFxRSw4QkFBOEIsRUFBRTtBQUNyRztBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsa0JBQWtCLEVBQUU7QUFDbEcsaUVBQWlFLHNCQUFzQixFQUFFO0FBQ3pGO0FBQ0E7QUFDQSwyRkFBMkYsa0JBQWtCLEVBQUU7QUFDL0csa0ZBQWtGLHdEQUF3RCxFQUFFO0FBQzVJO0FBQ0E7QUFDQTtBQUNBLDhGQUE4Riw2Q0FBNkMsRUFBRTtBQUM3STtBQUNBO0FBQ0E7QUFDQSxvR0FBb0csNEVBQTRFLEVBQUU7QUFDbEw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixtREFBWTtBQUN0QyxhQUFhO0FBQ2IseUNBQXlDLG9CQUFvQixFQUFFO0FBQy9EO0FBQ0E7QUFDQSw4RUFBOEUsb0NBQW9DLEVBQUU7QUFDcEg7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJO0FBQ2Isa0pBQWtKLDRCQUE0QixFQUFFO0FBQ2hMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDd0I7O0FBRXpCOzs7Ozs7Ozs7QUN6SEE7QUFBQTtBQUFBO0FBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbURBQVk7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNnQzs7QUFFakM7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMEJBQTBCLDRDQUE0QyxFQUFFO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtREFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCOztBQUU5Qjs7Ozs7Ozs7O0FDeERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDSTtBQUNWO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsMkRBQWEsS0FBSyxvREFBTTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUM7QUFDc0M7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDMEI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDb0I7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDc0I7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDdUI7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDdUI7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDOEI7O0FBRS9COzs7Ozs7Ozs7QUNySkE7QUFBQTtBQUFBO0FBQUE7QUFBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNzQjtBQUN2QjtBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDcUI7O0FBRXRCOzs7Ozs7Ozs7QUN6REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixJQUFJO0FBQ3JCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw0Q0FBSztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDcUI7O0FBRXRCOzs7Ozs7Ozs7QUN6UEE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0EsbURBQW1ELDJEQUFhLDBDQUEwQyxvREFBTTtBQUNoSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNxQjs7QUFFdEI7Ozs7Ozs7OztBQzNOQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtEO0FBQ1I7QUFDa0I7QUFDUjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsMkRBQWEsS0FBSyxvREFBTTtBQUNwRTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ3FCOztBQUV0Qjs7Ozs7Ozs7O0FDOUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNzQjs7QUFFdkI7Ozs7Ozs7OztBQzdHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDc0I7O0FBRXZCOzs7Ozs7Ozs7QUNwZEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdURBQVM7QUFDeEIsbUJBQW1CLHlEQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDNEI7O0FBRTdCOzs7Ozs7Ozs7QUNyQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ2lDOztBQUVsQzs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUMseUNBQXlDLHdCQUF3QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHFCQUFxQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG9EQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxxQkFBcUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHFDQUFxQyxFQUFFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxrQkFBa0IsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNvQjs7QUFFckI7Ozs7Ozs7OztBQzlMQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG1EQUFZO0FBQ3RDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtB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QUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEM7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtTQUNKO1FBQ0QsQ0FBQyxFQUFFO1lBQ0MsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDbEQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNsRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQzthQUNQO1lBQ0QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7U0FDckQ7UUFDRCxFQUFFLEVBQUU7WUFDQSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUM5RDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQzthQUNQO1lBQ0QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzlEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtTQUNqRTtRQUNELEVBQUUsRUFBRTtZQUNBO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRCxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1NBQ2pGO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1NBQ0o7UUFDRCxFQUFFLEVBQUU7WUFDQTtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1NBQ0o7UUFDRCxFQUFFLEVBQUU7WUFDQTtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtn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RSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sR0FBSSxDQUN0RixFQUNYLFFBQVEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FDN0MsQ0FBQztBQUVGLElBQUksU0FBUyxHQUF3QixVQUFVLENBQUM7QUFDaEQsYUFBSyxDQUFDLFNBQVMsQ0FBQztJQUNaLElBQU0sU0FBUyxHQUFHLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtRQUN6QixTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRXRCLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRTtZQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5QztLQUNKO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoiaW5kZXguYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvY2xpZW50L3RzL2luZGV4LnRzeFwiKTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuXG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSB7XG4gICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZGlmaWVycyBmcm9tIFwiLi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gXCIuL3V0aWxzL3VuaXF1ZUJ5LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlKSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgJiYgaW5jbHVkZVNjYWxlKSB7XG4gICAgdmFyIG9mZnNldEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIHZhciBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIERvIG5vdCBhdHRlbXB0IHRvIGRpdmlkZSBieSAwLCBvdGhlcndpc2Ugd2UgZ2V0IGBJbmZpbml0eWAgYXMgc2NhbGVcbiAgICAvLyBGYWxsYmFjayB0byAxIGluIGNhc2UgYm90aCB2YWx1ZXMgYXJlIGAwYFxuXG4gICAgaWYgKG9mZnNldFdpZHRoID4gMCkge1xuICAgICAgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBvZmZzZXRXaWR0aCB8fCAxO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXRIZWlnaHQgPiAwKSB7XG4gICAgICBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBvZmZzZXRIZWlnaHQgfHwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoIC8gc2NhbGVYLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQgLyBzY2FsZVksXG4gICAgdG9wOiByZWN0LnRvcCAvIHNjYWxlWSxcbiAgICByaWdodDogcmVjdC5yaWdodCAvIHNjYWxlWCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tIC8gc2NhbGVZLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB4OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeTogcmVjdC50b3AgLyBzY2FsZVlcbiAgfTtcbn0iLCJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JyAmJiAoY2FuRXNjYXBlQ2xpcHBpbmcgPyBnZXRDb21wdXRlZFN0eWxlKGNsaXBwaW5nUGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgOiB0cnVlKTtcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiOyAvLyBSZXR1cm5zIHRoZSBsYXlvdXQgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuIExheW91dFxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuICB2YXIgaXNJRSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpICE9PSAtMTtcblxuICBpZiAoaXNJRSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gSW4gSUUgOSwgMTAgYW5kIDExIGZpeGVkIGVsZW1lbnRzIGNvbnRhaW5pbmcgYmxvY2sgaXMgYWx3YXlzIGVzdGFibGlzaGVkIGJ5IHRoZSB2aWV3cG9ydFxuICAgIHZhciBlbGVtZW50Q3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgIGlmIChlbGVtZW50Q3NzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7IC8vIE5COiBUaGlzIGlzbid0IHN1cHBvcnRlZCBvbiBpT1MgPD0gMTIuIElmIHRoZSBrZXlib2FyZCBpcyBvcGVuLCB0aGUgcG9wcGVyXG4gIC8vIGNhbiBiZSBvYnNjdXJlZCB1bmRlcm5lYXRoIGl0LlxuICAvLyBBbHNvLCBgaHRtbC5jbGllbnRIZWlnaHRgIGFkZHMgdGhlIGJvdHRvbSBiYXIgaGVpZ2h0IGluIFNhZmFyaSBpT1MsIGV2ZW5cbiAgLy8gaWYgaXQgaXNuJ3Qgb3Blbiwgc28gaWYgdGhpcyBpc24ndCBhdmFpbGFibGUsIHRoZSBwb3BwZXIgd2lsbCBiZSBkZXRlY3RlZFxuICAvLyB0byBvdmVyZmxvdyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gdG9vIGVhcmx5LlxuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0OyAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZmFpbHMgaW4gbW9iaWxlIGVtdWxhdGlvbiBtb2RlIGluIENocm9tZS5cbiAgICAvLyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZpc3VhbFZpZXdwb3J0LnNjYWxlIC0gdmlzdWFsVmlld3BvcnQud2lkdGgpIDxcbiAgICAvLyAwLjAwMVxuICAgIC8vIEZhbGxiYWNrIGhlcmU6IFwiTm90IFNhZmFyaVwiIHVzZXJBZ2VudFxuXG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLCAnZWxlbWVudC4nXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG5cbiAgdmFyIF9yZWYzID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIob2Zmc2V0cykgOiB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKG9mZnNldHMpIDogb2Zmc2V0cyxcbiAgICAgIF9yZWYzJHggPSBfcmVmMy54LFxuICAgICAgeCA9IF9yZWYzJHggPT09IHZvaWQgMCA/IDAgOiBfcmVmMyR4LFxuICAgICAgX3JlZjMkeSA9IF9yZWYzLnksXG4gICAgICB5ID0gX3JlZjMkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJHk7XG5cbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY0KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY0LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY0Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJpbXBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoc3RyKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQoYXJncykucmVkdWNlKGZ1bmN0aW9uIChwLCBjKSB7XG4gICAgcmV0dXJuIHAucmVwbGFjZSgvJXMvLCBjKTtcbiAgfSwgc3RyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVCeShhcnIsIGZuKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaWRlbnRpZmllciA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKCFpZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgIGlkZW50aWZpZXJzLmFkZChpZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59IiwiaW1wb3J0IGZvcm1hdCBmcm9tIFwiLi9mb3JtYXQuanNcIjtcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIFtdLmNvbmNhdChPYmplY3Qua2V5cyhtb2RpZmllciksIFZBTElEX1BST1BFUlRJRVMpIC8vIElFMTEtY29tcGF0aWJsZSByZXBsYWNlbWVudCBmb3IgYG5ldyBTZXQoaXRlcmFibGUpYFxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5uYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgU3RyaW5nKG1vZGlmaWVyLm5hbWUpLCAnXCJuYW1lXCInLCAnXCJzdHJpbmdcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLm5hbWUpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlbmFibGVkJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmVuYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZW5hYmxlZFwiJywgJ1wiYm9vbGVhblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZW5hYmxlZCkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICBpZiAobW9kaWZpZXJQaGFzZXMuaW5kZXhPZihtb2RpZmllci5waGFzZSkgPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJwaGFzZVwiJywgXCJlaXRoZXIgXCIgKyBtb2RpZmllclBoYXNlcy5qb2luKCcsICcpLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5waGFzZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2ZuJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJmblwiJywgJ1wiZnVuY3Rpb25cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmZuKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWZmZWN0JzpcbiAgICAgICAgICBpZiAobW9kaWZpZXIuZWZmZWN0ICE9IG51bGwgJiYgdHlwZW9mIG1vZGlmaWVyLmVmZmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZWZmZWN0XCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyZXF1aXJlcyc6XG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnJlcXVpcmVzICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0iLCJpbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbk1heENsYW1wKG1pbiwgdmFsdWUsIG1heCkge1xuICB2YXIgdiA9IHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpO1xuICByZXR1cm4gdiA+IG1heCA/IG1heCA6IHY7XG59IiwiaW1wb3J0IF9yZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBEZWZhdWx0IGNvbnRleHQgdmFsdWUgdG8gdXNlIGluIGNhc2UgdGhlcmUgaXMgbm8gU1NSUHJvdmlkZXIuIFRoaXMgaXMgZmluZSBmb3Jcbi8vIGNsaWVudC1vbmx5IGFwcHMuIEluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IEFyaWEgcG90ZW50aWFsbHlcbi8vIGJlaW5nIG9uIHRoZSBwYWdlIGF0IG9uY2UsIHRoZSBwcmVmaXggaXMgc2V0IHRvIGEgcmFuZG9tIG51bWJlci4gU1NSUHJvdmlkZXJcbi8vIHdpbGwgcmVzZXQgdGhpcyB0byB6ZXJvIGZvciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50LCBzbyBpbiB0aGVcbi8vIFNTUiBjYXNlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBBcmlhIGlzIG5vdCBzdXBwb3J0ZWQuXG5jb25zdCAkZjAxYTE4M2NjN2JkZmY3Nzg0OWU0OWFkMjZlYjkwNCR2YXIkZGVmYXVsdENvbnRleHQgPSB7XG4gIHByZWZpeDogU3RyaW5nKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDAwKSksXG4gIGN1cnJlbnQ6IDBcbn07XG5cbmNvbnN0ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRTU1JDb250ZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5jcmVhdGVDb250ZXh0KCRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCk7XG5cbi8qKlxuICogV2hlbiB1c2luZyBTU1Igd2l0aCBSZWFjdCBBcmlhLCBhcHBsaWNhdGlvbnMgbXVzdCBiZSB3cmFwcGVkIGluIGFuIFNTUlByb3ZpZGVyLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgYXV0byBnZW5lcmF0ZWQgaWRzIGFyZSBjb25zaXN0ZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU1NSUHJvdmlkZXIocHJvcHMpIHtcbiAgbGV0IGN1ciA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpO1xuICBsZXQgdmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgU1NSUHJvdmlkZXIsIHN0YXJ0IHdpdGggYW4gZW1wdHkgc3RyaW5nIHByZWZpeCwgb3RoZXJ3aXNlXG4gICAgLy8gYXBwZW5kIGFuZCBpbmNyZW1lbnQgdGhlIGNvdW50ZXIuXG4gICAgcHJlZml4OiBjdXIgPT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCA/ICcnIDogY3VyLnByZWZpeCArIFwiLVwiICsgKytjdXIuY3VycmVudCxcbiAgICBjdXJyZW50OiAwXG4gIH0pLCBbY3VyXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmNyZWF0ZUVsZW1lbnQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSwgcHJvcHMuY2hpbGRyZW4pO1xufVxubGV0ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRjYW5Vc2VET00gPSBCb29sZWFuKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG4vKiogQHByaXZhdGUgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNTUlNhZmVJZChkZWZhdWx0SWQpIHtcbiAgbGV0IGN0eCA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpOyAvLyBJZiB3ZSBhcmUgcmVuZGVyaW5nIGluIGEgbm9uLURPTSBlbnZpcm9ubWVudCwgYW5kIHRoZXJlJ3Mgbm8gU1NSUHJvdmlkZXIsXG4gIC8vIHByb3ZpZGUgYSB3YXJuaW5nIHRvIGhpbnQgdG8gdGhlIGRldmVsb3BlciB0byBhZGQgb25lLlxuXG4gIGlmIChjdHggPT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCAmJiAhJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJGNhblVzZURPTSkge1xuICAgIGNvbnNvbGUud2FybignV2hlbiBzZXJ2ZXIgcmVuZGVyaW5nLCB5b3UgbXVzdCB3cmFwIHlvdXIgYXBwbGljYXRpb24gaW4gYW4gPFNTUlByb3ZpZGVyPiB0byBlbnN1cmUgY29uc2lzdGVudCBpZHMgYXJlIGdlbmVyYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4nKTtcbiAgfVxuXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IGRlZmF1bHRJZCB8fCBcInJlYWN0LWFyaWFcIiArIGN0eC5wcmVmaXggKyBcIi1cIiArICsrY3R4LmN1cnJlbnQsIFtkZWZhdWx0SWRdKTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGJlaW5nIHNlcnZlciBzaWRlIHJlbmRlcmVkIG9yXG4gKiBoeWRyYXRlZCBvbiB0aGUgY2xpZW50LiBDYW4gYmUgdXNlZCB0byBkZWxheSBicm93c2VyLXNwZWNpZmljIHJlbmRlcmluZ1xuICogdW50aWwgYWZ0ZXIgaHlkcmF0aW9uLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VJc1NTUigpIHtcbiAgbGV0IGN1ciA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpO1xuICBsZXQgaXNJblNTUkNvbnRleHQgPSBjdXIgIT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dDtcbiAgbGV0IFtpc1NTUiwgc2V0SXNTU1JdID0gdXNlU3RhdGUoaXNJblNTUkNvbnRleHQpOyAvLyBJZiBvbiB0aGUgY2xpZW50LCBhbmQgdGhlIGNvbXBvbmVudCB3YXMgaW5pdGlhbGx5IHNlcnZlciByZW5kZXJlZCxcbiAgLy8gdGhlbiBzY2hlZHVsZSBhIGxheW91dCBlZmZlY3QgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQgYWZ0ZXIgaHlkcmF0aW9uLlxuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luU1NSQ29udGV4dCkge1xuICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IHRlY2huaWNhbGx5IGJyZWFrcyB0aGUgcnVsZXMgb2YgaG9va3MsIGJ1dCBpcyBzYWZlXG4gICAgLy8gYmVjYXVzZSB0aGUgY29uZGl0aW9uIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgbW91bnRpbmcuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIHNldElzU1NSKGZhbHNlKTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICByZXR1cm4gaXNTU1I7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUuanMubWFwXG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn07XHJcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XHJcbnZhciBfX2RlZlByb3BzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XHJcbnZhciBfX2dldE93blByb3BEZXNjcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcclxudmFyIF9fZGVmTm9ybWFsUHJvcCA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHsgcmV0dXJuIGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTsgfTtcclxudmFyIF9fc3ByZWFkVmFsdWVzID0gZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcclxuICAgICAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXHJcbiAgICAgICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcclxuICAgIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2MgPSBfX2dldE93blByb3BTeW1ib2xzKGIpOyBfaSA8IF9jLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCA9IF9jW19pXTtcclxuICAgICAgICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxyXG4gICAgICAgICAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiBhO1xyXG59O1xyXG52YXIgX19zcHJlYWRQcm9wcyA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBfX2RlZlByb3BzKGEsIF9fZ2V0T3duUHJvcERlc2NzKGIpKTsgfTtcclxudmFyIF9fYXN5bmMgPSBmdW5jdGlvbiAoX190aGlzLCBfX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIHZhciBmdWxmaWxsZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHN0ZXAgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5kb25lID8gcmVzb2x2ZSh4LnZhbHVlKSA6IFByb21pc2UucmVzb2x2ZSh4LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9O1xyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseShfX3RoaXMsIF9fYXJndW1lbnRzKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59O1xyXG4vLyBzcmMvaW5kZXgudHNcclxuaW1wb3J0IHsgZW5hYmxlRVM1IH0gZnJvbSBcImltbWVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCJyZWR1eFwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0IGFzIGRlZmF1bHQyLCBjdXJyZW50IGFzIGN1cnJlbnQyLCBmcmVlemUsIG9yaWdpbmFsLCBpc0RyYWZ0IGFzIGlzRHJhZnQ0IH0gZnJvbSBcImltbWVyXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yIGFzIGNyZWF0ZVNlbGVjdG9yMiB9IGZyb20gXCJyZXNlbGVjdFwiO1xyXG4vLyBzcmMvY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IudHNcclxuaW1wb3J0IHsgY3VycmVudCwgaXNEcmFmdCB9IGZyb20gXCJpbW1lclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJyZXNlbGVjdFwiO1xyXG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICB2YXIgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3Rvci5hcHBseSh2b2lkIDAsIGFyZ3MpO1xyXG4gICAgdmFyIHdyYXBwZWRTZWxlY3RvciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHZhciByZXN0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgcmVzdFtfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlXSwgcmVzdCkpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiB3cmFwcGVkU2VsZWN0b3I7XHJcbn07XHJcbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xyXG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgY29tcG9zZSBhcyBjb21wb3NlMiwgYXBwbHlNaWRkbGV3YXJlLCBjb21iaW5lUmVkdWNlcnMgfSBmcm9tIFwicmVkdXhcIjtcclxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXHJcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tIFwicmVkdXhcIjtcclxudmFyIGNvbXBvc2VXaXRoRGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIDogZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcclxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKVxyXG4gICAgICAgIHJldHVybiBjb21wb3NlO1xyXG4gICAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxudmFyIGRldlRvb2xzRW5oYW5jZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gOiBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5vb3ApIHtcclxuICAgICAgICByZXR1cm4gbm9vcDtcclxuICAgIH07XHJcbn07XHJcbi8vIHNyYy9pc1BsYWluT2JqZWN0LnRzXHJcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcclxuICAgIGlmIChwcm90byA9PT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIHZhciBiYXNlUHJvdG8gPSBwcm90bztcclxuICAgIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XHJcbn1cclxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXHJcbmltcG9ydCB0aHVua01pZGRsZXdhcmUgZnJvbSBcInJlZHV4LXRodW5rXCI7XHJcbi8vIHNyYy91dGlscy50c1xyXG5mdW5jdGlvbiBnZXRUaW1lTWVhc3VyZVV0aWxzKG1heERlbGF5LCBmbk5hbWUpIHtcclxuICAgIHZhciBlbGFwc2VkID0gMDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbWVhc3VyZVRpbWU6IGZ1bmN0aW9uIChmbikge1xyXG4gICAgICAgICAgICB2YXIgc3RhcnRlZCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICBlbGFwc2VkICs9IGZpbmlzaGVkIC0gc3RhcnRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2FybklmRXhjZWVkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGVsYXBzZWQgPiBtYXhEZWxheSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGZuTmFtZSArIFwiIHRvb2sgXCIgKyBlbGFwc2VkICsgXCJtcywgd2hpY2ggaXMgbW9yZSB0aGFuIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiBcIiArIG1heERlbGF5ICsgXCJtcy4gXFxuSWYgeW91ciBzdGF0ZSBvciBhY3Rpb25zIGFyZSB2ZXJ5IGxhcmdlLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgbWlkZGxld2FyZSBhcyBpdCBtaWdodCBjYXVzZSB0b28gbXVjaCBvZiBhIHNsb3dkb3duIGluIGRldmVsb3BtZW50IG1vZGUuIFNlZSBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9nZXREZWZhdWx0TWlkZGxld2FyZSBmb3IgaW5zdHJ1Y3Rpb25zLlxcbkl0IGlzIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxudmFyIE1pZGRsZXdhcmVBcnJheSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhNaWRkbGV3YXJlQXJyYXksIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBNaWRkbGV3YXJlQXJyYXkoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKSB8fCB0aGlzO1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgTWlkZGxld2FyZUFycmF5LnByb3RvdHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1pZGRsZXdhcmVBcnJheSwgU3ltYm9sLnNwZWNpZXMsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1pZGRsZXdhcmVBcnJheTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBNaWRkbGV3YXJlQXJyYXkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJyW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNvbmNhdC5hcHBseSh0aGlzLCBhcnIpO1xyXG4gICAgfTtcclxuICAgIE1pZGRsZXdhcmVBcnJheS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJyW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcnIubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJyWzBdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IChNaWRkbGV3YXJlQXJyYXkuYmluZC5hcHBseShNaWRkbGV3YXJlQXJyYXksIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyclswXS5jb25jYXQodGhpcykpKSkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyAoTWlkZGxld2FyZUFycmF5LmJpbmQuYXBwbHkoTWlkZGxld2FyZUFycmF5LCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcnIuY29uY2F0KHRoaXMpKSkpKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE1pZGRsZXdhcmVBcnJheTtcclxufShBcnJheSkpO1xyXG4vLyBzcmMvaW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXHJcbnZhciBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XHJcbnZhciBwcmVmaXggPSBcIkludmFyaWFudCBmYWlsZWRcIjtcclxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKGNvbmRpdGlvbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4KTtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihwcmVmaXggKyBcIjogXCIgKyAobWVzc2FnZSB8fCBcIlwiKSk7XHJcbn1cclxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaiwgc2VyaWFsaXplciwgaW5kZW50LCBkZWN5Y2xlcikge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZ2V0U2VyaWFsaXplKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSwgaW5kZW50KTtcclxufVxyXG5mdW5jdGlvbiBnZXRTZXJpYWxpemUoc2VyaWFsaXplciwgZGVjeWNsZXIpIHtcclxuICAgIHZhciBzdGFjayA9IFtdLCBrZXlzID0gW107XHJcbiAgICBpZiAoIWRlY3ljbGVyKVxyXG4gICAgICAgIGRlY3ljbGVyID0gZnVuY3Rpb24gKF8sIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFja1swXSA9PT0gdmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfl1cIjtcclxuICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIH4uXCIgKyBrZXlzLnNsaWNlKDAsIHN0YWNrLmluZGV4T2YodmFsdWUpKS5qb2luKFwiLlwiKSArIFwiXVwiO1xyXG4gICAgICAgIH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgdGhpc1BvcyA9IHN0YWNrLmluZGV4T2YodGhpcyk7XHJcbiAgICAgICAgICAgIH50aGlzUG9zID8gc3RhY2suc3BsaWNlKHRoaXNQb3MgKyAxKSA6IHN0YWNrLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgIH50aGlzUG9zID8ga2V5cy5zcGxpY2UodGhpc1BvcywgSW5maW5pdHksIGtleSkgOiBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVjeWNsZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXplciA9PSBudWxsID8gdmFsdWUgOiBzZXJpYWxpemVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGVmYXVsdCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKTtcclxufVxyXG5mdW5jdGlvbiB0cmFja0Zvck11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaikge1xyXG4gICAgdmFyIHRyYWNrZWRQcm9wZXJ0aWVzID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGV0ZWN0TXV0YXRpb25zOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCB0cmFja2VkUHJvcGVydGllcywgb2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaiwgcGF0aCkge1xyXG4gICAgaWYgKGlnbm9yZVBhdGhzID09PSB2b2lkIDApIHsgaWdub3JlUGF0aHMgPSBbXTsgfVxyXG4gICAgaWYgKHBhdGggPT09IHZvaWQgMCkgeyBwYXRoID0gXCJcIjsgfVxyXG4gICAgdmFyIHRyYWNrZWQgPSB7IHZhbHVlOiBvYmogfTtcclxuICAgIGlmICghaXNJbW11dGFibGUob2JqKSkge1xyXG4gICAgICAgIHRyYWNrZWQuY2hpbGRyZW4gPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgICAgICBpZiAoaWdub3JlUGF0aHMubGVuZ3RoICYmIGlnbm9yZVBhdGhzLmluZGV4T2YoY2hpbGRQYXRoKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyYWNrZWQuY2hpbGRyZW5ba2V5XSA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9ialtrZXldLCBjaGlsZFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cmFja2VkO1xyXG59XHJcbmZ1bmN0aW9uIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eSwgb2JqLCBzYW1lUGFyZW50UmVmLCBwYXRoKSB7XHJcbiAgICBpZiAoaWdub3JlUGF0aHMgPT09IHZvaWQgMCkgeyBpZ25vcmVQYXRocyA9IFtdOyB9XHJcbiAgICBpZiAoc2FtZVBhcmVudFJlZiA9PT0gdm9pZCAwKSB7IHNhbWVQYXJlbnRSZWYgPSBmYWxzZTsgfVxyXG4gICAgaWYgKHBhdGggPT09IHZvaWQgMCkgeyBwYXRoID0gXCJcIjsgfVxyXG4gICAgdmFyIHByZXZPYmogPSB0cmFja2VkUHJvcGVydHkgPyB0cmFja2VkUHJvcGVydHkudmFsdWUgOiB2b2lkIDA7XHJcbiAgICB2YXIgc2FtZVJlZiA9IHByZXZPYmogPT09IG9iajtcclxuICAgIGlmIChzYW1lUGFyZW50UmVmICYmICFzYW1lUmVmICYmICFOdW1iZXIuaXNOYU4ob2JqKSkge1xyXG4gICAgICAgIHJldHVybiB7IHdhc011dGF0ZWQ6IHRydWUsIHBhdGg6IHBhdGggfTtcclxuICAgIH1cclxuICAgIGlmIChpc0ltbXV0YWJsZShwcmV2T2JqKSB8fCBpc0ltbXV0YWJsZShvYmopKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgd2FzTXV0YXRlZDogZmFsc2UgfTtcclxuICAgIH1cclxuICAgIHZhciBrZXlzVG9EZXRlY3QgPSB7fTtcclxuICAgIGZvciAodmFyIGtleSBpbiB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW4pIHtcclxuICAgICAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yICh2YXIga2V5IGluIGtleXNUb0RldGVjdCkge1xyXG4gICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgIGlmIChpZ25vcmVQYXRocy5sZW5ndGggJiYgaWdub3JlUGF0aHMuaW5kZXhPZihjaGlsZFBhdGgpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbltrZXldLCBvYmpba2V5XSwgc2FtZVJlZiwgY2hpbGRQYXRoKTtcclxuICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB3YXNNdXRhdGVkOiBmYWxzZSB9O1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAobmV4dCkgeyByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV4dChhY3Rpb24pOyB9OyB9OyB9O1xyXG4gICAgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy5pc0ltbXV0YWJsZSwgaXNJbW11dGFibGUgPSBfYyA9PT0gdm9pZCAwID8gaXNJbW11dGFibGVEZWZhdWx0IDogX2MsIGlnbm9yZWRQYXRocyA9IG9wdGlvbnMuaWdub3JlZFBhdGhzLCBfZCA9IG9wdGlvbnMud2FybkFmdGVyLCB3YXJuQWZ0ZXIgPSBfZCA9PT0gdm9pZCAwID8gMzIgOiBfZCwgaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7XHJcbiAgICBpZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMgfHwgaWdub3JlO1xyXG4gICAgdmFyIHRyYWNrID0gdHJhY2tGb3JNdXRhdGlvbnMuYmluZChudWxsLCBpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzKTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICB2YXIgZ2V0U3RhdGUgPSBfYy5nZXRTdGF0ZTtcclxuICAgICAgICB2YXIgc3RhdGUgPSBnZXRTdGF0ZSgpO1xyXG4gICAgICAgIHZhciB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xyXG4gICAgICAgIHZhciByZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7IHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XHJcbiAgICAgICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcclxuICAgICAgICAgICAgICAgIGludmFyaWFudCghcmVzdWx0Lndhc011dGF0ZWQsIFwiQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiBkaXNwYXRjaGVzLCBpbiB0aGUgcGF0aCAnXCIgKyAocmVzdWx0LnBhdGggfHwgXCJcIikgKyBcIicuICBUaGlzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKVwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciBkaXNwYXRjaGVkQWN0aW9uID0gbmV4dChhY3Rpb24pO1xyXG4gICAgICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQud2FzTXV0YXRlZCAmJiBpbnZhcmlhbnQoIXJlc3VsdC53YXNNdXRhdGVkLCBcIkEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGluc2lkZSBhIGRpc3BhdGNoLCBpbiB0aGUgcGF0aDogXCIgKyAocmVzdWx0LnBhdGggfHwgXCJcIikgKyBcIi4gVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhlIGFjdGlvbiBcIiArIHN0cmluZ2lmeShhY3Rpb24pICsgXCIuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKVwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2hlZEFjdGlvbjtcclxuICAgICAgICB9OyB9O1xyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvc2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXHJcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XHJcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XHJcbiAgICByZXR1cm4gdHlwZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWwgPT09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XHJcbn1cclxuZnVuY3Rpb24gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHZhbHVlLCBwYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzKSB7XHJcbiAgICBpZiAocGF0aCA9PT0gdm9pZCAwKSB7IHBhdGggPSBcIlwiOyB9XHJcbiAgICBpZiAoaXNTZXJpYWxpemFibGUgPT09IHZvaWQgMCkgeyBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW47IH1cclxuICAgIGlmIChpZ25vcmVkUGF0aHMgPT09IHZvaWQgMCkgeyBpZ25vcmVkUGF0aHMgPSBbXTsgfVxyXG4gICAgdmFyIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xyXG4gICAgaWYgKCFpc1NlcmlhbGl6YWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXlQYXRoOiBwYXRoIHx8IFwiPHJvb3Q+XCIsXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdmFyIGVudHJpZXMgPSBnZXRFbnRyaWVzICE9IG51bGwgPyBnZXRFbnRyaWVzKHZhbHVlKSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcclxuICAgIHZhciBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcclxuICAgIGZvciAodmFyIF9pID0gMCwgZW50cmllc18xID0gZW50cmllczsgX2kgPCBlbnRyaWVzXzEubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgdmFyIF9jID0gZW50cmllc18xW19pXSwga2V5ID0gX2NbMF0sIG5lc3RlZFZhbHVlID0gX2NbMV07XHJcbiAgICAgICAgdmFyIG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgIGlmIChoYXNJZ25vcmVkUGF0aHMgJiYgaWdub3JlZFBhdGhzLmluZGV4T2YobmVzdGVkUGF0aCkgPj0gMCkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc1NlcmlhbGl6YWJsZShuZXN0ZWRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGtleVBhdGg6IG5lc3RlZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShuZXN0ZWRWYWx1ZSwgbmVzdGVkUGF0aCwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyk7XHJcbiAgICAgICAgICAgIGlmIChmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAobmV4dCkgeyByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV4dChhY3Rpb24pOyB9OyB9OyB9O1xyXG4gICAgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy5pc1NlcmlhbGl6YWJsZSwgaXNTZXJpYWxpemFibGUgPSBfYyA9PT0gdm9pZCAwID8gaXNQbGFpbiA6IF9jLCBnZXRFbnRyaWVzID0gb3B0aW9ucy5nZXRFbnRyaWVzLCBfZCA9IG9wdGlvbnMuaWdub3JlZEFjdGlvbnMsIGlnbm9yZWRBY3Rpb25zID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIF9lID0gb3B0aW9ucy5pZ25vcmVkQWN0aW9uUGF0aHMsIGlnbm9yZWRBY3Rpb25QYXRocyA9IF9lID09PSB2b2lkIDAgPyBbXCJtZXRhLmFyZ1wiLCBcIm1ldGEuYmFzZVF1ZXJ5TWV0YVwiXSA6IF9lLCBfZiA9IG9wdGlvbnMuaWdub3JlZFBhdGhzLCBpZ25vcmVkUGF0aHMgPSBfZiA9PT0gdm9pZCAwID8gW10gOiBfZiwgX2cgPSBvcHRpb25zLndhcm5BZnRlciwgd2FybkFmdGVyID0gX2cgPT09IHZvaWQgMCA/IDMyIDogX2csIF9oID0gb3B0aW9ucy5pZ25vcmVTdGF0ZSwgaWdub3JlU3RhdGUgPSBfaCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfaDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoc3RvcmVBUEkpIHsgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7IHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKGlnbm9yZWRBY3Rpb25zLmxlbmd0aCAmJiBpZ25vcmVkQWN0aW9ucy5pbmRleE9mKGFjdGlvbi50eXBlKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIlNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcclxuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShhY3Rpb24sIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkQWN0aW9uUGF0aHMpO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleVBhdGggPSBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlLmtleVBhdGgsIHZhbHVlID0gZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIGFuIGFjdGlvbiwgaW4gdGhlIHBhdGg6IGBcIiArIGtleVBhdGggKyBcImAuIFZhbHVlOlwiLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgbG9naWMgdGhhdCBkaXNwYXRjaGVkIHRoaXMgYWN0aW9uOiBcIiwgYWN0aW9uLCBcIlxcbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL2FjdGlvbnMjd2h5LXNob3VsZC10eXBlLWJlLWEtc3RyaW5nLW9yLWF0LWxlYXN0LXNlcmlhbGl6YWJsZS13aHktc2hvdWxkLW15LWFjdGlvbi10eXBlcy1iZS1jb25zdGFudHMpXCIsIFwiXFxuKFRvIGFsbG93IG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIHNlZTogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy91c2FnZS91c2FnZS1ndWlkZSN3b3JraW5nLXdpdGgtbm9uLXNlcmlhbGl6YWJsZS1kYXRhKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXh0KGFjdGlvbik7XHJcbiAgICAgICAgaWYgKCFpZ25vcmVTdGF0ZSkge1xyXG4gICAgICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gc3RvcmVBUEkuZ2V0U3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoc3RhdGUsIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXlQYXRoID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlLmtleVBhdGgsIHZhbHVlID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIHRoZSBzdGF0ZSwgaW4gdGhlIHBhdGg6IGBcIiArIGtleVBhdGggKyBcImAuIFZhbHVlOlwiLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGlzIGFjdGlvbiB0eXBlOiBcIiArIGFjdGlvbi50eXBlICsgXCIuXFxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvb3JnYW5pemluZy1zdGF0ZSNjYW4taS1wdXQtZnVuY3Rpb25zLXByb21pc2VzLW9yLW90aGVyLW5vbi1zZXJpYWxpemFibGUtaXRlbXMtaW4tbXktc3RvcmUtc3RhdGUpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9OyB9OyB9O1xyXG59XHJcbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xyXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImJvb2xlYW5cIjtcclxufVxyXG5mdW5jdGlvbiBjdXJyeUdldERlZmF1bHRNaWRkbGV3YXJlKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldERlZmF1bHRNaWRkbGV3YXJlKG9wdGlvbnMpO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBnZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy50aHVuaywgdGh1bmsgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMuaW1tdXRhYmxlQ2hlY2ssIGltbXV0YWJsZUNoZWNrID0gX2QgPT09IHZvaWQgMCA/IHRydWUgOiBfZCwgX2UgPSBvcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLCBzZXJpYWxpemFibGVDaGVjayA9IF9lID09PSB2b2lkIDAgPyB0cnVlIDogX2U7XHJcbiAgICB2YXIgbWlkZGxld2FyZUFycmF5ID0gbmV3IE1pZGRsZXdhcmVBcnJheSgpO1xyXG4gICAgaWYgKHRodW5rKSB7XHJcbiAgICAgICAgaWYgKGlzQm9vbGVhbih0aHVuaykpIHtcclxuICAgICAgICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2godGh1bmtNaWRkbGV3YXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHRodW5rTWlkZGxld2FyZS53aXRoRXh0cmFBcmd1bWVudCh0aHVuay5leHRyYUFyZ3VtZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIGlmIChpbW11dGFibGVDaGVjaykge1xyXG4gICAgICAgICAgICB2YXIgaW1tdXRhYmxlT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoIWlzQm9vbGVhbihpbW11dGFibGVDaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIGltbXV0YWJsZU9wdGlvbnMgPSBpbW11dGFibGVDaGVjaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoaW1tdXRhYmxlT3B0aW9ucykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VyaWFsaXphYmxlQ2hlY2spIHtcclxuICAgICAgICAgICAgdmFyIHNlcmlhbGl6YWJsZU9wdGlvbnMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKCFpc0Jvb2xlYW4oc2VyaWFsaXphYmxlQ2hlY2spKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPcHRpb25zID0gc2VyaWFsaXphYmxlQ2hlY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2goY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKHNlcmlhbGl6YWJsZU9wdGlvbnMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWlkZGxld2FyZUFycmF5O1xyXG59XHJcbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xyXG52YXIgSVNfUFJPRFVDVElPTiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcclxuZnVuY3Rpb24gY29uZmlndXJlU3RvcmUob3B0aW9ucykge1xyXG4gICAgdmFyIGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZSA9IGN1cnJ5R2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcclxuICAgIHZhciBfYyA9IG9wdGlvbnMgfHwge30sIF9kID0gX2MucmVkdWNlciwgcmVkdWNlciA9IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZCwgX2UgPSBfYy5taWRkbGV3YXJlLCBtaWRkbGV3YXJlID0gX2UgPT09IHZvaWQgMCA/IGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZSgpIDogX2UsIF9mID0gX2MuZGV2VG9vbHMsIGRldlRvb2xzID0gX2YgPT09IHZvaWQgMCA/IHRydWUgOiBfZiwgX2cgPSBfYy5wcmVsb2FkZWRTdGF0ZSwgcHJlbG9hZGVkU3RhdGUgPSBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2csIF9oID0gX2MuZW5oYW5jZXJzLCBlbmhhbmNlcnMgPSBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2g7XHJcbiAgICB2YXIgcm9vdFJlZHVjZXI7XHJcbiAgICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3QocmVkdWNlcikpIHtcclxuICAgICAgICByb290UmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJyZWR1Y2VyXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMnKTtcclxuICAgIH1cclxuICAgIHZhciBmaW5hbE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlO1xyXG4gICAgaWYgKHR5cGVvZiBmaW5hbE1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIGZpbmFsTWlkZGxld2FyZSA9IGZpbmFsTWlkZGxld2FyZShjdXJyaWVkR2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xyXG4gICAgICAgIGlmICghSVNfUFJPRFVDVElPTiAmJiAhQXJyYXkuaXNBcnJheShmaW5hbE1pZGRsZXdhcmUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIUlTX1BST0RVQ1RJT04gJiYgZmluYWxNaWRkbGV3YXJlLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCI7IH0pKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZWFjaCBtaWRkbGV3YXJlIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcclxuICAgIH1cclxuICAgIHZhciBtaWRkbGV3YXJlRW5oYW5jZXIgPSBhcHBseU1pZGRsZXdhcmUuYXBwbHkodm9pZCAwLCBmaW5hbE1pZGRsZXdhcmUpO1xyXG4gICAgdmFyIGZpbmFsQ29tcG9zZSA9IGNvbXBvc2UyO1xyXG4gICAgaWYgKGRldlRvb2xzKSB7XHJcbiAgICAgICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyhfX3NwcmVhZFZhbHVlcyh7XHJcbiAgICAgICAgICAgIHRyYWNlOiAhSVNfUFJPRFVDVElPTlxyXG4gICAgICAgIH0sIHR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29scykpO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0b3JlRW5oYW5jZXJzID0gW21pZGRsZXdhcmVFbmhhbmNlcl07XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbmhhbmNlcnMpKSB7XHJcbiAgICAgICAgc3RvcmVFbmhhbmNlcnMgPSBfX3NwcmVhZEFycmF5KFttaWRkbGV3YXJlRW5oYW5jZXJdLCBlbmhhbmNlcnMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgc3RvcmVFbmhhbmNlcnMgPSBlbmhhbmNlcnMoc3RvcmVFbmhhbmNlcnMpO1xyXG4gICAgfVxyXG4gICAgdmFyIGNvbXBvc2VkRW5oYW5jZXIgPSBmaW5hbENvbXBvc2UuYXBwbHkodm9pZCAwLCBzdG9yZUVuaGFuY2Vycyk7XHJcbiAgICByZXR1cm4gY3JlYXRlU3RvcmUocm9vdFJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBjb21wb3NlZEVuaGFuY2VyKTtcclxufVxyXG4vLyBzcmMvY3JlYXRlQWN0aW9uLnRzXHJcbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQWN0aW9uKSB7XHJcbiAgICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJlcGFyZUFjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgcHJlcGFyZWQgPSBwcmVwYXJlQWN0aW9uLmFwcGx5KHZvaWQgMCwgYXJncyk7XHJcbiAgICAgICAgICAgIGlmICghcHJlcGFyZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByZXBhcmVBY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogcHJlcGFyZWQucGF5bG9hZFxyXG4gICAgICAgICAgICB9LCBcIm1ldGFcIiBpbiBwcmVwYXJlZCAmJiB7IG1ldGE6IHByZXBhcmVkLm1ldGEgfSksIFwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7IGVycm9yOiBwcmVwYXJlZC5lcnJvciB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSwgcGF5bG9hZDogYXJnc1swXSB9O1xyXG4gICAgfVxyXG4gICAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiXCIgKyB0eXBlOyB9O1xyXG4gICAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcclxuICAgIGFjdGlvbkNyZWF0b3IubWF0Y2ggPSBmdW5jdGlvbiAoYWN0aW9uKSB7IHJldHVybiBhY3Rpb24udHlwZSA9PT0gdHlwZTsgfTtcclxuICAgIHJldHVybiBhY3Rpb25DcmVhdG9yO1xyXG59XHJcbmZ1bmN0aW9uIGlzRlNBKGFjdGlvbikge1xyXG4gICAgcmV0dXJuIGlzUGxhaW5PYmplY3QoYWN0aW9uKSAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgT2JqZWN0LmtleXMoYWN0aW9uKS5ldmVyeShpc1ZhbGlkS2V5KTtcclxufVxyXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xyXG4gICAgcmV0dXJuIFtcInR5cGVcIiwgXCJwYXlsb2FkXCIsIFwiZXJyb3JcIiwgXCJtZXRhXCJdLmluZGV4T2Yoa2V5KSA+IC0xO1xyXG59XHJcbmZ1bmN0aW9uIGdldFR5cGUoYWN0aW9uQ3JlYXRvcikge1xyXG4gICAgcmV0dXJuIFwiXCIgKyBhY3Rpb25DcmVhdG9yO1xyXG59XHJcbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXHJcbmltcG9ydCBjcmVhdGVOZXh0U3RhdGUsIHsgaXNEcmFmdCBhcyBpc0RyYWZ0MiwgaXNEcmFmdGFibGUgfSBmcm9tIFwiaW1tZXJcIjtcclxuLy8gc3JjL21hcEJ1aWxkZXJzLnRzXHJcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xyXG4gICAgdmFyIGFjdGlvbnNNYXAgPSB7fTtcclxuICAgIHZhciBhY3Rpb25NYXRjaGVycyA9IFtdO1xyXG4gICAgdmFyIGRlZmF1bHRDYXNlUmVkdWNlcjtcclxuICAgIHZhciBidWlsZGVyID0ge1xyXG4gICAgICAgIGFkZENhc2U6IGZ1bmN0aW9uICh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZE1hdGNoZXJgXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XHJcbiAgICAgICAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZENhc2UgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0aW9uc01hcFt0eXBlXSA9IHJlZHVjZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkTWF0Y2hlcjogZnVuY3Rpb24gKG1hdGNoZXIsIHJlZHVjZXIpIHtcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBidWlsZGVyLmFkZE1hdGNoZXJgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7IG1hdGNoZXI6IG1hdGNoZXIsIHJlZHVjZXI6IHJlZHVjZXIgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkRGVmYXVsdENhc2U6IGZ1bmN0aW9uIChyZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2VcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcclxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcclxuICAgIHJldHVybiBbYWN0aW9uc01hcCwgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcl07XHJcbn1cclxuLy8gc3JjL2NyZWF0ZVJlZHVjZXIudHNcclxuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBtYXBPckJ1aWxkZXJDYWxsYmFjaywgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgaWYgKGFjdGlvbk1hdGNoZXJzID09PSB2b2lkIDApIHsgYWN0aW9uTWF0Y2hlcnMgPSBbXTsgfVxyXG4gICAgdmFyIF9jID0gdHlwZW9mIG1hcE9yQnVpbGRlckNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhtYXBPckJ1aWxkZXJDYWxsYmFjaykgOiBbbWFwT3JCdWlsZGVyQ2FsbGJhY2ssIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdLCBhY3Rpb25zTWFwID0gX2NbMF0sIGZpbmFsQWN0aW9uTWF0Y2hlcnMgPSBfY1sxXSwgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXIgPSBfY1syXTtcclxuICAgIHZhciBnZXRJbml0aWFsU3RhdGU7XHJcbiAgICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcclxuICAgICAgICBnZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVOZXh0U3RhdGUoaW5pdGlhbFN0YXRlKCksIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB9KTsgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBmcm96ZW5Jbml0aWFsU3RhdGVfMSA9IGNyZWF0ZU5leHRTdGF0ZShpbml0aWFsU3RhdGUsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB9KTtcclxuICAgICAgICBnZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm96ZW5Jbml0aWFsU3RhdGVfMTsgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xyXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7IHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCk7IH1cclxuICAgICAgICB2YXIgY2FzZVJlZHVjZXJzID0gX19zcHJlYWRBcnJheShbXHJcbiAgICAgICAgICAgIGFjdGlvbnNNYXBbYWN0aW9uLnR5cGVdXHJcbiAgICAgICAgXSwgZmluYWxBY3Rpb25NYXRjaGVycy5maWx0ZXIoZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXRjaGVyID0gX2MubWF0Y2hlcjtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcclxuICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHZhciByZWR1Y2VyMiA9IF9jLnJlZHVjZXI7XHJcbiAgICAgICAgICAgIHJldHVybiByZWR1Y2VyMjtcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgaWYgKGNhc2VSZWR1Y2Vycy5maWx0ZXIoZnVuY3Rpb24gKGNyKSB7IHJldHVybiAhIWNyOyB9KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChjYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRHJhZnQyKHByZXZpb3VzU3RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyYWZ0ID0gcHJldmlvdXNTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNEcmFmdGFibGUocHJldmlvdXNTdGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FzZVJlZHVjZXIocHJldmlvdXNTdGF0ZSwgYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUocHJldmlvdXNTdGF0ZSwgZnVuY3Rpb24gKGRyYWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcclxuICAgICAgICB9LCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcclxuICAgIHJldHVybiByZWR1Y2VyO1xyXG59XHJcbi8vIHNyYy9jcmVhdGVTbGljZS50c1xyXG5mdW5jdGlvbiBnZXRUeXBlMihzbGljZSwgYWN0aW9uS2V5KSB7XHJcbiAgICByZXR1cm4gc2xpY2UgKyBcIi9cIiArIGFjdGlvbktleTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVTbGljZShvcHRpb25zKSB7XHJcbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImBuYW1lYCBpcyBhIHJlcXVpcmVkIG9wdGlvbiBmb3IgY3JlYXRlU2xpY2VcIik7XHJcbiAgICB9XHJcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gdHlwZW9mIG9wdGlvbnMuaW5pdGlhbFN0YXRlID09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW5pdGlhbFN0YXRlIDogZGVmYXVsdDIob3B0aW9ucy5pbml0aWFsU3RhdGUsIGZ1bmN0aW9uICgpIHtcclxuICAgIH0pO1xyXG4gICAgdmFyIHJlZHVjZXJzID0gb3B0aW9ucy5yZWR1Y2VycyB8fCB7fTtcclxuICAgIHZhciByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XHJcbiAgICB2YXIgc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWUgPSB7fTtcclxuICAgIHZhciBzbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSA9IHt9O1xyXG4gICAgdmFyIGFjdGlvbkNyZWF0b3JzID0ge307XHJcbiAgICByZWR1Y2VyTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocmVkdWNlck5hbWUpIHtcclxuICAgICAgICB2YXIgbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUgPSByZWR1Y2Vyc1tyZWR1Y2VyTmFtZV07XHJcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlMihuYW1lLCByZWR1Y2VyTmFtZSk7XHJcbiAgICAgICAgdmFyIGNhc2VSZWR1Y2VyO1xyXG4gICAgICAgIHZhciBwcmVwYXJlQ2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XHJcbiAgICAgICAgICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcclxuICAgICAgICAgICAgcHJlcGFyZUNhbGxiYWNrID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucHJlcGFyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lW3JlZHVjZXJOYW1lXSA9IGNhc2VSZWR1Y2VyO1xyXG4gICAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlW3R5cGVdID0gY2FzZVJlZHVjZXI7XHJcbiAgICAgICAgYWN0aW9uQ3JlYXRvcnNbcmVkdWNlck5hbWVdID0gcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSk7XHJcbiAgICB9KTtcclxuICAgIGZ1bmN0aW9uIGJ1aWxkUmVkdWNlcigpIHtcclxuICAgICAgICB2YXIgX2MgPSB0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhvcHRpb25zLmV4dHJhUmVkdWNlcnMpIDogW29wdGlvbnMuZXh0cmFSZWR1Y2Vyc10sIF9kID0gX2NbMF0sIGV4dHJhUmVkdWNlcnMgPSBfZCA9PT0gdm9pZCAwID8ge30gOiBfZCwgX2UgPSBfY1sxXSwgYWN0aW9uTWF0Y2hlcnMgPSBfZSA9PT0gdm9pZCAwID8gW10gOiBfZSwgX2YgPSBfY1syXSwgZGVmYXVsdENhc2VSZWR1Y2VyID0gX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mO1xyXG4gICAgICAgIHZhciBmaW5hbENhc2VSZWR1Y2VycyA9IF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBleHRyYVJlZHVjZXJzKSwgc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGUpO1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgZmluYWxDYXNlUmVkdWNlcnMsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXIpO1xyXG4gICAgfVxyXG4gICAgdmFyIF9yZWR1Y2VyO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHJlZHVjZXI6IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghX3JlZHVjZXIpXHJcbiAgICAgICAgICAgICAgICBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xyXG4gICAgICAgICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY3Rpb25zOiBhY3Rpb25DcmVhdG9ycyxcclxuICAgICAgICBjYXNlUmVkdWNlcnM6IHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lLFxyXG4gICAgICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIV9yZWR1Y2VyKVxyXG4gICAgICAgICAgICAgICAgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuLy8gc3JjL2VudGl0aWVzL2VudGl0eV9zdGF0ZS50c1xyXG5mdW5jdGlvbiBnZXRJbml0aWFsRW50aXR5U3RhdGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkczogW10sXHJcbiAgICAgICAgZW50aXRpZXM6IHt9XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3RvcnkoKSB7XHJcbiAgICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoYWRkaXRpb25hbFN0YXRlKSB7XHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxTdGF0ZSA9PT0gdm9pZCAwKSB7IGFkZGl0aW9uYWxTdGF0ZSA9IHt9OyB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCksIGFkZGl0aW9uYWxTdGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBnZXRJbml0aWFsU3RhdGU6IGdldEluaXRpYWxTdGF0ZSB9O1xyXG59XHJcbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9zZWxlY3RvcnMudHNcclxuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpIHtcclxuICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSkge1xyXG4gICAgICAgIHZhciBzZWxlY3RJZHMgPSBmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmlkczsgfTtcclxuICAgICAgICB2YXIgc2VsZWN0RW50aXRpZXMgPSBmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmVudGl0aWVzOyB9O1xyXG4gICAgICAgIHZhciBzZWxlY3RBbGwgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcihzZWxlY3RJZHMsIHNlbGVjdEVudGl0aWVzLCBmdW5jdGlvbiAoaWRzLCBlbnRpdGllcykgeyByZXR1cm4gaWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIGVudGl0aWVzW2lkXTsgfSk7IH0pO1xyXG4gICAgICAgIHZhciBzZWxlY3RJZCA9IGZ1bmN0aW9uIChfLCBpZCkgeyByZXR1cm4gaWQ7IH07XHJcbiAgICAgICAgdmFyIHNlbGVjdEJ5SWQgPSBmdW5jdGlvbiAoZW50aXRpZXMsIGlkKSB7IHJldHVybiBlbnRpdGllc1tpZF07IH07XHJcbiAgICAgICAgdmFyIHNlbGVjdFRvdGFsID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0SWRzLCBmdW5jdGlvbiAoaWRzKSB7IHJldHVybiBpZHMubGVuZ3RoOyB9KTtcclxuICAgICAgICBpZiAoIXNlbGVjdFN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RJZHM6IHNlbGVjdElkcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdEVudGl0aWVzOiBzZWxlY3RFbnRpdGllcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdEFsbDogc2VsZWN0QWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0VG90YWw6IHNlbGVjdFRvdGFsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0RW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZWxlY3RJZHM6IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yKHNlbGVjdFN0YXRlLCBzZWxlY3RJZHMpLFxyXG4gICAgICAgICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxyXG4gICAgICAgICAgICBzZWxlY3RBbGw6IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yKHNlbGVjdFN0YXRlLCBzZWxlY3RBbGwpLFxyXG4gICAgICAgICAgICBzZWxlY3RUb3RhbDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0U3RhdGUsIHNlbGVjdFRvdGFsKSxcclxuICAgICAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZ2V0U2VsZWN0b3JzOiBnZXRTZWxlY3RvcnMgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfYWRhcHRlci50c1xyXG5pbXBvcnQgY3JlYXRlTmV4dFN0YXRlMiwgeyBpc0RyYWZ0IGFzIGlzRHJhZnQzIH0gZnJvbSBcImltbWVyXCI7XHJcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XHJcbiAgICB2YXIgb3BlcmF0b3IgPSBjcmVhdGVTdGF0ZU9wZXJhdG9yKGZ1bmN0aW9uIChfLCBzdGF0ZSkgeyByZXR1cm4gbXV0YXRvcihzdGF0ZSk7IH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gY3JlYXRlU3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcclxuICAgICAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc0ZTQShhcmcyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJ1bk11dGF0b3IgPSBmdW5jdGlvbiAoZHJhZnQpIHtcclxuICAgICAgICAgICAgaWYgKGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZykpIHtcclxuICAgICAgICAgICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpc0RyYWZ0MyhzdGF0ZSkpIHtcclxuICAgICAgICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUyKHN0YXRlLCBydW5NdXRhdG9yKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbi8vIHNyYy9lbnRpdGllcy91dGlscy50c1xyXG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcclxuICAgIHZhciBrZXkgPSBzZWxlY3RJZChlbnRpdHkpO1xyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBrZXk7XHJcbn1cclxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xyXG4gICAgICAgIGVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhlbnRpdGllcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50aXRpZXM7XHJcbn1cclxuZnVuY3Rpb24gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSB7XHJcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgdmFyIGFkZGVkID0gW107XHJcbiAgICB2YXIgdXBkYXRlZCA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwLCBuZXdFbnRpdGllc18xID0gbmV3RW50aXRpZXM7IF9pIDwgbmV3RW50aXRpZXNfMS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICB2YXIgZW50aXR5ID0gbmV3RW50aXRpZXNfMVtfaV07XHJcbiAgICAgICAgdmFyIGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuICAgICAgICBpZiAoaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgICAgICAgdXBkYXRlZC5wdXNoKHsgaWQ6IGlkLCBjaGFuZ2VzOiBlbnRpdHkgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGVudGl0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZF07XHJcbn1cclxuLy8gc3JjL2VudGl0aWVzL3Vuc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpIHtcclxuICAgIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xyXG4gICAgICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xyXG4gICAgICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcclxuICAgICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RW50aXRpZXNfMiA9IG5ld0VudGl0aWVzOyBfaSA8IG5ld0VudGl0aWVzXzIubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXdFbnRpdGllc18yW19pXTtcclxuICAgICAgICAgICAgYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcclxuICAgICAgICB2YXIga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuICAgICAgICBpZiAoIShrZXkgaW4gc3RhdGUuZW50aXRpZXMpKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcclxuICAgICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RW50aXRpZXNfMyA9IG5ld0VudGl0aWVzOyBfaSA8IG5ld0VudGl0aWVzXzMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXdFbnRpdGllc18zW19pXTtcclxuICAgICAgICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xyXG4gICAgICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XHJcbiAgICAgICAgc3RhdGUuaWRzID0gW107XHJcbiAgICAgICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlT25lTXV0YWJseShrZXksIHN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtrZXldLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBkaWRNdXRhdGUgPSBmYWxzZTtcclxuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGRpZE11dGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZGlkTXV0YXRlKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcyA9IHN0YXRlLmlkcy5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpZCBpbiBzdGF0ZS5lbnRpdGllczsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTXV0YWJseShzdGF0ZSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHtcclxuICAgICAgICAgICAgaWRzOiBbXSxcclxuICAgICAgICAgICAgZW50aXRpZXM6IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB0YWtlTmV3S2V5KGtleXMsIHVwZGF0ZSwgc3RhdGUpIHtcclxuICAgICAgICB2YXIgb3JpZ2luYWwyID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcclxuICAgICAgICB2YXIgdXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsMiwgdXBkYXRlLmNoYW5nZXMpO1xyXG4gICAgICAgIHZhciBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcclxuICAgICAgICB2YXIgaGFzTmV3S2V5ID0gbmV3S2V5ICE9PSB1cGRhdGUuaWQ7XHJcbiAgICAgICAgaWYgKGhhc05ld0tleSkge1xyXG4gICAgICAgICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGF0ZS5lbnRpdGllc1tuZXdLZXldID0gdXBkYXRlZDtcclxuICAgICAgICByZXR1cm4gaGFzTmV3S2V5O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBuZXdLZXlzID0ge307XHJcbiAgICAgICAgdmFyIHVwZGF0ZXNQZXJFbnRpdHkgPSB7fTtcclxuICAgICAgICB1cGRhdGVzLmZvckVhY2goZnVuY3Rpb24gKHVwZGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHVwZGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdID8gdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdLmNoYW5nZXMgOiBudWxsKSwgdXBkYXRlLmNoYW5nZXMpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdXBkYXRlcyA9IE9iamVjdC52YWx1ZXModXBkYXRlc1BlckVudGl0eSk7XHJcbiAgICAgICAgdmFyIGRpZE11dGF0ZUVudGl0aWVzID0gdXBkYXRlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIGlmIChkaWRNdXRhdGVFbnRpdGllcykge1xyXG4gICAgICAgICAgICB2YXIgZGlkTXV0YXRlSWRzID0gdXBkYXRlcy5maWx0ZXIoZnVuY3Rpb24gKHVwZGF0ZSkgeyByZXR1cm4gdGFrZU5ld0tleShuZXdLZXlzLCB1cGRhdGUsIHN0YXRlKTsgfSkubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUuaWRzID0gc3RhdGUuaWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIG5ld0tleXNbaWRdIHx8IGlkOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIF9jID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSwgYWRkZWQgPSBfY1swXSwgdXBkYXRlZCA9IF9jWzFdO1xyXG4gICAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZW1vdmVBbGw6IGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihyZW1vdmVBbGxNdXRhYmx5KSxcclxuICAgICAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXHJcbiAgICAgICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXHJcbiAgICAgICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxyXG4gICAgICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcclxuICAgICAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXHJcbiAgICAgICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXHJcbiAgICAgICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxyXG4gICAgICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHJlbW92ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVPbmVNdXRhYmx5KSxcclxuICAgICAgICByZW1vdmVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU1hbnlNdXRhYmx5KVxyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0KSB7XHJcbiAgICB2YXIgX2MgPSBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCksIHJlbW92ZU9uZSA9IF9jLnJlbW92ZU9uZSwgcmVtb3ZlTWFueSA9IF9jLnJlbW92ZU1hbnksIHJlbW92ZUFsbCA9IF9jLnJlbW92ZUFsbDtcclxuICAgIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBhZGRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcclxuICAgICAgICB2YXIgbW9kZWxzID0gbmV3RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChtb2RlbCkgeyByZXR1cm4gIShzZWxlY3RJZFZhbHVlKG1vZGVsLCBzZWxlY3RJZCkgaW4gc3RhdGUuZW50aXRpZXMpOyB9KTtcclxuICAgICAgICBpZiAobW9kZWxzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICBtZXJnZShtb2RlbHMsIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gc2V0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xyXG4gICAgICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XHJcbiAgICAgICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICBtZXJnZShuZXdFbnRpdGllcywgc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcclxuICAgICAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xyXG4gICAgICAgIHN0YXRlLmlkcyA9IFtdO1xyXG4gICAgICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRha2VVcGRhdGVkTW9kZWwobW9kZWxzLCB1cGRhdGUsIHN0YXRlKSB7XHJcbiAgICAgICAgaWYgKCEodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvcmlnaW5hbDIgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIHZhciB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWwyLCB1cGRhdGUuY2hhbmdlcyk7XHJcbiAgICAgICAgdmFyIG5ld0tleSA9IHNlbGVjdElkVmFsdWUodXBkYXRlZCwgc2VsZWN0SWQpO1xyXG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIG1vZGVscy5wdXNoKHVwZGF0ZWQpO1xyXG4gICAgICAgIHJldHVybiBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIG1vZGVscyA9IFtdO1xyXG4gICAgICAgIHVwZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAodXBkYXRlKSB7IHJldHVybiB0YWtlVXBkYXRlZE1vZGVsKG1vZGVscywgdXBkYXRlLCBzdGF0ZSk7IH0pO1xyXG4gICAgICAgIGlmIChtb2RlbHMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgIG1lcmdlKG1vZGVscywgc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIF9jID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSwgYWRkZWQgPSBfY1swXSwgdXBkYXRlZCA9IF9jWzFdO1xyXG4gICAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoYSwgYikge1xyXG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoICYmIGkgPCBiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhW2ldID09PSBiW2ldKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbWVyZ2UobW9kZWxzLCBzdGF0ZSkge1xyXG4gICAgICAgIG1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xyXG4gICAgICAgICAgICBzdGF0ZS5lbnRpdGllc1tzZWxlY3RJZChtb2RlbCldID0gbW9kZWw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIGFsbEVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5lbnRpdGllcyk7XHJcbiAgICAgICAgYWxsRW50aXRpZXMuc29ydChzb3J0KTtcclxuICAgICAgICB2YXIgbmV3U29ydGVkSWRzID0gYWxsRW50aXRpZXMubWFwKHNlbGVjdElkKTtcclxuICAgICAgICB2YXIgaWRzID0gc3RhdGUuaWRzO1xyXG4gICAgICAgIGlmICghYXJlQXJyYXlzRXF1YWwoaWRzLCBuZXdTb3J0ZWRJZHMpKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcyA9IG5ld1NvcnRlZElkcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlbW92ZU9uZTogcmVtb3ZlT25lLFxyXG4gICAgICAgIHJlbW92ZU1hbnk6IHJlbW92ZU1hbnksXHJcbiAgICAgICAgcmVtb3ZlQWxsOiByZW1vdmVBbGwsXHJcbiAgICAgICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxyXG4gICAgICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcclxuICAgICAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXHJcbiAgICAgICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxyXG4gICAgICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcclxuICAgICAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcclxuICAgICAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcclxuICAgICAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KVxyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvY3JlYXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgdmFyIF9jID0gX19zcHJlYWRWYWx1ZXMoe1xyXG4gICAgICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0SWQ6IGZ1bmN0aW9uIChpbnN0YW5jZSkgeyByZXR1cm4gaW5zdGFuY2UuaWQ7IH1cclxuICAgIH0sIG9wdGlvbnMpLCBzZWxlY3RJZCA9IF9jLnNlbGVjdElkLCBzb3J0Q29tcGFyZXIgPSBfYy5zb3J0Q29tcGFyZXI7XHJcbiAgICB2YXIgc3RhdGVGYWN0b3J5ID0gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeSgpO1xyXG4gICAgdmFyIHNlbGVjdG9yc0ZhY3RvcnkgPSBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCk7XHJcbiAgICB2YXIgc3RhdGVBZGFwdGVyID0gc29ydENvbXBhcmVyID8gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0Q29tcGFyZXIpIDogY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xyXG4gICAgcmV0dXJuIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHtcclxuICAgICAgICBzZWxlY3RJZDogc2VsZWN0SWQsXHJcbiAgICAgICAgc29ydENvbXBhcmVyOiBzb3J0Q29tcGFyZXJcclxuICAgIH0sIHN0YXRlRmFjdG9yeSksIHNlbGVjdG9yc0ZhY3RvcnkpLCBzdGF0ZUFkYXB0ZXIpO1xyXG59XHJcbi8vIHNyYy9uYW5vaWQudHNcclxudmFyIHVybEFscGhhYmV0ID0gXCJNb2R1bGVTeW1iaGFzT3duUHItMDEyMzQ1Njc4OUFCQ0RFRkdITlJWZmdjdGlVdnpfS3FZVEprTHhwWlhJalFXXCI7XHJcbnZhciBuYW5vaWQgPSBmdW5jdGlvbiAoc2l6ZSkge1xyXG4gICAgaWYgKHNpemUgPT09IHZvaWQgMCkgeyBzaXplID0gMjE7IH1cclxuICAgIHZhciBpZCA9IFwiXCI7XHJcbiAgICB2YXIgaSA9IHNpemU7XHJcbiAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgICAgaWQgKz0gdXJsQWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIDY0IHwgMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWQ7XHJcbn07XHJcbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXHJcbnZhciBjb21tb25Qcm9wZXJ0aWVzID0gW1xyXG4gICAgXCJuYW1lXCIsXHJcbiAgICBcIm1lc3NhZ2VcIixcclxuICAgIFwic3RhY2tcIixcclxuICAgIFwiY29kZVwiXHJcbl07XHJcbnZhciBSZWplY3RXaXRoVmFsdWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZWplY3RXaXRoVmFsdWUocGF5bG9hZCwgbWV0YSkge1xyXG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZWplY3RXaXRoVmFsdWU7XHJcbn0oKSk7XHJcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBGdWxmaWxsV2l0aE1ldGEocGF5bG9hZCwgbWV0YSkge1xyXG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBGdWxmaWxsV2l0aE1ldGE7XHJcbn0oKSk7XHJcbnZhciBtaW5pU2VyaWFsaXplRXJyb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICB2YXIgc2ltcGxlRXJyb3IgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGNvbW1vblByb3BlcnRpZXNfMSA9IGNvbW1vblByb3BlcnRpZXM7IF9pIDwgY29tbW9uUHJvcGVydGllc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb21tb25Qcm9wZXJ0aWVzXzFbX2ldO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlW3Byb3BlcnR5XSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaW1wbGVFcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiB7IG1lc3NhZ2U6IFN0cmluZyh2YWx1ZSkgfTtcclxufTtcclxuZnVuY3Rpb24gY3JlYXRlQXN5bmNUaHVuayh0eXBlUHJlZml4LCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucykge1xyXG4gICAgdmFyIGZ1bGZpbGxlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvZnVsZmlsbGVkXCIsIGZ1bmN0aW9uIChwYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgbWV0YSkgeyByZXR1cm4gKHtcclxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9KTsgfSk7XHJcbiAgICB2YXIgcGVuZGluZyA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcGVuZGluZ1wiLCBmdW5jdGlvbiAocmVxdWVzdElkLCBhcmcsIG1ldGEpIHsgcmV0dXJuICh7XHJcbiAgICAgICAgcGF5bG9hZDogdm9pZCAwLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJwZW5kaW5nXCJcclxuICAgICAgICB9KVxyXG4gICAgfSk7IH0pO1xyXG4gICAgdmFyIHJlamVjdGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9yZWplY3RlZFwiLCBmdW5jdGlvbiAoZXJyb3IsIHJlcXVlc3RJZCwgYXJnLCBwYXlsb2FkLCBtZXRhKSB7IHJldHVybiAoe1xyXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXHJcbiAgICAgICAgZXJyb3I6IChvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplRXJyb3IgfHwgbWluaVNlcmlhbGl6ZUVycm9yKShlcnJvciB8fCBcIlJlamVjdGVkXCIpLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWU6ICEhcGF5bG9hZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJyZWplY3RlZFwiLFxyXG4gICAgICAgICAgICBhYm9ydGVkOiAoZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yLm5hbWUpID09PSBcIkFib3J0RXJyb3JcIixcclxuICAgICAgICAgICAgY29uZGl0aW9uOiAoZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yLm5hbWUpID09PSBcIkNvbmRpdGlvbkVycm9yXCJcclxuICAgICAgICB9KVxyXG4gICAgfSk7IH0pO1xyXG4gICAgdmFyIGRpc3BsYXllZFdhcm5pbmcgPSBmYWxzZTtcclxuICAgIHZhciBBQyA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09IFwidW5kZWZpbmVkXCIgPyBBYm9ydENvbnRyb2xsZXIgOiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gY2xhc3NfMSgpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWduYWwgPSB7XHJcbiAgICAgICAgICAgICAgICBhYm9ydGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uYWJvcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRpc3BsYXllZFdhcm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRXYXJuaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJUaGlzIHBsYXRmb3JtIGRvZXMgbm90IGltcGxlbWVudCBBYm9ydENvbnRyb2xsZXIuIFxcbklmIHlvdSB3YW50IHRvIHVzZSB0aGUgQWJvcnRDb250cm9sbGVyIHRvIHJlYWN0IHRvIGBhYm9ydGAgZXZlbnRzLCBwbGVhc2UgY29uc2lkZXIgaW1wb3J0aW5nIGEgcG9seWZpbGwgbGlrZSAnYWJvcnRjb250cm9sbGVyLXBvbHlmaWxsL2Rpc3QvYWJvcnRjb250cm9sbGVyLXBvbHlmaWxsLW9ubHknLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzXzE7XHJcbiAgICB9KCkpO1xyXG4gICAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvcihhcmcpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmEpIHtcclxuICAgICAgICAgICAgdmFyIHJlcXVlc3RJZCA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmlkR2VuZXJhdG9yKSA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xyXG4gICAgICAgICAgICB2YXIgYWJvcnRDb250cm9sbGVyID0gbmV3IEFDKCk7XHJcbiAgICAgICAgICAgIHZhciBhYm9ydFJlYXNvbjtcclxuICAgICAgICAgICAgdmFyIGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKF8sIHJlamVjdCkgeyByZXR1cm4gYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVqZWN0KHsgbmFtZTogXCJBYm9ydEVycm9yXCIsIG1lc3NhZ2U6IGFib3J0UmVhc29uIHx8IFwiQWJvcnRlZFwiIH0pOyB9KTsgfSk7XHJcbiAgICAgICAgICAgIHZhciBzdGFydGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhYm9ydFJlYXNvbiA9IHJlYXNvbjtcclxuICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBmaW5hbEFjdGlvbiwgY29uZGl0aW9uUmVzdWx0LCBlcnJfMSwgc2tpcERpc3BhdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMCwgNCwgLCA1XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jb25kaXRpb24pID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIGFyZywgeyBnZXRTdGF0ZTogZ2V0U3RhdGUsIGV4dHJhOiBleHRyYSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY29uZGl0aW9uUmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBfYy5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQWJvcnRlZCBkdWUgdG8gY29uZGl0aW9uIGNhbGxiYWNrIHJldHVybmluZyBmYWxzZS5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChwZW5kaW5nKHJlcXVlc3RJZCwgYXJnLCAoX2IgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdldFBlbmRpbmdNZXRhKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zLCB7IHJlcXVlc3RJZDogcmVxdWVzdElkLCBhcmc6IGFyZyB9LCB7IGdldFN0YXRlOiBnZXRTdGF0ZSwgZXh0cmE6IGV4dHJhIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWRQcm9taXNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGV4dHJhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXaXRoVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgbWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlamVjdFdpdGhWYWx1ZSh2YWx1ZSwgbWV0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxmaWxsV2l0aE1ldGEodmFsdWUsIG1ldGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bGZpbGxXaXRoTWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdC5wYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgcmVzdWx0Lm1ldGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyXzEgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUgPyByZWplY3RlZChudWxsLCByZXF1ZXN0SWQsIGFyZywgZXJyXzEucGF5bG9hZCwgZXJyXzEubWV0YSkgOiByZWplY3RlZChlcnJfMSwgcmVxdWVzdElkLCBhcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBEaXNwYXRjaCA9IG9wdGlvbnMgJiYgIW9wdGlvbnMuZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb24gJiYgcmVqZWN0ZWQubWF0Y2goZmluYWxBY3Rpb24pICYmIGZpbmFsQWN0aW9uLm1ldGEuY29uZGl0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcERpc3BhdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGZpbmFsQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZpbmFsQWN0aW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0oKTtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xyXG4gICAgICAgICAgICAgICAgYWJvcnQ6IGFib3J0LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICBhcmc6IGFyZyxcclxuICAgICAgICAgICAgICAgIHVud3JhcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odW53cmFwUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvbkNyZWF0b3IsIHtcclxuICAgICAgICBwZW5kaW5nOiBwZW5kaW5nLFxyXG4gICAgICAgIHJlamVjdGVkOiByZWplY3RlZCxcclxuICAgICAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcclxuICAgICAgICB0eXBlUHJlZml4OiB0eXBlUHJlZml4XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiB1bndyYXBSZXN1bHQoYWN0aW9uKSB7XHJcbiAgICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcclxuICAgICAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH1cclxuICAgIGlmIChhY3Rpb24uZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBhY3Rpb24uZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XHJcbn1cclxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xyXG59XHJcbi8vIHNyYy90c0hlbHBlcnMudHNcclxudmFyIGhhc01hdGNoRnVuY3Rpb24gPSBmdW5jdGlvbiAodikge1xyXG4gICAgcmV0dXJuIHYgJiYgdHlwZW9mIHYubWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcclxufTtcclxuLy8gc3JjL21hdGNoZXJzLnRzXHJcbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gKG1hdGNoZXIsIGFjdGlvbikge1xyXG4gICAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcclxuICAgIH1cclxufTtcclxuZnVuY3Rpb24gaXNBbnlPZigpIHtcclxuICAgIHZhciBtYXRjaGVycyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBtYXRjaGVyc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlcnMuc29tZShmdW5jdGlvbiAobWF0Y2hlcikgeyByZXR1cm4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pOyB9KTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gaXNBbGxPZigpIHtcclxuICAgIHZhciBtYXRjaGVycyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBtYXRjaGVyc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlcnMuZXZlcnkoZnVuY3Rpb24gKG1hdGNoZXIpIHsgcmV0dXJuIG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKTsgfSk7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgdmFsaWRTdGF0dXMpIHtcclxuICAgIGlmICghYWN0aW9uIHx8ICFhY3Rpb24ubWV0YSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB2YXIgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xyXG4gICAgdmFyIGhhc1ZhbGlkUmVxdWVzdFN0YXR1cyA9IHZhbGlkU3RhdHVzLmluZGV4T2YoYWN0aW9uLm1ldGEucmVxdWVzdFN0YXR1cykgPiAtMTtcclxuICAgIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XHJcbn1cclxuZnVuY3Rpb24gaXNBc3luY1RodW5rQXJyYXkoYSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBhWzBdID09PSBcImZ1bmN0aW9uXCIgJiYgXCJwZW5kaW5nXCIgaW4gYVswXSAmJiBcImZ1bGZpbGxlZFwiIGluIGFbMF0gJiYgXCJyZWplY3RlZFwiIGluIGFbMF07XHJcbn1cclxuZnVuY3Rpb24gaXNQZW5kaW5nKCkge1xyXG4gICAgdmFyIGFzeW5jVGh1bmtzID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIGFzeW5jVGh1bmtzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHsgcmV0dXJuIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xyXG4gICAgICAgIHZhciBtYXRjaGVycyA9IGFzeW5jVGh1bmtzLm1hcChmdW5jdGlvbiAoYXN5bmNUaHVuaykgeyByZXR1cm4gYXN5bmNUaHVuay5wZW5kaW5nOyB9KTtcclxuICAgICAgICB2YXIgY29tYmluZWRNYXRjaGVyID0gaXNBbnlPZi5hcHBseSh2b2lkIDAsIG1hdGNoZXJzKTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWRNYXRjaGVyKGFjdGlvbik7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoKSB7XHJcbiAgICB2YXIgYXN5bmNUaHVua3MgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgYXN5bmNUaHVua3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJyZWplY3RlZFwiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICB2YXIgbWF0Y2hlcnMgPSBhc3luY1RodW5rcy5tYXAoZnVuY3Rpb24gKGFzeW5jVGh1bmspIHsgcmV0dXJuIGFzeW5jVGh1bmsucmVqZWN0ZWQ7IH0pO1xyXG4gICAgICAgIHZhciBjb21iaW5lZE1hdGNoZXIgPSBpc0FueU9mLmFwcGx5KHZvaWQgMCwgbWF0Y2hlcnMpO1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lZE1hdGNoZXIoYWN0aW9uKTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSgpIHtcclxuICAgIHZhciBhc3luY1RodW5rcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhc3luY1RodW5rc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgdmFyIGhhc0ZsYWcgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIGFjdGlvbiAmJiBhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZTtcclxuICAgIH07XHJcbiAgICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQWxsT2YoaXNSZWplY3RlZC5hcHBseSh2b2lkIDAsIGFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lZE1hdGNoZXIoYWN0aW9uKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcclxuICAgICAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQWxsT2YoaXNSZWplY3RlZC5hcHBseSh2b2lkIDAsIGFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWF0Y2hlcihhY3Rpb24pO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCgpIHtcclxuICAgIHZhciBhc3luY1RodW5rcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhc3luY1RodW5rc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7IHJldHVybiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcImZ1bGZpbGxlZFwiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG1hdGNoZXJzID0gYXN5bmNUaHVua3MubWFwKGZ1bmN0aW9uIChhc3luY1RodW5rKSB7IHJldHVybiBhc3luY1RodW5rLmZ1bGZpbGxlZDsgfSk7XHJcbiAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQW55T2YuYXBwbHkodm9pZCAwLCBtYXRjaGVycyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWF0Y2hlcihhY3Rpb24pO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oKSB7XHJcbiAgICB2YXIgYXN5bmNUaHVua3MgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgYXN5bmNUaHVua3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCIsIFwiZnVsZmlsbGVkXCIsIFwicmVqZWN0ZWRcIl0pOyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcclxuICAgICAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICB2YXIgbWF0Y2hlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGFzeW5jVGh1bmtzXzEgPSBhc3luY1RodW5rczsgX2kgPCBhc3luY1RodW5rc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgYXN5bmNUaHVuayA9IGFzeW5jVGh1bmtzXzFbX2ldO1xyXG4gICAgICAgICAgICBtYXRjaGVycy5wdXNoKGFzeW5jVGh1bmsucGVuZGluZywgYXN5bmNUaHVuay5yZWplY3RlZCwgYXN5bmNUaHVuay5mdWxmaWxsZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29tYmluZWRNYXRjaGVyID0gaXNBbnlPZi5hcHBseSh2b2lkIDAsIG1hdGNoZXJzKTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWRNYXRjaGVyKGFjdGlvbik7XHJcbiAgICB9O1xyXG59XHJcbi8vIHNyYy9pbmRleC50c1xyXG5lbmFibGVFUzUoKTtcclxuZXhwb3J0IHsgTWlkZGxld2FyZUFycmF5LCBjb25maWd1cmVTdG9yZSwgY3JlYXRlQWN0aW9uLCBjcmVhdGVBc3luY1RodW5rLCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvciwgY3JlYXRlRW50aXR5QWRhcHRlciwgY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLCBkZWZhdWx0MiBhcyBjcmVhdGVOZXh0U3RhdGUsIGNyZWF0ZVJlZHVjZXIsIGNyZWF0ZVNlbGVjdG9yMiBhcyBjcmVhdGVTZWxlY3RvciwgY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLCBjcmVhdGVTbGljZSwgY3VycmVudDIgYXMgY3VycmVudCwgZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlLCBmcmVlemUsIGdldERlZmF1bHRNaWRkbGV3YXJlLCBnZXRUeXBlLCBpc0FsbE9mLCBpc0FueU9mLCBpc0FzeW5jVGh1bmtBY3Rpb24sIGlzRHJhZnQ0IGFzIGlzRHJhZnQsIGlzRnVsZmlsbGVkLCBpc0ltbXV0YWJsZURlZmF1bHQsIGlzUGVuZGluZywgaXNQbGFpbiwgaXNQbGFpbk9iamVjdCwgaXNSZWplY3RlZCwgaXNSZWplY3RlZFdpdGhWYWx1ZSwgbWluaVNlcmlhbGl6ZUVycm9yLCBuYW5vaWQsIG9yaWdpbmFsLCB1bndyYXBSZXN1bHQgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5lc20uanMubWFwIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEEgY29udmVuaWVuY2UgaG9vayBhcm91bmQgYHVzZVN0YXRlYCBkZXNpZ25lZCB0byBiZSBwYWlyZWQgd2l0aFxuICogdGhlIGNvbXBvbmVudCBbY2FsbGJhY2sgcmVmXShodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVmcy1hbmQtdGhlLWRvbS5odG1sI2NhbGxiYWNrLXJlZnMpIGFwaS5cbiAqIENhbGxiYWNrIHJlZnMgYXJlIHVzZWZ1bCBvdmVyIGB1c2VSZWYoKWAgd2hlbiB5b3UgbmVlZCB0byByZXNwb25kIHRvIHRoZSByZWYgYmVpbmcgc2V0XG4gKiBpbnN0ZWFkIG9mIGxhemlseSBhY2Nlc3NpbmcgaXQgaW4gYW4gZWZmZWN0LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxEaXZFbGVtZW50PigpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgaWYgKCFlbGVtZW50KSByZXR1cm5cbiAqXG4gKiAgIGNvbnN0IGNhbGVuZGFyID0gbmV3IEZ1bGxDYWxlbmRhci5DYWxlbmRhcihlbGVtZW50KVxuICpcbiAqICAgcmV0dXJuICgpID0+IHtcbiAqICAgICBjYWxlbmRhci5kZXN0cm95KClcbiAqICAgfVxuICogfSwgW2VsZW1lbnRdKVxuICpcbiAqIHJldHVybiA8ZGl2IHJlZj17YXR0YWNoUmVmfSAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDYWxsYmFja1JlZigpIHtcbiAgcmV0dXJuIHVzZVN0YXRlKG51bGwpO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYFJlZmAgd2hvc2UgdmFsdWUgaXMgdXBkYXRlZCBpbiBhbiBlZmZlY3QsIGVuc3VyaW5nIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWUgaXMgdGhlIG9uZSByZW5kZXJlZCB3aXRoLiBHZW5lcmFsbHkgb25seSByZXF1aXJlZCBmb3IgQ29uY3VycmVudCBtb2RlIHVzYWdlXG4gKiB3aGVyZSBwcmV2aW91cyB3b3JrIGluIGByZW5kZXIoKWAgbWF5IGJlIGRpc2NhcmRlZCBiZWZvciBiZWluZyB1c2VkLlxuICpcbiAqIFRoaXMgaXMgc2FmZSB0byBhY2Nlc3MgaW4gYW4gZXZlbnQgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGBSZWZgIHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29tbWl0dGVkUmVmKHZhbHVlKSB7XG4gIHZhciByZWYgPSB1c2VSZWYodmFsdWUpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcmVmO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb21taXR0ZWRSZWY7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50Q2FsbGJhY2soZm4pIHtcbiAgdmFyIHJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7XG4gIHJldHVybiB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ICYmIHJlZi5jdXJyZW50LmFwcGx5KHJlZiwgYXJndW1lbnRzKTtcbiAgfSwgW3JlZl0pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnO1xudmFyIGlzUmVhY3ROYXRpdmUgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiAvLyBAdHMtaWdub3JlXG5nbG9iYWwubmF2aWdhdG9yICYmIC8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJztcbnZhciBpc0RPTSA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4vKipcbiAqIElzIGB1c2VMYXlvdXRFZmZlY3RgIGluIGEgRE9NIG9yIFJlYWN0IE5hdGl2ZSBlbnZpcm9ubWVudCwgb3RoZXJ3aXNlIHJlc29sdmVzIHRvIHVzZUVmZmVjdFxuICogT25seSB1c2VmdWwgdG8gYXZvaWQgdGhlIGNvbnNvbGUgd2FybmluZy5cbiAqXG4gKiBQUkVGRVIgYHVzZUVmZmVjdGAgVU5MRVNTIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORy5cbiAqXG4gKiBAY2F0ZWdvcnkgZWZmZWN0c1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGlzRE9NIHx8IGlzUmVhY3ROYXRpdmUgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7IiwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxudmFyIHRvRm5SZWYgPSBmdW5jdGlvbiB0b0ZuUmVmKHJlZikge1xuICByZXR1cm4gIXJlZiB8fCB0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nID8gcmVmIDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlZnMocmVmQSwgcmVmQikge1xuICB2YXIgYSA9IHRvRm5SZWYocmVmQSk7XG4gIHZhciBiID0gdG9GblJlZihyZWZCKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChhKSBhKHZhbHVlKTtcbiAgICBpZiAoYikgYih2YWx1ZSk7XG4gIH07XG59XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIHNpbmdsZSBjYWxsYmFjayByZWYgY29tcG9zZWQgZnJvbSB0d28gb3RoZXIgUmVmcy5cbiAqXG4gKiBgYGB0c3hcbiAqIGNvbnN0IEJ1dHRvbiA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAqICAgY29uc3QgW2VsZW1lbnQsIGF0dGFjaFJlZl0gPSB1c2VDYWxsYmFja1JlZjxIVE1MQnV0dG9uRWxlbWVudD4oKTtcbiAqICAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhyZWYsIGF0dGFjaFJlZik7XG4gKlxuICogICByZXR1cm4gPGJ1dHRvbiByZWY9e21lcmdlZFJlZn0gey4uLnByb3BzfS8+XG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIHJlZkEgQSBDYWxsYmFjayBvciBtdXRhYmxlIFJlZlxuICogQHBhcmFtIHJlZkIgQSBDYWxsYmFjayBvciBtdXRhYmxlIFJlZlxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VNZXJnZWRSZWZzKHJlZkEsIHJlZkIpIHtcbiAgcmV0dXJuIHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXJnZVJlZnMocmVmQSwgcmVmQik7XG4gIH0sIFtyZWZBLCByZWZCXSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZU1lcmdlZFJlZnM7IiwiaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFRyYWNrIHdoZXRoZXIgYSBjb21wb25lbnQgaXMgY3VycmVudCBtb3VudGVkLiBHZW5lcmFsbHkgbGVzcyBwcmVmZXJhYmxlIHRoYW5cbiAqIHByb3BlcmxseSBjYW5jZWxpbmcgZWZmZWN0cyBzbyB0aGV5IGRvbid0IHJ1biBhZnRlciBhIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQsXG4gKiBidXQgaGVscGZ1bCBpbiBjYXNlcyB3aGVyZSB0aGF0IGlzbid0IGZlYXNpYmxlLCBzdWNoIGFzIGEgYFByb21pc2VgIHJlc29sdXRpb24uXG4gKlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgaXNNb3VudGVkIHN0YXRlIG9mIHRoZSBjb21wb25lbnRcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGUobnVsbClcbiAqIGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKVxuICpcbiAqIHVzZUVmZmVjdCgoKSA9PiB7XG4gKiAgIGZldGNoZGF0YSgpLnRoZW4oKG5ld0RhdGEpID0+IHtcbiAqICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gKiAgICAgICAgc2V0RGF0YShuZXdEYXRhKTtcbiAqICAgICAgfVxuICogICB9KVxuICogfSlcbiAqIGBgYFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG4gIHZhciBtb3VudGVkID0gdXNlUmVmKHRydWUpO1xuICB2YXIgaXNNb3VudGVkID0gdXNlUmVmKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW91bnRlZC5jdXJyZW50O1xuICB9KTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gaXNNb3VudGVkLmN1cnJlbnQ7XG59IiwiaW1wb3J0IHsgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcbmltcG9ydCB1c2VXaWxsVW5tb3VudCBmcm9tICcuL3VzZVdpbGxVbm1vdW50Jztcbi8qXG4gKiBCcm93c2VycyBpbmNsdWRpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIENocm9tZSwgU2FmYXJpLCBhbmQgRmlyZWZveCBzdG9yZSB0aGVcbiAqIGRlbGF5IGFzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGludGVybmFsbHkuIFRoaXMgY2F1c2VzIGFuIGludGVnZXIgb3ZlcmZsb3dcbiAqIHdoZW4gdXNpbmcgZGVsYXlzIGxhcmdlciB0aGFuIDIsMTQ3LDQ4Myw2NDcgbXMgKGFib3V0IDI0LjggZGF5cyksXG4gKiByZXN1bHRpbmcgaW4gdGhlIHRpbWVvdXQgYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXG4gKlxuICogdmlhOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZS9zZXRUaW1lb3V0XG4gKi9cblxudmFyIE1BWF9ERUxBWV9NUyA9IE1hdGgucG93KDIsIDMxKSAtIDE7XG5cbmZ1bmN0aW9uIHNldENoYWluZWRUaW1lb3V0KGhhbmRsZVJlZiwgZm4sIHRpbWVvdXRBdE1zKSB7XG4gIHZhciBkZWxheU1zID0gdGltZW91dEF0TXMgLSBEYXRlLm5vdygpO1xuICBoYW5kbGVSZWYuY3VycmVudCA9IGRlbGF5TXMgPD0gTUFYX0RFTEFZX01TID8gc2V0VGltZW91dChmbiwgZGVsYXlNcykgOiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2V0Q2hhaW5lZFRpbWVvdXQoaGFuZGxlUmVmLCBmbiwgdGltZW91dEF0TXMpO1xuICB9LCBNQVhfREVMQVlfTVMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlciBvYmplY3QgZm9yIHNldHRpbmcgYSB0aW1lb3V0IHRoYXQgaXMgcHJvcGVybHkgY2xlYW5lZCB1cFxuICogb25jZSB0aGUgY29tcG9uZW50IHVubW91bnRzLiBOZXcgdGltZW91dHMgY2FuY2VsIGFuZCByZXBsYWNlIGV4aXN0aW5nIG9uZXMuXG4gKlxuICpcbiAqXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc2V0LCBjbGVhciB9ID0gdXNlVGltZW91dCgpO1xuICogY29uc3QgW2hlbGxvLCBzaG93SGVsbG9dID0gdXNlU3RhdGUoZmFsc2UpO1xuICogLy9EaXNwbGF5IGhlbGxvIGFmdGVyIDUgc2Vjb25kc1xuICogc2V0KCgpID0+IHNob3dIZWxsbyh0cnVlKSwgNTAwMCk7XG4gKiByZXR1cm4gKFxuICogICA8ZGl2IGNsYXNzTmFtZT1cIkFwcFwiPlxuICogICAgIHtoZWxsbyA/IDxoMz5IZWxsbzwvaDM+IDogbnVsbH1cbiAqICAgPC9kaXY+XG4gKiApO1xuICogYGBgXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUaW1lb3V0KCkge1xuICB2YXIgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpOyAvLyB0eXBlcyBhcmUgY29uZnVzZWQgYmV0d2VlbiBub2RlIGFuZCB3ZWIgaGVyZSBJREtcblxuICB2YXIgaGFuZGxlUmVmID0gdXNlUmVmKCk7XG4gIHVzZVdpbGxVbm1vdW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGhhbmRsZVJlZi5jdXJyZW50KTtcbiAgfSk7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoaGFuZGxlUmVmLmN1cnJlbnQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzZXQoZm4sIGRlbGF5TXMpIHtcbiAgICAgIGlmIChkZWxheU1zID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVsYXlNcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNNb3VudGVkKCkpIHJldHVybjtcbiAgICAgIGNsZWFyKCk7XG5cbiAgICAgIGlmIChkZWxheU1zIDw9IE1BWF9ERUxBWV9NUykge1xuICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgaWYgdGhlIHRpbWVvdXQgaXMgc2hvcnQsIGp1c3Qgc2V0IGEgbm9ybWFsIHRpbWVvdXQuXG4gICAgICAgIGhhbmRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmbiwgZGVsYXlNcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDaGFpbmVkVGltZW91dChoYW5kbGVSZWYsIGZuLCBEYXRlLm5vdygpICsgZGVsYXlNcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldDogc2V0LFxuICAgICAgY2xlYXI6IGNsZWFyXG4gICAgfTtcbiAgfSwgW10pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSdW5zIGFuIGVmZmVjdCBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQsIHNraXBwaW5nIHRoZVxuICogaW5pdGlhbCBcIm9uIG1vdW50XCIgcnVuLiBDYXV0aW9uLCBpZiB0aGUgZGVwZW5kZW5jeSBsaXN0IG5ldmVyIGNoYW5nZXMsXG4gKiB0aGUgZWZmZWN0IGlzICoqbmV2ZXIgcnVuKipcbiAqXG4gKiBgYGB0c1xuICogIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MSW5wdXQ+KG51bGwpO1xuICpcbiAqICAvLyBmb2N1c2VzIGFuIGVsZW1lbnQgb25seSBpZiB0aGUgZm9jdXMgY2hhbmdlcywgYW5kIG5vdCBvbiBtb3VudFxuICogIHVzZVVwZGF0ZUVmZmVjdCgoKSA9PiB7XG4gKiAgICBjb25zdCBlbGVtZW50ID0gcmVmLmN1cnJlbnQ/LmNoaWxkcmVuW2ZvY3VzZWRJZHhdIGFzIEhUTUxFbGVtZW50XG4gKlxuICogICAgZWxlbWVudD8uZm9jdXMoKVxuICpcbiAqICB9LCBbZm9jdXNlZEluZGV4XSlcbiAqIGBgYFxuICogQHBhcmFtIGVmZmVjdCBBbiBlZmZlY3QgdG8gcnVuIG9uIG1vdW50XG4gKlxuICogQGNhdGVnb3J5IGVmZmVjdHNcbiAqL1xuXG5mdW5jdGlvbiB1c2VVcGRhdGVFZmZlY3QoZm4sIGRlcHMpIHtcbiAgdmFyIGlzRmlyc3QgPSB1c2VSZWYodHJ1ZSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRmlyc3QuY3VycmVudCkge1xuICAgICAgaXNGaXJzdC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH0sIGRlcHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VVcGRhdGVFZmZlY3Q7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSZXR1cm5zIGEgcmVmIHRoYXQgaXMgaW1tZWRpYXRlbHkgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWVcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIFJlZiB2YWx1ZVxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVcGRhdGVkUmVmKHZhbHVlKSB7XG4gIHZhciB2YWx1ZVJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIHZhbHVlUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlUmVmO1xufSIsImltcG9ydCB1c2VVcGRhdGVkUmVmIGZyb20gJy4vdXNlVXBkYXRlZFJlZic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEF0dGFjaCBhIGNhbGxiYWNrIHRoYXQgZmlyZXMgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50c1xuICpcbiAqIEBwYXJhbSBmbiBIYW5kbGVyIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAqIEBjYXRlZ29yeSBlZmZlY3RzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV2lsbFVubW91bnQoZm4pIHtcbiAgdmFyIG9uVW5tb3VudCA9IHVzZVVwZGF0ZWRSZWYoZm4pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25Vbm1vdW50LmN1cnJlbnQoKTtcbiAgICB9O1xuICB9LCBbXSk7XG59IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wib25LZXlEb3duXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9hbmNob3ItaGFzLWNvbnRlbnQgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUV2ZW50Q2FsbGJhY2sgfSBmcm9tICdAcmVzdGFydC9ob29rcyc7XG5pbXBvcnQgeyB1c2VCdXR0b25Qcm9wcyB9IGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNUcml2aWFsSHJlZihocmVmKSB7XG4gIHJldHVybiAhaHJlZiB8fCBocmVmLnRyaW0oKSA9PT0gJyMnO1xufVxuXG4vKipcbiAqIEFuIGdlbmVyaWMgYDxhPmAgY29tcG9uZW50IHRoYXQgY292ZXJzIGEgZmV3IEExMXkgY2FzZXMsIGVuc3VyaW5nIHRoYXRcbiAqIGNhc2VzIHdoZXJlIHRoZSBgaHJlZmAgaXMgbWlzc2luZyBvciB0cml2aWFsIGxpa2UgXCIjXCIgYXJlIHRyZWF0ZWQgbGlrZSBidXR0b25zLlxuICovXG5jb25zdCBBbmNob3IgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgb25LZXlEb3duXG4gIH0gPSBfcmVmLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IFtidXR0b25Qcm9wc10gPSB1c2VCdXR0b25Qcm9wcyhPYmplY3QuYXNzaWduKHtcbiAgICB0YWdOYW1lOiAnYSdcbiAgfSwgcHJvcHMpKTtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgYnV0dG9uUHJvcHMub25LZXlEb3duKGUpO1xuICAgIG9uS2V5RG93biA9PSBudWxsID8gdm9pZCAwIDogb25LZXlEb3duKGUpO1xuICB9KTtcblxuICBpZiAoaXNUcml2aWFsSHJlZihwcm9wcy5ocmVmKSAmJiAhcHJvcHMucm9sZSB8fCBwcm9wcy5yb2xlID09PSAnYnV0dG9uJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImFcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICByZWY6IHJlZlxuICAgIH0sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiYVwiLCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHJlZlxuICB9LCBwcm9wcywge1xuICAgIG9uS2V5RG93bjogb25LZXlEb3duXG4gIH0pKTtcbn0pO1xuQW5jaG9yLmRpc3BsYXlOYW1lID0gJ0FuY2hvcic7XG5leHBvcnQgZGVmYXVsdCBBbmNob3I7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJkaXNhYmxlZFwiXTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJpdmlhbEhyZWYoaHJlZikge1xuICByZXR1cm4gIWhyZWYgfHwgaHJlZi50cmltKCkgPT09ICcjJztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VCdXR0b25Qcm9wcyh7XG4gIHRhZ05hbWUsXG4gIGRpc2FibGVkLFxuICBocmVmLFxuICB0YXJnZXQsXG4gIHJlbCxcbiAgb25DbGljayxcbiAgdGFiSW5kZXggPSAwLFxuICB0eXBlXG59KSB7XG4gIGlmICghdGFnTmFtZSkge1xuICAgIGlmIChocmVmICE9IG51bGwgfHwgdGFyZ2V0ICE9IG51bGwgfHwgcmVsICE9IG51bGwpIHtcbiAgICAgIHRhZ05hbWUgPSAnYSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ05hbWUgPSAnYnV0dG9uJztcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXRhID0ge1xuICAgIHRhZ05hbWVcbiAgfTtcblxuICBpZiAodGFnTmFtZSA9PT0gJ2J1dHRvbicpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHR5cGU6IHR5cGUgfHwgJ2J1dHRvbicsXG4gICAgICBkaXNhYmxlZFxuICAgIH0sIG1ldGFdO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSBldmVudCA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8IHRhZ05hbWUgPT09ICdhJyAmJiBpc1RyaXZpYWxIcmVmKGhyZWYpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25DbGljayA9PSBudWxsID8gdm9pZCAwIDogb25DbGljayhldmVudCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBoYW5kbGVDbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBbe1xuICAgIHJvbGU6ICdidXR0b24nLFxuICAgIC8vIGV4cGxpY2l0bHkgdW5kZWZpbmVkIHNvIHRoYXQgaXQgb3ZlcnJpZGVzIHRoZSBwcm9wcyBkaXNhYmxlZCBpbiBhIHNwcmVhZFxuICAgIC8vIGUuZy4gPFRhZyB7Li4ucHJvcHN9IHsuLi5ob29rUHJvcHN9IC8+XG4gICAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyB1bmRlZmluZWQgOiB0YWJJbmRleCxcbiAgICBocmVmOiB0YWdOYW1lID09PSAnYScgJiYgZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBocmVmLFxuICAgIHRhcmdldDogdGFnTmFtZSA9PT0gJ2EnID8gdGFyZ2V0IDogdW5kZWZpbmVkLFxuICAgICdhcmlhLWRpc2FibGVkJzogIWRpc2FibGVkID8gdW5kZWZpbmVkIDogZGlzYWJsZWQsXG4gICAgcmVsOiB0YWdOYW1lID09PSAnYScgPyByZWwgOiB1bmRlZmluZWQsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duXG4gIH0sIG1ldGFdO1xufVxuY29uc3QgQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIGFzOiBhc1Byb3AsXG4gICAgZGlzYWJsZWRcbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZTogQ29tcG9uZW50XG4gIH1dID0gdXNlQnV0dG9uUHJvcHMoT2JqZWN0LmFzc2lnbih7XG4gICAgdGFnTmFtZTogYXNQcm9wLFxuICAgIGRpc2FibGVkXG4gIH0sIHByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKTtcbn0pO1xuQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0J1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwiZXhwb3J0IGNvbnN0IEFUVFJJQlVURV9QUkVGSVggPSBgZGF0YS1yci11aS1gO1xuZXhwb3J0IGNvbnN0IFBST1BFUlRZX1BSRUZJWCA9IGByclVpYDtcbmV4cG9ydCBmdW5jdGlvbiBkYXRhQXR0cihwcm9wZXJ0eSkge1xuICByZXR1cm4gYCR7QVRUUklCVVRFX1BSRUZJWH0ke3Byb3BlcnR5fWA7XG59XG5leHBvcnQgZnVuY3Rpb24gZGF0YVByb3AocHJvcGVydHkpIHtcbiAgcmV0dXJuIGAke1BST1BFUlRZX1BSRUZJWH0ke3Byb3BlcnR5fWA7XG59IiwiaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCBhZGRFdmVudExpc3RlbmVyIGZyb20gJ2RvbS1oZWxwZXJzL2FkZEV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VQcmV2aW91cyc7XG5pbXBvcnQgdXNlRm9yY2VVcGRhdGUgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRm9yY2VVcGRhdGUnO1xuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRMaXN0ZW5lcic7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IERyb3Bkb3duTWVudSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgRHJvcGRvd25Ub2dnbGUsIHsgaXNSb2xlTWVudSB9IGZyb20gJy4vRHJvcGRvd25Ub2dnbGUnO1xuaW1wb3J0IERyb3Bkb3duSXRlbSBmcm9tICcuL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQgZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBkYXRhQXR0ciB9IGZyb20gJy4vRGF0YUtleSc7XG5pbXBvcnQgdXNlV2luZG93IGZyb20gJy4vdXNlV2luZG93JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbmZ1bmN0aW9uIHVzZVJlZldpdGhVcGRhdGUoKSB7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgcmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBhdHRhY2hSZWYgPSB1c2VDYWxsYmFjayhlbGVtZW50ID0+IHtcbiAgICByZWYuY3VycmVudCA9IGVsZW1lbnQ7IC8vIGVuc3VyZSB0aGF0IGEgbWVudSBzZXQgdHJpZ2dlcnMgYW4gdXBkYXRlIGZvciBjb25zdW1lcnNcblxuICAgIGZvcmNlVXBkYXRlKCk7XG4gIH0sIFtmb3JjZVVwZGF0ZV0pO1xuICByZXR1cm4gW3JlZiwgYXR0YWNoUmVmXTtcbn1cbi8qKlxuICogQGRpc3BsYXlOYW1lIERyb3Bkb3duXG4gKiBAcHVibGljXG4gKi9cblxuXG5mdW5jdGlvbiBEcm9wZG93bih7XG4gIGRlZmF1bHRTaG93LFxuICBzaG93OiByYXdTaG93LFxuICBvblNlbGVjdCxcbiAgb25Ub2dnbGU6IHJhd09uVG9nZ2xlLFxuICBpdGVtU2VsZWN0b3IgPSBgKiBbJHtkYXRhQXR0cignZHJvcGRvd24taXRlbScpfV1gLFxuICBmb2N1c0ZpcnN0SXRlbU9uU2hvdyxcbiAgcGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCcsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHdpbmRvdyA9IHVzZVdpbmRvdygpO1xuICBjb25zdCBbc2hvdywgb25Ub2dnbGVdID0gdXNlVW5jb250cm9sbGVkUHJvcChyYXdTaG93LCBkZWZhdWx0U2hvdywgcmF3T25Ub2dnbGUpOyAvLyBXZSB1c2Ugbm9ybWFsIHJlZnMgaW5zdGVhZCBvZiB1c2VDYWxsYmFja1JlZiBpbiBvcmRlciB0byBwb3B1bGF0ZSB0aGVcbiAgLy8gdGhlIHZhbHVlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgZWZmZWN0IHRvIGZvY3VzIHRoZSBlbGVtZW50XG4gIC8vIG1heSBydW4gYmVmb3JlIHRoZSBzdGF0ZSB2YWx1ZSBpcyBzZXRcblxuICBjb25zdCBbbWVudVJlZiwgc2V0TWVudV0gPSB1c2VSZWZXaXRoVXBkYXRlKCk7XG4gIGNvbnN0IG1lbnVFbGVtZW50ID0gbWVudVJlZi5jdXJyZW50O1xuICBjb25zdCBbdG9nZ2xlUmVmLCBzZXRUb2dnbGVdID0gdXNlUmVmV2l0aFVwZGF0ZSgpO1xuICBjb25zdCB0b2dnbGVFbGVtZW50ID0gdG9nZ2xlUmVmLmN1cnJlbnQ7XG4gIGNvbnN0IGxhc3RTaG93ID0gdXNlUHJldmlvdXMoc2hvdyk7XG4gIGNvbnN0IGxhc3RTb3VyY2VFdmVudCA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZm9jdXNJbkRyb3Bkb3duID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qgb25TZWxlY3RDdHggPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdG9nZ2xlID0gdXNlQ2FsbGJhY2soKG5leHRTaG93LCBldmVudCwgc291cmNlID0gZXZlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGV2ZW50LnR5cGUpID0+IHtcbiAgICBvblRvZ2dsZShuZXh0U2hvdywge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgfSwgW29uVG9nZ2xlXSk7XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUV2ZW50Q2FsbGJhY2soKGtleSwgZXZlbnQpID0+IHtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3Qoa2V5LCBldmVudCk7XG4gICAgdG9nZ2xlKGZhbHNlLCBldmVudCwgJ3NlbGVjdCcpO1xuXG4gICAgaWYgKCFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICBvblNlbGVjdEN0eCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3RDdHgoa2V5LCBldmVudCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICB0b2dnbGUsXG4gICAgcGxhY2VtZW50LFxuICAgIHNob3csXG4gICAgbWVudUVsZW1lbnQsXG4gICAgdG9nZ2xlRWxlbWVudCxcbiAgICBzZXRNZW51LFxuICAgIHNldFRvZ2dsZVxuICB9KSwgW3RvZ2dsZSwgcGxhY2VtZW50LCBzaG93LCBtZW51RWxlbWVudCwgdG9nZ2xlRWxlbWVudCwgc2V0TWVudSwgc2V0VG9nZ2xlXSk7XG5cbiAgaWYgKG1lbnVFbGVtZW50ICYmIGxhc3RTaG93ICYmICFzaG93KSB7XG4gICAgZm9jdXNJbkRyb3Bkb3duLmN1cnJlbnQgPSBtZW51RWxlbWVudC5jb250YWlucyhtZW51RWxlbWVudC5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgY29uc3QgZm9jdXNUb2dnbGUgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodG9nZ2xlRWxlbWVudCAmJiB0b2dnbGVFbGVtZW50LmZvY3VzKSB7XG4gICAgICB0b2dnbGVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbWF5YmVGb2N1c0ZpcnN0ID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGxhc3RTb3VyY2VFdmVudC5jdXJyZW50O1xuICAgIGxldCBmb2N1c1R5cGUgPSBmb2N1c0ZpcnN0SXRlbU9uU2hvdztcblxuICAgIGlmIChmb2N1c1R5cGUgPT0gbnVsbCkge1xuICAgICAgZm9jdXNUeXBlID0gbWVudVJlZi5jdXJyZW50ICYmIGlzUm9sZU1lbnUobWVudVJlZi5jdXJyZW50KSA/ICdrZXlib2FyZCcgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXNUeXBlID09PSBmYWxzZSB8fCBmb2N1c1R5cGUgPT09ICdrZXlib2FyZCcgJiYgIS9ea2V5LiskLy50ZXN0KHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3QgPSBxc2EobWVudVJlZi5jdXJyZW50LCBpdGVtU2VsZWN0b3IpWzBdO1xuICAgIGlmIChmaXJzdCAmJiBmaXJzdC5mb2N1cykgZmlyc3QuZm9jdXMoKTtcbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3cpIG1heWJlRm9jdXNGaXJzdCgpO2Vsc2UgaWYgKGZvY3VzSW5Ecm9wZG93bi5jdXJyZW50KSB7XG4gICAgICBmb2N1c0luRHJvcGRvd24uY3VycmVudCA9IGZhbHNlO1xuICAgICAgZm9jdXNUb2dnbGUoKTtcbiAgICB9IC8vIG9ubHkgYHNob3dgIHNob3VsZCBiZSBjaGFuZ2luZ1xuICB9LCBbc2hvdywgZm9jdXNJbkRyb3Bkb3duLCBmb2N1c1RvZ2dsZSwgbWF5YmVGb2N1c0ZpcnN0XSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGFzdFNvdXJjZUV2ZW50LmN1cnJlbnQgPSBudWxsO1xuICB9KTtcblxuICBjb25zdCBnZXROZXh0Rm9jdXNlZENoaWxkID0gKGN1cnJlbnQsIG9mZnNldCkgPT4ge1xuICAgIGlmICghbWVudVJlZi5jdXJyZW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpdGVtcyA9IHFzYShtZW51UmVmLmN1cnJlbnQsIGl0ZW1TZWxlY3Rvcik7XG4gICAgbGV0IGluZGV4ID0gaXRlbXMuaW5kZXhPZihjdXJyZW50KSArIG9mZnNldDtcbiAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBpdGVtcy5sZW5ndGgpKTtcbiAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICB9O1xuXG4gIHVzZUV2ZW50TGlzdGVuZXIodXNlQ2FsbGJhY2soKCkgPT4gd2luZG93LmRvY3VtZW50LCBbd2luZG93XSksICdrZXlkb3duJywgZXZlbnQgPT4ge1xuICAgIHZhciBfbWVudVJlZiRjdXJyZW50LCBfdG9nZ2xlUmVmJGN1cnJlbnQ7XG5cbiAgICBjb25zdCB7XG4gICAgICBrZXlcbiAgICB9ID0gZXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGZyb21NZW51ID0gKF9tZW51UmVmJGN1cnJlbnQgPSBtZW51UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWVudVJlZiRjdXJyZW50LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgY29uc3QgZnJvbVRvZ2dsZSA9IChfdG9nZ2xlUmVmJGN1cnJlbnQgPSB0b2dnbGVSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2dnbGVSZWYkY3VycmVudC5jb250YWlucyh0YXJnZXQpOyAvLyBTZWNvbmQgb25seSB0byBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi84Y2ZiZjY5MzNiOGEwMTQ2YWMzZmJjMzY5ZjE5ZTUyMGJkMWViZGFjL2pzL3NyYy9kcm9wZG93bi5qcyNMNDAwXG4gICAgLy8gaW4gaW5zY3J1dGFiaWxpdHlcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHRhcmdldC50YWdOYW1lKTtcblxuICAgIGlmIChpc0lucHV0ICYmIChrZXkgPT09ICcgJyB8fCBrZXkgIT09ICdFc2NhcGUnICYmIGZyb21NZW51KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZnJvbU1lbnUgJiYgIWZyb21Ub2dnbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnVGFiJyAmJiAoIW1lbnVSZWYuY3VycmVudCB8fCAhc2hvdykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsYXN0U291cmNlRXZlbnQuY3VycmVudCA9IGV2ZW50LnR5cGU7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgc291cmNlOiBldmVudC50eXBlXG4gICAgfTtcblxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0Rm9jdXNlZENoaWxkKHRhcmdldCwgLTEpO1xuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQuZm9jdXMpIG5leHQuZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICghc2hvdykge1xuICAgICAgICAgIG9uVG9nZ2xlKHRydWUsIG1ldGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0Rm9jdXNlZENoaWxkKHRhcmdldCwgMSk7XG4gICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5mb2N1cykgbmV4dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICAvLyBvbiBrZXlkb3duIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgYmVpbmcgdGFiYmVkIEZST00sIHdlIG5lZWQgdGhhdFxuICAgICAgICAvLyB0byBrbm93IGlmIHRoaXMgZXZlbnQgaXMgcmVsZXZhbnQgdG8gdGhpcyBkcm9wZG93biAoZS5nLiBpbiB0aGlzIG1lbnUpLlxuICAgICAgICAvLyBPbiBga2V5dXBgIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgYmVpbmcgdGFnZ2VkIFRPIHdoaWNoIHdlIHVzZSB0byBjaGVja1xuICAgICAgICAvLyBpZiBmb2N1cyBoYXMgbGVmdCB0aGUgbWVudVxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKHRhcmdldC5vd25lckRvY3VtZW50LCAna2V5dXAnLCBlID0+IHtcbiAgICAgICAgICB2YXIgX21lbnVSZWYkY3VycmVudDI7XG5cbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdUYWInICYmICFlLnRhcmdldCB8fCAhKChfbWVudVJlZiRjdXJyZW50MiA9IG1lbnVSZWYuY3VycmVudCkgIT0gbnVsbCAmJiBfbWVudVJlZiRjdXJyZW50Mi5jb250YWlucyhlLnRhcmdldCkpKSB7XG4gICAgICAgICAgICBvblRvZ2dsZShmYWxzZSwgbWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uVG9nZ2xlKGZhbHNlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGhhbmRsZVNlbGVjdCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRHJvcGRvd25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufVxuXG5Ecm9wZG93bi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bic7XG5Ecm9wZG93bi5NZW51ID0gRHJvcGRvd25NZW51O1xuRHJvcGRvd24uVG9nZ2xlID0gRHJvcGRvd25Ub2dnbGU7XG5Ecm9wZG93bi5JdGVtID0gRHJvcGRvd25JdGVtO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd247IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgRHJvcGRvd25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkNvbnRleHQ7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZXZlbnRLZXlcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJhY3RpdmVcIiwgXCJhc1wiXTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQsIHsgbWFrZUV2ZW50S2V5IH0gZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgTmF2Q29udGV4dCBmcm9tICcuL05hdkNvbnRleHQnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgeyBkYXRhQXR0ciB9IGZyb20gJy4vRGF0YUtleSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIGRyb3Bkb3duIGl0ZW0uIFJldHVybnMgYSBzZXQgb2YgcHJvcHMgZm9yIHRoZSBkcm9wZG93biBpdGVtIGNvbXBvbmVudFxuICogaW5jbHVkaW5nIGFuIGBvbkNsaWNrYCBoYW5kbGVyIHRoYXQgcHJldmVudHMgc2VsZWN0aW9uIHdoZW4gdGhlIGl0ZW0gaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duSXRlbSh7XG4gIGtleSxcbiAgaHJlZixcbiAgYWN0aXZlLFxuICBkaXNhYmxlZCxcbiAgb25DbGlja1xufSkge1xuICBjb25zdCBvblNlbGVjdEN0eCA9IHVzZUNvbnRleHQoU2VsZWN0YWJsZUNvbnRleHQpO1xuICBjb25zdCBuYXZDb250ZXh0ID0gdXNlQ29udGV4dChOYXZDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUtleVxuICB9ID0gbmF2Q29udGV4dCB8fCB7fTtcbiAgY29uc3QgZXZlbnRLZXkgPSBtYWtlRXZlbnRLZXkoa2V5LCBocmVmKTtcbiAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG1ha2VFdmVudEtleShhY3RpdmVLZXkpID09PSBldmVudEtleSA6IGFjdGl2ZTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGV2ZW50KTtcblxuICAgIGlmIChvblNlbGVjdEN0eCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgb25TZWxlY3RDdHgoZXZlbnRLZXksIGV2ZW50KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW3tcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkIHx8IHVuZGVmaW5lZCxcbiAgICAnYXJpYS1zZWxlY3RlZCc6IGlzQWN0aXZlLFxuICAgIFtkYXRhQXR0cignZHJvcGRvd24taXRlbScpXTogJydcbiAgfSwge1xuICAgIGlzQWN0aXZlXG4gIH1dO1xufVxuY29uc3QgRHJvcGRvd25JdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIGV2ZW50S2V5LFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2xpY2ssXG4gICAgYWN0aXZlLFxuICAgIGFzOiBDb21wb25lbnQgPSBCdXR0b25cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgW2Ryb3Bkb3duSXRlbVByb3BzXSA9IHVzZURyb3Bkb3duSXRlbSh7XG4gICAga2V5OiBldmVudEtleSxcbiAgICBocmVmOiBwcm9wcy5ocmVmLFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2xpY2ssXG4gICAgYWN0aXZlXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0sIGRyb3Bkb3duSXRlbVByb3BzKSk7XG59KTtcbkRyb3Bkb3duSXRlbS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25JdGVtOyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZiBmcm9tICdAcmVzdGFydC9ob29rcy91c2VDYWxsYmFja1JlZic7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB1c2VQb3BwZXIgZnJvbSAnLi91c2VQb3BwZXInO1xuaW1wb3J0IHVzZVJvb3RDbG9zZSBmcm9tICcuL3VzZVJvb3RDbG9zZSc7XG5pbXBvcnQgbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZyBmcm9tICcuL21lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG4vKipcbiAqIEBtZW1iZXJPZiBEcm9wZG93blxuICogQHBhcmFtIHtvYmplY3R9ICBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZmxpcCBBdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgbWVudSBgZHJvcGAgcG9zaXRpb24gYmFzZWQgb24gdmlld3BvcnQgZWRnZSBkZXRlY3Rpb25cbiAqIEBwYXJhbSB7W251bWJlciwgbnVtYmVyXX0gb3B0aW9ucy5vZmZzZXQgRGVmaW5lIGFuIG9mZnNldCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBNZW51IGFuZCB0aGUgVG9nZ2xlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuc2hvdyBEaXNwbGF5IHRoZSBtZW51IG1hbnVhbGx5LCBpZ25vcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgYERyb3Bkb3duYFxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnVzZVBvcHBlciBvcHQgaW4vb3V0IG9mIHVzaW5nIFBvcHBlckpTIHRvIHBvc2l0aW9uIG1lbnVzLiBXaGVuIGRpc2FibGVkIHlvdSBtdXN0IHBvc2l0aW9uIGl0IHlvdXJzZWxmLlxuICogQHBhcmFtIHtzdHJpbmd9ICBvcHRpb25zLnJvb3RDbG9zZUV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IHRvIGxpc3RlbiBmb3Igd2hlbiBkZXRlcm1pbmluZyBcImNsaWNrcyBvdXRzaWRlXCIgdGhlIG1lbnUgZm9yIHRyaWdnZXJpbmcgYSBjbG9zZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgb3B0aW9ucy5wb3BwZXJDb25maWcgT3B0aW9ucyBwYXNzZWQgdG8gdGhlIFtgdXNlUG9wcGVyYF0oL2FwaS91c2VQb3BwZXIpIGhvb2suXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcGRvd25NZW51KG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChEcm9wZG93bkNvbnRleHQpO1xuICBjb25zdCBbYXJyb3dFbGVtZW50LCBhdHRhY2hBcnJvd1JlZl0gPSB1c2VDYWxsYmFja1JlZigpO1xuICBjb25zdCBoYXNTaG93blJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHtcbiAgICBmbGlwLFxuICAgIG9mZnNldCxcbiAgICByb290Q2xvc2VFdmVudCxcbiAgICBmaXhlZCA9IGZhbHNlLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50T3ZlcnJpZGUsXG4gICAgcG9wcGVyQ29uZmlnID0ge30sXG4gICAgZW5hYmxlRXZlbnRMaXN0ZW5lcnMgPSB0cnVlLFxuICAgIHVzZVBvcHBlcjogc2hvdWxkVXNlUG9wcGVyID0gISFjb250ZXh0XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzaG93ID0gKGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQuc2hvdykgPT0gbnVsbCA/ICEhb3B0aW9ucy5zaG93IDogY29udGV4dC5zaG93O1xuXG4gIGlmIChzaG93ICYmICFoYXNTaG93blJlZi5jdXJyZW50KSB7XG4gICAgaGFzU2hvd25SZWYuY3VycmVudCA9IHRydWU7XG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZSA9IGUgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQudG9nZ2xlKGZhbHNlLCBlKTtcbiAgfTtcblxuICBjb25zdCB7XG4gICAgcGxhY2VtZW50LFxuICAgIHNldE1lbnUsXG4gICAgbWVudUVsZW1lbnQsXG4gICAgdG9nZ2xlRWxlbWVudFxuICB9ID0gY29udGV4dCB8fCB7fTtcbiAgY29uc3QgcG9wcGVyID0gdXNlUG9wcGVyKHRvZ2dsZUVsZW1lbnQsIG1lbnVFbGVtZW50LCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnKHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudE92ZXJyaWRlIHx8IHBsYWNlbWVudCB8fCAnYm90dG9tLXN0YXJ0JyxcbiAgICBlbmFibGVkOiBzaG91bGRVc2VQb3BwZXIsXG4gICAgZW5hYmxlRXZlbnRzOiBlbmFibGVFdmVudExpc3RlbmVycyA9PSBudWxsID8gc2hvdyA6IGVuYWJsZUV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZnNldCxcbiAgICBmbGlwLFxuICAgIGZpeGVkLFxuICAgIGFycm93RWxlbWVudCxcbiAgICBwb3BwZXJDb25maWdcbiAgfSkpO1xuICBjb25zdCBtZW51UHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHNldE1lbnUgfHwgbm9vcCxcbiAgICAnYXJpYS1sYWJlbGxlZGJ5JzogdG9nZ2xlRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogdG9nZ2xlRWxlbWVudC5pZFxuICB9LCBwb3BwZXIuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5wb3BwZXJcbiAgfSk7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIHNob3csXG4gICAgcGxhY2VtZW50LFxuICAgIGhhc1Nob3duOiBoYXNTaG93blJlZi5jdXJyZW50LFxuICAgIHRvZ2dsZTogY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC50b2dnbGUsXG4gICAgcG9wcGVyOiBzaG91bGRVc2VQb3BwZXIgPyBwb3BwZXIgOiBudWxsLFxuICAgIGFycm93UHJvcHM6IHNob3VsZFVzZVBvcHBlciA/IE9iamVjdC5hc3NpZ24oe1xuICAgICAgcmVmOiBhdHRhY2hBcnJvd1JlZlxuICAgIH0sIHBvcHBlci5hdHRyaWJ1dGVzLmFycm93LCB7XG4gICAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5hcnJvd1xuICAgIH0pIDoge31cbiAgfTtcbiAgdXNlUm9vdENsb3NlKG1lbnVFbGVtZW50LCBoYW5kbGVDbG9zZSwge1xuICAgIGNsaWNrVHJpZ2dlcjogcm9vdENsb3NlRXZlbnQsXG4gICAgZGlzYWJsZWQ6ICFzaG93XG4gIH0pO1xuICByZXR1cm4gW21lbnVQcm9wcywgbWV0YWRhdGFdO1xufVxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB1c2VQb3BwZXI6IHRydWVcbn07XG5cbi8qKlxuICogQWxzbyBleHBvcnRlZCBhcyBgPERyb3Bkb3duLk1lbnU+YCBmcm9tIGBEcm9wZG93bmAuXG4gKlxuICogQGRpc3BsYXlOYW1lIERyb3Bkb3duTWVudVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duTWVudShfcmVmKSB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBbcHJvcHMsIG1ldGFdID0gdXNlRHJvcGRvd25NZW51KG9wdGlvbnMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IGNoaWxkcmVuKHByb3BzLCBtZXRhKVxuICB9KTtcbn1cblxuRHJvcGRvd25NZW51LmRpc3BsYXlOYW1lID0gJ0Ryb3Bkb3duTWVudSc7XG5Ecm9wZG93bk1lbnUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuLyoqIEBjb21wb25lbnQgKi9cblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25NZW51OyIsImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU1NSU2FmZUlkIH0gZnJvbSAnLi9zc3InO1xuaW1wb3J0IERyb3Bkb3duQ29udGV4dCBmcm9tICcuL0Ryb3Bkb3duQ29udGV4dCc7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgY29uc3QgaXNSb2xlTWVudSA9IGVsID0+IHtcbiAgdmFyIF9lbCRnZXRBdHRyaWJ1dGU7XG5cbiAgcmV0dXJuICgoX2VsJGdldEF0dHJpYnV0ZSA9IGVsLmdldEF0dHJpYnV0ZSgncm9sZScpKSA9PSBudWxsID8gdm9pZCAwIDogX2VsJGdldEF0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpKSA9PT0gJ21lbnUnO1xufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuLyoqXG4gKiBXaXJlcyB1cCBEcm9wZG93biB0b2dnbGUgZnVuY3Rpb25hbGl0eSwgcmV0dXJuaW5nIGEgc2V0IGEgcHJvcHMgdG8gYXR0YWNoXG4gKiB0byB0aGUgZWxlbWVudCB0aGF0IGZ1bmN0aW9ucyBhcyB0aGUgZHJvcGRvd24gdG9nZ2xlIChnZW5lcmFsbHkgYSBidXR0b24pLlxuICpcbiAqIEBtZW1iZXJPZiBEcm9wZG93blxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duVG9nZ2xlKCkge1xuICBjb25zdCBpZCA9IHVzZVNTUlNhZmVJZCgpO1xuICBjb25zdCB7XG4gICAgc2hvdyA9IGZhbHNlLFxuICAgIHRvZ2dsZSA9IG5vb3AsXG4gICAgc2V0VG9nZ2xlLFxuICAgIG1lbnVFbGVtZW50XG4gIH0gPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgdG9nZ2xlKCFzaG93LCBlKTtcbiAgfSwgW3Nob3csIHRvZ2dsZV0pO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBpZCxcbiAgICByZWY6IHNldFRvZ2dsZSB8fCBub29wLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICdhcmlhLWV4cGFuZGVkJzogISFzaG93XG4gIH07IC8vIFRoaXMgaXMgbWF5YmUgYmV0dGVyIGRvd24gaW4gYW4gZWZmZWN0LCBidXRcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyBnb2luZyB0byB1cGRhdGUgYW55d2F5IHdoZW4gdGhlIG1lbnUgZWxlbWVudFxuICAvLyBpcyBzZXQgc28gbWlnaHQgcmV0dXJuIG5ldyBwcm9wcy5cblxuICBpZiAobWVudUVsZW1lbnQgJiYgaXNSb2xlTWVudShtZW51RWxlbWVudCkpIHtcbiAgICBwcm9wc1snYXJpYS1oYXNwb3B1cCddID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBbcHJvcHMsIHtcbiAgICBzaG93LFxuICAgIHRvZ2dsZVxuICB9XTtcbn1cblxuLyoqXG4gKiBBbHNvIGV4cG9ydGVkIGFzIGA8RHJvcGRvd24uVG9nZ2xlPmAgZnJvbSBgRHJvcGRvd25gLlxuICpcbiAqIEBkaXNwbGF5TmFtZSBEcm9wZG93blRvZ2dsZVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duVG9nZ2xlKHtcbiAgY2hpbGRyZW5cbn0pIHtcbiAgY29uc3QgW3Byb3BzLCBtZXRhXSA9IHVzZURyb3Bkb3duVG9nZ2xlKCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4ocHJvcHMsIG1ldGEpXG4gIH0pO1xufVxuXG5Ecm9wZG93blRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93blRvZ2dsZSc7XG4vKiogQGNvbXBvbmVudCAqL1xuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blRvZ2dsZTsiLCJjb25zdCBfZXhjbHVkZWQgPSBbXCJzaG93XCIsIFwicm9sZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJiYWNrZHJvcFwiLCBcImtleWJvYXJkXCIsIFwib25CYWNrZHJvcENsaWNrXCIsIFwib25Fc2NhcGVLZXlEb3duXCIsIFwidHJhbnNpdGlvblwiLCBcImJhY2tkcm9wVHJhbnNpdGlvblwiLCBcImF1dG9Gb2N1c1wiLCBcImVuZm9yY2VGb2N1c1wiLCBcInJlc3RvcmVGb2N1c1wiLCBcInJlc3RvcmVGb2N1c09wdGlvbnNcIiwgXCJyZW5kZXJEaWFsb2dcIiwgXCJyZW5kZXJCYWNrZHJvcFwiLCBcIm1hbmFnZXJcIiwgXCJjb250YWluZXJcIiwgXCJvblNob3dcIiwgXCJvbkhpZGVcIiwgXCJvbkV4aXRcIiwgXCJvbkV4aXRlZFwiLCBcIm9uRXhpdGluZ1wiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FbnRlcmVkXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGFjdGl2ZUVsZW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvYWN0aXZlRWxlbWVudCc7XG5pbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tICdkb20taGVscGVycy9jYW5Vc2VET00nO1xuaW1wb3J0IGxpc3RlbiBmcm9tICdkb20taGVscGVycy9saXN0ZW4nO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZUltcGVyYXRpdmVIYW5kbGUsIGZvcndhcmRSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTW91bnRlZCc7XG5pbXBvcnQgdXNlV2lsbFVubW91bnQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlV2lsbFVubW91bnQnO1xuaW1wb3J0IHVzZVByZXZpb3VzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVByZXZpb3VzJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IE1vZGFsTWFuYWdlciBmcm9tICcuL01vZGFsTWFuYWdlcic7XG5pbXBvcnQgdXNlV2FpdEZvckRPTVJlZiBmcm9tICcuL3VzZVdhaXRGb3JET01SZWYnO1xuaW1wb3J0IHVzZVdpbmRvdyBmcm9tICcuL3VzZVdpbmRvdyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5sZXQgbWFuYWdlcjtcblxuZnVuY3Rpb24gZ2V0TWFuYWdlcih3aW5kb3cpIHtcbiAgaWYgKCFtYW5hZ2VyKSBtYW5hZ2VyID0gbmV3IE1vZGFsTWFuYWdlcih7XG4gICAgb3duZXJEb2N1bWVudDogd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnRcbiAgfSk7XG4gIHJldHVybiBtYW5hZ2VyO1xufVxuXG5mdW5jdGlvbiB1c2VNb2RhbE1hbmFnZXIocHJvdmlkZWQpIHtcbiAgY29uc3Qgd2luZG93ID0gdXNlV2luZG93KCk7XG4gIGNvbnN0IG1vZGFsTWFuYWdlciA9IHByb3ZpZGVkIHx8IGdldE1hbmFnZXIod2luZG93KTtcbiAgY29uc3QgbW9kYWwgPSB1c2VSZWYoe1xuICAgIGRpYWxvZzogbnVsbCxcbiAgICBiYWNrZHJvcDogbnVsbFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obW9kYWwuY3VycmVudCwge1xuICAgIGFkZDogKCkgPT4gbW9kYWxNYW5hZ2VyLmFkZChtb2RhbC5jdXJyZW50KSxcbiAgICByZW1vdmU6ICgpID0+IG1vZGFsTWFuYWdlci5yZW1vdmUobW9kYWwuY3VycmVudCksXG4gICAgaXNUb3BNb2RhbDogKCkgPT4gbW9kYWxNYW5hZ2VyLmlzVG9wTW9kYWwobW9kYWwuY3VycmVudCksXG4gICAgc2V0RGlhbG9nUmVmOiB1c2VDYWxsYmFjayhyZWYgPT4ge1xuICAgICAgbW9kYWwuY3VycmVudC5kaWFsb2cgPSByZWY7XG4gICAgfSwgW10pLFxuICAgIHNldEJhY2tkcm9wUmVmOiB1c2VDYWxsYmFjayhyZWYgPT4ge1xuICAgICAgbW9kYWwuY3VycmVudC5iYWNrZHJvcCA9IHJlZjtcbiAgICB9LCBbXSlcbiAgfSk7XG59XG5cbmNvbnN0IE1vZGFsID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIHNob3cgPSBmYWxzZSxcbiAgICByb2xlID0gJ2RpYWxvZycsXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIGNoaWxkcmVuLFxuICAgIGJhY2tkcm9wID0gdHJ1ZSxcbiAgICBrZXlib2FyZCA9IHRydWUsXG4gICAgb25CYWNrZHJvcENsaWNrLFxuICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICB0cmFuc2l0aW9uLFxuICAgIGJhY2tkcm9wVHJhbnNpdGlvbixcbiAgICBhdXRvRm9jdXMgPSB0cnVlLFxuICAgIGVuZm9yY2VGb2N1cyA9IHRydWUsXG4gICAgcmVzdG9yZUZvY3VzID0gdHJ1ZSxcbiAgICByZXN0b3JlRm9jdXNPcHRpb25zLFxuICAgIHJlbmRlckRpYWxvZyxcbiAgICByZW5kZXJCYWNrZHJvcCA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSksXG4gICAgbWFuYWdlcjogcHJvdmlkZWRNYW5hZ2VyLFxuICAgIGNvbnRhaW5lcjogY29udGFpbmVyUmVmLFxuICAgIG9uU2hvdyxcbiAgICBvbkhpZGUgPSAoKSA9PiB7fSxcbiAgICBvbkV4aXQsXG4gICAgb25FeGl0ZWQsXG4gICAgb25FeGl0aW5nLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlcmluZyxcbiAgICBvbkVudGVyZWRcbiAgfSA9IF9yZWYsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBjb250YWluZXIgPSB1c2VXYWl0Rm9yRE9NUmVmKGNvbnRhaW5lclJlZik7XG4gIGNvbnN0IG1vZGFsID0gdXNlTW9kYWxNYW5hZ2VyKHByb3ZpZGVkTWFuYWdlcik7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKTtcbiAgY29uc3QgcHJldlNob3cgPSB1c2VQcmV2aW91cyhzaG93KTtcbiAgY29uc3QgW2V4aXRlZCwgc2V0RXhpdGVkXSA9IHVzZVN0YXRlKCFzaG93KTtcbiAgY29uc3QgbGFzdEZvY3VzUmVmID0gdXNlUmVmKG51bGwpO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gbW9kYWwsIFttb2RhbF0pO1xuXG4gIGlmIChjYW5Vc2VET00gJiYgIXByZXZTaG93ICYmIHNob3cpIHtcbiAgICBsYXN0Rm9jdXNSZWYuY3VycmVudCA9IGFjdGl2ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIGlmICghdHJhbnNpdGlvbiAmJiAhc2hvdyAmJiAhZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKHRydWUpO1xuICB9IGVsc2UgaWYgKHNob3cgJiYgZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNob3cgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBtb2RhbC5hZGQoKTtcbiAgICByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2tleWRvd24nLCBoYW5kbGVEb2N1bWVudEtleURvd24pO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2ZvY3VzJywgLy8gdGhlIHRpbWVvdXQgaXMgbmVjZXNzYXJ5IGIvYyB0aGlzIHdpbGwgcnVuIGJlZm9yZSB0aGUgbmV3IG1vZGFsIGlzIG1vdW50ZWRcbiAgICAvLyBhbmQgc28gc3RlYWxzIGZvY3VzIGZyb20gaXRcbiAgICAoKSA9PiBzZXRUaW1lb3V0KGhhbmRsZUVuZm9yY2VGb2N1cyksIHRydWUpO1xuXG4gICAgaWYgKG9uU2hvdykge1xuICAgICAgb25TaG93KCk7XG4gICAgfSAvLyBhdXRvZm9jdXMgYWZ0ZXIgb25TaG93IHRvIG5vdCB0cmlnZ2VyIGEgZm9jdXMgZXZlbnQgZm9yIHByZXZpb3VzXG4gICAgLy8gbW9kYWxzIGJlZm9yZSB0aGlzIG9uZSBpcyBzaG93bi5cblxuXG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgY29uc3QgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KGRvY3VtZW50KTtcblxuICAgICAgaWYgKG1vZGFsLmRpYWxvZyAmJiBjdXJyZW50QWN0aXZlRWxlbWVudCAmJiAhY29udGFpbnMobW9kYWwuZGlhbG9nLCBjdXJyZW50QWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgbGFzdEZvY3VzUmVmLmN1cnJlbnQgPSBjdXJyZW50QWN0aXZlRWxlbWVudDtcbiAgICAgICAgbW9kYWwuZGlhbG9nLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgIHJlbW92ZUtleWRvd25MaXN0ZW5lclJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCgpO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlRm9jdXNMaXN0ZW5lclJlZi5jdXJyZW50KCk7XG5cbiAgICBpZiAocmVzdG9yZUZvY3VzKSB7XG4gICAgICB2YXIgX2xhc3RGb2N1c1JlZiRjdXJyZW50O1xuXG4gICAgICAvLyBTdXBwb3J0OiA8PUlFMTEgZG9lc24ndCBzdXBwb3J0IGBmb2N1cygpYCBvbiBzdmcgZWxlbWVudHMgKFJCOiAjOTE3KVxuICAgICAgKF9sYXN0Rm9jdXNSZWYkY3VycmVudCA9IGxhc3RGb2N1c1JlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2xhc3RGb2N1c1JlZiRjdXJyZW50LmZvY3VzID09IG51bGwgPyB2b2lkIDAgOiBfbGFzdEZvY3VzUmVmJGN1cnJlbnQuZm9jdXMocmVzdG9yZUZvY3VzT3B0aW9ucyk7XG4gICAgICBsYXN0Rm9jdXNSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9KTsgLy8gVE9ETzogdHJ5IGFuZCBjb21iaW5lIHRoZXNlIGVmZmVjdHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3Qtb3ZlcmxheXMvcHVsbC83OTQjZGlzY3Vzc2lvbl9yNDA5OTU0MTIwXG4gIC8vIFNob3cgbG9naWMgd2hlbjpcbiAgLy8gIC0gc2hvdyBpcyBgdHJ1ZWAgX2FuZF8gYGNvbnRhaW5lcmAgaGFzIHJlc29sdmVkXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3cgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGhhbmRsZVNob3coKTtcbiAgfSwgW3Nob3csIGNvbnRhaW5lcixcbiAgLyogc2hvdWxkIG5ldmVyIGNoYW5nZTogKi9cbiAgaGFuZGxlU2hvd10pOyAvLyBIaWRlIGNsZWFudXAgbG9naWMgd2hlbjpcbiAgLy8gIC0gYGV4aXRlZGAgc3dpdGNoZXMgdG8gdHJ1ZVxuICAvLyAgLSBjb21wb25lbnQgdW5tb3VudHM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWV4aXRlZCkgcmV0dXJuO1xuICAgIGhhbmRsZUhpZGUoKTtcbiAgfSwgW2V4aXRlZCwgaGFuZGxlSGlkZV0pO1xuICB1c2VXaWxsVW5tb3VudCgoKSA9PiB7XG4gICAgaGFuZGxlSGlkZSgpO1xuICB9KTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb25zdCBoYW5kbGVFbmZvcmNlRm9jdXMgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWVuZm9yY2VGb2N1cyB8fCAhaXNNb3VudGVkKCkgfHwgIW1vZGFsLmlzVG9wTW9kYWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudCgpO1xuXG4gICAgaWYgKG1vZGFsLmRpYWxvZyAmJiBjdXJyZW50QWN0aXZlRWxlbWVudCAmJiAhY29udGFpbnMobW9kYWwuZGlhbG9nLCBjdXJyZW50QWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIG1vZGFsLmRpYWxvZy5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25CYWNrZHJvcENsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkJhY2tkcm9wQ2xpY2soZSk7XG5cbiAgICBpZiAoYmFja2Ryb3AgPT09IHRydWUpIHtcbiAgICAgIG9uSGlkZSgpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGhhbmRsZURvY3VtZW50S2V5RG93biA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKGtleWJvYXJkICYmIGUua2V5Q29kZSA9PT0gMjcgJiYgbW9kYWwuaXNUb3BNb2RhbCgpKSB7XG4gICAgICBvbkVzY2FwZUtleURvd24gPT0gbnVsbCA/IHZvaWQgMCA6IG9uRXNjYXBlS2V5RG93bihlKTtcblxuICAgICAgaWYgKCFlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgb25IaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVtb3ZlRm9jdXNMaXN0ZW5lclJlZiA9IHVzZVJlZigpO1xuICBjb25zdCByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYgPSB1c2VSZWYoKTtcblxuICBjb25zdCBoYW5kbGVIaWRkZW4gPSAoLi4uYXJncykgPT4ge1xuICAgIHNldEV4aXRlZCh0cnVlKTtcbiAgICBvbkV4aXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0ZWQoLi4uYXJncyk7XG4gIH07XG5cbiAgY29uc3QgVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG5cbiAgaWYgKCFjb250YWluZXIgfHwgIShzaG93IHx8IFRyYW5zaXRpb24gJiYgIWV4aXRlZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRpYWxvZ1Byb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcm9sZSxcbiAgICByZWY6IG1vZGFsLnNldERpYWxvZ1JlZixcbiAgICAvLyBhcHBhcmVudGx5IG9ubHkgd29ya3Mgb24gdGhlIGRpYWxvZyByb2xlIGVsZW1lbnRcbiAgICAnYXJpYS1tb2RhbCc6IHJvbGUgPT09ICdkaWFsb2cnID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9LCByZXN0LCB7XG4gICAgc3R5bGUsXG4gICAgY2xhc3NOYW1lLFxuICAgIHRhYkluZGV4OiAtMVxuICB9KTtcbiAgbGV0IGRpYWxvZyA9IHJlbmRlckRpYWxvZyA/IHJlbmRlckRpYWxvZyhkaWFsb2dQcm9wcykgOiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBkaWFsb2dQcm9wcywge1xuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByb2xlOiAnZG9jdW1lbnQnXG4gICAgfSlcbiAgfSkpO1xuXG4gIGlmIChUcmFuc2l0aW9uKSB7XG4gICAgZGlhbG9nID0gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgYXBwZWFyOiB0cnVlLFxuICAgICAgdW5tb3VudE9uRXhpdDogdHJ1ZSxcbiAgICAgIGluOiAhIXNob3csXG4gICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgb25FeGl0ZWQ6IGhhbmRsZUhpZGRlbixcbiAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBjaGlsZHJlbjogZGlhbG9nXG4gICAgfSk7XG4gIH1cblxuICBsZXQgYmFja2Ryb3BFbGVtZW50ID0gbnVsbDtcblxuICBpZiAoYmFja2Ryb3ApIHtcbiAgICBjb25zdCBCYWNrZHJvcFRyYW5zaXRpb24gPSBiYWNrZHJvcFRyYW5zaXRpb247XG4gICAgYmFja2Ryb3BFbGVtZW50ID0gcmVuZGVyQmFja2Ryb3Aoe1xuICAgICAgcmVmOiBtb2RhbC5zZXRCYWNrZHJvcFJlZixcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUJhY2tkcm9wQ2xpY2tcbiAgICB9KTtcblxuICAgIGlmIChCYWNrZHJvcFRyYW5zaXRpb24pIHtcbiAgICAgIGJhY2tkcm9wRWxlbWVudCA9IC8qI19fUFVSRV9fKi9fanN4KEJhY2tkcm9wVHJhbnNpdGlvbiwge1xuICAgICAgICBhcHBlYXI6IHRydWUsXG4gICAgICAgIGluOiAhIXNob3csXG4gICAgICAgIGNoaWxkcmVuOiBiYWNrZHJvcEVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL1JlYWN0RE9NLmNyZWF0ZVBvcnRhbCggLyojX19QVVJFX18qL19qc3hzKF9GcmFnbWVudCwge1xuICAgICAgY2hpbGRyZW46IFtiYWNrZHJvcEVsZW1lbnQsIGRpYWxvZ11cbiAgICB9KSwgY29udGFpbmVyKVxuICB9KTtcbn0pO1xuTW9kYWwuZGlzcGxheU5hbWUgPSAnTW9kYWwnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihNb2RhbCwge1xuICBNYW5hZ2VyOiBNb2RhbE1hbmFnZXJcbn0pOyIsImltcG9ydCBjc3MgZnJvbSAnZG9tLWhlbHBlcnMvY3NzJztcbmltcG9ydCB7IGRhdGFBdHRyIH0gZnJvbSAnLi9EYXRhS2V5JztcbmltcG9ydCBnZXRCb2R5U2Nyb2xsYmFyV2lkdGggZnJvbSAnLi9nZXRTY3JvbGxiYXJXaWR0aCc7XG5leHBvcnQgY29uc3QgT1BFTl9EQVRBX0FUVFJJQlVURSA9IGRhdGFBdHRyKCdtb2RhbC1vcGVuJyk7XG4vKipcbiAqIE1hbmFnZXMgYSBzdGFjayBvZiBNb2RhbHMgYXMgd2VsbCBhcyBlbnN1cmluZ1xuICogYm9keSBzY3JvbGxpbmcgaXMgaXMgZGlzYWJsZWQgYW5kIHBhZGRpbmcgYWNjb3VudGVkIGZvclxuICovXG5cbmNsYXNzIE1vZGFsTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50LFxuICAgIGhhbmRsZUNvbnRhaW5lck92ZXJmbG93ID0gdHJ1ZSxcbiAgICBpc1JUTCA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cgPSBoYW5kbGVDb250YWluZXJPdmVyZmxvdztcbiAgICB0aGlzLmlzUlRMID0gaXNSVEw7XG4gICAgdGhpcy5tb2RhbHMgPSBbXTtcbiAgICB0aGlzLm93bmVyRG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG5cbiAgZ2V0U2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgcmV0dXJuIGdldEJvZHlTY3JvbGxiYXJXaWR0aCh0aGlzLm93bmVyRG9jdW1lbnQpO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gKHRoaXMub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuYm9keTtcbiAgfVxuXG4gIHNldE1vZGFsQXR0cmlidXRlcyhfbW9kYWwpIHsvLyBGb3Igb3ZlcnJpZGluZ1xuICB9XG5cbiAgcmVtb3ZlTW9kYWxBdHRyaWJ1dGVzKF9tb2RhbCkgey8vIEZvciBvdmVycmlkaW5nXG4gIH1cblxuICBzZXRDb250YWluZXJTdHlsZShjb250YWluZXJTdGF0ZSkge1xuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTsgLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgYWN0dWFsIGBzdHlsZWAgaGVyZVxuICAgIC8vIGJlY2F1c2Ugd2Ugd2lsbCBvdmVycmlkZSBpdFxuXG4gICAgY29uc3QgcGFkZGluZ1Byb3AgPSB0aGlzLmlzUlRMID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIGNvbnRhaW5lclN0YXRlLnN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3c6IGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyxcbiAgICAgIFtwYWRkaW5nUHJvcF06IGNvbnRhaW5lci5zdHlsZVtwYWRkaW5nUHJvcF1cbiAgICB9O1xuXG4gICAgaWYgKGNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSB7XG4gICAgICAvLyB1c2UgY29tcHV0ZWQgc3R5bGUsIGhlcmUgdG8gZ2V0IHRoZSByZWFsIHBhZGRpbmdcbiAgICAgIC8vIHRvIGFkZCBvdXIgc2Nyb2xsYmFyIHdpZHRoXG4gICAgICBzdHlsZVtwYWRkaW5nUHJvcF0gPSBgJHtwYXJzZUludChjc3MoY29udGFpbmVyLCBwYWRkaW5nUHJvcCkgfHwgJzAnLCAxMCkgKyBjb250YWluZXJTdGF0ZS5zY3JvbGxCYXJXaWR0aH1weGA7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShPUEVOX0RBVEFfQVRUUklCVVRFLCAnJyk7XG4gICAgY3NzKGNvbnRhaW5lciwgc3R5bGUpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgWy4uLnRoaXMubW9kYWxzXS5mb3JFYWNoKG0gPT4gdGhpcy5yZW1vdmUobSkpO1xuICB9XG5cbiAgcmVtb3ZlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKE9QRU5fREFUQV9BVFRSSUJVVEUpO1xuICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyLnN0eWxlLCBjb250YWluZXJTdGF0ZS5zdHlsZSk7XG4gIH1cblxuICBhZGQobW9kYWwpIHtcbiAgICBsZXQgbW9kYWxJZHggPSB0aGlzLm1vZGFscy5pbmRleE9mKG1vZGFsKTtcblxuICAgIGlmIChtb2RhbElkeCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmxlbmd0aDtcbiAgICB0aGlzLm1vZGFscy5wdXNoKG1vZGFsKTtcbiAgICB0aGlzLnNldE1vZGFsQXR0cmlidXRlcyhtb2RhbCk7XG5cbiAgICBpZiAobW9kYWxJZHggIT09IDApIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2Nyb2xsQmFyV2lkdGg6IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGgoKSxcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdykge1xuICAgICAgdGhpcy5zZXRDb250YWluZXJTdHlsZSh0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kYWxJZHg7XG4gIH1cblxuICByZW1vdmUobW9kYWwpIHtcbiAgICBjb25zdCBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmluZGV4T2YobW9kYWwpO1xuXG4gICAgaWYgKG1vZGFsSWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubW9kYWxzLnNwbGljZShtb2RhbElkeCwgMSk7IC8vIGlmIHRoYXQgd2FzIHRoZSBsYXN0IG1vZGFsIGluIGEgY29udGFpbmVyLFxuICAgIC8vIGNsZWFuIHVwIHRoZSBjb250YWluZXJcblxuICAgIGlmICghdGhpcy5tb2RhbHMubGVuZ3RoICYmIHRoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMucmVtb3ZlQ29udGFpbmVyU3R5bGUodGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVNb2RhbEF0dHJpYnV0ZXMobW9kYWwpO1xuICB9XG5cbiAgaXNUb3BNb2RhbChtb2RhbCkge1xuICAgIHJldHVybiAhIXRoaXMubW9kYWxzLmxlbmd0aCAmJiB0aGlzLm1vZGFsc1t0aGlzLm1vZGFscy5sZW5ndGggLSAxXSA9PT0gbW9kYWw7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNb2RhbE1hbmFnZXI7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJvblNlbGVjdFwiLCBcImFjdGl2ZUtleVwiLCBcInJvbGVcIiwgXCJvbktleURvd25cIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IE5hdkNvbnRleHQgZnJvbSAnLi9OYXZDb250ZXh0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgeyBkYXRhQXR0ciwgZGF0YVByb3AgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuY29uc3QgRVZFTlRfS0VZX0FUVFIgPSBkYXRhQXR0cignZXZlbnQta2V5Jyk7XG5jb25zdCBOYXYgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBvblNlbGVjdCxcbiAgICBhY3RpdmVLZXksXG4gICAgcm9sZSxcbiAgICBvbktleURvd25cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgLy8gQSByZWYgYW5kIGZvcmNlVXBkYXRlIGZvciByZWZvY3VzLCBiL2Mgd2Ugb25seSB3YW50IHRvIHRyaWdnZXIgd2hlbiBuZWVkZWRcbiAgLy8gYW5kIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIHNldCBpbiB0aGUgZWZmZWN0XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgbmVlZHNSZWZvY3VzUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcGFyZW50T25TZWxlY3QgPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdGFiQ29udGV4dCA9IHVzZUNvbnRleHQoVGFiQ29udGV4dCk7XG4gIGxldCBnZXRDb250cm9sbGVkSWQsIGdldENvbnRyb2xsZXJJZDtcblxuICBpZiAodGFiQ29udGV4dCkge1xuICAgIHJvbGUgPSByb2xlIHx8ICd0YWJsaXN0JztcbiAgICBhY3RpdmVLZXkgPSB0YWJDb250ZXh0LmFjdGl2ZUtleTsgLy8gVE9ETzogZG8gd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlc2U/XG5cbiAgICBnZXRDb250cm9sbGVkSWQgPSB0YWJDb250ZXh0LmdldENvbnRyb2xsZWRJZDtcbiAgICBnZXRDb250cm9sbGVySWQgPSB0YWJDb250ZXh0LmdldENvbnRyb2xsZXJJZDtcbiAgfVxuXG4gIGNvbnN0IGxpc3ROb2RlID0gdXNlUmVmKG51bGwpO1xuXG4gIGNvbnN0IGdldE5leHRBY3RpdmVUYWIgPSBvZmZzZXQgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRMaXN0Tm9kZSA9IGxpc3ROb2RlLmN1cnJlbnQ7XG4gICAgaWYgKCFjdXJyZW50TGlzdE5vZGUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gcXNhKGN1cnJlbnRMaXN0Tm9kZSwgYFske0VWRU5UX0tFWV9BVFRSfV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKWApO1xuICAgIGNvbnN0IGFjdGl2ZUNoaWxkID0gY3VycmVudExpc3ROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLXNlbGVjdGVkPXRydWVdJyk7XG4gICAgaWYgKCFhY3RpdmVDaGlsZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW5kZXggPSBpdGVtcy5pbmRleE9mKGFjdGl2ZUNoaWxkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgbmV4dEluZGV4ID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgaWYgKG5leHRJbmRleCA+PSBpdGVtcy5sZW5ndGgpIG5leHRJbmRleCA9IDA7XG4gICAgaWYgKG5leHRJbmRleCA8IDApIG5leHRJbmRleCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGl0ZW1zW25leHRJbmRleF07XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKGtleSwgZXZlbnQpID0+IHtcbiAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybjtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3Qoa2V5LCBldmVudCk7XG4gICAgcGFyZW50T25TZWxlY3QgPT0gbnVsbCA/IHZvaWQgMCA6IHBhcmVudE9uU2VsZWN0KGtleSwgZXZlbnQpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSBldmVudCA9PiB7XG4gICAgb25LZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbktleURvd24oZXZlbnQpO1xuXG4gICAgaWYgKCF0YWJDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5leHRBY3RpdmVDaGlsZDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIG5leHRBY3RpdmVDaGlsZCA9IGdldE5leHRBY3RpdmVUYWIoLTEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBuZXh0QWN0aXZlQ2hpbGQgPSBnZXROZXh0QWN0aXZlVGFiKDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbmV4dEFjdGl2ZUNoaWxkKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBoYW5kbGVTZWxlY3QobmV4dEFjdGl2ZUNoaWxkLmRhdGFzZXRbZGF0YVByb3AoJ0V2ZW50S2V5JyldIHx8IG51bGwsIGV2ZW50KTtcbiAgICBuZWVkc1JlZm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsaXN0Tm9kZS5jdXJyZW50ICYmIG5lZWRzUmVmb2N1c1JlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBhY3RpdmVDaGlsZCA9IGxpc3ROb2RlLmN1cnJlbnQucXVlcnlTZWxlY3RvcihgWyR7RVZFTlRfS0VZX0FUVFJ9XVthcmlhLXNlbGVjdGVkPXRydWVdYCk7XG4gICAgICBhY3RpdmVDaGlsZCA9PSBudWxsID8gdm9pZCAwIDogYWN0aXZlQ2hpbGQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBuZWVkc1JlZm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhyZWYsIGxpc3ROb2RlKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGhhbmRsZVNlbGVjdCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goTmF2Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgcm9sZSxcbiAgICAgICAgLy8gdXNlZCBieSBOYXZMaW5rIHRvIGRldGVybWluZSBpdCdzIHJvbGVcbiAgICAgICAgYWN0aXZlS2V5OiBtYWtlRXZlbnRLZXkoYWN0aXZlS2V5KSxcbiAgICAgICAgZ2V0Q29udHJvbGxlZElkOiBnZXRDb250cm9sbGVkSWQgfHwgbm9vcCxcbiAgICAgICAgZ2V0Q29udHJvbGxlcklkOiBnZXRDb250cm9sbGVySWQgfHwgbm9vcFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgICAgIHJvbGU6IHJvbGVcbiAgICAgIH0pKVxuICAgIH0pXG4gIH0pO1xufSk7XG5OYXYuZGlzcGxheU5hbWUgPSAnTmF2JztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2LCB7XG4gIEl0ZW06IE5hdkl0ZW1cbn0pOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IE5hdkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbk5hdkNvbnRleHQuZGlzcGxheU5hbWUgPSAnTmF2Q29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBOYXZDb250ZXh0OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImFzXCIsIFwiYWN0aXZlXCIsIFwiZXZlbnRLZXlcIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IE5hdkNvbnRleHQgZnJvbSAnLi9OYXZDb250ZXh0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IHsgZGF0YUF0dHIgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VOYXZJdGVtKHtcbiAga2V5LFxuICBvbkNsaWNrLFxuICBhY3RpdmUsXG4gIGlkLFxuICByb2xlLFxuICBkaXNhYmxlZFxufSkge1xuICBjb25zdCBwYXJlbnRPblNlbGVjdCA9IHVzZUNvbnRleHQoU2VsZWN0YWJsZUNvbnRleHQpO1xuICBjb25zdCBuYXZDb250ZXh0ID0gdXNlQ29udGV4dChOYXZDb250ZXh0KTtcbiAgbGV0IGlzQWN0aXZlID0gYWN0aXZlO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICByb2xlXG4gIH07XG5cbiAgaWYgKG5hdkNvbnRleHQpIHtcbiAgICBpZiAoIXJvbGUgJiYgbmF2Q29udGV4dC5yb2xlID09PSAndGFibGlzdCcpIHByb3BzLnJvbGUgPSAndGFiJztcbiAgICBjb25zdCBjb250ZXh0Q29udHJvbGxlcklkID0gbmF2Q29udGV4dC5nZXRDb250cm9sbGVySWQoa2V5ICE9IG51bGwgPyBrZXkgOiBudWxsKTtcbiAgICBjb25zdCBjb250ZXh0Q29udHJvbGxlZElkID0gbmF2Q29udGV4dC5nZXRDb250cm9sbGVkSWQoa2V5ICE9IG51bGwgPyBrZXkgOiBudWxsKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcHJvcHNbZGF0YUF0dHIoJ2V2ZW50LWtleScpXSA9IGtleTtcbiAgICBwcm9wcy5pZCA9IGNvbnRleHRDb250cm9sbGVySWQgfHwgaWQ7XG4gICAgcHJvcHNbJ2FyaWEtY29udHJvbHMnXSA9IGNvbnRleHRDb250cm9sbGVkSWQ7XG4gICAgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG5hdkNvbnRleHQuYWN0aXZlS2V5ID09PSBrZXkgOiBhY3RpdmU7XG4gIH1cblxuICBpZiAocHJvcHMucm9sZSA9PT0gJ3RhYicpIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHByb3BzLnRhYkluZGV4ID0gLTE7XG4gICAgICBwcm9wc1snYXJpYS1kaXNhYmxlZCddID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIHByb3BzWydhcmlhLXNlbGVjdGVkJ10gPSBpc0FjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gIH1cblxuICBwcm9wcy5vbkNsaWNrID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGUpO1xuXG4gICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudE9uU2VsZWN0ICYmICFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHBhcmVudE9uU2VsZWN0KGtleSwgZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFtwcm9wcywge1xuICAgIGlzQWN0aXZlXG4gIH1dO1xufVxuY29uc3QgTmF2SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICBhczogQ29tcG9uZW50ID0gQnV0dG9uLFxuICAgIGFjdGl2ZSxcbiAgICBldmVudEtleVxuICB9ID0gX3JlZixcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IFtwcm9wcywgbWV0YV0gPSB1c2VOYXZJdGVtKE9iamVjdC5hc3NpZ24oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBvcHRpb25zLmhyZWYpLFxuICAgIGFjdGl2ZVxuICB9LCBvcHRpb25zKSk7IC8vIEB0cy1pZ25vcmVcblxuICBwcm9wc1tkYXRhQXR0cignYWN0aXZlJyldID0gbWV0YS5pc0FjdGl2ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgcHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSk7XG59KTtcbk5hdkl0ZW0uZGlzcGxheU5hbWUgPSAnTmF2SXRlbSc7XG5leHBvcnQgZGVmYXVsdCBOYXZJdGVtOyIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBOb29wVHJhbnNpdGlvbih7XG4gIGNoaWxkcmVuLFxuICBpbjogaW5Qcm9wLFxuICBtb3VudE9uRW50ZXIsXG4gIHVubW91bnRPbkV4aXRcbn0pIHtcbiAgY29uc3QgaGFzRW50ZXJlZFJlZiA9IHVzZVJlZihpblByb3ApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpblByb3ApIGhhc0VudGVyZWRSZWYuY3VycmVudCA9IHRydWU7XG4gIH0sIFtpblByb3BdKTtcbiAgaWYgKGluUHJvcCkgcmV0dXJuIGNoaWxkcmVuOyAvLyBub3QgaW5cbiAgLy9cbiAgLy8gaWYgKCFtb3VudE9uRW50ZXIgJiYgIXVubW91bnRPbkV4aXQpIHtcbiAgLy8gICByZXR1cm4gY2hpbGRyZW47XG4gIC8vIH1cblxuICBpZiAodW5tb3VudE9uRXhpdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFoYXNFbnRlcmVkUmVmLmN1cnJlbnQgJiYgbW91bnRPbkVudGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vb3BUcmFuc2l0aW9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHVzZUNhbGxiYWNrUmVmIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUNhbGxiYWNrUmVmJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlUG9wcGVyIGZyb20gJy4vdXNlUG9wcGVyJztcbmltcG9ydCB1c2VSb290Q2xvc2UgZnJvbSAnLi91c2VSb290Q2xvc2UnO1xuaW1wb3J0IHVzZVdhaXRGb3JET01SZWYgZnJvbSAnLi91c2VXYWl0Rm9yRE9NUmVmJztcbmltcG9ydCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnIGZyb20gJy4vbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKipcbiAqIEJ1aWx0IG9uIHRvcCBvZiBgUG9wcGVyLmpzYCwgdGhlIG92ZXJsYXkgY29tcG9uZW50IGlzXG4gKiBncmVhdCBmb3IgY3VzdG9tIHRvb2x0aXAgb3ZlcmxheXMuXG4gKi9cbmNvbnN0IE92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIG91dGVyUmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmbGlwLFxuICAgIG9mZnNldCxcbiAgICBwbGFjZW1lbnQsXG4gICAgY29udGFpbmVyUGFkZGluZyxcbiAgICBwb3BwZXJDb25maWcgPSB7fSxcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW3Jvb3RFbGVtZW50LCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWYoKTtcbiAgY29uc3QgW2Fycm93RWxlbWVudCwgYXR0YWNoQXJyb3dSZWZdID0gdXNlQ2FsbGJhY2tSZWYoKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhhdHRhY2hSZWYsIG91dGVyUmVmKTtcbiAgY29uc3QgY29udGFpbmVyID0gdXNlV2FpdEZvckRPTVJlZihwcm9wcy5jb250YWluZXIpO1xuICBjb25zdCB0YXJnZXQgPSB1c2VXYWl0Rm9yRE9NUmVmKHByb3BzLnRhcmdldCk7XG4gIGNvbnN0IFtleGl0ZWQsIHNldEV4aXRlZF0gPSB1c2VTdGF0ZSghcHJvcHMuc2hvdyk7XG4gIGNvbnN0IHBvcHBlciA9IHVzZVBvcHBlcih0YXJnZXQsIHJvb3RFbGVtZW50LCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnKHtcbiAgICBwbGFjZW1lbnQsXG4gICAgZW5hYmxlRXZlbnRzOiAhIXByb3BzLnNob3csXG4gICAgY29udGFpbmVyUGFkZGluZzogY29udGFpbmVyUGFkZGluZyB8fCA1LFxuICAgIGZsaXAsXG4gICAgb2Zmc2V0LFxuICAgIGFycm93RWxlbWVudCxcbiAgICBwb3BwZXJDb25maWdcbiAgfSkpO1xuXG4gIGlmIChwcm9wcy5zaG93KSB7XG4gICAgaWYgKGV4aXRlZCkgc2V0RXhpdGVkKGZhbHNlKTtcbiAgfSBlbHNlIGlmICghcHJvcHMudHJhbnNpdGlvbiAmJiAhZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKHRydWUpO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlSGlkZGVuID0gKC4uLmFyZ3MpID0+IHtcbiAgICBzZXRFeGl0ZWQodHJ1ZSk7XG5cbiAgICBpZiAocHJvcHMub25FeGl0ZWQpIHtcbiAgICAgIHByb3BzLm9uRXhpdGVkKC4uLmFyZ3MpO1xuICAgIH1cbiAgfTsgLy8gRG9uJ3QgdW4tcmVuZGVyIHRoZSBvdmVybGF5IHdoaWxlIGl0J3MgdHJhbnNpdGlvbmluZyBvdXQuXG5cblxuICBjb25zdCBtb3VudE92ZXJsYXkgPSBwcm9wcy5zaG93IHx8IFRyYW5zaXRpb24gJiYgIWV4aXRlZDtcbiAgdXNlUm9vdENsb3NlKHJvb3RFbGVtZW50LCBwcm9wcy5vbkhpZGUsIHtcbiAgICBkaXNhYmxlZDogIXByb3BzLnJvb3RDbG9zZSB8fCBwcm9wcy5yb290Q2xvc2VEaXNhYmxlZCxcbiAgICBjbGlja1RyaWdnZXI6IHByb3BzLnJvb3RDbG9zZUV2ZW50XG4gIH0pO1xuXG4gIGlmICghbW91bnRPdmVybGF5KSB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIHNob3dpbmcgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSB0by5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjaGlsZCA9IHByb3BzLmNoaWxkcmVuKE9iamVjdC5hc3NpZ24oe30sIHBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgIHN0eWxlOiBwb3BwZXIuc3R5bGVzLnBvcHBlcixcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9KSwge1xuICAgIHBvcHBlcixcbiAgICBwbGFjZW1lbnQsXG4gICAgc2hvdzogISFwcm9wcy5zaG93LFxuICAgIGFycm93UHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHBvcHBlci5hdHRyaWJ1dGVzLmFycm93LCB7XG4gICAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5hcnJvdyxcbiAgICAgIHJlZjogYXR0YWNoQXJyb3dSZWZcbiAgICB9KVxuICB9KTtcblxuICBpZiAoVHJhbnNpdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZyxcbiAgICAgIG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkXG4gICAgfSA9IHByb3BzO1xuICAgIGNoaWxkID0gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgaW46IHByb3BzLnNob3csXG4gICAgICBhcHBlYXI6IHRydWUsXG4gICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgb25FeGl0ZWQ6IGhhbmRsZUhpZGRlbixcbiAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBjaGlsZHJlbjogY2hpbGRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250YWluZXIgPyAvKiNfX1BVUkVfXyovUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkLCBjb250YWluZXIpIDogbnVsbDtcbn0pO1xuT3ZlcmxheS5kaXNwbGF5TmFtZSA9ICdPdmVybGF5JztcbmV4cG9ydCBkZWZhdWx0IE92ZXJsYXk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgU2VsZWN0YWJsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBjb25zdCBtYWtlRXZlbnRLZXkgPSAoZXZlbnRLZXksIGhyZWYgPSBudWxsKSA9PiB7XG4gIGlmIChldmVudEtleSAhPSBudWxsKSByZXR1cm4gU3RyaW5nKGV2ZW50S2V5KTtcbiAgcmV0dXJuIGhyZWYgfHwgbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBTZWxlY3RhYmxlQ29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUYWJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBUYWJDb250ZXh0OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImFjdGl2ZVwiLCBcImV2ZW50S2V5XCIsIFwibW91bnRPbkVudGVyXCIsIFwidHJhbnNpdGlvblwiLCBcInVubW91bnRPbkV4aXRcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiYWN0aXZlS2V5XCIsIFwiZ2V0Q29udHJvbGxlZElkXCIsIFwiZ2V0Q29udHJvbGxlcklkXCJdLFxuICAgICAgX2V4Y2x1ZGVkMyA9IFtcImFzXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tICcuL1RhYkNvbnRleHQnO1xuaW1wb3J0IFNlbGVjdGFibGVDb250ZXh0LCB7IG1ha2VFdmVudEtleSB9IGZyb20gJy4vU2VsZWN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IE5vb3BUcmFuc2l0aW9uIGZyb20gJy4vTm9vcFRyYW5zaXRpb24nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUYWJQYW5lbChfcmVmKSB7XG4gIGxldCB7XG4gICAgYWN0aXZlLFxuICAgIGV2ZW50S2V5LFxuICAgIG1vdW50T25FbnRlcixcbiAgICB0cmFuc2l0aW9uLFxuICAgIHVubW91bnRPbkV4aXRcbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVGFiQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkgcmV0dXJuIFtwcm9wcywge1xuICAgIGV2ZW50S2V5LFxuICAgIGlzQWN0aXZlOiBhY3RpdmUsXG4gICAgbW91bnRPbkVudGVyLFxuICAgIHRyYW5zaXRpb24sXG4gICAgdW5tb3VudE9uRXhpdFxuICB9XTtcblxuICBjb25zdCB7XG4gICAgYWN0aXZlS2V5LFxuICAgIGdldENvbnRyb2xsZWRJZCxcbiAgICBnZXRDb250cm9sbGVySWRcbiAgfSA9IGNvbnRleHQsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShjb250ZXh0LCBfZXhjbHVkZWQyKTtcblxuICBjb25zdCBrZXkgPSBtYWtlRXZlbnRLZXkoZXZlbnRLZXkpO1xuICByZXR1cm4gW09iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgaWQ6IGdldENvbnRyb2xsZWRJZChldmVudEtleSksXG4gICAgJ2FyaWEtbGFiZWxsZWRieSc6IGdldENvbnRyb2xsZXJJZChldmVudEtleSlcbiAgfSksIHtcbiAgICBldmVudEtleSxcbiAgICBpc0FjdGl2ZTogYWN0aXZlID09IG51bGwgJiYga2V5ICE9IG51bGwgPyBtYWtlRXZlbnRLZXkoYWN0aXZlS2V5KSA9PT0ga2V5IDogYWN0aXZlLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24gfHwgcmVzdC50cmFuc2l0aW9uLFxuICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyICE9IG51bGwgPyBtb3VudE9uRW50ZXIgOiByZXN0Lm1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0ICE9IG51bGwgPyB1bm1vdW50T25FeGl0IDogcmVzdC51bm1vdW50T25FeGl0XG4gIH1dO1xufVxuY29uc3QgVGFiUGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKF9yZWYyLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdidcbiAgfSA9IF9yZWYyLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMiwgX2V4Y2x1ZGVkMyk7XG5cbiAgY29uc3QgW3RhYlBhbmVsUHJvcHMsIHtcbiAgICBpc0FjdGl2ZSxcbiAgICBvbkVudGVyLFxuICAgIG9uRW50ZXJpbmcsXG4gICAgb25FbnRlcmVkLFxuICAgIG9uRXhpdCxcbiAgICBvbkV4aXRpbmcsXG4gICAgb25FeGl0ZWQsXG4gICAgbW91bnRPbkVudGVyLFxuICAgIHVubW91bnRPbkV4aXQsXG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvbiA9IE5vb3BUcmFuc2l0aW9uXG4gIH1dID0gdXNlVGFiUGFuZWwocHJvcHMpOyAvLyBXZSBwcm92aWRlIGFuIGVtcHR5IHRoZSBUYWJDb250ZXh0IHNvIGA8TmF2PmBzIGluIGA8VGFiUGFuZWw+YHMgZG9uJ3RcbiAgLy8gY29uZmxpY3Qgd2l0aCB0aGUgdG9wIGxldmVsIG9uZS5cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVGFiQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChTZWxlY3RhYmxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgICBpbjogaXNBY3RpdmUsXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICAgIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsXG4gICAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkLFxuICAgICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgICAgb25FeGl0aW5nOiBvbkV4aXRpbmcsXG4gICAgICAgIG9uRXhpdGVkOiBvbkV4aXRlZCxcbiAgICAgICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIsXG4gICAgICAgIHVubW91bnRPbkV4aXQ6IHVubW91bnRPbkV4aXQsXG4gICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHRhYlBhbmVsUHJvcHMsIHtcbiAgICAgICAgICByZWY6IHJlZixcbiAgICAgICAgICByb2xlOiBcInRhYnBhbmVsXCIsXG4gICAgICAgICAgaGlkZGVuOiAhaXNBY3RpdmUsXG4gICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAhaXNBY3RpdmVcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5UYWJQYW5lbC5kaXNwbGF5TmFtZSA9ICdUYWJQYW5lbCc7XG5leHBvcnQgZGVmYXVsdCBUYWJQYW5lbDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB7IHVzZVNTUlNhZmVJZCB9IGZyb20gJy4vc3NyJztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQgZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgVGFiUGFuZWwgZnJvbSAnLi9UYWJQYW5lbCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBUYWJzID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgaWQ6IHVzZXJJZCxcbiAgICBnZW5lcmF0ZUNoaWxkSWQ6IGdlbmVyYXRlQ3VzdG9tQ2hpbGRJZCxcbiAgICBvblNlbGVjdDogcHJvcHNPblNlbGVjdCxcbiAgICBhY3RpdmVLZXk6IHByb3BzQWN0aXZlS2V5LFxuICAgIGRlZmF1bHRBY3RpdmVLZXksXG4gICAgdHJhbnNpdGlvbixcbiAgICBtb3VudE9uRW50ZXIsXG4gICAgdW5tb3VudE9uRXhpdCxcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFthY3RpdmVLZXksIG9uU2VsZWN0XSA9IHVzZVVuY29udHJvbGxlZFByb3AocHJvcHNBY3RpdmVLZXksIGRlZmF1bHRBY3RpdmVLZXksIHByb3BzT25TZWxlY3QpO1xuICBjb25zdCBpZCA9IHVzZVNTUlNhZmVJZCh1c2VySWQpO1xuICBjb25zdCBnZW5lcmF0ZUNoaWxkSWQgPSB1c2VNZW1vKCgpID0+IGdlbmVyYXRlQ3VzdG9tQ2hpbGRJZCB8fCAoKGtleSwgdHlwZSkgPT4gaWQgPyBgJHtpZH0tJHt0eXBlfS0ke2tleX1gIDogbnVsbCksIFtpZCwgZ2VuZXJhdGVDdXN0b21DaGlsZElkXSk7XG4gIGNvbnN0IHRhYkNvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgb25TZWxlY3QsXG4gICAgYWN0aXZlS2V5LFxuICAgIHRyYW5zaXRpb24sXG4gICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIgfHwgZmFsc2UsXG4gICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdCB8fCBmYWxzZSxcbiAgICBnZXRDb250cm9sbGVkSWQ6IGtleSA9PiBnZW5lcmF0ZUNoaWxkSWQoa2V5LCAndGFicGFuZScpLFxuICAgIGdldENvbnRyb2xsZXJJZDoga2V5ID0+IGdlbmVyYXRlQ2hpbGRJZChrZXksICd0YWInKVxuICB9KSwgW29uU2VsZWN0LCBhY3RpdmVLZXksIHRyYW5zaXRpb24sIG1vdW50T25FbnRlciwgdW5tb3VudE9uRXhpdCwgZ2VuZXJhdGVDaGlsZElkXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUYWJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRhYkNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogb25TZWxlY3QgfHwgbnVsbCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufTtcblxuVGFicy5QYW5lbCA9IFRhYlBhbmVsO1xuZXhwb3J0IGRlZmF1bHQgVGFiczsiLCIvKipcbiAqIEdldCB0aGUgd2lkdGggb2YgdGhlIHZlcnRpY2FsIHdpbmRvdyBzY3JvbGxiYXIgaWYgaXQncyB2aXNpYmxlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvZHlTY3JvbGxiYXJXaWR0aChvd25lckRvY3VtZW50ID0gZG9jdW1lbnQpIHtcbiAgY29uc3Qgd2luZG93ID0gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoIC0gb3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO1xufSIsImV4cG9ydCBmdW5jdGlvbiB0b01vZGlmaWVyTWFwKG1vZGlmaWVycykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXJzKSkge1xuICAgIHJldHVybiBtb2RpZmllcnMgfHwgcmVzdWx0O1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuXG4gIG1vZGlmaWVycyA9PSBudWxsID8gdm9pZCAwIDogbW9kaWZpZXJzLmZvckVhY2gobSA9PiB7XG4gICAgcmVzdWx0W20ubmFtZV0gPSBtO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b01vZGlmaWVyQXJyYXkobWFwID0ge30pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobWFwKSkgcmV0dXJuIG1hcDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCkubWFwKGsgPT4ge1xuICAgIG1hcFtrXS5uYW1lID0gaztcbiAgICByZXR1cm4gbWFwW2tdO1xuICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcoe1xuICBlbmFibGVkLFxuICBlbmFibGVFdmVudHMsXG4gIHBsYWNlbWVudCxcbiAgZmxpcCxcbiAgb2Zmc2V0LFxuICBmaXhlZCxcbiAgY29udGFpbmVyUGFkZGluZyxcbiAgYXJyb3dFbGVtZW50LFxuICBwb3BwZXJDb25maWcgPSB7fVxufSkge1xuICB2YXIgX21vZGlmaWVycyRwcmV2ZW50T3ZlLCBfbW9kaWZpZXJzJHByZXZlbnRPdmUyLCBfbW9kaWZpZXJzJG9mZnNldCwgX21vZGlmaWVycyRhcnJvdztcblxuICBjb25zdCBtb2RpZmllcnMgPSB0b01vZGlmaWVyTWFwKHBvcHBlckNvbmZpZy5tb2RpZmllcnMpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyQ29uZmlnLCB7XG4gICAgcGxhY2VtZW50LFxuICAgIGVuYWJsZWQsXG4gICAgc3RyYXRlZ3k6IGZpeGVkID8gJ2ZpeGVkJyA6IHBvcHBlckNvbmZpZy5zdHJhdGVneSxcbiAgICBtb2RpZmllcnM6IHRvTW9kaWZpZXJBcnJheShPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllcnMsIHtcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IGVuYWJsZUV2ZW50c1xuICAgICAgfSxcbiAgICAgIHByZXZlbnRPdmVyZmxvdzogT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdywge1xuICAgICAgICBvcHRpb25zOiBjb250YWluZXJQYWRkaW5nID8gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgcGFkZGluZzogY29udGFpbmVyUGFkZGluZ1xuICAgICAgICB9LCAoX21vZGlmaWVycyRwcmV2ZW50T3ZlID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZS5vcHRpb25zKSA6IChfbW9kaWZpZXJzJHByZXZlbnRPdmUyID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZTIub3B0aW9uc1xuICAgICAgfSksXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIChfbW9kaWZpZXJzJG9mZnNldCA9IG1vZGlmaWVycy5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbW9kaWZpZXJzJG9mZnNldC5vcHRpb25zKVxuICAgICAgfSxcbiAgICAgIGFycm93OiBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllcnMuYXJyb3csIHtcbiAgICAgICAgZW5hYmxlZDogISFhcnJvd0VsZW1lbnQsXG4gICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIChfbW9kaWZpZXJzJGFycm93ID0gbW9kaWZpZXJzLmFycm93KSA9PSBudWxsID8gdm9pZCAwIDogX21vZGlmaWVycyRhcnJvdy5vcHRpb25zLCB7XG4gICAgICAgICAgZWxlbWVudDogYXJyb3dFbGVtZW50XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIGZsaXA6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBlbmFibGVkOiAhIWZsaXBcbiAgICAgIH0sIG1vZGlmaWVycy5mbGlwKVxuICAgIH0pKVxuICB9KTtcbn0iLCJpbXBvcnQgYXJyb3cgZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdyc7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMnO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMnO1xuaW1wb3J0IGZsaXAgZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwJztcbmltcG9ydCBoaWRlIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZSc7XG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0JztcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cyc7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93JztcbmltcG9ydCB7IHBsYWNlbWVudHMgfSBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvZW51bXMnO1xuaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1iYXNlJzsgLy8gRm9yIHRoZSBjb21tb24gSlMgYnVpbGQgd2Ugd2lsbCB0dXJuIHRoaXMgZmlsZSBpbnRvIGEgYnVuZGxlIHdpdGggbm8gaW1wb3J0cy5cbi8vIFRoaXMgaXMgYi9jIHRoZSBQb3BwZXIgbGliIGlzIGFsbCBlc20gZmlsZXMsIGFuZCB3b3VsZCBicmVhayBpbiBhIGNvbW1vbiBqcyBvbmx5IGVudmlyb25tZW50XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQb3BwZXIgPSBwb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBbaGlkZSwgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgZXZlbnRMaXN0ZW5lcnMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvd11cbn0pO1xuZXhwb3J0IHsgcGxhY2VtZW50cyB9OyIsImltcG9ydCB7IHVzZVNTUlNhZmVJZCwgdXNlSXNTU1IsIFNTUlByb3ZpZGVyIH0gZnJvbSAnQHJlYWN0LWFyaWEvc3NyJztcbmV4cG9ydCB7IHVzZVNTUlNhZmVJZCwgdXNlSXNTU1IsIFNTUlByb3ZpZGVyIH07IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZW5hYmxlZFwiLCBcInBsYWNlbWVudFwiLCBcInN0cmF0ZWd5XCIsIFwibW9kaWZpZXJzXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwnO1xuaW1wb3J0IHVzZVNhZmVTdGF0ZSBmcm9tICdAcmVzdGFydC9ob29rcy91c2VTYWZlU3RhdGUnO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSAnLi9wb3BwZXInO1xuY29uc3QgZGlzYWJsZWRBcHBseVN0eWxlc01vZGlmaWVyID0ge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiBmYWxzZSxcbiAgcGhhc2U6ICdhZnRlcldyaXRlJyxcbiAgZm46ICgpID0+IHVuZGVmaW5lZFxufTsgLy8gdW50aWwgZG9janMgc3VwcG9ydHMgdHlwZSBleHBvcnRzLi4uXG5cbmNvbnN0IGFyaWFEZXNjcmliZWRCeU1vZGlmaWVyID0ge1xuICBuYW1lOiAnYXJpYURlc2NyaWJlZEJ5JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdhZnRlcldyaXRlJyxcbiAgZWZmZWN0OiAoe1xuICAgIHN0YXRlXG4gIH0pID0+ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZWZlcmVuY2UsXG4gICAgICBwb3BwZXJcbiAgICB9ID0gc3RhdGUuZWxlbWVudHM7XG5cbiAgICBpZiAoJ3JlbW92ZUF0dHJpYnV0ZScgaW4gcmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCBpZHMgPSAocmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpIHx8ICcnKS5zcGxpdCgnLCcpLmZpbHRlcihpZCA9PiBpZC50cmltKCkgIT09IHBvcHBlci5pZCk7XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHJlZmVyZW5jZS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtlbHNlIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMuam9pbignLCcpKTtcbiAgICB9XG4gIH0sXG4gIGZuOiAoe1xuICAgIHN0YXRlXG4gIH0pID0+IHtcbiAgICB2YXIgX3BvcHBlciRnZXRBdHRyaWJ1dGU7XG5cbiAgICBjb25zdCB7XG4gICAgICBwb3BwZXIsXG4gICAgICByZWZlcmVuY2VcbiAgICB9ID0gc3RhdGUuZWxlbWVudHM7XG4gICAgY29uc3Qgcm9sZSA9IChfcG9wcGVyJGdldEF0dHJpYnV0ZSA9IHBvcHBlci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wb3BwZXIkZ2V0QXR0cmlidXRlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAocG9wcGVyLmlkICYmIHJvbGUgPT09ICd0b29sdGlwJyAmJiAnc2V0QXR0cmlidXRlJyBpbiByZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IGlkcyA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcblxuICAgICAgaWYgKGlkcyAmJiBpZHMuc3BsaXQoJywnKS5pbmRleE9mKHBvcHBlci5pZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVmZXJlbmNlLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcyA/IGAke2lkc30sJHtwb3BwZXIuaWR9YCA6IHBvcHBlci5pZCk7XG4gICAgfVxuICB9XG59O1xuY29uc3QgRU1QVFlfTU9ESUZJRVJTID0gW107XG4vKipcbiAqIFBvc2l0aW9uIGFuIGVsZW1lbnQgcmVsYXRpdmUgc29tZSByZWZlcmVuY2UgZWxlbWVudCB1c2luZyBQb3BwZXIuanNcbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlRWxlbWVudFxuICogQHBhcmFtIHBvcHBlckVsZW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgIG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0PX0gICAgIG9wdGlvbnMubW9kaWZpZXJzIFBvcHBlci5qcyBtb2RpZmllcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19ICAgIG9wdGlvbnMuZW5hYmxlZCB0b2dnbGUgdGhlIHBvcHBlciBmdW5jdGlvbmFsaXR5IG9uL29mZlxuICogQHBhcmFtIHtzdHJpbmc9fSAgICAgb3B0aW9ucy5wbGFjZW1lbnQgVGhlIHBvcHBlciBlbGVtZW50IHBsYWNlbWVudCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gICAgIG9wdGlvbnMuc3RyYXRlZ3kgdGhlIHBvc2l0aW9uaW5nIHN0cmF0ZWd5XG4gKiBAcGFyYW0ge2Z1bmN0aW9uPX0gICBvcHRpb25zLm9uQ3JlYXRlIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgY3JlYXRlZFxuICogQHBhcmFtIHtmdW5jdGlvbj19ICAgb3B0aW9ucy5vblVwZGF0ZSBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWRcbiAqXG4gKiBAcmV0dXJucyB7VXNlUG9wcGVyU3RhdGV9IFRoZSBwb3BwZXIgc3RhdGVcbiAqL1xuXG5mdW5jdGlvbiB1c2VQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgX3JlZiA9IHt9KSB7XG4gIGxldCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1vZGlmaWVycyA9IEVNUFRZX01PRElGSUVSU1xuICB9ID0gX3JlZixcbiAgICAgIGNvbmZpZyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgcHJldk1vZGlmaWVycyA9IHVzZVJlZihtb2RpZmllcnMpO1xuICBjb25zdCBwb3BwZXJJbnN0YW5jZVJlZiA9IHVzZVJlZigpO1xuICBjb25zdCB1cGRhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdmFyIF9wb3BwZXJJbnN0YW5jZVJlZiRjdTtcblxuICAgIChfcG9wcGVySW5zdGFuY2VSZWYkY3UgPSBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3BvcHBlckluc3RhbmNlUmVmJGN1LnVwZGF0ZSgpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZhciBfcG9wcGVySW5zdGFuY2VSZWYkY3UyO1xuXG4gICAgKF9wb3BwZXJJbnN0YW5jZVJlZiRjdTIgPSBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3BvcHBlckluc3RhbmNlUmVmJGN1Mi5mb3JjZVVwZGF0ZSgpO1xuICB9LCBbXSk7XG4gIGNvbnN0IFtwb3BwZXJTdGF0ZSwgc2V0U3RhdGVdID0gdXNlU2FmZVN0YXRlKHVzZVN0YXRlKHtcbiAgICBwbGFjZW1lbnQsXG4gICAgdXBkYXRlLFxuICAgIGZvcmNlVXBkYXRlLFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIHN0eWxlczoge1xuICAgICAgcG9wcGVyOiB7fSxcbiAgICAgIGFycm93OiB7fVxuICAgIH1cbiAgfSkpO1xuICBjb25zdCB1cGRhdGVNb2RpZmllciA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBuYW1lOiAndXBkYXRlU3RhdGVNb2RpZmllcicsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBwaGFzZTogJ3dyaXRlJyxcbiAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ10sXG4gICAgZm46ICh7XG4gICAgICBzdGF0ZVxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIHN0eWxlc1tlbGVtZW50XSA9IHN0YXRlLnN0eWxlc1tlbGVtZW50XTtcbiAgICAgICAgYXR0cmlidXRlc1tlbGVtZW50XSA9IHN0YXRlLmF0dHJpYnV0ZXNbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHN0eWxlcyxcbiAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgdXBkYXRlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIFt1cGRhdGUsIGZvcmNlVXBkYXRlLCBzZXRTdGF0ZV0pO1xuICBjb25zdCBuZXh0TW9kaWZpZXJzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFkZXF1YWwocHJldk1vZGlmaWVycy5jdXJyZW50LCBtb2RpZmllcnMpKSB7XG4gICAgICBwcmV2TW9kaWZpZXJzLmN1cnJlbnQgPSBtb2RpZmllcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZNb2RpZmllcnMuY3VycmVudDtcbiAgfSwgW21vZGlmaWVyc10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCB8fCAhZW5hYmxlZCkgcmV0dXJuO1xuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc2V0T3B0aW9ucyh7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogWy4uLm5leHRNb2RpZmllcnMsIHVwZGF0ZU1vZGlmaWVyLCBkaXNhYmxlZEFwcGx5U3R5bGVzTW9kaWZpZXJdXG4gICAgfSk7XG4gIH0sIFtzdHJhdGVneSwgcGxhY2VtZW50LCB1cGRhdGVNb2RpZmllciwgZW5hYmxlZCwgbmV4dE1vZGlmaWVyc10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCB8fCByZWZlcmVuY2VFbGVtZW50ID09IG51bGwgfHwgcG9wcGVyRWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLCB7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogWy4uLm5leHRNb2RpZmllcnMsIGFyaWFEZXNjcmliZWRCeU1vZGlmaWVyLCB1cGRhdGVNb2RpZmllcl1cbiAgICB9KSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5kZXN0cm95KCk7XG4gICAgICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNldFN0YXRlKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcywge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgcG9wcGVyOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07IC8vIFRoaXMgaXMgb25seSBydW4gb25jZSB0byBfY3JlYXRlXyB0aGUgcG9wcGVyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZW5hYmxlZCwgcmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudF0pO1xuICByZXR1cm4gcG9wcGVyU3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVBvcHBlcjsiLCJpbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0IGxpc3RlbiBmcm9tICdkb20taGVscGVycy9saXN0ZW4nO1xuaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuY29uc3QgZXNjYXBlS2V5Q29kZSA9IDI3O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmZ1bmN0aW9uIGlzTGVmdENsaWNrRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PT0gMDtcbn1cblxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cblxuY29uc3QgZ2V0UmVmVGFyZ2V0ID0gcmVmID0+IHJlZiAmJiAoJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmKTtcblxuLyoqXG4gKiBUaGUgYHVzZVJvb3RDbG9zZWAgaG9vayByZWdpc3RlcnMgeW91ciBjYWxsYmFjayBvbiB0aGUgZG9jdW1lbnRcbiAqIHdoZW4gcmVuZGVyZWQuIFBvd2VycyB0aGUgYDxPdmVybGF5Lz5gIGNvbXBvbmVudC4gVGhpcyBpcyB1c2VkIGFjaGlldmUgbW9kYWxcbiAqIHN0eWxlIGJlaGF2aW9yIHdoZXJlIHlvdXIgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG9cbiAqIGludGVyYWN0IHdpdGggdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50IG9yIGhpdHMgdGhlIGBlc2NgIGtleS5cbiAqXG4gKiBAcGFyYW0ge1JlZjxIVE1MRWxlbWVudD58IEhUTUxFbGVtZW50fSByZWYgIFRoZSBlbGVtZW50IGJvdW5kYXJ5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvblJvb3RDbG9zZVxuICogQHBhcmFtIHtvYmplY3Q9fSAgb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFuPX0gb3B0aW9ucy5kaXNhYmxlZFxuICogQHBhcmFtIHtzdHJpbmc9fSAgb3B0aW9ucy5jbGlja1RyaWdnZXIgVGhlIERPTSBldmVudCBuYW1lIChjbGljaywgbW91c2Vkb3duLCBldGMpIHRvIGF0dGFjaCBsaXN0ZW5lcnMgb25cbiAqL1xuZnVuY3Rpb24gdXNlUm9vdENsb3NlKHJlZiwgb25Sb290Q2xvc2UsIHtcbiAgZGlzYWJsZWQsXG4gIGNsaWNrVHJpZ2dlciA9ICdjbGljaydcbn0gPSB7fSkge1xuICBjb25zdCBwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBvbkNsb3NlID0gb25Sb290Q2xvc2UgfHwgbm9vcDtcbiAgY29uc3QgaGFuZGxlTW91c2VDYXB0dXJlID0gdXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGdldFJlZlRhcmdldChyZWYpO1xuICAgIHdhcm5pbmcoISFjdXJyZW50VGFyZ2V0LCAnUm9vdENsb3NlIGNhcHR1cmVkIGEgY2xvc2UgZXZlbnQgYnV0IGRvZXMgbm90IGhhdmUgYSByZWYgdG8gY29tcGFyZSBpdCB0by4gJyArICd1c2VSb290Q2xvc2UoKSwgc2hvdWxkIGJlIHBhc3NlZCBhIHJlZiB0aGF0IHJlc29sdmVzIHRvIGEgRE9NIG5vZGUnKTtcbiAgICBwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYuY3VycmVudCA9ICFjdXJyZW50VGFyZ2V0IHx8IGlzTW9kaWZpZWRFdmVudChlKSB8fCAhaXNMZWZ0Q2xpY2tFdmVudChlKSB8fCAhIWNvbnRhaW5zKGN1cnJlbnRUYXJnZXQsIGUudGFyZ2V0KTtcbiAgfSwgW3JlZl0pO1xuICBjb25zdCBoYW5kbGVNb3VzZSA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKCFwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYuY3VycmVudCkge1xuICAgICAgb25DbG9zZShlKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBoYW5kbGVLZXlVcCA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gZXNjYXBlS2V5Q29kZSkge1xuICAgICAgb25DbG9zZShlKTtcbiAgICB9XG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCByZWYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBkb2MgPSBvd25lckRvY3VtZW50KGdldFJlZlRhcmdldChyZWYpKTsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgZXZlbnQgdG8gYXZvaWQgdHJpZ2dlcmluZyBoYW5kbGVycyBpbW1lZGlhdGVseVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjAwNzRcblxuICAgIGxldCBjdXJyZW50RXZlbnQgPSAoZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZXZlbnQ7IC8vIFVzZSBjYXB0dXJlIGZvciB0aGlzIGxpc3RlbmVyIHNvIGl0IGZpcmVzIGJlZm9yZSBSZWFjdCdzIGxpc3RlbmVyLCB0b1xuICAgIC8vIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgY29udGFpbnMoKSBjaGVjayBiZWxvdyBpZiB0aGUgdGFyZ2V0IERPTVxuICAgIC8vIGVsZW1lbnQgaXMgcmVtb3ZlZCBpbiB0aGUgUmVhY3QgbW91c2UgY2FsbGJhY2suXG5cbiAgICBjb25zdCByZW1vdmVNb3VzZUNhcHR1cmVMaXN0ZW5lciA9IGxpc3Rlbihkb2MsIGNsaWNrVHJpZ2dlciwgaGFuZGxlTW91c2VDYXB0dXJlLCB0cnVlKTtcbiAgICBjb25zdCByZW1vdmVNb3VzZUxpc3RlbmVyID0gbGlzdGVuKGRvYywgY2xpY2tUcmlnZ2VyLCBlID0+IHtcbiAgICAgIC8vIHNraXAgaWYgdGhpcyBldmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJ1bm5pbmcgd2hlbiB3ZSBhZGRlZCB0aGUgaGFuZGxlcnNcbiAgICAgIGlmIChlID09PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgY3VycmVudEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZU1vdXNlKGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbW92ZUtleXVwTGlzdGVuZXIgPSBsaXN0ZW4oZG9jLCAna2V5dXAnLCBlID0+IHtcbiAgICAgIC8vIHNraXAgaWYgdGhpcyBldmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJ1bm5pbmcgd2hlbiB3ZSBhZGRlZCB0aGUgaGFuZGxlcnNcbiAgICAgIGlmIChlID09PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgY3VycmVudEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZUtleVVwKGUpO1xuICAgIH0pO1xuICAgIGxldCBtb2JpbGVTYWZhcmlIYWNrTGlzdGVuZXJzID0gW107XG5cbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgbW9iaWxlU2FmYXJpSGFja0xpc3RlbmVycyA9IFtdLnNsaWNlLmNhbGwoZG9jLmJvZHkuY2hpbGRyZW4pLm1hcChlbCA9PiBsaXN0ZW4oZWwsICdtb3VzZW1vdmUnLCBub29wKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlbW92ZU1vdXNlQ2FwdHVyZUxpc3RlbmVyKCk7XG4gICAgICByZW1vdmVNb3VzZUxpc3RlbmVyKCk7XG4gICAgICByZW1vdmVLZXl1cExpc3RlbmVyKCk7XG4gICAgICBtb2JpbGVTYWZhcmlIYWNrTGlzdGVuZXJzLmZvckVhY2gocmVtb3ZlID0+IHJlbW92ZSgpKTtcbiAgICB9O1xuICB9LCBbcmVmLCBkaXNhYmxlZCwgY2xpY2tUcmlnZ2VyLCBoYW5kbGVNb3VzZUNhcHR1cmUsIGhhbmRsZU1vdXNlLCBoYW5kbGVLZXlVcF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VSb290Q2xvc2U7IiwiaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVdpbmRvdyBmcm9tICcuL3VzZVdpbmRvdyc7XG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRhaW5lclJlZiA9IChyZWYsIGRvY3VtZW50KSA9PiB7XG4gIHZhciBfcmVmO1xuXG4gIGlmICghY2FuVXNlRE9NKSByZXR1cm4gbnVsbDtcbiAgaWYgKHJlZiA9PSBudWxsKSByZXR1cm4gKGRvY3VtZW50IHx8IG93bmVyRG9jdW1lbnQoKSkuYm9keTtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHJlZiA9IHJlZigpO1xuICBpZiAocmVmICYmICdjdXJyZW50JyBpbiByZWYpIHJlZiA9IHJlZi5jdXJyZW50O1xuICBpZiAoKF9yZWYgPSByZWYpICE9IG51bGwgJiYgX3JlZi5ub2RlVHlwZSkgcmV0dXJuIHJlZiB8fCBudWxsO1xuICByZXR1cm4gbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VXYWl0Rm9yRE9NUmVmKHJlZiwgb25SZXNvbHZlZCkge1xuICBjb25zdCB3aW5kb3cgPSB1c2VXaW5kb3coKTtcbiAgY29uc3QgW3Jlc29sdmVkUmVmLCBzZXRSZWZdID0gdXNlU3RhdGUoKCkgPT4gcmVzb2x2ZUNvbnRhaW5lclJlZihyZWYsIHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmRvY3VtZW50KSk7XG5cbiAgaWYgKCFyZXNvbHZlZFJlZikge1xuICAgIGNvbnN0IGVhcmx5UmVmID0gcmVzb2x2ZUNvbnRhaW5lclJlZihyZWYpO1xuICAgIGlmIChlYXJseVJlZikgc2V0UmVmKGVhcmx5UmVmKTtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9uUmVzb2x2ZWQgJiYgcmVzb2x2ZWRSZWYpIHtcbiAgICAgIG9uUmVzb2x2ZWQocmVzb2x2ZWRSZWYpO1xuICAgIH1cbiAgfSwgW29uUmVzb2x2ZWQsIHJlc29sdmVkUmVmXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbmV4dFJlZiA9IHJlc29sdmVDb250YWluZXJSZWYocmVmKTtcblxuICAgIGlmIChuZXh0UmVmICE9PSByZXNvbHZlZFJlZikge1xuICAgICAgc2V0UmVmKG5leHRSZWYpO1xuICAgIH1cbiAgfSwgW3JlZiwgcmVzb2x2ZWRSZWZdKTtcbiAgcmV0dXJuIHJlc29sdmVkUmVmO1xufSIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5jb25zdCBDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoY2FuVXNlRE9NID8gd2luZG93IDogdW5kZWZpbmVkKTtcbmV4cG9ydCBjb25zdCBXaW5kb3dQcm92aWRlciA9IENvbnRleHQuUHJvdmlkZXI7XG4vKipcbiAqIFRoZSBkb2N1bWVudCBcIndpbmRvd1wiIHBsYWNlZCBpbiBSZWFjdCBjb250ZXh0LiBIZWxwZnVsIGZvciBkZXRlcm1pbmluZ1xuICogU1NSIGNvbnRleHQsIG9yIHdoZW4gcmVuZGVyaW5nIGludG8gYW4gaWZyYW1lLlxuICpcbiAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHdpbmRvd1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdpbmRvdygpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoQ29udGV4dCk7XG59IiwiaW1wb3J0IHVzZUNhbGxiYWNrUmVmIGZyb20gJy4vdXNlQ2FsbGJhY2tSZWYnO1xuaW1wb3J0IHVzZUNvbW1pdHRlZFJlZiBmcm9tICcuL3VzZUNvbW1pdHRlZFJlZic7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICcuL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmltcG9ydCB1c2VHbG9iYWxMaXN0ZW5lciBmcm9tICcuL3VzZUdsb2JhbExpc3RlbmVyJztcbmltcG9ydCB1c2VJbnRlcnZhbCBmcm9tICcuL3VzZUludGVydmFsJztcbmltcG9ydCB1c2VSYWZJbnRlcnZhbCBmcm9tICcuL3VzZVJhZkludGVydmFsJztcbmltcG9ydCB1c2VNZXJnZVN0YXRlIGZyb20gJy4vdXNlTWVyZ2VTdGF0ZSc7XG5pbXBvcnQgdXNlTWVyZ2VTdGF0ZUZyb21Qcm9wcyBmcm9tICcuL3VzZU1lcmdlU3RhdGVGcm9tUHJvcHMnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICcuL3VzZVByZXZpb3VzJztcbmltcG9ydCB1c2VJbWFnZSBmcm9tICcuL3VzZUltYWdlJztcbmltcG9ydCB1c2VSZXNpemVPYnNlcnZlciBmcm9tICcuL3VzZVJlc2l6ZU9ic2VydmVyJztcbmV4cG9ydCB7IHVzZUNhbGxiYWNrUmVmLCB1c2VDb21taXR0ZWRSZWYsIHVzZUV2ZW50Q2FsbGJhY2ssIHVzZUV2ZW50TGlzdGVuZXIsIHVzZUdsb2JhbExpc3RlbmVyLCB1c2VJbnRlcnZhbCwgdXNlUmFmSW50ZXJ2YWwsIHVzZU1lcmdlU3RhdGUsIHVzZU1lcmdlU3RhdGVGcm9tUHJvcHMsIHVzZU1vdW50ZWQsIHVzZVByZXZpb3VzLCB1c2VJbWFnZSwgdXNlUmVzaXplT2JzZXJ2ZXIgfTsiLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQSBjb252ZW5pZW5jZSBob29rIGFyb3VuZCBgdXNlU3RhdGVgIGRlc2lnbmVkIHRvIGJlIHBhaXJlZCB3aXRoXG4gKiB0aGUgY29tcG9uZW50IFtjYWxsYmFjayByZWZdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwjY2FsbGJhY2stcmVmcykgYXBpLlxuICogQ2FsbGJhY2sgcmVmcyBhcmUgdXNlZnVsIG92ZXIgYHVzZVJlZigpYCB3aGVuIHlvdSBuZWVkIHRvIHJlc3BvbmQgdG8gdGhlIHJlZiBiZWluZyBzZXRcbiAqIGluc3RlYWQgb2YgbGF6aWx5IGFjY2Vzc2luZyBpdCBpbiBhbiBlZmZlY3QuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtlbGVtZW50LCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWY8SFRNTERpdkVsZW1lbnQ+KClcbiAqXG4gKiB1c2VFZmZlY3QoKCkgPT4ge1xuICogICBpZiAoIWVsZW1lbnQpIHJldHVyblxuICpcbiAqICAgY29uc3QgY2FsZW5kYXIgPSBuZXcgRnVsbENhbGVuZGFyLkNhbGVuZGFyKGVsZW1lbnQpXG4gKlxuICogICByZXR1cm4gKCkgPT4ge1xuICogICAgIGNhbGVuZGFyLmRlc3Ryb3koKVxuICogICB9XG4gKiB9LCBbZWxlbWVudF0pXG4gKlxuICogcmV0dXJuIDxkaXYgcmVmPXthdHRhY2hSZWZ9IC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgcmVmc1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKCkge1xuICByZXR1cm4gdXNlU3RhdGUobnVsbCk7XG59IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgUmVmYCB3aG9zZSB2YWx1ZSBpcyB1cGRhdGVkIGluIGFuIGVmZmVjdCwgZW5zdXJpbmcgdGhlIG1vc3QgcmVjZW50XG4gKiB2YWx1ZSBpcyB0aGUgb25lIHJlbmRlcmVkIHdpdGguIEdlbmVyYWxseSBvbmx5IHJlcXVpcmVkIGZvciBDb25jdXJyZW50IG1vZGUgdXNhZ2VcbiAqIHdoZXJlIHByZXZpb3VzIHdvcmsgaW4gYHJlbmRlcigpYCBtYXkgYmUgZGlzY2FyZGVkIGJlZm9yZSBiZWluZyB1c2VkLlxuICpcbiAqIFRoaXMgaXMgc2FmZSB0byBhY2Nlc3MgaW4gYW4gZXZlbnQgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGBSZWZgIHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29tbWl0dGVkUmVmKHZhbHVlKSB7XG4gIHZhciByZWYgPSB1c2VSZWYodmFsdWUpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcmVmO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb21taXR0ZWRSZWY7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50Q2FsbGJhY2soZm4pIHtcbiAgdmFyIHJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7XG4gIHJldHVybiB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ICYmIHJlZi5jdXJyZW50LmFwcGx5KHJlZiwgYXJndW1lbnRzKTtcbiAgfSwgW3JlZl0pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJy4vdXNlRXZlbnRDYWxsYmFjayc7XG5cbi8qKlxuICogQXR0YWNoZXMgYW4gZXZlbnQgaGFuZGxlciBvdXRzaWRlIGRpcmVjdGx5IHRvIHNwZWNpZmllZCBET00gZWxlbWVudFxuICogYnlwYXNzaW5nIHRoZSByZWFjdCBzeW50aGV0aWMgZXZlbnQgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSB0YXJnZXQgdG8gbGlzdGVuIGZvciBldmVudHMgb25cbiAqIEBwYXJhbSBldmVudCBUaGUgRE9NIGV2ZW50IG5hbWVcbiAqIEBwYXJhbSBoYW5kbGVyIEFuIGV2ZW50IGhhbmRsZXJcbiAqIEBwYXJhbSBjYXB0dXJlIFdoZXRoZXIgb3Igbm90IHRvIGxpc3RlbiBkdXJpbmcgdGhlIGNhcHR1cmUgZXZlbnQgcGhhc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lcihldmVudFRhcmdldCwgZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG4gIGlmIChjYXB0dXJlID09PSB2b2lkIDApIHtcbiAgICBjYXB0dXJlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IHVzZUV2ZW50Q2FsbGJhY2sobGlzdGVuZXIpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSB0eXBlb2YgZXZlbnRUYXJnZXQgPT09ICdmdW5jdGlvbicgPyBldmVudFRhcmdldCgpIDogZXZlbnRUYXJnZXQ7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIH07XG4gIH0sIFtldmVudFRhcmdldF0pO1xufSIsImltcG9ydCB7IHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIGEgY29tcG9uZW50IHVwZGF0ZS4gdGhlIGhvb2sgZXF1aXZhbGVudCB0b1xuICogYHRoaXMuZm9yY2VVcGRhdGUoKWAgaW4gYSBjbGFzcyBjb21wb25lbnQuIEluIG1vc3QgY2FzZXMgdXNpbmcgYSBzdGF0ZSB2YWx1ZSBkaXJlY3RseVxuICogaXMgcHJlZmVyYWJsZSBidXQgbWF5IGJlIHJlcXVpcmVkIGluIHNvbWUgYWR2YW5jZWQgdXNhZ2VzIG9mIHJlZnMgZm9yIGludGVyb3Agb3JcbiAqIHdoZW4gZGlyZWN0IERPTSBtYW5pcHVsYXRpb24gaXMgcmVxdWlyZWQuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAqXG4gKiBjb25zdCB1cGRhdGVPbkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICogIGZvcmNlVXBkYXRlKClcbiAqIH0sIFtmb3JjZVVwZGF0ZV0pXG4gKlxuICogcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3VwZGF0ZU9uQ2xpY2t9PkhpIHRoZXJlPC9idXR0b24+XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgLy8gVGhlIHRvZ2dsaW5nIHN0YXRlIHZhbHVlIGlzIGRlc2lnbmVkIHRvIGRlZmVhdCBSZWFjdCBvcHRpbWl6YXRpb25zIGZvciBza2lwcGluZ1xuICAvLyB1cGRhdGVzIHdoZW4gdGhleSBhcmUgc3RyaWN0aW5nIGVxdWFsIHRvIHRoZSBsYXN0IHN0YXRlIHZhbHVlXG4gIHZhciBfdXNlUmVkdWNlciA9IHVzZVJlZHVjZXIoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgcmV0dXJuICFzdGF0ZTtcbiAgfSwgZmFsc2UpLFxuICAgICAgZGlzcGF0Y2ggPSBfdXNlUmVkdWNlclsxXTtcblxuICByZXR1cm4gZGlzcGF0Y2g7XG59IiwiaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIEF0dGFjaGVzIGFuIGV2ZW50IGhhbmRsZXIgb3V0c2lkZSBkaXJlY3RseSB0byB0aGUgYGRvY3VtZW50YCxcbiAqIGJ5cGFzc2luZyB0aGUgcmVhY3Qgc3ludGhldGljIGV2ZW50IHN5c3RlbS5cbiAqXG4gKiBgYGB0c1xuICogdXNlR2xvYmFsTGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAqICBjb25zb2xlLmxvZyhldmVudC5rZXkpXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBET00gZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZXIgQW4gZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIGNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gbGlzdGVuIGR1cmluZyB0aGUgY2FwdHVyZSBldmVudCBwaGFzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VHbG9iYWxMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSkge1xuICBpZiAoY2FwdHVyZSA9PT0gdm9pZCAwKSB7XG4gICAgY2FwdHVyZSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGRvY3VtZW50VGFyZ2V0ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfSwgW10pO1xuICByZXR1cm4gdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudFRhcmdldCwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xufSIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogRmV0Y2ggYW5kIGxvYWQgYW4gaW1hZ2UgZm9yIHByb2dyYW1hdGljIHVzZSBzdWNoIGFzIGluIGEgYDxjYW52YXM+YCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBpbWFnZU9yVXJsIFRoZSBgSHRtbEltYWdlRWxlbWVudGAgb3IgaW1hZ2UgdXJsIHRvIGxvYWRcbiAqIEBwYXJhbSBjcm9zc09yaWdpbiBUaGUgYGNyb3Nzb3JpZ2luYCBhdHRyaWJ1dGUgdG8gc2V0XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgaW1hZ2UsIGVycm9yIH0gPSB1c2VJbWFnZSgnL3N0YXRpYy9raXR0ZW5zLnBuZycpXG4gKiBjb25zdCByZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KClcbiAqXG4gKiB1c2VFZmZlY3QoKCkgPT4ge1xuICogICBjb25zdCBjdHggPSByZWYuY3VycmVudC5nZXRDb250ZXh0KCcyZCcpXG4gKlxuICogICBpZiAoaW1hZ2UpIHtcbiAqICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKVxuICogICB9XG4gKiB9LCBbcmVmLCBpbWFnZV0pXG4gKlxuICogcmV0dXJuIChcbiAqICAgPD5cbiAqICAgICB7ZXJyb3IgJiYgXCJ0aGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIGltYWdlXCJ9XG4gKiAgICAgPGNhbnZhcyByZWY9e3JlZn0gLz5cbiAqICAgPC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSW1hZ2UoaW1hZ2VPclVybCwgY3Jvc3NPcmlnaW4pIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHtcbiAgICBpbWFnZTogbnVsbCxcbiAgICBlcnJvcjogbnVsbFxuICB9KSxcbiAgICAgIHN0YXRlID0gX3VzZVN0YXRlWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfdXNlU3RhdGVbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWltYWdlT3JVcmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmFyIGltYWdlO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZU9yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGlmIChjcm9zc09yaWdpbikgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgIGltYWdlLnNyYyA9IGltYWdlT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlID0gaW1hZ2VPclVybDtcblxuICAgICAgaWYgKGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgPiAwKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZTogaW1hZ2UsXG4gICAgICAgICAgZXJyb3I6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkxvYWQoKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGltYWdlOiBpbWFnZSxcbiAgICAgICAgZXJyb3I6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaW1hZ2U6IGltYWdlLFxuICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICB9O1xuICB9LCBbaW1hZ2VPclVybCwgY3Jvc3NPcmlnaW5dKTtcbiAgcmV0dXJuIHN0YXRlO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb21taXR0ZWRSZWYgZnJvbSAnLi91c2VDb21taXR0ZWRSZWYnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHNldEludGVydmFsYCB0aGF0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50ZWRcbiAqXG4gKiBgYGB0c3hcbiAqICBmdW5jdGlvbiBUaW1lcigpIHtcbiAqICAgIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUoMClcbiAqICAgIHVzZUludGVydmFsKCgpID0+IHNldFRpbWVyKGkgPT4gaSArIDEpLCAxMDAwKVxuICpcbiAqICAgIHJldHVybiA8c3Bhbj57dGltZXJ9IHNlY29uZHMgcGFzdDwvc3Bhbj5cbiAqICB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZm4gYW4gZnVuY3Rpb24gcnVuIG9uIGVhY2ggaW50ZXJ2YWxcbiAqIEBwYXJhbSBtcyBUaGUgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbFxuICovXG5cbmZ1bmN0aW9uIHVzZUludGVydmFsKGZuLCBtcywgcGF1c2VkLCBydW5JbW1lZGlhdGVseSkge1xuICBpZiAocGF1c2VkID09PSB2b2lkIDApIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChydW5JbW1lZGlhdGVseSA9PT0gdm9pZCAwKSB7XG4gICAgcnVuSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBoYW5kbGU7XG4gIHZhciBmblJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7IC8vIHRoaXMgcmVmIGlzIG5lY2Vzc2FyeSBiL2MgdXNlRWZmZWN0IHdpbGwgc29tZXRpbWVzIG1pc3MgYSBwYXVzZWQgdG9nZ2xlXG4gIC8vIG9ycGhhbmluZyBhIHNldFRpbWVvdXQgY2hhaW4gaW4gdGhlIGFldGhlciwgc28gcmVseWluZyBvbiBpdCdzIHJlZnJlc2ggbG9naWMgaXMgbm90IHJlbGlhYmxlLlxuXG4gIHZhciBwYXVzZWRSZWYgPSB1c2VDb21taXR0ZWRSZWYocGF1c2VkKTtcblxuICB2YXIgdGljayA9IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgaWYgKHBhdXNlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgZm5SZWYuY3VycmVudCgpO1xuICAgIHNjaGVkdWxlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgfTtcblxuICB2YXIgc2NoZWR1bGUgPSBmdW5jdGlvbiBzY2hlZHVsZSgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSBzZXRUaW1lb3V0KHRpY2ssIG1zKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChydW5JbW1lZGlhdGVseSkge1xuICAgICAgdGljaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgfTtcbiAgfSwgW3BhdXNlZCwgcnVuSW1tZWRpYXRlbHldKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlSW50ZXJ2YWw7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG52YXIgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIC8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IgJiYgLy8gQHRzLWlnbm9yZVxuZ2xvYmFsLm5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnO1xudmFyIGlzRE9NID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbi8qKlxuICogSXMgYHVzZUxheW91dEVmZmVjdGAgaW4gYSBET00gb3IgUmVhY3QgTmF0aXZlIGVudmlyb25tZW50LCBvdGhlcndpc2UgcmVzb2x2ZXMgdG8gdXNlRWZmZWN0XG4gKiBPbmx5IHVzZWZ1bCB0byBhdm9pZCB0aGUgY29uc29sZSB3YXJuaW5nLlxuICpcbiAqIFBSRUZFUiBgdXNlRWZmZWN0YCBVTkxFU1MgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HLlxuICpcbiAqIEBjYXRlZ29yeSBlZmZlY3RzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgaXNET00gfHwgaXNSZWFjdE5hdGl2ZSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogTWltaWNzIGEgUmVhY3QgY2xhc3MgY29tcG9uZW50J3Mgc3RhdGUgbW9kZWwsIG9mIGhhdmluZyBhIHNpbmdsZSB1bmlmaWVkXG4gKiBgc3RhdGVgIG9iamVjdCBhbmQgYW4gdXBkYXRlciB0aGF0IG1lcmdlcyB1cGRhdGVzIGludG8gdGhlIGV4aXN0aW5nIHN0YXRlLCBhc1xuICogb3Bwb3NlZCB0byByZXBsYWNpbmcgaXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlTWVyZ2VTdGF0ZSh7IG5hbWU6ICdCZXRzeScsIGFnZTogMjQgfSlcbiAqXG4gKiBzZXRTdGF0ZSh7IG5hbWU6ICdKb2hhbicgfSkgLy8geyBuYW1lOiAnSm9oYW4nLCBhZ2U6IDI0IH1cbiAqXG4gKiBzZXRTdGF0ZShzdGF0ZSA9PiAoeyBhZ2U6IHN0YXRlLmFnZSArIDEwIH0pKSAvLyB7IG5hbWU6ICdKb2hhbicsIGFnZTogMzQgfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGluaXRpYWxTdGF0ZSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVyZ2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgICBzdGF0ZSA9IF91c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX3VzZVN0YXRlWzFdO1xuXG4gIHZhciB1cGRhdGVyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHVwZGF0ZShzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXh0U3RhdGUgPT0gbnVsbCA/IHN0YXRlIDogX2V4dGVuZHMoe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB1cGRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2V0U3RhdGVdKTtcbiAgcmV0dXJuIFtzdGF0ZSwgdXBkYXRlcl07XG59IiwiaW1wb3J0IHVzZU1lcmdlU3RhdGUgZnJvbSAnLi91c2VNZXJnZVN0YXRlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lcmdlU3RhdGVGcm9tUHJvcHMocHJvcHMsIGdEU0ZQLCBpbml0aWFsU3RhdGUpIHtcbiAgdmFyIF91c2VNZXJnZVN0YXRlID0gdXNlTWVyZ2VTdGF0ZShpbml0aWFsU3RhdGUpLFxuICAgICAgc3RhdGUgPSBfdXNlTWVyZ2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX3VzZU1lcmdlU3RhdGVbMV07XG5cbiAgdmFyIG5leHRTdGF0ZSA9IGdEU0ZQKHByb3BzLCBzdGF0ZSk7XG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHNldFN0YXRlKG5leHRTdGF0ZSk7XG4gIHJldHVybiBbc3RhdGUsIHNldFN0YXRlXTtcbn0iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG52YXIgdG9GblJlZiA9IGZ1bmN0aW9uIHRvRm5SZWYocmVmKSB7XG4gIHJldHVybiAhcmVmIHx8IHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicgPyByZWYgOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUmVmcyhyZWZBLCByZWZCKSB7XG4gIHZhciBhID0gdG9GblJlZihyZWZBKTtcbiAgdmFyIGIgPSB0b0ZuUmVmKHJlZkIpO1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKGEpIGEodmFsdWUpO1xuICAgIGlmIChiKSBiKHZhbHVlKTtcbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm5zIGEgc2luZ2xlIGNhbGxiYWNrIHJlZiBjb21wb3NlZCBmcm9tIHR3byBvdGhlciBSZWZzLlxuICpcbiAqIGBgYHRzeFxuICogY29uc3QgQnV0dG9uID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICogICBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxCdXR0b25FbGVtZW50PigpO1xuICogICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWZzKHJlZiwgYXR0YWNoUmVmKTtcbiAqXG4gKiAgIHJldHVybiA8YnV0dG9uIHJlZj17bWVyZ2VkUmVmfSB7Li4ucHJvcHN9Lz5cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVmQSBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAcGFyYW0gcmVmQiBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAY2F0ZWdvcnkgcmVmc1xuICovXG5cbmZ1bmN0aW9uIHVzZU1lcmdlZFJlZnMocmVmQSwgcmVmQikge1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG1lcmdlUmVmcyhyZWZBLCByZWZCKTtcbiAgfSwgW3JlZkEsIHJlZkJdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlTWVyZ2VkUmVmczsiLCJpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogVHJhY2sgd2hldGhlciBhIGNvbXBvbmVudCBpcyBjdXJyZW50IG1vdW50ZWQuIEdlbmVyYWxseSBsZXNzIHByZWZlcmFibGUgdGhhblxuICogcHJvcGVybGx5IGNhbmNlbGluZyBlZmZlY3RzIHNvIHRoZXkgZG9uJ3QgcnVuIGFmdGVyIGEgY29tcG9uZW50IGlzIHVubW91bnRlZCxcbiAqIGJ1dCBoZWxwZnVsIGluIGNhc2VzIHdoZXJlIHRoYXQgaXNuJ3QgZmVhc2libGUsIHN1Y2ggYXMgYSBgUHJvbWlzZWAgcmVzb2x1dGlvbi5cbiAqXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpc01vdW50ZWQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudFxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSB1c2VTdGF0ZShudWxsKVxuICogY29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgZmV0Y2hkYXRhKCkudGhlbigobmV3RGF0YSkgPT4ge1xuICogICAgICBpZiAoaXNNb3VudGVkKCkpIHtcbiAqICAgICAgICBzZXREYXRhKG5ld0RhdGEpO1xuICogICAgICB9XG4gKiAgIH0pXG4gKiB9KVxuICogYGBgXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW91bnRlZCgpIHtcbiAgdmFyIG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG4gIHZhciBpc01vdW50ZWQgPSB1c2VSZWYoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtb3VudGVkLmN1cnJlbnQ7XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBpc01vdW50ZWQuY3VycmVudDtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogU3RvcmUgdGhlIGxhc3Qgb2Ygc29tZSB2YWx1ZS4gVHJhY2tlZCB2aWEgYSBgUmVmYCBvbmx5IHVwZGF0aW5nIGl0XG4gKiBhZnRlciB0aGUgY29tcG9uZW50IHJlbmRlcnMuXG4gKlxuICogSGVscGZ1bCBpZiB5b3UgbmVlZCB0byBjb21wYXJlIGEgcHJvcCB2YWx1ZSB0byBpdCdzIHByZXZpb3VzIHZhbHVlIGR1cmluZyByZW5kZXIuXG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcykge1xuICogICBjb25zdCBsYXN0UHJvcHMgPSB1c2VQcmV2aW91cyhwcm9wcylcbiAqXG4gKiAgIGlmIChsYXN0UHJvcHMuZm9vICE9PSBwcm9wcy5mb28pXG4gKiAgICAgcmVzZXRWYWx1ZUZyb21Qcm9wcyhwcm9wcy5mb28pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHRyYWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUHJldmlvdXModmFsdWUpIHtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZi5jdXJyZW50O1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb21taXR0ZWRSZWYgZnJvbSAnLi91c2VDb21taXR0ZWRSZWYnO1xuXG5mdW5jdGlvbiB1c2VSYWZJbnRlcnZhbChmbiwgbXMsIHBhdXNlZCkge1xuICBpZiAocGF1c2VkID09PSB2b2lkIDApIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBoYW5kbGU7XG4gIHZhciBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB2YXIgZm5SZWYgPSB1c2VDb21taXR0ZWRSZWYoZm4pOyAvLyB0aGlzIHJlZiBpcyBuZWNlc3NhcnkgYi9jIHVzZUVmZmVjdCB3aWxsIHNvbWV0aW1lcyBtaXNzIGEgcGF1c2VkIHRvZ2dsZVxuICAvLyBvcnBoYW5pbmcgYSBzZXRUaW1lb3V0IGNoYWluIGluIHRoZSBhZXRoZXIsIHNvIHJlbHlpbmcgb24gaXQncyByZWZyZXNoIGxvZ2ljIGlzIG5vdCByZWxpYWJsZS5cblxuICB2YXIgcGF1c2VkUmVmID0gdXNlQ29tbWl0dGVkUmVmKHBhdXNlZCk7XG5cbiAgZnVuY3Rpb24gbG9vcCgpIHtcbiAgICB2YXIgY3VycmVudCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHZhciBkZWx0YSA9IGN1cnJlbnQgLSBzdGFydDtcbiAgICBpZiAocGF1c2VkUmVmLmN1cnJlbnQpIHJldHVybjtcblxuICAgIGlmIChkZWx0YSA+PSBtcyAmJiBmblJlZi5jdXJyZW50KSB7XG4gICAgICBmblJlZi5jdXJyZW50KCk7XG4gICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gICAgaGFuZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICB9XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBoYW5kbGUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpO1xuICAgIH07XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlUmFmSW50ZXJ2YWw7IiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRWZmZWN0IGZyb20gJy4vdXNlSXNvbW9ycGhpY0VmZmVjdCc7XG52YXIgdGFyZ2V0TWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciByZXNpemVPYnNlcnZlcjtcblxuZnVuY3Rpb24gZ2V0UmVzaXplT2JzZXJ2ZXIoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduXG4gIHJldHVybiByZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyIHx8IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICB2YXIgaGFuZGxlciA9IHRhcmdldE1hcC5nZXQoZW50cnkudGFyZ2V0KTtcbiAgICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGVudHJ5LmNvbnRlbnRSZWN0KTtcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIEVmZmljaWVudGx5IG9ic2VydmUgc2l6ZSBjaGFuZ2VzIG9uIGFuIGVsZW1lbnQuIERlcGVuZHMgb24gdGhlIGBSZXNpemVPYnNlcnZlcmAgYXBpLFxuICogYW5kIHBvbHlmaWxscyBhcmUgbmVlZGVkIGluIG9sZGVyIGJyb3dzZXJzLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbcmVmLCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWYobnVsbCk7XG4gKlxuICogY29uc3QgcmVjdCA9IHVzZVJlc2l6ZU9ic2VydmVyKHJlZik7XG4gKlxuICogcmV0dXJuIChcbiAqICA8ZGl2IHJlZj17YXR0YWNoUmVmfT5cbiAqICAgIHtKU09OLnN0cmluZ2lmeShyZWN0KX1cbiAqICA8L2Rpdj5cbiAqIClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZXNpemVPYnNlcnZlcihlbGVtZW50KSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIHJlY3QgPSBfdXNlU3RhdGVbMF0sXG4gICAgICBzZXRSZWN0ID0gX3VzZVN0YXRlWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgZ2V0UmVzaXplT2JzZXJ2ZXIoKS5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIHNldFJlY3QoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgdGFyZ2V0TWFwLnNldChlbGVtZW50LCBmdW5jdGlvbiAocmVjdCkge1xuICAgICAgc2V0UmVjdChyZWN0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdGFyZ2V0TWFwLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9O1xuICB9LCBbZWxlbWVudF0pO1xuICByZXR1cm4gcmVjdDtcbn0iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNb3VudGVkIGZyb20gJy4vdXNlTW91bnRlZCc7XG5cbmZ1bmN0aW9uIHVzZVNhZmVTdGF0ZShzdGF0ZSkge1xuICB2YXIgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuICByZXR1cm4gW3N0YXRlWzBdLCB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV4dFN0YXRlKSB7XG4gICAgaWYgKCFpc01vdW50ZWQoKSkgcmV0dXJuO1xuICAgIHJldHVybiBzdGF0ZVsxXShuZXh0U3RhdGUpO1xuICB9LCBbaXNNb3VudGVkLCBzdGF0ZVsxXV0pXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlU2FmZVN0YXRlOyIsImltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmV0dXJucyBhIHJlZiB0aGF0IGlzIGltbWVkaWF0ZWx5IHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHZhbHVlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBSZWYgdmFsdWVcbiAqIEBjYXRlZ29yeSByZWZzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVXBkYXRlZFJlZih2YWx1ZSkge1xuICB2YXIgdmFsdWVSZWYgPSB1c2VSZWYodmFsdWUpO1xuICB2YWx1ZVJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZVJlZjtcbn0iLCJpbXBvcnQgdXNlVXBkYXRlZFJlZiBmcm9tICcuL3VzZVVwZGF0ZWRSZWYnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBBdHRhY2ggYSBjYWxsYmFjayB0aGF0IGZpcmVzIHdoZW4gYSBjb21wb25lbnQgdW5tb3VudHNcbiAqXG4gKiBAcGFyYW0gZm4gSGFuZGxlciB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXG4gKiBAY2F0ZWdvcnkgZWZmZWN0c1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdpbGxVbm1vdW50KGZuKSB7XG4gIHZhciBvblVubW91bnQgPSB1c2VVcGRhdGVkUmVmKGZuKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uVW5tb3VudC5jdXJyZW50KCk7XG4gICAgfTtcbiAgfSwgW10pO1xufSIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiLyohXG4gIENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvRGVlcExpbmtzL0RlZXBMaW5rSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvRGVlcExpbmtzL1JvdXRlRGVlcExpbmtIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2xpZW50L0FwcC9Ib29rcyc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZUFuaW1hdGlvbi9DbGFzc1NpdGVBbmltYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vRGVmYXVsdFNpdGVBbmltYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vU2l0ZUFuaW1hdGlvbkludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZUlkQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvRGV2aWNlUmVhZHknO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvTmF0aXZlU3RvcmFnZVByb21pc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9GaW5pc2hTaXRlTGluayc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9TaXRlL1NpdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9TaXRlQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2xpZW50L1NpdGUvU2l0ZUxpbmsnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9Ub3BCYXIvQmFja0J1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9TaXRlL1RvcEJhci9Ub3BCYXInO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZXBMaW5rSGFuZGxlci5qcy5tYXAiLCJ2YXIgUm91dGVEZWVwTGlua0hhbmRsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUm91dGVEZWVwTGlua0hhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZGVlcExpbmtzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJldmVyc2VEZWVwTGlua3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSAnJztcbiAgICB9XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlTWF0Y2ggPSBmdW5jdGlvbiAoZGVlcExpbmssIGxpbmtQYXJ0cykge1xuICAgICAgICB2YXIgZGVlcExpbmtQYXJ0cyA9IGRlZXBMaW5rLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChkZWVwTGlua1BhcnRzLmxlbmd0aCA+IGxpbmtQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWF0Y2hlcyA9IGRlZXBMaW5rUGFydHMuZXZlcnkoZnVuY3Rpb24gKHBhcnQsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydC5zdGFydHNXaXRoKCc6JykgfHwgcGFydCA9PT0gbGlua1BhcnRzW2luZGV4XTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlua1BhcnRzLmxlbmd0aCAtIGRlZXBMaW5rUGFydHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLmV4dHJhY3RQYXJhbXMgPSBmdW5jdGlvbiAoZGVlcExpbmtQYXJ0cywgbGlua1BhcnRzLCBxdWVyeSkge1xuICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydHMgPSBxdWVyeS5zcGxpdCgnJicpO1xuICAgICAgICAgICAgcXVlcnlQYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeVBhcnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBxdWVyeVBhcnQuc3BsaXQoJz0nKSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWVwTGlua1BhcnRzLnJlZHVjZShmdW5jdGlvbiAocGFyYW1PYmplY3QsIHBhcnQsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBwYXJhbU9iamVjdFtwYXJ0LnN1YnN0cigxKV0gPSBsaW5rUGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtT2JqZWN0O1xuICAgICAgICB9LCBwYXJhbXMpO1xuICAgIH07XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIucHJvdG90eXBlLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZSA9IGZ1bmN0aW9uIChzaXRlLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJldmVyc2VEZWVwTGlua3MuaGFzKHNpdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZ1bGxMaW5rID0gdGhpcy5yZXZlcnNlRGVlcExpbmtzLmdldChzaXRlKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gZnVsbExpbmsuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIHZhciBwYXJhbUtleXNfMSA9IE9iamVjdC5rZXlzKHBhcmFtcyk7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhcnRzLnJlZHVjZShmdW5jdGlvbiAobGluaywgcGFydCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsTmFtZSA9IHBhcnQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5SW5kZXggPSBwYXJhbUtleXNfMS5pbmRleE9mKHZhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUtleXNfMS5zcGxpY2Uoa2V5SW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsgKyBcIi9cIiArIHBhcmFtc1t2YWxOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rICsgXCIvXCIgKyBwYXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcmFtS2V5c18xLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIHRoaXMuYmFzZVBhdGggKyBwYXRoICsgXCI/XCIgKyBwYXJhbUtleXNfMVxuICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNba2V5XSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zW2tleV0gPyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trZXldKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhdGggKyBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYXRoICsgZnVsbExpbms7XG4gICAgfTtcbiAgICBSb3V0ZURlZXBMaW5rSGFuZGxlci5wcm90b3R5cGUuY2FsY3VsYXRlU2l0ZSA9IGZ1bmN0aW9uIChmdWxsTGluaykge1xuICAgICAgICB2YXIgbGluayA9IGZ1bGxMaW5rO1xuICAgICAgICBpZiAoZnVsbExpbmsuc3RhcnRzV2l0aCh0aGlzLmJhc2VQYXRoKSkge1xuICAgICAgICAgICAgbGluayA9IGZ1bGxMaW5rLnN1YnN0cih0aGlzLmJhc2VQYXRoLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gbGluay5zcGxpdCgnPycpLCBwYXRoUGFydCA9IF9hWzBdLCBxdWVyeVBhcnQgPSBfYVsxXTtcbiAgICAgICAgdmFyIHBhcnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKTtcbiAgICAgICAgdmFyIGNsb3Nlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIHNjb3JlOiBJbmZpbml0eSxcbiAgICAgICAgICAgIGxpbms6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWVwTGlua3MuZm9yRWFjaChmdW5jdGlvbiAoX3NpdGUsIGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgICB2YXIgbGlua1Njb3JlID0gUm91dGVEZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlTWF0Y2goY3VycmVudExpbmssIHBhcnRzKTtcbiAgICAgICAgICAgIGlmIChsaW5rU2NvcmUgPj0gMCAmJiBsaW5rU2NvcmUgPCBjbG9zZXN0TWF0Y2guc2NvcmUpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0TWF0Y2guc2NvcmUgPSBsaW5rU2NvcmU7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE1hdGNoLmxpbmsgPSBjdXJyZW50TGluaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgY2xvc2VzdE1hdGNoLmxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgc2l0ZSA9IHRoaXMuZGVlcExpbmtzLmdldChjbG9zZXN0TWF0Y2gubGluayk7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gUm91dGVEZWVwTGlua0hhbmRsZXIuZXh0cmFjdFBhcmFtcyhjbG9zZXN0TWF0Y2gubGluay5zcGxpdCgnLycpLCBwYXJ0cywgcXVlcnlQYXJ0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2l0ZTogc2l0ZSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgICB2YXIgcGFydHMgPSBsaW5rLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGVlcExpbmtzLmtleXMoKSkuc29tZShmdW5jdGlvbiAoY3VycmVudExpbmspIHtcbiAgICAgICAgICAgIHJldHVybiBSb3V0ZURlZXBMaW5rSGFuZGxlci5jYWxjdWxhdGVNYXRjaChjdXJyZW50TGluaywgcGFydHMpID09PSAwO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobGluaywgc2l0ZSkge1xuICAgICAgICBpZiAodGhpcy5oYXMobGluaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZXAgTGluayBcXFwiXCIgKyBsaW5rICsgXCJcXFwiIGFscmVhZHkgZXhpc3RzIGZvciBzaXRlIFxcXCJcIiArIHNpdGUgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWVwTGlua3Muc2V0KGxpbmssIHNpdGUpO1xuICAgICAgICB0aGlzLnJldmVyc2VEZWVwTGlua3Muc2V0KHNpdGUsIGxpbmspO1xuICAgIH07XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZXBMaW5rcy5nZXQobGluayk7XG4gICAgfTtcbiAgICBSb3V0ZURlZXBMaW5rSGFuZGxlci5wcm90b3R5cGUuc2V0QmFzZVBhdGggPSBmdW5jdGlvbiAoYmFzZVBhdGgpIHtcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgIH07XG4gICAgcmV0dXJuIFJvdXRlRGVlcExpbmtIYW5kbGVyO1xufSgpKTtcbmV4cG9ydCB7IFJvdXRlRGVlcExpbmtIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3V0ZURlZXBMaW5rSGFuZGxlci5qcy5tYXAiLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFNpdGVzQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcblNpdGVzQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdTaXRlcyc7XG5leHBvcnQgdmFyIFNpdGVDb250YWluZXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuU2l0ZUNvbnRhaW5lckNvbnRleHQuZGlzcGxheU5hbWUgPSAnU2l0ZUNvbnRhaW5lcic7XG5leHBvcnQgZnVuY3Rpb24gdXNlU2l0ZXMoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoU2l0ZXNDb250ZXh0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVEZWVwTGluayhzaXRlLCBwYXJhbXMpIHtcbiAgICB2YXIgYXBwID0gdXNlU2l0ZXMoKTtcbiAgICByZXR1cm4gYXBwID09PSBudWxsIHx8IGFwcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXBwLmdldERlZXBMaW5rSGFuZGxlcigpLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZShzaXRlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNpdGVDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoU2l0ZUNvbnRhaW5lckNvbnRleHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvcEJhcihvcHRpb25zKSB7XG4gICAgdmFyIHNpdGVDb250YWluZXIgPSB1c2VTaXRlQ29udGFpbmVyKCk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2l0ZUNvbnRhaW5lciA9PT0gbnVsbCB8fCBzaXRlQ29udGFpbmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlQ29udGFpbmVyLnVwZGF0ZVRvcEJhck9wdGlvbnMob3B0aW9ucyk7XG4gICAgfSwgW29wdGlvbnMsIHNpdGVDb250YWluZXJdKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhvb2tzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICdqcy1oZWxwZXInO1xudmFyIENsYXNzU2l0ZUFuaW1hdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDbGFzc1NpdGVBbmltYXRpb24oc2l0ZVN0YXJ0Q2xhc3MsIHNpdGVFbmRDbGFzcywgZHVyYXRpb24sIHJlbW92ZUNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHJlbW92ZUNsYXNzZXMgPT09IHZvaWQgMCkgeyByZW1vdmVDbGFzc2VzID0gdHJ1ZTsgfVxuICAgICAgICB0aGlzLnNpdGVTdGFydENsYXNzID0gc2l0ZVN0YXJ0Q2xhc3M7XG4gICAgICAgIHRoaXMuc2l0ZUVuZENsYXNzID0gc2l0ZUVuZENsYXNzO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3NlcyA9IHJlbW92ZUNsYXNzZXM7XG4gICAgfVxuICAgIENsYXNzU2l0ZUFuaW1hdGlvbi5wcm90b3R5cGUuYW5pbWF0ZVNpdGVFbmQgPSBmdW5jdGlvbiAoZnJvbVNpdGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNpdGUuY2xhc3NMaXN0LmFkZCh0aGlzLnNpdGVFbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBIZWxwZXIuZGVsYXkodGhpcy5kdXJhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVDbGFzc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNpdGUuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNpdGVFbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2xhc3NTaXRlQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlU2l0ZVBvcFRvRnJvbnQgPSBmdW5jdGlvbiAoZnJvbVNpdGUsIHRvU2l0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlU2l0ZVN0YXJ0KGZyb21TaXRlLCB0b1NpdGUpO1xuICAgIH07XG4gICAgQ2xhc3NTaXRlQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlU2l0ZVN0YXJ0ID0gZnVuY3Rpb24gKF9mcm9tU2l0ZSwgdG9TaXRlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU2l0ZS5jbGFzc0xpc3QuYWRkKHRoaXMuc2l0ZVN0YXJ0Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgSGVscGVyLmRlbGF5KHRoaXMuZHVyYXRpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU2l0ZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2l0ZVN0YXJ0Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDbGFzc1NpdGVBbmltYXRpb247XG59KCkpO1xuZXhwb3J0IHsgQ2xhc3NTaXRlQW5pbWF0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGFzc1NpdGVBbmltYXRpb24uanMubWFwIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IENsYXNzU2l0ZUFuaW1hdGlvbiB9IGZyb20gJy4vQ2xhc3NTaXRlQW5pbWF0aW9uJztcbnZhciBEZWZhdWx0U2l0ZUFuaW1hdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRGVmYXVsdFNpdGVBbmltYXRpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVmYXVsdFNpdGVBbmltYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAnYW5pbWF0aW9uLW5ldy1zaXRlJywgJ2FuaW1hdGlvbi1lbmQtc2l0ZScsIDMwMCwgdHJ1ZSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIERlZmF1bHRTaXRlQW5pbWF0aW9uO1xufShDbGFzc1NpdGVBbmltYXRpb24pKTtcbmV4cG9ydCB7IERlZmF1bHRTaXRlQW5pbWF0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWZhdWx0U2l0ZUFuaW1hdGlvbi5qcy5tYXAiLCJleHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlQW5pbWF0aW9uSW50ZXJmYWNlLmpzLm1hcCIsImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBTaXRlSWRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCgtMSk7XG5TaXRlSWRDb250ZXh0LmRpc3BsYXlOYW1lID0gJ1NpdGVJZENvbnRleHQnO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNpdGVJZCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChTaXRlSWRDb250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpdGVJZENvbnRleHQuanMubWFwIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2l0ZUNvbnRhaW5lciB9IGZyb20gJy4uL1NpdGUvU2l0ZUNvbnRhaW5lcic7XG5pbXBvcnQgeyBIZWxwZXIsIFByb21pc2VXaXRoSGFuZGxlcnMgfSBmcm9tICdqcy1oZWxwZXInO1xuaW1wb3J0IHsgUm91dGVEZWVwTGlua0hhbmRsZXIgfSBmcm9tICcuL0RlZXBMaW5rcy9Sb3V0ZURlZXBMaW5rSGFuZGxlcic7XG5pbXBvcnQgeyBEZWZhdWx0U2l0ZUFuaW1hdGlvbiB9IGZyb20gJy4vU2l0ZUFuaW1hdGlvbi9EZWZhdWx0U2l0ZUFuaW1hdGlvbic7XG5pbXBvcnQgeyBTaXRlc0NvbnRleHQgfSBmcm9tICcuL0hvb2tzJztcbnZhciBpbml0aWFsU3RhdGUgPSB7XG4gICAgaXNJbml0aWFsaXplZDogZmFsc2UsXG4gICAgdmlzaWJsZVNpdGU6IC0xLFxuICAgIHNpdGVzOiBbXSxcbiAgICBhbmltYXRpb246IG51bGwsXG59O1xudmFyIFNpdGVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTaXRlcyhwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIF90aGlzLnNpdGVzID0gbmV3IE1hcCgpO1xuICAgICAgICBfdGhpcy5sYXN0U2l0ZUlkID0gMDtcbiAgICAgICAgX3RoaXMub3JkZXIgPSBbXTtcbiAgICAgICAgX3RoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICAgICAgX3RoaXMudGl0bGUgPSAnVGVzdCc7XG4gICAgICAgIF90aGlzLnVybCA9ICcnO1xuICAgICAgICBfdGhpcy5zZXRDb250YWluZXJGb3JTaXRlID0gZnVuY3Rpb24gKGlkLCBjb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5zaXRlcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2l0ZXMuZ2V0KGlkKS5jb250YWluZXJSZWZQcm9taXNlLnJlc29sdmUoY29udGFpbmVyUmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFNpdGVzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcigndGhlcmUgY2FuIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MhIElmIHJlYWN0IHVubW91bnRzIHByZXZpb3VzIGluc3RhbmNlLCBjaGVjayB5b3VyIGNvZGUuIFRoaXMgc2hvdWxkIG5vdCBiZSBoYXBwZW5pbmchJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmRlZXBMaW5rSGFuZGxlcikge1xuICAgICAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyID0gcHJvcHMuZGVlcExpbmtIYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyID0gbmV3IFJvdXRlRGVlcExpbmtIYW5kbGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmFuaW1hdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIF90aGlzLmFuaW1hdGlvbkhhbmRsZXIgPSBwcm9wcy5hbmltYXRpb25IYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuYW5pbWF0aW9uSGFuZGxlciA9IG5ldyBEZWZhdWx0U2l0ZUFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmJhc2VQYXRoID0gSGVscGVyLm5vbk51bGwocHJvcHMuYmFzZVBhdGgsICcnKTtcbiAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyLnNldEJhc2VQYXRoKF90aGlzLmJhc2VQYXRoKTtcbiAgICAgICAgX3RoaXMudXJsID0gX3RoaXMuYmFzZVBhdGg7XG4gICAgICAgIFNpdGVzLmluc3RhbmNlID0gX3RoaXM7XG4gICAgICAgIC8vIFB1c2ggc3RhdGUgaW4gb3JkZXIgdG8gYWxsb3cgYmFja3dhcmQgbmF2aWdhdGlvblxuICAgICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5vblBvcFN0YXRlKGUpOyB9O1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgX3RoaXMudGl0bGUsIF90aGlzLnVybCk7XG4gICAgICAgIF90aGlzLnN0YXJ0Rmlyc3RTaXRlKCk7XG4gICAgICAgIF90aGlzLnJlc29sdmVJbml0aWFsaXNhdGlvblByb21pc2UoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTaXRlcy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfTtcbiAgICBTaXRlcy5hZGRJbml0aWFsaXphdGlvbiA9IGZ1bmN0aW9uIChpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcy5wdXNoKHRoaXMuYXBwQ3JlYXRlZFByb21pc2UudGhlbihpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcy5wdXNoKGluaXRpYWxpemF0aW9uRnVuY09yUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoX3ByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfYyA9IHRoaXMuc3RhdGUsIHZpc2libGVTaXRlID0gX2MudmlzaWJsZVNpdGUsIGFuaW1hdGlvbiA9IF9jLmFuaW1hdGlvbjtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS52aXNpYmxlU2l0ZSAhPT0gdmlzaWJsZVNpdGUpIHtcbiAgICAgICAgICAgIHZhciBzaXRlQ29udGFpbmVyID0gdGhpcy5zaXRlcy5nZXQodmlzaWJsZVNpdGUpO1xuICAgICAgICAgICAgaWYgKHNpdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVybCA9IHRoaXMuZGVlcExpbmtIYW5kbGVyLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZShzaXRlQ29udGFpbmVyLnNpdGUsIHNpdGVDb250YWluZXIucHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSB0aGlzLmJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIHRoaXMudGl0bGUsIHRoaXMudXJsKTtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnNpdGVzLmdldChhbmltYXRpb24ubGVhdmluZ1NpdGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGFpbmVyUmVmUHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5zaXRlcy5nZXQodmlzaWJsZVNpdGUpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY29udGFpbmVyUmVmUHJvbWlzZSxcbiAgICAgICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRWxlbWVudFJlZiA9IF9hWzBdLCBuZXdFbGVtZW50UmVmID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRWxlbWVudCwgbmV3RWxlbWVudCwgX2IsIG5ld0FuaW1hdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEVsZW1lbnQgPSBvbGRFbGVtZW50UmVmID09PSBudWxsIHx8IG9sZEVsZW1lbnRSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZEVsZW1lbnRSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBuZXdFbGVtZW50UmVmID09PSBudWxsIHx8IG5ld0VsZW1lbnRSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0VsZW1lbnRSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9sZEVsZW1lbnQgJiYgbmV3RWxlbWVudCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBhbmltYXRpb24udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BvcC10by1mcm9udCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hbmltYXRpb25IYW5kbGVyLmFuaW1hdGVTaXRlU3RhcnQob2xkRWxlbWVudCwgbmV3RWxlbWVudCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFuaW1hdGlvbkhhbmRsZXIuYW5pbWF0ZVNpdGVQb3BUb0Zyb250KG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hbmltYXRpb25IYW5kbGVyLmFuaW1hdGVTaXRlRW5kKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXRlcy5kZWxldGUoYW5pbWF0aW9uLmxlYXZpbmdTaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGFwcCBlbmRlZCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvIGJhY2sgMiwgYmVjYXVzZSBmaXJzdCBvbmUgaXMgb3duIHB1c2hlZCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlbmRpbmcgc2l0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LmdvKC0yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QW5pbWF0aW9uID0gdGhpcy5zdGF0ZS5hbmltYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGFuaW1hdGlvbiA9PT0gbmV3QW5pbWF0aW9uID8gbnVsbCA6IG5ld0FuaW1hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlczogQXJyYXkuZnJvbSh0aGlzLnNpdGVzLnZhbHVlcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuc3RhdGUsIGlzSW5pdGlhbGl6ZWQgPSBfYS5pc0luaXRpYWxpemVkLCBzaXRlcyA9IF9hLnNpdGVzLCB2aXNpYmxlU2l0ZSA9IF9hLnZpc2libGVTaXRlLCBhbmltYXRpb24gPSBfYS5hbmltYXRpb247XG4gICAgICAgIHZhciBfYiA9IHRoaXMucHJvcHMsIHN0eWxlID0gX2Iuc3R5bGUsIGNsYXNzTmFtZSA9IF9iLmNsYXNzTmFtZSwgc2l0ZUNvbnRhaW5lckNsYXNzID0gX2Iuc2l0ZUNvbnRhaW5lckNsYXNzLCBjb250ZW50V3JhcHBlciA9IF9iLmNvbnRlbnRXcmFwcGVyO1xuICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50ID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICdzaXRlQ29udGFpbmVyJyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTaXRlc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMgfSwgc2l0ZXMubWFwKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNpdGVDb250YWluZXIsIHsgdmlzaWJsZTogZGF0YS5pZCA9PT0gdmlzaWJsZVNpdGUgfHwgZGF0YS5pZCA9PT0gKGFuaW1hdGlvbiA9PT0gbnVsbCB8fCBhbmltYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFuaW1hdGlvbi5sZWF2aW5nU2l0ZSksIGxlYXZpbmc6IGRhdGEuaWQgPT09IChhbmltYXRpb24gPT09IG51bGwgfHwgYW5pbWF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbmltYXRpb24ubGVhdmluZ1NpdGUpLCBzaXRlQ29tcG9uZW50OiBkYXRhLnNpdGUsIGtleTogZGF0YS5pZCwgaWQ6IGRhdGEuaWQsIHNpdGVQcm9wczogZGF0YS5wcm9wcywgc2l0ZUNvbnRhaW5lckNsYXNzOiBzaXRlQ29udGFpbmVyQ2xhc3MsIG9uQ29udGFpbmVyTGlzdGVuZXI6IF90aGlzLnNldENvbnRhaW5lckZvclNpdGUgfSkpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgIGlmIChjb250ZW50V3JhcHBlcikge1xuICAgICAgICAgICAgdmFyIFdyYXBwZXIgPSBjb250ZW50V3JhcHBlcjtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIG51bGwsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnN0YXJ0Rmlyc3RTaXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRTaXRlLCB1cmxQYXRoLCBkZWVwTGlua1NpdGVEYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTaXRlID0gdGhpcy5wcm9wcy5zdGFydFNpdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWVwTGlua1NpdGVEYXRhID0gdGhpcy5kZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlU2l0ZSh1cmxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVlcExpbmtTaXRlRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U2l0ZShkZWVwTGlua1NpdGVEYXRhLnNpdGUsIGRlZXBMaW5rU2l0ZURhdGEucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTaXRlKHN0YXJ0U2l0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnJlc29sdmVJbml0aWFsaXNhdGlvblByb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXRlcy5hcHBDcmVhdGVkUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKFNpdGVzLmluaXRpYWxpc2F0aW9uUHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNJbml0aWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUub25Qb3BTdGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdwb3BTdGF0ZSBmaXJlZCcpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIHB1c2hTdGF0ZSBzbyB0aGF0IHlvdSBjYW4gZ28gYmFjayBhZ2FpblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgdGhpcy50aXRsZSwgdGhpcy51cmwpO1xuICAgICAgICB0aGlzLmdvQmFjaygpO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLmNhbkdvQmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXIubGVuZ3RoID4gMTtcbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5nb0JhY2sgPSBmdW5jdGlvbiAoY2FsbE9uQmFja0xpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGNhbGxPbkJhY2tMaXN0ZW5lciA9PT0gdm9pZCAwKSB7IGNhbGxPbkJhY2tMaXN0ZW5lciA9IHRydWU7IH1cbiAgICAgICAgdmFyIGN1cnJlbnRTaXRlSWQgPSB0aGlzLm9yZGVyW3RoaXMub3JkZXIubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjYWxsT25CYWNrTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IChfYSA9IHRoaXMuc2l0ZXMuZ2V0KGN1cnJlbnRTaXRlSWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25CYWNrTGlzdGVuZXI7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIgJiYgbGlzdGVuZXIoKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNpdGUoY3VycmVudFNpdGVJZCk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuZ2V0RGVlcExpbmtIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWVwTGlua0hhbmRsZXI7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuYWRkRGVlcExpbmsgPSBmdW5jdGlvbiAobGluaywgc2l0ZSkge1xuICAgICAgICB0aGlzLmRlZXBMaW5rSGFuZGxlci5zZXQobGluaywgc2l0ZSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuc3RhcnRTaXRlID0gZnVuY3Rpb24gKHNpdGUsIHByb3BzKSB7XG4gICAgICAgIHZhciB2aXNpYmxlU2l0ZSA9IHRoaXMuc3RhdGUudmlzaWJsZVNpdGU7XG4gICAgICAgIHZhciBuZXh0SWQgPSArK3RoaXMubGFzdFNpdGVJZDtcbiAgICAgICAgdGhpcy5zaXRlcy5zZXQobmV4dElkLCB7XG4gICAgICAgICAgICBzaXRlOiBzaXRlLFxuICAgICAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICAgICAgaWQ6IG5leHRJZCxcbiAgICAgICAgICAgIGNvbnRhaW5lclJlZlByb21pc2U6IG5ldyBQcm9taXNlV2l0aEhhbmRsZXJzKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9yZGVyLnB1c2gobmV4dElkKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB2aXNpYmxlU2l0ZTogbmV4dElkLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHZpc2libGVTaXRlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2l0ZXM6IEFycmF5LmZyb20odGhpcy5zaXRlcy52YWx1ZXMoKSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnNob3dTaXRlID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICBpZiAodGhpcy5zaXRlcy5oYXMoc2l0ZUlkKSkge1xuICAgICAgICAgICAgdmFyIHZpc2libGVTaXRlID0gdGhpcy5zdGF0ZS52aXNpYmxlU2l0ZTtcbiAgICAgICAgICAgIHZhciBvcmRlckluZGV4ID0gdGhpcy5vcmRlci5pbmRleE9mKHNpdGVJZCk7XG4gICAgICAgICAgICBpZiAob3JkZXJJbmRleCAhPT0gdGhpcy5vcmRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9yZGVySW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyLnNwbGljZShvcmRlckluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXIucHVzaChzaXRlSWQpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmlzaWJsZVNpdGU6IHNpdGVJZCxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHZpc2libGVTaXRlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncG9wLXRvLWZyb250JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5yZW1vdmVTaXRlID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3JkZXJJbmRleCwgdmlzaWJsZVNpdGVJbmRleCwgdmlzaWJsZVNpdGVJZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaXRlcy5oYXMoc2l0ZUlkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlckluZGV4ID0gdGhpcy5vcmRlci5pbmRleE9mKHNpdGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUluZGV4ID0gdGhpcy5vcmRlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlci5zcGxpY2Uob3JkZXJJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmRlckluZGV4ID09PSB2aXNpYmxlU2l0ZUluZGV4KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUlkID0gdmlzaWJsZVNpdGVJbmRleCA+PSAwID8gdGhpcy5vcmRlclt2aXNpYmxlU2l0ZUluZGV4XSA6IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVTaXRlOiB2aXNpYmxlU2l0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHNpdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNpdGVzLmRlbGV0ZShzaXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNpdGVzOiBBcnJheS5mcm9tKHRoaXMuc2l0ZXMudmFsdWVzKCkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuZ2V0U2l0ZURhdGFCeUlkID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXRlcy5nZXQoc2l0ZUlkKTtcbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5zZXRPbkJhY2tMaXN0ZW5lciA9IGZ1bmN0aW9uIChzaXRlSWQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBzaXRlQ29udGFpbmVyID0gdGhpcy5zaXRlcy5nZXQoc2l0ZUlkKTtcbiAgICAgICAgaWYgKHNpdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgIHNpdGVDb250YWluZXIub25CYWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2l0ZXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcyA9IFtdO1xuICAgIFNpdGVzLmFwcENyZWF0ZWRQcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICByZXR1cm4gU2l0ZXM7XG59KFB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFNpdGVzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlcy5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBEZXZpY2VSZWFkeSA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHN0eWxlID0gX2Euc3R5bGUsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZShmYWxzZSksIGlzUmVhZHkgPSBfYlswXSwgc2V0SXNSZWFkeSA9IF9iWzFdO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0SXNSZWFkeSh0cnVlKTsgfSk7XG4gICAgfSwgW10pO1xuICAgIGlmIChpc1JlYWR5KSB7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lIH0sIGNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXZpY2VSZWFkeS5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xuLyoqXG4gKiBQcm9taXNlLVdyYXBwZXItS2xhc3NlIGbDvHIgTmF0aXZlLVN0b3JhZ2VcbiAqL1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0hlbHBlcic7XG5pbXBvcnQgeyBKc29uSGVscGVyIH0gZnJvbSAnanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0pzb25IZWxwZXInO1xuaW1wb3J0IHsgQXJyYXlIZWxwZXIsIFByb21pc2VXaXRoSGFuZGxlcnMgfSBmcm9tICdqcy1oZWxwZXInO1xuaW1wb3J0IHsgU2l0ZXMgfSBmcm9tICcuL0FwcC9TaXRlcyc7XG52YXIgTmF0aXZlU3RvcmFnZVByb21pc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmF0aXZlU3RvcmFnZVByb21pc2UoKSB7XG4gICAgfVxuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmlzRWxlY3Ryb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFbGVjdHJvbicpID49IDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0enQgZWluIEl0ZW0gZsO8ciBOYXRpdmVTdG9yYWdlXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2Uuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZWN0cm9uU3RvcmFnZS5zZXQoX3RoaXMucHJlZml4ICsga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgcmV0dXJuIE5hdGl2ZVN0b3JhZ2Uuc2V0SXRlbShfdGhpcy5wcmVmaXggKyBrZXksIHZhbHVlLCByZXMsIHJlaik7IH0pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5wcmVmaXggKyBrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJla29tbWUgZWluIEl0ZW0gdm9uIE5hdGl2ZVN0b3JhZ2VcbiAgICAgKi9cbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5nZXRJdGVtID0gZnVuY3Rpb24gKGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlY3Ryb25TdG9yYWdlLmdldChfdGhpcy5wcmVmaXggKyBrZXksIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKEhlbHBlci5ub25OdWxsKF90aGlzLmNhY2hlW190aGlzLnByZWZpeCArIGtleV0sIGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKEpzb25IZWxwZXIuZGVlcEVxdWFsKGRhdGEsIHt9KSA/IGRlZmF1bHRWYWx1ZSA6IGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlU3RvcmFnZS5nZXRJdGVtKF90aGlzLnByZWZpeCArIGtleSwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHJlcyhIZWxwZXIubm9uTnVsbChkYXRhLCBkZWZhdWx0VmFsdWUpKTsgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhIZWxwZXIubm9uTnVsbChfdGhpcy5jYWNoZVtfdGhpcy5wcmVmaXggKyBrZXldLCBkZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJla29tbWUgZGllIEtleXMgdm9tIE5hdGl2ZVN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmdldEFsbEtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGVyc2lzdGVudCkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNFbGVjdHJvbigpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZWxlY3Ryb25TdG9yYWdlLmtleXMoZnVuY3Rpb24gKGVyciwgZWxlY3Ryb25LZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZWxlY3Ryb25LZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHJldHVybiBOYXRpdmVTdG9yYWdlLmtleXMocmVzLCByZWopOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qLywga2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoX3RoaXMucHJlZml4KTsgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5yZW1vdmUoa2V5KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbnRmZXJudCBlaW4gT2JqZWN0IGF1cyBkZW0gTmF0aXZlU3RvcmFnZVxuICAgICAqXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UucmVtb3ZlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW3RoaXMucHJlZml4ICsga2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVjdHJvblN0b3JhZ2UucmVtb3ZlKF90aGlzLnByZWZpeCArIGtleSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyByZXR1cm4gTmF0aXZlU3RvcmFnZS5yZW1vdmUoX3RoaXMucHJlZml4ICsga2V5LCByZXMsIHJlaik7IH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbnRmZXJudCBhbGxlIE9iamVjdHMgYXVzIGRlbSBOYXRpdmVTdG9yYWdlXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEFsbEtleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlbW92ZShrZXkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSwgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UubWFrZVBlcnNpc3RlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5wZXJzaXN0ZW50KSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goT2JqZWN0LmtleXModGhpcy5jYWNoZSksIGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXRJdGVtKGtleSwgdGhpcy5jYWNoZVtrZXldKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0sIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5tYWtlVW5wZXJzaXN0ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIga2V5cywgdmFsdWVzXzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wZXJzaXN0ZW50KSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0QWxsS2V5cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc18xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHZhbHVlc18xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRJdGVtKGtleSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FbX2JdID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xlYXIoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZSA9IHZhbHVlc18xO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5jYWNoZSA9IHt9O1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnByZWZpeCA9ICcnO1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnBlcnNpc3RlbnQgPSB0cnVlO1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmVsZWN0cm9uU3RvcmFnZSA9IG51bGw7XG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICByZXR1cm4gTmF0aXZlU3RvcmFnZVByb21pc2U7XG59KCkpO1xuZXhwb3J0IHsgTmF0aXZlU3RvcmFnZVByb21pc2UgfTtcblNpdGVzLmFkZEluaXRpYWxpemF0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmluaXRpYWxpemF0aW9uUHJvbWlzZS5yZXNvbHZlKCk7IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlU3RvcmFnZVByb21pc2UuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTaXRlSWQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTaXRlcyB9IGZyb20gJy4uL0FwcC9Ib29rcyc7XG5leHBvcnQgdmFyIEZpbmlzaFNpdGVMaW5rID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc3R5bGUgPSBfYS5zdHlsZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lO1xuICAgIHZhciBpZCA9IHVzZVNpdGVJZCgpO1xuICAgIHZhciBzaXRlcyA9IHVzZVNpdGVzKCk7XG4gICAgdmFyIG9uQ2xpY2tIYW5kbGVyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHNpdGVzID09PSBudWxsIHx8IHNpdGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlcy5yZW1vdmVTaXRlKGlkKTtcbiAgICAgICAgfVxuICAgIH0sIFtpZCwgc2l0ZXNdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyBzdHlsZTogc3R5bGUsIG9uQ2xpY2s6IG9uQ2xpY2tIYW5kbGVyLCBjbGFzc05hbWU6IGNsYXNzTmFtZSwgdHlwZTogXCJidXR0b25cIiB9LCBjaGlsZHJlbikpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5pc2hTaXRlTGluay5qcy5tYXAiLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuaW1wb3J0IHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbnZhciBkZWZhdWx0U3RhdGUgPSB7fTtcbnZhciBTaXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNpdGUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIERpcmVjdGlvbiwgY2FsbCBjb21wb25lbnREaWRBcHBlYXIgYWZ0ZXIgZGlkTW91bnRcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jb21wb25lbnREaWRBcHBlYXIoKTsgfSwgMSk7XG4gICAgfTtcbiAgICBTaXRlLnByb3RvdHlwZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIHZpc2libGUgPSB0aGlzLnByb3BzLnZpc2libGU7XG4gICAgICAgIGlmIChwcmV2UHJvcHMudmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxBcHBlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50V2lsbERpc2FwcGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcykge1xuICAgICAgICB2YXIgdmlzaWJsZSA9IHRoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgICAgaWYgKHByZXZQcm9wcy52aXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RGlkQXBwZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudERpZERpc2FwcGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTaXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRXaWxsRGlzYXBwZWFyKCk7XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBTaXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsQXBwZWFyID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIFNpdGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxEaXNhcHBlYXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkQXBwZWFyID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIFNpdGUucHJvdG90eXBlLmNvbXBvbmVudERpZERpc2FwcGVhciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICByZXR1cm4gU2l0ZTtcbn0oUHVyZUNvbXBvbmVudCkpO1xuZXhwb3J0IHsgU2l0ZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2l0ZS5qcy5tYXAiLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNpdGVJZENvbnRleHQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5pbXBvcnQgeyBUb3BCYXIgfSBmcm9tICcuL1RvcEJhci9Ub3BCYXInO1xuaW1wb3J0IHsgU2l0ZUNvbnRhaW5lckNvbnRleHQgfSBmcm9tICcuLi9BcHAvSG9va3MnO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbnZhciBpbml0aWFsVG9wQmFyT3B0aW9ucyA9IHtcbiAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgIGxlZnRCdXR0b25zOiBbXSxcbiAgICByaWdodEJ1dHRvbnM6IFtdLFxuICAgIGJhY2tCdXR0b246IHVuZGVmaW5lZCxcbn07XG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICAgIHRvcEJhck9wdGlvbnM6IGluaXRpYWxUb3BCYXJPcHRpb25zLFxufTtcbnZhciBTaXRlQ29udGFpbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlQ29udGFpbmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNpdGVDb250YWluZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgX3RoaXMuY29udGFpbmVyID0gY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLmNoaWxkID0gY3JlYXRlUmVmKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgU2l0ZUNvbnRhaW5lci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIHZpc2libGUgPSBfYS52aXNpYmxlLCBvbkNvbnRhaW5lckxpc3RlbmVyID0gX2Eub25Db250YWluZXJMaXN0ZW5lciwgaWQgPSBfYS5pZDtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGQuY3VycmVudCAmJiAhdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZC5jdXJyZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNvbnRhaW5lckxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvbkNvbnRhaW5lckxpc3RlbmVyKGlkLCB0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcykge1xuICAgICAgICB2YXIgdmlzaWJsZSA9IHRoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgICAgaWYgKCFwcmV2UHJvcHMudmlzaWJsZSAmJiB2aXNpYmxlICYmIHRoaXMuY29udGFpbmVyLmN1cnJlbnQgJiYgdGhpcy5jaGlsZC5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jdXJyZW50LmFwcGVuZENoaWxkKHRoaXMuY2hpbGQuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTaXRlQ29udGFpbmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzKSB7XG4gICAgICAgIHZhciB2aXNpYmxlID0gdGhpcy5wcm9wcy52aXNpYmxlO1xuICAgICAgICBpZiAoIXZpc2libGUgJiYgcHJldlByb3BzLnZpc2libGUgJiYgdGhpcy5jaGlsZC5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmN1cnJlbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgc2l0ZUNvbXBvbmVudCA9IF9hLnNpdGVDb21wb25lbnQsIHNpdGVDb250YWluZXJTdHlsZSA9IF9hLnNpdGVDb250YWluZXJTdHlsZSwgc2l0ZVByb3BzID0gX2Euc2l0ZVByb3BzLCB2aXNpYmxlID0gX2EudmlzaWJsZSwgaWQgPSBfYS5pZCwgbGVhdmluZyA9IF9hLmxlYXZpbmcsIHNpdGVDb250YWluZXJDbGFzcyA9IF9hLnNpdGVDb250YWluZXJDbGFzcztcbiAgICAgICAgdmFyIEJhc2UgPSBzaXRlQ29tcG9uZW50O1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLnRvcEJhck9wdGlvbnMsIHRpdGxlID0gX2IudGl0bGUsIHJpZ2h0QnV0dG9ucyA9IF9iLnJpZ2h0QnV0dG9ucywgbGVmdEJ1dHRvbnMgPSBfYi5sZWZ0QnV0dG9ucywgYmFja0J1dHRvbiA9IF9iLmJhY2tCdXR0b247XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogdGhpcy5jb250YWluZXIsIHN0eWxlOiBzaXRlQ29udGFpbmVyU3R5bGUsIGNsYXNzTmFtZTogc2l0ZUNvbnRhaW5lckNsYXNzIHx8ICdzaXRlJyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogdGhpcy5jaGlsZCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2l0ZUNvbnRhaW5lckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTaXRlSWRDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBpZCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChUb3BCYXIsIHsgdGl0bGU6IHRpdGxlLCByaWdodEJ1dHRvbnM6IHJpZ2h0QnV0dG9ucywgbGVmdEJ1dHRvbnM6IGxlZnRCdXR0b25zLCBiYWNrQnV0dG9uOiBiYWNrQnV0dG9uIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIHsgZmx1aWQ6IFwieHhsXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2UsIF9fYXNzaWduKHsgdmlzaWJsZTogdmlzaWJsZSwgbGVhdmluZzogbGVhdmluZyB9LCBzaXRlUHJvcHMsIHsgaWQ6IGlkIH0pKSkpKSkpKTtcbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRvcEJhck9wdGlvbnMgPSBmdW5jdGlvbiAobmV3T3B0aW9ucykge1xuICAgICAgICB2YXIgdG9wQmFyT3B0aW9ucyA9IHRoaXMuc3RhdGUudG9wQmFyT3B0aW9ucztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB0b3BCYXJPcHRpb25zOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdG9wQmFyT3B0aW9ucyksIG5ld09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBTaXRlQ29udGFpbmVyO1xufShSZWFjdC5QdXJlQ29tcG9uZW50KSk7XG5leHBvcnQgeyBTaXRlQ29udGFpbmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlQ29udGFpbmVyLmpzLm1hcCIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNyZWF0ZURlZXBMaW5rLCB1c2VTaXRlcyB9IGZyb20gJy4uL0FwcC9Ib29rcyc7XG5pbXBvcnQgeyB1c2VTaXRlSWQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5mdW5jdGlvbiBjcmVhdGVTaXRlTGlua0Z1bmMoKSB7XG4gICAgdmFyIFNpdGVMaW5rID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHNpdGVJZCA9IF9hLnNpdGVJZCwgc2l0ZSA9IF9hLnNpdGUsIHNpdGVQcm9wcyA9IF9hLnNpdGVQcm9wcywgc3R5bGUgPSBfYS5zdHlsZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2IgPSBfYS5maW5pc2hDdXJyZW50LCBmaW5pc2hDdXJyZW50ID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgICAgIHZhciBzaXRlcyA9IHVzZVNpdGVzKCk7XG4gICAgICAgIHZhciBjdXJyZW50U2l0ZUlkID0gdXNlU2l0ZUlkKCk7XG4gICAgICAgIHZhciBvbkNsaWNrSGFuZGxlciA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoc2l0ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuc2hvd1NpdGUoc2l0ZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpdGUpIHtcbiAgICAgICAgICAgICAgICBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuc3RhcnRTaXRlKHNpdGUsIHNpdGVQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmluaXNoQ3VycmVudCkge1xuICAgICAgICAgICAgICAgIHNpdGVzID09PSBudWxsIHx8IHNpdGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlcy5yZW1vdmVTaXRlKGN1cnJlbnRTaXRlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBbc2l0ZSwgc2l0ZVByb3BzLCBzaXRlSWQsIHNpdGVzLCBmaW5pc2hDdXJyZW50LCBjdXJyZW50U2l0ZUlkXSk7XG4gICAgICAgIGlmICghc2l0ZSAmJiB0eXBlb2Ygc2l0ZUlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuZ2V0U2l0ZURhdGFCeUlkKHNpdGVJZCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICAgICAgICAgICAgICBzaXRlUHJvcHMgPSBkYXRhLnByb3BzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNpdGUgaXMgdW5kZWZpbmVkIHdpdGggaWQgXCIgKyBzaXRlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaW5rID0gdXNlQ3JlYXRlRGVlcExpbmsoc2l0ZSwgc2l0ZVByb3BzKTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7IHJvbGU6IFwiYnV0dG9uXCIsIHN0eWxlOiBzdHlsZSwgb25DbGljazogb25DbGlja0hhbmRsZXIsIGhyZWY6IGxpbmsgfSwgY2hpbGRyZW4pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gU2l0ZUxpbms7XG59XG5leHBvcnQgdmFyIFNpdGVMaW5rID0gY3JlYXRlU2l0ZUxpbmtGdW5jKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlTGluay5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRvcEJhckJ1dHRvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUnO1xuaW1wb3J0IHsgdXNlU2l0ZXMgfSBmcm9tICcuLi8uLi9BcHAvSG9va3MnO1xuZXhwb3J0IHZhciBCYWNrQnV0dG9uID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2l0ZXMgPSB1c2VTaXRlcygpO1xuICAgIHZhciBnb0JhY2sgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuZ29CYWNrKCk7IH0sIFtzaXRlc10pO1xuICAgIGlmIChzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuY2FuR29CYWNrKCkpIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFRvcEJhckJ1dHRvbiwgeyBvbkNsaWNrOiBnb0JhY2sgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcImJhY2stYnV0dG9uLWltZ1wiIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYWNrQnV0dG9uLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJhY2tCdXR0b24gfSBmcm9tICcuL0JhY2tCdXR0b24nO1xuaW1wb3J0IHsgVG9wQmFyIGFzIEJNVG9wQmFyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5leHBvcnQgdmFyIFRvcEJhciA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EuYmFja0J1dHRvbiwgYmFja0J1dHRvbiA9IF9iID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfYiwgX2MgPSBfYS50aXRsZSwgdGl0bGUgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5yaWdodEJ1dHRvbnMsIHJpZ2h0QnV0dG9ucyA9IF9kID09PSB2b2lkIDAgPyBbXSA6IF9kLCBfZSA9IF9hLmxlZnRCdXR0b25zLCBsZWZ0QnV0dG9ucyA9IF9lID09PSB2b2lkIDAgPyBbXSA6IF9lO1xuICAgIGlmIChiYWNrQnV0dG9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYmFja0J1dHRvbiA9IHsgY29tcG9uZW50OiBCYWNrQnV0dG9uIH07XG4gICAgfVxuICAgIGlmIChiYWNrQnV0dG9uICE9PSBmYWxzZSkge1xuICAgICAgICBsZWZ0QnV0dG9ucyA9IGxlZnRCdXR0b25zLnNsaWNlKDAsIGxlZnRCdXR0b25zLmxlbmd0aCk7XG4gICAgICAgIGxlZnRCdXR0b25zLnVuc2hpZnQoYmFja0J1dHRvbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJNVG9wQmFyLCB7IHRpdGxlOiB0aXRsZSwgcmlnaHRCdXR0b25zOiByaWdodEJ1dHRvbnMsIGxlZnRCdXR0b25zOiBsZWZ0QnV0dG9ucyB9KTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyLmpzLm1hcCIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsInZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBmaW5kKGl0ZXIsIHRhciwga2V5KSB7XG5cdGZvciAoa2V5IG9mIGl0ZXIua2V5cygpKSB7XG5cdFx0aWYgKGRlcXVhbChrZXksIHRhcikpIHJldHVybiBrZXk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcXVhbChmb28sIGJhcikge1xuXHR2YXIgY3RvciwgbGVuLCB0bXA7XG5cdGlmIChmb28gPT09IGJhcikgcmV0dXJuIHRydWU7XG5cblx0aWYgKGZvbyAmJiBiYXIgJiYgKGN0b3I9Zm9vLmNvbnN0cnVjdG9yKSA9PT0gYmFyLmNvbnN0cnVjdG9yKSB7XG5cdFx0aWYgKGN0b3IgPT09IERhdGUpIHJldHVybiBmb28uZ2V0VGltZSgpID09PSBiYXIuZ2V0VGltZSgpO1xuXHRcdGlmIChjdG9yID09PSBSZWdFeHApIHJldHVybiBmb28udG9TdHJpbmcoKSA9PT0gYmFyLnRvU3RyaW5nKCk7XG5cblx0XHRpZiAoY3RvciA9PT0gQXJyYXkpIHtcblx0XHRcdGlmICgobGVuPWZvby5sZW5ndGgpID09PSBiYXIubGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBkZXF1YWwoZm9vW2xlbl0sIGJhcltsZW5dKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gU2V0KSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW47XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYmFyLmhhcyh0bXApKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gTWFwKSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW5bMF07XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZGVxdWFsKGxlblsxXSwgYmFyLmdldCh0bXApKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG5cdFx0XHRmb28gPSBuZXcgVWludDhBcnJheShmb28pO1xuXHRcdFx0YmFyID0gbmV3IFVpbnQ4QXJyYXkoYmFyKTtcblx0XHR9IGVsc2UgaWYgKGN0b3IgPT09IERhdGFWaWV3KSB7XG5cdFx0XHRpZiAoKGxlbj1mb28uYnl0ZUxlbmd0aCkgPT09IGJhci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBmb28uZ2V0SW50OChsZW4pID09PSBiYXIuZ2V0SW50OChsZW4pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZm9vKSkge1xuXHRcdFx0aWYgKChsZW49Zm9vLmJ5dGVMZW5ndGgpID09PSBiYXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZm9vW2xlbl0gPT09IGJhcltsZW5dKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmICghY3RvciB8fCB0eXBlb2YgZm9vID09PSAnb2JqZWN0Jykge1xuXHRcdFx0bGVuID0gMDtcblx0XHRcdGZvciAoY3RvciBpbiBmb28pIHtcblx0XHRcdFx0aWYgKGhhcy5jYWxsKGZvbywgY3RvcikgJiYgKytsZW4gJiYgIWhhcy5jYWxsKGJhciwgY3RvcikpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYgKCEoY3RvciBpbiBiYXIpIHx8ICFkZXF1YWwoZm9vW2N0b3JdLCBiYXJbY3Rvcl0pKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoYmFyKS5sZW5ndGggPT09IGxlbjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9vICE9PSBmb28gJiYgYmFyICE9PSBiYXI7XG59XG4iLCJpbXBvcnQgb3duZXJEb2N1bWVudCBmcm9tICcuL293bmVyRG9jdW1lbnQnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmVseSBmb2N1c2VkIGVsZW1lbnQgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBkb2MgdGhlIGRvY3VtZW50IHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWN0aXZlRWxlbWVudChkb2MpIHtcbiAgaWYgKGRvYyA9PT0gdm9pZCAwKSB7XG4gICAgZG9jID0gb3duZXJEb2N1bWVudCgpO1xuICB9XG5cbiAgLy8gU3VwcG9ydDogSUUgOSBvbmx5XG4gIC8vIElFOSB0aHJvd3MgYW4gXCJVbnNwZWNpZmllZCBlcnJvclwiIGFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGZyb20gYW4gPGlmcmFtZT5cbiAgdHJ5IHtcbiAgICB2YXIgYWN0aXZlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7IC8vIElFMTEgcmV0dXJucyBhIHNlZW1pbmdseSBlbXB0eSBvYmplY3QgaW4gc29tZSBjYXNlcyB3aGVuIGFjY2Vzc2luZ1xuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgZnJvbSBhbiA8aWZyYW1lPlxuXG4gICAgaWYgKCFhY3RpdmUgfHwgIWFjdGl2ZS5ub2RlTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFjdGl2ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGllIHRocm93cyBpZiBubyBhY3RpdmUgZWxlbWVudCAqL1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufSIsImltcG9ydCBoYXNDbGFzcyBmcm9tICcuL2hhc0NsYXNzJztcbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3MgbmFtZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO2Vsc2UgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJykgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArIFwiIFwiICsgY2xhc3NOYW1lO2Vsc2UgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZW1lbnQuY2xhc3NOYW1lICYmIGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgJycpICsgXCIgXCIgKyBjbGFzc05hbWUpO1xufSIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXJldHVybi1hc3NpZ24gKi9cbmltcG9ydCBjYW5Vc2VET00gZnJvbSAnLi9jYW5Vc2VET00nO1xuZXhwb3J0IHZhciBvcHRpb25zU3VwcG9ydGVkID0gZmFsc2U7XG5leHBvcnQgdmFyIG9uY2VTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgZ2V0IHBhc3NpdmUoKSB7XG4gICAgICByZXR1cm4gb3B0aW9uc1N1cHBvcnRlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGdldCBvbmNlKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuICAgICAgcmV0dXJuIG9uY2VTdXBwb3J0ZWQgPSBvcHRpb25zU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgfTtcblxuICBpZiAoY2FuVXNlRE9NKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIHRydWUpO1xuICB9XG59IGNhdGNoIChlKSB7XG4gIC8qICovXG59XG5cbi8qKlxuICogQW4gYGFkZEV2ZW50TGlzdGVuZXJgIHBvbnlmaWxsLCBzdXBwb3J0cyB0aGUgYG9uY2VgIG9wdGlvblxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICogQHBhcmFtIGV2ZW50TmFtZSB0aGUgZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZSB0aGUgaGFuZGxlclxuICogQHBhcmFtIG9wdGlvbnMgZXZlbnQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmICFvbmNlU3VwcG9ydGVkKSB7XG4gICAgdmFyIG9uY2UgPSBvcHRpb25zLm9uY2UsXG4gICAgICAgIGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmU7XG4gICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gaGFuZGxlcjtcblxuICAgIGlmICghb25jZVN1cHBvcnRlZCAmJiBvbmNlKSB7XG4gICAgICB3cmFwcGVkSGFuZGxlciA9IGhhbmRsZXIuX19vbmNlIHx8IGZ1bmN0aW9uIG9uY2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIG9uY2VIYW5kbGVyLCBjYXB0dXJlKTtcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZXIuX19vbmNlID0gd3JhcHBlZEhhbmRsZXI7XG4gICAgfVxuXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgd3JhcHBlZEhhbmRsZXIsIG9wdGlvbnNTdXBwb3J0ZWQgPyBvcHRpb25zIDogY2FwdHVyZSk7XG4gIH1cblxuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWRkRXZlbnRMaXN0ZW5lcjsiLCJ2YXIgckh5cGhlbiA9IC8tKC4pL2c7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJIeXBoZW4sIGZ1bmN0aW9uIChfLCBjaHIpIHtcbiAgICByZXR1cm4gY2hyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufSIsImV4cG9ydCBkZWZhdWx0ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSwgbm8tY29uZC1hc3NpZ24gKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZWxlbWVudCBjb250YWlucyBhbm90aGVyIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGVsZW1lbnRcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbnRleHQsIG5vZGUpIHtcbiAgLy8gSFRNTCBET00gYW5kIFNWRyBET00gbWF5IGhhdmUgZGlmZmVyZW50IHN1cHBvcnQgbGV2ZWxzLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIG9uIGNvbnRleHQgaW5zdGVhZCBvZiBhIGRvY3VtZW50IHJvb3QgZWxlbWVudC5cbiAgaWYgKGNvbnRleHQuY29udGFpbnMpIHJldHVybiBjb250ZXh0LmNvbnRhaW5zKG5vZGUpO1xuICBpZiAoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikgcmV0dXJuIGNvbnRleHQgPT09IG5vZGUgfHwgISEoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tICcuL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IGh5cGhlbmF0ZSBmcm9tICcuL2h5cGhlbmF0ZVN0eWxlJztcbmltcG9ydCBpc1RyYW5zZm9ybSBmcm9tICcuL2lzVHJhbnNmb3JtJztcblxuZnVuY3Rpb24gc3R5bGUobm9kZSwgcHJvcGVydHkpIHtcbiAgdmFyIGNzcyA9ICcnO1xuICB2YXIgdHJhbnNmb3JtcyA9ICcnO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShoeXBoZW5hdGUocHJvcGVydHkpKSB8fCBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoaHlwaGVuYXRlKHByb3BlcnR5KSk7XG4gIH1cblxuICBPYmplY3Qua2V5cyhwcm9wZXJ0eSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcGVydHlba2V5XTtcblxuICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgIG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoaHlwaGVuYXRlKGtleSkpO1xuICAgIH0gZWxzZSBpZiAoaXNUcmFuc2Zvcm0oa2V5KSkge1xuICAgICAgdHJhbnNmb3JtcyArPSBrZXkgKyBcIihcIiArIHZhbHVlICsgXCIpIFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3MgKz0gaHlwaGVuYXRlKGtleSkgKyBcIjogXCIgKyB2YWx1ZSArIFwiO1wiO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRyYW5zZm9ybXMpIHtcbiAgICBjc3MgKz0gXCJ0cmFuc2Zvcm06IFwiICsgdHJhbnNmb3JtcyArIFwiO1wiO1xuICB9XG5cbiAgbm9kZS5zdHlsZS5jc3NUZXh0ICs9IFwiO1wiICsgY3NzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHlsZTsiLCJpbXBvcnQgb3duZXJXaW5kb3cgZnJvbSAnLi9vd25lcldpbmRvdyc7XG4vKipcbiAqIFJldHVybnMgb25lIG9yIGFsbCBjb21wdXRlZCBzdHlsZSBwcm9wZXJ0aWVzIG9mIGFuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gcHN1ZWRvRWxlbWVudCB0aGUgc3R5bGUgcHJvcGVydHlcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKG5vZGUsIHBzdWVkb0VsZW1lbnQpIHtcbiAgcmV0dXJuIG93bmVyV2luZG93KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgcHN1ZWRvRWxlbWVudCk7XG59IiwiLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBlbGVtZW50IGhhcyBhIENTUyBjbGFzcy5cbiAqIFxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyBuYW1lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybiAhIWNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xuICByZXR1cm4gKFwiIFwiICsgKGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgZWxlbWVudC5jbGFzc05hbWUpICsgXCIgXCIpLmluZGV4T2YoXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIikgIT09IC0xO1xufSIsInZhciByVXBwZXIgPSAvKFtBLVpdKS9nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHlwaGVuYXRlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoclVwcGVyLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbn0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvMmFlYjhhMmE2YmViMDA2MTdhNDIxN2Y3ZjgyODQ5MjRmYTJhZDgxOS9zcmMvdmVuZG9yL2NvcmUvaHlwaGVuYXRlU3R5bGVOYW1lLmpzXG4gKi9cbmltcG9ydCBoeXBoZW5hdGUgZnJvbSAnLi9oeXBoZW5hdGUnO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGh5cGhlbmF0ZShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufSIsInZhciBzdXBwb3J0ZWRUcmFuc2Zvcm1zID0gL14oKHRyYW5zbGF0ZXxyb3RhdGV8c2NhbGUpKFh8WXxafDNkKT98bWF0cml4KDNkKT98cGVyc3BlY3RpdmV8c2tldyhYfFkpPykkL2k7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RyYW5zZm9ybSh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgc3VwcG9ydGVkVHJhbnNmb3Jtcy50ZXN0KHZhbHVlKSk7XG59IiwiaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSAnLi9hZGRFdmVudExpc3RlbmVyJztcbmltcG9ydCByZW1vdmVFdmVudExpc3RlbmVyIGZyb20gJy4vcmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdGVuOyIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duZXIgZG9jdW1lbnQgb2YgYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvd25lckRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xufSIsImltcG9ydCBvd25lckRvY3VtZW50IGZyb20gJy4vb3duZXJEb2N1bWVudCc7XG4vKipcbiAqIFJldHVybnMgdGhlIG93bmVyIHdpbmRvdyBvZiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3duZXJXaW5kb3cobm9kZSkge1xuICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlKTtcbiAgcmV0dXJuIGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xufSIsInZhciB0b0FycmF5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgW10uc2xpY2UpO1xuLyoqXG4gKiBSdW5zIGBxdWVyeVNlbGVjdG9yQWxsYCBvbiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXNhKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiB0b0FycmF5KGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufSIsImZ1bmN0aW9uIHJlcGxhY2VDbGFzc05hbWUob3JpZ0NsYXNzLCBjbGFzc1RvUmVtb3ZlKSB7XG4gIHJldHVybiBvcmlnQ2xhc3MucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBjbGFzc1RvUmVtb3ZlICsgXCIoPzpcXFxcc3wkKVwiLCAnZycpLCAnJDEnKS5yZXBsYWNlKC9cXHMrL2csICcgJykucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuLyoqXG4gKiBSZW1vdmVzIGEgQ1NTIGNsYXNzIGZyb20gYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudFxuICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzIG5hbWVcbiAqL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSByZXBsYWNlQ2xhc3NOYW1lKGVsZW1lbnQuY2xhc3NOYW1lLCBjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHJlcGxhY2VDbGFzc05hbWUoZWxlbWVudC5jbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCB8fCAnJywgY2xhc3NOYW1lKSk7XG4gIH1cbn0iLCIvKipcbiAqIEEgYHJlbW92ZUV2ZW50TGlzdGVuZXJgIHBvbnlmaWxsXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lXG4gKiBAcGFyYW0gaGFuZGxlIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gb3B0aW9ucyBldmVudCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIHZhciBjYXB0dXJlID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5jYXB0dXJlIDogb3B0aW9ucztcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSk7XG5cbiAgaWYgKGhhbmRsZXIuX19vbmNlKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlci5fX29uY2UsIGNhcHR1cmUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlbW92ZUV2ZW50TGlzdGVuZXI7IiwiaW1wb3J0IGNhblVzZURPTSBmcm9tICcuL2NhblVzZURPTSc7XG52YXIgc2l6ZTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNjcm9sbGJhclNpemUocmVjYWxjKSB7XG4gIGlmICghc2l6ZSAmJiBzaXplICE9PSAwIHx8IHJlY2FsYykge1xuICAgIGlmIChjYW5Vc2VET00pIHtcbiAgICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLndpZHRoID0gJzUwcHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLmhlaWdodCA9ICc1MHB4JztcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xuICAgICAgc2l6ZSA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2l6ZTtcbn0iLCJpbXBvcnQgY3NzIGZyb20gJy4vY3NzJztcbmltcG9ydCBsaXN0ZW4gZnJvbSAnLi9saXN0ZW4nO1xuaW1wb3J0IHRyaWdnZXJFdmVudCBmcm9tICcuL3RyaWdnZXJFdmVudCc7XG5cbmZ1bmN0aW9uIHBhcnNlRHVyYXRpb24obm9kZSkge1xuICB2YXIgc3RyID0gY3NzKG5vZGUsICd0cmFuc2l0aW9uRHVyYXRpb24nKSB8fCAnJztcbiAgdmFyIG11bHQgPSBzdHIuaW5kZXhPZignbXMnKSA9PT0gLTEgPyAxMDAwIDogMTtcbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKSAqIG11bHQ7XG59XG5cbmZ1bmN0aW9uIGVtdWxhdGVUcmFuc2l0aW9uRW5kKGVsZW1lbnQsIGR1cmF0aW9uLCBwYWRkaW5nKSB7XG4gIGlmIChwYWRkaW5nID09PSB2b2lkIDApIHtcbiAgICBwYWRkaW5nID0gNTtcbiAgfVxuXG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgdmFyIGhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmICghY2FsbGVkKSB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCB0cnVlKTtcbiAgfSwgZHVyYXRpb24gKyBwYWRkaW5nKTtcbiAgdmFyIHJlbW92ZSA9IGxpc3RlbihlbGVtZW50LCAndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICB9LCB7XG4gICAgb25jZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICByZW1vdmUoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZChlbGVtZW50LCBoYW5kbGVyLCBkdXJhdGlvbiwgcGFkZGluZykge1xuICBpZiAoZHVyYXRpb24gPT0gbnVsbCkgZHVyYXRpb24gPSBwYXJzZUR1cmF0aW9uKGVsZW1lbnQpIHx8IDA7XG4gIHZhciByZW1vdmVFbXVsYXRlID0gZW11bGF0ZVRyYW5zaXRpb25FbmQoZWxlbWVudCwgZHVyYXRpb24sIHBhZGRpbmcpO1xuICB2YXIgcmVtb3ZlID0gbGlzdGVuKGVsZW1lbnQsICd0cmFuc2l0aW9uZW5kJywgaGFuZGxlcik7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmVtb3ZlRW11bGF0ZSgpO1xuICAgIHJlbW92ZSgpO1xuICB9O1xufSIsIi8qKlxuICogVHJpZ2dlcnMgYW4gZXZlbnQgb24gYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICogQHBhcmFtIGV2ZW50TmFtZSB0aGUgZXZlbnQgbmFtZSB0byB0cmlnZ2VyXG4gKiBAcGFyYW0gYnViYmxlcyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYnViYmxlIHVwXG4gKiBAcGFyYW0gY2FuY2VsYWJsZSB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsYWJsZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQobm9kZSwgZXZlbnROYW1lLCBidWJibGVzLCBjYW5jZWxhYmxlKSB7XG4gIGlmIChidWJibGVzID09PSB2b2lkIDApIHtcbiAgICBidWJibGVzID0gZmFsc2U7XG4gIH1cblxuICBpZiAoY2FuY2VsYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgY2FuY2VsYWJsZSA9IHRydWU7XG4gIH1cblxuICBpZiAobm9kZSkge1xuICAgIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50TmFtZSwgYnViYmxlcywgY2FuY2VsYWJsZSk7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7fTtcblRZUEVfU1RBVElDU1tyZWFjdElzLkZvcndhcmRSZWZdID0gRk9SV0FSRF9SRUZfU1RBVElDUztcblRZUEVfU1RBVElDU1tyZWFjdElzLk1lbW9dID0gTUVNT19TVEFUSUNTO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICAvLyBSZWFjdCB2MTYuMTEgYW5kIGJlbG93XG4gIGlmIChyZWFjdElzLmlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfSAvLyBSZWFjdCB2MTYuMTIgYW5kIGFib3ZlXG5cblxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFsnJCR0eXBlb2YnXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImZ1bmN0aW9uIG4obil7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheSh0PjE/dC0xOjApLGU9MTtlPHQ7ZSsrKXJbZS0xXT1hcmd1bWVudHNbZV07aWYoXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVil7dmFyIGk9WVtuXSxvPWk/XCJmdW5jdGlvblwiPT10eXBlb2YgaT9pLmFwcGx5KG51bGwscik6aTpcInVua25vd24gZXJyb3IgbnI6IFwiK247dGhyb3cgRXJyb3IoXCJbSW1tZXJdIFwiK28pfXRocm93IEVycm9yKFwiW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogXCIrbisoci5sZW5ndGg/XCIgXCIrci5tYXAoKGZ1bmN0aW9uKG4pe3JldHVyblwiJ1wiK24rXCInXCJ9KSkuam9pbihcIixcIik6XCJcIikrXCIuIEZpbmQgdGhlIGZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZcIil9ZnVuY3Rpb24gdChuKXtyZXR1cm4hIW4mJiEhbltRXX1mdW5jdGlvbiByKG4pe3JldHVybiEhbiYmKGZ1bmN0aW9uKG4pe2lmKCFufHxcIm9iamVjdFwiIT10eXBlb2YgbilyZXR1cm4hMTt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7aWYobnVsbD09PXQpcmV0dXJuITA7dmFyIHI9T2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxcImNvbnN0cnVjdG9yXCIpJiZ0LmNvbnN0cnVjdG9yO3JldHVybiByPT09T2JqZWN0fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZGdW5jdGlvbi50b1N0cmluZy5jYWxsKHIpPT09Wn0obil8fEFycmF5LmlzQXJyYXkobil8fCEhbltMXXx8ISFuLmNvbnN0cnVjdG9yW0xdfHxzKG4pfHx2KG4pKX1mdW5jdGlvbiBlKHIpe3JldHVybiB0KHIpfHxuKDIzLHIpLHJbUV0udH1mdW5jdGlvbiBpKG4sdCxyKXt2b2lkIDA9PT1yJiYocj0hMSksMD09PW8obik/KHI/T2JqZWN0LmtleXM6bm4pKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ImJlwic3ltYm9sXCI9PXR5cGVvZiBlfHx0KGUsbltlXSxuKX0pKTpuLmZvckVhY2goKGZ1bmN0aW9uKHIsZSl7cmV0dXJuIHQoZSxyLG4pfSkpfWZ1bmN0aW9uIG8obil7dmFyIHQ9bltRXTtyZXR1cm4gdD90Lmk+Mz90LmktNDp0Lmk6QXJyYXkuaXNBcnJheShuKT8xOnMobik/Mjp2KG4pPzM6MH1mdW5jdGlvbiB1KG4sdCl7cmV0dXJuIDI9PT1vKG4pP24uaGFzKHQpOk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHQpfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4gMj09PW8obik/bi5nZXQodCk6blt0XX1mdW5jdGlvbiBmKG4sdCxyKXt2YXIgZT1vKG4pOzI9PT1lP24uc2V0KHQscik6Mz09PWU/KG4uZGVsZXRlKHQpLG4uYWRkKHIpKTpuW3RdPXJ9ZnVuY3Rpb24gYyhuLHQpe3JldHVybiBuPT09dD8wIT09bnx8MS9uPT0xL3Q6biE9biYmdCE9dH1mdW5jdGlvbiBzKG4pe3JldHVybiBYJiZuIGluc3RhbmNlb2YgTWFwfWZ1bmN0aW9uIHYobil7cmV0dXJuIHEmJm4gaW5zdGFuY2VvZiBTZXR9ZnVuY3Rpb24gcChuKXtyZXR1cm4gbi5vfHxuLnR9ZnVuY3Rpb24gbChuKXtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKTt2YXIgdD10bihuKTtkZWxldGUgdFtRXTtmb3IodmFyIHI9bm4odCksZT0wO2U8ci5sZW5ndGg7ZSsrKXt2YXIgaT1yW2VdLG89dFtpXTshMT09PW8ud3JpdGFibGUmJihvLndyaXRhYmxlPSEwLG8uY29uZmlndXJhYmxlPSEwKSwoby5nZXR8fG8uc2V0KSYmKHRbaV09e2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOm8uZW51bWVyYWJsZSx2YWx1ZTpuW2ldfSl9cmV0dXJuIE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG4pLHQpfWZ1bmN0aW9uIGQobixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLHkobil8fHQobil8fCFyKG4pP246KG8obik+MSYmKG4uc2V0PW4uYWRkPW4uY2xlYXI9bi5kZWxldGU9aCksT2JqZWN0LmZyZWV6ZShuKSxlJiZpKG4sKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGQodCwhMCl9KSwhMCksbil9ZnVuY3Rpb24gaCgpe24oMil9ZnVuY3Rpb24geShuKXtyZXR1cm4gbnVsbD09bnx8XCJvYmplY3RcIiE9dHlwZW9mIG58fE9iamVjdC5pc0Zyb3plbihuKX1mdW5jdGlvbiBiKHQpe3ZhciByPXJuW3RdO3JldHVybiByfHxuKDE4LHQpLHJ9ZnVuY3Rpb24gbShuLHQpe3JuW25dfHwocm5bbl09dCl9ZnVuY3Rpb24gXygpe3JldHVyblwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fFV8fG4oMCksVX1mdW5jdGlvbiBqKG4sdCl7dCYmKGIoXCJQYXRjaGVzXCIpLG4udT1bXSxuLnM9W10sbi52PXQpfWZ1bmN0aW9uIE8obil7ZyhuKSxuLnAuZm9yRWFjaChTKSxuLnA9bnVsbH1mdW5jdGlvbiBnKG4pe249PT1VJiYoVT1uLmwpfWZ1bmN0aW9uIHcobil7cmV0dXJuIFU9e3A6W10sbDpVLGg6bixtOiEwLF86MH19ZnVuY3Rpb24gUyhuKXt2YXIgdD1uW1FdOzA9PT10Lml8fDE9PT10Lmk/dC5qKCk6dC5PPSEwfWZ1bmN0aW9uIFAodCxlKXtlLl89ZS5wLmxlbmd0aDt2YXIgaT1lLnBbMF0sbz12b2lkIDAhPT10JiZ0IT09aTtyZXR1cm4gZS5oLmd8fGIoXCJFUzVcIikuUyhlLHQsbyksbz8oaVtRXS5QJiYoTyhlKSxuKDQpKSxyKHQpJiYodD1NKGUsdCksZS5sfHx4KGUsdCkpLGUudSYmYihcIlBhdGNoZXNcIikuTShpW1FdLHQsZS51LGUucykpOnQ9TShlLGksW10pLE8oZSksZS51JiZlLnYoZS51LGUucyksdCE9PUg/dDp2b2lkIDB9ZnVuY3Rpb24gTShuLHQscil7aWYoeSh0KSlyZXR1cm4gdDt2YXIgZT10W1FdO2lmKCFlKXJldHVybiBpKHQsKGZ1bmN0aW9uKGksbyl7cmV0dXJuIEEobixlLHQsaSxvLHIpfSksITApLHQ7aWYoZS5BIT09bilyZXR1cm4gdDtpZighZS5QKXJldHVybiB4KG4sZS50LCEwKSxlLnQ7aWYoIWUuSSl7ZS5JPSEwLGUuQS5fLS07dmFyIG89ND09PWUuaXx8NT09PWUuaT9lLm89bChlLmspOmUubztpKDM9PT1lLmk/bmV3IFNldChvKTpvLChmdW5jdGlvbih0LGkpe3JldHVybiBBKG4sZSxvLHQsaSxyKX0pKSx4KG4sbywhMSksciYmbi51JiZiKFwiUGF0Y2hlc1wiKS5SKGUscixuLnUsbi5zKX1yZXR1cm4gZS5vfWZ1bmN0aW9uIEEoZSxpLG8sYSxjLHMpe2lmKFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmM9PT1vJiZuKDUpLHQoYykpe3ZhciB2PU0oZSxjLHMmJmkmJjMhPT1pLmkmJiF1KGkuRCxhKT9zLmNvbmNhdChhKTp2b2lkIDApO2lmKGYobyxhLHYpLCF0KHYpKXJldHVybjtlLm09ITF9aWYocihjKSYmIXkoYykpe2lmKCFlLmguRiYmZS5fPDEpcmV0dXJuO00oZSxjKSxpJiZpLkEubHx8eChlLGMpfX1mdW5jdGlvbiB4KG4sdCxyKXt2b2lkIDA9PT1yJiYocj0hMSksbi5oLkYmJm4ubSYmZCh0LHIpfWZ1bmN0aW9uIHoobix0KXt2YXIgcj1uW1FdO3JldHVybihyP3Aocik6bilbdF19ZnVuY3Rpb24gSShuLHQpe2lmKHQgaW4gbilmb3IodmFyIHI9T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO3I7KXt2YXIgZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsdCk7aWYoZSlyZXR1cm4gZTtyPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKX19ZnVuY3Rpb24gayhuKXtuLlB8fChuLlA9ITAsbi5sJiZrKG4ubCkpfWZ1bmN0aW9uIEUobil7bi5vfHwobi5vPWwobi50KSl9ZnVuY3Rpb24gUihuLHQscil7dmFyIGU9cyh0KT9iKFwiTWFwU2V0XCIpLk4odCxyKTp2KHQpP2IoXCJNYXBTZXRcIikuVCh0LHIpOm4uZz9mdW5jdGlvbihuLHQpe3ZhciByPUFycmF5LmlzQXJyYXkobiksZT17aTpyPzE6MCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsRDp7fSxsOnQsdDpuLGs6bnVsbCxvOm51bGwsajpudWxsLEM6ITF9LGk9ZSxvPWVuO3ImJihpPVtlXSxvPW9uKTt2YXIgdT1Qcm94eS5yZXZvY2FibGUoaSxvKSxhPXUucmV2b2tlLGY9dS5wcm94eTtyZXR1cm4gZS5rPWYsZS5qPWEsZn0odCxyKTpiKFwiRVM1XCIpLkoodCxyKTtyZXR1cm4ocj9yLkE6XygpKS5wLnB1c2goZSksZX1mdW5jdGlvbiBEKGUpe3JldHVybiB0KGUpfHxuKDIyLGUpLGZ1bmN0aW9uIG4odCl7aWYoIXIodCkpcmV0dXJuIHQ7dmFyIGUsdT10W1FdLGM9byh0KTtpZih1KXtpZighdS5QJiYodS5pPDR8fCFiKFwiRVM1XCIpLksodSkpKXJldHVybiB1LnQ7dS5JPSEwLGU9Rih0LGMpLHUuST0hMX1lbHNlIGU9Rih0LGMpO3JldHVybiBpKGUsKGZ1bmN0aW9uKHQscil7dSYmYSh1LnQsdCk9PT1yfHxmKGUsdCxuKHIpKX0pKSwzPT09Yz9uZXcgU2V0KGUpOmV9KGUpfWZ1bmN0aW9uIEYobix0KXtzd2l0Y2godCl7Y2FzZSAyOnJldHVybiBuZXcgTWFwKG4pO2Nhc2UgMzpyZXR1cm4gQXJyYXkuZnJvbShuKX1yZXR1cm4gbChuKX1mdW5jdGlvbiBOKCl7ZnVuY3Rpb24gcihuLHQpe3ZhciByPXNbbl07cmV0dXJuIHI/ci5lbnVtZXJhYmxlPXQ6c1tuXT1yPXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTp0LGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXNbUV07cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmZih0KSxlbi5nZXQodCxuKX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciByPXRoaXNbUV07XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmZihyKSxlbi5zZXQocixuLHQpfX0scn1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgcj1uW3RdW1FdO2lmKCFyLlApc3dpdGNoKHIuaSl7Y2FzZSA1OmEocikmJmsocik7YnJlYWs7Y2FzZSA0Om8ocikmJmsocil9fX1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgdD1uLnQscj1uLmssZT1ubihyKSxpPWUubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBvPWVbaV07aWYobyE9PVEpe3ZhciBhPXRbb107aWYodm9pZCAwPT09YSYmIXUodCxvKSlyZXR1cm4hMDt2YXIgZj1yW29dLHM9ZiYmZltRXTtpZihzP3MudCE9PWE6IWMoZixhKSlyZXR1cm4hMH19dmFyIHY9ISF0W1FdO3JldHVybiBlLmxlbmd0aCE9PW5uKHQpLmxlbmd0aCsodj8wOjEpfWZ1bmN0aW9uIGEobil7dmFyIHQ9bi5rO2lmKHQubGVuZ3RoIT09bi50Lmxlbmd0aClyZXR1cm4hMDt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsdC5sZW5ndGgtMSk7cmV0dXJuISghcnx8ci5nZXQpfWZ1bmN0aW9uIGYodCl7dC5PJiZuKDMsSlNPTi5zdHJpbmdpZnkocCh0KSkpfXZhciBzPXt9O20oXCJFUzVcIix7SjpmdW5jdGlvbihuLHQpe3ZhciBlPUFycmF5LmlzQXJyYXkobiksaT1mdW5jdGlvbihuLHQpe2lmKG4pe2Zvcih2YXIgZT1BcnJheSh0Lmxlbmd0aCksaT0wO2k8dC5sZW5ndGg7aSsrKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiXCIraSxyKGksITApKTtyZXR1cm4gZX12YXIgbz10bih0KTtkZWxldGUgb1tRXTtmb3IodmFyIHU9bm4obyksYT0wO2E8dS5sZW5ndGg7YSsrKXt2YXIgZj11W2FdO29bZl09cihmLG58fCEhb1tmXS5lbnVtZXJhYmxlKX1yZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksbyl9KGUsbiksbz17aTplPzU6NCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsRDp7fSxsOnQsdDpuLGs6aSxvOm51bGwsTzohMSxDOiExfTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksUSx7dmFsdWU6byx3cml0YWJsZTohMH0pLGl9LFM6ZnVuY3Rpb24obixyLG8pe28/dChyKSYmcltRXS5BPT09biYmZShuLnApOihuLnUmJmZ1bmN0aW9uIG4odCl7aWYodCYmXCJvYmplY3RcIj09dHlwZW9mIHQpe3ZhciByPXRbUV07aWYocil7dmFyIGU9ci50LG89ci5rLGY9ci5ELGM9ci5pO2lmKDQ9PT1jKWkobywoZnVuY3Rpb24odCl7dCE9PVEmJih2b2lkIDAhPT1lW3RdfHx1KGUsdCk/Zlt0XXx8bihvW3RdKTooZlt0XT0hMCxrKHIpKSl9KSksaShlLChmdW5jdGlvbihuKXt2b2lkIDAhPT1vW25dfHx1KG8sbil8fChmW25dPSExLGsocikpfSkpO2Vsc2UgaWYoNT09PWMpe2lmKGEocikmJihrKHIpLGYubGVuZ3RoPSEwKSxvLmxlbmd0aDxlLmxlbmd0aClmb3IodmFyIHM9by5sZW5ndGg7czxlLmxlbmd0aDtzKyspZltzXT0hMTtlbHNlIGZvcih2YXIgdj1lLmxlbmd0aDt2PG8ubGVuZ3RoO3YrKylmW3ZdPSEwO2Zvcih2YXIgcD1NYXRoLm1pbihvLmxlbmd0aCxlLmxlbmd0aCksbD0wO2w8cDtsKyspdm9pZCAwPT09ZltsXSYmbihvW2xdKX19fX0obi5wWzBdKSxlKG4ucCkpfSxLOmZ1bmN0aW9uKG4pe3JldHVybiA0PT09bi5pP28obik6YShuKX19KX1mdW5jdGlvbiBUKCl7ZnVuY3Rpb24gZShuKXtpZighcihuKSlyZXR1cm4gbjtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuLm1hcChlKTtpZihzKG4pKXJldHVybiBuZXcgTWFwKEFycmF5LmZyb20obi5lbnRyaWVzKCkpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuW25bMF0sZShuWzFdKV19KSkpO2lmKHYobikpcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShuKS5tYXAoZSkpO3ZhciB0PU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG4pKTtmb3IodmFyIGkgaW4gbil0W2ldPWUobltpXSk7cmV0dXJuIHUobixMKSYmKHRbTF09bltMXSksdH1mdW5jdGlvbiBmKG4pe3JldHVybiB0KG4pP2Uobik6bn12YXIgYz1cImFkZFwiO20oXCJQYXRjaGVzXCIseyQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihyKXtmb3IodmFyIGk9ci5wYXRoLHU9ci5vcCxmPXQscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciB2PW8oZikscD1cIlwiK2lbc107MCE9PXYmJjEhPT12fHxcIl9fcHJvdG9fX1wiIT09cCYmXCJjb25zdHJ1Y3RvclwiIT09cHx8bigyNCksXCJmdW5jdGlvblwiPT10eXBlb2YgZiYmXCJwcm90b3R5cGVcIj09PXAmJm4oMjQpLFwib2JqZWN0XCIhPXR5cGVvZihmPWEoZixwKSkmJm4oMTUsaS5qb2luKFwiL1wiKSl9dmFyIGw9byhmKSxkPWUoci52YWx1ZSksaD1pW2kubGVuZ3RoLTFdO3N3aXRjaCh1KXtjYXNlXCJyZXBsYWNlXCI6c3dpdGNoKGwpe2Nhc2UgMjpyZXR1cm4gZi5zZXQoaCxkKTtjYXNlIDM6bigxNik7ZGVmYXVsdDpyZXR1cm4gZltoXT1kfWNhc2UgYzpzd2l0Y2gobCl7Y2FzZSAxOnJldHVyblwiLVwiPT09aD9mLnB1c2goZCk6Zi5zcGxpY2UoaCwwLGQpO2Nhc2UgMjpyZXR1cm4gZi5zZXQoaCxkKTtjYXNlIDM6cmV0dXJuIGYuYWRkKGQpO2RlZmF1bHQ6cmV0dXJuIGZbaF09ZH1jYXNlXCJyZW1vdmVcIjpzd2l0Y2gobCl7Y2FzZSAxOnJldHVybiBmLnNwbGljZShoLDEpO2Nhc2UgMjpyZXR1cm4gZi5kZWxldGUoaCk7Y2FzZSAzOnJldHVybiBmLmRlbGV0ZShyLnZhbHVlKTtkZWZhdWx0OnJldHVybiBkZWxldGUgZltoXX1kZWZhdWx0Om4oMTcsdSl9fSkpLHR9LFI6ZnVuY3Rpb24obix0LHIsZSl7c3dpdGNoKG4uaSl7Y2FzZSAwOmNhc2UgNDpjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4sdCxyLGUpe3ZhciBvPW4udCxzPW4ubztpKG4uRCwoZnVuY3Rpb24obixpKXt2YXIgdj1hKG8sbikscD1hKHMsbiksbD1pP3UobyxuKT9cInJlcGxhY2VcIjpjOlwicmVtb3ZlXCI7aWYodiE9PXB8fFwicmVwbGFjZVwiIT09bCl7dmFyIGQ9dC5jb25jYXQobik7ci5wdXNoKFwicmVtb3ZlXCI9PT1sP3tvcDpsLHBhdGg6ZH06e29wOmwscGF0aDpkLHZhbHVlOnB9KSxlLnB1c2gobD09PWM/e29wOlwicmVtb3ZlXCIscGF0aDpkfTpcInJlbW92ZVwiPT09bD97b3A6YyxwYXRoOmQsdmFsdWU6Zih2KX06e29wOlwicmVwbGFjZVwiLHBhdGg6ZCx2YWx1ZTpmKHYpfSl9fSkpfShuLHQscixlKTtjYXNlIDU6Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuLHQscixlKXt2YXIgaT1uLnQsbz1uLkQsdT1uLm87aWYodS5sZW5ndGg8aS5sZW5ndGgpe3ZhciBhPVt1LGldO2k9YVswXSx1PWFbMV07dmFyIHM9W2Uscl07cj1zWzBdLGU9c1sxXX1mb3IodmFyIHY9MDt2PGkubGVuZ3RoO3YrKylpZihvW3ZdJiZ1W3ZdIT09aVt2XSl7dmFyIHA9dC5jb25jYXQoW3ZdKTtyLnB1c2goe29wOlwicmVwbGFjZVwiLHBhdGg6cCx2YWx1ZTpmKHVbdl0pfSksZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOnAsdmFsdWU6ZihpW3ZdKX0pfWZvcih2YXIgbD1pLmxlbmd0aDtsPHUubGVuZ3RoO2wrKyl7dmFyIGQ9dC5jb25jYXQoW2xdKTtyLnB1c2goe29wOmMscGF0aDpkLHZhbHVlOmYodVtsXSl9KX1pLmxlbmd0aDx1Lmxlbmd0aCYmZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOnQuY29uY2F0KFtcImxlbmd0aFwiXSksdmFsdWU6aS5sZW5ndGh9KX0obix0LHIsZSk7Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHQscixlKXt2YXIgaT1uLnQsbz1uLm8sdT0wO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIW8uaGFzKG4pKXt2YXIgaT10LmNvbmNhdChbdV0pO3IucHVzaCh7b3A6XCJyZW1vdmVcIixwYXRoOmksdmFsdWU6bn0pLGUudW5zaGlmdCh7b3A6YyxwYXRoOmksdmFsdWU6bn0pfXUrK30pKSx1PTAsby5mb3JFYWNoKChmdW5jdGlvbihuKXtpZighaS5oYXMobikpe3ZhciBvPXQuY29uY2F0KFt1XSk7ci5wdXNoKHtvcDpjLHBhdGg6byx2YWx1ZTpufSksZS51bnNoaWZ0KHtvcDpcInJlbW92ZVwiLHBhdGg6byx2YWx1ZTpufSl9dSsrfSkpfShuLHQscixlKX19LE06ZnVuY3Rpb24obix0LHIsZSl7ci5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOltdLHZhbHVlOnQ9PT1IP3ZvaWQgMDp0fSksZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOltdLHZhbHVlOm4udH0pfX0pfWZ1bmN0aW9uIEMoKXtmdW5jdGlvbiB0KG4sdCl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9bn1hKG4sdCksbi5wcm90b3R5cGU9KHIucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyByKX1mdW5jdGlvbiBlKG4pe24ub3x8KG4uRD1uZXcgTWFwLG4ubz1uZXcgTWFwKG4udCkpfWZ1bmN0aW9uIG8obil7bi5vfHwobi5vPW5ldyBTZXQsbi50LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHIodCkpe3ZhciBlPVIobi5BLmgsdCxuKTtuLnAuc2V0KHQsZSksbi5vLmFkZChlKX1lbHNlIG4uby5hZGQodCl9KSkpfWZ1bmN0aW9uIHUodCl7dC5PJiZuKDMsSlNPTi5zdHJpbmdpZnkocCh0KSkpfXZhciBhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuKGE9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH18fGZ1bmN0aW9uKG4sdCl7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09dFtyXSl9KShuLHQpfSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0aGlzW1FdPXtpOjIsbDp0LEE6dD90LkE6XygpLFA6ITEsSTohMSxvOnZvaWQgMCxEOnZvaWQgMCx0Om4sazp0aGlzLEM6ITEsTzohMX0sdGhpc310KG4sTWFwKTt2YXIgbz1uLnByb3RvdHlwZTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sXCJzaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBwKHRoaXNbUV0pLnNpemV9fSksby5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIHAodGhpc1tRXSkuaGFzKG4pfSxvLnNldD1mdW5jdGlvbihuLHQpe3ZhciByPXRoaXNbUV07cmV0dXJuIHUocikscChyKS5oYXMobikmJnAocikuZ2V0KG4pPT09dHx8KGUociksayhyKSxyLkQuc2V0KG4sITApLHIuby5zZXQobix0KSxyLkQuc2V0KG4sITApKSx0aGlzfSxvLmRlbGV0ZT1mdW5jdGlvbihuKXtpZighdGhpcy5oYXMobikpcmV0dXJuITE7dmFyIHQ9dGhpc1tRXTtyZXR1cm4gdSh0KSxlKHQpLGsodCksdC5ELnNldChuLCExKSx0Lm8uZGVsZXRlKG4pLCEwfSxvLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIG49dGhpc1tRXTt1KG4pLHAobikuc2l6ZSYmKGUobiksayhuKSxuLkQ9bmV3IE1hcCxpKG4udCwoZnVuY3Rpb24odCl7bi5ELnNldCh0LCExKX0pKSxuLm8uY2xlYXIoKSl9LG8uZm9yRWFjaD1mdW5jdGlvbihuLHQpe3ZhciByPXRoaXM7cCh0aGlzW1FdKS5mb3JFYWNoKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LHIuZ2V0KGkpLGkscil9KSl9LG8uZ2V0PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXNbUV07dSh0KTt2YXIgaT1wKHQpLmdldChuKTtpZih0Lkl8fCFyKGkpKXJldHVybiBpO2lmKGkhPT10LnQuZ2V0KG4pKXJldHVybiBpO3ZhciBvPVIodC5BLmgsaSx0KTtyZXR1cm4gZSh0KSx0Lm8uc2V0KG4sbyksb30sby5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpc1tRXSkua2V5cygpfSxvLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBuLHQ9dGhpcyxyPXRoaXMua2V5cygpO3JldHVybihuPXt9KVtWXT1mdW5jdGlvbigpe3JldHVybiB0LnZhbHVlcygpfSxuLm5leHQ9ZnVuY3Rpb24oKXt2YXIgbj1yLm5leHQoKTtyZXR1cm4gbi5kb25lP246e2RvbmU6ITEsdmFsdWU6dC5nZXQobi52YWx1ZSl9fSxufSxvLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbix0PXRoaXMscj10aGlzLmtleXMoKTtyZXR1cm4obj17fSlbVl09ZnVuY3Rpb24oKXtyZXR1cm4gdC5lbnRyaWVzKCl9LG4ubmV4dD1mdW5jdGlvbigpe3ZhciBuPXIubmV4dCgpO2lmKG4uZG9uZSlyZXR1cm4gbjt2YXIgZT10LmdldChuLnZhbHVlKTtyZXR1cm57ZG9uZTohMSx2YWx1ZTpbbi52YWx1ZSxlXX19LG59LG9bVl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9LG59KCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtyZXR1cm4gdGhpc1tRXT17aTozLGw6dCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsbzp2b2lkIDAsdDpuLGs6dGhpcyxwOm5ldyBNYXAsTzohMSxDOiExfSx0aGlzfXQobixTZXQpO3ZhciByPW4ucHJvdG90eXBlO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocixcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpc1tRXSkuc2l6ZX19KSxyLmhhcz1mdW5jdGlvbihuKXt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLHQubz8hIXQuby5oYXMobil8fCEoIXQucC5oYXMobil8fCF0Lm8uaGFzKHQucC5nZXQobikpKTp0LnQuaGFzKG4pfSxyLmFkZD1mdW5jdGlvbihuKXt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLHRoaXMuaGFzKG4pfHwobyh0KSxrKHQpLHQuby5hZGQobikpLHRoaXN9LHIuZGVsZXRlPWZ1bmN0aW9uKG4pe2lmKCF0aGlzLmhhcyhuKSlyZXR1cm4hMTt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLG8odCksayh0KSx0Lm8uZGVsZXRlKG4pfHwhIXQucC5oYXMobikmJnQuby5kZWxldGUodC5wLmdldChuKSl9LHIuY2xlYXI9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3UobikscChuKS5zaXplJiYobyhuKSxrKG4pLG4uby5jbGVhcigpKX0sci52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3JldHVybiB1KG4pLG8obiksbi5vLnZhbHVlcygpfSxyLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3JldHVybiB1KG4pLG8obiksbi5vLmVudHJpZXMoKX0sci5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzKCl9LHJbVl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZXMoKX0sci5mb3JFYWNoPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciByPXRoaXMudmFsdWVzKCksZT1yLm5leHQoKTshZS5kb25lOyluLmNhbGwodCxlLnZhbHVlLGUudmFsdWUsdGhpcyksZT1yLm5leHQoKX0sbn0oKTttKFwiTWFwU2V0XCIse046ZnVuY3Rpb24obix0KXtyZXR1cm4gbmV3IGYobix0KX0sVDpmdW5jdGlvbihuLHQpe3JldHVybiBuZXcgYyhuLHQpfX0pfWZ1bmN0aW9uIEooKXtOKCksQygpLFQoKX1mdW5jdGlvbiBLKG4pe3JldHVybiBufWZ1bmN0aW9uICQobil7cmV0dXJuIG59dmFyIEcsVSxXPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2woXCJ4XCIpLFg9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1hcCxxPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTZXQsQj1cInVuZGVmaW5lZFwiIT10eXBlb2YgUHJveHkmJnZvaWQgMCE9PVByb3h5LnJldm9jYWJsZSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QsSD1XP1N5bWJvbC5mb3IoXCJpbW1lci1ub3RoaW5nXCIpOigoRz17fSlbXCJpbW1lci1ub3RoaW5nXCJdPSEwLEcpLEw9Vz9TeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpOlwiX18kaW1tZXJfZHJhZnRhYmxlXCIsUT1XP1N5bWJvbC5mb3IoXCJpbW1lci1zdGF0ZVwiKTpcIl9fJGltbWVyX3N0YXRlXCIsVj1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3J8fFwiQEBpdGVyYXRvclwiLFk9ezA6XCJJbGxlZ2FsIHN0YXRlXCIsMTpcIkltbWVyIGRyYWZ0cyBjYW5ub3QgaGF2ZSBjb21wdXRlZCBwcm9wZXJ0aWVzXCIsMjpcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyb3plbiBhbmQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkXCIsMzpmdW5jdGlvbihuKXtyZXR1cm5cIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIrbn0sNDpcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsNTpcIkltbWVyIGZvcmJpZHMgY2lyY3VsYXIgcmVmZXJlbmNlc1wiLDY6XCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIiw3OlwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsODpcIkZpcnN0IGFyZ3VtZW50IHRvIGBjcmVhdGVEcmFmdGAgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgYW4gYXJyYXksIG9yIGFuIGltbWVyYWJsZSBvYmplY3RcIiw5OlwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLDEwOlwiVGhlIGdpdmVuIGRyYWZ0IGlzIGFscmVhZHkgZmluYWxpemVkXCIsMTE6XCJPYmplY3QuZGVmaW5lUHJvcGVydHkoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLDEyOlwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIiwxMzpcIkltbWVyIG9ubHkgc3VwcG9ydHMgZGVsZXRpbmcgYXJyYXkgaW5kaWNlc1wiLDE0OlwiSW1tZXIgb25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eVwiLDE1OmZ1bmN0aW9uKG4pe3JldHVyblwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIrbn0sMTY6J1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLDE3OmZ1bmN0aW9uKG4pe3JldHVyblwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIitufSwxODpmdW5jdGlvbihuKXtyZXR1cm5cIlRoZSBwbHVnaW4gZm9yICdcIituK1wiJyBoYXMgbm90IGJlZW4gbG9hZGVkIGludG8gSW1tZXIuIFRvIGVuYWJsZSB0aGUgcGx1Z2luLCBpbXBvcnQgYW5kIGNhbGwgYGVuYWJsZVwiK24rXCIoKWAgd2hlbiBpbml0aWFsaXppbmcgeW91ciBhcHBsaWNhdGlvbi5cIn0sMjA6XCJDYW5ub3QgdXNlIHByb3hpZXMgaWYgUHJveHksIFByb3h5LnJldm9jYWJsZSBvciBSZWZsZWN0IGFyZSBub3QgYXZhaWxhYmxlXCIsMjE6ZnVuY3Rpb24obil7cmV0dXJuXCJwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICdcIituK1wiJ1wifSwyMjpmdW5jdGlvbihuKXtyZXR1cm5cIidjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogXCIrbn0sMjM6ZnVuY3Rpb24obil7cmV0dXJuXCInb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiBcIitufSwyNDpcIlBhdGNoaW5nIHJlc2VydmVkIGF0dHJpYnV0ZXMgbGlrZSBfX3Byb3RvX18sIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgaXMgbm90IGFsbG93ZWRcIn0sWj1cIlwiK09iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3Isbm49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3Qub3duS2V5cz9SZWZsZWN0Lm93bktleXM6dm9pZCAwIT09T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9mdW5jdGlvbihuKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikpfTpPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyx0bj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc3x8ZnVuY3Rpb24obil7dmFyIHQ9e307cmV0dXJuIG5uKG4pLmZvckVhY2goKGZ1bmN0aW9uKHIpe3Rbcl09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpfSkpLHR9LHJuPXt9LGVuPXtnZXQ6ZnVuY3Rpb24obix0KXtpZih0PT09USlyZXR1cm4gbjt2YXIgZT1wKG4pO2lmKCF1KGUsdCkpcmV0dXJuIGZ1bmN0aW9uKG4sdCxyKXt2YXIgZSxpPUkodCxyKTtyZXR1cm4gaT9cInZhbHVlXCJpbiBpP2kudmFsdWU6bnVsbD09PShlPWkuZ2V0KXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jYWxsKG4uayk6dm9pZCAwfShuLGUsdCk7dmFyIGk9ZVt0XTtyZXR1cm4gbi5JfHwhcihpKT9pOmk9PT16KG4udCx0KT8oRShuKSxuLm9bdF09UihuLkEuaCxpLG4pKTppfSxoYXM6ZnVuY3Rpb24obix0KXtyZXR1cm4gdCBpbiBwKG4pfSxvd25LZXlzOmZ1bmN0aW9uKG4pe3JldHVybiBSZWZsZWN0Lm93bktleXMocChuKSl9LHNldDpmdW5jdGlvbihuLHQscil7dmFyIGU9SShwKG4pLHQpO2lmKG51bGw9PWU/dm9pZCAwOmUuc2V0KXJldHVybiBlLnNldC5jYWxsKG4uayxyKSwhMDtpZighbi5QKXt2YXIgaT16KHAobiksdCksbz1udWxsPT1pP3ZvaWQgMDppW1FdO2lmKG8mJm8udD09PXIpcmV0dXJuIG4ub1t0XT1yLG4uRFt0XT0hMSwhMDtpZihjKHIsaSkmJih2b2lkIDAhPT1yfHx1KG4udCx0KSkpcmV0dXJuITA7RShuKSxrKG4pfXJldHVybiBuLm9bdF09PT1yJiZcIm51bWJlclwiIT10eXBlb2YgciYmKHZvaWQgMCE9PXJ8fHQgaW4gbi5vKXx8KG4ub1t0XT1yLG4uRFt0XT0hMCwhMCl9LGRlbGV0ZVByb3BlcnR5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHZvaWQgMCE9PXoobi50LHQpfHx0IGluIG4udD8obi5EW3RdPSExLEUobiksayhuKSk6ZGVsZXRlIG4uRFt0XSxuLm8mJmRlbGV0ZSBuLm9bdF0sITB9LGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbihuLHQpe3ZhciByPXAobiksZT1SZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLHQpO3JldHVybiBlP3t3cml0YWJsZTohMCxjb25maWd1cmFibGU6MSE9PW4uaXx8XCJsZW5ndGhcIiE9PXQsZW51bWVyYWJsZTplLmVudW1lcmFibGUsdmFsdWU6clt0XX06ZX0sZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oKXtuKDExKX0sZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuLnQpfSxzZXRQcm90b3R5cGVPZjpmdW5jdGlvbigpe24oMTIpfX0sb249e307aShlbiwoZnVuY3Rpb24obix0KXtvbltuXT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHNbMF09YXJndW1lbnRzWzBdWzBdLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pKSxvbi5kZWxldGVQcm9wZXJ0eT1mdW5jdGlvbih0LHIpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmlzTmFOKHBhcnNlSW50KHIpKSYmbigxMyksZW4uZGVsZXRlUHJvcGVydHkuY2FsbCh0aGlzLHRbMF0scil9LG9uLnNldD1mdW5jdGlvbih0LHIsZSl7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJsZW5ndGhcIiE9PXImJmlzTmFOKHBhcnNlSW50KHIpKSYmbigxNCksZW4uc2V0LmNhbGwodGhpcyx0WzBdLHIsZSx0WzBdKX07dmFyIHVuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT10aGlzO3RoaXMuZz1CLHRoaXMuRj0hMCx0aGlzLnByb2R1Y2U9ZnVuY3Rpb24odCxpLG8pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGkpe3ZhciB1PWk7aT10O3ZhciBhPWU7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXM7dm9pZCAwPT09biYmKG49dSk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsZT1BcnJheShyPjE/ci0xOjApLG89MTtvPHI7bysrKWVbby0xXT1hcmd1bWVudHNbb107cmV0dXJuIGEucHJvZHVjZShuLChmdW5jdGlvbihuKXt2YXIgcjtyZXR1cm4ocj1pKS5jYWxsLmFwcGx5KHIsW3Qsbl0uY29uY2F0KGUpKX0pKX19dmFyIGY7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgaSYmbig2KSx2b2lkIDAhPT1vJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBvJiZuKDcpLHIodCkpe3ZhciBjPXcoZSkscz1SKGUsdCx2b2lkIDApLHY9ITA7dHJ5e2Y9aShzKSx2PSExfWZpbmFsbHl7dj9PKGMpOmcoYyl9cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFByb21pc2UmJmYgaW5zdGFuY2VvZiBQcm9taXNlP2YudGhlbigoZnVuY3Rpb24obil7cmV0dXJuIGooYyxvKSxQKG4sYyl9KSwoZnVuY3Rpb24obil7dGhyb3cgTyhjKSxufSkpOihqKGMsbyksUChmLGMpKX1pZighdHx8XCJvYmplY3RcIiE9dHlwZW9mIHQpe2lmKChmPWkodCkpPT09SClyZXR1cm47cmV0dXJuIHZvaWQgMD09PWYmJihmPXQpLGUuRiYmZChmLCEwKSxmfW4oMjEsdCl9LHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2Ygbj9mdW5jdGlvbih0KXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPUFycmF5KHI+MT9yLTE6MCksbz0xO288cjtvKyspaVtvLTFdPWFyZ3VtZW50c1tvXTtyZXR1cm4gZS5wcm9kdWNlV2l0aFBhdGNoZXModCwoZnVuY3Rpb24odCl7cmV0dXJuIG4uYXBwbHkodm9pZCAwLFt0XS5jb25jYXQoaSkpfSkpfTpbZS5wcm9kdWNlKG4sdCwoZnVuY3Rpb24obix0KXtyPW4saT10fSkpLHIsaV07dmFyIHIsaX0sXCJib29sZWFuXCI9PXR5cGVvZihudWxsPT10P3ZvaWQgMDp0LnVzZVByb3hpZXMpJiZ0aGlzLnNldFVzZVByb3hpZXModC51c2VQcm94aWVzKSxcImJvb2xlYW5cIj09dHlwZW9mKG51bGw9PXQ/dm9pZCAwOnQuYXV0b0ZyZWV6ZSkmJnRoaXMuc2V0QXV0b0ZyZWV6ZSh0LmF1dG9GcmVlemUpfXZhciBpPWUucHJvdG90eXBlO3JldHVybiBpLmNyZWF0ZURyYWZ0PWZ1bmN0aW9uKGUpe3IoZSl8fG4oOCksdChlKSYmKGU9RChlKSk7dmFyIGk9dyh0aGlzKSxvPVIodGhpcyxlLHZvaWQgMCk7cmV0dXJuIG9bUV0uQz0hMCxnKGkpLG99LGkuZmluaXNoRHJhZnQ9ZnVuY3Rpb24odCxyKXt2YXIgZT10JiZ0W1FdO1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihlJiZlLkN8fG4oOSksZS5JJiZuKDEwKSk7dmFyIGk9ZS5BO3JldHVybiBqKGksciksUCh2b2lkIDAsaSl9LGkuc2V0QXV0b0ZyZWV6ZT1mdW5jdGlvbihuKXt0aGlzLkY9bn0saS5zZXRVc2VQcm94aWVzPWZ1bmN0aW9uKHQpe3QmJiFCJiZuKDIwKSx0aGlzLmc9dH0saS5hcHBseVBhdGNoZXM9ZnVuY3Rpb24obixyKXt2YXIgZTtmb3IoZT1yLmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgaT1yW2VdO2lmKDA9PT1pLnBhdGgubGVuZ3RoJiZcInJlcGxhY2VcIj09PWkub3Ape249aS52YWx1ZTticmVha319ZT4tMSYmKHI9ci5zbGljZShlKzEpKTt2YXIgbz1iKFwiUGF0Y2hlc1wiKS4kO3JldHVybiB0KG4pP28obixyKTp0aGlzLnByb2R1Y2UobiwoZnVuY3Rpb24obil7cmV0dXJuIG8obixyKX0pKX0sZX0oKSxhbj1uZXcgdW4sZm49YW4ucHJvZHVjZSxjbj1hbi5wcm9kdWNlV2l0aFBhdGNoZXMuYmluZChhbiksc249YW4uc2V0QXV0b0ZyZWV6ZS5iaW5kKGFuKSx2bj1hbi5zZXRVc2VQcm94aWVzLmJpbmQoYW4pLHBuPWFuLmFwcGx5UGF0Y2hlcy5iaW5kKGFuKSxsbj1hbi5jcmVhdGVEcmFmdC5iaW5kKGFuKSxkbj1hbi5maW5pc2hEcmFmdC5iaW5kKGFuKTtleHBvcnQgZGVmYXVsdCBmbjtleHBvcnR7dW4gYXMgSW1tZXIscG4gYXMgYXBwbHlQYXRjaGVzLEsgYXMgY2FzdERyYWZ0LCQgYXMgY2FzdEltbXV0YWJsZSxsbiBhcyBjcmVhdGVEcmFmdCxEIGFzIGN1cnJlbnQsSiBhcyBlbmFibGVBbGxQbHVnaW5zLE4gYXMgZW5hYmxlRVM1LEMgYXMgZW5hYmxlTWFwU2V0LFQgYXMgZW5hYmxlUGF0Y2hlcyxkbiBhcyBmaW5pc2hEcmFmdCxkIGFzIGZyZWV6ZSxMIGFzIGltbWVyYWJsZSx0IGFzIGlzRHJhZnQsciBhcyBpc0RyYWZ0YWJsZSxIIGFzIG5vdGhpbmcsZSBhcyBvcmlnaW5hbCxmbiBhcyBwcm9kdWNlLGNuIGFzIHByb2R1Y2VXaXRoUGF0Y2hlcyxzbiBhcyBzZXRBdXRvRnJlZXplLHZuIGFzIHNldFVzZVByb3hpZXN9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1tZXIuZXNtLmpzLm1hcFxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NoYXJlZC9BcnJheUhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL0NvdW50ZXJcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NoYXJlZC9EYXRlSGVscGVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvSGVscGVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvSnNvbkhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL01pZ3JhdGlvbkhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL09iamVjdEhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1ByaW9yaXRpemVkXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVyc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1JhbmRvbVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1hTU0hlbHBlclwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJyYXlIZWxwZXIgPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIEFycmF5SGVscGVyIHtcbiAgICBzdGF0aWMgcmV2ZXJzZUZpbmQoYXJyYXksIGNhbGxiYWNrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2ldLCBpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUluZGV4T2YoYXJyYXksIGVsZW1lbnQsIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKGZyb21JbmRleCwgYXJyYXkubGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHN0YXRpYyByZXZlcnNlU29tZShhcnJheSwgY2FsbGJhY2spIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2soYXJyYXlbaV0sIGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUV2ZXJ5KGFycmF5LCBjYWxsYmFjaykge1xuICAgICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2soYXJyYXlbaV0sIGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUZvckVhY2goYXJyYXksIGNhbGxiYWNrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY2FsbGJhY2soYXJyYXlbaV0sIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luY0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCBydW5Bc3luY2hyb25vdXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJ1bkFzeW5jaHJvbm91cyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHJ1bkFzeW5jaHJvbm91cywgZmFsc2UpO1xuICAgICAgICAgICAgbGV0IHZhbGlkUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpO1xuICAgICAgICAgICAgICAgIGlmICghcnVuQXN5bmNocm9ub3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJlbnRQcm9taXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWxpZFByb21pc2VzLnB1c2goY3VycmVudFByb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHZhbGlkUHJvbWlzZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHNodWZmbGUoYXJyYXkpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRJbmRleCA9IGFycmF5Lmxlbmd0aCwgdGVtcG9yYXJ5VmFsdWUsIHJhbmRvbUluZGV4O1xuICAgICAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZS4uLlxuICAgICAgICB3aGlsZSAoMCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cbiAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCAtPSAxO1xuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSBhcnJheVtjdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgYXJyYXlbY3VycmVudEluZGV4XSA9IGFycmF5W3JhbmRvbUluZGV4XTtcbiAgICAgICAgICAgIGFycmF5W3JhbmRvbUluZGV4XSA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gICAgc3RhdGljIHJvdGF0ZShhcnJheSwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggJT0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBpbmRleCArPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyQ29weSA9IGFycmF5LnNsaWNlKDApO1xuICAgICAgICBjb25zdCByb3RhdGluZ1BhcnQgPSBhcnJDb3B5LnNwbGljZSgwLCBpbmRleCk7XG4gICAgICAgIGFyckNvcHkucHVzaCguLi5yb3RhdGluZ1BhcnQpO1xuICAgICAgICByZXR1cm4gYXJyQ29weTtcbiAgICB9XG59XG5leHBvcnRzLkFycmF5SGVscGVyID0gQXJyYXlIZWxwZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcnJheUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ291bnRlciA9IHZvaWQgMDtcbmNvbnN0IEhlbHBlcl8xID0gcmVxdWlyZShcIi4vSGVscGVyXCIpO1xuY2xhc3MgQ291bnRlciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb3VudGVyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWUgPSBIZWxwZXJfMS5IZWxwZXIubm9uTnVsbCh2YWx1ZSwgMCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlKys7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuQ291bnRlciA9IENvdW50ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3VudGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRlSGVscGVyID0gdm9pZCAwO1xuY29uc3QgSGVscGVyXzEgPSByZXF1aXJlKFwiLi9IZWxwZXJcIik7XG5jbGFzcyBEYXRlSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBGb3JtYXRpZXJ0IGVpbiBEYXRlLU9iamVjdCBuYWNoIGRlciBWb3JsYWdlIHZvbiBkZXIgQy1GdW5rdGlvbiBzdHJmdGltZVxuICAgICAqXG4gICAgICogQHBhcmFtIHNGb3JtYXRcbiAgICAgKiBAcGFyYW0gZGF0ZVxuICAgICAqIEBwYXJhbSB1c2VVVENcbiAgICAgKiBAcmV0dXJucyB7Knx2b2lkfHN0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc3RyZnRpbWUoc0Zvcm1hdCwgZGF0ZSwgdXNlVVRDKSB7XG4gICAgICAgIHVzZVVUQyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHVzZVVUQywgZmFsc2UpO1xuICAgICAgICBkYXRlID0gSGVscGVyXzEuSGVscGVyLm5vbk51bGwoZGF0ZSwgbmV3IERhdGUoKSk7XG4gICAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSlcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgbGV0IG5EYXkgPSAodXNlVVRDKSA/IGRhdGUuZ2V0VVRDRGF5KCkgOiBkYXRlLmdldERheSgpLCBuRGF0ZSA9ICh1c2VVVEMpID8gZGF0ZS5nZXRVVENEYXRlKCkgOiBkYXRlLmdldERhdGUoKSwgbk1vbnRoID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ01vbnRoKCkgOiBkYXRlLmdldE1vbnRoKCksIG5ZZWFyID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgOiBkYXRlLmdldEZ1bGxZZWFyKCksIG5Ib3VyID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ0hvdXJzKCkgOiBkYXRlLmdldEhvdXJzKCksIGFEYXlzID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLCBhRGF5c1Nob3J0ID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSwgYU1vbnRocyA9IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLCBhRGF5Q291bnQgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzRdLCBpc0xlYXBZZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKChuWWVhciAmIDMpICE9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBuWWVhciAlIDEwMCAhPT0gMCB8fCBuWWVhciAlIDQwMCA9PT0gMDtcbiAgICAgICAgfSwgZ2V0VGh1cnNkYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0RGF0ZShuRGF0ZSAtICgobkRheSArIDYpICUgNykgKyAzKTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH0sIHplcm9QYWQgPSBmdW5jdGlvbiAobk51bSwgblBhZCkge1xuICAgICAgICAgICAgcmV0dXJuICgnJyArIChNYXRoLnBvdygxMCwgblBhZCkgKyBuTnVtKSkuc2xpY2UoMSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzRm9ybWF0LnJlcGxhY2UoLyVbYS16XS9naSwgKHNNYXRjaCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnJWEnOiB0aGlzLnRyYW5zbGF0ZShhRGF5c1Nob3J0W25EYXldKSxcbiAgICAgICAgICAgICAgICAnJUEnOiB0aGlzLnRyYW5zbGF0ZShhRGF5c1tuRGF5XSksXG4gICAgICAgICAgICAgICAgJyViJzogdGhpcy50cmFuc2xhdGUoYU1vbnRoc1tuTW9udGhdLnNsaWNlKDAsIDMpKSxcbiAgICAgICAgICAgICAgICAnJUInOiB0aGlzLnRyYW5zbGF0ZShhTW9udGhzW25Nb250aF0pLFxuICAgICAgICAgICAgICAgICclYyc6IGRhdGUudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAnJUMnOiBNYXRoLmZsb29yKG5ZZWFyIC8gMTAwKSxcbiAgICAgICAgICAgICAgICAnJWQnOiB6ZXJvUGFkKG5EYXRlLCAyKSxcbiAgICAgICAgICAgICAgICAnJWUnOiBuRGF0ZSxcbiAgICAgICAgICAgICAgICAnJWYnOiB6ZXJvUGFkKGRhdGUuZ2V0VGltZSgpICUgMTAwMCwgNCksXG4gICAgICAgICAgICAgICAgJyVGJzogZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgICAgICAgICAgICAnJUcnOiBnZXRUaHVyc2RheSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgJyVnJzogKCcnICsgZ2V0VGh1cnNkYXkoKS5nZXRGdWxsWWVhcigpKS5zbGljZSgyKSxcbiAgICAgICAgICAgICAgICAnJUgnOiB6ZXJvUGFkKG5Ib3VyLCAyKSxcbiAgICAgICAgICAgICAgICAnJUknOiB6ZXJvUGFkKChuSG91ciArIDExKSAlIDEyICsgMSwgMiksXG4gICAgICAgICAgICAgICAgJyVqJzogemVyb1BhZChhRGF5Q291bnRbbk1vbnRoXSArIG5EYXRlICsgKChuTW9udGggPiAxICYmIGlzTGVhcFllYXIoKSkgPyAxIDogMCksIDMpLFxuICAgICAgICAgICAgICAgICclayc6ICcnICsgbkhvdXIsXG4gICAgICAgICAgICAgICAgJyVsJzogKG5Ib3VyICsgMTEpICUgMTIgKyAxLFxuICAgICAgICAgICAgICAgICclbSc6IHplcm9QYWQobk1vbnRoICsgMSwgMiksXG4gICAgICAgICAgICAgICAgJyVNJzogemVyb1BhZChkYXRlLmdldE1pbnV0ZXMoKSwgMiksXG4gICAgICAgICAgICAgICAgJyVwJzogKG5Ib3VyIDwgMTIpID8gJ0FNJyA6ICdQTScsXG4gICAgICAgICAgICAgICAgJyVQJzogKG5Ib3VyIDwgMTIpID8gJ2FtJyA6ICdwbScsXG4gICAgICAgICAgICAgICAgJyVzJzogTWF0aC5yb3VuZChkYXRlLmdldFRpbWUoKSAvIDEwMDApLFxuICAgICAgICAgICAgICAgICclUyc6IHplcm9QYWQoZGF0ZS5nZXRTZWNvbmRzKCksIDIpLFxuICAgICAgICAgICAgICAgICcldSc6IG5EYXkgfHwgNyxcbiAgICAgICAgICAgICAgICAnJXcnOiAnJyArIG5EYXksXG4gICAgICAgICAgICAgICAgJyV4JzogZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAnJVgnOiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZygpLFxuICAgICAgICAgICAgICAgICcleSc6ICgnJyArIG5ZZWFyKS5zbGljZSgyKSxcbiAgICAgICAgICAgICAgICAnJVknOiBuWWVhcixcbiAgICAgICAgICAgICAgICAnJXonOiBkYXRlLnRvVGltZVN0cmluZygpLnJlcGxhY2UoLy4rR01UKFsrLV1cXGQrKS4rLywgJyQxJyksXG4gICAgICAgICAgICAgICAgJyVaJzogZGF0ZS50b1RpbWVTdHJpbmcoKS5yZXBsYWNlKC8uK1xcKCguKz8pXFwpJC8sICckMScpXG4gICAgICAgICAgICB9W3NNYXRjaF0gfHwgc01hdGNoO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRyYW5zbGF0ZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRpb25DYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25DYWxsYmFjayhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXRUcmFuc2xhdGlvbkNhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICBzdGF0aWMgZHVyYXRpb24odGltZUluU2Vjb25kcywgbG9jYWxlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG5vblBhZGRlZEludGwgPSBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgbWluaW11bUludGVnZXJEaWdpdHM6IDEgfSk7XG4gICAgICAgIGNvbnN0IHBhZGRlZEludGwgPSBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgbWluaW11bUludGVnZXJEaWdpdHM6IDIgfSk7XG4gICAgICAgIGNvbnN0IFtkZWxpbWl0ZXJdID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLXVzJykubWF0Y2goL1xcYls6Ll1cXGIvKTtcbiAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRpbWVJblNlY29uZHMgLyAzNjAwKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGltZUluU2Vjb25kcyAvIDYwKSAlIDYwO1xuICAgICAgICBjb25zdCBzZWNvbmRzID0gdGltZUluU2Vjb25kcyAlIDYwO1xuICAgICAgICBjb25zdCBpbmRleFRvUGFkID0gaG91cnMgPyAwIDogMTtcbiAgICAgICAgcmV0dXJuIFtob3VycywgbWludXRlcywgc2Vjb25kc11cbiAgICAgICAgICAgIC5tYXAoKHZhbCwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh2YWwgPCAxMCAmJiBpID4gaW5kZXhUb1BhZCkgPyBwYWRkZWRJbnRsLmZvcm1hdCh2YWwpIDogbm9uUGFkZGVkSW50bC5mb3JtYXQodmFsKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gISh2YWwgPT09ICcwMCcgfHwgdmFsID09PSAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihkZWxpbWl0ZXIpO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0ZUhlbHBlciA9IERhdGVIZWxwZXI7XG5EYXRlSGVscGVyLkZPUk1BVCA9IHtcbiAgICBJU09fVElNRTogXCIlWS0lbS0lZFQlSDolTTolU1wiXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0ZUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IZWxwZXIgPSB2b2lkIDA7XG4vKipcbiAqIEVpbmUgS2xhc3NlIG1pdCBow6R1ZmlnIGdlbnV0enRlbiwgbsO8dHpsaWNoZW4gRnVua3Rpb25lblxuICovXG5jb25zdCBKc29uSGVscGVyXzEgPSByZXF1aXJlKFwiLi9Kc29uSGVscGVyXCIpO1xuY29uc3QgQXJyYXlIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0FycmF5SGVscGVyXCIpO1xuY29uc3QgUHJvbWlzZVdpdGhIYW5kbGVyc18xID0gcmVxdWlyZShcIi4vUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVyc1wiKTtcbmNvbnN0IE9iamVjdEhlbHBlcl8xID0gcmVxdWlyZShcIi4vT2JqZWN0SGVscGVyXCIpO1xuY2xhc3MgSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBUZXN0ZXQsIG9iIGVpbmUgVmFyaWFibGUgbnVsbCBvZGVyIFVuZGVmaW5lZCBpc3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YXJpYWJsZVxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzTnVsbCh2YXJpYWJsZSwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gSGVscGVyLmlzQWxsTnVsbCguLi5hcmd1bWVudHMpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBbGxOdWxsKC4uLmFyZ3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIShhcmdzW2ldID09PSBudWxsIHx8IGFyZ3NbaV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHN0YXRpYyBpc0F0TGVhc3RPbmVOdWxsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuICFIZWxwZXIuaXNBbGxOdWxsKC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0ZXQsIG9iIGVpbmUgVmFyaWFibGUgbmljaHQgKG51bGwgb2RlciB1bmRlZmluZWQpIGlzdFxuICAgICAqXG4gICAgICogQHBhcmFtIHZhcmlhYmxlXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNOb3ROdWxsKHZhcmlhYmxlLCAuLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBIZWxwZXIuaXNBbGxOb3ROdWxsKC4uLmFyZ3VtZW50cyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0FsbE5vdE51bGwoLi4uYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoYXJnc1tpXSA9PT0gbnVsbCB8fCBhcmdzW2ldID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBdExlYXN0T25lTm90TnVsbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiAhSGVscGVyLmlzQWxsTnVsbCguLi5hcmdzKTtcbiAgICB9XG4gICAgc3RhdGljIGRlbGF5KGR1cmF0aW9uLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShhcmdzKSwgZHVyYXRpb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2lidCBkZW4gZXJzdGVuIMO8YmVyZ2ViZW5lbiBXZXJ0LCBkZXIgbmljaHQgKG51bGwgb2RlciB1bmRlZmluZWQpIGlzdCwgenVyw7xja1xuICAgICAqXG4gICAgICogQHBhcmFtIHZhbDFcbiAgICAgKiBAcGFyYW0gdmFsMlxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIG5vbk51bGwodmFsMSwgdmFsMiwgLi4uYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKEhlbHBlci5pc05vdE51bGwoYXJndW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3RldCwgb2IgZWluIFdlcnQgbnVsbCBvZGVyIExlZXJzdHJpbmcsIGJ6dyBudXIgYXVzIGxlZXJ6ZWljaGVuZCBiZXN0ZWhlbmRlciBTdHJpbmcgaXN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZW1wdHkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChIZWxwZXIuaXNOdWxsKHZhbHVlKSB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09IFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdGV0LCBvYiBlaW4gV2VydCBOSUNIVCAobnVsbCBvZGVyIExlZXJzdHJpbmcsIGJ6dyBudXIgYXVzIGxlZXJ6ZWljaGVuZCBiZXN0ZWhlbmRlciBTdHJpbmcgaXN0KVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIG5vdEVtcHR5KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhSGVscGVyLmVtcHR5KHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGFycmF5VG9PYmplY3QoYXJyYXksIGluZGV4RnVuY3Rpb24pIHtcbiAgICAgICAgbGV0IG9iaiA9IHt9O1xuICAgICAgICBhcnJheS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICBvYmpbaW5kZXhGdW5jdGlvbih2YWwpXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVyc3RlbGx0IGVpbiBGb3JtRGF0YS1PYmplY3Qgdm9uIEpTT04tRGF0YS4gTsO8dHpsaWNoIGbDvHIgZmV0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmpcbiAgICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gICAgICovXG4gICAgc3RhdGljIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5zZXQoaywgb2JqW2tdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuICAgIHN0YXRpYyBwYWRaZXJvKG4sIHdpZHRoLCB6KSB7XG4gICAgICAgIHogPSBIZWxwZXIubm9uTnVsbCh6LCAnMCcpO1xuICAgICAgICBuID0gbiArICcnO1xuICAgICAgICB3aWR0aCA9IEhlbHBlci5ub25OdWxsKHdpZHRoLCAxKTtcbiAgICAgICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbih6KSArIG47XG4gICAgfVxuICAgIC8vw4RsdGVyZSBldnRsIG7DvHR6bGljaGUgRnVua3Rpb25lblxuICAgIHN0YXRpYyBodG1sc3BlY2lhbGNoYXJzRGVjb2RlKHRleHQpIHtcbiAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgJyZhbXA7JzogJyYnLFxuICAgICAgICAgICAgJyYjMDM4Oyc6IFwiJlwiLFxuICAgICAgICAgICAgJyZsdDsnOiAnPCcsXG4gICAgICAgICAgICAnJmd0Oyc6ICc+JyxcbiAgICAgICAgICAgICcmcXVvdDsnOiAnXCInLFxuICAgICAgICAgICAgJyYjMDM5Oyc6IFwiJ1wiLFxuICAgICAgICAgICAgJyYjODIxNzsnOiBcIuKAmVwiLFxuICAgICAgICAgICAgJyYjODIxNjsnOiBcIuKAmFwiLFxuICAgICAgICAgICAgJyYjODIxMTsnOiBcIuKAk1wiLFxuICAgICAgICAgICAgJyYjODIxMjsnOiBcIuKAlFwiLFxuICAgICAgICAgICAgJyYjODIzMDsnOiBcIuKAplwiLFxuICAgICAgICAgICAgJyYjODIyMTsnOiAn4oCdJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAoSGVscGVyLmlzTm90TnVsbCh0ZXh0KSAmJiB0eXBlb2YgdGV4dC5yZXBsYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcJltcXHdcXGRcXCNdezIsNX1cXDsvZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwW21dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHN0YXRpYyBlc2NhcGVSZWdFeHAoc3RyKSB7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcbiAgICB9XG4gICAgc3RhdGljIGltYWdlVXJsSXNFbXB0eSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIChIZWxwZXIuaXNOdWxsKHVybCkgfHwgdXJsLnRyaW0oKSA9PT0gXCJcIiB8fCB1cmwudHJpbSgpID09PSBcImRhdGE6XCIpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNNb2JpbGVBcHAoKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHdpbmRvd1tcImRldmljZVwiXSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3dbXCJkZXZpY2VcIl0ucGxhdGZvcm0gIT09IFwiYnJvd3NlclwiKTtcbiAgICB9XG4gICAgc3RhdGljIHRvU25ha2VDYXNlKGNhbWVsQ2FzZSkge1xuICAgICAgICByZXR1cm4gY2FtZWxDYXNlLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKGZpbmQsIHNvbWV0aGluZywgcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKHBvc2l0aW9uID4gMCkgPyBcIl9cIiA6IFwiXCIpICsgZmluZFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXQodGltZW91dCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UociA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHIocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRpbWVvdXQodGltZSwgb3RoZXJQcm9taXNlLCB0aW1lb3V0UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtvdGhlclByb21pc2UsIEhlbHBlci53YWl0KHRpbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lb3V0UmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBleGVjTm9uVGhyb3coZm4pIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGZuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIEFycmF5SGVscGVyLnNodWZmbGUgaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBzaHVmZmxlQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyXzEuQXJyYXlIZWxwZXIuc2h1ZmZsZShhcnJheSk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgQXJyYXlIZWxwZXIucmV2ZXJzZUZvckVhY2ggaW5zdGVhZCAqL1xuICAgIHN0YXRpYyByZXZlcnNlRm9yRWFjaChhcnJheSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyXzEuQXJyYXlIZWxwZXIucmV2ZXJzZUZvckVhY2goYXJyYXksIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBBcnJheUhlbHBlci5hc3luY0ZvckVhY2ggaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBhc3luY0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCBydW5Bc3luY2hyb25vdXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheUhlbHBlcl8xLkFycmF5SGVscGVyLmFzeW5jRm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIHJ1bkFzeW5jaHJvbm91cyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIE9iamVjdEhlbHBlci5vYmplY3RGb3JFYWNoIGluc3RlYWQgKi9cbiAgICBzdGF0aWMgb2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBPYmplY3RIZWxwZXJfMS5PYmplY3RIZWxwZXIub2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBPYmplY3RIZWxwZXIudG9BcnJheSBpbnN0ZWFkICovXG4gICAgc3RhdGljIHRvQXJyYXkob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3RIZWxwZXJfMS5PYmplY3RIZWxwZXIudG9BcnJheShvYmplY3QpO1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5kZWVwRXF1YWwgaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBkZWVwRXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0SGVscGVyXzEuT2JqZWN0SGVscGVyLmRlZXBFcXVhbChhLCBiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5pbnZlcnRLZXlWYWx1ZXMgaW5zdGVhZFxuICAgICAqXG4gICAgICogSW52ZXJ0cyB0aGUga2V5LVZhbHVlcyBmb3IgYW4gb2JqZWN0XG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgc3RhdGljIGludmVydEtleVZhbHVlcyhvYmopIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEhlbHBlcl8xLk9iamVjdEhlbHBlci5pbnZlcnRLZXlWYWx1ZXMob2JqKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5pc1NldCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBUZXN0ZXQsIG9iIGRlciDDvGJlcmdlYmVuZSBJbmRleCBhbSBPYmpla3QgZ2VzZXR6dCBpc3QuIFdlcmRlbiBtZWhyZXJlIEluZGV4ZXMgw7xiZXJnZWJlbiwgc28gd2lyZCBnZXRlc3RldCxcbiAgICAgKiBvYiBkaWUgXCJJbmRleC1LZXR0ZVwiIGdlc2V0enQgaXN0LlxuICAgICAqIEJzcC46XG4gICAgICogIEhlbHBlci5pc1NldCh7XCJpbmRleDFcIjp7XCJpbmRleDJcIjp2YWx1ZX19LCBcImluZGV4MVwiLCBcImluZGV4MlwiKSBpc3Qgd2FoclxuICAgICAqXG4gICAgICogQHBhcmFtIG9iamVjdFxuICAgICAqIEBwYXJhbSBpbmRleGVzXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIGlzU2V0KG9iamVjdCwgLi4uaW5kZXhlcykge1xuICAgICAgICByZXR1cm4gT2JqZWN0SGVscGVyXzEuT2JqZWN0SGVscGVyLmlzU2V0KG9iamVjdCwgLi4uaW5kZXhlcyk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgUHJvbWlzZVdpdGhIYW5kbGVycyBpbnN0ZWFkICovXG4gICAgc3RhdGljIG5ld1Byb21pc2VXaXRoUmVzb2x2ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlV2l0aEhhbmRsZXJzXzEuUHJvbWlzZVdpdGhIYW5kbGVycygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgSnNvbkhlbHBlci5kZWVwQ29weSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBEZWVwY29waWVzIEpTT05cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmpcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xvbmVKc29uKG9iaikge1xuICAgICAgICByZXR1cm4gSnNvbkhlbHBlcl8xLkpzb25IZWxwZXIuZGVlcENvcHkob2JqKTtcbiAgICB9XG59XG5leHBvcnRzLkhlbHBlciA9IEhlbHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSnNvbkhlbHBlciA9IHZvaWQgMDtcbmNvbnN0IEhlbHBlcl8xID0gcmVxdWlyZShcIi4vSGVscGVyXCIpO1xuY2xhc3MgSnNvbkhlbHBlciB7XG4gICAgc3RhdGljIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJyYXkgZGVlcEVxdWFsXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkgJiYgYiBpbnN0YW5jZW9mIEFycmF5ICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGFbXCJldmVyeVwiXSgob2JqLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25IZWxwZXIuZGVlcEVxdWFsKG9iaiwgYltpXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvL2RhdGUgZGVlcEVxdWFsXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgZGVlcCBjb3B5XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgbGV0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgICAgICBsZXQgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgICAgIHJldHVybiBhS2V5cy5sZW5ndGggPT09IGJLZXlzLmxlbmd0aCAmJiBhS2V5c1tcImV2ZXJ5XCJdKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSGVscGVyXzEuSGVscGVyLmlzTm90TnVsbChiW2tleV0pICYmIEpzb25IZWxwZXIuZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vZWxzZSBpcyBmYWxzZSAob3Igbm90IGhhbmRsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVlcGNvcGllcyBKU09OXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIGRlZXBDb3B5KG9iaikge1xuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTIwNDc1L2hvdy10by1jcmVhdGUtYW5kLWNsb25lLWEtanNvbi1vYmplY3QvMTc1MDI5OTAjMTc1MDI5OTBcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIC8vIGJhc2ljIHR5cGUgZGVlcCBjb3B5XG4gICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOdWxsKG9iaikgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJyYXkgZGVlcCBjb3B5XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgbGV0IGNsb25lQSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNsb25lQVtpXSA9IEpzb25IZWxwZXIuZGVlcENvcHkob2JqW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZUE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmouZ2V0VGltZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgZGVlcCBjb3B5XG4gICAgICAgIGxldCBjbG9uZU8gPSB7fTtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgY2xvbmVPW2ldID0gSnNvbkhlbHBlci5kZWVwQ29weShvYmpbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZU87XG4gICAgfVxuICAgIHN0YXRpYyBkZWVwQXNzaWduKC4uLm9iamVjdHMpIHtcbiAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KG9iamVjdHMpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIG9iamVjdHMuZm9yRWFjaChhcnIgPT4gcmVzdWx0LnB1c2goLi4uYXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHt9O1xuICAgICAgICBvYmplY3RzLmZvckVhY2gob2JqID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdE9ialtpXSAmJiB0eXBlb2Ygb2JqW2ldID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHRPYmpbaV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JqW2ldID0gSnNvbkhlbHBlci5kZWVwQXNzaWduKHJlc3VsdE9ialtpXSwgb2JqW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ialtpXSA9IG9ialtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0T2JqO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGlmZihhLCBiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHt9LFxuICAgICAgICAgICAgYWRkZWQ6IHt9LFxuICAgICAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgIH07XG4gICAgICAgIC8vIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpe1xuICAgICAgICAvLyAgICAgY29uc3QgbGVuZ3RoQSA9IGEubGVuZ3RoO1xuICAgICAgICAvLyAgICAgY29uc3QgbGVuZ3RoQiA9IGIubGVuZ3RoO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4obGVuZ3RoQSwgbGVuZ3RoQik7XG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgICAgICBjb25zdFxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmICgodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAmJiAoIUFycmF5LmlzQXJyYXkoYSkgJiYgIUFycmF5LmlzQXJyYXkoYikpKSB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzQWRkZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgICAgICAgICBpZiAoaSBpbiBiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gSnNvbkhlbHBlci5nZXREaWZmKGFbaV0sIGJbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNoYW5nZWRbaV0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVkLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgaGFzUmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoIShpIGluIGEpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZGVkW2ldID0gYltpXTtcbiAgICAgICAgICAgICAgICBoYXNBZGRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1JlbW92ZWQgfHwgaGFzQWRkZWQgfHwgaGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhcHBseURpZmYob2JqLCBkaWZmKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkaWZmLnJlbW92ZWQpKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhkaWZmLmNoYW5nZWQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChcInZhbHVlXCIgaW4gZGlmZi5jaGFuZ2VkW2tleV0pIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XSA9IGRpZmYuY2hhbmdlZFtrZXldLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBKc29uSGVscGVyLmFwcGx5RGlmZihvYmpba2V5XSwgZGlmZi5jaGFuZ2VkW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5hZGRlZCkuZm9yRWFjaChrZXkgPT4gb2JqW2tleV0gPSBkaWZmLmFkZGVkW2tleV0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBkaWZmLnJlbW92ZWQuc29ydCgoYSwgYikgPT4gKHBhcnNlSW50KGIpIC0gcGFyc2VJbnQoYSkpKS5mb3JFYWNoKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKHBhcnNlSW50KGluZGV4KSwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpZmYucmVtb3ZlZC5mb3JFYWNoKHJlbSA9PiBkZWxldGUgb2JqW3JlbV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxufVxuZXhwb3J0cy5Kc29uSGVscGVyID0gSnNvbkhlbHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpzb25IZWxwZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWlncmF0aW9uSGVscGVyID0gdm9pZCAwO1xuY29uc3QgdHlwZW9ybV8xID0gcmVxdWlyZShcInR5cGVvcm1cIik7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIE1pZ3JhdGlvbkhlbHBlciB7XG4gICAgc3RhdGljIGlzU2VydmVyKCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUYWJsZUZyb21Nb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUodGhpcy5jcmVhdGVUYWJsZUZyb21Nb2RlbENsYXNzKG1vZGVsQ2xhc3MpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRNYW55VG9NYW55VGFibGUodGFibGVPbmUsIHRhYmxlVHdvLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRoaXMuY3JlYXRlTWFueVRvTWFueVRhYmxlKHRhYmxlT25lLCB0YWJsZVR3bykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZU1hbnlUb01hbnlUYWJsZSh0YWJsZU9uZSwgdGFibGVUd28pIHtcbiAgICAgICAgbGV0IGZpZWxkT25lID0gdGFibGVPbmUgKyBcIklkXCI7XG4gICAgICAgIGxldCBmaWVsZFR3byA9IHRhYmxlVHdvICsgXCJJZFwiO1xuICAgICAgICBsZXQgbmFtZSA9IHRhYmxlT25lICsgdGFibGVUd28uc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0YWJsZVR3by5zdWJzdHIoMSk7XG4gICAgICAgIGxldCBtYW55VG9NYW55VGFibGUgPSBuZXcgdHlwZW9ybV8xLlRhYmxlKHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZE9uZSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFR3byxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpbmRpY2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIklEWF9cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkT25lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkT25lXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIklEWF9cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkVHdvLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkVHdvXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJGS19cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkT25lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkT25lXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogdGFibGVPbmUucmVwbGFjZSgvKFtBLVpdKS8sIChtYXRjaCwgcDEpID0+IFwiX1wiICsgcDEudG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBcImNhc2NhZGVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJGS19cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkVHdvLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkVHdvXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogdGFibGVUd28ucmVwbGFjZSgvKFtBLVpdKS8sIChtYXRjaCwgcDEpID0+IFwiX1wiICsgcDEudG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBcImNhc2NhZGVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hbnlUb01hbnlUYWJsZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVRhYmxlRnJvbU1vZGVsQ2xhc3MobW9kZWxDbGFzcywgcHJlZml4KSB7XG4gICAgICAgIHByZWZpeCA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHByZWZpeCwgXCJcIik7XG4gICAgICAgIGxldCBjb2x1bW5zID0gW107XG4gICAgICAgIGxldCBpbmRpY2VzID0gW107XG4gICAgICAgIGxldCBmb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICBsZXQgc2NoZW1hRGVmaW5pdGlvbiA9IG1vZGVsQ2xhc3MuZ2V0U2NoZW1hRGVmaW5pdGlvbigpO1xuICAgICAgICBsZXQgdGFibGVOYW1lID0gcHJlZml4ICsgSGVscGVyXzEuSGVscGVyLnRvU25ha2VDYXNlKHNjaGVtYURlZmluaXRpb24ubmFtZSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjaGVtYURlZmluaXRpb24uY29sdW1ucykuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgbGV0IGNvbHVtbkNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdba2V5XSA9IHNjaGVtYURlZmluaXRpb24uY29sdW1uc1tjb2x1bW5dW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcIm5hbWVcIl0gPSBjb2x1bW47XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0ucHJpbWFyeSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImlzUHJpbWFyeVwiXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJpc051bGxhYmxlXCJdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY2hlbWFEZWZpbml0aW9uLmNvbHVtbnNbY29sdW1uXS5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAvL0lmIGl0IGlzIG5vdCBFYXN5U3luY0Jhc2VNb2RlbCBvciBzZXJ2ZXJcbiAgICAgICAgICAgICAgICBpZiAoSGVscGVyXzEuSGVscGVyLmlzTnVsbChtb2RlbENsYXNzLkNBTl9CRV9TWU5DRUQpIHx8IHRoaXMuaXNTZXJ2ZXIoKSB8fCBjb2x1bW4gPT09IFwiY2xpZW50SWRcIikge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJpc0dlbmVyYXRlZFwiXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImdlbmVyYXRpb25TdHJhdGVneVwiXSA9IFwiaW5jcmVtZW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJ0eXBlXCJdID0gXCJJTlRFR0VSXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbkNvbmZpZ1tcImRlZmF1bHRcIl0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID0gXCInXCIgKyBjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdICsgXCInXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1wiZGVmYXVsdFwiXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImRlZmF1bHRcIl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPT09IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5TSU1QTEVfSlNPTikge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPSBNaWdyYXRpb25IZWxwZXIuVFlQRVMuVEVYVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW5Db25maWdbXCJ0eXBlXCJdID09PSBNaWdyYXRpb25IZWxwZXIuVFlQRVMuTUVESVVNVEVYVCAmJiAhdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1widHlwZVwiXSA9IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5URVhUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPT09IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5TSU1QTEVfSlNPTiAmJiAhdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1widHlwZVwiXSA9IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5URVhUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbkNvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWFEZWZpbml0aW9uLnJlbGF0aW9ucykuZm9yRWFjaChyZWxhdGlvbiA9PiB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5yZWxhdGlvbnNbcmVsYXRpb25dLnR5cGUgPT09IFwibWFueS10by1vbmVcIiB8fCBzY2hlbWFEZWZpbml0aW9uLnJlbGF0aW9uc1tyZWxhdGlvbl0uam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIC8vIGxldCBjb2x1bW5OYW1lID0gSGVscGVyLnRvU25ha2VDYXNlKHJlbGF0aW9uKSArIFwiSWRcIjtcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uTmFtZSA9IHJlbGF0aW9uLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgcmVsYXRpb24uc3Vic3RyKDEpICsgXCJJZFwiO1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiSURYX1wiICsgdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2NvbHVtbk5hbWVdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCBmb3JlaWduS2V5Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkZLX1wiICsgdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2NvbHVtbk5hbWVdLFxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBIZWxwZXJfMS5IZWxwZXIudG9TbmFrZUNhc2Uoc2NoZW1hRGVmaW5pdGlvbi5yZWxhdGlvbnNbcmVsYXRpb25dLnRhcmdldCksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzLnB1c2goZm9yZWlnbktleUNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IHR5cGVvcm1fMS5UYWJsZSh7XG4gICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgaW5kaWNlczogaW5kaWNlcyxcbiAgICAgICAgICAgIGZvcmVpZ25LZXlzOiBmb3JlaWduS2V5c1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHVwZGF0ZU1vZGVsKHF1ZXJ5UnVubmVyLCBuZXdNb2RlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IHNjaGVtYURlZmluaXRpb24gPSBuZXdNb2RlbC5nZXRTY2hlbWFEZWZpbml0aW9uKCk7XG4gICAgICAgICAgICBsZXQgdGFibGVOYW1lID0gSGVscGVyXzEuSGVscGVyLnRvU25ha2VDYXNlKHNjaGVtYURlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICBsZXQgbmV3VGFibGUgPSB0aGlzLmNyZWF0ZVRhYmxlRnJvbU1vZGVsQ2xhc3MobmV3TW9kZWwpO1xuICAgICAgICAgICAgbGV0IHRhYmxlID0geWllbGQgcXVlcnlSdW5uZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIHRhYmxlLm5hbWUgPSBcIl9fdGVtcF9fXCIgKyB0YWJsZS5uYW1lO1xuICAgICAgICAgICAgdGFibGUuaW5kaWNlcy5mb3JFYWNoKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gXCJfX3RlbXBfX1wiICsgaW5kZXgubmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFibGUuZm9yZWlnbktleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGtleS5uYW1lID0gXCJfX3RlbXBfX1wiICsga2V5Lm5hbWU7XG4gICAgICAgICAgICAgICAga2V5LmNvbHVtbk5hbWVzID0gW2tleS5jb2x1bW5OYW1lc1swXV07XG4gICAgICAgICAgICAgICAga2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtrZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzWzBdXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKE1pZ3JhdGlvbkhlbHBlci5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdCAhPT0gbnVsbCAmJiB0eXBlb2YgY29sdW1uLmRlZmF1bHQgPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmRlZmF1bHQuc3RhcnRzV2l0aChcIidcIikgJiYgY29sdW1uLmRlZmF1bHQuZW5kc1dpdGgoXCInXCIpICYmIChjb2x1bW4udHlwZSAhPT0gXCJ2YXJjaGFyXCIgfHwgY29sdW1uLmRlZmF1bHQuc3RhcnRzV2l0aChcIicnXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHQgPSBjb2x1bW4uZGVmYXVsdC5zdWJzdHJpbmcoMSwgY29sdW1uLmRlZmF1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRhYmxlKTtcbiAgICAgICAgICAgIGxldCBuYW1lcyA9IFtdO1xuICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgbmFtZXMucHVzaChjb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiSU5TRVJUIElOVE8gXCIgKyB0YWJsZS5uYW1lICsgXCIoYFwiICsgbmFtZXMuam9pbihcImAsYFwiKSArIFwiYCkgU0VMRUNUIGBcIiArIG5hbWVzLmpvaW4oXCJgLGBcIikgKyBcImAgRlJPTSBcIiArIHRhYmxlTmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiRFJPUCBUQUJMRSBcIiArIHRhYmxlTmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKG5ld1RhYmxlKTtcbiAgICAgICAgICAgIGxldCBuZXdDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICAgICAgbmV3VGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiBuZXdDb2x1bW5OYW1lcy5wdXNoKGNvbHVtbi5uYW1lKSk7XG4gICAgICAgICAgICBuYW1lcyA9IFtdO1xuICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiSU5TRVJUIElOVE8gXCIgKyB0YWJsZU5hbWUgKyBcIihgXCIgKyBuYW1lcy5qb2luKFwiYCxgXCIpICsgXCJgKSBTRUxFQ1QgYFwiICsgbmFtZXMuam9pbihcImAsYFwiKSArIFwiYCBGUk9NIFwiICsgdGFibGUubmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiRFJPUCBUQUJMRSBcIiArIHRhYmxlLm5hbWUgKyBcIjtcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuTWlncmF0aW9uSGVscGVyID0gTWlncmF0aW9uSGVscGVyO1xuTWlncmF0aW9uSGVscGVyLlRZUEVTID0ge1xuICAgIElOVEVHRVI6IFwiaW50XCIsXG4gICAgRkxPQVQ6IFwiZmxvYXRcIixcbiAgICBEQVRFOiBcImRhdGV0aW1lXCIsXG4gICAgU1RSSU5HOiBcInZhcmNoYXJcIixcbiAgICBURVhUOiBcInRleHRcIixcbiAgICBNRURJVU1URVhUOiBcIm1lZGl1bXRleHRcIixcbiAgICBCT09MRUFOOiBcImJvb2xlYW5cIixcbiAgICBKU09OOiBcImpzb25cIixcbiAgICBTSU1QTEVfSlNPTjogXCJzaW1wbGUtanNvblwiLFxuICAgIE1ZX0pTT046IFwibXktanNvblwiXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlncmF0aW9uSGVscGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PYmplY3RIZWxwZXIgPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIE9iamVjdEhlbHBlciB7XG4gICAgLyoqXG4gICAgICogSW52ZXJ0cyB0aGUga2V5LVZhbHVlcyBmb3IgYW4gb2JqZWN0XG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgc3RhdGljIGludmVydEtleVZhbHVlcyhvYmopIHtcbiAgICAgICAgbGV0IG5ld19vYmogPSB7fTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBuZXdfb2JqW29ialtwcm9wXV0gPSBwcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdfb2JqO1xuICAgIH1cbiAgICBzdGF0aWMgdG9BcnJheShvYmplY3QpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBrIGluIG9iamVjdCkge1xuICAgICAgICAgICAgcmVzLnB1c2gob2JqZWN0W2tdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgb2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBkZWVwRXF1YWwoYSwgYikge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBiID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBsZXQga2V5c09mQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGVlcEVxdWFsID0gT2JqZWN0LmtleXMoYSkuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGtleXNPZkIuaW5kZXhPZihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrZXlzT2ZCLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdEhlbHBlci5kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKGNoaWxkcmVuRGVlcEVxdWFsICYmIGtleXNPZkIubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3RldCwgb2IgZGVyIMO8YmVyZ2ViZW5lIEluZGV4IGFtIE9iamVrdCBnZXNldHp0IGlzdC4gV2VyZGVuIG1laHJlcmUgSW5kZXhlcyDDvGJlcmdlYmVuLCBzbyB3aXJkIGdldGVzdGV0LFxuICAgICAqIG9iIGRpZSBcIkluZGV4LUtldHRlXCIgZ2VzZXR6dCBpc3QuXG4gICAgICogQnNwLjpcbiAgICAgKiAgSGVscGVyLmlzU2V0KHtcImluZGV4MVwiOntcImluZGV4MlwiOnZhbHVlfX0sIFwiaW5kZXgxXCIsIFwiaW5kZXgyXCIpIGlzdCB3YWhyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqZWN0XG4gICAgICogQHBhcmFtIGluZGV4ZXNcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNTZXQob2JqZWN0LCAuLi5pbmRleGVzKSB7XG4gICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOb3ROdWxsKG9iamVjdCkpIHtcbiAgICAgICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChPYmplY3RIZWxwZXIuaXNTZXQuYXBwbHkobnVsbCwgW29iamVjdFtpbmRleGVzWzBdXV0uY29uY2F0KGluZGV4ZXMuc2xpY2UoMSkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuT2JqZWN0SGVscGVyID0gT2JqZWN0SGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0SGVscGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlByaW9yaXRpemVkID0gdm9pZCAwO1xuY29uc3QgSGVscGVyXzEgPSByZXF1aXJlKFwiLi9IZWxwZXJcIik7XG5jbGFzcyBQcmlvcml0aXplZCB7XG4gICAgY29uc3RydWN0b3IocHJvbWlzZXMpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByaW9yaXR5ID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gMDtcbiAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1Y2Nlc3MgPSB7fTtcbiAgICAgICAgdGhpcy5faGlnaGVzdFByb21pc2UgPSBudWxsO1xuICAgICAgICBwcm9taXNlcyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHByb21pc2VzLCB7fSk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9taXNlcykpIHtcbiAgICAgICAgICAgIGxldCB0bXBQcm9taXNlcyA9IHt9O1xuICAgICAgICAgICAgcHJvbWlzZXMuZm9yRWFjaCgocHJvbWlzZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHRtcFByb21pc2VzWyhpICsgMSkgKiAxMF0gPSBwcm9taXNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm9taXNlcyA9IHRtcFByb21pc2VzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoaWdoZXN0UHJvbWlzZVJlc29sdmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5faGlnaGVzdFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGhpZ2hlc3RQcm9taXNlUmVzb2x2ZXIgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvbWlzZXMpLmZvckVhY2gocHJpb3JpdHkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VjY2Vzc1twcmlvcml0eV0gPSBudWxsO1xuICAgICAgICAgICAgcHJvbWlzZXNbcHJpb3JpdHldLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzW3ByaW9yaXR5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KHByaW9yaXR5KSA+IHRoaXMuX2xhc3RQcmlvcml0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UHJpb3JpdHkgPSBwYXJzZUludChwcmlvcml0eSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxDYWxsYmFja3MoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrSGlnaGVzdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFByb21pc2VSZXNvbHZlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3NbcHJpb3JpdHldID0gZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tIaWdoZXN0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gMjtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFByb21pc2VSZXNvbHZlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcHJvbWlzZXMgPSBwcm9taXNlcztcbiAgICB9XG4gICAgX2NhbGxDYWxsYmFja3MoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX2xhc3RSZXN1bHQsIHRoaXMuX2xhc3RQcmlvcml0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfY2hlY2tIaWdoZXN0KCkge1xuICAgICAgICBsZXQgaXNIaWdoZXN0UmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1Y2Nlc3MpLnJldmVyc2UoKS5zb21lKHByaW9yaXR5ID0+IHtcbiAgICAgICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOdWxsKHRoaXMuX3N1Y2Nlc3NbcHJpb3JpdHldKSkge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgYmVlbmRldCBzb21lLXNjaGxlaWZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zdWNjZXNzW3ByaW9yaXR5XSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlzSGlnaGVzdFJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaXNIaWdoZXN0UmVzdWx0O1xuICAgIH1cbiAgICBkbyhjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXMgPiAwKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLl9sYXN0UmVzdWx0LCB0aGlzLl9sYXN0UHJpb3JpdHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZ2hlc3QoZnVuY09yUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5faGlnaGVzdFByb21pc2U7XG4gICAgICAgICAgICBpZiAoSGVscGVyXzEuSGVscGVyLmlzTm90TnVsbChmdW5jT3JQcm9taXNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFzdFJlc3VsdCkudGhlbihmdW5jT3JQcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFzdFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaXJzdChmdW5jT3JQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKEhlbHBlcl8xLkhlbHBlci5pc05vdE51bGwoZnVuY09yUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShPYmplY3RbXCJ2YWx1ZXNcIl0odGhpcy5fcHJvbWlzZXMpKS50aGVuKGZ1bmNPclByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShPYmplY3RbXCJ2YWx1ZXNcIl0odGhpcy5fcHJvbWlzZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2xhc3RSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlByaW9yaXRpemVkID0gUHJpb3JpdGl6ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcmlvcml0aXplZC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvbWlzZVdpdGhIYW5kbGVycyA9IHZvaWQgMDtcbmNsYXNzIFByb21pc2VXaXRoSGFuZGxlcnMgZXh0ZW5kcyBQcm9taXNlIHtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgICAgICBsZXQgcmVzb2x2ZXIgPSBudWxsO1xuICAgICAgICBsZXQgcmVqZWN0ZXIgPSBudWxsO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVyID0gcmVzO1xuICAgICAgICAgICAgcmVqZWN0ZXIgPSByZWo7XG4gICAgICAgICAgICBpZiAoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICBleGVjdXRvcihyZXNvbHZlciwgcmVqZWN0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLnJlamVjdGVyID0gcmVqZWN0ZXI7XG4gICAgfVxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlamVjdChyZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMucmVqZWN0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ZXIocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUHJvbWlzZVdpdGhIYW5kbGVycyA9IFByb21pc2VXaXRoSGFuZGxlcnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlV2l0aEhhbmRsZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SYW5kb20gPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIFJhbmRvbSB7XG4gICAgc3RhdGljIHNlZWRSYW5kb20oc2VlZCkge1xuICAgICAgICB0aGlzLl9zZWVkID0gc2VlZDtcbiAgICB9XG4gICAgc3RhdGljIGdldFJhbmRvbSgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLl9zZWVkICs9IDB4NkQyQjc5RjU7XG4gICAgICAgIHQgPSBNYXRoLmltdWwodCBeIHQgPj4+IDE1LCB0IHwgMSk7XG4gICAgICAgIHQgXj0gdCArIE1hdGguaW11bCh0IF4gdCA+Pj4gNywgdCB8IDYxKTtcbiAgICAgICAgcmV0dXJuICgodCBeIHQgPj4+IDE0KSA+Pj4gMCkgLyA0Mjk0OTY3Mjk2O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW50UmFuZG9tKG1heFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKFJhbmRvbS5nZXRSYW5kb20oKSAqIChtYXhWYWx1ZSArIDEpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFN0cmluZ1JhbmRvbShudW1TaWducywgYWxwaGFiZXQpIHtcbiAgICAgICAgYWxwaGFiZXQgPSBIZWxwZXJfMS5IZWxwZXIubm9uTnVsbChhbHBoYWJldCwgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiKTtcbiAgICAgICAgbGV0IHJhbmRvbSA9IFwiXCI7XG4gICAgICAgIGNvbnN0IG51bUFscGhhYmV0ID0gYWxwaGFiZXQubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TaWduczsgaSsrKSB7XG4gICAgICAgICAgICByYW5kb20gKz0gYWxwaGFiZXRbUmFuZG9tLmdldEludFJhbmRvbShudW1BbHBoYWJldCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5kb207XG4gICAgfVxufVxuZXhwb3J0cy5SYW5kb20gPSBSYW5kb207XG5SYW5kb20uX3NlZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmRvbS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuWFNTSGVscGVyID0gdm9pZCAwO1xuY2xhc3MgWFNTSGVscGVyIHtcbiAgICBzdGF0aWMgZXNjYXBlSFRNTCh0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgTUFQID0ge1xuICAgICAgICAgICAgJyYnOiAnJmFtcDsnLFxuICAgICAgICAgICAgJzwnOiAnJmx0OycsXG4gICAgICAgICAgICAnPic6ICcmZ3Q7JyxcbiAgICAgICAgICAgICdcIic6ICcmcXVvdDsnLFxuICAgICAgICAgICAgXCInXCI6ICcmIzAzOTsnXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1smPD5cIiddL2csIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gTUFQW21dO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGVzY2FwZUpTKHRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bPF0oW1xcXFxzXSpcXFxcXFwvP1tcXFxcc10qKXNjcmlwdChbXjxdKilbPl0vZywgZnVuY3Rpb24gKG1hdGNoLCBwMSwgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIiZsdDtcIiArIHAxICsgXCJzYyZ6d25qO3JpcHRcIiArIHAyICsgXCImZ3Q7XCI7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWFNTSGVscGVyID0gWFNTSGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WFNTSGVscGVyLmpzLm1hcCIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYWxsO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gYWxsKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsaWRhdG9ycyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHZhbGlkYXRvcnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmdW5jdGlvbiBhbGxQcm9wVHlwZXMoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gICAgdmFsaWRhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRvci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKGFsbFByb3BUeXBlcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbi8vIE1vc3RseSB0YWtlbiBmcm9tIFJlYWN0UHJvcFR5cGVzLlxuXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWVTYWZlICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgLicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNiA/IF9sZW4gLSA2IDogMCksIF9rZXkgPSA2OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA2XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGUuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lU2FmZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZVNhZmVdLmNvbmNhdChhcmdzKSk7XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJyArIHByb3BGdWxsTmFtZSArICdgIHByb3Agb24gYCcgKyBjb21wb25lbnROYW1lICArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tXG4gICAgICAvLyBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiY29uc3QgZT1TeW1ib2woKSx0PVN5bWJvbCgpLHI9U3ltYm9sKCksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysbz1uZXcgV2Vha01hcCxzPWU9PmUmJihvLmhhcyhlKT9vLmdldChlKTpuKGUpPT09T2JqZWN0LnByb3RvdHlwZXx8bihlKT09PUFycmF5LnByb3RvdHlwZSksYz1lPT5cIm9iamVjdFwiPT10eXBlb2YgZSYmbnVsbCE9PWUsbD0obixvKT0+e2xldCBzPSExO2NvbnN0IGM9KGUsdCk9PntpZighcyl7bGV0IHI9ZS5hLmdldChuKTtyfHwocj1uZXcgU2V0LGUuYS5zZXQobixyKSksci5hZGQodCl9fSxsPXtmOm8sZ2V0KGUsdCl7cmV0dXJuIHQ9PT1yP246KGModGhpcyx0KSxpKGVbdF0sdGhpcy5hLHRoaXMuYykpfSxoYXMoZSxyKXtyZXR1cm4gcj09PXQ/KHM9ITAsdGhpcy5hLmRlbGV0ZShuKSwhMCk6KGModGhpcyxyKSxyIGluIGUpfSxvd25LZXlzKHQpe3JldHVybiBjKHRoaXMsZSksUmVmbGVjdC5vd25LZXlzKHQpfX07cmV0dXJuIG8mJihsLnNldD1sLmRlbGV0ZVByb3BlcnR5PSgpPT4hMSksbH0saT0oZSx0LG8pPT57aWYoIXMoZSkpcmV0dXJuIGU7Y29uc3QgYz1lW3JdfHxlLGk9KGU9Pk9iamVjdC5pc0Zyb3plbihlKXx8T2JqZWN0LnZhbHVlcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlKSkuc29tZShlPT4hZS53cml0YWJsZSkpKGMpO2xldCB1PW8mJm8uZ2V0KGMpO3JldHVybiB1JiZ1LmY9PT1pfHwodT1sKGMsaSksdS5wPW5ldyBQcm94eShpPyhlPT57aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gQXJyYXkuZnJvbShlKTtjb25zdCB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGUpO3JldHVybiBPYmplY3QudmFsdWVzKHQpLmZvckVhY2goZT0+e2UuY29uZmlndXJhYmxlPSEwfSksT2JqZWN0LmNyZWF0ZShuKGUpLHQpfSkoYyk6Yyx1KSxvJiZvLnNldChjLHUpKSx1LmE9dCx1LmM9byx1LnB9LHU9KGUsdCk9Pntjb25zdCByPVJlZmxlY3Qub3duS2V5cyhlKSxuPVJlZmxlY3Qub3duS2V5cyh0KTtyZXR1cm4gci5sZW5ndGghPT1uLmxlbmd0aHx8ci5zb21lKChlLHQpPT5lIT09blt0XSl9LGE9KHQscixuLG8pPT57aWYoT2JqZWN0LmlzKHQscikpcmV0dXJuITE7aWYoIWModCl8fCFjKHIpKXJldHVybiEwO2NvbnN0IHM9bi5nZXQodCk7aWYoIXMpcmV0dXJuITA7aWYobyl7Y29uc3QgZT1vLmdldCh0KTtpZihlJiZlLm49PT1yKXJldHVybiBlLmc7by5zZXQodCx7bjpyLGc6ITF9KX1sZXQgbD1udWxsO2Zvcihjb25zdCBjIG9mIHMpe2NvbnN0IHM9Yz09PWU/dSh0LHIpOmEodFtjXSxyW2NdLG4sbyk7aWYoITAhPT1zJiYhMSE9PXN8fChsPXMpLGwpYnJlYWt9cmV0dXJuIG51bGw9PT1sJiYobD0hMCksbyYmby5zZXQodCx7bjpyLGc6bH0pLGx9LGY9ZT0+ISFzKGUpJiZ0IGluIGUseT1lPT5zKGUpJiZlW3JdfHxudWxsLGI9KGUsdD0hMCk9PntvLnNldChlLHQpfSxnPShlLHQpPT57Y29uc3Qgcj1bXSxuPShlLG8pPT57Y29uc3Qgcz10LmdldChlKTtzP3MuZm9yRWFjaCh0PT57bihlW3RdLG8/Wy4uLm8sdF06W3RdKX0pOm8mJnIucHVzaChvKX07cmV0dXJuIG4oZSkscn07ZXhwb3J0e2cgYXMgYWZmZWN0ZWRUb1BhdGhMaXN0LGkgYXMgY3JlYXRlUHJveHkseSBhcyBnZXRVbnRyYWNrZWQsYSBhcyBpc0NoYW5nZWQsYiBhcyBtYXJrVG9UcmFjayxmIGFzIHRyYWNrTWVtb307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tb2Rlcm4ubWpzLm1hcFxuIiwiaW1wb3J0e2dldFVudHJhY2tlZCBhcyBlLGlzQ2hhbmdlZCBhcyB0LGNyZWF0ZVByb3h5IGFzIHIsdHJhY2tNZW1vIGFzIG59ZnJvbVwicHJveHktY29tcGFyZVwiO2V4cG9ydHtnZXRVbnRyYWNrZWQgYXMgZ2V0VW50cmFja2VkT2JqZWN0fWZyb21cInByb3h5LWNvbXBhcmVcIjtjb25zdCBhPWU9Plwib2JqZWN0XCI9PXR5cGVvZiBlJiZudWxsIT09ZSxvPSh0LHIpPT57aWYoIWEodCkpcmV0dXJuIHQ7Y29uc3QgYz1lKHQpO3JldHVybiBudWxsIT09Yz8obih0KSxjKTooci5oYXModCl8fChyLmFkZCh0KSxPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChbZSxuXSk9Pntjb25zdCBhPW8obixyKTtPYmplY3QuaXMoYSxuKXx8KHRbZV09YSl9KSksdCl9LGM9KGUsdCxyKT0+e2lmKCFhKGUpfHwhYSh0KSlyZXR1cm47Y29uc3Qgbj1yLmdldCh0KTtuJiZuLmZvckVhY2gobj0+e2MoZVtuXSx0W25dLHIpfSl9LHM9KG4sYSk9Pnt2YXIgcztjb25zdCBsPW51bGwhPShzPW51bGw9PWE/dm9pZCAwOmEuc2l6ZSk/czoxLHA9W10sdT1uZXcgV2Vha01hcCxmPW5ldyBXZWFrTWFwO3JldHVybiBhPT57Y29uc3Qgcz1lKGEpLGk9c3x8YSxkPXUuZ2V0KGkpO2lmKGQpcmV0dXJuIGMoYSxpLGQuYSksZC5yO2ZvcihsZXQgZT0wO2U8cC5sZW5ndGg7ZSs9MSl7Y29uc3Qgcj1wW2VdO2lmKCF0KHIubyxhLHIuYSxuZXcgV2Vha01hcCkpcmV0dXJuIHUuc2V0KGkse3I6ci5yLGE6ci5hfSksYyhhLGksci5hKSxyLnJ9Y29uc3QgZz1uZXcgV2Vha01hcCxoPXIoYSxnLGYpLGs9byhuKGgpLG5ldyBTZXQpO3JldHVybiBudWxsIT09cyYmYyhhLHMsZykscC51bnNoaWZ0KHtvOmkscjprLGE6Z30pLHAubGVuZ3RoPmwmJnAucG9wKCksdS5zZXQoaSx7cjprLGE6Z30pLGt9fTtleHBvcnR7cyBhcyBkZWZhdWx0fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1vZGVybi5tanMubWFwXG4iLCJleHBvcnQgKiBmcm9tICcuL3NyYy9DYXJkL0NhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL0J1dHRvbi9CdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL0NoZWNrQm94L0NoZWNrYm94JztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL0Zvcm1FbGVtZW50cy9FdmVudFR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL0Zvcm1FbGVtZW50cy9JbnB1dC9IaWRkZW5JbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9Gb3JtRWxlbWVudHMvSW5wdXQvSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL1N3aXRjaC9Td2l0Y2gnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGF5b3V0L0ZsZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGF5b3V0L0dyb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGlzdC9MaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1JibUNvbXBvbmVudFByb3BzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RhYmxlL1RhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RleHQvQm9keSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9Ub3BCYXIvVG9wQmFyJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RvcEJhci9Ub3BCYXJCdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvVHlwZUhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvaGVscGVyJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcFJlYWN0TW9iaWxlLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uL2hlbHBlcic7XG5leHBvcnQgdmFyIENhcmQgPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciB0aXRsZSA9IF9hLnRpdGxlLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLmZ1bGxIZWlnaHQsIGZ1bGxIZWlnaHQgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYiwgX2MgPSBfYS5ub1BhZGRpbmdIZWlnaHQsIG5vUGFkZGluZ0hlaWdodCA9IF9jID09PSB2b2lkIDAgPyBmYWxzZSA6IF9jLCBfZCA9IF9hLm5vUGFkZGluZywgbm9QYWRkaW5nID0gX2QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2QsIF9lID0gX2Eubm9QYWRkaW5nV2lkdGgsIG5vUGFkZGluZ1dpZHRoID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2UsIF9mID0gX2Eubm9NYXJnaW4sIG5vTWFyZ2luID0gX2YgPT09IHZvaWQgMCA/IGZhbHNlIDogX2YsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInRpdGxlXCIsIFwiY2hpbGRyZW5cIiwgXCJmdWxsSGVpZ2h0XCIsIFwibm9QYWRkaW5nSGVpZ2h0XCIsIFwibm9QYWRkaW5nXCIsIFwibm9QYWRkaW5nV2lkdGhcIiwgXCJub01hcmdpblwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgdmFyIGNsYXNzZXMgPSBbJ2NhcmQnXTtcbiAgICBpZiAoZnVsbEhlaWdodClcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmdWxsLWhlaWdodCcpO1xuICAgIGlmIChub1BhZGRpbmcpXG4gICAgICAgIGNsYXNzZXMucHVzaCgnbm8tcGFkZGluZycpO1xuICAgIGlmIChub01hcmdpbilcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCduby1tYXJnaW4nKTtcbiAgICBpZiAobm9QYWRkaW5nSGVpZ2h0KVxuICAgICAgICBjbGFzc2VzLnB1c2goJ25vLXBhZGRpbmctaGVpZ2h0Jyk7XG4gICAgaWYgKG5vUGFkZGluZ1dpZHRoKVxuICAgICAgICBjbGFzc2VzLnB1c2goJ25vLXBhZGRpbmctd2lkdGgnKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoY2xhc3NlcywgY2xhc3NOYW1lKSB9KSxcbiAgICAgICAgdGl0bGUgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRpdGxlXCIgfSwgdGl0bGUpIDogbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJjb250ZW50XCIgfSwgY2hpbGRyZW4pKSk7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcmQuanMubWFwIiwidmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiBhcyBCU0J1dHRvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5leHBvcnQgdmFyIEJ1dHRvbiA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJTQnV0dG9uLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgYnNQcmVmaXg6IHByZWZpeENsYXNzKCdidXR0b24nKSB9KSwgY2hpbGRyZW4pKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnV0dG9uLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5mdW5jdGlvbiBDaGVja2JveChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBfYjtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2MgPSBfYS5sYWJlbCwgbGFiZWwgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5pc0xhYmVsQmVmb3JlQ2hlY2tib3gsIGlzTGFiZWxCZWZvcmVDaGVja2JveCA9IF9kID09PSB2b2lkIDAgPyBmYWxzZSA6IF9kLCBpZCA9IF9hLmlkLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImxhYmVsXCIsIFwiaXNMYWJlbEJlZm9yZUNoZWNrYm94XCIsIFwiaWRcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICAvLyBFZmZlY3RzXG4gICAgLy8gT3RoZXJcbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG4gICAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMSAmJiB0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxhYmVsID0gY2hpbGRyZW47XG4gICAgfVxuICAgIHZhciBwcmVMYWJlbCA9ICcnO1xuICAgIGlmIChpc0xhYmVsQmVmb3JlQ2hlY2tib3gpIHtcbiAgICAgICAgX2IgPSBbcHJlTGFiZWwsIGxhYmVsXSwgbGFiZWwgPSBfYlswXSwgcHJlTGFiZWwgPSBfYlsxXTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoWydjaGVja2JveCddLCBjbGFzc05hbWUpIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7IGh0bWxGb3I6IGlkLCBrZXk6IGlkIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2NoZWNrYm94LWxhYmVsJykgfSwgcHJlTGFiZWwpLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9fYXNzaWduKHt9LCBwcm9wcywgeyB0eXBlOiBcImNoZWNrYm94XCIsIGlkOiBpZCwgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnY2hlY2tib3gtaW5wdXQnKSB9KSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2NoZWNrYm94LWNoZWNrbWFyaycpIH0pLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdjaGVja2JveC1sYWJlbCcpIH0sIGxhYmVsKSkpKTtcbn1cbnZhciB0bXAgPSBSZWFjdC5tZW1vKENoZWNrYm94KTtcbmV4cG9ydCB7IHRtcCBhcyBDaGVja2JveCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hlY2tib3guanMubWFwIiwiZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRUeXBlcy5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuL0lucHV0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vLi4vaGVscGVyJztcbmZ1bmN0aW9uIEhpZGRlbklucHV0KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIF9iID0gX2Eubm9Gb2N1c0hpbnQsIG5vRm9jdXNIaW50ID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2IsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcIm5vRm9jdXNIaW50XCIsIFwiY2xhc3NOYW1lXCJdKTtcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuICAgIHZhciBub0ZvY3VzSGludENsYXNzID0gbm9Gb2N1c0hpbnQgPyAnbm8tZm9jdXMtaGludCcgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIF9fYXNzaWduKHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcyhbJ2hpZGRlbi1pbnB1dCcsIG5vRm9jdXNIaW50Q2xhc3NdLCBjbGFzc05hbWUpIH0sIHByb3BzKSk7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhIaWRkZW5JbnB1dCk7XG5leHBvcnQgeyB0bXAgYXMgSGlkZGVuSW5wdXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhpZGRlbklucHV0LmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vLi4vaGVscGVyJztcbmZ1bmN0aW9uIElucHV0KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIGxhYmVsID0gX2EubGFiZWwsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgb25DaGFuZ2VEYXRhID0gX2Eub25DaGFuZ2VEYXRhLCBvdXRzaWRlT25DaGFuZ2UgPSBfYS5vbkNoYW5nZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImxhYmVsXCIsIFwiY2xhc3NOYW1lXCIsIFwib25DaGFuZ2VEYXRhXCIsIFwib25DaGFuZ2VcIl0pO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICB2YXIgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAob3V0c2lkZU9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBvdXRzaWRlT25DaGFuZ2UoT2JqZWN0LmFzc2lnbihlLCB7IGV4dHJhRGF0YTogb25DaGFuZ2VEYXRhIH0pKTtcbiAgICAgICAgfVxuICAgIH0sIFtvdXRzaWRlT25DaGFuZ2UsIG9uQ2hhbmdlRGF0YV0pO1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2lucHV0JywgY2xhc3NOYW1lKSB9LFxuICAgICAgICBsYWJlbCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnaW5wdXQtbGFiZWwnKSB9LCBsYWJlbCkgOiBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2lucHV0LXRleHQnKSwgb25DaGFuZ2U6IG9uQ2hhbmdlIH0pKSkpO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oSW5wdXQpO1xuZXhwb3J0IHsgdG1wIGFzIElucHV0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi8uLi9oZWxwZXInO1xuZXhwb3J0IHZhciBTd2l0Y2ggPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBfYjtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2MgPSBfYS5sYWJlbCwgbGFiZWwgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5wcmVMYWJlbCwgcHJlTGFiZWwgPSBfZCA9PT0gdm9pZCAwID8gJycgOiBfZCwgX2UgPSBfYS5pc0xhYmVsQmVmb3JlU3dpdGNoLCBpc0xhYmVsQmVmb3JlU3dpdGNoID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2UsIF9mID0gX2EuaXNEdWFsLCBpc0R1YWwgPSBfZiA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX2YsIGlkID0gX2EuaWQsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwibGFiZWxcIiwgXCJwcmVMYWJlbFwiLCBcImlzTGFiZWxCZWZvcmVTd2l0Y2hcIiwgXCJpc0R1YWxcIiwgXCJpZFwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxICYmIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbGFiZWwgPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgaWYgKGlzTGFiZWxCZWZvcmVTd2l0Y2gpIHtcbiAgICAgICAgX2IgPSBbcHJlTGFiZWwsIGxhYmVsXSwgbGFiZWwgPSBfYlswXSwgcHJlTGFiZWwgPSBfYlsxXTtcbiAgICB9XG4gICAgaWYgKGxhYmVsICYmIHByZUxhYmVsICYmIGlzRHVhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzRHVhbCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKFsnc3dpdGNoJywgaXNEdWFsID8gJ2R1YWwnIDogdW5kZWZpbmVkXSwgY2xhc3NOYW1lKSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgeyBodG1sRm9yOiBpZCwga2V5OiBpZCB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdzd2l0Y2gtbGFiZWwnKSB9LCBwcmVMYWJlbCksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX19hc3NpZ24oe30sIHByb3BzLCB7IHR5cGU6IFwiY2hlY2tib3hcIiwgaWQ6IGlkIH0pKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdzd2l0Y2gtdG9nZ2xlJykgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3N3aXRjaC1oYW5kbGUnKSB9KSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3N3aXRjaC1sYWJlbCcpIH0sIGxhYmVsKSkpKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3dpdGNoLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vaGVscGVyJztcbmZ1bmN0aW9uIEZsZXgoX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLnZlcnRpY2FsLCB2ZXJ0aWNhbCA9IF9iID09PSB2b2lkIDAgPyBmYWxzZSA6IF9iO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICAvLyBFZmZlY3RzXG4gICAgLy8gT3RoZXJcbiAgICB2YXIgY2xhc3NlcyA9IFsnZmxleCddO1xuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ3ZlcnRpY2FsJyk7XG4gICAgfVxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoY2xhc3NlcywgY2xhc3NOYW1lKSB9LCBjaGlsZHJlbik7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhGbGV4KTtcbmV4cG9ydCB7IHRtcCBhcyBGbGV4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vaGVscGVyJztcbmZ1bmN0aW9uIEdyb3coX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLmNlbnRlciwgY2VudGVyID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIHZhciBjbGFzc2VzID0gWydncm93J107XG4gICAgaWYgKGNlbnRlcilcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdjZW50ZXInKTtcbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKGNsYXNzZXMsIGNsYXNzTmFtZSkgfSwgY2hpbGRyZW4pO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oR3Jvdyk7XG5leHBvcnQgeyB0bXAgYXMgR3JvdyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3Jvdy5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi9oZWxwZXInO1xuZnVuY3Rpb24gTGlzdChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBpdGVtcyA9IF9hLml0ZW1zLCByZW5kZXJJdGVtID0gX2EucmVuZGVySXRlbSwgcmVuZGVyQmVmb3JlID0gX2EucmVuZGVyQmVmb3JlLCBrZXlFeHRyYWN0b3IgPSBfYS5rZXlFeHRyYWN0b3IsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcIml0ZW1zXCIsIFwicmVuZGVySXRlbVwiLCBcInJlbmRlckJlZm9yZVwiLCBcImtleUV4dHJhY3RvclwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdCcsIGNsYXNzTmFtZSkgfSksIGl0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGJlZm9yZSA9IG51bGw7XG4gICAgICAgIGlmIChyZW5kZXJCZWZvcmUpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdC1pdGVtLWJlZm9yZScpIH0sIHJlbmRlckJlZm9yZShpdGVtLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdC1pdGVtJyksIGtleToga2V5RXh0cmFjdG9yKGl0ZW0sIGluZGV4KSB9LFxuICAgICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdsaXN0LWl0ZW0tbWFpbicpIH0sIHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpKSkpO1xuICAgIH0pKSk7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhMaXN0KTtcbmV4cG9ydCB7IHRtcCBhcyBMaXN0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaXN0LmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJibUNvbXBvbmVudFByb3BzLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUYWJsZSB9IGZyb20gJ3JlYWN0LXRhYmxlJztcbmltcG9ydCB7IFRhYmxlIGFzIFJCVGFibGUgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuZnVuY3Rpb24gVGFibGUoX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY29sdW1ucyA9IF9hLmNvbHVtbnMsIGRhdGEgPSBfYS5kYXRhLCBjZWxsUmVuZGVyZXIgPSBfYS5jZWxsUmVuZGVyZXI7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHZhciBfYTsgcmV0dXJuIChjLkNlbGwgPSAoX2EgPSBjLkNlbGwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNlbGxSZW5kZXJlcik7IH0pO1xuICAgIH1cbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKCEoJ3dpZHRoJyBpbiBjKSkge1xuICAgICAgICAgICAgYy53aWR0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgX2IgPSB1c2VUYWJsZSh7XG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSksIGdldFRhYmxlUHJvcHMgPSBfYi5nZXRUYWJsZVByb3BzLCBnZXRUYWJsZUJvZHlQcm9wcyA9IF9iLmdldFRhYmxlQm9keVByb3BzLCBoZWFkZXJHcm91cHMgPSBfYi5oZWFkZXJHcm91cHMsIHJvd3MgPSBfYi5yb3dzLCBwcmVwYXJlUm93ID0gX2IucHJlcGFyZVJvdztcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuICAgIHJldHVybiAoXG4gICAgLy8gYXBwbHkgdGhlIHRhYmxlIHByb3BzXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChSQlRhYmxlLCBfX2Fzc2lnbih7fSwgZ2V0VGFibGVQcm9wcygpKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRoZWFkXCIsIG51bGwsIFxuICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGhlYWRlciByb3dzXG4gICAgICAgIGhlYWRlckdyb3Vwcy5tYXAoZnVuY3Rpb24gKGhlYWRlckdyb3VwKSB7IHJldHVybiAoXG4gICAgICAgIC8vIEFwcGx5IHRoZSBoZWFkZXIgcm93IHByb3BzXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBfX2Fzc2lnbih7fSwgaGVhZGVyR3JvdXAuZ2V0SGVhZGVyR3JvdXBQcm9wcygpKSwgXG4gICAgICAgIC8vIExvb3Agb3ZlciB0aGUgaGVhZGVycyBpbiBlYWNoIHJvd1xuICAgICAgICBoZWFkZXJHcm91cC5oZWFkZXJzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiAoXG4gICAgICAgIC8vIEFwcGx5IHRoZSBoZWFkZXIgY2VsbCBwcm9wc1xuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhcIiwgX19hc3NpZ24oe30sIGNvbHVtbi5nZXRIZWFkZXJQcm9wcygpKSwgXG4gICAgICAgIC8vIFJlbmRlciB0aGUgaGVhZGVyXG4gICAgICAgIGNvbHVtbi5yZW5kZXIoJ0hlYWRlcicpKSk7IH0pKSk7IH0pKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIF9fYXNzaWduKHt9LCBnZXRUYWJsZUJvZHlQcm9wcygpKSwgXG4gICAgICAgIC8vIExvb3Agb3ZlciB0aGUgdGFibGUgcm93c1xuICAgICAgICByb3dzLm1hcChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByb3cgZm9yIGRpc3BsYXlcbiAgICAgICAgICAgIHByZXBhcmVSb3cocm93KTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgcm93IHByb3BzXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgX19hc3NpZ24oe30sIHJvdy5nZXRSb3dQcm9wcygpKSwgXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIHJvd3MgY2VsbHNcbiAgICAgICAgICAgIHJvdy5jZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBjZWxsLmNvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGNlbGwgcHJvcHNcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBfX2Fzc2lnbih7fSwgY2VsbC5nZXRDZWxsUHJvcHMoKSwgeyB3aWR0aDogd2lkdGggfSksIFxuICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgY2VsbCBjb250ZW50c1xuICAgICAgICAgICAgICAgIGNlbGwucmVuZGVyKCdDZWxsJykpKTtcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pKSkpO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oVGFibGUpO1xuZXhwb3J0IHsgdG1wIGFzIFRhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uL2hlbHBlcic7XG5mdW5jdGlvbiBCb2R5KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2IgPSBfYS5ibG9jaywgYmxvY2sgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYiwgX2MgPSBfYS5wcmlvLCBwcmlvID0gX2MgPT09IHZvaWQgMCA/ICdwcmltYXJ5JyA6IF9jLCBfZCA9IF9hLnNpemUsIHNpemUgPSBfZCA9PT0gdm9pZCAwID8gJ21lZGl1bScgOiBfZDtcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgdmFyIGNsYXNzZXMgPSBbJ2JvZHknXTtcbiAgICBpZiAoYmxvY2spXG4gICAgICAgIGNsYXNzZXMucHVzaCgnYmxvY2snKTtcbiAgICBjbGFzc2VzLnB1c2gocHJpbyk7XG4gICAgY2xhc3Nlcy5wdXNoKHNpemUpO1xuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKGNsYXNzZXMsIGNsYXNzTmFtZSkgfSwgY2hpbGRyZW4pO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oQm9keSk7XG5leHBvcnQgeyB0bXAgYXMgQm9keSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm9keS5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29udGFpbmVyLCBOYXZiYXIgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuaW1wb3J0IHsgVG9wQmFyQnV0dG9uIH0gZnJvbSAnLi9Ub3BCYXJCdXR0b24nO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi9oZWxwZXInO1xuZXhwb3J0IHZhciBUb3BCYXIgPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiA9IF9hLnRpdGxlLCB0aXRsZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IF9hLnJpZ2h0QnV0dG9ucywgcmlnaHRCdXR0b25zID0gX2MgPT09IHZvaWQgMCA/IFtdIDogX2MsIF9kID0gX2EubGVmdEJ1dHRvbnMsIGxlZnRCdXR0b25zID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInRpdGxlXCIsIFwicmlnaHRCdXR0b25zXCIsIFwibGVmdEJ1dHRvbnNcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgIHZhciByaWdodEJ1dHRvbkNvbXBvbmVudHMgPSBnZXRCdXR0b25Db21wb25lbnRzKHJpZ2h0QnV0dG9ucyk7XG4gICAgdmFyIGxlZnRCdXR0b25Db21wb25lbnRzID0gZ2V0QnV0dG9uQ29tcG9uZW50cyhsZWZ0QnV0dG9ucyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE5hdmJhciwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IHZhcmlhbnQ6IFwibGlnaHRcIiwgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygndG9wYmFyJywgY2xhc3NOYW1lKSB9KSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIHsgZmx1aWQ6IFwieHhsXCIgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCd0b3BiYXItYnV0dG9uLWNvbnRhaW5lciBsZWZ0JykgfSwgbGVmdEJ1dHRvbkNvbXBvbmVudHMpLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3RvcGJhci10aXRsZS1jb250YWluZXInKSB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2YmFyLlRleHQsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygndG9wYmFyLXRpdGxlJykgfSwgdGl0bGUpKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCd0b3BiYXItYnV0dG9uLWNvbnRhaW5lciByaWdodCcpIH0sIHJpZ2h0QnV0dG9uQ29tcG9uZW50cykpKSk7XG59KTtcbmZ1bmN0aW9uIGdldEJ1dHRvbkNvbXBvbmVudHMoYnV0dG9ucykge1xuICAgIHJldHVybiBidXR0b25zLm1hcChmdW5jdGlvbiAoYnV0dG9uLCBpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBrZXkgPSAoX2EgPSBidXR0b24ua2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICBpZiAoJ2NvbXBvbmVudCcgaW4gYnV0dG9uKSB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gYnV0dG9uLmNvbXBvbmVudDtcbiAgICAgICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHsga2V5OiBrZXksIHRpdGxlOiBidXR0b24udGl0bGUsIG9uQ2xpY2s6IGJ1dHRvbi5hY3Rpb24sIGRpc2FibGVkOiBidXR0b24uZGlzYWJsZWQsIGljb246IGJ1dHRvbi5pY29uIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGQgPSBidXR0b24udGl0bGU7XG4gICAgICAgIGlmIChidXR0b24uaWNvbikge1xuICAgICAgICAgICAgY2hpbGQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHsgc3JjOiBidXR0b24uaWNvbiwgYWx0OiBidXR0b24udGl0bGUsIHRpdGxlOiBidXR0b24udGl0bGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFRvcEJhckJ1dHRvbiwgeyBrZXk6IGtleSwgb25DbGljazogYnV0dG9uLmFjdGlvbiwgZGlzYWJsZWQ6IGJ1dHRvbi5kaXNhYmxlZCB9LCBjaGlsZCkpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE5hdkxpbmsgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuZXhwb3J0IHZhciBUb3BCYXJCdXR0b24gPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiA9IF9hLmRpc2FibGVkLCBkaXNhYmxlZCA9IF9iID09PSB2b2lkIDAgPyBmYWxzZSA6IF9iLCBvbkNsaWNrID0gX2Eub25DbGljaywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImRpc2FibGVkXCIsIFwib25DbGlja1wiLCBcImNoaWxkcmVuXCJdKTtcbiAgICB2YXIgY2IgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiAob25DbGljayA/IG9uQ2xpY2soKSA6IG51bGwpOyB9LCBbb25DbGlja10pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChOYXZMaW5rLCBfX2Fzc2lnbih7fSwgcmJtUHJvcHMsIHsgb25DbGljazogY2IsIGRpc2FibGVkOiBkaXNhYmxlZCB9KSwgY2hpbGRyZW4pKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyQnV0dG9uLmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVR5cGVIZWxwZXJzLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBwcmVmaXhDbGFzcyhjbGFzc05hbWUpIHtcbiAgICB2YXIgb3RoZXJDbGFzc2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgb3RoZXJDbGFzc2VzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgY2xhc3NOYW1lcyA9IChBcnJheS5pc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUgOiBbY2xhc3NOYW1lXSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYyAhPT0gdW5kZWZpbmVkOyB9KVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBcInJibS1cIi5jb25jYXQoYyk7IH0pO1xuICAgIG90aGVyQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaC5hcHBseShjbGFzc05hbWVzLCB2YWx1ZS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHVuZGVmaW5lZDsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXIuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IENsb3NlQnV0dG9uIGZyb20gJy4vQ2xvc2VCdXR0b24nO1xuaW1wb3J0IE1vZGFsQ29udGV4dCBmcm9tICcuL01vZGFsQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogZmFsc2Vcbn07XG5jb25zdCBBYnN0cmFjdE1vZGFsSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xvc2VMYWJlbCxcbiAgY2xvc2VWYXJpYW50LFxuICBjbG9zZUJ1dHRvbixcbiAgb25IaWRlLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChNb2RhbENvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQub25IaWRlKCk7XG4gICAgb25IaWRlID09IG51bGwgPyB2b2lkIDAgOiBvbkhpZGUoKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoXCJkaXZcIiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGNsb3NlQnV0dG9uICYmIC8qI19fUFVSRV9fKi9fanN4KENsb3NlQnV0dG9uLCB7XG4gICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VMYWJlbCxcbiAgICAgIHZhcmlhbnQ6IGNsb3NlVmFyaWFudCxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrXG4gICAgfSldXG4gIH0pO1xufSk7XG5BYnN0cmFjdE1vZGFsSGVhZGVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEFic3RyYWN0TW9kYWxIZWFkZXI7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBBY2NvcmRpb25Cb2R5IGZyb20gJy4vQWNjb3JkaW9uQm9keSc7XG5pbXBvcnQgQWNjb3JkaW9uQnV0dG9uIGZyb20gJy4vQWNjb3JkaW9uQnV0dG9uJztcbmltcG9ydCBBY2NvcmRpb25Db2xsYXBzZSBmcm9tICcuL0FjY29yZGlvbkNvbGxhcHNlJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgQWNjb3JkaW9uSGVhZGVyIGZyb20gJy4vQWNjb3JkaW9uSGVhZGVyJztcbmltcG9ydCBBY2NvcmRpb25JdGVtIGZyb20gJy4vQWNjb3JkaW9uSXRlbSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gICAgYWN0aXZlS2V5LFxuICAgIGJzUHJlZml4LFxuICAgIGNsYXNzTmFtZSxcbiAgICBvblNlbGVjdCxcbiAgICBmbHVzaCxcbiAgICAuLi5jb250cm9sbGVkUHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwcm9wcywge1xuICAgIGFjdGl2ZUtleTogJ29uU2VsZWN0J1xuICB9KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uJyk7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBhY3RpdmVFdmVudEtleTogYWN0aXZlS2V5LFxuICAgIG9uU2VsZWN0XG4gIH0pLCBbYWN0aXZlS2V5LCBvblNlbGVjdF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWNjb3JkaW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICAuLi5jb250cm9sbGVkUHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIGZsdXNoICYmIGAke3ByZWZpeH0tZmx1c2hgKVxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb24uZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oQWNjb3JkaW9uLCB7XG4gIEJ1dHRvbjogQWNjb3JkaW9uQnV0dG9uLFxuICBDb2xsYXBzZTogQWNjb3JkaW9uQ29sbGFwc2UsXG4gIEl0ZW06IEFjY29yZGlvbkl0ZW0sXG4gIEhlYWRlcjogQWNjb3JkaW9uSGVhZGVyLFxuICBCb2R5OiBBY2NvcmRpb25Cb2R5XG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkNvbGxhcHNlIGZyb20gJy4vQWNjb3JkaW9uQ29sbGFwc2UnO1xuaW1wb3J0IEFjY29yZGlvbkl0ZW1Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEFjY29yZGlvbkJvZHkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2FjY29yZGlvbi1ib2R5Jyk7XG4gIGNvbnN0IHtcbiAgICBldmVudEtleVxuICB9ID0gdXNlQ29udGV4dChBY2NvcmRpb25JdGVtQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChBY2NvcmRpb25Db2xsYXBzZSwge1xuICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIC4uLnByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpXG4gICAgfSlcbiAgfSk7XG59KTtcbkFjY29yZGlvbkJvZHkuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uQm9keSc7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25Cb2R5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgQWNjb3JkaW9uSXRlbUNvbnRleHQgZnJvbSAnLi9BY2NvcmRpb25JdGVtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VBY2NvcmRpb25CdXR0b24oZXZlbnRLZXksIG9uQ2xpY2spIHtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUV2ZW50S2V5LFxuICAgIG9uU2VsZWN0XG4gIH0gPSB1c2VDb250ZXh0KEFjY29yZGlvbkNvbnRleHQpO1xuICByZXR1cm4gZSA9PiB7XG4gICAgLypcbiAgICAgIENvbXBhcmUgdGhlIGV2ZW50IGtleSBpbiBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGV2ZW50IGtleS5cbiAgICAgIElmIHRoZXkgYXJlIHRoZSBzYW1lLCB0aGVuIGNvbGxhcHNlIHRoZSBjb21wb25lbnQuXG4gICAgKi9cbiAgICBjb25zdCBldmVudEtleVBhc3NlZCA9IGV2ZW50S2V5ID09PSBhY3RpdmVFdmVudEtleSA/IG51bGwgOiBldmVudEtleTtcbiAgICBpZiAob25TZWxlY3QpIG9uU2VsZWN0KGV2ZW50S2V5UGFzc2VkLCBlKTtcbiAgICBpZiAob25DbGljaykgb25DbGljayhlKTtcbiAgfTtcbn1cbmNvbnN0IEFjY29yZGlvbkJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdidXR0b24nLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBvbkNsaWNrLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uLWJ1dHRvbicpO1xuICBjb25zdCB7XG4gICAgZXZlbnRLZXlcbiAgfSA9IHVzZUNvbnRleHQoQWNjb3JkaW9uSXRlbUNvbnRleHQpO1xuICBjb25zdCBhY2NvcmRpb25PbkNsaWNrID0gdXNlQWNjb3JkaW9uQnV0dG9uKGV2ZW50S2V5LCBvbkNsaWNrKTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUV2ZW50S2V5XG4gIH0gPSB1c2VDb250ZXh0KEFjY29yZGlvbkNvbnRleHQpO1xuXG4gIGlmIChDb21wb25lbnQgPT09ICdidXR0b24nKSB7XG4gICAgcHJvcHMudHlwZSA9ICdidXR0b24nO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIG9uQ2xpY2s6IGFjY29yZGlvbk9uQ2xpY2ssXG4gICAgLi4ucHJvcHMsXG4gICAgXCJhcmlhLWV4cGFuZGVkXCI6IGV2ZW50S2V5ID09PSBhY3RpdmVFdmVudEtleSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgZXZlbnRLZXkgIT09IGFjdGl2ZUV2ZW50S2V5ICYmICdjb2xsYXBzZWQnKVxuICB9KTtcbn0pO1xuQWNjb3JkaW9uQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0FjY29yZGlvbkJ1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25CdXR0b247IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICBldmVudEtleSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYWN0aXZlRXZlbnRLZXlcbiAgfSA9IHVzZUNvbnRleHQoQWNjb3JkaW9uQ29udGV4dCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uLWNvbGxhcHNlJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb2xsYXBzZSwge1xuICAgIHJlZjogcmVmLFxuICAgIGluOiBhY3RpdmVFdmVudEtleSA9PT0gZXZlbnRLZXksXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIGNoaWxkcmVuOiBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKVxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb25Db2xsYXBzZS5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25Db2xsYXBzZSc7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25Db2xsYXBzZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBjb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuY29udGV4dC5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25Db250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkJ1dHRvbiBmcm9tICcuL0FjY29yZGlvbkJ1dHRvbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2gyJyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIG9uQ2xpY2ssXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdhY2NvcmRpb24taGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCksXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEFjY29yZGlvbkJ1dHRvbiwge1xuICAgICAgb25DbGljazogb25DbGljayxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb25IZWFkZXIuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uSGVhZGVyJztcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkhlYWRlcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkl0ZW1Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEFjY29yZGlvbkl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgZXZlbnRLZXksXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdhY2NvcmRpb24taXRlbScpO1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgZXZlbnRLZXlcbiAgfSksIFtldmVudEtleV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWNjb3JkaW9uSXRlbUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeClcbiAgICB9KVxuICB9KTtcbn0pO1xuQWNjb3JkaW9uSXRlbS5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25JdGVtJztcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkl0ZW07IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgY29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZXZlbnRLZXk6ICcnXG59KTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgY29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IEFuY2hvciBmcm9tICdAcmVzdGFydC91aS9BbmNob3InO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgQ2xvc2VCdXR0b24gZnJvbSAnLi9DbG9zZUJ1dHRvbic7XG5pbXBvcnQgZGl2V2l0aENsYXNzTmFtZSBmcm9tICcuL2RpdldpdGhDbGFzc05hbWUnO1xuaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRGl2U3R5bGVkQXNINCA9IGRpdldpdGhDbGFzc05hbWUoJ2g0Jyk7XG5EaXZTdHlsZWRBc0g0LmRpc3BsYXlOYW1lID0gJ0RpdlN0eWxlZEFzSDQnO1xuY29uc3QgQWxlcnRIZWFkaW5nID0gY3JlYXRlV2l0aEJzUHJlZml4KCdhbGVydC1oZWFkaW5nJywge1xuICBDb21wb25lbnQ6IERpdlN0eWxlZEFzSDRcbn0pO1xuY29uc3QgQWxlcnRMaW5rID0gY3JlYXRlV2l0aEJzUHJlZml4KCdhbGVydC1saW5rJywge1xuICBDb21wb25lbnQ6IEFuY2hvclxufSk7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICdwcmltYXJ5JyxcbiAgc2hvdzogdHJ1ZSxcbiAgdHJhbnNpdGlvbjogRmFkZSxcbiAgY2xvc2VMYWJlbDogJ0Nsb3NlIGFsZXJ0J1xufTtcbmNvbnN0IEFsZXJ0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHVuY29udHJvbGxlZFByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGJzUHJlZml4LFxuICAgIHNob3csXG4gICAgY2xvc2VMYWJlbCxcbiAgICBjbG9zZVZhcmlhbnQsXG4gICAgY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuLFxuICAgIHZhcmlhbnQsXG4gICAgb25DbG9zZSxcbiAgICBkaXNtaXNzaWJsZSxcbiAgICB0cmFuc2l0aW9uLFxuICAgIC4uLnByb3BzXG4gIH0gPSB1c2VVbmNvbnRyb2xsZWQodW5jb250cm9sbGVkUHJvcHMsIHtcbiAgICBzaG93OiAnb25DbG9zZSdcbiAgfSk7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2FsZXJ0Jyk7XG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAob25DbG9zZSkge1xuICAgICAgb25DbG9zZShmYWxzZSwgZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgVHJhbnNpdGlvbiA9IHRyYW5zaXRpb24gPT09IHRydWUgPyBGYWRlIDogdHJhbnNpdGlvbjtcblxuICBjb25zdCBhbGVydCA9IC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcm9sZTogXCJhbGVydFwiLFxuICAgIC4uLighVHJhbnNpdGlvbiA/IHByb3BzIDogdW5kZWZpbmVkKSxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIHZhcmlhbnQgJiYgYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCwgZGlzbWlzc2libGUgJiYgYCR7cHJlZml4fS1kaXNtaXNzaWJsZWApLFxuICAgIGNoaWxkcmVuOiBbZGlzbWlzc2libGUgJiYgLyojX19QVVJFX18qL19qc3goQ2xvc2VCdXR0b24sIHtcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsb3NlLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IGNsb3NlTGFiZWwsXG4gICAgICB2YXJpYW50OiBjbG9zZVZhcmlhbnRcbiAgICB9KSwgY2hpbGRyZW5dXG4gIH0pO1xuXG4gIGlmICghVHJhbnNpdGlvbikgcmV0dXJuIHNob3cgPyBhbGVydCA6IG51bGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uLCB7XG4gICAgdW5tb3VudE9uRXhpdDogdHJ1ZSxcbiAgICAuLi5wcm9wcyxcbiAgICByZWY6IHVuZGVmaW5lZCxcbiAgICBpbjogc2hvdyxcbiAgICBjaGlsZHJlbjogYWxlcnRcbiAgfSk7XG59KTtcbkFsZXJ0LmRpc3BsYXlOYW1lID0gJ0FsZXJ0JztcbkFsZXJ0LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oQWxlcnQsIHtcbiAgTGluazogQWxlcnRMaW5rLFxuICBIZWFkaW5nOiBBbGVydEhlYWRpbmdcbn0pOyIsImltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmV4cG9ydCBkZWZhdWx0IEFuY2hvcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBiZzogJ3ByaW1hcnknLFxuICBwaWxsOiBmYWxzZVxufTtcbmNvbnN0IEJhZGdlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGJnLFxuICBwaWxsLFxuICB0ZXh0LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSAnc3BhbicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYmFkZ2UnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgcGlsbCAmJiBgcm91bmRlZC1waWxsYCwgdGV4dCAmJiBgdGV4dC0ke3RleHR9YCwgYmcgJiYgYGJnLSR7Ymd9YClcbiAgfSk7XG59KTtcbkJhZGdlLmRpc3BsYXlOYW1lID0gJ0JhZGdlJztcbkJhZGdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJhZGdlOyIsImltcG9ydCBhZGRDbGFzcyBmcm9tICdkb20taGVscGVycy9hZGRDbGFzcyc7XG5pbXBvcnQgY3NzIGZyb20gJ2RvbS1oZWxwZXJzL2Nzcyc7XG5pbXBvcnQgcXNhIGZyb20gJ2RvbS1oZWxwZXJzL3F1ZXJ5U2VsZWN0b3JBbGwnO1xuaW1wb3J0IHJlbW92ZUNsYXNzIGZyb20gJ2RvbS1oZWxwZXJzL3JlbW92ZUNsYXNzJztcbmltcG9ydCBNb2RhbE1hbmFnZXIgZnJvbSAnQHJlc3RhcnQvdWkvTW9kYWxNYW5hZ2VyJztcbmNvbnN0IFNlbGVjdG9yID0ge1xuICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gIFNUSUNLWV9DT05URU5UOiAnLnN0aWNreS10b3AnLFxuICBOQVZCQVJfVE9HR0xFUjogJy5uYXZiYXItdG9nZ2xlcidcbn07XG5cbmNsYXNzIEJvb3RzdHJhcE1vZGFsTWFuYWdlciBleHRlbmRzIE1vZGFsTWFuYWdlciB7XG4gIGFkanVzdEFuZFN0b3JlKHByb3AsIGVsZW1lbnQsIGFkanVzdCkge1xuICAgIGNvbnN0IGFjdHVhbCA9IGVsZW1lbnQuc3R5bGVbcHJvcF07IC8vIFRPRE86IERPTVN0cmluZ01hcCBhbmQgQ1NTU3R5bGVEZWNsYXJhdGlvbiBhcmVuJ3Qgc3RyaWN0bHkgY29tcGF0aWJsZVxuICAgIC8vIEB0cy1pZ25vcmVcblxuICAgIGVsZW1lbnQuZGF0YXNldFtwcm9wXSA9IGFjdHVhbDtcbiAgICBjc3MoZWxlbWVudCwge1xuICAgICAgW3Byb3BdOiBgJHtwYXJzZUZsb2F0KGNzcyhlbGVtZW50LCBwcm9wKSkgKyBhZGp1c3R9cHhgXG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlKHByb3AsIGVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZGF0YXNldFtwcm9wXTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgZWxlbWVudC5kYXRhc2V0W3Byb3BdO1xuICAgICAgY3NzKGVsZW1lbnQsIHtcbiAgICAgICAgW3Byb3BdOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpIHtcbiAgICBzdXBlci5zZXRDb250YWluZXJTdHlsZShjb250YWluZXJTdGF0ZSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgYWRkQ2xhc3MoY29udGFpbmVyLCAnbW9kYWwtb3BlbicpO1xuICAgIGlmICghY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpIHJldHVybjtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHRoaXMuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3QgbWFyZ2luUHJvcCA9IHRoaXMuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShwYWRkaW5nUHJvcCwgZWwsIGNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSk7XG4gICAgcXNhKGNvbnRhaW5lciwgU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShtYXJnaW5Qcm9wLCBlbCwgLWNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSk7XG4gICAgcXNhKGNvbnRhaW5lciwgU2VsZWN0b3IuTkFWQkFSX1RPR0dMRVIpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShtYXJnaW5Qcm9wLCBlbCwgY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpKTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRhaW5lclN0eWxlKGNvbnRhaW5lclN0YXRlKSB7XG4gICAgc3VwZXIucmVtb3ZlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ21vZGFsLW9wZW4nKTtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHRoaXMuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3QgbWFyZ2luUHJvcCA9IHRoaXMuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5yZXN0b3JlKHBhZGRpbmdQcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLlNUSUNLWV9DT05URU5UKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLk5BVkJBUl9UT0dHTEVSKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICB9XG5cbn1cblxubGV0IHNoYXJlZE1hbmFnZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcmVkTWFuYWdlcihvcHRpb25zKSB7XG4gIGlmICghc2hhcmVkTWFuYWdlcikgc2hhcmVkTWFuYWdlciA9IG5ldyBCb290c3RyYXBNb2RhbE1hbmFnZXIob3B0aW9ucyk7XG4gIHJldHVybiBzaGFyZWRNYW5hZ2VyO1xufVxuZXhwb3J0IGRlZmF1bHQgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBCcmVhZGNydW1iSXRlbSBmcm9tICcuL0JyZWFkY3J1bWJJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGxhYmVsOiAnYnJlYWRjcnVtYicsXG4gIGxpc3RQcm9wczoge31cbn07XG5jb25zdCBCcmVhZGNydW1iID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgbGlzdFByb3BzLFxuICBjaGlsZHJlbixcbiAgbGFiZWwsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICduYXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2JyZWFkY3J1bWInKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIFwiYXJpYS1sYWJlbFwiOiBsYWJlbCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJvbFwiLCB7IC4uLmxpc3RQcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXgsIGxpc3RQcm9wcyA9PSBudWxsID8gdm9pZCAwIDogbGlzdFByb3BzLmNsYXNzTmFtZSksXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KVxuICB9KTtcbn0pO1xuQnJlYWRjcnVtYi5kaXNwbGF5TmFtZSA9ICdCcmVhZGNydW1iJztcbkJyZWFkY3J1bWIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihCcmVhZGNydW1iLCB7XG4gIEl0ZW06IEJyZWFkY3J1bWJJdGVtXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlLFxuICBsaW5rUHJvcHM6IHt9XG59O1xuY29uc3QgQnJlYWRjcnVtYkl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgYWN0aXZlLFxuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnbGknLFxuICBsaW5rQXM6IExpbmtDb21wb25lbnQgPSBBbmNob3IsXG4gIGxpbmtQcm9wcyxcbiAgaHJlZixcbiAgdGl0bGUsXG4gIHRhcmdldCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdicmVhZGNydW1iLWl0ZW0nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXgsIGNsYXNzTmFtZSwge1xuICAgICAgYWN0aXZlXG4gICAgfSksXG4gICAgXCJhcmlhLWN1cnJlbnRcIjogYWN0aXZlID8gJ3BhZ2UnIDogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiBhY3RpdmUgPyBjaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9fanN4KExpbmtDb21wb25lbnQsIHsgLi4ubGlua1Byb3BzLFxuICAgICAgaHJlZjogaHJlZixcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbkJyZWFkY3J1bWJJdGVtLmRpc3BsYXlOYW1lID0gJ0JyZWFkY3J1bWJJdGVtJztcbkJyZWFkY3J1bWJJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJyZWFkY3J1bWJJdGVtOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQnV0dG9uUHJvcHMgfSBmcm9tICdAcmVzdGFydC91aS9CdXR0b24nO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICdwcmltYXJ5JyxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuY29uc3QgQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYXMsXG4gIGJzUHJlZml4LFxuICB2YXJpYW50LFxuICBzaXplLFxuICBhY3RpdmUsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdidG4nKTtcbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZVxuICB9XSA9IHVzZUJ1dHRvblByb3BzKHtcbiAgICB0YWdOYW1lOiBhcyxcbiAgICAuLi5wcm9wc1xuICB9KTtcbiAgY29uc3QgQ29tcG9uZW50ID0gdGFnTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAuLi5idXR0b25Qcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIGFjdGl2ZSAmJiAnYWN0aXZlJywgdmFyaWFudCAmJiBgJHtwcmVmaXh9LSR7dmFyaWFudH1gLCBzaXplICYmIGAke3ByZWZpeH0tJHtzaXplfWAsIHByb3BzLmhyZWYgJiYgcHJvcHMuZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJylcbiAgfSk7XG59KTtcbkJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xuQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB2ZXJ0aWNhbDogZmFsc2UsXG4gIHJvbGU6ICdncm91cCdcbn07XG5jb25zdCBCdXR0b25Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBzaXplLFxuICB2ZXJ0aWNhbCxcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucmVzdFxufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2J0bi1ncm91cCcpO1xuICBsZXQgYmFzZUNsYXNzID0gcHJlZml4O1xuICBpZiAodmVydGljYWwpIGJhc2VDbGFzcyA9IGAke3ByZWZpeH0tdmVydGljYWxgO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnJlc3QsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYmFzZUNsYXNzLCBzaXplICYmIGAke3ByZWZpeH0tJHtzaXplfWApXG4gIH0pO1xufSk7XG5CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdCdXR0b25Hcm91cCc7XG5CdXR0b25Hcm91cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBCdXR0b25Hcm91cDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICByb2xlOiAndG9vbGJhcidcbn07XG5jb25zdCBCdXR0b25Ub29sYmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdidG4tdG9vbGJhcicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgpXG4gIH0pO1xufSk7XG5CdXR0b25Ub29sYmFyLmRpc3BsYXlOYW1lID0gJ0J1dHRvblRvb2xiYXInO1xuQnV0dG9uVG9vbGJhci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBCdXR0b25Ub29sYmFyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IGRpdldpdGhDbGFzc05hbWUgZnJvbSAnLi9kaXZXaXRoQ2xhc3NOYW1lJztcbmltcG9ydCBDYXJkSW1nIGZyb20gJy4vQ2FyZEltZyc7XG5pbXBvcnQgQ2FyZEhlYWRlciBmcm9tICcuL0NhcmRIZWFkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERpdlN0eWxlZEFzSDUgPSBkaXZXaXRoQ2xhc3NOYW1lKCdoNScpO1xuY29uc3QgRGl2U3R5bGVkQXNINiA9IGRpdldpdGhDbGFzc05hbWUoJ2g2Jyk7XG5jb25zdCBDYXJkQm9keSA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1ib2R5Jyk7XG5jb25zdCBDYXJkVGl0bGUgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINVxufSk7XG5jb25zdCBDYXJkU3VidGl0bGUgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtc3VidGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINlxufSk7XG5jb25zdCBDYXJkTGluayA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1saW5rJywge1xuICBDb21wb25lbnQ6ICdhJ1xufSk7XG5jb25zdCBDYXJkVGV4dCA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC10ZXh0Jywge1xuICBDb21wb25lbnQ6ICdwJ1xufSk7XG5jb25zdCBDYXJkRm9vdGVyID0gY3JlYXRlV2l0aEJzUHJlZml4KCdjYXJkLWZvb3RlcicpO1xuY29uc3QgQ2FyZEltZ092ZXJsYXkgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtaW1nLW92ZXJsYXknKTtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgYm9keTogZmFsc2Vcbn07XG5jb25zdCBDYXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYmcsXG4gIHRleHQsXG4gIGJvcmRlcixcbiAgYm9keSxcbiAgY2hpbGRyZW4sXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NhcmQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgYmcgJiYgYGJnLSR7Ymd9YCwgdGV4dCAmJiBgdGV4dC0ke3RleHR9YCwgYm9yZGVyICYmIGBib3JkZXItJHtib3JkZXJ9YCksXG4gICAgY2hpbGRyZW46IGJvZHkgPyAvKiNfX1BVUkVfXyovX2pzeChDYXJkQm9keSwge1xuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSkgOiBjaGlsZHJlblxuICB9KTtcbn0pO1xuQ2FyZC5kaXNwbGF5TmFtZSA9ICdDYXJkJztcbkNhcmQuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihDYXJkLCB7XG4gIEltZzogQ2FyZEltZyxcbiAgVGl0bGU6IENhcmRUaXRsZSxcbiAgU3VidGl0bGU6IENhcmRTdWJ0aXRsZSxcbiAgQm9keTogQ2FyZEJvZHksXG4gIExpbms6IENhcmRMaW5rLFxuICBUZXh0OiBDYXJkVGV4dCxcbiAgSGVhZGVyOiBDYXJkSGVhZGVyLFxuICBGb290ZXI6IENhcmRGb290ZXIsXG4gIEltZ092ZXJsYXk6IENhcmRJbWdPdmVybGF5XG59KTsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1ncm91cCcpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQ2FyZEhlYWRlckNvbnRleHQgZnJvbSAnLi9DYXJkSGVhZGVyQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2FyZEhlYWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NhcmQtaGVhZGVyJyk7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjYXJkSGVhZGVyQnNQcmVmaXg6IHByZWZpeFxuICB9KSwgW3ByZWZpeF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ2FyZEhlYWRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgpXG4gICAgfSlcbiAgfSk7XG59KTtcbkNhcmRIZWFkZXIuZGlzcGxheU5hbWUgPSAnQ2FyZEhlYWRlcic7XG5leHBvcnQgZGVmYXVsdCBDYXJkSGVhZGVyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IGNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnQ2FyZEhlYWRlckNvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgY29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2FyZEltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4oe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICBhczogQ29tcG9uZW50ID0gJ2ltZycsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY2FyZC1pbWcnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh2YXJpYW50ID8gYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCA6IHByZWZpeCwgY2xhc3NOYW1lKSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuQ2FyZEltZy5kaXNwbGF5TmFtZSA9ICdDYXJkSW1nJztcbmV4cG9ydCBkZWZhdWx0IENhcmRJbWc7IiwiaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlVXBkYXRlRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVVwZGF0ZUVmZmVjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUNvbW1pdHRlZFJlZic7XG5pbXBvcnQgdXNlVGltZW91dCBmcm9tICdAcmVzdGFydC9ob29rcy91c2VUaW1lb3V0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBDYXJvdXNlbENhcHRpb24gZnJvbSAnLi9DYXJvdXNlbENhcHRpb24nO1xuaW1wb3J0IENhcm91c2VsSXRlbSBmcm9tICcuL0Nhcm91c2VsSXRlbSc7XG5pbXBvcnQgeyBtYXAsIGZvckVhY2ggfSBmcm9tICcuL0VsZW1lbnRDaGlsZHJlbic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IHRyaWdnZXJCcm93c2VyUmVmbG93IGZyb20gJy4vdHJpZ2dlckJyb3dzZXJSZWZsb3cnO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgU1dJUEVfVEhSRVNIT0xEID0gNDA7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHNsaWRlOiB0cnVlLFxuICBmYWRlOiBmYWxzZSxcbiAgY29udHJvbHM6IHRydWUsXG4gIGluZGljYXRvcnM6IHRydWUsXG4gIGluZGljYXRvckxhYmVsczogW10sXG4gIGRlZmF1bHRBY3RpdmVJbmRleDogMCxcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBwYXVzZTogJ2hvdmVyJyxcbiAgd3JhcDogdHJ1ZSxcbiAgdG91Y2g6IHRydWUsXG4gIHByZXZJY29uOiAvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgY2xhc3NOYW1lOiBcImNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uXCJcbiAgfSksXG4gIHByZXZMYWJlbDogJ1ByZXZpb3VzJyxcbiAgbmV4dEljb246IC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb25cIlxuICB9KSxcbiAgbmV4dExhYmVsOiAnTmV4dCdcbn07XG5cbmZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5zdHlsZSB8fCAhZWxlbWVudC5wYXJlbnROb2RlIHx8ICFlbGVtZW50LnBhcmVudE5vZGUuc3R5bGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbGVtZW50U3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudFN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBlbGVtZW50U3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LnBhcmVudE5vZGUpLmRpc3BsYXkgIT09ICdub25lJztcbn1cblxuY29uc3QgQ2Fyb3VzZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigodW5jb250cm9sbGVkUHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBic1ByZWZpeCxcbiAgICBzbGlkZSxcbiAgICBmYWRlLFxuICAgIGNvbnRyb2xzLFxuICAgIGluZGljYXRvcnMsXG4gICAgaW5kaWNhdG9yTGFiZWxzLFxuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uU2VsZWN0LFxuICAgIG9uU2xpZGUsXG4gICAgb25TbGlkLFxuICAgIGludGVydmFsLFxuICAgIGtleWJvYXJkLFxuICAgIG9uS2V5RG93bixcbiAgICBwYXVzZSxcbiAgICBvbk1vdXNlT3ZlcixcbiAgICBvbk1vdXNlT3V0LFxuICAgIHdyYXAsXG4gICAgdG91Y2gsXG4gICAgb25Ub3VjaFN0YXJ0LFxuICAgIG9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQsXG4gICAgcHJldkljb24sXG4gICAgcHJldkxhYmVsLFxuICAgIG5leHRJY29uLFxuICAgIG5leHRMYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIGNsYXNzTmFtZSxcbiAgICBjaGlsZHJlbixcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHVuY29udHJvbGxlZFByb3BzLCB7XG4gICAgYWN0aXZlSW5kZXg6ICdvblNlbGVjdCdcbiAgfSk7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Nhcm91c2VsJyk7XG4gIGNvbnN0IGlzUlRMID0gdXNlSXNSVEwoKTtcbiAgY29uc3QgbmV4dERpcmVjdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW2RpcmVjdGlvbiwgc2V0RGlyZWN0aW9uXSA9IHVzZVN0YXRlKCduZXh0Jyk7XG4gIGNvbnN0IFtwYXVzZWQsIHNldFBhdXNlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc1NsaWRpbmcsIHNldElzU2xpZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtyZW5kZXJlZEFjdGl2ZUluZGV4LCBzZXRSZW5kZXJlZEFjdGl2ZUluZGV4XSA9IHVzZVN0YXRlKGFjdGl2ZUluZGV4IHx8IDApO1xuXG4gIGlmICghaXNTbGlkaW5nICYmIGFjdGl2ZUluZGV4ICE9PSByZW5kZXJlZEFjdGl2ZUluZGV4KSB7XG4gICAgaWYgKG5leHREaXJlY3Rpb25SZWYuY3VycmVudCkge1xuICAgICAgc2V0RGlyZWN0aW9uKG5leHREaXJlY3Rpb25SZWYuY3VycmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpcmVjdGlvbigoYWN0aXZlSW5kZXggfHwgMCkgPiByZW5kZXJlZEFjdGl2ZUluZGV4ID8gJ25leHQnIDogJ3ByZXYnKTtcbiAgICB9XG5cbiAgICBpZiAoc2xpZGUpIHtcbiAgICAgIHNldElzU2xpZGluZyh0cnVlKTtcbiAgICB9XG5cbiAgICBzZXRSZW5kZXJlZEFjdGl2ZUluZGV4KGFjdGl2ZUluZGV4IHx8IDApO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobmV4dERpcmVjdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICBuZXh0RGlyZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSk7XG4gIGxldCBudW1DaGlsZHJlbiA9IDA7XG4gIGxldCBhY3RpdmVDaGlsZEludGVydmFsOyAvLyBJdGVyYXRlIHRvIGdyYWIgYWxsIG9mIHRoZSBjaGlsZHJlbidzIGludGVydmFsIHZhbHVlc1xuICAvLyAoYW5kIGNvdW50IHRoZW0sIHRvbylcblxuICBmb3JFYWNoKGNoaWxkcmVuLCAoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgKytudW1DaGlsZHJlbjtcblxuICAgIGlmIChpbmRleCA9PT0gYWN0aXZlSW5kZXgpIHtcbiAgICAgIGFjdGl2ZUNoaWxkSW50ZXJ2YWwgPSBjaGlsZC5wcm9wcy5pbnRlcnZhbDtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBhY3RpdmVDaGlsZEludGVydmFsUmVmID0gdXNlQ29tbWl0dGVkUmVmKGFjdGl2ZUNoaWxkSW50ZXJ2YWwpO1xuICBjb25zdCBwcmV2ID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChpc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEFjdGl2ZUluZGV4ID0gcmVuZGVyZWRBY3RpdmVJbmRleCAtIDE7XG5cbiAgICBpZiAobmV4dEFjdGl2ZUluZGV4IDwgMCkge1xuICAgICAgaWYgKCF3cmFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dEFjdGl2ZUluZGV4ID0gbnVtQ2hpbGRyZW4gLSAxO1xuICAgIH1cblxuICAgIG5leHREaXJlY3Rpb25SZWYuY3VycmVudCA9ICdwcmV2JztcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QobmV4dEFjdGl2ZUluZGV4LCBldmVudCk7XG4gIH0sIFtpc1NsaWRpbmcsIHJlbmRlcmVkQWN0aXZlSW5kZXgsIG9uU2VsZWN0LCB3cmFwLCBudW1DaGlsZHJlbl0pOyAvLyBUaGlzIGlzIHVzZWQgaW4gdGhlIHNldEludGVydmFsLCBzbyBpdCBzaG91bGQgbm90IGludmFsaWRhdGUuXG5cbiAgY29uc3QgbmV4dCA9IHVzZUV2ZW50Q2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChpc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEFjdGl2ZUluZGV4ID0gcmVuZGVyZWRBY3RpdmVJbmRleCArIDE7XG5cbiAgICBpZiAobmV4dEFjdGl2ZUluZGV4ID49IG51bUNoaWxkcmVuKSB7XG4gICAgICBpZiAoIXdyYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0QWN0aXZlSW5kZXggPSAwO1xuICAgIH1cblxuICAgIG5leHREaXJlY3Rpb25SZWYuY3VycmVudCA9ICduZXh0JztcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QobmV4dEFjdGl2ZUluZGV4LCBldmVudCk7XG4gIH0pO1xuICBjb25zdCBlbGVtZW50UmVmID0gdXNlUmVmKCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIGVsZW1lbnQ6IGVsZW1lbnRSZWYuY3VycmVudCxcbiAgICBwcmV2LFxuICAgIG5leHRcbiAgfSkpOyAvLyBUaGlzIGlzIHVzZWQgaW4gdGhlIHNldEludGVydmFsLCBzbyBpdCBzaG91bGQgbm90IGludmFsaWRhdGUuXG5cbiAgY29uc3QgbmV4dFdoZW5WaXNpYmxlID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgaXNWaXNpYmxlKGVsZW1lbnRSZWYuY3VycmVudCkpIHtcbiAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICBwcmV2KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc2xpZGVEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICduZXh0JyA/ICdzdGFydCcgOiAnZW5kJztcbiAgdXNlVXBkYXRlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2xpZGUpIHtcbiAgICAgIC8vIFRoZXNlIGNhbGxiYWNrcyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIDxUcmFuc2l0aW9uPiBjYWxsYmFja3MuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25TbGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25TbGlkZShyZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbik7XG4gICAgb25TbGlkID09IG51bGwgPyB2b2lkIDAgOiBvblNsaWQocmVuZGVyZWRBY3RpdmVJbmRleCwgc2xpZGVEaXJlY3Rpb24pO1xuICB9LCBbcmVuZGVyZWRBY3RpdmVJbmRleF0pO1xuICBjb25zdCBvcmRlckNsYXNzTmFtZSA9IGAke3ByZWZpeH0taXRlbS0ke2RpcmVjdGlvbn1gO1xuICBjb25zdCBkaXJlY3Rpb25hbENsYXNzTmFtZSA9IGAke3ByZWZpeH0taXRlbS0ke3NsaWRlRGlyZWN0aW9ufWA7XG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSk7XG4gICAgb25TbGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25TbGlkZShyZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbik7XG4gIH0sIFtvblNsaWRlLCByZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbl0pO1xuICBjb25zdCBoYW5kbGVFbnRlcmVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldElzU2xpZGluZyhmYWxzZSk7XG4gICAgb25TbGlkID09IG51bGwgPyB2b2lkIDAgOiBvblNsaWQocmVuZGVyZWRBY3RpdmVJbmRleCwgc2xpZGVEaXJlY3Rpb24pO1xuICB9LCBbb25TbGlkLCByZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbl0pO1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChrZXlib2FyZCAmJiAhL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICAgICAgbmV4dChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXYoZXZlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgICAgICBwcmV2KGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dChldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25LZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbktleURvd24oZXZlbnQpO1xuICB9LCBba2V5Ym9hcmQsIG9uS2V5RG93biwgcHJldiwgbmV4dCwgaXNSVExdKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdmVyID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChwYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgc2V0UGF1c2VkKHRydWUpO1xuICAgIH1cblxuICAgIG9uTW91c2VPdmVyID09IG51bGwgPyB2b2lkIDAgOiBvbk1vdXNlT3ZlcihldmVudCk7XG4gIH0sIFtwYXVzZSwgb25Nb3VzZU92ZXJdKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdXQgPSB1c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBvbk1vdXNlT3V0ID09IG51bGwgPyB2b2lkIDAgOiBvbk1vdXNlT3V0KGV2ZW50KTtcbiAgfSwgW29uTW91c2VPdXRdKTtcbiAgY29uc3QgdG91Y2hTdGFydFhSZWYgPSB1c2VSZWYoMCk7XG4gIGNvbnN0IHRvdWNoRGVsdGFYUmVmID0gdXNlUmVmKDApO1xuICBjb25zdCB0b3VjaFVucGF1c2VUaW1lb3V0ID0gdXNlVGltZW91dCgpO1xuICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIHRvdWNoU3RhcnRYUmVmLmN1cnJlbnQgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgdG91Y2hEZWx0YVhSZWYuY3VycmVudCA9IDA7XG5cbiAgICBpZiAocGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgIHNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICBvblRvdWNoU3RhcnQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG91Y2hTdGFydChldmVudCk7XG4gIH0sIFtwYXVzZSwgb25Ub3VjaFN0YXJ0XSk7XG4gIGNvbnN0IGhhbmRsZVRvdWNoTW92ZSA9IHVzZUNhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRvdWNoRGVsdGFYUmVmLmN1cnJlbnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3VjaERlbHRhWFJlZi5jdXJyZW50ID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdG91Y2hTdGFydFhSZWYuY3VycmVudDtcbiAgICB9XG5cbiAgICBvblRvdWNoTW92ZSA9PSBudWxsID8gdm9pZCAwIDogb25Ub3VjaE1vdmUoZXZlbnQpO1xuICB9LCBbb25Ub3VjaE1vdmVdKTtcbiAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSB1c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKHRvdWNoKSB7XG4gICAgICBjb25zdCB0b3VjaERlbHRhWCA9IHRvdWNoRGVsdGFYUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChNYXRoLmFicyh0b3VjaERlbHRhWCkgPiBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgICAgaWYgKHRvdWNoRGVsdGFYID4gMCkge1xuICAgICAgICAgIHByZXYoZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICB0b3VjaFVucGF1c2VUaW1lb3V0LnNldCgoKSA9PiB7XG4gICAgICAgIHNldFBhdXNlZChmYWxzZSk7XG4gICAgICB9LCBpbnRlcnZhbCB8fCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIG9uVG91Y2hFbmQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG91Y2hFbmQoZXZlbnQpO1xuICB9LCBbdG91Y2gsIHBhdXNlLCBwcmV2LCBuZXh0LCB0b3VjaFVucGF1c2VUaW1lb3V0LCBpbnRlcnZhbCwgb25Ub3VjaEVuZF0pO1xuICBjb25zdCBzaG91bGRQbGF5ID0gaW50ZXJ2YWwgIT0gbnVsbCAmJiAhcGF1c2VkICYmICFpc1NsaWRpbmc7XG4gIGNvbnN0IGludGVydmFsSGFuZGxlUmVmID0gdXNlUmVmKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9yZWYsIF9hY3RpdmVDaGlsZEludGVydmFsUjtcblxuICAgIGlmICghc2hvdWxkUGxheSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RnVuYyA9IGlzUlRMID8gcHJldiA6IG5leHQ7XG4gICAgaW50ZXJ2YWxIYW5kbGVSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRJbnRlcnZhbChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPyBuZXh0V2hlblZpc2libGUgOiBuZXh0RnVuYywgKF9yZWYgPSAoX2FjdGl2ZUNoaWxkSW50ZXJ2YWxSID0gYWN0aXZlQ2hpbGRJbnRlcnZhbFJlZi5jdXJyZW50KSAhPSBudWxsID8gX2FjdGl2ZUNoaWxkSW50ZXJ2YWxSIDogaW50ZXJ2YWwpICE9IG51bGwgPyBfcmVmIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGludGVydmFsSGFuZGxlUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZVJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbc2hvdWxkUGxheSwgcHJldiwgbmV4dCwgYWN0aXZlQ2hpbGRJbnRlcnZhbFJlZiwgaW50ZXJ2YWwsIG5leHRXaGVuVmlzaWJsZSwgaXNSVExdKTtcbiAgY29uc3QgaW5kaWNhdG9yT25DbGlja3MgPSB1c2VNZW1vKCgpID0+IGluZGljYXRvcnMgJiYgQXJyYXkuZnJvbSh7XG4gICAgbGVuZ3RoOiBudW1DaGlsZHJlblxuICB9LCAoXywgaW5kZXgpID0+IGV2ZW50ID0+IHtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QoaW5kZXgsIGV2ZW50KTtcbiAgfSksIFtpbmRpY2F0b3JzLCBudW1DaGlsZHJlbiwgb25TZWxlY3RdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhDb21wb25lbnQsIHtcbiAgICByZWY6IGVsZW1lbnRSZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgIG9uTW91c2VPdmVyOiBoYW5kbGVNb3VzZU92ZXIsXG4gICAgb25Nb3VzZU91dDogaGFuZGxlTW91c2VPdXQsXG4gICAgb25Ub3VjaFN0YXJ0OiBoYW5kbGVUb3VjaFN0YXJ0LFxuICAgIG9uVG91Y2hNb3ZlOiBoYW5kbGVUb3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogaGFuZGxlVG91Y2hFbmQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBzbGlkZSAmJiAnc2xpZGUnLCBmYWRlICYmIGAke3ByZWZpeH0tZmFkZWAsIHZhcmlhbnQgJiYgYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCksXG4gICAgY2hpbGRyZW46IFtpbmRpY2F0b3JzICYmIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1pbmRpY2F0b3JzYCxcbiAgICAgIGNoaWxkcmVuOiBtYXAoY2hpbGRyZW4sIChfLCBpbmRleCkgPT4gLyojX19QVVJFX18qL19qc3goXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtYnMtdGFyZ2V0XCI6IFwiXCIgLy8gQm9vdHN0cmFwIHJlcXVpcmVzIHRoaXMgaW4gdGhlaXIgY3NzLlxuICAgICAgICAsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBpbmRpY2F0b3JMYWJlbHMgIT0gbnVsbCAmJiBpbmRpY2F0b3JMYWJlbHMubGVuZ3RoID8gaW5kaWNhdG9yTGFiZWxzW2luZGV4XSA6IGBTbGlkZSAke2luZGV4ICsgMX1gLFxuICAgICAgICBjbGFzc05hbWU6IGluZGV4ID09PSByZW5kZXJlZEFjdGl2ZUluZGV4ID8gJ2FjdGl2ZScgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uQ2xpY2s6IGluZGljYXRvck9uQ2xpY2tzID8gaW5kaWNhdG9yT25DbGlja3NbaW5kZXhdIDogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBpbmRleCA9PT0gcmVuZGVyZWRBY3RpdmVJbmRleFxuICAgICAgfSwgaW5kZXgpKVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0taW5uZXJgLFxuICAgICAgY2hpbGRyZW46IG1hcChjaGlsZHJlbiwgKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGluZGV4ID09PSByZW5kZXJlZEFjdGl2ZUluZGV4O1xuICAgICAgICByZXR1cm4gc2xpZGUgPyAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uV3JhcHBlciwge1xuICAgICAgICAgIGluOiBpc0FjdGl2ZSxcbiAgICAgICAgICBvbkVudGVyOiBpc0FjdGl2ZSA/IGhhbmRsZUVudGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uRW50ZXJlZDogaXNBY3RpdmUgPyBoYW5kbGVFbnRlcmVkIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFkZEVuZExpc3RlbmVyOiB0cmFuc2l0aW9uRW5kTGlzdGVuZXIsXG4gICAgICAgICAgY2hpbGRyZW46IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHsgLi4uaW5uZXJQcm9wcyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjaGlsZC5wcm9wcy5jbGFzc05hbWUsIGlzQWN0aXZlICYmIHN0YXR1cyAhPT0gJ2VudGVyZWQnICYmIG9yZGVyQ2xhc3NOYW1lLCAoc3RhdHVzID09PSAnZW50ZXJlZCcgfHwgc3RhdHVzID09PSAnZXhpdGluZycpICYmICdhY3RpdmUnLCAoc3RhdHVzID09PSAnZW50ZXJpbmcnIHx8IHN0YXR1cyA9PT0gJ2V4aXRpbmcnKSAmJiBkaXJlY3Rpb25hbENsYXNzTmFtZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2hpbGQucHJvcHMuY2xhc3NOYW1lLCBpc0FjdGl2ZSAmJiAnYWN0aXZlJylcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgIH0pLCBjb250cm9scyAmJiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgICBjaGlsZHJlbjogWyh3cmFwIHx8IGFjdGl2ZUluZGV4ICE9PSAwKSAmJiAvKiNfX1BVUkVfXyovX2pzeHMoQW5jaG9yLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1jb250cm9sLXByZXZgLFxuICAgICAgICBvbkNsaWNrOiBwcmV2LFxuICAgICAgICBjaGlsZHJlbjogW3ByZXZJY29uLCBwcmV2TGFiZWwgJiYgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByZXZMYWJlbFxuICAgICAgICB9KV1cbiAgICAgIH0pLCAod3JhcCB8fCBhY3RpdmVJbmRleCAhPT0gbnVtQ2hpbGRyZW4gLSAxKSAmJiAvKiNfX1BVUkVfXyovX2pzeHMoQW5jaG9yLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1jb250cm9sLW5leHRgLFxuICAgICAgICBvbkNsaWNrOiBuZXh0LFxuICAgICAgICBjaGlsZHJlbjogW25leHRJY29uLCBuZXh0TGFiZWwgJiYgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgICAgY2hpbGRyZW46IG5leHRMYWJlbFxuICAgICAgICB9KV1cbiAgICAgIH0pXVxuICAgIH0pXVxuICB9KTtcbn0pO1xuQ2Fyb3VzZWwuZGlzcGxheU5hbWUgPSAnQ2Fyb3VzZWwnO1xuQ2Fyb3VzZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihDYXJvdXNlbCwge1xuICBDYXB0aW9uOiBDYXJvdXNlbENhcHRpb24sXG4gIEl0ZW06IENhcm91c2VsSXRlbVxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Nhcm91c2VsLWNhcHRpb24nKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2Fyb3VzZWxJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgZmluYWxDbGFzc05hbWUgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY2Fyb3VzZWwtaXRlbScpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogZmluYWxDbGFzc05hbWVcbiAgfSk7XG59KTtcbkNhcm91c2VsSXRlbS5kaXNwbGF5TmFtZSA9ICdDYXJvdXNlbEl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWxJdGVtOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gICdhcmlhLWxhYmVsJzogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFJlbmRlciBkaWZmZXJlbnQgY29sb3IgdmFyaWFudCBmb3IgdGhlIGJ1dHRvbi5cbiAgICpcbiAgICogT21pdHRpbmcgdGhpcyB3aWxsIHJlbmRlciB0aGUgZGVmYXVsdCBkYXJrIGNvbG9yLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnd2hpdGUnXSlcbn07XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICdhcmlhLWxhYmVsJzogJ0Nsb3NlJ1xufTtcbmNvbnN0IENsb3NlQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeChcImJ1dHRvblwiLCB7XG4gIHJlZjogcmVmLFxuICB0eXBlOiBcImJ1dHRvblwiLFxuICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoJ2J0bi1jbG9zZScsIHZhcmlhbnQgJiYgYGJ0bi1jbG9zZS0ke3ZhcmlhbnR9YCwgY2xhc3NOYW1lKSxcbiAgLi4ucHJvcHNcbn0pKTtcbkNsb3NlQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0Nsb3NlQnV0dG9uJztcbkNsb3NlQnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNsb3NlQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IENsb3NlQnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBERVZJQ0VfU0laRVMgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbCh7XG4gIGFzLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSkge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NvbCcpO1xuICBjb25zdCBzcGFucyA9IFtdO1xuICBjb25zdCBjbGFzc2VzID0gW107XG4gIERFVklDRV9TSVpFUy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgc3BhbjtcbiAgICBsZXQgb2Zmc2V0O1xuICAgIGxldCBvcmRlcjtcblxuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnb2JqZWN0JyAmJiBwcm9wVmFsdWUgIT0gbnVsbCkge1xuICAgICAgKHtcbiAgICAgICAgc3BhbixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlclxuICAgICAgfSA9IHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYW4gPSBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgaWYgKHNwYW4pIHNwYW5zLnB1c2goc3BhbiA9PT0gdHJ1ZSA/IGAke2JzUHJlZml4fSR7aW5maXh9YCA6IGAke2JzUHJlZml4fSR7aW5maXh9LSR7c3Bhbn1gKTtcbiAgICBpZiAob3JkZXIgIT0gbnVsbCkgY2xhc3Nlcy5wdXNoKGBvcmRlciR7aW5maXh9LSR7b3JkZXJ9YCk7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSBjbGFzc2VzLnB1c2goYG9mZnNldCR7aW5maXh9LSR7b2Zmc2V0fWApO1xuICB9KTtcbiAgcmV0dXJuIFt7IC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIC4uLnNwYW5zLCAuLi5jbGFzc2VzKVxuICB9LCB7XG4gICAgYXMsXG4gICAgYnNQcmVmaXgsXG4gICAgc3BhbnNcbiAgfV07XG59XG5jb25zdCBDb2wgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3QgW3tcbiAgICBjbGFzc05hbWUsXG4gICAgLi4uY29sUHJvcHNcbiAgfSwge1xuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBic1ByZWZpeCxcbiAgICBzcGFuc1xuICB9XSA9IHVzZUNvbChwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4uY29sUHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgIXNwYW5zLmxlbmd0aCAmJiBic1ByZWZpeClcbiAgfSk7XG59KTtcbkNvbC5kaXNwbGF5TmFtZSA9ICdDb2wnO1xuZXhwb3J0IGRlZmF1bHQgQ29sOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNzcyBmcm9tICdkb20taGVscGVycy9jc3MnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFTlRFUkVELCBFTlRFUklORywgRVhJVEVELCBFWElUSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IGNyZWF0ZUNoYWluZWRGdW5jdGlvbiBmcm9tICcuL2NyZWF0ZUNoYWluZWRGdW5jdGlvbic7XG5pbXBvcnQgdHJpZ2dlckJyb3dzZXJSZWZsb3cgZnJvbSAnLi90cmlnZ2VyQnJvd3NlclJlZmxvdyc7XG5pbXBvcnQgVHJhbnNpdGlvbldyYXBwZXIgZnJvbSAnLi9UcmFuc2l0aW9uV3JhcHBlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTUFSR0lOUyA9IHtcbiAgaGVpZ2h0OiBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nXSxcbiAgd2lkdGg6IFsnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCddXG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGltZW5zaW9uVmFsdWUoZGltZW5zaW9uLCBlbGVtKSB7XG4gIGNvbnN0IG9mZnNldCA9IGBvZmZzZXQke2RpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpfSR7ZGltZW5zaW9uLnNsaWNlKDEpfWA7XG4gIGNvbnN0IHZhbHVlID0gZWxlbVtvZmZzZXRdO1xuICBjb25zdCBtYXJnaW5zID0gTUFSR0lOU1tkaW1lbnNpb25dO1xuICByZXR1cm4gdmFsdWUgKyAvLyBAdHMtaWdub3JlXG4gIHBhcnNlSW50KGNzcyhlbGVtLCBtYXJnaW5zWzBdKSwgMTApICsgLy8gQHRzLWlnbm9yZVxuICBwYXJzZUludChjc3MoZWxlbSwgbWFyZ2luc1sxXSksIDEwKTtcbn1cblxuY29uc3QgY29sbGFwc2VTdHlsZXMgPSB7XG4gIFtFWElURURdOiAnY29sbGFwc2UnLFxuICBbRVhJVElOR106ICdjb2xsYXBzaW5nJyxcbiAgW0VOVEVSSU5HXTogJ2NvbGxhcHNpbmcnLFxuICBbRU5URVJFRF06ICdjb2xsYXBzZSBzaG93J1xufTtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlLFxuICBnZXREaW1lbnNpb25WYWx1ZTogZ2V0RGVmYXVsdERpbWVuc2lvblZhbHVlXG59O1xuY29uc3QgQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBvbkVudGVyLFxuICBvbkVudGVyaW5nLFxuICBvbkVudGVyZWQsXG4gIG9uRXhpdCxcbiAgb25FeGl0aW5nLFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICBkaW1lbnNpb24gPSAnaGVpZ2h0JyxcbiAgZ2V0RGltZW5zaW9uVmFsdWUgPSBnZXREZWZhdWx0RGltZW5zaW9uVmFsdWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgLyogQ29tcHV0ZSBkaW1lbnNpb24gKi9cbiAgY29uc3QgY29tcHV0ZWREaW1lbnNpb24gPSB0eXBlb2YgZGltZW5zaW9uID09PSAnZnVuY3Rpb24nID8gZGltZW5zaW9uKCkgOiBkaW1lbnNpb247XG4gIC8qIC0tIEV4cGFuZGluZyAtLSAqL1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSAnMCc7XG4gIH0sIG9uRW50ZXIpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRW50ZXJdKTtcbiAgY29uc3QgaGFuZGxlRW50ZXJpbmcgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihlbGVtID0+IHtcbiAgICBjb25zdCBzY3JvbGwgPSBgc2Nyb2xsJHtjb21wdXRlZERpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpfSR7Y29tcHV0ZWREaW1lbnNpb24uc2xpY2UoMSl9YDtcbiAgICBlbGVtLnN0eWxlW2NvbXB1dGVkRGltZW5zaW9uXSA9IGAke2VsZW1bc2Nyb2xsXX1weGA7XG4gIH0sIG9uRW50ZXJpbmcpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRW50ZXJpbmddKTtcbiAgY29uc3QgaGFuZGxlRW50ZXJlZCA9IHVzZU1lbW8oKCkgPT4gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKGVsZW0gPT4ge1xuICAgIGVsZW0uc3R5bGVbY29tcHV0ZWREaW1lbnNpb25dID0gbnVsbDtcbiAgfSwgb25FbnRlcmVkKSwgW2NvbXB1dGVkRGltZW5zaW9uLCBvbkVudGVyZWRdKTtcbiAgLyogLS0gQ29sbGFwc2luZyAtLSAqL1xuXG4gIGNvbnN0IGhhbmRsZUV4aXQgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihlbGVtID0+IHtcbiAgICBlbGVtLnN0eWxlW2NvbXB1dGVkRGltZW5zaW9uXSA9IGAke2dldERpbWVuc2lvblZhbHVlKGNvbXB1dGVkRGltZW5zaW9uLCBlbGVtKX1weGA7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3coZWxlbSk7XG4gIH0sIG9uRXhpdCksIFtvbkV4aXQsIGdldERpbWVuc2lvblZhbHVlLCBjb21wdXRlZERpbWVuc2lvbl0pO1xuICBjb25zdCBoYW5kbGVFeGl0aW5nID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSBudWxsO1xuICB9LCBvbkV4aXRpbmcpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRXhpdGluZ10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbldyYXBwZXIsIHtcbiAgICByZWY6IHJlZixcbiAgICBhZGRFbmRMaXN0ZW5lcjogdHJhbnNpdGlvbkVuZExpc3RlbmVyLFxuICAgIC4uLnByb3BzLFxuICAgIFwiYXJpYS1leHBhbmRlZFwiOiBwcm9wcy5yb2xlID8gcHJvcHMuaW4gOiBudWxsLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0aW5nOiBoYW5kbGVFeGl0aW5nLFxuICAgIGNoaWxkUmVmOiBjaGlsZHJlbi5yZWYsXG4gICAgY2hpbGRyZW46IChzdGF0ZSwgaW5uZXJQcm9wcykgPT4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgeyAuLi5pbm5lclByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBjb2xsYXBzZVN0eWxlc1tzdGF0ZV0sIGNvbXB1dGVkRGltZW5zaW9uID09PSAnd2lkdGgnICYmICdjb2xsYXBzZS1ob3Jpem9udGFsJylcbiAgICB9KVxuICB9KTtcbn0pOyAvLyBAdHMtaWdub3JlXG5cbi8vIEB0cy1pZ25vcmVcbkNvbGxhcHNlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiBmYWxzZVxufTtcbmNvbnN0IENvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBmbHVpZCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdjb250YWluZXInKTtcbiAgY29uc3Qgc3VmZml4ID0gdHlwZW9mIGZsdWlkID09PSAnc3RyaW5nJyA/IGAtJHtmbHVpZH1gIDogJy1mbHVpZCc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBmbHVpZCA/IGAke3ByZWZpeH0ke3N1ZmZpeH1gIDogcHJlZml4KVxuICB9KTtcbn0pO1xuQ29udGFpbmVyLmRpc3BsYXlOYW1lID0gJ0NvbnRhaW5lcic7XG5Db250YWluZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgQ29udGFpbmVyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlRHJvcGRvd24gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd24nO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCBEcm9wZG93bkl0ZW0gZnJvbSAnLi9Ecm9wZG93bkl0ZW0nO1xuaW1wb3J0IERyb3Bkb3duTWVudSwgeyBnZXREcm9wZG93bk1lbnVQbGFjZW1lbnQgfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgRHJvcGRvd25Ub2dnbGUgZnJvbSAnLi9Ecm9wZG93blRvZ2dsZSc7XG5pbXBvcnQgSW5wdXRHcm91cENvbnRleHQgZnJvbSAnLi9JbnB1dEdyb3VwQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IHsgYWxpZ25Qcm9wVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERyb3Bkb3duSGVhZGVyID0gY3JlYXRlV2l0aEJzUHJlZml4KCdkcm9wZG93bi1oZWFkZXInLCB7XG4gIGRlZmF1bHRQcm9wczoge1xuICAgIHJvbGU6ICdoZWFkaW5nJ1xuICB9XG59KTtcbmNvbnN0IERyb3Bkb3duRGl2aWRlciA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnZHJvcGRvd24tZGl2aWRlcicsIHtcbiAgQ29tcG9uZW50OiAnaHInLFxuICBkZWZhdWx0UHJvcHM6IHtcbiAgICByb2xlOiAnc2VwYXJhdG9yJ1xuICB9XG59KTtcbmNvbnN0IERyb3Bkb3duSXRlbVRleHQgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Ryb3Bkb3duLWl0ZW0tdGV4dCcsIHtcbiAgQ29tcG9uZW50OiAnc3Bhbidcbn0pO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBuYXZiYXI6IGZhbHNlLFxuICBhbGlnbjogJ3N0YXJ0JyxcbiAgYXV0b0Nsb3NlOiB0cnVlXG59O1xuY29uc3QgRHJvcGRvd24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocFByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGJzUHJlZml4LFxuICAgIGRyb3AsXG4gICAgc2hvdyxcbiAgICBjbGFzc05hbWUsXG4gICAgYWxpZ24sXG4gICAgb25TZWxlY3QsXG4gICAgb25Ub2dnbGUsXG4gICAgZm9jdXNGaXJzdEl0ZW1PblNob3csXG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBuYXZiYXI6IF80LFxuICAgIGF1dG9DbG9zZSxcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHBQcm9wcywge1xuICAgIHNob3c6ICdvblRvZ2dsZSdcbiAgfSk7XG4gIGNvbnN0IGlzSW5wdXRHcm91cCA9IHVzZUNvbnRleHQoSW5wdXRHcm91cENvbnRleHQpO1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdkcm9wZG93bicpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG5cbiAgY29uc3QgaXNDbG9zaW5nUGVybWl0dGVkID0gc291cmNlID0+IHtcbiAgICAvLyBhdXRvQ2xvc2U9ZmFsc2Ugb25seSBwZXJtaXRzIGNsb3NlIG9uIGJ1dHRvbiBjbGlja1xuICAgIGlmIChhdXRvQ2xvc2UgPT09IGZhbHNlKSByZXR1cm4gc291cmNlID09PSAnY2xpY2snOyAvLyBhdXRvQ2xvc2U9aW5zaWRlIGRvZXNuJ3QgcGVybWl0IGNsb3NlIG9uIHJvb3RDbG9zZVxuXG4gICAgaWYgKGF1dG9DbG9zZSA9PT0gJ2luc2lkZScpIHJldHVybiBzb3VyY2UgIT09ICdyb290Q2xvc2UnOyAvLyBhdXRvQ2xvc2U9b3V0c2lkZSBkb2Vzbid0IHBlcm1pdCBjbG9zZSBvbiBzZWxlY3RcblxuICAgIGlmIChhdXRvQ2xvc2UgPT09ICdvdXRzaWRlJykgcmV0dXJuIHNvdXJjZSAhPT0gJ3NlbGVjdCc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVG9nZ2xlID0gdXNlRXZlbnRDYWxsYmFjaygobmV4dFNob3csIG1ldGEpID0+IHtcbiAgICBpZiAobWV0YS5vcmlnaW5hbEV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGRvY3VtZW50ICYmIChtZXRhLnNvdXJjZSAhPT0gJ2tleWRvd24nIHx8IG1ldGEub3JpZ2luYWxFdmVudC5rZXkgPT09ICdFc2NhcGUnKSkgbWV0YS5zb3VyY2UgPSAncm9vdENsb3NlJztcbiAgICBpZiAoaXNDbG9zaW5nUGVybWl0dGVkKG1ldGEuc291cmNlKSkgb25Ub2dnbGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG9nZ2xlKG5leHRTaG93LCBtZXRhKTtcbiAgfSk7XG4gIGNvbnN0IGFsaWduRW5kID0gYWxpZ24gPT09ICdlbmQnO1xuICBjb25zdCBwbGFjZW1lbnQgPSBnZXREcm9wZG93bk1lbnVQbGFjZW1lbnQoYWxpZ25FbmQsIGRyb3AsIGlzUlRMKTtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIGFsaWduLFxuICAgIGRyb3AsXG4gICAgaXNSVExcbiAgfSksIFthbGlnbiwgZHJvcCwgaXNSVExdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEJhc2VEcm9wZG93biwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBzaG93OiBzaG93LFxuICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0LFxuICAgICAgb25Ub2dnbGU6IGhhbmRsZVRvZ2dsZSxcbiAgICAgIGZvY3VzRmlyc3RJdGVtT25TaG93OiBmb2N1c0ZpcnN0SXRlbU9uU2hvdyxcbiAgICAgIGl0ZW1TZWxlY3RvcjogYC4ke3ByZWZpeH0taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKWAsXG4gICAgICBjaGlsZHJlbjogaXNJbnB1dEdyb3VwID8gcHJvcHMuY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgICAgIHJlZjogcmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBzaG93ICYmICdzaG93JywgKCFkcm9wIHx8IGRyb3AgPT09ICdkb3duJykgJiYgcHJlZml4LCBkcm9wID09PSAndXAnICYmICdkcm9wdXAnLCBkcm9wID09PSAnZW5kJyAmJiAnZHJvcGVuZCcsIGRyb3AgPT09ICdzdGFydCcgJiYgJ2Ryb3BzdGFydCcpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5Ecm9wZG93bi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bic7XG5Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKERyb3Bkb3duLCB7XG4gIFRvZ2dsZTogRHJvcGRvd25Ub2dnbGUsXG4gIE1lbnU6IERyb3Bkb3duTWVudSxcbiAgSXRlbTogRHJvcGRvd25JdGVtLFxuICBJdGVtVGV4dDogRHJvcGRvd25JdGVtVGV4dCxcbiAgRGl2aWRlcjogRHJvcGRvd25EaXZpZGVyLFxuICBIZWFkZXI6IERyb3Bkb3duSGVhZGVyXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4vRHJvcGRvd24nO1xuaW1wb3J0IERyb3Bkb3duVG9nZ2xlIGZyb20gJy4vRHJvcGRvd25Ub2dnbGUnO1xuaW1wb3J0IERyb3Bkb3duTWVudSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgeyBhbGlnblByb3BUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQW4gaHRtbCBpZCBhdHRyaWJ1dGUgZm9yIHRoZSBUb2dnbGUgYnV0dG9uLCBuZWNlc3NhcnkgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgc2NyZWVuIHJlYWRlcnMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gYGhyZWZgIHBhc3NlZCB0byB0aGUgVG9nZ2xlIGNvbXBvbmVudCAqL1xuICBocmVmOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBbiBgb25DbGlja2AgaGFuZGxlciBwYXNzZWQgdG8gdGhlIFRvZ2dsZSBjb21wb25lbnQgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIFRoZSBjb250ZW50IG9mIHRoZSBub24tdG9nZ2xlIEJ1dHRvbi4gICovXG4gIHRpdGxlOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKiBEaXNhYmxlcyBib3RoIEJ1dHRvbnMgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQWxpZ25zIHRoZSBkcm9wZG93biBtZW51LlxuICAgKlxuICAgKiBfc2VlIFtEcm9wZG93bk1lbnVdKCNkcm9wZG93bi1tZW51LXByb3BzKSBmb3IgbW9yZSBkZXRhaWxzX1xuICAgKlxuICAgKiBAdHlwZSB7XCJzdGFydFwifFwiZW5kXCJ8eyBzbTogXCJzdGFydFwifFwiZW5kXCIgfXx7IG1kOiBcInN0YXJ0XCJ8XCJlbmRcIiB9fHsgbGc6IFwic3RhcnRcInxcImVuZFwiIH18eyB4bDogXCJzdGFydFwifFwiZW5kXCJ9fHsgeHhsOiBcInN0YXJ0XCJ8XCJlbmRcIn0gfVxuICAgKi9cbiAgYWxpZ246IGFsaWduUHJvcFR5cGUsXG5cbiAgLyoqIEFuIEFSSUEgYWNjZXNzaWJsZSByb2xlIGFwcGxpZWQgdG8gdGhlIE1lbnUgY29tcG9uZW50LiBXaGVuIHNldCB0byAnbWVudScsIFRoZSBkcm9wZG93biAqL1xuICBtZW51Um9sZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogV2hldGhlciB0byByZW5kZXIgdGhlIGRyb3Bkb3duIG1lbnUgaW4gdGhlIERPTSBiZWZvcmUgdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2hvd24gKi9cbiAgcmVuZGVyTWVudU9uTW91bnQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiAgV2hpY2ggZXZlbnQgd2hlbiBmaXJlZCBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2lsbCBjYXVzZSBpdCB0byBiZSBjbG9zZWQuXG4gICAqXG4gICAqIF9zZWUgW0Ryb3Bkb3duTWVudV0oI2Ryb3Bkb3duLW1lbnUtcHJvcHMpIGZvciBtb3JlIGRldGFpbHNfXG4gICAqL1xuICByb290Q2xvc2VFdmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogTWVudSBjb2xvciB2YXJpYW50LlxuICAgKlxuICAgKiBPbWl0dGluZyB0aGlzIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGxpZ2h0IGNvbG9yLlxuICAgKi9cbiAgbWVudVZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2RhcmsnXSksXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQGlnbm9yZSAqL1xuICBzaXplOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGNvbXBvbmVudCBmb3Igc2ltcGxlIG9yIGdlbmVyYWwgdXNlIGRyb3Bkb3ducy4gUmVuZGVycyBhIGBCdXR0b25gIHRvZ2dsZSBhbmQgYWxsIGBjaGlsZHJlbmBcbiAqIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRlZmF1bHQgYERyb3Bkb3duLk1lbnVgLiBUaGlzIGNvbXBvbmVudCBhY2NlcHRzIGFsbCBvZlxuICogW2BEcm9wZG93bmAncyBwcm9wc10oI2Ryb3Bkb3duLXByb3BzKS5cbiAqXG4gKiBfQWxsIHVua25vd24gcHJvcHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgRHJvcGRvd25gIGNvbXBvbmVudC5fIE9ubHlcbiAqIHRoZSBCdXR0b24gYHZhcmlhbnRgLCBgc2l6ZWAgYW5kIGBic1ByZWZpeGAgcHJvcHMgYXJlIHBhc3NlZCB0byB0aGUgdG9nZ2xlLFxuICogYWxvbmcgd2l0aCBtZW51LXJlbGF0ZWQgcHJvcHMgYXJlIHBhc3NlZCB0byB0aGUgYERyb3Bkb3duLk1lbnVgXG4gKi9cblxuY29uc3QgRHJvcGRvd25CdXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICB0aXRsZSxcbiAgY2hpbGRyZW4sXG4gIGJzUHJlZml4LFxuICByb290Q2xvc2VFdmVudCxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgbWVudVJvbGUsXG4gIHJlbmRlck1lbnVPbk1vdW50LFxuICBkaXNhYmxlZCxcbiAgaHJlZixcbiAgaWQsXG4gIG1lbnVWYXJpYW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeHMoRHJvcGRvd24sIHtcbiAgcmVmOiByZWYsXG4gIC4uLnByb3BzLFxuICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duVG9nZ2xlLCB7XG4gICAgaWQ6IGlkLFxuICAgIGhyZWY6IGhyZWYsXG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjaGlsZEJzUHJlZml4OiBic1ByZWZpeCxcbiAgICBjaGlsZHJlbjogdGl0bGVcbiAgfSksIC8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duTWVudSwge1xuICAgIHJvbGU6IG1lbnVSb2xlLFxuICAgIHJlbmRlck9uTW91bnQ6IHJlbmRlck1lbnVPbk1vdW50LFxuICAgIHJvb3RDbG9zZUV2ZW50OiByb290Q2xvc2VFdmVudCxcbiAgICB2YXJpYW50OiBtZW51VmFyaWFudCxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSldXG59KSk7XG5Ecm9wZG93bkJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkJ1dHRvbic7XG5Ecm9wZG93bkJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkJ1dHRvbjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBEcm9wZG93bkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5Ecm9wZG93bkNvbnRleHQuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25Db250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duQ29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURyb3Bkb3duSXRlbSB9IGZyb20gJ0ByZXN0YXJ0L3VpL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJ0ByZXN0YXJ0L3VpL0FuY2hvcic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERyb3Bkb3duSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGV2ZW50S2V5LFxuICBkaXNhYmxlZCA9IGZhbHNlLFxuICBvbkNsaWNrLFxuICBhY3RpdmUsXG4gIGFzOiBDb21wb25lbnQgPSBBbmNob3IsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24taXRlbScpO1xuICBjb25zdCBbZHJvcGRvd25JdGVtUHJvcHMsIG1ldGFdID0gdXNlRHJvcGRvd25JdGVtKHtcbiAgICBrZXk6IGV2ZW50S2V5LFxuICAgIGhyZWY6IHByb3BzLmhyZWYsXG4gICAgZGlzYWJsZWQsXG4gICAgb25DbGljayxcbiAgICBhY3RpdmVcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgLi4uZHJvcGRvd25JdGVtUHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBtZXRhLmlzQWN0aXZlICYmICdhY3RpdmUnLCBkaXNhYmxlZCAmJiAnZGlzYWJsZWQnKVxuICB9KTtcbn0pO1xuRHJvcGRvd25JdGVtLmRpc3BsYXlOYW1lID0gJ0Ryb3Bkb3duSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkl0ZW07IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRHJvcGRvd25NZW51IH0gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25NZW51JztcbmltcG9ydCB1c2VJc29tb3JwaGljRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUlzb21vcnBoaWNFZmZlY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFJlZnMgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTWVyZ2VkUmVmcyc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IElucHV0R3JvdXBDb250ZXh0IGZyb20gJy4vSW5wdXRHcm91cENvbnRleHQnO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nIGZyb20gJy4vdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nJztcbmltcG9ydCB7IGFsaWduUHJvcFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsaXA6IHRydWVcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wRGlyZWN0aW9uLCBpc1JUTCkge1xuICBjb25zdCB0b3BTdGFydCA9IGlzUlRMID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCc7XG4gIGNvbnN0IHRvcEVuZCA9IGlzUlRMID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCc7XG4gIGNvbnN0IGJvdHRvbVN0YXJ0ID0gaXNSVEwgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0JztcbiAgY29uc3QgYm90dG9tRW5kID0gaXNSVEwgPyAnYm90dG9tLXN0YXJ0JyA6ICdib3R0b20tZW5kJztcbiAgY29uc3QgbGVmdFN0YXJ0ID0gaXNSVEwgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuICBjb25zdCBsZWZ0RW5kID0gaXNSVEwgPyAncmlnaHQtZW5kJyA6ICdsZWZ0LWVuZCc7XG4gIGNvbnN0IHJpZ2h0U3RhcnQgPSBpc1JUTCA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG4gIGNvbnN0IHJpZ2h0RW5kID0gaXNSVEwgPyAnbGVmdC1lbmQnIDogJ3JpZ2h0LWVuZCc7XG4gIGxldCBwbGFjZW1lbnQgPSBhbGlnbkVuZCA/IGJvdHRvbUVuZCA6IGJvdHRvbVN0YXJ0O1xuICBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3VwJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyB0b3BFbmQgOiB0b3BTdGFydDtlbHNlIGlmIChkcm9wRGlyZWN0aW9uID09PSAnZW5kJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyByaWdodEVuZCA6IHJpZ2h0U3RhcnQ7ZWxzZSBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3N0YXJ0JykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyBsZWZ0RW5kIDogbGVmdFN0YXJ0O1xuICByZXR1cm4gcGxhY2VtZW50O1xufVxuY29uc3QgRHJvcGRvd25NZW51ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYWxpZ24sXG4gIHJvb3RDbG9zZUV2ZW50LFxuICBmbGlwLFxuICBzaG93OiBzaG93UHJvcHMsXG4gIHJlbmRlck9uTW91bnQsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBwb3BwZXJDb25maWcsXG4gIHZhcmlhbnQsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgbGV0IGFsaWduRW5kID0gZmFsc2U7XG4gIGNvbnN0IGlzTmF2YmFyID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24tbWVudScpO1xuICBjb25zdCB7XG4gICAgYWxpZ246IGNvbnRleHRBbGlnbixcbiAgICBkcm9wLFxuICAgIGlzUlRMXG4gIH0gPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGFsaWduID0gYWxpZ24gfHwgY29udGV4dEFsaWduO1xuICBjb25zdCBpc0lucHV0R3JvdXAgPSB1c2VDb250ZXh0KElucHV0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgYWxpZ25DbGFzc2VzID0gW107XG5cbiAgaWYgKGFsaWduKSB7XG4gICAgaWYgKHR5cGVvZiBhbGlnbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhbGlnbik7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGtleXMubGVuZ3RoID09PSAxLCAnVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBicmVha3BvaW50IHdoZW4gcGFzc2luZyBhbiBvYmplY3QgdG8gYGFsaWduYCcpIDogdm9pZCAwO1xuXG4gICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYnJrUG9pbnQgPSBrZXlzWzBdO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBhbGlnblticmtQb2ludF07IC8vIC5kcm9wZG93bi1tZW51LWVuZCBpcyByZXF1aXJlZCBmb3IgcmVzcG9uc2l2ZWx5IGFsaWduaW5nXG4gICAgICAgIC8vIGxlZnQgaW4gYWRkaXRpb24gdG8gYWxpZ24gbGVmdCBjbGFzc2VzLlxuXG4gICAgICAgIGFsaWduRW5kID0gZGlyZWN0aW9uID09PSAnc3RhcnQnO1xuICAgICAgICBhbGlnbkNsYXNzZXMucHVzaChgJHtwcmVmaXh9LSR7YnJrUG9pbnR9LSR7ZGlyZWN0aW9ufWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdlbmQnKSB7XG4gICAgICBhbGlnbkVuZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGxhY2VtZW50ID0gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wLCBpc1JUTCk7XG4gIGNvbnN0IFttZW51UHJvcHMsIHtcbiAgICBoYXNTaG93bixcbiAgICBwb3BwZXIsXG4gICAgc2hvdyxcbiAgICB0b2dnbGVcbiAgfV0gPSB1c2VEcm9wZG93bk1lbnUoe1xuICAgIGZsaXAsXG4gICAgcm9vdENsb3NlRXZlbnQsXG4gICAgc2hvdzogc2hvd1Byb3BzLFxuICAgIHVzZVBvcHBlcjogIWlzTmF2YmFyICYmIGFsaWduQ2xhc3Nlcy5sZW5ndGggPT09IDAsXG4gICAgb2Zmc2V0OiBbMCwgMl0sXG4gICAgcG9wcGVyQ29uZmlnLFxuICAgIHBsYWNlbWVudFxuICB9KTtcbiAgbWVudVByb3BzLnJlZiA9IHVzZU1lcmdlZFJlZnModXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgJ0Ryb3Bkb3duTWVudScpLCBtZW51UHJvcHMucmVmKTtcbiAgdXNlSXNvbW9ycGhpY0VmZmVjdCgoKSA9PiB7XG4gICAgLy8gUG9wcGVyJ3MgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlIG1lbnUgaXMgaW5jb3JyZWN0IHdoZW5cbiAgICAvLyByZW5kZXJPbk1vdW50PXRydWUuIE5lZWQgdG8gY2FsbCB1cGRhdGUoKSB0byBjb3JyZWN0IGl0LlxuICAgIGlmIChzaG93KSBwb3BwZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcHBlci51cGRhdGUoKTtcbiAgfSwgW3Nob3ddKTtcbiAgaWYgKCFoYXNTaG93biAmJiAhcmVuZGVyT25Nb3VudCAmJiAhaXNJbnB1dEdyb3VwKSByZXR1cm4gbnVsbDsgLy8gRm9yIGN1c3RvbSBjb21wb25lbnRzIHByb3ZpZGUgYWRkaXRpb25hbCwgbm9uLURPTSwgcHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgbWVudVByb3BzLnNob3cgPSBzaG93O1xuXG4gICAgbWVudVByb3BzLmNsb3NlID0gKCkgPT4gdG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiB0b2dnbGUoZmFsc2UpO1xuXG4gICAgbWVudVByb3BzLmFsaWduID0gYWxpZ247XG4gIH1cblxuICBsZXQgc3R5bGUgPSBwcm9wcy5zdHlsZTtcblxuICBpZiAocG9wcGVyICE9IG51bGwgJiYgcG9wcGVyLnBsYWNlbWVudCkge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdGhlIGRlZmF1bHQgcG9wcGVyIHN0eWxlLFxuICAgIC8vIG1lbnVzIGFyZSBkaXNwbGF5OiBub25lIHdoZW4gbm90IHNob3duLlxuICAgIHN0eWxlID0geyAuLi5wcm9wcy5zdHlsZSxcbiAgICAgIC4uLm1lbnVQcm9wcy5zdHlsZVxuICAgIH07XG4gICAgcHJvcHNbJ3gtcGxhY2VtZW50J10gPSBwb3BwZXIucGxhY2VtZW50O1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAuLi5tZW51UHJvcHMsXG4gICAgc3R5bGU6IHN0eWxlIC8vIEJvb3RzdHJhcCBjc3MgcmVxdWlyZXMgdGhpcyBkYXRhIGF0dHJpYiB0byBzdHlsZSByZXNwb25zaXZlIG1lbnVzLlxuICAgICxcbiAgICAuLi4oKGFsaWduQ2xhc3Nlcy5sZW5ndGggfHwgaXNOYXZiYXIpICYmIHtcbiAgICAgICdkYXRhLWJzLXBvcHBlcic6ICdzdGF0aWMnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBzaG93ICYmICdzaG93JywgYWxpZ25FbmQgJiYgYCR7cHJlZml4fS1lbmRgLCB2YXJpYW50ICYmIGAke3ByZWZpeH0tJHt2YXJpYW50fWAsIC4uLmFsaWduQ2xhc3NlcylcbiAgfSk7XG59KTtcbkRyb3Bkb3duTWVudS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bk1lbnUnO1xuRHJvcGRvd25NZW51LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duTWVudTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEcm9wZG93blRvZ2dsZSB9IGZyb20gJ0ByZXN0YXJ0L3VpL0Ryb3Bkb3duVG9nZ2xlJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgSW5wdXRHcm91cENvbnRleHQgZnJvbSAnLi9JbnB1dEdyb3VwQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHVzZVdyYXBwZWRSZWZXaXRoV2FybmluZyBmcm9tICcuL3VzZVdyYXBwZWRSZWZXaXRoV2FybmluZyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25Ub2dnbGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgc3BsaXQsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRCc1ByZWZpeCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gQnV0dG9uLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Ryb3Bkb3duLXRvZ2dsZScpO1xuICBjb25zdCBkcm9wZG93bkNvbnRleHQgPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGNvbnN0IGlzSW5wdXRHcm91cCA9IHVzZUNvbnRleHQoSW5wdXRHcm91cENvbnRleHQpO1xuXG4gIGlmIChjaGlsZEJzUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy5ic1ByZWZpeCA9IGNoaWxkQnNQcmVmaXg7XG4gIH1cblxuICBjb25zdCBbdG9nZ2xlUHJvcHNdID0gdXNlRHJvcGRvd25Ub2dnbGUoKTtcbiAgdG9nZ2xlUHJvcHMucmVmID0gdXNlTWVyZ2VkUmVmcyh0b2dnbGVQcm9wcy5yZWYsIHVzZVdyYXBwZWRSZWZXaXRoV2FybmluZyhyZWYsICdEcm9wZG93blRvZ2dsZScpKTsgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGZvcndhcmRzIHNpemUgYW5kIHZhcmlhbnQgKGlmIHNldCkgdG8gdGhlXG4gIC8vIHVuZGVybHlpbmcgY29tcG9uZW50LCB0byBhbGxvdyBpdCB0byByZW5kZXIgc2l6ZSBhbmQgc3R5bGUgdmFyaWFudHMuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgc3BsaXQgJiYgYCR7cHJlZml4fS1zcGxpdGAsICEhaXNJbnB1dEdyb3VwICYmIChkcm9wZG93bkNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGRyb3Bkb3duQ29udGV4dC5zaG93KSAmJiAnc2hvdycpLFxuICAgIC4uLnRvZ2dsZVByb3BzLFxuICAgIC4uLnByb3BzXG4gIH0pO1xufSk7XG5Ecm9wZG93blRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93blRvZ2dsZSc7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blRvZ2dsZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLFxuICogYnV0IG9ubHkgbWFwcyBvdmVyIGNoaWxkcmVuIHRoYXQgYXJlIFwidmFsaWQgZWxlbWVudHNcIi5cbiAqXG4gKiBUaGUgbWFwRnVuY3Rpb24gcHJvdmlkZWQgaW5kZXggd2lsbCBiZSBub3JtYWxpc2VkIHRvIHRoZSBjb21wb25lbnRzIG1hcHBlZCxcbiAqIHNvIGFuIGludmFsaWQgY29tcG9uZW50IHdvdWxkIG5vdCBpbmNyZWFzZSB0aGUgaW5kZXguXG4gKlxuICovXG5cbmZ1bmN0aW9uIG1hcChjaGlsZHJlbiwgZnVuYykge1xuICBsZXQgaW5kZXggPSAwO1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBjaGlsZCA9PiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpID8gZnVuYyhjaGlsZCwgaW5kZXgrKykgOiBjaGlsZCk7XG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgXCJ2YWxpZCBlbGVtZW50c1wiLlxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkIHdpdGggdGhlIGluZGV4IHJlZmxlY3RpbmcgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICovXG5cblxuZnVuY3Rpb24gZm9yRWFjaChjaGlsZHJlbiwgZnVuYykge1xuICBsZXQgaW5kZXggPSAwO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSBmdW5jKGNoaWxkLCBpbmRleCsrKTtcbiAgfSk7XG59XG4vKipcbiAqIEZpbmRzIHdoZXRoZXIgYSBjb21wb25lbnQncyBgY2hpbGRyZW5gIHByb3AgaW5jbHVkZXMgYSBSZWFjdCBlbGVtZW50IG9mIHRoZVxuICogc3BlY2lmaWVkIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNDaGlsZE9mVHlwZShjaGlsZHJlbiwgdHlwZSkge1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikuc29tZShjaGlsZCA9PiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IHR5cGUpO1xufVxuXG5leHBvcnQgeyBtYXAsIGZvckVhY2gsIGhhc0NoaWxkT2ZUeXBlIH07IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVOVEVSRUQsIEVOVEVSSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IHRyaWdnZXJCcm93c2VyUmVmbG93IGZyb20gJy4vdHJpZ2dlckJyb3dzZXJSZWZsb3cnO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlXG59O1xuY29uc3QgZmFkZVN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3cnLFxuICBbRU5URVJFRF06ICdzaG93J1xufTtcbmNvbnN0IEZhZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICB0cmFuc2l0aW9uQ2xhc3NlcyA9IHt9LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlQ2FsbGJhY2soKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSk7XG4gICAgcHJvcHMub25FbnRlciA9PSBudWxsID8gdm9pZCAwIDogcHJvcHMub25FbnRlcihub2RlLCBpc0FwcGVhcmluZyk7XG4gIH0sIFtwcm9wc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbldyYXBwZXIsIHtcbiAgICByZWY6IHJlZixcbiAgICBhZGRFbmRMaXN0ZW5lcjogdHJhbnNpdGlvbkVuZExpc3RlbmVyLFxuICAgIC4uLnByb3BzLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIGNoaWxkUmVmOiBjaGlsZHJlbi5yZWYsXG4gICAgY2hpbGRyZW46IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHsgLi4uaW5uZXJQcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygnZmFkZScsIGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBmYWRlU3R5bGVzW3N0YXR1c10sIHRyYW5zaXRpb25DbGFzc2VzW3N0YXR1c10pXG4gICAgfSlcbiAgfSk7XG59KTtcbkZhZGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuRmFkZS5kaXNwbGF5TmFtZSA9ICdGYWRlJztcbmV4cG9ydCBkZWZhdWx0IEZhZGU7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgZmVlZGJhY2sgaXMgZm9yIHZhbGlkIG9yIGludmFsaWQgZmllbGRzXG4gICAqXG4gICAqIEB0eXBlIHsoJ3ZhbGlkJ3wnaW52YWxpZCcpfVxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRGlzcGxheSBmZWVkYmFjayBhcyBhIHRvb2x0aXAuICovXG4gIHRvb2x0aXA6IFByb3BUeXBlcy5ib29sLFxuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlXG59O1xuY29uc3QgRmVlZGJhY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKHtcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBjbGFzc05hbWUsXG4gIHR5cGUgPSAndmFsaWQnLFxuICB0b29sdGlwID0gZmFsc2UsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgcmVmOiByZWYsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke3R5cGV9LSR7dG9vbHRpcCA/ICd0b29sdGlwJyA6ICdmZWVkYmFjayd9YClcbn0pKTtcbkZlZWRiYWNrLmRpc3BsYXlOYW1lID0gJ0ZlZWRiYWNrJztcbkZlZWRiYWNrLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydCBkZWZhdWx0IEZlZWRiYWNrOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IEZpZ3VyZUltYWdlIGZyb20gJy4vRmlndXJlSW1hZ2UnO1xuaW1wb3J0IEZpZ3VyZUNhcHRpb24gZnJvbSAnLi9GaWd1cmVDYXB0aW9uJztcbmNvbnN0IEZpZ3VyZSA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnZmlndXJlJywge1xuICBDb21wb25lbnQ6ICdmaWd1cmUnXG59KTtcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oRmlndXJlLCB7XG4gIEltYWdlOiBGaWd1cmVJbWFnZSxcbiAgQ2FwdGlvbjogRmlndXJlQ2FwdGlvblxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5jb25zdCBGaWd1cmVDYXB0aW9uID0gY3JlYXRlV2l0aEJzUHJlZml4KCdmaWd1cmUtY2FwdGlvbicsIHtcbiAgQ29tcG9uZW50OiAnZmlnY2FwdGlvbidcbn0pO1xuZXhwb3J0IGRlZmF1bHQgRmlndXJlQ2FwdGlvbjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbWFnZSwgeyBwcm9wVHlwZXMgYXMgaW1hZ2VQcm9wVHlwZXMgfSBmcm9tICcuL0ltYWdlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiB0cnVlXG59O1xuY29uc3QgRmlndXJlSW1hZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KEltYWdlLCB7XG4gIHJlZjogcmVmLFxuICAuLi5wcm9wcyxcbiAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgJ2ZpZ3VyZS1pbWcnKVxufSkpO1xuRmlndXJlSW1hZ2UuZGlzcGxheU5hbWUgPSAnRmlndXJlSW1hZ2UnO1xuRmlndXJlSW1hZ2UucHJvcFR5cGVzID0gaW1hZ2VQcm9wVHlwZXM7XG5GaWd1cmVJbWFnZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBGaWd1cmVJbWFnZTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnLi9Gb3JtR3JvdXAnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBGbG9hdGluZ0xhYmVsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGNvbnRyb2xJZCxcbiAgbGFiZWwsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWZsb2F0aW5nJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoRm9ybUdyb3VwLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNvbnRyb2xJZDogY29udHJvbElkLFxuICAgIC4uLnByb3BzLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIC8qI19fUFVSRV9fKi9fanN4KFwibGFiZWxcIiwge1xuICAgICAgaHRtbEZvcjogY29udHJvbElkLFxuICAgICAgY2hpbGRyZW46IGxhYmVsXG4gICAgfSldXG4gIH0pO1xufSk7XG5GbG9hdGluZ0xhYmVsLmRpc3BsYXlOYW1lID0gJ0Zsb2F0aW5nTGFiZWwnO1xuZXhwb3J0IGRlZmF1bHQgRmxvYXRpbmdMYWJlbDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9ybUNoZWNrIGZyb20gJy4vRm9ybUNoZWNrJztcbmltcG9ydCBGb3JtQ29udHJvbCBmcm9tICcuL0Zvcm1Db250cm9sJztcbmltcG9ydCBGb3JtRmxvYXRpbmcgZnJvbSAnLi9Gb3JtRmxvYXRpbmcnO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICcuL0Zvcm1Hcm91cCc7XG5pbXBvcnQgRm9ybUxhYmVsIGZyb20gJy4vRm9ybUxhYmVsJztcbmltcG9ydCBGb3JtUmFuZ2UgZnJvbSAnLi9Gb3JtUmFuZ2UnO1xuaW1wb3J0IEZvcm1TZWxlY3QgZnJvbSAnLi9Gb3JtU2VsZWN0JztcbmltcG9ydCBGb3JtVGV4dCBmcm9tICcuL0Zvcm1UZXh0JztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi9Td2l0Y2gnO1xuaW1wb3J0IEZsb2F0aW5nTGFiZWwgZnJvbSAnLi9GbG9hdGluZ0xhYmVsJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgRm9ybSBgcmVmYCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdW5kZXJseWluZyBlbGVtZW50LFxuICAgKiB3aGljaCBtZWFucywgdW5sZXNzIGl0J3MgcmVuZGVyZWQgYGFzYCBhIGNvbXBvc2l0ZSBjb21wb25lbnQsXG4gICAqIGl0IHdpbGwgYmUgYSBET00gbm9kZSwgd2hlbiByZXNvbHZlZC5cbiAgICpcbiAgICogQHR5cGUge1JlYWN0UmVmfVxuICAgKiBAYWxpYXMgcmVmXG4gICAqL1xuICBfcmVmOiBQcm9wVHlwZXMuYW55LFxuXG4gIC8qKlxuICAgKiBNYXJrIGEgZm9ybSBhcyBoYXZpbmcgYmVlbiB2YWxpZGF0ZWQuIFNldHRpbmcgaXQgdG8gYHRydWVgIHdpbGxcbiAgICogdG9nZ2xlIGFueSB2YWxpZGF0aW9uIHN0eWxlcyBvbiB0aGUgZm9ybXMgZWxlbWVudHMuXG4gICAqL1xuICB2YWxpZGF0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlXG59O1xuY29uc3QgRm9ybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgdmFsaWRhdGVkLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZm9ybScsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgcmVmOiByZWYsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHZhbGlkYXRlZCAmJiAnd2FzLXZhbGlkYXRlZCcpXG59KSk7XG5Gb3JtLmRpc3BsYXlOYW1lID0gJ0Zvcm0nO1xuRm9ybS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKEZvcm0sIHtcbiAgR3JvdXA6IEZvcm1Hcm91cCxcbiAgQ29udHJvbDogRm9ybUNvbnRyb2wsXG4gIEZsb2F0aW5nOiBGb3JtRmxvYXRpbmcsXG4gIENoZWNrOiBGb3JtQ2hlY2ssXG4gIFN3aXRjaCxcbiAgTGFiZWw6IEZvcm1MYWJlbCxcbiAgVGV4dDogRm9ybVRleHQsXG4gIFJhbmdlOiBGb3JtUmFuZ2UsXG4gIFNlbGVjdDogRm9ybVNlbGVjdCxcbiAgRmxvYXRpbmdMYWJlbFxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZlZWRiYWNrIGZyb20gJy4vRmVlZGJhY2snO1xuaW1wb3J0IEZvcm1DaGVja0lucHV0IGZyb20gJy4vRm9ybUNoZWNrSW5wdXQnO1xuaW1wb3J0IEZvcm1DaGVja0xhYmVsIGZyb20gJy4vRm9ybUNoZWNrTGFiZWwnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGhhc0NoaWxkT2ZUeXBlIH0gZnJvbSAnLi9FbGVtZW50Q2hpbGRyZW4nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybUNoZWNrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgaWQsXG4gIGJzUHJlZml4LFxuICBic1N3aXRjaFByZWZpeCxcbiAgaW5saW5lID0gZmFsc2UsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGlzVmFsaWQgPSBmYWxzZSxcbiAgaXNJbnZhbGlkID0gZmFsc2UsXG4gIGZlZWRiYWNrVG9vbHRpcCA9IGZhbHNlLFxuICBmZWVkYmFjayxcbiAgZmVlZGJhY2tUeXBlLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICB0aXRsZSA9ICcnLFxuICB0eXBlID0gJ2NoZWNrYm94JyxcbiAgbGFiZWwsXG4gIGNoaWxkcmVuLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzID0gJ2lucHV0JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2snKTtcbiAgYnNTd2l0Y2hQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNTd2l0Y2hQcmVmaXgsICdmb3JtLXN3aXRjaCcpO1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgY29uc3QgaW5uZXJGb3JtQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjb250cm9sSWQ6IGlkIHx8IGNvbnRyb2xJZFxuICB9KSwgW2NvbnRyb2xJZCwgaWRdKTtcbiAgY29uc3QgaGFzTGFiZWwgPSAhY2hpbGRyZW4gJiYgbGFiZWwgIT0gbnVsbCAmJiBsYWJlbCAhPT0gZmFsc2UgfHwgaGFzQ2hpbGRPZlR5cGUoY2hpbGRyZW4sIEZvcm1DaGVja0xhYmVsKTtcblxuICBjb25zdCBpbnB1dCA9IC8qI19fUFVSRV9fKi9fanN4KEZvcm1DaGVja0lucHV0LCB7IC4uLnByb3BzLFxuICAgIHR5cGU6IHR5cGUgPT09ICdzd2l0Y2gnID8gJ2NoZWNrYm94JyA6IHR5cGUsXG4gICAgcmVmOiByZWYsXG4gICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICBpc0ludmFsaWQ6IGlzSW52YWxpZCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgYXM6IGFzXG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBpbm5lckZvcm1Db250ZXh0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBoYXNMYWJlbCAmJiBic1ByZWZpeCwgaW5saW5lICYmIGAke2JzUHJlZml4fS1pbmxpbmVgLCB0eXBlID09PSAnc3dpdGNoJyAmJiBic1N3aXRjaFByZWZpeCksXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgLyojX19QVVJFX18qL19qc3hzKF9GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogW2lucHV0LCBoYXNMYWJlbCAmJiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ2hlY2tMYWJlbCwge1xuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbjogbGFiZWxcbiAgICAgICAgfSksIGZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9fanN4KEZlZWRiYWNrLCB7XG4gICAgICAgICAgdHlwZTogZmVlZGJhY2tUeXBlLFxuICAgICAgICAgIHRvb2x0aXA6IGZlZWRiYWNrVG9vbHRpcCxcbiAgICAgICAgICBjaGlsZHJlbjogZmVlZGJhY2tcbiAgICAgICAgfSldXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5Gb3JtQ2hlY2suZGlzcGxheU5hbWUgPSAnRm9ybUNoZWNrJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oRm9ybUNoZWNrLCB7XG4gIElucHV0OiBGb3JtQ2hlY2tJbnB1dCxcbiAgTGFiZWw6IEZvcm1DaGVja0xhYmVsXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1DaGVja0lucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgaWQsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHR5cGUgPSAnY2hlY2tib3gnLFxuICBpc1ZhbGlkID0gZmFsc2UsXG4gIGlzSW52YWxpZCA9IGZhbHNlLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnaW5wdXQnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2staW5wdXQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICB0eXBlOiB0eXBlLFxuICAgIGlkOiBpZCB8fCBjb250cm9sSWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgsIGlzVmFsaWQgJiYgJ2lzLXZhbGlkJywgaXNJbnZhbGlkICYmICdpcy1pbnZhbGlkJylcbiAgfSk7XG59KTtcbkZvcm1DaGVja0lucHV0LmRpc3BsYXlOYW1lID0gJ0Zvcm1DaGVja0lucHV0JztcbmV4cG9ydCBkZWZhdWx0IEZvcm1DaGVja0lucHV0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtQ29udGV4dCBmcm9tICcuL0Zvcm1Db250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybUNoZWNrTGFiZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBodG1sRm9yLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2stbGFiZWwnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwibGFiZWxcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBodG1sRm9yOiBodG1sRm9yIHx8IGNvbnRyb2xJZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeClcbiAgfSk7XG59KTtcbkZvcm1DaGVja0xhYmVsLmRpc3BsYXlOYW1lID0gJ0Zvcm1DaGVja0xhYmVsJztcbmV4cG9ydCBkZWZhdWx0IEZvcm1DaGVja0xhYmVsOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8gVE9ET1xuXG5jb25zdCBGb3JtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250ZXh0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IEZlZWRiYWNrIGZyb20gJy4vRmVlZGJhY2snO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBGb3JtQ29udHJvbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICB0eXBlLFxuICBzaXplLFxuICBodG1sU2l6ZSxcbiAgaWQsXG4gIGNsYXNzTmFtZSxcbiAgaXNWYWxpZCA9IGZhbHNlLFxuICBpc0ludmFsaWQgPSBmYWxzZSxcbiAgcGxhaW50ZXh0LFxuICByZWFkT25seSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2lucHV0JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWNvbnRyb2wnKTtcbiAgbGV0IGNsYXNzZXM7XG5cbiAgaWYgKHBsYWludGV4dCkge1xuICAgIGNsYXNzZXMgPSB7XG4gICAgICBbYCR7YnNQcmVmaXh9LXBsYWludGV4dGBdOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjbGFzc2VzID0ge1xuICAgICAgW2JzUHJlZml4XTogdHJ1ZSxcbiAgICAgIFtgJHtic1ByZWZpeH0tJHtzaXplfWBdOiBzaXplXG4gICAgfTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY29udHJvbElkID09IG51bGwgfHwgIWlkLCAnYGNvbnRyb2xJZGAgaXMgaWdub3JlZCBvbiBgPEZvcm1Db250cm9sPmAgd2hlbiBgaWRgIGlzIHNwZWNpZmllZC4nKSA6IHZvaWQgMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICB0eXBlOiB0eXBlLFxuICAgIHNpemU6IGh0bWxTaXplLFxuICAgIHJlZjogcmVmLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICBpZDogaWQgfHwgY29udHJvbElkLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGNsYXNzZXMsIGlzVmFsaWQgJiYgYGlzLXZhbGlkYCwgaXNJbnZhbGlkICYmIGBpcy1pbnZhbGlkYCwgdHlwZSA9PT0gJ2NvbG9yJyAmJiBgJHtic1ByZWZpeH0tY29sb3JgKVxuICB9KTtcbn0pO1xuRm9ybUNvbnRyb2wuZGlzcGxheU5hbWUgPSAnRm9ybUNvbnRyb2wnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihGb3JtQ29udHJvbCwge1xuICBGZWVkYmFja1xufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Zvcm0tZmxvYXRpbmcnKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNvbnRyb2xJZCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjb250cm9sSWRcbiAgfSksIFtjb250cm9sSWRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZvcm1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAgIHJlZjogcmVmXG4gICAgfSlcbiAgfSk7XG59KTtcbkZvcm1Hcm91cC5kaXNwbGF5TmFtZSA9ICdGb3JtR3JvdXAnO1xuZXhwb3J0IGRlZmF1bHQgRm9ybUdyb3VwOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IENvbCBmcm9tICcuL0NvbCc7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgY29sdW1uOiBmYWxzZSxcbiAgdmlzdWFsbHlIaWRkZW46IGZhbHNlXG59O1xuY29uc3QgRm9ybUxhYmVsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2xhYmVsJyxcbiAgYnNQcmVmaXgsXG4gIGNvbHVtbixcbiAgdmlzdWFsbHlIaWRkZW4sXG4gIGNsYXNzTmFtZSxcbiAgaHRtbEZvcixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWxhYmVsJyk7XG4gIGxldCBjb2x1bW5DbGFzcyA9ICdjb2wtZm9ybS1sYWJlbCc7XG4gIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykgY29sdW1uQ2xhc3MgPSBgJHtjb2x1bW5DbGFzc30gJHtjb2x1bW5DbGFzc30tJHtjb2x1bW59YDtcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgdmlzdWFsbHlIaWRkZW4gJiYgJ3Zpc3VhbGx5LWhpZGRlbicsIGNvbHVtbiAmJiBjb2x1bW5DbGFzcyk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY29udHJvbElkID09IG51bGwgfHwgIWh0bWxGb3IsICdgY29udHJvbElkYCBpcyBpZ25vcmVkIG9uIGA8Rm9ybUxhYmVsPmAgd2hlbiBgaHRtbEZvcmAgaXMgc3BlY2lmaWVkLicpIDogdm9pZCAwO1xuICBodG1sRm9yID0gaHRtbEZvciB8fCBjb250cm9sSWQ7XG4gIGlmIChjb2x1bW4pIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb2wsIHtcbiAgICByZWY6IHJlZixcbiAgICBhczogXCJsYWJlbFwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBodG1sRm9yOiBodG1sRm9yLFxuICAgIC4uLnByb3BzXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWZvciwganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIF9qc3goQ29tcG9uZW50LCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIGh0bWxGb3I6IGh0bWxGb3IsXG4gICAgICAuLi5wcm9wc1xuICAgIH0pXG4gICk7XG59KTtcbkZvcm1MYWJlbC5kaXNwbGF5TmFtZSA9ICdGb3JtTGFiZWwnO1xuRm9ybUxhYmVsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEZvcm1MYWJlbDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1SYW5nZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGlkLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tcmFuZ2UnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiaW5wdXRcIiwgeyAuLi5wcm9wcyxcbiAgICB0eXBlOiBcInJhbmdlXCIsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGlkOiBpZCB8fCBjb250cm9sSWRcbiAgfSk7XG59KTtcbkZvcm1SYW5nZS5kaXNwbGF5TmFtZSA9ICdGb3JtUmFuZ2UnO1xuZXhwb3J0IGRlZmF1bHQgRm9ybVJhbmdlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybVNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBzaXplLFxuICBodG1sU2l6ZSxcbiAgY2xhc3NOYW1lLFxuICBpc1ZhbGlkID0gZmFsc2UsXG4gIGlzSW52YWxpZCA9IGZhbHNlLFxuICBpZCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLXNlbGVjdCcpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJzZWxlY3RcIiwgeyAuLi5wcm9wcyxcbiAgICBzaXplOiBodG1sU2l6ZSxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgc2l6ZSAmJiBgJHtic1ByZWZpeH0tJHtzaXplfWAsIGlzVmFsaWQgJiYgYGlzLXZhbGlkYCwgaXNJbnZhbGlkICYmIGBpcy1pbnZhbGlkYCksXG4gICAgaWQ6IGlkIHx8IGNvbnRyb2xJZFxuICB9KTtcbn0pO1xuRm9ybVNlbGVjdC5kaXNwbGF5TmFtZSA9ICdGb3JtU2VsZWN0JztcbmV4cG9ydCBkZWZhdWx0IEZvcm1TZWxlY3Q7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1UZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbih7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSAnc21hbGwnLFxuICBtdXRlZCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tdGV4dCcpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBtdXRlZCAmJiAndGV4dC1tdXRlZCcpXG4gIH0pO1xufSk7XG5Gb3JtVGV4dC5kaXNwbGF5TmFtZSA9ICdGb3JtVGV4dCc7XG5leHBvcnQgZGVmYXVsdCBGb3JtVGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAnaW1nJ1xuICAgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2UgYXMgZmx1aWQgaW1hZ2UuXG4gICAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2Ugc2hhcGUgYXMgcm91bmRlZC5cbiAgICovXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIGNpcmNsZS5cbiAgICovXG4gIHJvdW5kZWRDaXJjbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIHRodW1ibmFpbC5cbiAgICovXG4gIHRodW1ibmFpbDogUHJvcFR5cGVzLmJvb2xcbn07XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiBmYWxzZSxcbiAgcm91bmRlZDogZmFsc2UsXG4gIHJvdW5kZWRDaXJjbGU6IGZhbHNlLFxuICB0aHVtYm5haWw6IGZhbHNlXG59O1xuY29uc3QgSW1hZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBmbHVpZCxcbiAgcm91bmRlZCxcbiAgcm91bmRlZENpcmNsZSxcbiAgdGh1bWJuYWlsLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnaW1nJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImltZ1wiLCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBqc3gtYTExeS9hbHQtdGV4dFxuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGZsdWlkICYmIGAke2JzUHJlZml4fS1mbHVpZGAsIHJvdW5kZWQgJiYgYHJvdW5kZWRgLCByb3VuZGVkQ2lyY2xlICYmIGByb3VuZGVkLWNpcmNsZWAsIHRodW1ibmFpbCAmJiBgJHtic1ByZWZpeH0tdGh1bWJuYWlsYClcbiAgfSk7XG59KTtcbkltYWdlLmRpc3BsYXlOYW1lID0gJ0ltYWdlJztcbkltYWdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEltYWdlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBGb3JtQ2hlY2tJbnB1dCBmcm9tICcuL0Zvcm1DaGVja0lucHV0JztcbmltcG9ydCBJbnB1dEdyb3VwQ29udGV4dCBmcm9tICcuL0lucHV0R3JvdXBDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBJbnB1dEdyb3VwVGV4dCA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnaW5wdXQtZ3JvdXAtdGV4dCcsIHtcbiAgQ29tcG9uZW50OiAnc3Bhbidcbn0pO1xuXG5jb25zdCBJbnB1dEdyb3VwQ2hlY2tib3ggPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwVGV4dCwge1xuICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRm9ybUNoZWNrSW5wdXQsIHtcbiAgICB0eXBlOiBcImNoZWNrYm94XCIsXG4gICAgLi4ucHJvcHNcbiAgfSlcbn0pO1xuXG5jb25zdCBJbnB1dEdyb3VwUmFkaW8gPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwVGV4dCwge1xuICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRm9ybUNoZWNrSW5wdXQsIHtcbiAgICB0eXBlOiBcInJhZGlvXCIsXG4gICAgLi4ucHJvcHNcbiAgfSlcbn0pO1xuXG4vKipcbiAqXG4gKiBAcHJvcGVydHkge0lucHV0R3JvdXBUZXh0fSBUZXh0XG4gKiBAcHJvcGVydHkge0lucHV0R3JvdXBSYWRpb30gUmFkaW9cbiAqIEBwcm9wZXJ0eSB7SW5wdXRHcm91cENoZWNrYm94fSBDaGVja2JveFxuICovXG5jb25zdCBJbnB1dEdyb3VwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIHNpemUsXG4gIGhhc1ZhbGlkYXRpb24sXG4gIGNsYXNzTmFtZSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdpbnB1dC1ncm91cCcpOyAvLyBJbnRlbnRpb25hbGx5IGFuIGVtcHR5IG9iamVjdC4gVXNlZCBpbiBkZXRlY3RpbmcgaWYgYSBkcm9wZG93blxuICAvLyBleGlzdHMgdW5kZXIgYW4gaW5wdXQgZ3JvdXAuXG5cbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiAoe30pLCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBzaXplICYmIGAke2JzUHJlZml4fS0ke3NpemV9YCwgaGFzVmFsaWRhdGlvbiAmJiAnaGFzLXZhbGlkYXRpb24nKVxuICAgIH0pXG4gIH0pO1xufSk7XG5JbnB1dEdyb3VwLmRpc3BsYXlOYW1lID0gJ0lucHV0R3JvdXAnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihJbnB1dEdyb3VwLCB7XG4gIFRleHQ6IElucHV0R3JvdXBUZXh0LFxuICBSYWRpbzogSW5wdXRHcm91cFJhZGlvLFxuICBDaGVja2JveDogSW5wdXRHcm91cENoZWNrYm94XG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBjb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb250ZXh0LmRpc3BsYXlOYW1lID0gJ0lucHV0R3JvdXBDb250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBCYXNlTmF2IGZyb20gJ0ByZXN0YXJ0L3VpL05hdic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IExpc3RHcm91cEl0ZW0gZnJvbSAnLi9MaXN0R3JvdXBJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBMaXN0R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGJzUHJlZml4OiBpbml0aWFsQnNQcmVmaXgsXG4gICAgdmFyaWFudCxcbiAgICBob3Jpem9udGFsLFxuICAgIG51bWJlcmVkLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhcyA9ICdkaXYnLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICdsaXN0LWdyb3VwJyk7XG4gIGxldCBob3Jpem9udGFsVmFyaWFudDtcblxuICBpZiAoaG9yaXpvbnRhbCkge1xuICAgIGhvcml6b250YWxWYXJpYW50ID0gaG9yaXpvbnRhbCA9PT0gdHJ1ZSA/ICdob3Jpem9udGFsJyA6IGBob3Jpem9udGFsLSR7aG9yaXpvbnRhbH1gO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGhvcml6b250YWwgJiYgdmFyaWFudCA9PT0gJ2ZsdXNoJyksICdgdmFyaWFudD1cImZsdXNoXCJgIGFuZCBgaG9yaXpvbnRhbGAgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLicpIDogdm9pZCAwO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQmFzZU5hdiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wcyxcbiAgICBhczogYXMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgsIHZhcmlhbnQgJiYgYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gLCBob3Jpem9udGFsVmFyaWFudCAmJiBgJHtic1ByZWZpeH0tJHtob3Jpem9udGFsVmFyaWFudH1gLCBudW1iZXJlZCAmJiBgJHtic1ByZWZpeH0tbnVtYmVyZWRgKVxuICB9KTtcbn0pO1xuTGlzdEdyb3VwLmRpc3BsYXlOYW1lID0gJ0xpc3RHcm91cCc7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKExpc3RHcm91cCwge1xuICBJdGVtOiBMaXN0R3JvdXBJdGVtXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHsgdXNlTmF2SXRlbSB9IGZyb20gJ0ByZXN0YXJ0L3VpL05hdkl0ZW0nO1xuaW1wb3J0IHsgbWFrZUV2ZW50S2V5IH0gZnJvbSAnQHJlc3RhcnQvdWkvU2VsZWN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBMaXN0R3JvdXBJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGFjdGl2ZSxcbiAgZGlzYWJsZWQsXG4gIGV2ZW50S2V5LFxuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIGFjdGlvbixcbiAgYXMsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdsaXN0LWdyb3VwLWl0ZW0nKTtcbiAgY29uc3QgW25hdkl0ZW1Qcm9wcywgbWV0YV0gPSB1c2VOYXZJdGVtKHtcbiAgICBrZXk6IG1ha2VFdmVudEtleShldmVudEtleSwgcHJvcHMuaHJlZiksXG4gICAgYWN0aXZlLFxuICAgIC4uLnByb3BzXG4gIH0pO1xuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUV2ZW50Q2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5hdkl0ZW1Qcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgfSk7XG5cbiAgaWYgKGRpc2FibGVkICYmIHByb3BzLnRhYkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50YWJJbmRleCA9IC0xO1xuICAgIHByb3BzWydhcmlhLWRpc2FibGVkJ10gPSB0cnVlO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuXG5cbiAgY29uc3QgQ29tcG9uZW50ID0gYXMgfHwgKGFjdGlvbiA/IHByb3BzLmhyZWYgPyAnYScgOiAnYnV0dG9uJyA6ICdkaXYnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIC4uLm5hdkl0ZW1Qcm9wcyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgbWV0YS5pc0FjdGl2ZSAmJiAnYWN0aXZlJywgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJywgdmFyaWFudCAmJiBgJHtic1ByZWZpeH0tJHt2YXJpYW50fWAsIGFjdGlvbiAmJiBgJHtic1ByZWZpeH0tYWN0aW9uYClcbiAgfSk7XG59KTtcbkxpc3RHcm91cEl0ZW0uZGlzcGxheU5hbWUgPSAnTGlzdEdyb3VwSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBMaXN0R3JvdXBJdGVtOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSAnZG9tLWhlbHBlcnMvYWRkRXZlbnRMaXN0ZW5lcic7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5pbXBvcnQgb3duZXJEb2N1bWVudCBmcm9tICdkb20taGVscGVycy9vd25lckRvY3VtZW50JztcbmltcG9ydCByZW1vdmVFdmVudExpc3RlbmVyIGZyb20gJ2RvbS1oZWxwZXJzL3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IGdldFNjcm9sbGJhclNpemUgZnJvbSAnZG9tLWhlbHBlcnMvc2Nyb2xsYmFyU2l6ZSc7XG5pbXBvcnQgdXNlQ2FsbGJhY2tSZWYgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlQ2FsbGJhY2tSZWYnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCB1c2VXaWxsVW5tb3VudCBmcm9tICdAcmVzdGFydC9ob29rcy91c2VXaWxsVW5tb3VudCc7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZCBmcm9tICdkb20taGVscGVycy90cmFuc2l0aW9uRW5kJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJhc2VNb2RhbCBmcm9tICdAcmVzdGFydC91aS9Nb2RhbCc7XG5pbXBvcnQgeyBnZXRTaGFyZWRNYW5hZ2VyIH0gZnJvbSAnLi9Cb290c3RyYXBNb2RhbE1hbmFnZXInO1xuaW1wb3J0IEZhZGUgZnJvbSAnLi9GYWRlJztcbmltcG9ydCBNb2RhbEJvZHkgZnJvbSAnLi9Nb2RhbEJvZHknO1xuaW1wb3J0IE1vZGFsQ29udGV4dCBmcm9tICcuL01vZGFsQ29udGV4dCc7XG5pbXBvcnQgTW9kYWxEaWFsb2cgZnJvbSAnLi9Nb2RhbERpYWxvZyc7XG5pbXBvcnQgTW9kYWxGb290ZXIgZnJvbSAnLi9Nb2RhbEZvb3Rlcic7XG5pbXBvcnQgTW9kYWxIZWFkZXIgZnJvbSAnLi9Nb2RhbEhlYWRlcic7XG5pbXBvcnQgTW9kYWxUaXRsZSBmcm9tICcuL01vZGFsVGl0bGUnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4LCB1c2VJc1JUTCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZSxcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBhdXRvRm9jdXM6IHRydWUsXG4gIGVuZm9yY2VGb2N1czogdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICBhbmltYXRpb246IHRydWUsXG4gIGRpYWxvZ0FzOiBNb2RhbERpYWxvZ1xufTtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lLCByZWFjdC9uby1tdWx0aS1jb21wICovXG5cbmZ1bmN0aW9uIERpYWxvZ1RyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHMsXG4gICAgdGltZW91dDogbnVsbFxuICB9KTtcbn1cblxuZnVuY3Rpb24gQmFja2Ryb3BUcmFuc2l0aW9uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChGYWRlLCB7IC4uLnByb3BzLFxuICAgIHRpbWVvdXQ6IG51bGxcbiAgfSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5cblxuY29uc3QgTW9kYWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBzdHlsZSxcbiAgZGlhbG9nQ2xhc3NOYW1lLFxuICBjb250ZW50Q2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgZGlhbG9nQXM6IERpYWxvZyxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IGFyaWFMYWJlbGxlZGJ5LFxuXG4gIC8qIEJhc2VNb2RhbCBwcm9wcyAqL1xuICBzaG93LFxuICBhbmltYXRpb24sXG4gIGJhY2tkcm9wLFxuICBrZXlib2FyZCxcbiAgb25Fc2NhcGVLZXlEb3duLFxuICBvblNob3csXG4gIG9uSGlkZSxcbiAgY29udGFpbmVyLFxuICBhdXRvRm9jdXMsXG4gIGVuZm9yY2VGb2N1cyxcbiAgcmVzdG9yZUZvY3VzLFxuICByZXN0b3JlRm9jdXNPcHRpb25zLFxuICBvbkVudGVyZWQsXG4gIG9uRXhpdCxcbiAgb25FeGl0aW5nLFxuICBvbkVudGVyLFxuICBvbkVudGVyaW5nLFxuICBvbkV4aXRlZCxcbiAgYmFja2Ryb3BDbGFzc05hbWUsXG4gIG1hbmFnZXI6IHByb3BzTWFuYWdlcixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBbbW9kYWxTdHlsZSwgc2V0U3R5bGVdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbYW5pbWF0ZVN0YXRpY01vZGFsLCBzZXRBbmltYXRlU3RhdGljTW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB3YWl0aW5nRm9yTW91c2VVcFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCByZW1vdmVTdGF0aWNNb2RhbEFuaW1hdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW21vZGFsLCBzZXRNb2RhbFJlZl0gPSB1c2VDYWxsYmFja1JlZigpO1xuICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWZzKHJlZiwgc2V0TW9kYWxSZWYpO1xuICBjb25zdCBoYW5kbGVIaWRlID0gdXNlRXZlbnRDYWxsYmFjayhvbkhpZGUpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbW9kYWwnKTtcbiAgY29uc3QgbW9kYWxDb250ZXh0ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIG9uSGlkZTogaGFuZGxlSGlkZVxuICB9KSwgW2hhbmRsZUhpZGVdKTtcblxuICBmdW5jdGlvbiBnZXRNb2RhbE1hbmFnZXIoKSB7XG4gICAgaWYgKHByb3BzTWFuYWdlcikgcmV0dXJuIHByb3BzTWFuYWdlcjtcbiAgICByZXR1cm4gZ2V0U2hhcmVkTWFuYWdlcih7XG4gICAgICBpc1JUTFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRGlhbG9nU3R5bGUobm9kZSkge1xuICAgIGlmICghY2FuVXNlRE9NKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVySXNPdmVyZmxvd2luZyA9IGdldE1vZGFsTWFuYWdlcigpLmdldFNjcm9sbGJhcldpZHRoKCkgPiAwO1xuICAgIGNvbnN0IG1vZGFsSXNPdmVyZmxvd2luZyA9IG5vZGUuc2Nyb2xsSGVpZ2h0ID4gb3duZXJEb2N1bWVudChub2RlKS5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHNldFN0eWxlKHtcbiAgICAgIHBhZGRpbmdSaWdodDogY29udGFpbmVySXNPdmVyZmxvd2luZyAmJiAhbW9kYWxJc092ZXJmbG93aW5nID8gZ2V0U2Nyb2xsYmFyU2l6ZSgpIDogdW5kZWZpbmVkLFxuICAgICAgcGFkZGluZ0xlZnQ6ICFjb250YWluZXJJc092ZXJmbG93aW5nICYmIG1vZGFsSXNPdmVyZmxvd2luZyA/IGdldFNjcm9sbGJhclNpemUoKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlV2luZG93UmVzaXplID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG1vZGFsKSB7XG4gICAgICB1cGRhdGVEaWFsb2dTdHlsZShtb2RhbC5kaWFsb2cpO1xuICAgIH1cbiAgfSk7XG4gIHVzZVdpbGxVbm1vdW50KCgpID0+IHtcbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCgpO1xuICB9KTsgLy8gV2UgcHJldmVudCB0aGUgbW9kYWwgZnJvbSBjbG9zaW5nIGR1cmluZyBhIGRyYWcgYnkgZGV0ZWN0aW5nIHdoZXJlIHRoZVxuICAvLyB0aGUgY2xpY2sgb3JpZ2luYXRlcyBmcm9tLiBJZiBpdCBzdGFydHMgaW4gdGhlIG1vZGFsIGFuZCB0aGVuIGVuZHMgb3V0c2lkZVxuICAvLyBkb24ndCBjbG9zZS5cblxuICBjb25zdCBoYW5kbGVEaWFsb2dNb3VzZURvd24gPSAoKSA9PiB7XG4gICAgd2FpdGluZ0Zvck1vdXNlVXBSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTW91c2VVcCA9IGUgPT4ge1xuICAgIGlmICh3YWl0aW5nRm9yTW91c2VVcFJlZi5jdXJyZW50ICYmIG1vZGFsICYmIGUudGFyZ2V0ID09PSBtb2RhbC5kaWFsb2cpIHtcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgd2FpdGluZ0Zvck1vdXNlVXBSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN0YXRpY01vZGFsQW5pbWF0aW9uID0gKCkgPT4ge1xuICAgIHNldEFuaW1hdGVTdGF0aWNNb2RhbCh0cnVlKTtcbiAgICByZW1vdmVTdGF0aWNNb2RhbEFuaW1hdGlvblJlZi5jdXJyZW50ID0gdHJhbnNpdGlvbkVuZChtb2RhbC5kaWFsb2csICgpID0+IHtcbiAgICAgIHNldEFuaW1hdGVTdGF0aWNNb2RhbChmYWxzZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3RhdGljQmFja2Ryb3BDbGljayA9IGUgPT4ge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFuZGxlU3RhdGljTW9kYWxBbmltYXRpb24oKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IGUgPT4ge1xuICAgIGlmIChiYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGhhbmRsZVN0YXRpY0JhY2tkcm9wQ2xpY2soZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYuY3VycmVudCB8fCBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvbkhpZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uSGlkZSgpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVzY2FwZUtleURvd24gPSBlID0+IHtcbiAgICBpZiAoIWtleWJvYXJkICYmIGJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgLy8gQ2FsbCBwcmV2ZW50RGVmYXVsdCB0byBzdG9wIG1vZGFsIGZyb20gY2xvc2luZyBpbiByZXN0YXJ0IHVpLFxuICAgICAgLy8gdGhlbiBwbGF5IG91ciBhbmltYXRpb24uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBoYW5kbGVTdGF0aWNNb2RhbEFuaW1hdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoa2V5Ym9hcmQgJiYgb25Fc2NhcGVLZXlEb3duKSB7XG4gICAgICBvbkVzY2FwZUtleURvd24oZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB1cGRhdGVEaWFsb2dTdHlsZShub2RlKTtcbiAgICB9XG5cbiAgICBvbkVudGVyID09IG51bGwgPyB2b2lkIDAgOiBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVFeGl0ID0gbm9kZSA9PiB7XG4gICAgcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCgpO1xuICAgIG9uRXhpdCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0KG5vZGUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyaW5nID0gKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgb25FbnRlcmluZyA9PSBudWxsID8gdm9pZCAwIDogb25FbnRlcmluZyhub2RlLCBpc0FwcGVhcmluZyk7IC8vIEZJWE1FOiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gd2hlbiBhbmltYXRpb24gaXMgZGlzYWJsZWQuXG5cbiAgICBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRXhpdGVkID0gbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUpIG5vZGUuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBSSEwgcmVtb3ZlcyBpdCBzb21ldGltZXNcblxuICAgIG9uRXhpdGVkID09IG51bGwgPyB2b2lkIDAgOiBvbkV4aXRlZChub2RlKTsgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHdvcmsgZXZlbiB3aGVuIGFuaW1hdGlvbiBpcyBkaXNhYmxlZC5cblxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCAncmVzaXplJywgaGFuZGxlV2luZG93UmVzaXplKTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJCYWNrZHJvcCA9IHVzZUNhbGxiYWNrKGJhY2tkcm9wUHJvcHMgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5iYWNrZHJvcFByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtic1ByZWZpeH0tYmFja2Ryb3BgLCBiYWNrZHJvcENsYXNzTmFtZSwgIWFuaW1hdGlvbiAmJiAnc2hvdycpXG4gIH0pLCBbYW5pbWF0aW9uLCBiYWNrZHJvcENsYXNzTmFtZSwgYnNQcmVmaXhdKTtcbiAgY29uc3QgYmFzZU1vZGFsU3R5bGUgPSB7IC4uLnN0eWxlLFxuICAgIC4uLm1vZGFsU3R5bGVcbiAgfTsgLy8gU2V0cyBgZGlzcGxheWAgYWx3YXlzIGJsb2NrIHdoZW4gYGFuaW1hdGlvbmAgaXMgZmFsc2VcblxuICBpZiAoIWFuaW1hdGlvbikge1xuICAgIGJhc2VNb2RhbFN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgY29uc3QgcmVuZGVyRGlhbG9nID0gZGlhbG9nUHJvcHMgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgLi4uZGlhbG9nUHJvcHMsXG4gICAgc3R5bGU6IGJhc2VNb2RhbFN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBhbmltYXRlU3RhdGljTW9kYWwgJiYgYCR7YnNQcmVmaXh9LXN0YXRpY2ApLFxuICAgIG9uQ2xpY2s6IGJhY2tkcm9wID8gaGFuZGxlQ2xpY2sgOiB1bmRlZmluZWQsXG4gICAgb25Nb3VzZVVwOiBoYW5kbGVNb3VzZVVwLFxuICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGFyaWFMYWJlbGxlZGJ5LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChEaWFsb2csIHsgLi4ucHJvcHMsXG4gICAgICBvbk1vdXNlRG93bjogaGFuZGxlRGlhbG9nTW91c2VEb3duLFxuICAgICAgY2xhc3NOYW1lOiBkaWFsb2dDbGFzc05hbWUsXG4gICAgICBjb250ZW50Q2xhc3NOYW1lOiBjb250ZW50Q2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE1vZGFsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBtb2RhbENvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEJhc2VNb2RhbCwge1xuICAgICAgc2hvdzogc2hvdyxcbiAgICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgICAgYmFja2Ryb3A6IGJhY2tkcm9wLFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBrZXlib2FyZDogdHJ1ZSAvLyBBbHdheXMgc2V0IHRydWUgLSBzZWUgaGFuZGxlRXNjYXBlS2V5RG93blxuICAgICAgLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBlbmZvcmNlRm9jdXM6IGVuZm9yY2VGb2N1cyxcbiAgICAgIHJlc3RvcmVGb2N1czogcmVzdG9yZUZvY3VzLFxuICAgICAgcmVzdG9yZUZvY3VzT3B0aW9uczogcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgICAgIG9uRXNjYXBlS2V5RG93bjogaGFuZGxlRXNjYXBlS2V5RG93bixcbiAgICAgIG9uU2hvdzogb25TaG93LFxuICAgICAgb25IaWRlOiBvbkhpZGUsXG4gICAgICBvbkVudGVyOiBoYW5kbGVFbnRlcixcbiAgICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgICBvbkV4aXRpbmc6IG9uRXhpdGluZyxcbiAgICAgIG9uRXhpdGVkOiBoYW5kbGVFeGl0ZWQsXG4gICAgICBtYW5hZ2VyOiBnZXRNb2RhbE1hbmFnZXIoKSxcbiAgICAgIHRyYW5zaXRpb246IGFuaW1hdGlvbiA/IERpYWxvZ1RyYW5zaXRpb24gOiB1bmRlZmluZWQsXG4gICAgICBiYWNrZHJvcFRyYW5zaXRpb246IGFuaW1hdGlvbiA/IEJhY2tkcm9wVHJhbnNpdGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgIHJlbmRlckJhY2tkcm9wOiByZW5kZXJCYWNrZHJvcCxcbiAgICAgIHJlbmRlckRpYWxvZzogcmVuZGVyRGlhbG9nXG4gICAgfSlcbiAgfSk7XG59KTtcbk1vZGFsLmRpc3BsYXlOYW1lID0gJ01vZGFsJztcbk1vZGFsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTW9kYWwsIHtcbiAgQm9keTogTW9kYWxCb2R5LFxuICBIZWFkZXI6IE1vZGFsSGVhZGVyLFxuICBUaXRsZTogTW9kYWxUaXRsZSxcbiAgRm9vdGVyOiBNb2RhbEZvb3RlcixcbiAgRGlhbG9nOiBNb2RhbERpYWxvZyxcbiAgVFJBTlNJVElPTl9EVVJBVElPTjogMzAwLFxuICBCQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OOiAxNTBcbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdtb2RhbC1ib2R5Jyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgTW9kYWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSGlkZSgpIHt9XG5cbn0pO1xuZXhwb3J0IGRlZmF1bHQgTW9kYWxDb250ZXh0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBNb2RhbERpYWxvZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNvbnRlbnRDbGFzc05hbWUsXG4gIGNlbnRlcmVkLFxuICBzaXplLFxuICBmdWxsc2NyZWVuLFxuICBjaGlsZHJlbixcbiAgc2Nyb2xsYWJsZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ21vZGFsJyk7XG4gIGNvbnN0IGRpYWxvZ0NsYXNzID0gYCR7YnNQcmVmaXh9LWRpYWxvZ2A7XG4gIGNvbnN0IGZ1bGxTY3JlZW5DbGFzcyA9IHR5cGVvZiBmdWxsc2NyZWVuID09PSAnc3RyaW5nJyA/IGAke2JzUHJlZml4fS1mdWxsc2NyZWVuLSR7ZnVsbHNjcmVlbn1gIDogYCR7YnNQcmVmaXh9LWZ1bGxzY3JlZW5gO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZGlhbG9nQ2xhc3MsIGNsYXNzTmFtZSwgc2l6ZSAmJiBgJHtic1ByZWZpeH0tJHtzaXplfWAsIGNlbnRlcmVkICYmIGAke2RpYWxvZ0NsYXNzfS1jZW50ZXJlZGAsIHNjcm9sbGFibGUgJiYgYCR7ZGlhbG9nQ2xhc3N9LXNjcm9sbGFibGVgLCBmdWxsc2NyZWVuICYmIGZ1bGxTY3JlZW5DbGFzcyksXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtic1ByZWZpeH0tY29udGVudGAsIGNvbnRlbnRDbGFzc05hbWUpLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbk1vZGFsRGlhbG9nLmRpc3BsYXlOYW1lID0gJ01vZGFsRGlhbG9nJztcbmV4cG9ydCBkZWZhdWx0IE1vZGFsRGlhbG9nOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdtb2RhbC1mb290ZXInKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQWJzdHJhY3RNb2RhbEhlYWRlciBmcm9tICcuL0Fic3RyYWN0TW9kYWxIZWFkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgY2xvc2VMYWJlbDogJ0Nsb3NlJyxcbiAgY2xvc2VCdXR0b246IGZhbHNlXG59O1xuY29uc3QgTW9kYWxIZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbW9kYWwtaGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChBYnN0cmFjdE1vZGFsSGVhZGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpXG4gIH0pO1xufSk7XG5Nb2RhbEhlYWRlci5kaXNwbGF5TmFtZSA9ICdNb2RhbEhlYWRlcic7XG5Nb2RhbEhlYWRlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBNb2RhbEhlYWRlcjsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmltcG9ydCBkaXZXaXRoQ2xhc3NOYW1lIGZyb20gJy4vZGl2V2l0aENsYXNzTmFtZSc7XG5jb25zdCBEaXZTdHlsZWRBc0g0ID0gZGl2V2l0aENsYXNzTmFtZSgnaDQnKTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgnbW9kYWwtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINFxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgYWxsIGZyb20gJ3Byb3AtdHlwZXMtZXh0cmEvbGliL2FsbCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IEJhc2VOYXYgZnJvbSAnQHJlc3RhcnQvdWkvTmF2JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IENhcmRIZWFkZXJDb250ZXh0IGZyb20gJy4vQ2FyZEhlYWRlckNvbnRleHQnO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCBOYXZMaW5rIGZyb20gJy4vTmF2TGluayc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBqdXN0aWZ5OiBmYWxzZSxcbiAgZmlsbDogZmFsc2Vcbn07XG5jb25zdCBOYXYgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigodW5jb250cm9sbGVkUHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYXMgPSAnZGl2JyxcbiAgICBic1ByZWZpeDogaW5pdGlhbEJzUHJlZml4LFxuICAgIHZhcmlhbnQsXG4gICAgZmlsbCxcbiAgICBqdXN0aWZ5LFxuICAgIG5hdmJhcixcbiAgICBuYXZiYXJTY3JvbGwsXG4gICAgY2xhc3NOYW1lLFxuICAgIGFjdGl2ZUtleSxcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHVuY29udHJvbGxlZFByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXYnKTtcbiAgbGV0IG5hdmJhckJzUHJlZml4O1xuICBsZXQgY2FyZEhlYWRlckJzUHJlZml4O1xuICBsZXQgaXNOYXZiYXIgPSBmYWxzZTtcbiAgY29uc3QgbmF2YmFyQ29udGV4dCA9IHVzZUNvbnRleHQoTmF2YmFyQ29udGV4dCk7XG4gIGNvbnN0IGNhcmRIZWFkZXJDb250ZXh0ID0gdXNlQ29udGV4dChDYXJkSGVhZGVyQ29udGV4dCk7XG5cbiAgaWYgKG5hdmJhckNvbnRleHQpIHtcbiAgICBuYXZiYXJCc1ByZWZpeCA9IG5hdmJhckNvbnRleHQuYnNQcmVmaXg7XG4gICAgaXNOYXZiYXIgPSBuYXZiYXIgPT0gbnVsbCA/IHRydWUgOiBuYXZiYXI7XG4gIH0gZWxzZSBpZiAoY2FyZEhlYWRlckNvbnRleHQpIHtcbiAgICAoe1xuICAgICAgY2FyZEhlYWRlckJzUHJlZml4XG4gICAgfSA9IGNhcmRIZWFkZXJDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChCYXNlTmF2LCB7XG4gICAgYXM6IGFzLFxuICAgIHJlZjogcmVmLFxuICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHtcbiAgICAgIFtic1ByZWZpeF06ICFpc05hdmJhcixcbiAgICAgIFtgJHtuYXZiYXJCc1ByZWZpeH0tbmF2YF06IGlzTmF2YmFyLFxuICAgICAgW2Ake25hdmJhckJzUHJlZml4fS1uYXYtc2Nyb2xsYF06IGlzTmF2YmFyICYmIG5hdmJhclNjcm9sbCxcbiAgICAgIFtgJHtjYXJkSGVhZGVyQnNQcmVmaXh9LSR7dmFyaWFudH1gXTogISFjYXJkSGVhZGVyQnNQcmVmaXgsXG4gICAgICBbYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gXTogISF2YXJpYW50LFxuICAgICAgW2Ake2JzUHJlZml4fS1maWxsYF06IGZpbGwsXG4gICAgICBbYCR7YnNQcmVmaXh9LWp1c3RpZmllZGBdOiBqdXN0aWZ5XG4gICAgfSksXG4gICAgLi4ucHJvcHNcbiAgfSk7XG59KTtcbk5hdi5kaXNwbGF5TmFtZSA9ICdOYXYnO1xuTmF2LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2LCB7XG4gIEl0ZW06IE5hdkl0ZW0sXG4gIExpbms6IE5hdkxpbmtcbn0pOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuL0Ryb3Bkb3duJztcbmltcG9ydCBOYXZMaW5rIGZyb20gJy4vTmF2TGluayc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2RHJvcGRvd24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBpZCxcbiAgdGl0bGUsXG4gIGNoaWxkcmVuLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICByb290Q2xvc2VFdmVudCxcbiAgbWVudVJvbGUsXG4gIGRpc2FibGVkLFxuICBhY3RpdmUsXG4gIHJlbmRlck1lbnVPbk1vdW50LFxuICBtZW51VmFyaWFudCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICAvKiBOYXZJdGVtIGhhcyBubyBhZGRpdGlvbmFsIGxvZ2ljLCBpdCdzIHB1cmVseSBwcmVzZW50YXRpb25hbC4gQ2FuIHNldCBuYXYgaXRlbSBjbGFzcyBoZXJlIHRvIHN1cHBvcnQgXCJhc1wiICovXG4gIGNvbnN0IG5hdkl0ZW1QcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgodW5kZWZpbmVkLCAnbmF2LWl0ZW0nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhEcm9wZG93biwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG5hdkl0ZW1QcmVmaXgpLFxuICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goRHJvcGRvd24uVG9nZ2xlLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBldmVudEtleTogbnVsbCxcbiAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgY2hpbGRCc1ByZWZpeDogYnNQcmVmaXgsXG4gICAgICBhczogTmF2TGluayxcbiAgICAgIGNoaWxkcmVuOiB0aXRsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5NZW51LCB7XG4gICAgICByb2xlOiBtZW51Um9sZSxcbiAgICAgIHJlbmRlck9uTW91bnQ6IHJlbmRlck1lbnVPbk1vdW50LFxuICAgICAgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50LFxuICAgICAgdmFyaWFudDogbWVudVZhcmlhbnQsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KV1cbiAgfSk7XG59KTtcbk5hdkRyb3Bkb3duLmRpc3BsYXlOYW1lID0gJ05hdkRyb3Bkb3duJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2RHJvcGRvd24sIHtcbiAgSXRlbTogRHJvcGRvd24uSXRlbSxcbiAgSXRlbVRleHQ6IERyb3Bkb3duLkl0ZW1UZXh0LFxuICBEaXZpZGVyOiBEcm9wZG93bi5EaXZpZGVyLFxuICBIZWFkZXI6IERyb3Bkb3duLkhlYWRlclxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ25hdi1pdGVtJyk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJ0ByZXN0YXJ0L3VpL0FuY2hvcic7XG5pbXBvcnQgeyB1c2VOYXZJdGVtIH0gZnJvbSAnQHJlc3RhcnQvdWkvTmF2SXRlbSc7XG5pbXBvcnQgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICdAcmVzdGFydC91aS9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuY29uc3QgTmF2TGluayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSBBbmNob3IsXG4gIGFjdGl2ZSxcbiAgZXZlbnRLZXksXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXYtbGluaycpO1xuICBjb25zdCBbbmF2SXRlbVByb3BzLCBtZXRhXSA9IHVzZU5hdkl0ZW0oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBwcm9wcy5ocmVmKSxcbiAgICBhY3RpdmUsXG4gICAgLi4ucHJvcHNcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgLi4ubmF2SXRlbVByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBwcm9wcy5kaXNhYmxlZCAmJiAnZGlzYWJsZWQnLCBtZXRhLmlzQWN0aXZlICYmICdhY3RpdmUnKVxuICB9KTtcbn0pO1xuTmF2TGluay5kaXNwbGF5TmFtZSA9ICdOYXZMaW5rJztcbk5hdkxpbmsuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgTmF2TGluazsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNlbGVjdGFibGVDb250ZXh0IGZyb20gJ0ByZXN0YXJ0L3VpL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IE5hdmJhckJyYW5kIGZyb20gJy4vTmF2YmFyQnJhbmQnO1xuaW1wb3J0IE5hdmJhckNvbGxhcHNlIGZyb20gJy4vTmF2YmFyQ29sbGFwc2UnO1xuaW1wb3J0IE5hdmJhclRvZ2dsZSBmcm9tICcuL05hdmJhclRvZ2dsZSc7XG5pbXBvcnQgTmF2YmFyT2ZmY2FudmFzIGZyb20gJy4vTmF2YmFyT2ZmY2FudmFzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhclRleHQgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ25hdmJhci10ZXh0Jywge1xuICBDb21wb25lbnQ6ICdzcGFuJ1xufSk7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGV4cGFuZDogdHJ1ZSxcbiAgdmFyaWFudDogJ2xpZ2h0JyxcbiAgY29sbGFwc2VPblNlbGVjdDogZmFsc2Vcbn07XG5jb25zdCBOYXZiYXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYnNQcmVmaXg6IGluaXRpYWxCc1ByZWZpeCxcbiAgICBleHBhbmQsXG4gICAgdmFyaWFudCxcbiAgICBiZyxcbiAgICBmaXhlZCxcbiAgICBzdGlja3ksXG4gICAgY2xhc3NOYW1lLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ25hdicsXG4gICAgZXhwYW5kZWQsXG4gICAgb25Ub2dnbGUsXG4gICAgb25TZWxlY3QsXG4gICAgY29sbGFwc2VPblNlbGVjdCxcbiAgICAuLi5jb250cm9sbGVkUHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwcm9wcywge1xuICAgIGV4cGFuZGVkOiAnb25Ub2dnbGUnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXZiYXInKTtcbiAgY29uc3QgaGFuZGxlQ29sbGFwc2UgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIG9uU2VsZWN0ID09IG51bGwgPyB2b2lkIDAgOiBvblNlbGVjdCguLi5hcmdzKTtcblxuICAgIGlmIChjb2xsYXBzZU9uU2VsZWN0ICYmIGV4cGFuZGVkKSB7XG4gICAgICBvblRvZ2dsZSA9PSBudWxsID8gdm9pZCAwIDogb25Ub2dnbGUoZmFsc2UpO1xuICAgIH1cbiAgfSwgW29uU2VsZWN0LCBjb2xsYXBzZU9uU2VsZWN0LCBleHBhbmRlZCwgb25Ub2dnbGVdKTsgLy8gd2lsbCByZXN1bHQgaW4gc29tZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHRoYXQgc2VlbXMgYmV0dGVyXG4gIC8vIHRoYW4gZmFsc2UgbmVnYXRpdmVzLiBzdHJpY3QgYHVuZGVmaW5lZGAgY2hlY2sgYWxsb3dzIGV4cGxpY2l0XG4gIC8vIFwibnVsbGluZ1wiIG9mIHRoZSByb2xlIGlmIHRoZSB1c2VyIHJlYWxseSBkb2Vzbid0IHdhbnQgb25lXG5cbiAgaWYgKGNvbnRyb2xsZWRQcm9wcy5yb2xlID09PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSAnbmF2Jykge1xuICAgIGNvbnRyb2xsZWRQcm9wcy5yb2xlID0gJ25hdmlnYXRpb24nO1xuICB9XG5cbiAgbGV0IGV4cGFuZENsYXNzID0gYCR7YnNQcmVmaXh9LWV4cGFuZGA7XG4gIGlmICh0eXBlb2YgZXhwYW5kID09PSAnc3RyaW5nJykgZXhwYW5kQ2xhc3MgPSBgJHtleHBhbmRDbGFzc30tJHtleHBhbmR9YDtcbiAgY29uc3QgbmF2YmFyQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBvblRvZ2dsZTogKCkgPT4gb25Ub2dnbGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG9nZ2xlKCFleHBhbmRlZCksXG4gICAgYnNQcmVmaXgsXG4gICAgZXhwYW5kZWQ6ICEhZXhwYW5kZWRcbiAgfSksIFtic1ByZWZpeCwgZXhwYW5kZWQsIG9uVG9nZ2xlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChOYXZiYXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG5hdmJhckNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogaGFuZGxlQ29sbGFwc2UsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgICAgIHJlZjogcmVmLFxuICAgICAgICAuLi5jb250cm9sbGVkUHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBleHBhbmQgJiYgZXhwYW5kQ2xhc3MsIHZhcmlhbnQgJiYgYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gLCBiZyAmJiBgYmctJHtiZ31gLCBzdGlja3kgJiYgYHN0aWNreS0ke3N0aWNreX1gLCBmaXhlZCAmJiBgZml4ZWQtJHtmaXhlZH1gKVxuICAgICAgfSlcbiAgICB9KVxuICB9KTtcbn0pO1xuTmF2YmFyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk5hdmJhci5kaXNwbGF5TmFtZSA9ICdOYXZiYXInO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihOYXZiYXIsIHtcbiAgQnJhbmQ6IE5hdmJhckJyYW5kLFxuICBDb2xsYXBzZTogTmF2YmFyQ29sbGFwc2UsXG4gIE9mZmNhbnZhczogTmF2YmFyT2ZmY2FudmFzLFxuICBUZXh0OiBOYXZiYXJUZXh0LFxuICBUb2dnbGU6IE5hdmJhclRvZ2dsZVxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhckJyYW5kID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYXMsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXZiYXItYnJhbmQnKTtcbiAgY29uc3QgQ29tcG9uZW50ID0gYXMgfHwgKHByb3BzLmhyZWYgPyAnYScgOiAnc3BhbicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KVxuICB9KTtcbn0pO1xuTmF2YmFyQnJhbmQuZGlzcGxheU5hbWUgPSAnTmF2YmFyQnJhbmQnO1xuZXhwb3J0IGRlZmF1bHQgTmF2YmFyQnJhbmQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhckNvbGxhcHNlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2hpbGRyZW4sXG4gIGJzUHJlZml4LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbmF2YmFyLWNvbGxhcHNlJyk7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE5hdmJhckNvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29sbGFwc2UsIHtcbiAgICBpbjogISEoY29udGV4dCAmJiBjb250ZXh0LmV4cGFuZGVkKSxcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICBjbGFzc05hbWU6IGJzUHJlZml4LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbk5hdmJhckNvbGxhcHNlLmRpc3BsYXlOYW1lID0gJ05hdmJhckNvbGxhcHNlJztcbmV4cG9ydCBkZWZhdWx0IE5hdmJhckNvbGxhcHNlOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8gVE9ETzogY2hlY2tcblxuY29uc3QgY29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29udGV4dC5kaXNwbGF5TmFtZSA9ICdOYXZiYXJDb250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPZmZjYW52YXMgZnJvbSAnLi9PZmZjYW52YXMnO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBOYXZiYXJPZmZjYW52YXMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE9mZmNhbnZhcywge1xuICAgIHJlZjogcmVmLFxuICAgIHNob3c6ICEhKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmV4cGFuZGVkKSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuTmF2YmFyT2ZmY2FudmFzLmRpc3BsYXlOYW1lID0gJ05hdmJhck9mZmNhbnZhcyc7XG5leHBvcnQgZGVmYXVsdCBOYXZiYXJPZmZjYW52YXM7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGxhYmVsOiAnVG9nZ2xlIG5hdmlnYXRpb24nXG59O1xuY29uc3QgTmF2YmFyVG9nZ2xlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGxhYmVsLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnYnV0dG9uJyxcbiAgb25DbGljayxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ25hdmJhci10b2dnbGVyJyk7XG4gIGNvbnN0IHtcbiAgICBvblRvZ2dsZSxcbiAgICBleHBhbmRlZFxuICB9ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUpO1xuICAgIGlmIChvblRvZ2dsZSkgb25Ub2dnbGUoKTtcbiAgfSk7XG5cbiAgaWYgKENvbXBvbmVudCA9PT0gJ2J1dHRvbicpIHtcbiAgICBwcm9wcy50eXBlID0gJ2J1dHRvbic7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBsYWJlbCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgIWV4cGFuZGVkICYmICdjb2xsYXBzZWQnKSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7YnNQcmVmaXh9LWljb25gXG4gICAgfSlcbiAgfSk7XG59KTtcbk5hdmJhclRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdOYXZiYXJUb2dnbGUnO1xuTmF2YmFyVG9nZ2xlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE5hdmJhclRvZ2dsZTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlTW9kYWwgZnJvbSAnQHJlc3RhcnQvdWkvTW9kYWwnO1xuaW1wb3J0IEZhZGUgZnJvbSAnLi9GYWRlJztcbmltcG9ydCBPZmZjYW52YXNCb2R5IGZyb20gJy4vT2ZmY2FudmFzQm9keSc7XG5pbXBvcnQgT2ZmY2FudmFzVG9nZ2xpbmcgZnJvbSAnLi9PZmZjYW52YXNUb2dnbGluZyc7XG5pbXBvcnQgTW9kYWxDb250ZXh0IGZyb20gJy4vTW9kYWxDb250ZXh0JztcbmltcG9ydCBOYXZiYXJDb250ZXh0IGZyb20gJy4vTmF2YmFyQ29udGV4dCc7XG5pbXBvcnQgT2ZmY2FudmFzSGVhZGVyIGZyb20gJy4vT2ZmY2FudmFzSGVhZGVyJztcbmltcG9ydCBPZmZjYW52YXNUaXRsZSBmcm9tICcuL09mZmNhbnZhc1RpdGxlJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyLCB7IGdldFNoYXJlZE1hbmFnZXIgfSBmcm9tICcuL0Jvb3RzdHJhcE1vZGFsTWFuYWdlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZSxcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlLFxuICBhdXRvRm9jdXM6IHRydWUsXG4gIGVuZm9yY2VGb2N1czogdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICBwbGFjZW1lbnQ6ICdzdGFydCdcbn07XG5cbmZ1bmN0aW9uIERpYWxvZ1RyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE9mZmNhbnZhc1RvZ2dsaW5nLCB7IC4uLnByb3BzXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBCYWNrZHJvcFRyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHNcbiAgfSk7XG59XG5cbmNvbnN0IE9mZmNhbnZhcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogYXJpYUxhYmVsbGVkYnksXG4gIHBsYWNlbWVudCxcblxuICAvKiBCYXNlTW9kYWwgcHJvcHMgKi9cbiAgc2hvdyxcbiAgYmFja2Ryb3AsXG4gIGtleWJvYXJkLFxuICBzY3JvbGwsXG4gIG9uRXNjYXBlS2V5RG93bixcbiAgb25TaG93LFxuICBvbkhpZGUsXG4gIGNvbnRhaW5lcixcbiAgYXV0b0ZvY3VzLFxuICBlbmZvcmNlRm9jdXMsXG4gIHJlc3RvcmVGb2N1cyxcbiAgcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgb25FbnRlcmVkLFxuICBvbkV4aXQsXG4gIG9uRXhpdGluZyxcbiAgb25FbnRlcixcbiAgb25FbnRlcmluZyxcbiAgb25FeGl0ZWQsXG4gIGJhY2tkcm9wQ2xhc3NOYW1lLFxuICBtYW5hZ2VyOiBwcm9wc01hbmFnZXIsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgbW9kYWxNYW5hZ2VyID0gdXNlUmVmKCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnb2ZmY2FudmFzJyk7XG4gIGNvbnN0IHtcbiAgICBvblRvZ2dsZVxuICB9ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG9uVG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiBvblRvZ2dsZSgpO1xuICAgIG9uSGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25IaWRlKCk7XG4gIH0pO1xuICBjb25zdCBtb2RhbENvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgb25IaWRlOiBoYW5kbGVIaWRlXG4gIH0pLCBbaGFuZGxlSGlkZV0pO1xuXG4gIGZ1bmN0aW9uIGdldE1vZGFsTWFuYWdlcigpIHtcbiAgICBpZiAocHJvcHNNYW5hZ2VyKSByZXR1cm4gcHJvcHNNYW5hZ2VyO1xuXG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgLy8gSGF2ZSB0byB1c2UgYSBkaWZmZXJlbnQgbW9kYWwgbWFuYWdlciBzaW5jZSB0aGUgc2hhcmVkXG4gICAgICAvLyBvbmUgaGFuZGxlcyBvdmVyZmxvdy5cbiAgICAgIGlmICghbW9kYWxNYW5hZ2VyLmN1cnJlbnQpIG1vZGFsTWFuYWdlci5jdXJyZW50ID0gbmV3IEJvb3RzdHJhcE1vZGFsTWFuYWdlcih7XG4gICAgICAgIGhhbmRsZUNvbnRhaW5lck92ZXJmbG93OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbW9kYWxNYW5hZ2VyLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNoYXJlZE1hbmFnZXIoKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gKG5vZGUsIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAobm9kZSkgbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIG9uRW50ZXIgPT0gbnVsbCA/IHZvaWQgMCA6IG9uRW50ZXIobm9kZSwgLi4uYXJncyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRXhpdGVkID0gKG5vZGUsIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAobm9kZSkgbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgb25FeGl0ZWQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uRXhpdGVkKC4uLmFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlckJhY2tkcm9wID0gdXNlQ2FsbGJhY2soYmFja2Ryb3BQcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7IC4uLmJhY2tkcm9wUHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke2JzUHJlZml4fS1iYWNrZHJvcGAsIGJhY2tkcm9wQ2xhc3NOYW1lKVxuICB9KSwgW2JhY2tkcm9wQ2xhc3NOYW1lLCBic1ByZWZpeF0pO1xuXG4gIGNvbnN0IHJlbmRlckRpYWxvZyA9IGRpYWxvZ1Byb3BzID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgIC4uLmRpYWxvZ1Byb3BzLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBgJHtic1ByZWZpeH0tJHtwbGFjZW1lbnR9YCksXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogYXJpYUxhYmVsbGVkYnksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChNb2RhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbW9kYWxDb250ZXh0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChCYXNlTW9kYWwsIHtcbiAgICAgIHNob3c6IHNob3csXG4gICAgICByZWY6IHJlZixcbiAgICAgIGJhY2tkcm9wOiBiYWNrZHJvcCxcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAga2V5Ym9hcmQ6IGtleWJvYXJkLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBlbmZvcmNlRm9jdXM6IGVuZm9yY2VGb2N1cyAmJiAhc2Nyb2xsLFxuICAgICAgcmVzdG9yZUZvY3VzOiByZXN0b3JlRm9jdXMsXG4gICAgICByZXN0b3JlRm9jdXNPcHRpb25zOiByZXN0b3JlRm9jdXNPcHRpb25zLFxuICAgICAgb25Fc2NhcGVLZXlEb3duOiBvbkVzY2FwZUtleURvd24sXG4gICAgICBvblNob3c6IG9uU2hvdyxcbiAgICAgIG9uSGlkZTogaGFuZGxlSGlkZSxcbiAgICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgICAgb25FbnRlcmluZzogb25FbnRlcmluZyxcbiAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkLFxuICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICBvbkV4aXRpbmc6IG9uRXhpdGluZyxcbiAgICAgIG9uRXhpdGVkOiBoYW5kbGVFeGl0ZWQsXG4gICAgICBtYW5hZ2VyOiBnZXRNb2RhbE1hbmFnZXIoKSxcbiAgICAgIHRyYW5zaXRpb246IERpYWxvZ1RyYW5zaXRpb24sXG4gICAgICBiYWNrZHJvcFRyYW5zaXRpb246IEJhY2tkcm9wVHJhbnNpdGlvbixcbiAgICAgIHJlbmRlckJhY2tkcm9wOiByZW5kZXJCYWNrZHJvcCxcbiAgICAgIHJlbmRlckRpYWxvZzogcmVuZGVyRGlhbG9nXG4gICAgfSlcbiAgfSk7XG59KTtcbk9mZmNhbnZhcy5kaXNwbGF5TmFtZSA9ICdPZmZjYW52YXMnO1xuT2ZmY2FudmFzLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oT2ZmY2FudmFzLCB7XG4gIEJvZHk6IE9mZmNhbnZhc0JvZHksXG4gIEhlYWRlcjogT2ZmY2FudmFzSGVhZGVyLFxuICBUaXRsZTogT2ZmY2FudmFzVGl0bGVcbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdvZmZjYW52YXMtYm9keScpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBBYnN0cmFjdE1vZGFsSGVhZGVyIGZyb20gJy4vQWJzdHJhY3RNb2RhbEhlYWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogZmFsc2Vcbn07XG5jb25zdCBPZmZjYW52YXNIZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnb2ZmY2FudmFzLWhlYWRlcicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWJzdHJhY3RNb2RhbEhlYWRlciwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KVxuICB9KTtcbn0pO1xuT2ZmY2FudmFzSGVhZGVyLmRpc3BsYXlOYW1lID0gJ09mZmNhbnZhc0hlYWRlcic7XG5PZmZjYW52YXNIZWFkZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzSGVhZGVyOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IGRpdldpdGhDbGFzc05hbWUgZnJvbSAnLi9kaXZXaXRoQ2xhc3NOYW1lJztcbmNvbnN0IERpdlN0eWxlZEFzSDUgPSBkaXZXaXRoQ2xhc3NOYW1lKCdoNScpO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdvZmZjYW52YXMtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINVxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFTlRFUkVELCBFTlRFUklORywgRVhJVElORyB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZExpc3RlbmVyIGZyb20gJy4vdHJhbnNpdGlvbkVuZExpc3RlbmVyJztcbmltcG9ydCBUcmFuc2l0aW9uV3JhcHBlciBmcm9tICcuL1RyYW5zaXRpb25XcmFwcGVyJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBpbjogZmFsc2UsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlXG59O1xuY29uc3QgdHJhbnNpdGlvblN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3cnLFxuICBbRU5URVJFRF06ICdzaG93J1xufTtcbmNvbnN0IE9mZmNhbnZhc1RvZ2dsaW5nID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdvZmZjYW52YXMnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFRyYW5zaXRpb25XcmFwcGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgYWRkRW5kTGlzdGVuZXI6IHRyYW5zaXRpb25FbmRMaXN0ZW5lcixcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZFJlZjogY2hpbGRyZW4ucmVmLFxuICAgIGNoaWxkcmVuOiAoc3RhdHVzLCBpbm5lclByb3BzKSA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7IC4uLmlubmVyUHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBjaGlsZHJlbi5wcm9wcy5jbGFzc05hbWUsIChzdGF0dXMgPT09IEVOVEVSSU5HIHx8IHN0YXR1cyA9PT0gRVhJVElORykgJiYgYCR7YnNQcmVmaXh9LXRvZ2dsaW5nYCwgdHJhbnNpdGlvblN0eWxlc1tzdGF0dXNdKVxuICAgIH0pXG4gIH0pO1xufSk7XG5PZmZjYW52YXNUb2dnbGluZy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5PZmZjYW52YXNUb2dnbGluZy5kaXNwbGF5TmFtZSA9ICdPZmZjYW52YXNUb2dnbGluZyc7XG5leHBvcnQgZGVmYXVsdCBPZmZjYW52YXNUb2dnbGluZzsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBCYXNlT3ZlcmxheSBmcm9tICdAcmVzdGFydC91aS9PdmVybGF5JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IHVzZU92ZXJsYXlPZmZzZXQgZnJvbSAnLi91c2VPdmVybGF5T2Zmc2V0JztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgc2FmZUZpbmRET01Ob2RlIGZyb20gJy4vc2FmZUZpbmRET01Ob2RlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHRyYW5zaXRpb246IEZhZGUsXG4gIHJvb3RDbG9zZTogZmFsc2UsXG4gIHNob3c6IGZhbHNlLFxuICBwbGFjZW1lbnQ6ICd0b3AnXG59O1xuXG5mdW5jdGlvbiB3cmFwUmVmcyhwcm9wcywgYXJyb3dQcm9wcykge1xuICBjb25zdCB7XG4gICAgcmVmXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIHJlZjogYVJlZlxuICB9ID0gYXJyb3dQcm9wcztcblxuICBwcm9wcy5yZWYgPSByZWYuX193cmFwcGVkIHx8IChyZWYuX193cmFwcGVkID0gciA9PiByZWYoc2FmZUZpbmRET01Ob2RlKHIpKSk7XG5cbiAgYXJyb3dQcm9wcy5yZWYgPSBhUmVmLl9fd3JhcHBlZCB8fCAoYVJlZi5fX3dyYXBwZWQgPSByID0+IGFSZWYoc2FmZUZpbmRET01Ob2RlKHIpKSk7XG59XG5cbmNvbnN0IE92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjaGlsZHJlbjogb3ZlcmxheSxcbiAgdHJhbnNpdGlvbixcbiAgcG9wcGVyQ29uZmlnID0ge30sXG4gIC4uLm91dGVyUHJvcHNcbn0sIG91dGVyUmVmKSA9PiB7XG4gIGNvbnN0IHBvcHBlclJlZiA9IHVzZVJlZih7fSk7XG4gIGNvbnN0IFtyZWYsIG1vZGlmaWVyc10gPSB1c2VPdmVybGF5T2Zmc2V0KCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlZFJlZnMob3V0ZXJSZWYsIHJlZik7XG4gIGNvbnN0IGFjdHVhbFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uID09PSB0cnVlID8gRmFkZSA6IHRyYW5zaXRpb24gfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQmFzZU92ZXJsYXksIHsgLi4ub3V0ZXJQcm9wcyxcbiAgICByZWY6IG1lcmdlZFJlZixcbiAgICBwb3BwZXJDb25maWc6IHsgLi4ucG9wcGVyQ29uZmlnLFxuICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMuY29uY2F0KHBvcHBlckNvbmZpZy5tb2RpZmllcnMgfHwgW10pXG4gICAgfSxcbiAgICB0cmFuc2l0aW9uOiBhY3R1YWxUcmFuc2l0aW9uLFxuICAgIGNoaWxkcmVuOiAob3ZlcmxheVByb3BzLCB7XG4gICAgICBhcnJvd1Byb3BzLFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgcG9wcGVyOiBwb3BwZXJPYmosXG4gICAgICBzaG93XG4gICAgfSkgPT4ge1xuICAgICAgdmFyIF9wb3BwZXJPYmokc3RhdGUsIF9wb3BwZXJPYmokc3RhdGUkbW9kaTtcblxuICAgICAgd3JhcFJlZnMob3ZlcmxheVByb3BzLCBhcnJvd1Byb3BzKTtcbiAgICAgIGNvbnN0IHBvcHBlciA9IE9iamVjdC5hc3NpZ24ocG9wcGVyUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgc3RhdGU6IHBvcHBlck9iaiA9PSBudWxsID8gdm9pZCAwIDogcG9wcGVyT2JqLnN0YXRlLFxuICAgICAgICBzY2hlZHVsZVVwZGF0ZTogcG9wcGVyT2JqID09IG51bGwgPyB2b2lkIDAgOiBwb3BwZXJPYmoudXBkYXRlLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG91dE9mQm91bmRhcmllczogKHBvcHBlck9iaiA9PSBudWxsID8gdm9pZCAwIDogKF9wb3BwZXJPYmokc3RhdGUgPSBwb3BwZXJPYmouc3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiAoX3BvcHBlck9iaiRzdGF0ZSRtb2RpID0gX3BvcHBlck9iaiRzdGF0ZS5tb2RpZmllcnNEYXRhLmhpZGUpID09IG51bGwgPyB2b2lkIDAgOiBfcG9wcGVyT2JqJHN0YXRlJG1vZGkuaXNSZWZlcmVuY2VIaWRkZW4pIHx8IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG92ZXJsYXkoeyAuLi5vdmVybGF5UHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgc2hvdyxcbiAgICAgICAgLi4uKCF0cmFuc2l0aW9uICYmIHNob3cgJiYge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3Nob3cnXG4gICAgICAgIH0pLFxuICAgICAgICBwb3BwZXIsXG4gICAgICAgIGFycm93UHJvcHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQob3ZlcmxheSwgeyAuLi5vdmVybGF5UHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgYXJyb3dQcm9wcyxcbiAgICAgICAgcG9wcGVyLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMob3ZlcmxheS5wcm9wcy5jbGFzc05hbWUsICF0cmFuc2l0aW9uICYmIHNob3cgJiYgJ3Nob3cnKSxcbiAgICAgICAgc3R5bGU6IHsgLi4ub3ZlcmxheS5wcm9wcy5zdHlsZSxcbiAgICAgICAgICAuLi5vdmVybGF5UHJvcHMuc3R5bGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn0pO1xuT3ZlcmxheS5kaXNwbGF5TmFtZSA9ICdPdmVybGF5Jztcbk92ZXJsYXkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT3ZlcmxheTsiLCJpbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVRpbWVvdXQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlVGltZW91dCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZFByb3AgfSBmcm9tICd1bmNvbnRyb2xsYWJsZSc7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCBPdmVybGF5IGZyb20gJy4vT3ZlcmxheSc7XG5pbXBvcnQgc2FmZUZpbmRET01Ob2RlIGZyb20gJy4vc2FmZUZpbmRET01Ob2RlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuZnVuY3Rpb24gbm9ybWFsaXplRGVsYXkoZGVsYXkpIHtcbiAgcmV0dXJuIGRlbGF5ICYmIHR5cGVvZiBkZWxheSA9PT0gJ29iamVjdCcgPyBkZWxheSA6IHtcbiAgICBzaG93OiBkZWxheSxcbiAgICBoaWRlOiBkZWxheVxuICB9O1xufSAvLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgbW91c2VFbnRlciBhbmQgbW91c2VMZWF2ZS5cbi8vIFJlYWN0J3MgYnVpbHQgdmVyc2lvbiBpcyBicm9rZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNDI1MVxuLy8gZm9yIGNhc2VzIHdoZW4gdGhlIHRyaWdnZXIgaXMgZGlzYWJsZWQgYW5kIG1vdXNlT3V0L092ZXIgY2FuIGNhdXNlIGZsaWNrZXJcbi8vIG1vdmluZyBmcm9tIG9uZSBjaGlsZCBlbGVtZW50IHRvIGFub3RoZXIuXG5cblxuZnVuY3Rpb24gaGFuZGxlTW91c2VPdmVyT3V0KCAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuaGFuZGxlciwgYXJncywgcmVsYXRlZE5hdGl2ZSkge1xuICBjb25zdCBbZV0gPSBhcmdzO1xuICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IHJlbGF0ZWQgPSBlLnJlbGF0ZWRUYXJnZXQgfHwgZS5uYXRpdmVFdmVudFtyZWxhdGVkTmF0aXZlXTtcblxuICBpZiAoKCFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IHRhcmdldCkgJiYgIWNvbnRhaW5zKHRhcmdldCwgcmVsYXRlZCkpIHtcbiAgICBoYW5kbGVyKC4uLmFyZ3MpO1xuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdFNob3c6IGZhbHNlLFxuICB0cmlnZ2VyOiBbJ2hvdmVyJywgJ2ZvY3VzJ11cbn07XG5cbmZ1bmN0aW9uIE92ZXJsYXlUcmlnZ2VyKHtcbiAgdHJpZ2dlcixcbiAgb3ZlcmxheSxcbiAgY2hpbGRyZW4sXG4gIHBvcHBlckNvbmZpZyA9IHt9LFxuICBzaG93OiBwcm9wc1Nob3csXG4gIGRlZmF1bHRTaG93ID0gZmFsc2UsXG4gIG9uVG9nZ2xlLFxuICBkZWxheTogcHJvcHNEZWxheSxcbiAgcGxhY2VtZW50LFxuICBmbGlwID0gcGxhY2VtZW50ICYmIHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgIT09IC0xLFxuICAuLi5wcm9wc1xufSkge1xuICBjb25zdCB0cmlnZ2VyTm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyh0cmlnZ2VyTm9kZVJlZiwgY2hpbGRyZW4ucmVmKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXQoKTtcbiAgY29uc3QgaG92ZXJTdGF0ZVJlZiA9IHVzZVJlZignJyk7XG4gIGNvbnN0IFtzaG93LCBzZXRTaG93XSA9IHVzZVVuY29udHJvbGxlZFByb3AocHJvcHNTaG93LCBkZWZhdWx0U2hvdywgb25Ub2dnbGUpO1xuICBjb25zdCBkZWxheSA9IG5vcm1hbGl6ZURlbGF5KHByb3BzRGVsYXkpO1xuICBjb25zdCB7XG4gICAgb25Gb2N1cyxcbiAgICBvbkJsdXIsXG4gICAgb25DbGlja1xuICB9ID0gdHlwZW9mIGNoaWxkcmVuICE9PSAnZnVuY3Rpb24nID8gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbikucHJvcHMgOiB7fTtcblxuICBjb25zdCBhdHRhY2hSZWYgPSByID0+IHtcbiAgICBtZXJnZWRSZWYoc2FmZUZpbmRET01Ob2RlKHIpKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTaG93ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHRpbWVvdXQuY2xlYXIoKTtcbiAgICBob3ZlclN0YXRlUmVmLmN1cnJlbnQgPSAnc2hvdyc7XG5cbiAgICBpZiAoIWRlbGF5LnNob3cpIHtcbiAgICAgIHNldFNob3codHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZW91dC5zZXQoKCkgPT4ge1xuICAgICAgaWYgKGhvdmVyU3RhdGVSZWYuY3VycmVudCA9PT0gJ3Nob3cnKSBzZXRTaG93KHRydWUpO1xuICAgIH0sIGRlbGF5LnNob3cpO1xuICB9LCBbZGVsYXkuc2hvdywgc2V0U2hvdywgdGltZW91dF0pO1xuICBjb25zdCBoYW5kbGVIaWRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHRpbWVvdXQuY2xlYXIoKTtcbiAgICBob3ZlclN0YXRlUmVmLmN1cnJlbnQgPSAnaGlkZSc7XG5cbiAgICBpZiAoIWRlbGF5LmhpZGUpIHtcbiAgICAgIHNldFNob3coZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVvdXQuc2V0KCgpID0+IHtcbiAgICAgIGlmIChob3ZlclN0YXRlUmVmLmN1cnJlbnQgPT09ICdoaWRlJykgc2V0U2hvdyhmYWxzZSk7XG4gICAgfSwgZGVsYXkuaGlkZSk7XG4gIH0sIFtkZWxheS5oaWRlLCBzZXRTaG93LCB0aW1lb3V0XSk7XG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICBoYW5kbGVTaG93KCk7XG4gICAgb25Gb2N1cyA9PSBudWxsID8gdm9pZCAwIDogb25Gb2N1cyguLi5hcmdzKTtcbiAgfSwgW2hhbmRsZVNob3csIG9uRm9jdXNdKTtcbiAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUNhbGxiYWNrKCguLi5hcmdzKSA9PiB7XG4gICAgaGFuZGxlSGlkZSgpO1xuICAgIG9uQmx1ciA9PSBudWxsID8gdm9pZCAwIDogb25CbHVyKC4uLmFyZ3MpO1xuICB9LCBbaGFuZGxlSGlkZSwgb25CbHVyXSk7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICBzZXRTaG93KCFzaG93KTtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKC4uLmFyZ3MpO1xuICB9LCBbb25DbGljaywgc2V0U2hvdywgc2hvd10pO1xuICBjb25zdCBoYW5kbGVNb3VzZU92ZXIgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIGhhbmRsZU1vdXNlT3Zlck91dChoYW5kbGVTaG93LCBhcmdzLCAnZnJvbUVsZW1lbnQnKTtcbiAgfSwgW2hhbmRsZVNob3ddKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdXQgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIGhhbmRsZU1vdXNlT3Zlck91dChoYW5kbGVIaWRlLCBhcmdzLCAndG9FbGVtZW50Jyk7XG4gIH0sIFtoYW5kbGVIaWRlXSk7XG4gIGNvbnN0IHRyaWdnZXJzID0gdHJpZ2dlciA9PSBudWxsID8gW10gOiBbXS5jb25jYXQodHJpZ2dlcik7XG4gIGNvbnN0IHRyaWdnZXJQcm9wcyA9IHtcbiAgICByZWY6IGF0dGFjaFJlZlxuICB9O1xuXG4gIGlmICh0cmlnZ2Vycy5pbmRleE9mKCdjbGljaycpICE9PSAtMSkge1xuICAgIHRyaWdnZXJQcm9wcy5vbkNsaWNrID0gaGFuZGxlQ2xpY2s7XG4gIH1cblxuICBpZiAodHJpZ2dlcnMuaW5kZXhPZignZm9jdXMnKSAhPT0gLTEpIHtcbiAgICB0cmlnZ2VyUHJvcHMub25Gb2N1cyA9IGhhbmRsZUZvY3VzO1xuICAgIHRyaWdnZXJQcm9wcy5vbkJsdXIgPSBoYW5kbGVCbHVyO1xuICB9XG5cbiAgaWYgKHRyaWdnZXJzLmluZGV4T2YoJ2hvdmVyJykgIT09IC0xKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyh0cmlnZ2Vycy5sZW5ndGggPiAxLCAnW3JlYWN0LWJvb3RzdHJhcF0gU3BlY2lmeWluZyBvbmx5IHRoZSBgXCJob3ZlclwiYCB0cmlnZ2VyIGxpbWl0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgb3ZlcmxheSB0byBqdXN0IG1vdXNlIHVzZXJzLiBDb25zaWRlciBhbHNvIGluY2x1ZGluZyB0aGUgYFwiZm9jdXNcImAgdHJpZ2dlciBzbyB0aGF0IHRvdWNoIGFuZCBrZXlib2FyZCBvbmx5IHVzZXJzIGNhbiBzZWUgdGhlIG92ZXJsYXkgYXMgd2VsbC4nKSA6IHZvaWQgMDtcbiAgICB0cmlnZ2VyUHJvcHMub25Nb3VzZU92ZXIgPSBoYW5kbGVNb3VzZU92ZXI7XG4gICAgdHJpZ2dlclByb3BzLm9uTW91c2VPdXQgPSBoYW5kbGVNb3VzZU91dDtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbih0cmlnZ2VyUHJvcHMpIDogLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZHJlbiwgdHJpZ2dlclByb3BzKSwgLyojX19QVVJFX18qL19qc3goT3ZlcmxheSwgeyAuLi5wcm9wcyxcbiAgICAgIHNob3c6IHNob3csXG4gICAgICBvbkhpZGU6IGhhbmRsZUhpZGUsXG4gICAgICBmbGlwOiBmbGlwLFxuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBwb3BwZXJDb25maWc6IHBvcHBlckNvbmZpZyxcbiAgICAgIHRhcmdldDogdHJpZ2dlck5vZGVSZWYuY3VycmVudCxcbiAgICAgIGNoaWxkcmVuOiBvdmVybGF5XG4gICAgfSldXG4gIH0pO1xufVxuXG5PdmVybGF5VHJpZ2dlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBPdmVybGF5VHJpZ2dlcjsiLCIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1tdWx0aS1jb21wICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgYWN0aXZlTGFiZWw6ICcoY3VycmVudCknXG59O1xuY29uc3QgUGFnZUl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhY3RpdmUsXG4gIGRpc2FibGVkLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICBhY3RpdmVMYWJlbCxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gYWN0aXZlIHx8IGRpc2FibGVkID8gJ3NwYW4nIDogQW5jaG9yO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJsaVwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsICdwYWdlLWl0ZW0nLCB7XG4gICAgICBhY3RpdmUsXG4gICAgICBkaXNhYmxlZFxuICAgIH0pLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IFwicGFnZS1saW5rXCIsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGFjdGl2ZSAmJiBhY3RpdmVMYWJlbCAmJiAvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgIGNoaWxkcmVuOiBhY3RpdmVMYWJlbFxuICAgICAgfSldXG4gICAgfSlcbiAgfSk7XG59KTtcblBhZ2VJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblBhZ2VJdGVtLmRpc3BsYXlOYW1lID0gJ1BhZ2VJdGVtJztcbmV4cG9ydCBkZWZhdWx0IFBhZ2VJdGVtO1xuXG5mdW5jdGlvbiBjcmVhdGVCdXR0b24obmFtZSwgZGVmYXVsdFZhbHVlLCBsYWJlbCA9IG5hbWUpIHtcbiAgZnVuY3Rpb24gQnV0dG9uKHtcbiAgICBjaGlsZHJlbixcbiAgICAuLi5wcm9wc1xuICB9KSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhQYWdlSXRlbSwgeyAuLi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IGRlZmF1bHRWYWx1ZVxuICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ2aXN1YWxseS1oaWRkZW5cIixcbiAgICAgICAgY2hpbGRyZW46IGxhYmVsXG4gICAgICB9KV1cbiAgICB9KTtcbiAgfVxuXG4gIEJ1dHRvbi5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gIHJldHVybiBCdXR0b247XG59XG5cbmV4cG9ydCBjb25zdCBGaXJzdCA9IGNyZWF0ZUJ1dHRvbignRmlyc3QnLCAnwqsnKTtcbmV4cG9ydCBjb25zdCBQcmV2ID0gY3JlYXRlQnV0dG9uKCdQcmV2JywgJ+KAuScsICdQcmV2aW91cycpO1xuZXhwb3J0IGNvbnN0IEVsbGlwc2lzID0gY3JlYXRlQnV0dG9uKCdFbGxpcHNpcycsICfigKYnLCAnTW9yZScpO1xuZXhwb3J0IGNvbnN0IE5leHQgPSBjcmVhdGVCdXR0b24oJ05leHQnLCAn4oC6Jyk7XG5leHBvcnQgY29uc3QgTGFzdCA9IGNyZWF0ZUJ1dHRvbignTGFzdCcsICfCuycpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBQYWdlSXRlbSwgeyBFbGxpcHNpcywgRmlyc3QsIExhc3QsIE5leHQsIFByZXYgfSBmcm9tICcuL1BhZ2VJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbi8qKlxuICogQHByb3BlcnR5IHtQYWdlSXRlbX0gSXRlbVxuICogQHByb3BlcnR5IHtQYWdlSXRlbX0gRmlyc3RcbiAqIEBwcm9wZXJ0eSB7UGFnZUl0ZW19IFByZXZcbiAqIEBwcm9wZXJ0eSB7UGFnZUl0ZW19IEVsbGlwc2lzXG4gKiBAcHJvcGVydHkge1BhZ2VJdGVtfSBOZXh0XG4gKiBAcHJvcGVydHkge1BhZ2VJdGVtfSBMYXN0XG4gKi9cbmNvbnN0IFBhZ2luYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBzaXplLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGRlY29yYXRlZEJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAncGFnaW5hdGlvbicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJ1bFwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGVjb3JhdGVkQnNQcmVmaXgsIHNpemUgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LSR7c2l6ZX1gKVxuICB9KTtcbn0pO1xuUGFnaW5hdGlvbi5kaXNwbGF5TmFtZSA9ICdQYWdpbmF0aW9uJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oUGFnaW5hdGlvbiwge1xuICBGaXJzdCxcbiAgUHJldixcbiAgRWxsaXBzaXMsXG4gIEl0ZW06IFBhZ2VJdGVtLFxuICBOZXh0LFxuICBMYXN0XG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlUGxhY2Vob2xkZXIgZnJvbSAnLi91c2VQbGFjZWhvbGRlcic7XG5pbXBvcnQgUGxhY2Vob2xkZXJCdXR0b24gZnJvbSAnLi9QbGFjZWhvbGRlckJ1dHRvbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgUGxhY2Vob2xkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhczogQ29tcG9uZW50ID0gJ3NwYW4nLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHBsYWNlaG9sZGVyUHJvcHMgPSB1c2VQbGFjZWhvbGRlcihwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucGxhY2Vob2xkZXJQcm9wcyxcbiAgICByZWY6IHJlZlxuICB9KTtcbn0pO1xuUGxhY2Vob2xkZXIuZGlzcGxheU5hbWUgPSAnUGxhY2Vob2xkZXInO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihQbGFjZWhvbGRlciwge1xuICBCdXR0b246IFBsYWNlaG9sZGVyQnV0dG9uXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB1c2VQbGFjZWhvbGRlciBmcm9tICcuL3VzZVBsYWNlaG9sZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBQbGFjZWhvbGRlckJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHBsYWNlaG9sZGVyUHJvcHMgPSB1c2VQbGFjZWhvbGRlcihwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChCdXR0b24sIHsgLi4ucGxhY2Vob2xkZXJQcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICB0YWJJbmRleDogLTFcbiAgfSk7XG59KTtcblBsYWNlaG9sZGVyQnV0dG9uLmRpc3BsYXlOYW1lID0gJ1BsYWNlaG9sZGVyQnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IFBsYWNlaG9sZGVyQnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4LCB1c2VJc1JUTCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgUG9wb3ZlckhlYWRlciBmcm9tICcuL1BvcG92ZXJIZWFkZXInO1xuaW1wb3J0IFBvcG92ZXJCb2R5IGZyb20gJy4vUG9wb3ZlckJvZHknO1xuaW1wb3J0IHsgZ2V0T3ZlcmxheURpcmVjdGlvbiB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBwbGFjZW1lbnQ6ICdyaWdodCdcbn07XG5jb25zdCBQb3BvdmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIHBsYWNlbWVudCxcbiAgY2xhc3NOYW1lLFxuICBzdHlsZSxcbiAgY2hpbGRyZW4sXG4gIGJvZHksXG4gIGFycm93UHJvcHMsXG4gIHBvcHBlcjogXyxcbiAgc2hvdzogXzEsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgZGVjb3JhdGVkQnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdwb3BvdmVyJyk7XG4gIGNvbnN0IGlzUlRMID0gdXNlSXNSVEwoKTtcbiAgY29uc3QgW3ByaW1hcnlQbGFjZW1lbnRdID0gKHBsYWNlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhY2VtZW50LnNwbGl0KCctJykpIHx8IFtdO1xuICBjb25zdCBic0RpcmVjdGlvbiA9IGdldE92ZXJsYXlEaXJlY3Rpb24ocHJpbWFyeVBsYWNlbWVudCwgaXNSVEwpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3hzKFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICByb2xlOiBcInRvb2x0aXBcIixcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgXCJ4LXBsYWNlbWVudFwiOiBwcmltYXJ5UGxhY2VtZW50LFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGRlY29yYXRlZEJzUHJlZml4LCBwcmltYXJ5UGxhY2VtZW50ICYmIGBicy1wb3BvdmVyLSR7YnNEaXJlY3Rpb259YCksXG4gICAgLi4ucHJvcHMsXG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwicG9wb3Zlci1hcnJvd1wiLFxuICAgICAgLi4uYXJyb3dQcm9wc1xuICAgIH0pLCBib2R5ID8gLyojX19QVVJFX18qL19qc3goUG9wb3ZlckJvZHksIHtcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pIDogY2hpbGRyZW5dXG4gIH0pO1xufSk7XG5Qb3BvdmVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oUG9wb3Zlciwge1xuICBIZWFkZXI6IFBvcG92ZXJIZWFkZXIsXG4gIEJvZHk6IFBvcG92ZXJCb2R5LFxuICAvLyBEZWZhdWx0IHBvcG92ZXIgb2Zmc2V0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi81YzMyNzY3ZTBlMGRiYWMyZDkzNGJjZGVlMDM3MTlhNjVkM2YxMTg3L2pzL3NyYy9wb3BvdmVyLmpzI0wyOFxuICBQT1BQRVJfT0ZGU0VUOiBbMCwgOF1cbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdwb3BvdmVyLWJvZHknKTsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgncG9wb3Zlci1oZWFkZXInKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuL0VsZW1lbnRDaGlsZHJlbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgUk9VTkRfUFJFQ0lTSU9OID0gMTAwMDtcbi8qKlxuICogVmFsaWRhdGUgdGhhdCBjaGlsZHJlbiwgaWYgYW55LCBhcmUgaW5zdGFuY2VzIG9mIGA8UHJvZ3Jlc3NCYXI+YC5cbiAqL1xuXG5mdW5jdGlvbiBvbmx5UHJvZ3Jlc3NCYXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBlcnJvciA9IG51bGw7XG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcGFyZSB0eXBlcyBpbiBhIHdheSB0aGF0IHdvcmtzIHdpdGggbGlicmFyaWVzIHRoYXQgcGF0Y2ggYW5kIHByb3h5XG4gICAgICogY29tcG9uZW50cyBsaWtlIHJlYWN0LWhvdC1sb2FkZXIuXG4gICAgICpcbiAgICAgKiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dhZWFyb24vcmVhY3QtaG90LWxvYWRlciNjaGVja2luZy1lbGVtZW50LXR5cGVzXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuXG5cbiAgICBjb25zdCBlbGVtZW50ID0gLyojX19QVVJFX18qL19qc3goUHJvZ3Jlc3NCYXIsIHt9KTtcblxuICAgIGlmIChjaGlsZC50eXBlID09PSBlbGVtZW50LnR5cGUpIHJldHVybjtcbiAgICBjb25zdCBjaGlsZFR5cGUgPSBjaGlsZC50eXBlO1xuICAgIGNvbnN0IGNoaWxkSWRlbnRpZmllciA9IC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkgPyBjaGlsZFR5cGUuZGlzcGxheU5hbWUgfHwgY2hpbGRUeXBlLm5hbWUgfHwgY2hpbGRUeXBlIDogY2hpbGQ7XG4gICAgZXJyb3IgPSBuZXcgRXJyb3IoYENoaWxkcmVuIG9mICR7Y29tcG9uZW50TmFtZX0gY2FuIGNvbnRhaW4gb25seSBQcm9ncmVzc0JhciBgICsgYGNvbXBvbmVudHMuIEZvdW5kICR7Y2hpbGRJZGVudGlmaWVyfS5gKTtcbiAgfSk7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBtaW46IDAsXG4gIG1heDogMTAwLFxuICBhbmltYXRlZDogZmFsc2UsXG4gIGlzQ2hpbGQ6IGZhbHNlLFxuICB2aXN1YWxseUhpZGRlbjogZmFsc2UsXG4gIHN0cmlwZWQ6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpIHtcbiAgY29uc3QgcGVyY2VudGFnZSA9IChub3cgLSBtaW4pIC8gKG1heCAtIG1pbikgKiAxMDA7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiBST1VORF9QUkVDSVNJT04pIC8gUk9VTkRfUFJFQ0lTSU9OO1xufVxuXG5mdW5jdGlvbiByZW5kZXJQcm9ncmVzc0Jhcih7XG4gIG1pbixcbiAgbm93LFxuICBtYXgsXG4gIGxhYmVsLFxuICB2aXN1YWxseUhpZGRlbixcbiAgc3RyaXBlZCxcbiAgYW5pbWF0ZWQsXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gIHZhcmlhbnQsXG4gIGJzUHJlZml4LFxuICAuLi5wcm9wc1xufSwgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke2JzUHJlZml4fS1iYXJgLCB7XG4gICAgICBbYGJnLSR7dmFyaWFudH1gXTogdmFyaWFudCxcbiAgICAgIFtgJHtic1ByZWZpeH0tYmFyLWFuaW1hdGVkYF06IGFuaW1hdGVkLFxuICAgICAgW2Ake2JzUHJlZml4fS1iYXItc3RyaXBlZGBdOiBhbmltYXRlZCB8fCBzdHJpcGVkXG4gICAgfSksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBgJHtnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpfSVgLFxuICAgICAgLi4uc3R5bGVcbiAgICB9LFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBub3csXG4gICAgXCJhcmlhLXZhbHVlbWluXCI6IG1pbixcbiAgICBcImFyaWEtdmFsdWVtYXhcIjogbWF4LFxuICAgIGNoaWxkcmVuOiB2aXN1YWxseUhpZGRlbiA/IC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICBjaGlsZHJlbjogbGFiZWxcbiAgICB9KSA6IGxhYmVsXG4gIH0pO1xufVxuXG5jb25zdCBQcm9ncmVzc0JhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGlzQ2hpbGQsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgcHJvcHMuYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgocHJvcHMuYnNQcmVmaXgsICdwcm9ncmVzcycpO1xuXG4gIGlmIChpc0NoaWxkKSB7XG4gICAgcmV0dXJuIHJlbmRlclByb2dyZXNzQmFyKHByb3BzLCByZWYpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIG1pbixcbiAgICBub3csXG4gICAgbWF4LFxuICAgIGxhYmVsLFxuICAgIHZpc3VhbGx5SGlkZGVuLFxuICAgIHN0cmlwZWQsXG4gICAgYW5pbWF0ZWQsXG4gICAgYnNQcmVmaXgsXG4gICAgdmFyaWFudCxcbiAgICBjbGFzc05hbWUsXG4gICAgY2hpbGRyZW4sXG4gICAgLi4ud3JhcHBlclByb3BzXG4gIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi53cmFwcGVyUHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiA/IG1hcChjaGlsZHJlbiwgY2hpbGQgPT4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgaXNDaGlsZDogdHJ1ZVxuICAgIH0pKSA6IHJlbmRlclByb2dyZXNzQmFyKHtcbiAgICAgIG1pbixcbiAgICAgIG5vdyxcbiAgICAgIG1heCxcbiAgICAgIGxhYmVsLFxuICAgICAgdmlzdWFsbHlIaWRkZW4sXG4gICAgICBzdHJpcGVkLFxuICAgICAgYW5pbWF0ZWQsXG4gICAgICBic1ByZWZpeCxcbiAgICAgIHZhcmlhbnRcbiAgICB9LCByZWYpXG4gIH0pO1xufSk7XG5Qcm9ncmVzc0Jhci5kaXNwbGF5TmFtZSA9ICdQcm9ncmVzc0Jhcic7XG5Qcm9ncmVzc0Jhci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0JhcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBhc3BlY3RSYXRpbzogJzF4MSdcbn07XG5cbmZ1bmN0aW9uIHRvUGVyY2VudChudW0pIHtcbiAgaWYgKG51bSA8PSAwIHx8IG51bSA+IDEwMCkgcmV0dXJuICcxMDAlJztcbiAgaWYgKG51bSA8IDEpIHJldHVybiBgJHtudW0gKiAxMDB9JWA7XG4gIHJldHVybiBgJHtudW19JWA7XG59XG5cbmNvbnN0IFJhdGlvID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGFzcGVjdFJhdGlvLFxuICBzdHlsZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3JhdGlvJyk7XG4gIGNvbnN0IGlzQ3VzdG9tUmF0aW8gPSB0eXBlb2YgYXNwZWN0UmF0aW8gPT09ICdudW1iZXInO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIHN0eWxlOiB7IC4uLnN0eWxlLFxuICAgICAgLi4uKGlzQ3VzdG9tUmF0aW8gJiYge1xuICAgICAgICAnLS1icy1hc3BlY3QtcmF0aW8nOiB0b1BlcmNlbnQoYXNwZWN0UmF0aW8pXG4gICAgICB9KVxuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGJzUHJlZml4LCBjbGFzc05hbWUsICFpc0N1c3RvbVJhdGlvICYmIGAke2JzUHJlZml4fS0ke2FzcGVjdFJhdGlvfWApLFxuICAgIGNoaWxkcmVuOiBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKVxuICB9KTtcbn0pO1xuUmF0aW8uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmF0aW87IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERFVklDRV9TSVpFUyA9IFsneHhsJywgJ3hsJywgJ2xnJywgJ21kJywgJ3NtJywgJ3hzJ107XG5jb25zdCBSb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBkZWNvcmF0ZWRCc1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3JvdycpO1xuICBjb25zdCBzaXplUHJlZml4ID0gYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LWNvbHNgO1xuICBjb25zdCBjbGFzc2VzID0gW107XG4gIERFVklDRV9TSVpFUy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgY29scztcblxuICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgKHtcbiAgICAgICAgY29sc1xuICAgICAgfSA9IHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHMgPSBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgaWYgKGNvbHMgIT0gbnVsbCkgY2xhc3Nlcy5wdXNoKGAke3NpemVQcmVmaXh9JHtpbmZpeH0tJHtjb2xzfWApO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGRlY29yYXRlZEJzUHJlZml4LCAuLi5jbGFzc2VzKVxuICB9KTtcbn0pO1xuUm93LmRpc3BsYXlOYW1lID0gJ1Jvdyc7XG5leHBvcnQgZGVmYXVsdCBSb3c7IiwiaW1wb3J0IHsgU1NSUHJvdmlkZXIgfSBmcm9tICdAcmVzdGFydC91aS9zc3InO1xuZXhwb3J0IGRlZmF1bHQgU1NSUHJvdmlkZXI7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFNwaW5uZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgdmFyaWFudCxcbiAgYW5pbWF0aW9uLFxuICBzaXplLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnc3Bpbm5lcicpO1xuICBjb25zdCBic1NwaW5uZXJQcmVmaXggPSBgJHtic1ByZWZpeH0tJHthbmltYXRpb259YDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzU3Bpbm5lclByZWZpeCwgc2l6ZSAmJiBgJHtic1NwaW5uZXJQcmVmaXh9LSR7c2l6ZX1gLCB2YXJpYW50ICYmIGB0ZXh0LSR7dmFyaWFudH1gKVxuICB9KTtcbn0pO1xuU3Bpbm5lci5kaXNwbGF5TmFtZSA9ICdTcGlubmVyJztcbmV4cG9ydCBkZWZhdWx0IFNwaW5uZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IEJ1dHRvbkdyb3VwIGZyb20gJy4vQnV0dG9uR3JvdXAnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4vRHJvcGRvd24nO1xuaW1wb3J0IHsgYWxpZ25Qcm9wVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFuIGh0bWwgaWQgYXR0cmlidXRlIGZvciB0aGUgVG9nZ2xlIGJ1dHRvbiwgbmVjZXNzYXJ5IGZvciBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBzdWNoIGFzIHNjcmVlbiByZWFkZXJzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgdG9nZ2xlOyB0aGUgdmFsdWUgb2YgYHRpdGxlYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgdG9nZ2xlTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGBocmVmYCBwYXNzZWQgdG8gdGhlIG5vbi10b2dnbGUgQnV0dG9uICovXG4gIGhyZWY6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGFuY2hvciBgdGFyZ2V0YCBwYXNzZWQgdG8gdGhlIG5vbi10b2dnbGUgQnV0dG9uICovXG4gIHRhcmdldDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gYG9uQ2xpY2tgIGhhbmRsZXIgcGFzc2VkIHRvIHRoZSBub24tdG9nZ2xlIEJ1dHRvbiAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogVGhlIGNvbnRlbnQgb2YgdGhlIG5vbi10b2dnbGUgQnV0dG9uLiAgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqIEEgYHR5cGVgIHBhc3NlZCB0byB0aGUgbm9uLXRvZ2dsZSBCdXR0b24gKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRGlzYWJsZXMgYm90aCBCdXR0b25zICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEFsaWducyB0aGUgZHJvcGRvd24gbWVudS5cbiAgICpcbiAgICogX3NlZSBbRHJvcGRvd25NZW51XSgjZHJvcGRvd24tbWVudS1wcm9wcykgZm9yIG1vcmUgZGV0YWlsc19cbiAgICpcbiAgICogQHR5cGUge1wic3RhcnRcInxcImVuZFwifHsgc206IFwic3RhcnRcInxcImVuZFwiIH18eyBtZDogXCJzdGFydFwifFwiZW5kXCIgfXx7IGxnOiBcInN0YXJ0XCJ8XCJlbmRcIiB9fHsgeGw6IFwic3RhcnRcInxcImVuZFwifXx7IHh4bDogXCJzdGFydFwifFwiZW5kXCJ9IH1cbiAgICovXG4gIGFsaWduOiBhbGlnblByb3BUeXBlLFxuXG4gIC8qKiBBbiBBUklBIGFjY2Vzc2libGUgcm9sZSBhcHBsaWVkIHRvIHRoZSBNZW51IGNvbXBvbmVudC4gV2hlbiBzZXQgdG8gJ21lbnUnLCBUaGUgZHJvcGRvd24gKi9cbiAgbWVudVJvbGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBkcm9wZG93biBtZW51IGluIHRoZSBET00gYmVmb3JlIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHNob3duICovXG4gIHJlbmRlck1lbnVPbk1vdW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogIFdoaWNoIGV2ZW50IHdoZW4gZmlyZWQgb3V0c2lkZSB0aGUgY29tcG9uZW50IHdpbGwgY2F1c2UgaXQgdG8gYmUgY2xvc2VkLlxuICAgKlxuICAgKiBfc2VlIFtEcm9wZG93bk1lbnVdKCNkcm9wZG93bi1tZW51LXByb3BzKSBmb3IgbW9yZSBkZXRhaWxzX1xuICAgKi9cbiAgcm9vdENsb3NlRXZlbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQGlnbm9yZSAqL1xuICBzaXplOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB0b2dnbGVMYWJlbDogJ1RvZ2dsZSBkcm9wZG93bicsXG4gIHR5cGU6ICdidXR0b24nXG59O1xuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGNvbXBvbmVudCBmb3Igc2ltcGxlIG9yIGdlbmVyYWwgdXNlIHNwbGl0IGJ1dHRvbiBkcm9wZG93bnMuIFJlbmRlcnMgYVxuICogYEJ1dHRvbkdyb3VwYCBjb250YWluaW5nIGEgYEJ1dHRvbmAgYW5kIGEgYEJ1dHRvbmAgdG9nZ2xlIGZvciB0aGUgYERyb3Bkb3duYC4gQWxsIGBjaGlsZHJlbmBcbiAqIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRlZmF1bHQgYERyb3Bkb3duLk1lbnVgLiBUaGlzIGNvbXBvbmVudCBhY2NlcHRzIGFsbCBvZiBbYERyb3Bkb3duYCdzXG4gKiBwcm9wc10oI2Ryb3Bkb3duLXByb3BzKS5cbiAqXG4gKiBfQWxsIHVua25vd24gcHJvcHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgRHJvcGRvd25gIGNvbXBvbmVudC5fXG4gKiBUaGUgQnV0dG9uIGB2YXJpYW50YCwgYHNpemVgIGFuZCBgYnNQcmVmaXhgIHByb3BzIGFyZSBwYXNzZWQgdG8gdGhlIGJ1dHRvbiBhbmQgdG9nZ2xlLFxuICogYW5kIG1lbnUtcmVsYXRlZCBwcm9wcyBhcmUgcGFzc2VkIHRvIHRoZSBgRHJvcGRvd24uTWVudWBcbiAqL1xuXG5jb25zdCBTcGxpdEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGlkLFxuICBic1ByZWZpeCxcbiAgc2l6ZSxcbiAgdmFyaWFudCxcbiAgdGl0bGUsXG4gIHR5cGUsXG4gIHRvZ2dsZUxhYmVsLFxuICBjaGlsZHJlbixcbiAgb25DbGljayxcbiAgaHJlZixcbiAgdGFyZ2V0LFxuICBtZW51Um9sZSxcbiAgcmVuZGVyTWVudU9uTW91bnQsXG4gIHJvb3RDbG9zZUV2ZW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeHMoRHJvcGRvd24sIHtcbiAgcmVmOiByZWYsXG4gIC4uLnByb3BzLFxuICBhczogQnV0dG9uR3JvdXAsXG4gIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goQnV0dG9uLCB7XG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICBic1ByZWZpeDogYnNQcmVmaXgsXG4gICAgaHJlZjogaHJlZixcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgY2hpbGRyZW46IHRpdGxlXG4gIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5Ub2dnbGUsIHtcbiAgICBzcGxpdDogdHJ1ZSxcbiAgICBpZDogaWQsXG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICBjaGlsZEJzUHJlZml4OiBic1ByZWZpeCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJ2aXN1YWxseS1oaWRkZW5cIixcbiAgICAgIGNoaWxkcmVuOiB0b2dnbGVMYWJlbFxuICAgIH0pXG4gIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5NZW51LCB7XG4gICAgcm9sZTogbWVudVJvbGUsXG4gICAgcmVuZGVyT25Nb3VudDogcmVuZGVyTWVudU9uTW91bnQsXG4gICAgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9KV1cbn0pKTtcblNwbGl0QnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblNwbGl0QnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblNwbGl0QnV0dG9uLmRpc3BsYXlOYW1lID0gJ1NwbGl0QnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IFNwbGl0QnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVVdGlsaXR5Q2xhc3NOYW1lLCB7IHJlc3BvbnNpdmVQcm9wVHlwZSB9IGZyb20gJy4vY3JlYXRlVXRpbGl0eUNsYXNzZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFN0YWNrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBkaXJlY3Rpb24sXG4gIGdhcCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnaHN0YWNrJyA6ICd2c3RhY2snKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgLi4uY3JlYXRlVXRpbGl0eUNsYXNzTmFtZSh7XG4gICAgICBnYXBcbiAgICB9KSlcbiAgfSk7XG59KTtcblN0YWNrLmRpc3BsYXlOYW1lID0gJ1N0YWNrJztcbmV4cG9ydCBkZWZhdWx0IFN0YWNrOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtQ2hlY2sgZnJvbSAnLi9Gb3JtQ2hlY2snO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFN3aXRjaCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ2hlY2ssIHsgLi4ucHJvcHMsXG4gIHJlZjogcmVmLFxuICB0eXBlOiBcInN3aXRjaFwiXG59KSk7XG5Td2l0Y2guZGlzcGxheU5hbWUgPSAnU3dpdGNoJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oU3dpdGNoLCB7XG4gIElucHV0OiBGb3JtQ2hlY2suSW5wdXQsXG4gIExhYmVsOiBGb3JtQ2hlY2suTGFiZWxcbn0pOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFiQ29udGFpbmVyIGZyb20gJy4vVGFiQ29udGFpbmVyJztcbmltcG9ydCBUYWJDb250ZW50IGZyb20gJy4vVGFiQ29udGVudCc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby11bnVzZWQtcHJvcC10eXBlcyAqL1xuY29uc3QgcHJvcFR5cGVzID0ge1xuICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuXG4gIC8qKlxuICAgKiBDb250ZW50IGZvciB0aGUgdGFiIHRpdGxlLlxuICAgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqXG4gICAqIFRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgdGFiLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDbGFzcyB0byBwYXNzIHRvIHRoZSB1bmRlcmx5aW5nIG5hdiBsaW5rLlxuICAgKi9cbiAgdGFiQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBUYWIgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignUmVhY3RCb290c3RyYXA6IFRoZSBgVGFiYCBjb21wb25lbnQgaXMgbm90IG1lYW50IHRvIGJlIHJlbmRlcmVkISAnICsgXCJJdCdzIGFuIGFic3RyYWN0IGNvbXBvbmVudCB0aGF0IGlzIG9ubHkgdmFsaWQgYXMgYSBkaXJlY3QgQ2hpbGQgb2YgdGhlIGBUYWJzYCBDb21wb25lbnQuIFwiICsgJ0ZvciBjdXN0b20gdGFicyBjb21wb25lbnRzIHVzZSBUYWJQYW5lIGFuZCBUYWJzQ29udGFpbmVyIGRpcmVjdGx5Jyk7IC8vIE5lZWRlZCBvdGhlcndpc2UgZG9jcyBlcnJvciBvdXQuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KF9GcmFnbWVudCwge30pO1xufTtcblxuVGFiLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oVGFiLCB7XG4gIENvbnRhaW5lcjogVGFiQ29udGFpbmVyLFxuICBDb250ZW50OiBUYWJDb250ZW50LFxuICBQYW5lOiBUYWJQYW5lXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFicyBmcm9tICdAcmVzdGFydC91aS9UYWJzJztcbmltcG9ydCBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50IGZyb20gJy4vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBUYWJDb250YWluZXIgPSAoe1xuICB0cmFuc2l0aW9uLFxuICAuLi5wcm9wc1xufSkgPT4gLyojX19QVVJFX18qL19qc3goVGFicywgeyAuLi5wcm9wcyxcbiAgdHJhbnNpdGlvbjogZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCh0cmFuc2l0aW9uKVxufSk7XG5cblRhYkNvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdUYWJDb250YWluZXInO1xuZXhwb3J0IGRlZmF1bHQgVGFiQ29udGFpbmVyOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCd0YWItY29udGVudCcpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE5vb3BUcmFuc2l0aW9uIGZyb20gJ0ByZXN0YXJ0L3VpL05vb3BUcmFuc2l0aW9uJztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCBmcm9tICdAcmVzdGFydC91aS9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tICdAcmVzdGFydC91aS9UYWJDb250ZXh0JztcbmltcG9ydCB7IHVzZVRhYlBhbmVsIH0gZnJvbSAnQHJlc3RhcnQvdWkvVGFiUGFuZWwnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50IGZyb20gJy4vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgVGFiUGFuZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICB0cmFuc2l0aW9uLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IFt7XG4gICAgY2xhc3NOYW1lLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gICAgLi4ucmVzdFxuICB9LCB7XG4gICAgaXNBY3RpdmUsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyaW5nLFxuICAgIG9uRW50ZXJlZCxcbiAgICBvbkV4aXQsXG4gICAgb25FeGl0aW5nLFxuICAgIG9uRXhpdGVkLFxuICAgIG1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0LFxuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb24gPSBOb29wVHJhbnNpdGlvblxuICB9XSA9IHVzZVRhYlBhbmVsKHsgLi4ucHJvcHMsXG4gICAgdHJhbnNpdGlvbjogZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCh0cmFuc2l0aW9uKVxuICB9KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndGFiLXBhbmUnKTsgLy8gV2UgcHJvdmlkZSBhbiBlbXB0eSB0aGUgVGFiQ29udGV4dCBzbyBgPE5hdj5gcyBpbiBgPFRhYlBhbmVsPmBzIGRvbid0XG4gIC8vIGNvbmZsaWN0IHdpdGggdGhlIHRvcCBsZXZlbCBvbmUuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFRhYkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goU2VsZWN0YWJsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFRyYW5zaXRpb24sIHtcbiAgICAgICAgaW46IGlzQWN0aXZlLFxuICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxuICAgICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQ6IG9uRW50ZXJlZCxcbiAgICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICBvbkV4aXRlZDogb25FeGl0ZWQsXG4gICAgICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgICAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0LFxuICAgICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnJlc3QsXG4gICAgICAgICAgcmVmOiByZWYsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBpc0FjdGl2ZSAmJiAnYWN0aXZlJylcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSk7XG59KTtcblRhYlBhbmUuZGlzcGxheU5hbWUgPSAnVGFiUGFuZSc7XG5leHBvcnQgZGVmYXVsdCBUYWJQYW5lOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBUYWJsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHN0cmlwZWQsXG4gIGJvcmRlcmVkLFxuICBib3JkZXJsZXNzLFxuICBob3ZlcixcbiAgc2l6ZSxcbiAgdmFyaWFudCxcbiAgcmVzcG9uc2l2ZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBkZWNvcmF0ZWRCc1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3RhYmxlJyk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGVjb3JhdGVkQnNQcmVmaXgsIHZhcmlhbnQgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LSR7dmFyaWFudH1gLCBzaXplICYmIGAke2RlY29yYXRlZEJzUHJlZml4fS0ke3NpemV9YCwgc3RyaXBlZCAmJiBgJHtkZWNvcmF0ZWRCc1ByZWZpeH0tc3RyaXBlZGAsIGJvcmRlcmVkICYmIGAke2RlY29yYXRlZEJzUHJlZml4fS1ib3JkZXJlZGAsIGJvcmRlcmxlc3MgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LWJvcmRlcmxlc3NgLCBob3ZlciAmJiBgJHtkZWNvcmF0ZWRCc1ByZWZpeH0taG92ZXJgKTtcblxuICBjb25zdCB0YWJsZSA9IC8qI19fUFVSRV9fKi9fanN4KFwidGFibGVcIiwgeyAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgcmVmOiByZWZcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICBsZXQgcmVzcG9uc2l2ZUNsYXNzID0gYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LXJlc3BvbnNpdmVgO1xuXG4gICAgaWYgKHR5cGVvZiByZXNwb25zaXZlID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzcG9uc2l2ZUNsYXNzID0gYCR7cmVzcG9uc2l2ZUNsYXNzfS0ke3Jlc3BvbnNpdmV9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByZXNwb25zaXZlQ2xhc3MsXG4gICAgICBjaGlsZHJlbjogdGFibGVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IEJhc2VUYWJzIGZyb20gJ0ByZXN0YXJ0L3VpL1RhYnMnO1xuaW1wb3J0IE5hdiBmcm9tICcuL05hdic7XG5pbXBvcnQgTmF2TGluayBmcm9tICcuL05hdkxpbmsnO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCBUYWJDb250ZW50IGZyb20gJy4vVGFiQ29udGVudCc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuaW1wb3J0IHsgZm9yRWFjaCwgbWFwIH0gZnJvbSAnLi9FbGVtZW50Q2hpbGRyZW4nO1xuaW1wb3J0IGdldFRhYlRyYW5zaXRpb25Db21wb25lbnQgZnJvbSAnLi9nZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICd0YWJzJyxcbiAgbW91bnRPbkVudGVyOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pIHtcbiAgbGV0IGRlZmF1bHRBY3RpdmVLZXk7XG4gIGZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICBpZiAoZGVmYXVsdEFjdGl2ZUtleSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0QWN0aXZlS2V5ID0gY2hpbGQucHJvcHMuZXZlbnRLZXk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRlZmF1bHRBY3RpdmVLZXk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRhYihjaGlsZCkge1xuICBjb25zdCB7XG4gICAgdGl0bGUsXG4gICAgZXZlbnRLZXksXG4gICAgZGlzYWJsZWQsXG4gICAgdGFiQ2xhc3NOYW1lLFxuICAgIGlkXG4gIH0gPSBjaGlsZC5wcm9wcztcblxuICBpZiAodGl0bGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE5hdkl0ZW0sIHtcbiAgICBhczogXCJsaVwiLFxuICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KE5hdkxpbmssIHtcbiAgICAgIGFzOiBcImJ1dHRvblwiLFxuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNsYXNzTmFtZTogdGFiQ2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW46IHRpdGxlXG4gICAgfSlcbiAgfSk7XG59XG5cbmNvbnN0IFRhYnMgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBvblNlbGVjdCxcbiAgICB0cmFuc2l0aW9uLFxuICAgIG1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0LFxuICAgIGNoaWxkcmVuLFxuICAgIGFjdGl2ZUtleSA9IGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3hzKEJhc2VUYWJzLCB7XG4gICAgaWQ6IGlkLFxuICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgIG9uU2VsZWN0OiBvblNlbGVjdCxcbiAgICB0cmFuc2l0aW9uOiBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50KHRyYW5zaXRpb24pLFxuICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgIHVubW91bnRPbkV4aXQ6IHVubW91bnRPbkV4aXQsXG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChOYXYsIHsgLi4uY29udHJvbGxlZFByb3BzLFxuICAgICAgcm9sZTogXCJ0YWJsaXN0XCIsXG4gICAgICBhczogXCJ1bFwiLFxuICAgICAgY2hpbGRyZW46IG1hcChjaGlsZHJlbiwgcmVuZGVyVGFiKVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChUYWJDb250ZW50LCB7XG4gICAgICBjaGlsZHJlbjogbWFwKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUHJvcHMgPSB7IC4uLmNoaWxkLnByb3BzXG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBjaGlsZFByb3BzLnRpdGxlO1xuICAgICAgICBkZWxldGUgY2hpbGRQcm9wcy5kaXNhYmxlZDtcbiAgICAgICAgZGVsZXRlIGNoaWxkUHJvcHMudGFiQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVGFiUGFuZSwgeyAuLi5jaGlsZFByb3BzXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59O1xuXG5UYWJzLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblRhYnMuZGlzcGxheU5hbWUgPSAnVGFicyc7XG5leHBvcnQgZGVmYXVsdCBUYWJzOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgVGhlbWVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBwcmVmaXhlczoge31cbn0pO1xuY29uc3Qge1xuICBDb25zdW1lcixcbiAgUHJvdmlkZXJcbn0gPSBUaGVtZUNvbnRleHQ7XG5cbmZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIoe1xuICBwcmVmaXhlcyA9IHt9LFxuICBkaXIsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBwcmVmaXhlczogeyAuLi5wcmVmaXhlc1xuICAgIH0sXG4gICAgZGlyXG4gIH0pLCBbcHJlZml4ZXMsIGRpcl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJvb3RzdHJhcFByZWZpeChwcmVmaXgsIGRlZmF1bHRQcmVmaXgpIHtcbiAgY29uc3Qge1xuICAgIHByZWZpeGVzXG4gIH0gPSB1c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG4gIHJldHVybiBwcmVmaXggfHwgcHJlZml4ZXNbZGVmYXVsdFByZWZpeF0gfHwgZGVmYXVsdFByZWZpeDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VJc1JUTCgpIHtcbiAgY29uc3Qge1xuICAgIGRpclxuICB9ID0gdXNlQ29udGV4dChUaGVtZUNvbnRleHQpO1xuICByZXR1cm4gZGlyID09PSAncnRsJztcbn1cblxuZnVuY3Rpb24gY3JlYXRlQm9vdHN0cmFwQ29tcG9uZW50KENvbXBvbmVudCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSBvcHRzID0ge1xuICAgIHByZWZpeDogb3B0c1xuICB9O1xuICBjb25zdCBpc0NsYXNzeSA9IENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50OyAvLyBJZiBpdCdzIGEgZnVuY3Rpb25hbCBjb21wb25lbnQgbWFrZSBzdXJlIHdlIGRvbid0IGJyZWFrIGl0IHdpdGggYSByZWZcblxuICBjb25zdCB7XG4gICAgcHJlZml4LFxuICAgIGZvcndhcmRSZWZBcyA9IGlzQ2xhc3N5ID8gJ3JlZicgOiAnaW5uZXJSZWYnXG4gIH0gPSBvcHRzO1xuICBjb25zdCBXcmFwcGVkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHsgLi4ucHJvcHNcbiAgfSwgcmVmKSA9PiB7XG4gICAgcHJvcHNbZm9yd2FyZFJlZkFzXSA9IHJlZjtcbiAgICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChwcm9wcy5ic1ByZWZpeCwgcHJlZml4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgICAgYnNQcmVmaXg6IGJzUHJlZml4XG4gICAgfSk7XG4gIH0pO1xuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gYEJvb3RzdHJhcCgke0NvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZX0pYDtcbiAgcmV0dXJuIFdyYXBwZWQ7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZUJvb3RzdHJhcENvbXBvbmVudCwgQ29uc3VtZXIgYXMgVGhlbWVDb25zdW1lciB9O1xuZXhwb3J0IGRlZmF1bHQgVGhlbWVQcm92aWRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VUaW1lb3V0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVRpbWVvdXQnO1xuaW1wb3J0IFRvYXN0RmFkZSBmcm9tICcuL1RvYXN0RmFkZSc7XG5pbXBvcnQgVG9hc3RIZWFkZXIgZnJvbSAnLi9Ub2FzdEhlYWRlcic7XG5pbXBvcnQgVG9hc3RCb2R5IGZyb20gJy4vVG9hc3RCb2R5JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgVG9hc3RDb250ZXh0IGZyb20gJy4vVG9hc3RDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBUb2FzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHRyYW5zaXRpb246IFRyYW5zaXRpb24gPSBUb2FzdEZhZGUsXG4gIHNob3cgPSB0cnVlLFxuICBhbmltYXRpb24gPSB0cnVlLFxuICBkZWxheSA9IDUwMDAsXG4gIGF1dG9oaWRlID0gZmFsc2UsXG4gIG9uQ2xvc2UsXG4gIGJnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndG9hc3QnKTsgLy8gV2UgdXNlIHJlZnMgZm9yIHRoZXNlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVzdGFydCB0aGUgYXV0b2hpZGVcbiAgLy8gdGltZXIgaW4gY2FzZSB0aGVzZSB2YWx1ZXMgY2hhbmdlLlxuXG4gIGNvbnN0IGRlbGF5UmVmID0gdXNlUmVmKGRlbGF5KTtcbiAgY29uc3Qgb25DbG9zZVJlZiA9IHVzZVJlZihvbkNsb3NlKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBkZWxheVJlZi5jdXJyZW50ID0gZGVsYXk7XG4gICAgb25DbG9zZVJlZi5jdXJyZW50ID0gb25DbG9zZTtcbiAgfSwgW2RlbGF5LCBvbkNsb3NlXSk7XG4gIGNvbnN0IGF1dG9oaWRlVGltZW91dCA9IHVzZVRpbWVvdXQoKTtcbiAgY29uc3QgYXV0b2hpZGVUb2FzdCA9ICEhKGF1dG9oaWRlICYmIHNob3cpO1xuICBjb25zdCBhdXRvaGlkZUZ1bmMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGF1dG9oaWRlVG9hc3QpIHtcbiAgICAgIG9uQ2xvc2VSZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogb25DbG9zZVJlZi5jdXJyZW50KCk7XG4gICAgfVxuICB9LCBbYXV0b2hpZGVUb2FzdF0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIE9ubHkgcmVzZXQgdGltZXIgaWYgc2hvdyBvciBhdXRvaGlkZSBjaGFuZ2VzLlxuICAgIGF1dG9oaWRlVGltZW91dC5zZXQoYXV0b2hpZGVGdW5jLCBkZWxheVJlZi5jdXJyZW50KTtcbiAgfSwgW2F1dG9oaWRlVGltZW91dCwgYXV0b2hpZGVGdW5jXSk7XG4gIGNvbnN0IHRvYXN0Q29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbkNsb3NlXG4gIH0pLCBbb25DbG9zZV0pO1xuICBjb25zdCBoYXNBbmltYXRpb24gPSAhIShUcmFuc2l0aW9uICYmIGFuaW1hdGlvbik7XG5cbiAgY29uc3QgdG9hc3QgPSAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhic1ByZWZpeCwgY2xhc3NOYW1lLCBiZyAmJiBgYmctJHtiZ31gLCAhaGFzQW5pbWF0aW9uICYmIChzaG93ID8gJ3Nob3cnIDogJ2hpZGUnKSksXG4gICAgcm9sZTogXCJhbGVydFwiLFxuICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICB9KTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVG9hc3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRvYXN0Q29udGV4dCxcbiAgICBjaGlsZHJlbjogaGFzQW5pbWF0aW9uICYmIFRyYW5zaXRpb24gPyAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uLCB7XG4gICAgICBpbjogc2hvdyxcbiAgICAgIHVubW91bnRPbkV4aXQ6IHRydWUsXG4gICAgICBjaGlsZHJlbjogdG9hc3RcbiAgICB9KSA6IHRvYXN0XG4gIH0pO1xufSk7XG5Ub2FzdC5kaXNwbGF5TmFtZSA9ICdUb2FzdCc7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKFRvYXN0LCB7XG4gIEJvZHk6IFRvYXN0Qm9keSxcbiAgSGVhZGVyOiBUb2FzdEhlYWRlclxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ3RvYXN0LWJvZHknKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgcG9zaXRpb25DbGFzc2VzID0ge1xuICAndG9wLXN0YXJ0JzogJ3RvcC0wIHN0YXJ0LTAnLFxuICAndG9wLWNlbnRlcic6ICd0b3AtMCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlLXgnLFxuICAndG9wLWVuZCc6ICd0b3AtMCBlbmQtMCcsXG4gICdtaWRkbGUtc3RhcnQnOiAndG9wLTUwIHN0YXJ0LTAgdHJhbnNsYXRlLW1pZGRsZS15JyxcbiAgJ21pZGRsZS1jZW50ZXInOiAndG9wLTUwIHN0YXJ0LTUwIHRyYW5zbGF0ZS1taWRkbGUnLFxuICAnbWlkZGxlLWVuZCc6ICd0b3AtNTAgZW5kLTAgdHJhbnNsYXRlLW1pZGRsZS15JyxcbiAgJ2JvdHRvbS1zdGFydCc6ICdib3R0b20tMCBzdGFydC0wJyxcbiAgJ2JvdHRvbS1jZW50ZXInOiAnYm90dG9tLTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZS14JyxcbiAgJ2JvdHRvbS1lbmQnOiAnYm90dG9tLTAgZW5kLTAnXG59O1xuY29uc3QgVG9hc3RDb250YWluZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgcG9zaXRpb24sXG4gIGNsYXNzTmFtZSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICd0b2FzdC1jb250YWluZXInKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhic1ByZWZpeCwgcG9zaXRpb24gJiYgYHBvc2l0aW9uLWFic29sdXRlICR7cG9zaXRpb25DbGFzc2VzW3Bvc2l0aW9uXX1gLCBjbGFzc05hbWUpXG4gIH0pO1xufSk7XG5Ub2FzdENvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdUb2FzdENvbnRhaW5lcic7XG5leHBvcnQgZGVmYXVsdCBUb2FzdENvbnRhaW5lcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUb2FzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25DbG9zZSgpIHt9XG5cbn0pO1xuZXhwb3J0IGRlZmF1bHQgVG9hc3RDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVOVEVSSU5HLCBFWElUSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZmFkZVN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3dpbmcnLFxuICBbRVhJVElOR106ICdzaG93aW5nIHNob3cnXG59O1xuY29uc3QgVG9hc3RGYWRlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHMsXG4gIHJlZjogcmVmLFxuICB0cmFuc2l0aW9uQ2xhc3NlczogZmFkZVN0eWxlc1xufSkpO1xuVG9hc3RGYWRlLmRpc3BsYXlOYW1lID0gJ1RvYXN0RmFkZSc7XG5leHBvcnQgZGVmYXVsdCBUb2FzdEZhZGU7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IENsb3NlQnV0dG9uIGZyb20gJy4vQ2xvc2VCdXR0b24nO1xuaW1wb3J0IFRvYXN0Q29udGV4dCBmcm9tICcuL1RvYXN0Q29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogdHJ1ZVxufTtcbmNvbnN0IFRvYXN0SGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsb3NlTGFiZWwsXG4gIGNsb3NlVmFyaWFudCxcbiAgY2xvc2VCdXR0b24sXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICd0b2FzdC1oZWFkZXInKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVG9hc3RDb250ZXh0KTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQub25DbG9zZSA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5vbkNsb3NlKGUpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGJzUHJlZml4LCBjbGFzc05hbWUpLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGNsb3NlQnV0dG9uICYmIC8qI19fUFVSRV9fKi9fanN4KENsb3NlQnV0dG9uLCB7XG4gICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VMYWJlbCxcbiAgICAgIHZhcmlhbnQ6IGNsb3NlVmFyaWFudCxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgXCJkYXRhLWRpc21pc3NcIjogXCJ0b2FzdFwiXG4gICAgfSldXG4gIH0pO1xufSk7XG5Ub2FzdEhlYWRlci5kaXNwbGF5TmFtZSA9ICdUb2FzdEhlYWRlcic7XG5Ub2FzdEhlYWRlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBUb2FzdEhlYWRlcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHVuZGVmaW5lZDtcblxuY29uc3QgVG9nZ2xlQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIG5hbWUsXG4gIGNsYXNzTmFtZSxcbiAgY2hlY2tlZCxcbiAgdHlwZSxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxuICBkaXNhYmxlZCxcbiAgaWQsXG4gIGlucHV0UmVmLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYnRuLWNoZWNrJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcImlucHV0XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYnNQcmVmaXgsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICBkaXNhYmxlZDogISFkaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSB8fCBub29wLFxuICAgICAgaWQ6IGlkXG4gICAgfSksIC8qI19fUFVSRV9fKi9fanN4KEJ1dHRvbiwgeyAuLi5wcm9wcyxcbiAgICAgIHJlZjogcmVmLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJyksXG4gICAgICB0eXBlOiB1bmRlZmluZWQsXG4gICAgICBhczogXCJsYWJlbFwiLFxuICAgICAgaHRtbEZvcjogaWRcbiAgICB9KV1cbiAgfSk7XG59KTtcblRvZ2dsZUJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdUb2dnbGVCdXR0b24nO1xuZXhwb3J0IGRlZmF1bHQgVG9nZ2xlQnV0dG9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBjaGFpbkZ1bmN0aW9uIGZyb20gJy4vY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vRWxlbWVudENoaWxkcmVuJztcbmltcG9ydCBCdXR0b25Hcm91cCBmcm9tICcuL0J1dHRvbkdyb3VwJztcbmltcG9ydCBUb2dnbGVCdXR0b24gZnJvbSAnLi9Ub2dnbGVCdXR0b24nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ3JhZGlvJyxcbiAgdmVydGljYWw6IGZhbHNlXG59O1xuY29uc3QgVG9nZ2xlQnV0dG9uR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgdHlwZSxcbiAgICBuYW1lLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgdmFsdWU6ICdvbkNoYW5nZSdcbiAgfSk7XG5cbiAgY29uc3QgZ2V0VmFsdWVzID0gKCkgPT4gdmFsdWUgPT0gbnVsbCA/IFtdIDogW10uY29uY2F0KHZhbHVlKTtcblxuICBjb25zdCBoYW5kbGVUb2dnbGUgPSAoaW5wdXRWYWwsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFvbkNoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGdldFZhbHVlcygpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdmFsdWVzLmluZGV4T2YoaW5wdXRWYWwpICE9PSAtMTtcblxuICAgIGlmICh0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICBpZiAoIWlzQWN0aXZlICYmIG9uQ2hhbmdlKSBvbkNoYW5nZShpbnB1dFZhbCwgZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgb25DaGFuZ2UodmFsdWVzLmZpbHRlcihuID0+IG4gIT09IGlucHV0VmFsKSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbkNoYW5nZShbLi4udmFsdWVzLCBpbnB1dFZhbF0sIGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgISh0eXBlICE9PSAncmFkaW8nIHx8ICEhbmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdBIGBuYW1lYCBpcyByZXF1aXJlZCB0byBncm91cCB0aGUgdG9nZ2xlIGJ1dHRvbnMgd2hlbiB0aGUgYHR5cGVgICcgKyAnaXMgc2V0IHRvIFwicmFkaW9cIicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEJ1dHRvbkdyb3VwLCB7IC4uLmNvbnRyb2xsZWRQcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjaGlsZHJlbjogbWFwKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IGNoaWxkVmFsLFxuICAgICAgICBvbkNoYW5nZTogY2hpbGRPbkNoYW5nZVxuICAgICAgfSA9IGNoaWxkLnByb3BzO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gZSA9PiBoYW5kbGVUb2dnbGUoY2hpbGRWYWwsIGUpO1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBjaGlsZC5uYW1lIHx8IG5hbWUsXG4gICAgICAgIGNoZWNrZWQ6IHZhbHVlcy5pbmRleE9mKGNoaWxkVmFsKSAhPT0gLTEsXG4gICAgICAgIG9uQ2hhbmdlOiBjaGFpbkZ1bmN0aW9uKGNoaWxkT25DaGFuZ2UsIGhhbmRsZXIpXG4gICAgICB9KTtcbiAgICB9KVxuICB9KTtcbn0pO1xuVG9nZ2xlQnV0dG9uR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihUb2dnbGVCdXR0b25Hcm91cCwge1xuICBCdXR0b246IFRvZ2dsZUJ1dHRvblxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGdldE92ZXJsYXlEaXJlY3Rpb24gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2VtZW50OiAncmlnaHQnXG59O1xuY29uc3QgVG9vbHRpcCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBwbGFjZW1lbnQsXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gIGNoaWxkcmVuLFxuICBhcnJvd1Byb3BzLFxuICBwb3BwZXI6IF8sXG4gIHNob3c6IF8yLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndG9vbHRpcCcpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG4gIGNvbnN0IFtwcmltYXJ5UGxhY2VtZW50XSA9IChwbGFjZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYWNlbWVudC5zcGxpdCgnLScpKSB8fCBbXTtcbiAgY29uc3QgYnNEaXJlY3Rpb24gPSBnZXRPdmVybGF5RGlyZWN0aW9uKHByaW1hcnlQbGFjZW1lbnQsIGlzUlRMKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IFwidG9vbHRpcFwiLFxuICAgIFwieC1wbGFjZW1lbnRcIjogcHJpbWFyeVBsYWNlbWVudCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgYGJzLXRvb2x0aXAtJHtic0RpcmVjdGlvbn1gKSxcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJ0b29sdGlwLWFycm93XCIsXG4gICAgICAuLi5hcnJvd1Byb3BzXG4gICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7YnNQcmVmaXh9LWlubmVyYCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXVxuICB9KTtcbn0pO1xuVG9vbHRpcC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5Ub29sdGlwLmRpc3BsYXlOYW1lID0gJ1Rvb2x0aXAnO1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcDsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCBzYWZlRmluZERPTU5vZGUgZnJvbSAnLi9zYWZlRmluZERPTU5vZGUnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbi8vIE5vcm1hbGl6ZXMgVHJhbnNpdGlvbiBjYWxsYmFja3Mgd2hlbiBub2RlUmVmIGlzIHVzZWQuXG5jb25zdCBUcmFuc2l0aW9uV3JhcHBlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIG9uRW50ZXIsXG4gIG9uRW50ZXJpbmcsXG4gIG9uRW50ZXJlZCxcbiAgb25FeGl0LFxuICBvbkV4aXRpbmcsXG4gIG9uRXhpdGVkLFxuICBhZGRFbmRMaXN0ZW5lcixcbiAgY2hpbGRyZW4sXG4gIGNoaWxkUmVmLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IG5vZGVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlZFJlZnMobm9kZVJlZiwgY2hpbGRSZWYpO1xuXG4gIGNvbnN0IGF0dGFjaFJlZiA9IHIgPT4ge1xuICAgIG1lcmdlZFJlZihzYWZlRmluZERPTU5vZGUocikpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZSA9IGNhbGxiYWNrID0+IHBhcmFtID0+IHtcbiAgICBpZiAoY2FsbGJhY2sgJiYgbm9kZVJlZi5jdXJyZW50KSB7XG4gICAgICBjYWxsYmFjayhub2RlUmVmLmN1cnJlbnQsIHBhcmFtKTtcbiAgICB9XG4gIH07XG4gIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuXG5cbiAgY29uc3QgaGFuZGxlRW50ZXIgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FbnRlciksIFtvbkVudGVyXSk7XG4gIGNvbnN0IGhhbmRsZUVudGVyaW5nID0gdXNlQ2FsbGJhY2sobm9ybWFsaXplKG9uRW50ZXJpbmcpLCBbb25FbnRlcmluZ10pO1xuICBjb25zdCBoYW5kbGVFbnRlcmVkID0gdXNlQ2FsbGJhY2sobm9ybWFsaXplKG9uRW50ZXJlZCksIFtvbkVudGVyZWRdKTtcbiAgY29uc3QgaGFuZGxlRXhpdCA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShvbkV4aXQpLCBbb25FeGl0XSk7XG4gIGNvbnN0IGhhbmRsZUV4aXRpbmcgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FeGl0aW5nKSwgW29uRXhpdGluZ10pO1xuICBjb25zdCBoYW5kbGVFeGl0ZWQgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FeGl0ZWQpLCBbb25FeGl0ZWRdKTtcbiAgY29uc3QgaGFuZGxlQWRkRW5kTGlzdGVuZXIgPSB1c2VDYWxsYmFjayhub3JtYWxpemUoYWRkRW5kTGlzdGVuZXIpLCBbYWRkRW5kTGlzdGVuZXJdKTtcbiAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMgKi9cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkVudGVyaW5nOiBoYW5kbGVFbnRlcmluZyxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0ZWQ6IGhhbmRsZUV4aXRlZCxcbiAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmcsXG4gICAgYWRkRW5kTGlzdGVuZXI6IGhhbmRsZUFkZEVuZExpc3RlbmVyLFxuICAgIG5vZGVSZWY6IG5vZGVSZWYsXG4gICAgY2hpbGRyZW46IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJyA/IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IGNoaWxkcmVuKHN0YXR1cywgeyAuLi5pbm5lclByb3BzLFxuICAgICAgcmVmOiBhdHRhY2hSZWZcbiAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIHJlZjogYXR0YWNoUmVmXG4gICAgfSlcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25XcmFwcGVyOyIsIi8qKlxuICogU2FmZSBjaGFpbmVkIGZ1bmN0aW9uXG4gKlxuICogV2lsbCBvbmx5IGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBpZiBuZWVkZWQsXG4gKiBvdGhlcndpc2Ugd2lsbCBwYXNzIGJhY2sgZXhpc3RpbmcgZnVuY3Rpb25zIG9yIG51bGwuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY3Rpb25zIHRvIGNoYWluXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb258bnVsbH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKC4uLmZ1bmNzKSB7XG4gIHJldHVybiBmdW5jcy5maWx0ZXIoZiA9PiBmICE9IG51bGwpLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQXJndW1lbnQgVHlwZSwgbXVzdCBvbmx5IHByb3ZpZGUgZnVuY3Rpb25zLCB1bmRlZmluZWQsIG9yIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjYyA9PT0gbnVsbCkgcmV0dXJuIGY7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBhY2MuYXBwbHkodGhpcywgYXJncyk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgZi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9LCBudWxsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2l2ZVByb3BUeXBlKHByb3BUeXBlKSB7XG4gIHJldHVybiBQcm9wVHlwZXMub25lT2ZUeXBlKFtwcm9wVHlwZSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICB4czogcHJvcFR5cGUsXG4gICAgc206IHByb3BUeXBlLFxuICAgIG1kOiBwcm9wVHlwZSxcbiAgICBsZzogcHJvcFR5cGUsXG4gICAgeGw6IHByb3BUeXBlLFxuICAgIHh4bDogcHJvcFR5cGVcbiAgfSldKTtcbn1cbmV4cG9ydCBjb25zdCBERVZJQ0VfU0laRVMgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVXRpbGl0eUNsYXNzTmFtZSh1dGlsaXR5VmFsdWVzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBbXTtcbiAgT2JqZWN0LmVudHJpZXModXRpbGl0eVZhbHVlcykuZm9yRWFjaCgoW3V0aWxOYW1lLCB1dGlsVmFsdWVdKSA9PiB7XG4gICAgaWYgKHV0aWxWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHV0aWxWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgREVWSUNFX1NJWkVTLmZvckVhY2goYnJrUG9pbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGJwVmFsdWUgPSB1dGlsVmFsdWVbYnJrUG9pbnRdO1xuXG4gICAgICAgICAgaWYgKGJwVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goYCR7dXRpbE5hbWV9JHtpbmZpeH0tJHticFZhbHVlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7dXRpbE5hbWV9LSR7dXRpbFZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbGFzc2VzO1xufSIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNhbWVsaXplIGZyb20gJ2RvbS1oZWxwZXJzL2NhbWVsaXplJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBwYXNjYWxDYXNlID0gc3RyID0+IHN0clswXS50b1VwcGVyQ2FzZSgpICsgY2FtZWxpemUoc3RyKS5zbGljZSgxKTtcblxuLy8gVE9ETzogZW1zdHJpY3RlbiAmIGZpeCB0aGUgdHlwaW5nIGhlcmUhIGBjcmVhdGVXaXRoQnNQcmVmaXg8VEVsZW1lbnRUeXBlPi4uLmBcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVdpdGhCc1ByZWZpeChwcmVmaXgsIHtcbiAgZGlzcGxheU5hbWUgPSBwYXNjYWxDYXNlKHByZWZpeCksXG4gIENvbXBvbmVudCxcbiAgZGVmYXVsdFByb3BzXG59ID0ge30pIHtcbiAgY29uc3QgQnNDb21wb25lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAgIGNsYXNzTmFtZSxcbiAgICBic1ByZWZpeCxcbiAgICBhczogVGFnID0gQ29tcG9uZW50IHx8ICdkaXYnLFxuICAgIC4uLnByb3BzXG4gIH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCBwcmVmaXgpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUYWcsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcmVzb2x2ZWRQcmVmaXgpLFxuICAgICAgLi4ucHJvcHNcbiAgICB9KTtcbiAgfSk7XG4gIEJzQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiAgQnNDb21wb25lbnQuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgcmV0dXJuIEJzQ29tcG9uZW50O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBkZWZhdWx0IChjbGFzc05hbWUgPT4gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHAsIHJlZikgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wLFxuICByZWY6IHJlZixcbiAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHAuY2xhc3NOYW1lLCBjbGFzc05hbWUpXG59KSkpOyIsImltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50KHRyYW5zaXRpb24pIHtcbiAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbiA/IEZhZGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdHJhbnNpdGlvbjtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgY2xhc3MgQnNQcmVmaXhDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge30gLy8gTmVlZCB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mIHR5cGVvZiBDb21wb25lbnQgdG8gZ2V0IHByb3BlciB0eXBlIGNoZWNraW5nLlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3ZlcmxheURpcmVjdGlvbihwbGFjZW1lbnQsIGlzUlRMKSB7XG4gIGxldCBic0RpcmVjdGlvbiA9IHBsYWNlbWVudDtcblxuICBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICBic0RpcmVjdGlvbiA9IGlzUlRMID8gJ2VuZCcgOiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIGJzRGlyZWN0aW9uID0gaXNSVEwgPyAnc3RhcnQnIDogJ2VuZCc7XG4gIH1cblxuICByZXR1cm4gYnNEaXJlY3Rpb247XG59IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb24gfSBmcm9tICcuL0FjY29yZGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFjY29yZGlvbkNvbnRleHQgfSBmcm9tICcuL0FjY29yZGlvbkNvbnRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25Db2xsYXBzZSB9IGZyb20gJy4vQWNjb3JkaW9uQ29sbGFwc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25CdXR0b24sIHVzZUFjY29yZGlvbkJ1dHRvbiB9IGZyb20gJy4vQWNjb3JkaW9uQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWxlcnQgfSBmcm9tICcuL0FsZXJ0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQW5jaG9yIH0gZnJvbSAnLi9BbmNob3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYWRnZSB9IGZyb20gJy4vQmFkZ2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCcmVhZGNydW1iIH0gZnJvbSAnLi9CcmVhZGNydW1iJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuL0JyZWFkY3J1bWJJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25Hcm91cCB9IGZyb20gJy4vQnV0dG9uR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25Ub29sYmFyIH0gZnJvbSAnLi9CdXR0b25Ub29sYmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZCB9IGZyb20gJy4vQ2FyZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRJbWcgfSBmcm9tICcuL0NhcmRJbWcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkR3JvdXAgfSBmcm9tICcuL0NhcmRHcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcm91c2VsIH0gZnJvbSAnLi9DYXJvdXNlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcm91c2VsSXRlbSB9IGZyb20gJy4vQ2Fyb3VzZWxJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2xvc2VCdXR0b24gfSBmcm9tICcuL0Nsb3NlQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29sIH0gZnJvbSAnLi9Db2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb2xsYXBzZSB9IGZyb20gJy4vQ29sbGFwc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93biB9IGZyb20gJy4vRHJvcGRvd24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93bkJ1dHRvbiB9IGZyb20gJy4vRHJvcGRvd25CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGYWRlIH0gZnJvbSAnLi9GYWRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybSB9IGZyb20gJy4vRm9ybSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1Db250cm9sIH0gZnJvbSAnLi9Gb3JtQ29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1DaGVjayB9IGZyb20gJy4vRm9ybUNoZWNrJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUZsb2F0aW5nIH0gZnJvbSAnLi9Gb3JtRmxvYXRpbmcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGbG9hdGluZ0xhYmVsIH0gZnJvbSAnLi9GbG9hdGluZ0xhYmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUdyb3VwIH0gZnJvbSAnLi9Gb3JtR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtTGFiZWwgfSBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1UZXh0IH0gZnJvbSAnLi9Gb3JtVGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1TZWxlY3QgfSBmcm9tICcuL0Zvcm1TZWxlY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb250YWluZXIgfSBmcm9tICcuL0NvbnRhaW5lcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEltYWdlIH0gZnJvbSAnLi9JbWFnZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpZ3VyZSB9IGZyb20gJy4vRmlndXJlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5wdXRHcm91cCB9IGZyb20gJy4vSW5wdXRHcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RHcm91cCB9IGZyb20gJy4vTGlzdEdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEdyb3VwSXRlbSB9IGZyb20gJy4vTGlzdEdyb3VwSXRlbSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vZGFsIH0gZnJvbSAnLi9Nb2RhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vZGFsQm9keSB9IGZyb20gJy4vTW9kYWxCb2R5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxEaWFsb2cgfSBmcm9tICcuL01vZGFsRGlhbG9nJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxGb290ZXIgfSBmcm9tICcuL01vZGFsRm9vdGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxUaXRsZSB9IGZyb20gJy4vTW9kYWxUaXRsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdiB9IGZyb20gJy4vTmF2JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmF2YmFyIH0gZnJvbSAnLi9OYXZiYXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZiYXJCcmFuZCB9IGZyb20gJy4vTmF2YmFyQnJhbmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZEcm9wZG93biB9IGZyb20gJy4vTmF2RHJvcGRvd24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZJdGVtIH0gZnJvbSAnLi9OYXZJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmF2TGluayB9IGZyb20gJy4vTmF2TGluayc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE9mZmNhbnZhcyB9IGZyb20gJy4vT2ZmY2FudmFzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT2ZmY2FudmFzSGVhZGVyIH0gZnJvbSAnLi9PZmZjYW52YXNIZWFkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBPZmZjYW52YXNUaXRsZSB9IGZyb20gJy4vT2ZmY2FudmFzVGl0bGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBPZmZjYW52YXNCb2R5IH0gZnJvbSAnLi9PZmZjYW52YXNCb2R5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE92ZXJsYXlUcmlnZ2VyIH0gZnJvbSAnLi9PdmVybGF5VHJpZ2dlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhZ2VJdGVtIH0gZnJvbSAnLi9QYWdlSXRlbSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhZ2luYXRpb24gfSBmcm9tICcuL1BhZ2luYXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFjZWhvbGRlciB9IGZyb20gJy4vUGxhY2Vob2xkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFjZWhvbGRlckJ1dHRvbiB9IGZyb20gJy4vUGxhY2Vob2xkZXJCdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb3BvdmVyIH0gZnJvbSAnLi9Qb3BvdmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wb3ZlckhlYWRlciB9IGZyb20gJy4vUG9wb3ZlckhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvcG92ZXJCb2R5IH0gZnJvbSAnLi9Qb3BvdmVyQm9keSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFByb2dyZXNzQmFyIH0gZnJvbSAnLi9Qcm9ncmVzc0Jhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJhdGlvIH0gZnJvbSAnLi9SYXRpbyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJvdyB9IGZyb20gJy4vUm93JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3Bpbm5lciB9IGZyb20gJy4vU3Bpbm5lcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNwbGl0QnV0dG9uIH0gZnJvbSAnLi9TcGxpdEJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNTUlByb3ZpZGVyIH0gZnJvbSAnLi9TU1JQcm92aWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0YWNrIH0gZnJvbSAnLi9TdGFjayc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYiB9IGZyb20gJy4vVGFiJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFiQ29udGFpbmVyIH0gZnJvbSAnLi9UYWJDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJDb250ZW50IH0gZnJvbSAnLi9UYWJDb250ZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGUgfSBmcm9tICcuL1RhYmxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFiUGFuZSB9IGZyb20gJy4vVGFiUGFuZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYnMgfSBmcm9tICcuL1RhYnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUaGVtZVByb3ZpZGVyIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVG9hc3QgfSBmcm9tICcuL1RvYXN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVG9hc3RCb2R5IH0gZnJvbSAnLi9Ub2FzdEJvZHknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2FzdEhlYWRlciB9IGZyb20gJy4vVG9hc3RIZWFkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2FzdENvbnRhaW5lciB9IGZyb20gJy4vVG9hc3RDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2dnbGVCdXR0b24gfSBmcm9tICcuL1RvZ2dsZUJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvZ2dsZUJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9Ub2dnbGVCdXR0b25Hcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAnOyIsImltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2FmZUZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ICYmICdzZXRTdGF0ZScgaW4gY29tcG9uZW50T3JFbGVtZW50KSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NLmZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50ICE9IG51bGwgPyBjb21wb25lbnRPckVsZW1lbnQgOiBudWxsO1xufSIsImltcG9ydCBjc3MgZnJvbSAnZG9tLWhlbHBlcnMvY3NzJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kIGZyb20gJ2RvbS1oZWxwZXJzL3RyYW5zaXRpb25FbmQnO1xuXG5mdW5jdGlvbiBwYXJzZUR1cmF0aW9uKG5vZGUsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHN0ciA9IGNzcyhub2RlLCBwcm9wZXJ0eSkgfHwgJyc7XG4gIGNvbnN0IG11bHQgPSBzdHIuaW5kZXhPZignbXMnKSA9PT0gLTEgPyAxMDAwIDogMTtcbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKSAqIG11bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRMaXN0ZW5lcihlbGVtZW50LCBoYW5kbGVyKSB7XG4gIGNvbnN0IGR1cmF0aW9uID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJyk7XG4gIGNvbnN0IGRlbGF5ID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkRlbGF5Jyk7XG4gIGNvbnN0IHJlbW92ZSA9IHRyYW5zaXRpb25FbmQoZWxlbWVudCwgZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbGVtZW50KSB7XG4gICAgICByZW1vdmUoKTtcbiAgICAgIGhhbmRsZXIoZSk7XG4gICAgfVxuICB9LCBkdXJhdGlvbiArIGRlbGF5KTtcbn0iLCIvLyByZWFkaW5nIGEgZGltZW5zaW9uIHByb3Agd2lsbCBjYXVzZSB0aGUgYnJvd3NlciB0byByZWNhbGN1bGF0ZSxcbi8vIHdoaWNoIHdpbGwgbGV0IG91ciBhbmltYXRpb25zIHdvcmtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyaWdnZXJCcm93c2VyUmVmbG93KG5vZGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgbm9kZS5vZmZzZXRIZWlnaHQ7XG59IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmNvbnN0IGFsaWduRGlyZWN0aW9uID0gUHJvcFR5cGVzLm9uZU9mKFsnc3RhcnQnLCAnZW5kJ10pO1xuZXhwb3J0IGNvbnN0IGFsaWduUHJvcFR5cGUgPSBQcm9wVHlwZXMub25lT2ZUeXBlKFthbGlnbkRpcmVjdGlvbiwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgc206IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgbWQ6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgbGc6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgeGw6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgeHhsOiBhbGlnbkRpcmVjdGlvblxufSldKTsiLCJpbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaGFzQ2xhc3MgZnJvbSAnZG9tLWhlbHBlcnMvaGFzQ2xhc3MnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBQb3BvdmVyIGZyb20gJy4vUG9wb3Zlcic7IC8vIFRoaXMgaXMgbWVhbnQgZm9yIGludGVybmFsIHVzZS5cbi8vIFRoaXMgYXBwbGllcyBhIGN1c3RvbSBvZmZzZXQgdG8gdGhlIG92ZXJsYXkgaWYgaXQncyBhIHBvcG92ZXIuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU92ZXJsYXlPZmZzZXQoKSB7XG4gIGNvbnN0IG92ZXJsYXlSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHBvcG92ZXJDbGFzcyA9IHVzZUJvb3RzdHJhcFByZWZpeCh1bmRlZmluZWQsICdwb3BvdmVyJyk7XG4gIGNvbnN0IG9mZnNldCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBvZmZzZXQ6ICgpID0+IHtcbiAgICAgICAgaWYgKG92ZXJsYXlSZWYuY3VycmVudCAmJiBoYXNDbGFzcyhvdmVybGF5UmVmLmN1cnJlbnQsIHBvcG92ZXJDbGFzcykpIHtcbiAgICAgICAgICByZXR1cm4gUG9wb3Zlci5QT1BQRVJfT0ZGU0VUO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBbcG9wb3ZlckNsYXNzXSk7XG4gIHJldHVybiBbb3ZlcmxheVJlZiwgW29mZnNldF1dO1xufSIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IHVzZUNvbCB9IGZyb20gJy4vQ29sJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBsYWNlaG9sZGVyKHtcbiAgYW5pbWF0aW9uLFxuICBiZyxcbiAgYnNQcmVmaXgsXG4gIHNpemUsXG4gIC4uLnByb3BzXG59KSB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAncGxhY2Vob2xkZXInKTtcbiAgY29uc3QgW3tcbiAgICBjbGFzc05hbWUsXG4gICAgLi4uY29sUHJvcHNcbiAgfV0gPSB1c2VDb2wocHJvcHMpO1xuICByZXR1cm4geyAuLi5jb2xQcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBhbmltYXRpb24gPyBgJHtic1ByZWZpeH0tJHthbmltYXRpb259YCA6IGJzUHJlZml4LCBzaXplICYmIGAke2JzUHJlZml4fS0ke3NpemV9YCwgYmcgJiYgYGJnLSR7Ymd9YClcbiAgfTtcbn0iLCJpbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgY29tcG9uZW50TmFtZSkge1xuICAvLyBAdHMtaWdub3JlXG4gIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHJldHVybiByZWY7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuXG4gIGNvbnN0IHdhcm5pbmdSZWYgPSB1c2VDYWxsYmFjayhyZWZWYWx1ZSA9PiB7XG4gICAgIShyZWZWYWx1ZSA9PSBudWxsIHx8ICFyZWZWYWx1ZS5pc1JlYWN0Q29tcG9uZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYCR7Y29tcG9uZW50TmFtZX0gaW5qZWN0ZWQgYSByZWYgdG8gYSBwcm92aWRlZCBcXGBhc1xcYCBjb21wb25lbnQgdGhhdCByZXNvbHZlZCB0byBhIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkIG9mIGEgRE9NIGVsZW1lbnQuIGAgKyAnVXNlIGBSZWFjdC5mb3J3YXJkUmVmYCB0byBwcm92aWRlIHRoZSBpbmplY3RlZCByZWYgdG8gdGhlIGNsYXNzIGNvbXBvbmVudCBhcyBhIHByb3AgaW4gb3JkZXIgdG8gcGFzcyBpdCBkaXJlY3RseSB0byBhIERPTSBlbGVtZW50JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB9LCBbY29tcG9uZW50TmFtZV0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcblxuICByZXR1cm4gdXNlTWVyZ2VkUmVmcyh3YXJuaW5nUmVmLCByZWYpO1xufSIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG52YXIgdHJhY2luZyA9IHJlcXVpcmUoJ3NjaGVkdWxlci90cmFjaW5nJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuaWYgKCFSZWFjdCkge1xuICB7XG4gICAgdGhyb3cgRXJyb3IoIFwiUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS5cIiApO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBGdW5kYW1lbnRhbENvbXBvbmVudCA9IDIwO1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgQmxvY2sgPSAyMjtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMztcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyNDtcblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlRnVuZGFtZW50YWxBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIFNjb3BlIHN1cHBvcnQuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIHdoaWxlIHVubW91bnRpbmcgKG9yIGFmdGVyIGluIHRoZSBjYXNlIG9mIHBhc3NpdmUgZWZmZWN0cylcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7XG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgSUQsIGl0J3MgZXhwZWN0ZWQgdGhhdFxuICAgIC8vIHRoZSBuZXh0IHByb3AgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHNlcnZlciB2YWx1ZSwgc28ganVzdCByZXR1cm5cbiAgICAvLyBleHBlY3RlZFxuXG5cbiAgICBpZiAoaXNPcGFxdWVIeWRyYXRpbmdPYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQmxvY2s6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUuX3JlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SXNSZW5kZXJpbmcoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNSZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJzsgLy8gRmxhdHRlbiBjaGlsZHJlbi4gV2UnbGwgd2FybiBpZiB0aGV5IGFyZSBpbnZhbGlkXG4gIC8vIGR1cmluZyB2YWxpZGF0ZVByb3BzKCkgd2hpY2ggcnVucyBmb3IgaHlkcmF0aW9uIHRvby5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgdGhyb3cgb24gbm9uLWVsZW1lbnQgb2JqZWN0cy5cbiAgLy8gRWxlbWVudHMgYXJlIHN0cmluZ2lmaWVkICh3aGljaCBpcyBub3JtYWxseSBpcnJlbGV2YW50XG4gIC8vIGJ1dCBtYXR0ZXJzIGZvciA8ZmJ0PikuXG5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ICs9IGNoaWxkOyAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlIHBhdGggdG9vLlxuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBjb2RlIHBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgfSwgcHJvcHMpO1xuXG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAoIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImBkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LlwiICk7XG4gICAgfVxuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZGVmYXVsdFZhbHVlID09IG51bGwpKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKCEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCBcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xudmFyIE5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6IEhUTUxfTkFNRVNQQUNFLFxuICBtYXRobWw6IE1BVEhfTkFNRVNQQUNFLFxuICBzdmc6IFNWR19OQU1FU1BBQ0Vcbn07IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2Zykge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBfYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggdGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocHJvcHMuc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5JDEuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xudmFyIElTX1JFUExBWUVEID0gMSA8PCA0O1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZGlzY3JldGVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYiwgYywgZCkge1xuICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG59O1xuXG52YXIgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCA9IGJhdGNoZWRVcGRhdGVzSW1wbDtcbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xudmFyIGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYm9va2tlZXBpbmcpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRFdmVudFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0JhdGNoaW5nRXZlbnRVcGRhdGVzID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ0V2ZW50VXBkYXRlcyA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZJc0luc2lkZUV2ZW50SGFuZGxlciA9IGlzSW5zaWRlRXZlbnRIYW5kbGVyO1xuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGlzY3JldGVVcGRhdGVzSW1wbChmbiwgYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBwcmV2SXNJbnNpZGVFdmVudEhhbmRsZXI7XG5cbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoRGlzY3JldGVVcGRhdGVzSWZOZWVkZWQodGltZVN0YW1wKSB7XG4gIHtcbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwsIF9iYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBkaXNjcmV0ZVVwZGF0ZXNJbXBsID0gX2Rpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGZsdXNoRGlzY3JldGVVcGRhdGVzSW1wbCA9IF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGJhdGNoZWRFdmVudFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRFdmVudFVwZGF0ZXNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghKCFsaXN0ZW5lciB8fCB0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29raW5jdWJhdG9yL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICghKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50IHNjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSBmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0IGNhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgdG8gYmUgYXN5bmNocm9ub3VzLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImNsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBQbGFjZW1lbnRBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG42O1xudmFyIERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7IC8vIFRPRE8gKGVmZmVjdHMpIFJlbW92ZSB0aGlzIGJpdCBvbmNlIHRoZSBuZXcgcmVjb25jaWxlciBpcyBzeW5jZWQgdG8gdGhlIG9sZC5cblxudmFyIFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldiA9XG4vKiAgICAgKi9cbjgxOTI7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBIeWRyYXRpbmdBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG4xMDI4OyAvLyBQYXNzaXZlICYgVXBkYXRlICYgQ2FsbGJhY2sgJiBSZWYgJiBTbmFwc2hvdFxuXG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAqL1xuOTMyOyAvLyBVbmlvbiBvZiBhbGwgaG9zdCBlZmZlY3RzXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4yMDQ3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjE2Mzg0OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXJGaWJlci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmICghKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmICghKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShhLmFsdGVybmF0ZSA9PT0gYikpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmICghKGEudGFnID09PSBIb3N0Um9vdCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG5cbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cblxuXG4gIHZhciBub2RlID0gY3VycmVudFBhcmVudDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKCFub2RlLnNpYmxpbmcpIHtcbiAgICAgIGlmICghbm9kZS5yZXR1cm4gfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuXG4gIGlmICghY3VycmVudFBhcmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG5cblxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0IHx8IGVuYWJsZUZ1bmRhbWVudGFsQVBJICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAoIW5vZGUuc2libGluZykge1xuICAgICAgaWYgKCFub2RlLnJldHVybiB8fCBub2RlLnJldHVybiA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgbmVlZHMgdGhlIHJldHVybiBudWxsIGhlcmUsIGJ1dCBFU0xpbnQgY29tcGxhaW5zIGFib3V0IGl0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZG9lc0ZpYmVyQ29udGFpbihwYXJlbnRGaWJlciwgY2hpbGRGaWJlcikge1xuICB2YXIgbm9kZSA9IGNoaWxkRmliZXI7XG4gIHZhciBwYXJlbnRGaWJlckFsdGVybmF0ZSA9IHBhcmVudEZpYmVyLmFsdGVybmF0ZTtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlID09PSBwYXJlbnRGaWJlciB8fCBub2RlID09PSBwYXJlbnRGaWJlckFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbmZ1bmN0aW9uIGhhc1F1ZXVlZERpc2NyZXRlRXZlbnRzKCkge1xuICByZXR1cm4gcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMDtcbn1cbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzIHwgSVNfUkVQTEFZRUQsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRGlzY3JldGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5wdXNoKHF1ZXVlZEV2ZW50KTtcbn0gLy8gUmVzZXRzIHRoZSByZXBsYXlpbmcgZm9yIHRoaXMgdHlwZSBvZiBjb250aW51b3VzIGV2ZW50IHRvIG5vIGV2ZW50LlxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LmxhbmVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gRmlyc3QgcmVwbGF5IGRpc2NyZXRlIGV2ZW50cy5cblxuICB3aGlsZSAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RGlzY3JldGVFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdO1xuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIC8vIEluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIGJvdW5kYXJ5IHRvIHVuYmxvY2tcbiAgICAgIC8vIHRoZSBuZXh0IGRpc2NyZXRlIGV2ZW50LlxuICAgICAgdmFyIF9maWJlcjQgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oX2ZpYmVyNCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRDb250YWluZXJzID0gbmV4dERpc2NyZXRlRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICAgIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBhdHRlbXB0VG9EaXNwYXRjaEV2ZW50KG5leHREaXNjcmV0ZUV2ZW50LmRvbUV2ZW50TmFtZSwgbmV4dERpc2NyZXRlRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuZXh0RGlzY3JldGVFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgICAgbmV4dERpc2NyZXRlRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UndmUgc3VjY2Vzc2Z1bGx5IHJlcGxheWVkIHRoZSBmaXJzdCBldmVudC4gTGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAgIHF1ZXVlZERpc2NyZXRlRXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9IC8vIE5leHQgcmVwbGF5IGFueSBjb250aW51b3VzIGV2ZW50cy5cblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnQgPSAwO1xudmFyIFVzZXJCbG9ja2luZ0V2ZW50ID0gMTtcbnZhciBDb250aW51b3VzRXZlbnQgPSAyO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTtcbnZhciBldmVudFByaW9yaXRpZXMgPSBuZXcgTWFwKCk7IC8vIFdlIHN0b3JlIG1vc3Qgb2YgdGhlIGV2ZW50cyBpbiB0aGlzIG1vZHVsZSBpbiBwYWlycyBvZiB0d28gc3RyaW5ncyBzbyB3ZSBjYW4gcmUtdXNlXG4vLyB0aGUgY29kZSByZXF1aXJlZCB0byBhcHBseSB0aGUgc2FtZSBsb2dpYyBmb3IgZXZlbnQgcHJpb3JpdGl6YXRpb24gYW5kIHRoYXQgb2YgdGhlXG4vLyBTaW1wbGVFdmVudFBsdWdpbi4gVGhpcyBjb21wbGljYXRlcyB0aGluZ3Mgc2xpZ2h0bHksIGJ1dCB0aGUgYWltIGlzIHRvIHJlZHVjZSBjb2RlXG4vLyBkdXBsaWNhdGlvbiAoZm9yIHdoaWNoIHRoZXJlIHdvdWxkIGJlIHF1aXRlIGEgYml0KS4gRm9yIHRoZSBldmVudHMgdGhhdCBhcmUgbm90IG5lZWRlZFxuLy8gZm9yIHRoZSBTaW1wbGVFdmVudFBsdWdpbiAob3RoZXJEaXNjcmV0ZUV2ZW50cykgd2UgcHJvY2VzcyB0aGVtIHNlcGFyYXRlbHkgYXMgYW5cbi8vIGFycmF5IG9mIHRvcCBsZXZlbCBldmVudHMuXG4vLyBMYXN0bHksIHdlIGlnbm9yZSBwcmV0dGllciBzbyB3ZSBjYW4ga2VlcCB0aGUgZm9ybWF0dGluZyBzYW5lLlxuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBkaXNjcmV0ZUV2ZW50UGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiA9IFsnY2FuY2VsJywgJ2NhbmNlbCcsICdjbGljaycsICdjbGljaycsICdjbG9zZScsICdjbG9zZScsICdjb250ZXh0bWVudScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2NvcHknLCAnY3V0JywgJ2N1dCcsICdhdXhjbGljaycsICdhdXhDbGljaycsICdkYmxjbGljaycsICdkb3VibGVDbGljaycsIC8vIENhcmVmdWwhXG4nZHJhZ2VuZCcsICdkcmFnRW5kJywgJ2RyYWdzdGFydCcsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkcm9wJywgJ2ZvY3VzaW4nLCAnZm9jdXMnLCAvLyBDYXJlZnVsIVxuJ2ZvY3Vzb3V0JywgJ2JsdXInLCAvLyBDYXJlZnVsIVxuJ2lucHV0JywgJ2lucHV0JywgJ2ludmFsaWQnLCAnaW52YWxpZCcsICdrZXlkb3duJywgJ2tleURvd24nLCAna2V5cHJlc3MnLCAna2V5UHJlc3MnLCAna2V5dXAnLCAna2V5VXAnLCAnbW91c2Vkb3duJywgJ21vdXNlRG93bicsICdtb3VzZXVwJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGFzdGUnLCAncGF1c2UnLCAncGF1c2UnLCAncGxheScsICdwbGF5JywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVyRG93bicsICdwb2ludGVydXAnLCAncG9pbnRlclVwJywgJ3JhdGVjaGFuZ2UnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNldCcsICdzZWVrZWQnLCAnc2Vla2VkJywgJ3N1Ym1pdCcsICdzdWJtaXQnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hFbmQnLCAndG91Y2hzdGFydCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZWNoYW5nZScsICd2b2x1bWVDaGFuZ2UnXTtcbnZhciBvdGhlckRpc2NyZXRlRXZlbnRzID0gWydjaGFuZ2UnLCAnc2VsZWN0aW9uY2hhbmdlJywgJ3RleHRJbnB1dCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9udXBkYXRlJ107XG5cblxudmFyIHVzZXJCbG9ja2luZ1BhaXJzRm9yU2ltcGxlRXZlbnRQbHVnaW4gPSBbJ2RyYWcnLCAnZHJhZycsICdkcmFnZW50ZXInLCAnZHJhZ0VudGVyJywgJ2RyYWdleGl0JywgJ2RyYWdFeGl0JywgJ2RyYWdsZWF2ZScsICdkcmFnTGVhdmUnLCAnZHJhZ292ZXInLCAnZHJhZ092ZXInLCAnbW91c2Vtb3ZlJywgJ21vdXNlTW92ZScsICdtb3VzZW91dCcsICdtb3VzZU91dCcsICdtb3VzZW92ZXInLCAnbW91c2VPdmVyJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJvdXQnLCAncG9pbnRlck91dCcsICdwb2ludGVyb3ZlcicsICdwb2ludGVyT3ZlcicsICdzY3JvbGwnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b2dnbGUnLCAndG91Y2htb3ZlJywgJ3RvdWNoTW92ZScsICd3aGVlbCcsICd3aGVlbCddOyAvLyBwcmV0dGllci1pZ25vcmVcblxudmFyIGNvbnRpbnVvdXNQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luID0gWydhYm9ydCcsICdhYm9ydCcsIEFOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnLCBBTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJywgQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnLCAnY2FucGxheScsICdjYW5QbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2NhblBsYXlUaHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2Vycm9yJywgJ2dvdHBvaW50ZXJjYXB0dXJlJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2xvYWQnLCAnbG9hZCcsICdsb2FkZWRkYXRhJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ2xvYWRTdGFydCcsICdsb3N0cG9pbnRlcmNhcHR1cmUnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ3BsYXlpbmcnLCAncGxheWluZycsICdwcm9ncmVzcycsICdwcm9ncmVzcycsICdzZWVraW5nJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3RpbWVVcGRhdGUnLCBUUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnLCAnd2FpdGluZycsICd3YWl0aW5nJ107XG4vKipcbiAqIFR1cm5zXG4gKiBbJ2Fib3J0JywgLi4uXVxuICpcbiAqIGludG9cbiAqXG4gKiB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoW1xuICogICBbJ2Fib3J0JywgJ29uQWJvcnQnXSxcbiAqIF0pO1xuICpcbiAqIGFuZCByZWdpc3RlcnMgdGhlbS5cbiAqL1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhldmVudFR5cGVzLCBwcmlvcml0eSkge1xuICAvLyBBcyB0aGUgZXZlbnQgdHlwZXMgYXJlIGluIHBhaXJzIG9mIHR3bywgd2UgbmVlZCB0byBpdGVyYXRlXG4gIC8vIHRocm91Z2ggaW4gdHdvcy4gVGhlIGV2ZW50cyBhcmUgaW4gcGFpcnMgb2YgdHdvIHRvIHNhdmUgY29kZVxuICAvLyBhbmQgaW1wcm92ZSBpbml0IHBlcmYgb2YgcHJvY2Vzc2luZyB0aGlzIGFycmF5LCBhcyBpdCB3aWxsXG4gIC8vIHJlc3VsdCBpbiBmYXIgZmV3ZXIgb2JqZWN0IGFsbG9jYXRpb25zIGFuZCBwcm9wZXJ0eSBhY2Nlc3Nlc1xuICAvLyBpZiB3ZSBvbmx5IHVzZSB0aHJlZSBhcnJheXMgdG8gcHJvY2VzcyBhbGwgdGhlIGNhdGVnb3JpZXMgb2ZcbiAgLy8gaW5zdGVhZCBvZiB0dXBsZXMuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB0b3BFdmVudCA9IGV2ZW50VHlwZXNbaV07XG4gICAgdmFyIGV2ZW50ID0gZXZlbnRUeXBlc1tpICsgMV07XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gICAgdmFyIHJlYWN0TmFtZSA9ICdvbicgKyBjYXBpdGFsaXplZEV2ZW50O1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQodG9wRXZlbnQsIHByaW9yaXR5KTtcbiAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQodG9wRXZlbnQsIHJlYWN0TmFtZSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW3RvcEV2ZW50XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnRQcmlvcml0aWVzKGV2ZW50VHlwZXMsIHByaW9yaXR5KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQoZXZlbnRUeXBlc1tpXSwgcHJpb3JpdHkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHlGb3JQbHVnaW5TeXN0ZW0oZG9tRXZlbnROYW1lKSB7XG4gIHZhciBwcmlvcml0eSA9IGV2ZW50UHJpb3JpdGllcy5nZXQoZG9tRXZlbnROYW1lKTsgLy8gRGVmYXVsdCB0byBhIENvbnRpbnVvdXNFdmVudC4gTm90ZTogd2UgbWlnaHRcbiAgLy8gd2FudCB0byB3YXJuIGlmIHdlIGNhbid0IGRldGVjdCB0aGUgcHJpb3JpdHlcbiAgLy8gZm9yIHRoZSBldmVudC5cblxuICByZXR1cm4gcHJpb3JpdHkgPT09IHVuZGVmaW5lZCA/IENvbnRpbnVvdXNFdmVudCA6IHByaW9yaXR5O1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIHJlZ2lzdGVyU2ltcGxlUGx1Z2luRXZlbnRzQW5kU2V0VGhlaXJQcmlvcml0aWVzKGRpc2NyZXRlRXZlbnRQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luLCBEaXNjcmV0ZUV2ZW50KTtcbiAgcmVnaXN0ZXJTaW1wbGVQbHVnaW5FdmVudHNBbmRTZXRUaGVpclByaW9yaXRpZXModXNlckJsb2NraW5nUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgVXNlckJsb2NraW5nRXZlbnQpO1xuICByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhjb250aW51b3VzUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgQ29udGludW91c0V2ZW50KTtcbiAgc2V0RXZlbnRQcmlvcml0aWVzKG90aGVyRGlzY3JldGVFdmVudHMsIERpc2NyZXRlRXZlbnQpO1xufVxuXG52YXIgU2NoZWR1bGVyX25vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG5cbntcbiAgLy8gUHJvdmlkZSBleHBsaWNpdCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvZHVjdGlvbitwcm9maWxpbmcgYnVuZGxlIG9mIGUuZy5cbiAgLy8gcmVhY3QtZG9tIGlzIHVzZWQgd2l0aCBwcm9kdWN0aW9uIChub24tcHJvZmlsaW5nKSBidW5kbGUgb2ZcbiAgLy8gc2NoZWR1bGVyL3RyYWNpbmdcbiAgaWYgKCEodHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZiAhPSBudWxsICYmIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCAhPSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gcnVuIHRoZSBwcm9maWxpbmcgdmVyc2lvbiBvZiBhIHJlbmRlcmVyIChmb3IgZXhhbXBsZSwgYHJlYWN0LWRvbS9wcm9maWxpbmdgKSB3aXRob3V0IGFsc28gcmVwbGFjaW5nIHRoZSBgc2NoZWR1bGVyL3RyYWNpbmdgIG1vZHVsZSB3aXRoIGBzY2hlZHVsZXIvdHJhY2luZy1wcm9maWxpbmdgLiBZb3VyIGJ1bmRsZXIgbWlnaHQgaGF2ZSBhIHNldHRpbmcgZm9yIGFsaWFzaW5nIGJvdGggbW9kdWxlcy4gTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcHJvZmlsaW5nXCIgKTtcbiAgICB9XG4gIH1cbn1cbi8vIGFzY2VuZGluZyBudW1iZXJzIHNvIHdlIGNhbiBjb21wYXJlIHRoZW0gbGlrZSBudW1iZXJzLiBUaGV5IHN0YXJ0IGF0IDkwIHRvXG4vLyBhdm9pZCBjbGFzaGluZyB3aXRoIFNjaGVkdWxlcidzIHByaW9yaXRpZXMuXG5cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gOTg7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSA5NztcbnZhciBMb3dQcmlvcml0eSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSA9IDk1OyAvLyBOb1ByaW9yaXR5IGlzIHRoZSBhYnNlbmNlIG9mIHByaW9yaXR5LiBBbHNvIFJlYWN0LW9ubHkuXG5cbnZhciBOb1ByaW9yaXR5ID0gOTA7XG52YXIgaW5pdGlhbFRpbWVNcyA9IFNjaGVkdWxlcl9ub3coKTsgLy8gSWYgdGhlIGluaXRpYWwgdGltZXN0YW1wIGlzIHJlYXNvbmFibHkgc21hbGwsIHVzZSBTY2hlZHVsZXIncyBgbm93YCBkaXJlY3RseS5cblxudmFyIFN5bmNMYW5lUHJpb3JpdHkgPSAxNTtcbnZhciBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSA9IDE0O1xudmFyIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAxMztcbnZhciBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5ID0gMTI7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5ID0gMTE7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5ID0gMTA7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmVQcmlvcml0eSA9IDk7XG52YXIgRGVmYXVsdExhbmVQcmlvcml0eSA9IDg7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvblByaW9yaXR5ID0gNztcbnZhciBUcmFuc2l0aW9uUHJpb3JpdHkgPSA2O1xudmFyIFJldHJ5TGFuZVByaW9yaXR5ID0gNTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSA0O1xudmFyIElkbGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAzO1xudmFyIElkbGVMYW5lUHJpb3JpdHkgPSAyO1xudmFyIE9mZnNjcmVlbkxhbmVQcmlvcml0eSA9IDE7XG52YXIgTm9MYW5lUHJpb3JpdHkgPSAwO1xudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFN5bmNCYXRjaGVkTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAqL1xuNDtcbnZhciBJbnB1dERpc2NyZXRlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yNDtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAqL1xuMzI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAqL1xuMTkyO1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBEZWZhdWx0TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjM1ODQ7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE4NjExMjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42MjkxNDU2MDtcbnZhciBTb21lUmV0cnlMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzQyMTc3Mjc7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIElkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgwNTMwNjM2ODtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0O1xudmFyIE5vVGltZXN0YW1wID0gLTE7XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlTGFuZVByaW9yaXR5KG5ld0xhbmVQcmlvcml0eSkge1xufSAvLyBcIlJlZ2lzdGVyc1wiIHVzZWQgdG8gXCJyZXR1cm5cIiBtdWx0aXBsZSB2YWx1ZXNcbi8vIFVzZWQgYnkgZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMgYW5kIGdldE5leHRMYW5lczpcblxudmFyIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gRGVmYXVsdExhbmVQcmlvcml0eTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgaWYgKChTeW5jTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICBpZiAoKFN5bmNCYXRjaGVkTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIFN5bmNCYXRjaGVkTGFuZTtcbiAgfVxuXG4gIGlmICgoSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgJiBsYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0RGlzY3JldGVMYW5lcyA9IElucHV0RGlzY3JldGVMYW5lcyAmIGxhbmVzO1xuXG4gIGlmIChpbnB1dERpc2NyZXRlTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIGlucHV0RGlzY3JldGVMYW5lcztcbiAgfVxuXG4gIGlmICgobGFuZXMgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0Q29udGludW91c0xhbmVzID0gSW5wdXRDb250aW51b3VzTGFuZXMgJiBsYW5lcztcblxuICBpZiAoaW5wdXRDb250aW51b3VzTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaW5wdXRDb250aW51b3VzTGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0TGFuZXMgPSBEZWZhdWx0TGFuZXMgJiBsYW5lcztcblxuICBpZiAoZGVmYXVsdExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBkZWZhdWx0TGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBUcmFuc2l0aW9uSHlkcmF0aW9uUHJpb3JpdHk7XG4gICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIHRyYW5zaXRpb25MYW5lcyA9IFRyYW5zaXRpb25MYW5lcyAmIGxhbmVzO1xuXG4gIGlmICh0cmFuc2l0aW9uTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFRyYW5zaXRpb25Qcmlvcml0eTtcbiAgICByZXR1cm4gdHJhbnNpdGlvbkxhbmVzO1xuICB9XG5cbiAgdmFyIHJldHJ5TGFuZXMgPSBSZXRyeUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKHJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFJldHJ5TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiByZXRyeUxhbmVzO1xuICB9XG5cbiAgaWYgKGxhbmVzICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgaWYgKChsYW5lcyAmIElkbGVIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gIH1cblxuICB2YXIgaWRsZUxhbmVzID0gSWRsZUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKGlkbGVMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaWRsZUxhbmVzO1xuICB9XG5cbiAgaWYgKChPZmZzY3JlZW5MYW5lICYgbGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBPZmZzY3JlZW5MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICB7XG4gICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IERlZmF1bHRMYW5lUHJpb3JpdHk7XG4gIHJldHVybiBsYW5lcztcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0xhbmVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSWRsZUxhbmVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gTm9MYW5lUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxhbmVQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkobGFuZVByaW9yaXR5KSB7XG4gIHN3aXRjaCAobGFuZVByaW9yaXR5KSB7XG4gICAgY2FzZSBTeW5jTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW1tZWRpYXRlUHJpb3JpdHk7XG5cbiAgICBjYXNlIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk6XG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgRGVmYXVsdExhbmVQcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTpcbiAgICBjYXNlIFJldHJ5TGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSWRsZUxhbmVQcmlvcml0eTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJZGxlUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vUHJpb3JpdHk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCB1cGRhdGUgcHJpb3JpdHk6IFwiICsgbGFuZVByaW9yaXR5ICsgXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgbmV4dExhbmVQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB2YXIgZXhwaXJlZExhbmVzID0gcm9vdC5leHBpcmVkTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIENoZWNrIGlmIGFueSB3b3JrIGhhcyBleHBpcmVkLlxuXG4gIGlmIChleHBpcmVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBuZXh0TGFuZXMgPSBleHBpcmVkTGFuZXM7XG4gICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gICAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG4gICAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgICAgICBuZXh0TGFuZVByaW9yaXR5ID0gcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgICAgIG5leHRMYW5lUHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIGhpZ2hlciBwcmlvcml0eSBsYW5lcywgd2UnbGwgaW5jbHVkZSB0aGVtIGV2ZW4gaWYgdGhleVxuICAvLyBhcmUgc3VzcGVuZGVkLlxuXG5cbiAgbmV4dExhbmVzID0gcGVuZGluZ0xhbmVzICYgZ2V0RXF1YWxPckhpZ2hlclByaW9yaXR5TGFuZXMobmV4dExhbmVzKTsgLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh3aXBMYW5lcyk7XG4gICAgdmFyIHdpcExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuXG4gICAgaWYgKG5leHRMYW5lUHJpb3JpdHkgPD0gd2lwTGFuZVByaW9yaXR5KSB7XG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gbmV4dExhbmVQcmlvcml0eTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IEV4cGlyYXRpb24gaGV1cmlzdGljIGlzIGNvbnN0YW50IHBlciBsYW5lLCBzbyBjb3VsZCB1c2UgYSBtYXAuXG4gIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmUpO1xuICB2YXIgcHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcblxuICBpZiAocHJpb3JpdHkgPj0gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5KSB7XG4gICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuIFdoZW5cbiAgICAvLyB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nIHRoZXJlJ3NcbiAgICAvLyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2Ygc3luY2hyb25vdXNcbiAgICAvLyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGVcbiAgICAvLyBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgZXhwaXJhdGlvblxuICAgIC8vIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvbiBkb2VzIGhhcHBlbi5cbiAgICAvL1xuICAgIC8vIEFsc28gbm90ZSB0aGF0LCBpbiB0aGUgY2FzZSBvZiB1c2VyIGlucHV0IHNwZWNpZmljYWxseSwgdGhpcyB3aWxsIHNvb24gbm9cbiAgICAvLyBsb25nZXIgYmUgYW4gaXNzdWUgYmVjYXVzZSB3ZSBwbGFuIHRvIG1ha2UgdXNlciBpbnB1dCBzeW5jaHJvbm91cyBieVxuICAgIC8vIGRlZmF1bHQgKHVudGlsIHlvdSBlbnRlciBgc3RhcnRUcmFuc2l0aW9uYCwgb2YgY291cnNlLilcbiAgICAvL1xuICAgIC8vIElmIHdlcmVuJ3QgcGxhbm5pbmcgdG8gbWFrZSB0aGVzZSB1cGRhdGVzIHN5bmNocm9ub3VzIHNvb24gYW55d2F5LCBJXG4gICAgLy8gd291bGQgcHJvYmFibHkgbWFrZSB0aGlzIG51bWJlciBhIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuXG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICB9IGVsc2UgaWYgKHByaW9yaXR5ID49IFRyYW5zaXRpb25Qcmlvcml0eSkge1xuICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiByZXR1cm5OZXh0TGFuZXNQcmlvcml0eSgpIHtcbiAgcmV0dXJuIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn0gLy8gVG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyBtdWx0aXBsZSB1cGRhdGVzIGluIHRoZSBzYW1lIGV2ZW50LCB0aGlzIHNob3VsZFxuLy8gYmUgYSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFVwZGF0ZUxhbmUobGFuZVByaW9yaXR5LCB3aXBMYW5lcykge1xuICBzd2l0Y2ggKGxhbmVQcmlvcml0eSkge1xuICAgIGNhc2UgTm9MYW5lUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3luY0xhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0JhdGNoZWRMYW5lO1xuXG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJbnB1dERpc2NyZXRlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgIGlmIChfbGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgLy8gU2hpZnQgdG8gdGhlIG5leHQgcHJpb3JpdHkgbGV2ZWxcbiAgICAgICAgICByZXR1cm4gZmluZFVwZGF0ZUxhbmUoSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmU7XG4gICAgICB9XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9sYW5lMiA9IHBpY2tBcmJpdHJhcnlMYW5lKElucHV0Q29udGludW91c0xhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUyID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBTaGlmdCB0byB0aGUgbmV4dCBwcmlvcml0eSBsZXZlbFxuICAgICAgICAgIHJldHVybiBmaW5kVXBkYXRlTGFuZShEZWZhdWx0TGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmUyO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWZhdWx0TGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUzID0gcGlja0FyYml0cmFyeUxhbmUoRGVmYXVsdExhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUzID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBJZiBhbGwgdGhlIGRlZmF1bHQgbGFuZXMgYXJlIGFscmVhZHkgYmVpbmcgd29ya2VkIG9uLCBsb29rIGZvciBhXG4gICAgICAgICAgLy8gbGFuZSBpbiB0aGUgdHJhbnNpdGlvbiByYW5nZS5cbiAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgICAgaWYgKF9sYW5lMyA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgICAvLyBBbGwgdGhlIHRyYW5zaXRpb24gbGFuZXMgYXJlIHRha2VuLCB0b28uIFRoaXMgc2hvdWxkIGJlIHZlcnlcbiAgICAgICAgICAgIC8vIHJhcmUsIGJ1dCBhcyBhIGxhc3QgcmVzb3J0LCBwaWNrIGEgZGVmYXVsdCBsYW5lLiBUaGlzIHdpbGwgaGF2ZVxuICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgd29yay1pbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShEZWZhdWx0TGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbGFuZTM7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTogLy8gU2hvdWxkIGJlIGhhbmRsZWQgYnkgZmluZFRyYW5zaXRpb25MYW5lIGluc3RlYWRcblxuICAgIGNhc2UgUmV0cnlMYW5lUHJpb3JpdHk6XG4gICAgICAvLyBTaG91bGQgYmUgaGFuZGxlZCBieSBmaW5kUmV0cnlMYW5lIGluc3RlYWRcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZVByaW9yaXR5OlxuICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZTtcbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIHVwZGF0ZSBwcmlvcml0eTogXCIgKyBsYW5lUHJpb3JpdHkgKyBcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIiApO1xuICAgIH1cbiAgfVxufSAvLyBUbyBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHVwZGF0ZXMgaW4gdGhlIHNhbWUgZXZlbnQsIHRoaXMgc2hvdWxkXG4vLyBiZSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFRyYW5zaXRpb25MYW5lKHdpcExhbmVzLCBwZW5kaW5nTGFuZXMpIHtcbiAgLy8gRmlyc3QgbG9vayBmb3IgbGFuZXMgdGhhdCBhcmUgY29tcGxldGVseSB1bmNsYWltZWQsIGkuZS4gaGF2ZSBub1xuICAvLyBwZW5kaW5nIHdvcmsuXG4gIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUoVHJhbnNpdGlvbkxhbmVzICYgfnBlbmRpbmdMYW5lcyk7XG5cbiAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIElmIGFsbCBsYW5lcyBoYXZlIHBlbmRpbmcgd29yaywgbG9vayBmb3IgYSBsYW5lIHRoYXQgaXNuJ3QgY3VycmVudGx5XG4gICAgLy8gYmVpbmcgd29ya2VkIG9uLlxuICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBiZWluZyB3b3JrZWQgb24sIHBpY2sgYW55IGxhbmUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFRyYW5zaXRpb25MYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59IC8vIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdXBkYXRlcyBpbiB0aGUgc2FtZSBldmVudCwgdGhpcyBzaG91bGRcbi8vIGJlIHB1cmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgbGFuZSBmb3IgZ2l2ZW4gaW5wdXRzLlxuXG5mdW5jdGlvbiBmaW5kUmV0cnlMYW5lKHdpcExhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGBmaW5kVXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShSZXRyeUxhbmVzICYgfndpcExhbmVzKTtcblxuICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFJldHJ5TGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuXG5mdW5jdGlvbiBnZXRMb3dlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyBmaW5kcyB0aGUgbW9zdCBzaWduaWZpY2FudCBub24temVybyBiaXQuXG4gIHZhciBpbmRleCA9IDMxIC0gY2x6MzIobGFuZXMpO1xuICByZXR1cm4gaW5kZXggPCAwID8gTm9MYW5lcyA6IDEgPDwgaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdldEVxdWFsT3JIaWdoZXJQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHJldHVybiAoZ2V0TG93ZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSA8PCAxKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCBhbnkgdXBkYXRlIHRvIGFueSBsYW5lIGNhbiB1bmJsb2NrIGFueSBvdGhlciBsYW5lLiBCdXRcbiAgLy8gaXQncyBub3QgcHJhY3RpY2FsIHRvIHRyeSBldmVyeSBzaW5nbGUgcG9zc2libGUgY29tYmluYXRpb24uIFdlIG5lZWQgYVxuICAvLyBoZXVyaXN0aWMgdG8gZGVjaWRlIHdoaWNoIGxhbmVzIHRvIGF0dGVtcHQgdG8gcmVuZGVyLCBhbmQgaW4gd2hpY2ggYmF0Y2hlcy5cbiAgLy8gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIGhldXJpc3RpYyBhcyBpbiB0aGUgb2xkIEV4cGlyYXRpb25UaW1lcyBtb2RlbDpcbiAgLy8gcmV0cnkgYW55IGxhbmUgYXQgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHksIGJ1dCBkb24ndCB0cnkgdXBkYXRlcyBhdCBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgd2l0aG91dCBhbHNvIGluY2x1ZGluZyB0aGUgbG93ZXIgcHJpb3JpdHkgdXBkYXRlcy4gVGhpcyB3b3JrcyB3ZWxsXG4gIC8vIHdoZW4gY29uc2lkZXJpbmcgdXBkYXRlcyBhY3Jvc3MgZGlmZmVyZW50IHByaW9yaXR5IGxldmVscywgYnV0IGlzbid0XG4gIC8vIHN1ZmZpY2llbnQgZm9yIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5LCBzaW5jZSB3ZSB3YW50IHRvIHRyZWF0XG4gIC8vIHRob3NlIHVwZGF0ZXMgYXMgcGFyYWxsZWwuXG4gIC8vIFVuc3VzcGVuZCBhbnkgdXBkYXRlIGF0IGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5LlxuXG4gIHZhciBoaWdoZXJQcmlvcml0eUxhbmVzID0gdXBkYXRlTGFuZSAtIDE7IC8vIFR1cm5zIDBiMTAwMCBpbnRvIDBiMDExMVxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgJj0gaGlnaGVyUHJpb3JpdHlMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSBoaWdoZXJQcmlvcml0eUxhbmVzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCkge1xuICByb290LmV4cGlyZWRMYW5lcyB8PSBJbnB1dERpc2NyZXRlTGFuZXMgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIGhhc0Rpc2NyZXRlTGFuZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIElucHV0RGlzY3JldGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdE11dGFibGVSZWFkKHJvb3QsIHVwZGF0ZUxhbmUpIHtcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzIHw9IHVwZGF0ZUxhbmUgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IDA7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSBlbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuIE9ubHkgdXNlZCBvbiBsYW5lcywgc28gYXNzdW1lIGlucHV0IGlzIGFuIGludGVnZXIuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKGxhbmVzKSB7XG4gIGlmIChsYW5lcyA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2cobGFuZXMpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJbnRlbnRpb25hbGx5IG5vdCBuYW1lZCBpbXBvcnRzIGJlY2F1c2UgUm9sbHVwIHdvdWxkIHVzZSBkeW5hbWljIGRpc3BhdGNoIGZvclxudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksXG4gICAgcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eUZvclBsdWdpblN5c3RlbShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudDpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJZk5lZWRlZChuYXRpdmVFdmVudC50aW1lU3RhbXApO1xuICB9XG5cbiAgZGlzY3JldGVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgcnVuV2l0aFByaW9yaXR5KFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEsIGRpc3BhdGNoRXZlbnQuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFsbG93UmVwbGF5ID0gdHJ1ZTtcblxuICB7XG4gICAgLy8gVE9ETzogcmVwbGF5aW5nIGNhcHR1cmUgcGhhc2UgZXZlbnRzIGlzIGN1cnJlbnRseSBicm9rZW5cbiAgICAvLyBiZWNhdXNlIHdlIHVzZWQgdG8gZG8gaXQgZHVyaW5nIHRvcC1sZXZlbCBuYXRpdmUgYnViYmxlIGhhbmRsZXJzXG4gICAgLy8gYnV0IG5vdyB3ZSB1c2UgZGlmZmVyZW50IGJ1YmJsZSBhbmQgY2FwdHVyZSBoYW5kbGVycy5cbiAgICAvLyBJbiBlYWdlciBtb2RlLCB3ZSBhdHRhY2ggY2FwdHVyZSBsaXN0ZW5lcnMgZWFybHksIHNvIHdlIG5lZWRcbiAgICAvLyB0byBmaWx0ZXIgdGhlbSBvdXQgdW50aWwgd2UgZml4IHRoZSBsb2dpYyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkuXG4gICAgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIG91dHNpZGUgdGhlIGZsYWcgYnV0IEkgcHV0IGl0IGluc2lkZSB0byByZWR1Y2Ugcmlzay5cbiAgICBhbGxvd1JlcGxheSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgPT09IDA7XG4gIH1cblxuICBpZiAoYWxsb3dSZXBsYXkgJiYgaGFzUXVldWVkRGlzY3JldGVFdmVudHMoKSAmJiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMsIGFuZCB0aGlzIGlzIGFub3RoZXIgZGlzY3JldGVcbiAgICAvLyBldmVudCwgdGhlbiB3ZSBjYW4ndCBkaXNwYXRjaCBpdCByZWdhcmRsZXNzIG9mIGl0cyB0YXJnZXQsIHNpbmNlIHRoZXlcbiAgICAvLyBuZWVkIHRvIGRpc3BhdGNoIGluIG9yZGVyLlxuICAgIHF1ZXVlRGlzY3JldGVFdmVudChudWxsLCAvLyBGbGFncyB0aGF0IHdlJ3JlIG5vdCBhY3R1YWxseSBibG9ja2VkIG9uIGFueXRoaW5nIGFzIGZhciBhcyB3ZSBrbm93LlxuICAgIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJsb2NrZWRPbiA9IGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQgdGhpcyBldmVudC5cbiAgICBpZiAoYWxsb3dSZXBsYXkpIHtcbiAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93UmVwbGF5KSB7XG4gICAgaWYgKGlzUmVwbGF5YWJsZURpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lKSkge1xuICAgICAgLy8gVGhpcyB0aGlzIHRvIGJlIHJlcGxheWVkIGxhdGVyIG9uY2UgdGhlIHRhcmdldCBpcyBhdmFpbGFibGUuXG4gICAgICBxdWV1ZURpc2NyZXRlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gICAgLy8gcXVldWVpbmcgaXMgYWNjdW1tdWxhdGl2ZS5cblxuXG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59IC8vIEF0dGVtcHQgZGlzcGF0Y2hpbmcgYW4gZXZlbnQuIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcblxuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19SRVBMQVlFRCkgPT09IDApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIGhhc093blByb3BlcnR5JDIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duUHJvcGVydHkkMi5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhb2JqZWN0SXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuXG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBldmVudHNcbiAgICAgIC8vIGZvciB0aGUgc2FtZSBwb3J0YWwgY29udGFpbmVyIG9yIHJvb3Qgbm9kZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgIC8vIFRPRE86IG9uY2Ugd2UgcmVtb3ZlIHRoZSBmbGFnLCB3ZSBtYXkgYmUgYWJsZSB0byBhbHNvXG4gICAgICAvLyByZW1vdmUgc29tZSBvZiB0aGUgYm9va2tlZXBpbmcgbWFwcyB1c2VkIGZvciBsYXppbmVzcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHJvb3RDb250YWluZXJFbGVtZW50LCB0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgdGFyZ2V0ID0gcm9vdENvbnRhaW5lckVsZW1lbnQ7IC8vIHNlbGVjdGlvbmNoYW5nZSBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnRcbiAgLy8gb3RoZXJ3aXNlIGl0IHdvbid0IGNhcHR1cmUgaW5jb21pbmcgZXZlbnRzIHRoYXQgYXJlIG9ubHlcbiAgLy8gdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCBkaXJlY3RseS5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyAmJiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSAhPT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHRhcmdldCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIH0gLy8gSWYgdGhlIGV2ZW50IGNhbiBiZSBkZWxlZ2F0ZWQgKG9yIGlzIGNhcHR1cmUgcGhhc2UpLCB3ZSBjYW5cbiAgLy8gcmVnaXN0ZXIgaXQgdG8gdGhlIHJvb3QgY29udGFpbmVyLiBPdGhlcndpc2UsIHdlIHNob3VsZFxuICAvLyByZWdpc3RlciB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50IGFuZCBtYXJrIGl0IGFzXG4gIC8vIGEgbm9uLWRlbGVnYXRlZCBldmVudC5cblxuXG4gIGlmICh0YXJnZXRFbGVtZW50ICE9PSBudWxsICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmIG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgIC8vIEZvciBhbGwgbm9uLWRlbGVnYXRlZCBldmVudHMsIGFwYXJ0IGZyb20gc2Nyb2xsLCB3ZSBhdHRhY2hcbiAgICAvLyB0aGVpciBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHJlc3BlY3RpdmUgZWxlbWVudHMgdGhhdCB0aGVpclxuICAgIC8vIGV2ZW50cyBmaXJlIG9uLiBUaGF0IG1lYW5zIHdlIGNhbiBza2lwIHRoaXMgc3RlcCwgYXMgZXZlbnRcbiAgICAvLyBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHByZXZpb3VzbHkuIEhvd2V2ZXIsIHdlXG4gICAgLy8gc3BlY2lhbCBjYXNlIHRoZSBzY3JvbGwgZXZlbnQgYmVjYXVzZSB0aGUgcmVhbGl0eSBpcyB0aGF0IGFueVxuICAgIC8vIGVsZW1lbnQgY2FuIHNjcm9sbC5cbiAgICAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYXBwbHkgdGhlIHNhbWUgbG9naWMgdG8gYWxsXG4gICAgLy8gZXZlbnRzIGZyb20gdGhlIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0LiBUaGVuIHdlIGNhbiByZW1vdmVcbiAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZSBhbmQgdXNlIHRoZSBzYW1lIGxvZ2ljIGZvciBhbGwgZXZlbnRzLlxuICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzY3JvbGwnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19OT05fREVMRUdBVEVEO1xuICAgIHRhcmdldCA9IHRhcmdldEVsZW1lbnQ7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7IC8vIElmIHRoZSBsaXN0ZW5lciBlbnRyeSBpcyBlbXB0eSBvciB3ZSBzaG91bGQgdXBncmFkZSwgdGhlblxuICAvLyB3ZSBuZWVkIHRvIHRyYXAgYW4gZXZlbnQgbGlzdGVuZXIgb250byB0aGUgdGFyZ2V0LlxuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gICAgfVxuXG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkRXZlbnRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIEhUTUxfTkFNRVNQQUNFJDEgPSBOYW1lc3BhY2VzLmh0bWw7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclRleHREaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZTtcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuICAvLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbiAgLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbiAgLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG4gIHZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xuICB2YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG4gIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbiAgfTtcblxuICB3YXJuRm9yVGV4dERpZmZlcmVuY2UgPSBmdW5jdGlvbiAoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gIH07XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdvYmplY3QnICYmIG5leHRQcm9wICE9PSBudWxsICYmIG5leHRQcm9wLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRSkge1xuICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIHVzZU9wYXF1ZVJlZmVyZW5jZSdzIG9wYXF1ZSBvYmplY3QsIHRoaXMgbWVhbnMgd2UgYXJlIGh5ZHJhdGluZy5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgY2FsbCB0aGUgb3BhcXVlIG9iamVjdCdzIHRvU3RyaW5nIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIG5ldyBjbGllbnRcbiAgICAgIC8vIElEIHNvIGNsaWVudCBhbmQgc2VydmVyIElEcyBtYXRjaCBhbmQgdGhyb3dzIHRvIHJlcmVuZGVyLlxuICAgICAgbmV4dFByb3AudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlO1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIEJ1aWx0LWluIFNTUiBhdHRyaWJ1dGUgaXMgYWxsb3dlZFxuICAgICAgICBjYXNlICdkYXRhLXJlYWN0cm9vdCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cblxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICggLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgaWYgKGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclRleHREaWZmZXJlbmNlKHRleHROb2RlLm5vZGVWYWx1ZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gX2Fzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxO1xuXG57XG4gIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICByZXR1cm4gc2hvdWxkQXV0b0ZvY3VzSG9zdENvbXBvbmVudCh0eXBlLCBwcm9wcyk7XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnb3B0aW9uJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICB2YXIgYm9keSA9IGNvbnRhaW5lci5ib2R5O1xuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgYm9keS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSk7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSA7XG59XG52YXIgY2xpZW50SWQgPSAwO1xuZnVuY3Rpb24gbWFrZUNsaWVudElkSW5ERVYod2Fybk9uQWNjZXNzSW5ERVYpIHtcbiAgdmFyIGlkID0gJ3I6JyArIChjbGllbnRJZCsrKS50b1N0cmluZygzNik7XG4gIHJldHVybiB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm5PbkFjY2Vzc0luREVWKCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuT25BY2Nlc3NJbkRFVigpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRTtcbn1cbmZ1bmN0aW9uIG1ha2VPcGFxdWVIeWRyYXRpbmdPYmplY3QoYXR0ZW1wdFRvUmVhZFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX09QQVFVRV9JRF9UWVBFLFxuICAgIHRvU3RyaW5nOiBhdHRlbXB0VG9SZWFkVmFsdWUsXG4gICAgdmFsdWVPZjogYXR0ZW1wdFRvUmVhZFZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAge1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbiAgfVxufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImdldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBfYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQmxvY2tpbmdSb290ID0gMTtcbnZhciBDb25jdXJyZW50Um9vdCA9IDI7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9IC8vIERldlRvb2xzIGV4aXN0c1xuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIHByaW9yaXR5TGV2ZWwpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTY2hlZHVsZXJfcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICBTY2hlZHVsZXJfc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQsXG4gICAgU2NoZWR1bGVyX3JlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsXG4gICAgU2NoZWR1bGVyX25vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICBTY2hlZHVsZXJfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgU2NoZWR1bGVyX0ltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgU2NoZWR1bGVyX0xvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9JZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuXG57XG4gIC8vIFByb3ZpZGUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZSB3aGVuIHByb2R1Y3Rpb24rcHJvZmlsaW5nIGJ1bmRsZSBvZiBlLmcuXG4gIC8vIHJlYWN0LWRvbSBpcyB1c2VkIHdpdGggcHJvZHVjdGlvbiAobm9uLXByb2ZpbGluZykgYnVuZGxlIG9mXG4gIC8vIHNjaGVkdWxlci90cmFjaW5nXG4gIGlmICghKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Byb2ZpbGluZ1wiICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlQ2FsbGJhY2tOb2RlID0ge307IC8vIEV4Y2VwdCBmb3IgTm9Qcmlvcml0eSwgdGhlc2UgY29ycmVzcG9uZCB0byBTY2hlZHVsZXIgcHJpb3JpdGllcy4gV2UgdXNlXG4vLyBhc2NlbmRpbmcgbnVtYmVycyBzbyB3ZSBjYW4gY29tcGFyZSB0aGVtIGxpa2UgbnVtYmVycy4gVGhleSBzdGFydCBhdCA5MCB0b1xuLy8gYXZvaWQgY2xhc2hpbmcgd2l0aCBTY2hlZHVsZXIncyBwcmlvcml0aWVzLlxuXG52YXIgSW1tZWRpYXRlUHJpb3JpdHkkMSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgPSA5ODtcbnZhciBOb3JtYWxQcmlvcml0eSQxID0gOTc7XG52YXIgTG93UHJpb3JpdHkkMSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSQxID0gOTU7IC8vIE5vUHJpb3JpdHkgaXMgdGhlIGFic2VuY2Ugb2YgcHJpb3JpdHkuIEFsc28gUmVhY3Qtb25seS5cblxudmFyIE5vUHJpb3JpdHkkMSA9IDkwO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IC8vIEZhbGwgYmFjayBncmFjZWZ1bGx5IGlmIHdlJ3JlIHJ1bm5pbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBTY2hlZHVsZXIuXG5TY2hlZHVsZXJfcmVxdWVzdFBhaW50ICE9PSB1bmRlZmluZWQgPyBTY2hlZHVsZXJfcmVxdWVzdFBhaW50IDogZnVuY3Rpb24gKCkge307XG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbW1lZGlhdGVRdWV1ZUNhbGxiYWNrTm9kZSA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xudmFyIGluaXRpYWxUaW1lTXMkMSA9IFNjaGVkdWxlcl9ub3ckMSgpOyAvLyBJZiB0aGUgaW5pdGlhbCB0aW1lc3RhbXAgaXMgcmVhc29uYWJseSBzbWFsbCwgdXNlIFNjaGVkdWxlcidzIGBub3dgIGRpcmVjdGx5LlxuLy8gVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGBwZXJmb3JtYW5jZS5ub3dgLiBJblxuLy8gb2xkZXIgYnJvd3NlcnMsIFNjaGVkdWxlciBmYWxscyBiYWNrIHRvIGBEYXRlLm5vd2AsIHdoaWNoIHJldHVybnMgYSBVbml4XG4vLyB0aW1lc3RhbXAuIEluIHRoYXQgY2FzZSwgc3VidHJhY3QgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIHRvIHNpbXVsYXRlXG4vLyB0aGUgYmVoYXZpb3Igb2YgcGVyZm9ybWFuY2Uubm93IGFuZCBrZWVwIG91ciB0aW1lcyBzbWFsbCBlbm91Z2ggdG8gZml0XG4vLyB3aXRoaW4gMzIgYml0cy5cbi8vIFRPRE86IENvbnNpZGVyIGxpZnRpbmcgdGhpcyBpbnRvIFNjaGVkdWxlci5cblxudmFyIG5vdyA9IGluaXRpYWxUaW1lTXMkMSA8IDEwMDAwID8gU2NoZWR1bGVyX25vdyQxIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU2NoZWR1bGVyX25vdyQxKCkgLSBpbml0aWFsVGltZU1zJDE7XG59O1xuZnVuY3Rpb24gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHN3aXRjaCAoU2NoZWR1bGVyX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICBjYXNlIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJbW1lZGlhdGVQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gVXNlckJsb2NraW5nUHJpb3JpdHkkMjtcblxuICAgIGNhc2UgU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5JDE7XG5cbiAgICBjYXNlIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTpcbiAgICAgIHJldHVybiBMb3dQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfSWRsZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIElkbGVQcmlvcml0eSQxO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcHJpb3JpdHkgbGV2ZWwuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhY3RQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHkkMjpcbiAgICAgIHJldHVybiBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTtcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX0lkbGVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmtub3duIHByaW9yaXR5IGxldmVsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQxKHJlYWN0UHJpb3JpdHlMZXZlbCwgZm4pIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBmbik7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrKHJlYWN0UHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdOyAvLyBGbHVzaCB0aGUgcXVldWUgaW4gdGhlIG5leHQgdGljaywgYXQgdGhlIGVhcmxpZXN0LlxuXG4gICAgaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgPSBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXJfSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrUXVldWVJbXBsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGZha2VDYWxsYmFja05vZGU7XG59XG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpIHtcbiAgaWYgKGNhbGxiYWNrTm9kZSAhPT0gZmFrZUNhbGxiYWNrTm9kZSkge1xuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCkge1xuICBpZiAoaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgbm9kZSA9IGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlO1xuICAgIGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBTY2hlZHVsZXJfY2FuY2VsQ2FsbGJhY2sobm9kZSk7XG4gIH1cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY3kuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9pc1N5bmMyID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9xdWV1ZSA9IHN5bmNRdWV1ZTtcbiAgICAgICAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAoOyBpIDwgX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfcXVldWVbaV07XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhfaXNTeW5jMik7XG4gICAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICAgIFNjaGVkdWxlcl9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxudmFyIE5vTW9kZSA9IDA7XG52YXIgU3RyaWN0TW9kZSA9IDE7IC8vIFRPRE86IFJlbW92ZSBCbG9ja2luZ01vZGUgYW5kIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdFxuLy8gdGFnIGluc3RlYWRcblxudmFyIEJsb2NraW5nTW9kZSA9IDI7XG52YXIgQ29uY3VycmVudE1vZGUgPSA0O1xudmFyIFByb2ZpbGVNb2RlID0gODtcbnZhciBEZWJ1Z1RyYWNpbmdNb2RlID0gMTY7XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IDA7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGJhc2VQcm9wcyk7XG5cbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxudmFyIE1BWF9TSUdORURfMzFfQklUX0lOVCA9IDEwNzM3NDE4MjM7XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBuZXh0VmFsdWUpIHtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlckZpYmVyLnR5cGUuX2NvbnRleHQ7XG5cbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVDaGFuZ2VkQml0cyhjb250ZXh0LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAvLyBObyBjaGFuZ2VcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2hhbmdlZEJpdHMgPSB0eXBlb2YgY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09ICdmdW5jdGlvbicgPyBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0cyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogTUFYX1NJR05FRF8zMV9CSVRfSU5UO1xuXG4gICAge1xuICAgICAgaWYgKChjaGFuZ2VkQml0cyAmIE1BWF9TSUdORURfMzFfQklUX0lOVCkgIT09IGNoYW5nZWRCaXRzKSB7XG4gICAgICAgIGVycm9yKCdjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhICcgKyAnMzEtYml0IGludGVnZXIuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQgJiYgKGRlcGVuZGVuY3kub2JzZXJ2ZWRCaXRzICYgY2hhbmdlZEJpdHMpICE9PSAwKSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cblxuICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID09PSBjb250ZXh0KSA7IGVsc2UgaWYgKG9ic2VydmVkQml0cyA9PT0gZmFsc2UgfHwgb2JzZXJ2ZWRCaXRzID09PSAwKSA7IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0czsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cblxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZWRCaXRzICE9PSAnbnVtYmVyJyB8fCBvYnNlcnZlZEJpdHMgPT09IE1BWF9TSUdORURfMzFfQklUX0lOVCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IE1BWF9TSUdORURfMzFfQklUX0lOVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRPYnNlcnZlZEJpdHMgPSBvYnNlcnZlZEJpdHM7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG9ic2VydmVkQml0czogcmVzb2x2ZWRPYnNlcnZlZEJpdHMsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmICghKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtLFxuICAgICAgICByZXNwb25kZXJzOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbFxuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBfYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICghKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgKyBjYWxsYmFjayApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5OyAvLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxuXG52YXIgZW1wdHlSZWZzT2JqZWN0ID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnJlZnM7XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0IGEgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7XG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgY2hpbGQuX3N0b3JlID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKCEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuIFdlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSBpbnN0LnJlZnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEodHlwZW9mIG1peGVkUmVmID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4yLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBuZXdDaGlsZCkgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59IC8vIFdlIGF2b2lkIGlubGluaW5nIHRoaXMgdG8gYXZvaWQgcG90ZW50aWFsIGRlb3B0cyBmcm9tIHVzaW5nIHRyeS9jYXRjaC5cbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuXG5cbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cblxuICAgIGNoaWxkVG9EZWxldGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgY2hpbGRUb0RlbGV0ZS5mbGFncyA9IERlbGV0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyA9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgPSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5JDEobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywga2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywgbmV3Q2hpbGQua2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAoISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKCEobmV3Q2hpbGRyZW4gIT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQudGFnKSB7XG4gICAgICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBCbG9jazpcblxuICAgICAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZmFsbHRocm91Z2ggaGVyZSBpZiBlbmFibGVCbG9ja3NBUEkgaXMgbm90IG9uLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2V4aXN0aW5nMyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgICAgIF9leGlzdGluZzMucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIF9leGlzdGluZzMuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RpbmczO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIHZhciBpc09iamVjdCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGw7XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAndW5kZWZpbmVkJyAmJiAhaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgcmV0dXJuIGZpYmVyIGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyBjb21wb25lbnQsIHRocm93IGFuIGVycm9yLiBJZiBGaWJlciByZXR1cm4gdHlwZXMgYXJlIGRpc2FibGVkLFxuICAgICAgLy8gd2UgYWxyZWFkeSB0aHJldyBhYm92ZS5cbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnJlbmRlci5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSwgd2hpY2ggaGFuZGxlcyBib3RoXG4gICAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgY2xhc3Nlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVkIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgICAgY2FzZSBCbG9jazpcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKSArIFwiKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuXCIgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICghKGN1cnJlbnQgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IGN1cnJlbnQuY2hpbGQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKCEoYyAhPT0gTk9fQ09OVEVYVCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIEluIG9yZGVyIHRvIGNhcHR1cmUsIHRoZSBTdXNwZW5zZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgZmFsbGJhY2sgcHJvcC5cblxuICBpZiAocHJvcHMuZmFsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cblxuICBpZiAocHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG4gIC8vIHBhcmVudCBib3VuZGFyeSBpZiBpdCBpcyBjdXJyZW50bHkgaW52aXNpYmxlLlxuXG5cbiAgaWYgKGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBhYmxlIHRvIGhhbmRsZSBpdCwgd2UgbXVzdCBoYW5kbGUgaXQuXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjI7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjQ7XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICBjaGlsZFRvRGVsZXRlLmZsYWdzID0gRGVsZXRpb247IC8vIFRoaXMgbWlnaHQgc2VlbSBsaWtlIGl0IGJlbG9uZ3Mgb24gcHJvZ3Jlc3NlZEZpcnN0RGVsZXRpb24uIEhvd2V2ZXIsXG4gIC8vIHRoZXNlIGNoaWxkcmVuIGFyZSBub3QgcGFydCBvZiB0aGUgcmVjb25jaWxpYXRpb24gbGlzdCBvZiBjaGlsZHJlbi5cbiAgLy8gRXZlbiBpZiB3ZSBhYm9ydCBhbmQgcmVyZWNvbmNpbGUgdGhlIGNoaWxkcmVuLCB0aGF0IHdpbGwgdHJ5IHRvIGh5ZHJhdGVcbiAgLy8gYWdhaW4gYW5kIHRoZSBub2RlcyBhcmUgc3RpbGwgaW4gdGhlIGhvc3QgdHJlZSBzbyB0aGVzZSB3aWxsIGJlXG4gIC8vIHJlY3JlYXRlZC5cblxuICBpZiAocmV0dXJuRmliZXIubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcblxuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQobmV4dEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyKTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAge1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0eXBlID0gZmliZXIudHlwZTsgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHR5cGUgIT09ICdoZWFkJyAmJiB0eXBlICE9PSAnYm9keScgJiYgIXNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xudmFyIHJlbmRlcmVyU2lnaWwkMTtcblxue1xuICAvLyBVc2VkIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgbXV0YWJsZSBzb3VyY2UuXG4gIHJlbmRlcmVyU2lnaWwkMSA9IHt9O1xufVxuXG5mdW5jdGlvbiBtYXJrU291cmNlQXNEaXJ0eShtdXRhYmxlU291cmNlKSB7XG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24obXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAgcmV0dXJuIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFdvcmtJblByb2dyZXNzVmVyc2lvbihtdXRhYmxlU291cmNlLCB2ZXJzaW9uKSB7XG4gIHtcbiAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gdmVyc2lvbjtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gd2FybkFib3V0TXVsdGlwbGVSZW5kZXJlcnNERVYobXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAge1xuICAgICAgaWYgKG11dGFibGVTb3VyY2UuX2N1cnJlbnRQcmltYXJ5UmVuZGVyZXIgPT0gbnVsbCkge1xuICAgICAgICBtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbCQxO1xuICAgICAgfSBlbHNlIGlmIChtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsJDEpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgbXV0YWJsZSBzb3VyY2UuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBFYWdlciByZWFkcyB0aGUgdmVyc2lvbiBvZiBhIG11dGFibGUgc291cmNlIGFuZCBzdG9yZXMgaXQgb24gdGhlIHJvb3QuXG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VXNlT3BhcXVlSWRlbnRpZmllcjtcblxue1xuICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyID0ge307XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnR5cGUpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcblxuICAgICAgaWYgKCEobnVtYmVyT2ZSZVJlbmRlcnMgPCBSRV9SRU5ERVJfTElNSVQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jeS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIGlmICghIWRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgZWFybHkgcmV0dXJuIHN0YXRlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmN5LlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmICghKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBlYWdlclJlZHVjZXI6IHVwZGF0ZS5lYWdlclJlZHVjZXIsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgZWFnZXJSZWR1Y2VyOiB1cGRhdGUuZWFnZXJSZWR1Y2VyLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmVhZ2VyUmVkdWNlciA9PT0gcmVkdWNlcikge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIHdhcyBwcm9jZXNzZWQgZWFnZXJseSwgYW5kIGl0cyByZWR1Y2VyIG1hdGNoZXMgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByZWR1Y2VyLCB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLlxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpIHtcbiAge1xuICAgIHdhcm5BYm91dE11bHRpcGxlUmVuZGVyZXJzREVWKHNvdXJjZSk7XG4gIH1cblxuICB2YXIgZ2V0VmVyc2lvbiA9IHNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKHNvdXJjZS5fc291cmNlKTsgLy8gSXMgaXQgc2FmZSBmb3IgdGhpcyBjb21wb25lbnQgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXI/XG5cbiAgdmFyIGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsgLy8gQ2hlY2sgdGhlIHZlcnNpb24gZmlyc3QuXG4gIC8vIElmIHRoaXMgcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbixcbiAgLy8gd2UgY2FuIHVzZSBpdCBhbG9uZSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHNhZmVseSByZWFkIGZyb20gdGhlIHNvdXJjZS5cblxuICB2YXIgY3VycmVudFJlbmRlclZlcnNpb24gPSBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24oc291cmNlKTtcblxuICBpZiAoY3VycmVudFJlbmRlclZlcnNpb24gIT09IG51bGwpIHtcbiAgICAvLyBJdCdzIHNhZmUgdG8gcmVhZCBpZiB0aGUgc3RvcmUgaGFzbid0IGJlZW4gbXV0YXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lXG4gICAgLy8gd2UgcmVhZCBzb21ldGhpbmcuXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGN1cnJlbnRSZW5kZXJWZXJzaW9uID09PSB2ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gdmVyc2lvbiwgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHJlYWQgZnJvbSB0aGVcbiAgICAvLyBzb3VyY2UgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLCBzbyB3ZSBuZWVkIHRvIGRvIGEgYml0IG1vcmUgd29yay5cbiAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlzIGlmIHRoZXJlIGFyZSBhbnkgaG9va3MgdGhhdCBhbHJlYWR5XG4gICAgLy8gc3Vic2NyaWJlZCB0byB0aGUgc291cmNlLCBhbmQgaWYgc28sIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwZW5kaW5nXG4gICAgLy8gbXV0YXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIHN5bmNocm9uaXplZCB5ZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBtdXRhdGlvbnMsIHRoZW4gYHJvb3QubXV0YWJsZVJlYWRMYW5lc2Agd2lsbCBiZVxuICAgIC8vIGVtcHR5LCBhbmQgd2Uga25vdyB3ZSBjYW4gc2FmZWx5IHJlYWQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSAqYXJlKiBwZW5kaW5nIG11dGF0aW9ucywgd2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gc2FmZWx5IHJlYWRcbiAgICAvLyBpZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBsYW5lcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBwZW5kaW5nIG11dGF0aW9uXG4gICAgLy8gbGFuZXMsIHNpbmNlIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZSB2YWx1ZSB3ZSdyZSBhYm91dCB0byByZWFkIGZyb21cbiAgICAvLyB0aGUgc291cmNlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBkdXJpbmcgdGhlIG1vc3RcbiAgICAvLyByZWNlbnQgbXV0YXRpb24uXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgcm9vdC5tdXRhYmxlUmVhZExhbmVzKTtcblxuICAgIGlmIChpc1NhZmVUb1JlYWRGcm9tU291cmNlKSB7XG4gICAgICAvLyBJZiBpdCdzIHNhZmUgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIsXG4gICAgICAvLyBzdG9yZSB0aGUgdmVyc2lvbiBpbiBjYXNlIG90aGVyIGNvbXBvbmVudHMgcmVhZCBmcm9tIGl0LlxuICAgICAgLy8gQSBjaGFuZ2VkIHZlcnNpb24gbnVtYmVyIHdpbGwgbGV0IHRob3NlIGNvbXBvbmVudHMga25vdyB0byB0aHJvdyBhbmQgcmVzdGFydCB0aGUgcmVuZGVyLlxuICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKHNvdXJjZSwgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UpIHtcbiAgICB2YXIgc25hcHNob3QgPSBnZXRTbmFwc2hvdChzb3VyY2UuX3NvdXJjZSk7XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHNuYXBzaG90ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdNdXRhYmxlIHNvdXJjZSBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uIGFzIHRoZSBzbmFwc2hvdCB2YWx1ZS4gJyArICdGdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgbXV0YWJsZSB2YWx1ZXMgYW5kIGNhdXNlIHRlYXJpbmcuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbXV0YWJsZSBzb3VyY2UgYmVpbmcgc2hhcmVkIGJldHdlZW4gcmVuZGVyZXJzLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgaWYgdGhlIHNvdXJjZSBpcyBtdXRhdGVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVuZGVyZXIsXG4gICAgLy8gVGhlIHNlY29uZCByZW5kZXJlciBkb24ndCBrbm93IHRoYXQgaXQgbmVlZHMgdG8gcmVzZXQgdGhlIFdJUCB2ZXJzaW9uIGR1cmluZyB1bndpbmQsXG4gICAgLy8gKGJlY2F1c2UgdGhlIGhvb2sgb25seSBtYXJrcyBzb3VyY2VzIGFzIGRpcnR5IGlmIGl0J3Mgd3JpdHRlbiB0byB0aGVpciBXSVAgdmVyc2lvbikuXG4gICAgLy8gVGhhdCB3b3VsZCBjYXVzZSB0aGlzIHRlYXIgY2hlY2sgdG8gdGhyb3cgYWdhaW4gYW5kIGV2ZW50dWFsbHkgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAvLyBXZSBjYW4gYXZvaWQgdGhpcyBpbmZpbml0ZSBsb29wIGJ5IGV4cGxpY2l0bHkgbWFya2luZyB0aGUgc291cmNlIGFzIGRpcnR5LlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gbGVhZCB0byB0ZWFyaW5nIGluIHRoZSBmaXJzdCByZW5kZXJlciB3aGVuIGl0IHJlc3VtZXMsXG4gICAgLy8gYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCAoc2hvcnQgb2YgdGhyb3dpbmcgaGVyZSBhbmQgcmVmdXNpbmcgdG8gY29udGludWUgdGhlIHJlbmRlcikuXG4gICAgbWFya1NvdXJjZUFzRGlydHkoc291cmNlKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2Fubm90IHJlYWQgZnJvbSBtdXRhYmxlIHNvdXJjZSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgdGVhcmluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlTXV0YWJsZVNvdXJjZShob29rLCBzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICBpZiAoIShyb290ICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBnZXRWZXJzaW9uID0gc291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cbiAgdmFyIF9kaXNwYXRjaGVyJHVzZVN0YXRlID0gZGlzcGF0Y2hlci51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpO1xuICB9KSxcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IF9kaXNwYXRjaGVyJHVzZVN0YXRlWzBdLFxuICAgICAgc2V0U25hcHNob3QgPSBfZGlzcGF0Y2hlciR1c2VTdGF0ZVsxXTtcblxuICB2YXIgc25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7IC8vIEdyYWIgYSBoYW5kbGUgdG8gdGhlIHN0YXRlIGhvb2sgYXMgd2VsbC5cbiAgLy8gV2UgdXNlIGl0IHRvIGNsZWFyIHRoZSBwZW5kaW5nIHVwZGF0ZSBxdWV1ZSBpZiB3ZSBoYXZlIGEgbmV3IHNvdXJjZS5cblxuICB2YXIgc3RhdGVIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rO1xuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJlZnMgPSBtZW1vaXplZFN0YXRlLnJlZnM7XG4gIHZhciBwcmV2R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICB2YXIgcHJldlNvdXJjZSA9IG1lbW9pemVkU3RhdGUuc291cmNlO1xuICB2YXIgcHJldlN1YnNjcmliZSA9IG1lbW9pemVkU3RhdGUuc3Vic2NyaWJlO1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgcmVmczogcmVmcyxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICB9OyAvLyBTeW5jIHRoZSB2YWx1ZXMgbmVlZGVkIGJ5IG91ciBzdWJzY3JpcHRpb24gaGFuZGxlciBhZnRlciBlYWNoIGNvbW1pdC5cblxuICBkaXNwYXRjaGVyLnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcy5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBOb3JtYWxseSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24gZm9yIGEgc3RhdGUgaG9vayBuZXZlciBjaGFuZ2VzLFxuICAgIC8vIGJ1dCB0aGlzIGhvb2sgcmVjcmVhdGVzIHRoZSBxdWV1ZSBpbiBjZXJ0YWluIGNhc2VzICB0byBhdm9pZCB1cGRhdGVzIGZyb20gc3RhbGUgc291cmNlcy5cbiAgICAvLyBoYW5kbGVDaGFuZ2UoKSBiZWxvdyBuZWVkcyB0byByZWZlcmVuY2UgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGhvdXQgcmUtc3Vic2NyaWJpbmcsXG4gICAgLy8gc28gd2UgdXNlIGEgcmVmIHRvIGVuc3VyZSB0aGF0IGl0IGFsd2F5cyBoYXMgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXG4gICAgcmVmcy5zZXRTbmFwc2hvdCA9IHNldFNuYXBzaG90OyAvLyBDaGVjayBmb3IgYSBwb3NzaWJsZSBjaGFuZ2UgYmV0d2VlbiB3aGVuIHdlIGxhc3QgcmVuZGVyZWQgbm93LlxuXG4gICAgdmFyIG1heWJlTmV3VmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuXG4gICAgaWYgKCFvYmplY3RJcyh2ZXJzaW9uLCBtYXliZU5ld1ZlcnNpb24pKSB7XG4gICAgICB2YXIgbWF5YmVOZXdTbmFwc2hvdCA9IGdldFNuYXBzaG90KHNvdXJjZS5fc291cmNlKTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIG1heWJlTmV3U25hcHNob3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignTXV0YWJsZSBzb3VyY2Ugc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbiBhcyB0aGUgc25hcHNob3QgdmFsdWUuICcgKyAnRnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIG11dGFibGUgdmFsdWVzIGFuZCBjYXVzZSB0ZWFyaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0SXMoc25hcHNob3QsIG1heWJlTmV3U25hcHNob3QpKSB7XG4gICAgICAgIHNldFNuYXBzaG90KG1heWJlTmV3U25hcHNob3QpO1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbWFya1Jvb3RNdXRhYmxlUmVhZChyb290LCBsYW5lKTtcbiAgICAgIH0gLy8gSWYgdGhlIHNvdXJjZSBtdXRhdGVkIGJldHdlZW4gcmVuZGVyIGFuZCBub3csXG4gICAgICAvLyB0aGVyZSBtYXkgYmUgc3RhdGUgdXBkYXRlcyBhbHJlYWR5IHNjaGVkdWxlZCBmcm9tIHRoZSBvbGQgc291cmNlLlxuICAgICAgLy8gRW50YW5nbGUgdGhlIHVwZGF0ZXMgc28gdGhhdCB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC5cblxuXG4gICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCByb290Lm11dGFibGVSZWFkTGFuZXMpO1xuICAgIH1cbiAgfSwgW2dldFNuYXBzaG90LCBzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiB3ZSBnb3QgYSBuZXcgc291cmNlIG9yIHN1YnNjcmliZSBmdW5jdGlvbiwgcmUtc3Vic2NyaWJlIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cbiAgZGlzcGF0Y2hlci51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICAgICAgdmFyIGxhdGVzdFNldFNuYXBzaG90ID0gcmVmcy5zZXRTbmFwc2hvdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGF0ZXN0U2V0U25hcHNob3QobGF0ZXN0R2V0U25hcHNob3Qoc291cmNlLl9zb3VyY2UpKTsgLy8gUmVjb3JkIGEgcGVuZGluZyBtdXRhYmxlIHNvdXJjZSB1cGRhdGUgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuXG5cbiAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICAgIG1hcmtSb290TXV0YWJsZVJlYWQocm9vdCwgbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBBIHNlbGVjdG9yIG1pZ2h0IHRocm93IGFmdGVyIGEgc291cmNlIG11dGF0aW9uLlxuICAgICAgICAvLyBlLmcuIGl0IG1pZ2h0IHRyeSB0byByZWFkIGZyb20gYSBwYXJ0IG9mIHRoZSBzdG9yZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgc3RpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHdpdGggUmVhY3QuXG4gICAgICAgIC8vIFdvcnN0IGNhc2UgdGhlIHNlbGVjdG9yIHdpbGwgdGhyb3cgYWdhaW4gYW5kIHRoZW4gYW4gZXJyb3IgYm91bmRhcnkgd2lsbCBoYW5kbGUgaXQuXG4gICAgICAgIGxhdGVzdFNldFNuYXBzaG90KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB1bnN1YnNjcmliZSA9IHN1YnNjcmliZShzb3VyY2UuX3NvdXJjZSwgaGFuZGxlQ2hhbmdlKTtcblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgdW5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ011dGFibGUgc291cmNlIHN1YnNjcmliZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gIH0sIFtzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiBhbnkgb2YgdGhlIGlucHV0cyB0byB1c2VNdXRhYmxlU291cmNlIGNoYW5nZSwgcmVhZGluZyBpcyBwb3RlbnRpYWxseSB1bnNhZmUuXG4gIC8vXG4gIC8vIElmIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBzdWJzY3JpcHRpb24gaGF2ZSBjaGFuZ2VkIHdlIGNhbid0IGNhbid0IHRydXN0IHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIE1heWJlIHRoZSBzb3VyY2UgY2hhbmdlZCBpbiBhIHdheSB0aGF0IHRoZSBvbGQgc3Vic2NyaXB0aW9uIGlnbm9yZWQgYnV0IHRoZSBuZXcgb25lIGRlcGVuZHMgb24uXG4gIC8vXG4gIC8vIElmIHRoZSBnZXRTbmFwc2hvdCBmdW5jdGlvbiBjaGFuZ2VkLCB3ZSBhbHNvIHNob3VsZG4ndCByZWx5IG9uIHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgdW5kZXJseWluZyBzb3VyY2Ugd2FzIG11dGF0ZWQgYmV0d2VlbiB0aGUgd2hlbiB0aGUgbGFzdCBcImNoYW5nZVwiIGV2ZW50IGZpcmVkLFxuICAvLyBhbmQgd2hlbiB0aGUgY3VycmVudCByZW5kZXIgKHdpdGggdGhlIG5ldyBnZXRTbmFwc2hvdCBmdW5jdGlvbikgaXMgcHJvY2Vzc2VkLlxuICAvL1xuICAvLyBJbiBib3RoIGNhc2VzLCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgcGVuZGluZyB1cGRhdGVzIChzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgcmVsZXZhbnQpXG4gIC8vIGFuZCB0cmVhdCByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBhcyB3ZSBkbyBpbiB0aGUgbW91bnQgY2FzZS5cblxuICBpZiAoIW9iamVjdElzKHByZXZHZXRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHx8ICFvYmplY3RJcyhwcmV2U291cmNlLCBzb3VyY2UpIHx8ICFvYmplY3RJcyhwcmV2U3Vic2NyaWJlLCBzdWJzY3JpYmUpKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHF1ZXVlIGFuZCBzZXRTdGF0ZSBtZXRob2QsXG4gICAgLy8gU28gaWYgdGhlcmUgYXJlIGludGVybGVhdmVkIHVwZGF0ZXMsIHRoZXkgZ2V0IHB1c2hlZCB0byB0aGUgb2xkZXIgcXVldWUuXG4gICAgLy8gV2hlbiB0aGlzIGJlY29tZXMgY3VycmVudCwgdGhlIHByZXZpb3VzIHF1ZXVlIGFuZCBkaXNwYXRjaCBtZXRob2Qgd2lsbCBiZSBkaXNjYXJkZWQsXG4gICAgLy8gaW5jbHVkaW5nIGFueSBpbnRlcmxlYXZpbmcgdXBkYXRlcyB0aGF0IG9jY3VyLlxuICAgIHZhciBuZXdRdWV1ZSA9IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IHNuYXBzaG90XG4gICAgfTtcbiAgICBuZXdRdWV1ZS5kaXNwYXRjaCA9IHNldFNuYXBzaG90ID0gZGlzcGF0Y2hBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBuZXdRdWV1ZSk7XG4gICAgc3RhdGVIb29rLnF1ZXVlID0gbmV3UXVldWU7XG4gICAgc3RhdGVIb29rLmJhc2VRdWV1ZSA9IG51bGw7XG4gICAgc25hcHNob3QgPSByZWFkRnJvbVVuc3ViY3JpYmVkTXV0YWJsZVNvdXJjZShyb290LCBzb3VyY2UsIGdldFNuYXBzaG90KTtcbiAgICBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXRlSG9vay5iYXNlU3RhdGUgPSBzbmFwc2hvdDtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICByZWZzOiB7XG4gICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgICBzZXRTbmFwc2hvdDogbnVsbFxuICAgIH0sXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmVcbiAgfTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7XG4gICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZik7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlIHwgUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSB8IFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZSh2YWx1ZSksXG4gICAgICBwcmV2VmFsdWUgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX21vdW50U3RhdGVbMV07XG5cbiAgbW91bnRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgcmV0dXJuIHByZXZWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIHByZXZWYWx1ZSA9IF91cGRhdGVTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX3VwZGF0ZVN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgcHJldlZhbHVlID0gX3JlcmVuZGVyU3RhdGVbMF0sXG4gICAgICBzZXRWYWx1ZSA9IF9yZXJlbmRlclN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2spIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gIHtcbiAgICBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsIDwgVXNlckJsb2NraW5nUHJpb3JpdHkkMiA/IFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgOiBwcmlvcml0eUxldmVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRQZW5kaW5nKHRydWUpO1xuICAgIH0pO1xuICAgIHJ1bldpdGhQcmlvcml0eSQxKHByaW9yaXR5TGV2ZWwgPiBOb3JtYWxQcmlvcml0eSQxID8gTm9ybWFsUHJpb3JpdHkkMSA6IHByaW9yaXR5TGV2ZWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUyID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZTJbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGUyWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgY2FuIGJlIHN0b3JlZCBvbiBhIHJlZiwgc2luY2UgYHNldFBlbmRpbmdgXG4gIC8vIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgbW91bnRSZWYoc3RhcnQpO1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlMiA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGUyWzBdO1xuXG4gIHZhciBzdGFydFJlZiA9IHVwZGF0ZVJlZigpO1xuICB2YXIgc3RhcnQgPSBzdGFydFJlZi5jdXJyZW50O1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZTIgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZTJbMF07XG5cbiAgdmFyIHN0YXJ0UmVmID0gdXBkYXRlUmVmKCk7XG4gIHZhciBzdGFydCA9IHN0YXJ0UmVmLmN1cnJlbnQ7XG4gIHJldHVybiBbc3RhcnQsIGlzUGVuZGluZ107XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25PcGFxdWVJZGVudGlmaWVyQWNjZXNzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFNob3VsZCB3YXJuIGluIGVmZmVjdHMgYW5kIGNhbGxiYWNrcywgdG9vXG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcblxuICAgIGlmIChnZXRJc1JlbmRlcmluZygpICYmICFkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdKSB7XG4gICAgICBlcnJvcignVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgJyArICdwYXNzZWQgdGhyb3VnaCB0byBhdHRyaWJ1dGVzIG9ubHkuIERvIG5vdCByZWFkIHRoZSAnICsgJ3ZhbHVlIGRpcmVjdGx5LicpO1xuXG4gICAgICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRPcGFxdWVJZGVudGlmaWVyKCkge1xuICB2YXIgbWFrZUlkID0gIG1ha2VDbGllbnRJZEluREVWLmJpbmQobnVsbCwgd2Fybk9uT3BhcXVlSWRlbnRpZmllckFjY2Vzc0luREVWLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkpIDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciBkaWRVcGdyYWRlID0gZmFsc2U7XG4gICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcblxuICAgIHZhciByZWFkVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWRpZFVwZ3JhZGUpIHtcbiAgICAgICAgLy8gT25seSB1cGdyYWRlIG9uY2UuIFRoaXMgd29ya3MgZXZlbiBpbnNpZGUgdGhlIHJlbmRlciBwaGFzZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB1cGRhdGUgaXMgYWRkZWQgdG8gYSBzaGFyZWQgcXVldWUsIHdoaWNoIG91dGxhc3RzIHRoZVxuICAgICAgICAvLyBpbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgIGRpZFVwZ3JhZGUgPSB0cnVlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gdHJ1ZTtcbiAgICAgICAgICBzZXRJZChtYWtlSWQoKSk7XG4gICAgICAgICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICAgICAgICAgIHdhcm5Pbk9wYXF1ZUlkZW50aWZpZXJBY2Nlc3NJbkRFVihmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gYXR0cmlidXRlcyBvbmx5LiBEbyBub3QgcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaWQgPSBtYWtlT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHJlYWRWYWx1ZSk7XG4gICAgdmFyIHNldElkID0gbW91bnRTdGF0ZShpZClbMV07XG5cbiAgICBpZiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBVcGRhdGUgfCBQYXNzaXZlO1xuICAgICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0SWQobWFrZUlkKCkpO1xuICAgICAgfSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9pZCA9IG1ha2VJZCgpO1xuXG4gICAgbW91bnRTdGF0ZShfaWQpO1xuICAgIHJldHVybiBfaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpIHtcbiAgdmFyIGlkID0gdXBkYXRlU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlck9wYXF1ZUlkZW50aWZpZXIoKSB7XG4gIHZhciBpZCA9IHJlcmVuZGVyU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gICAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5lYWdlclJlZHVjZXIgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gamVzdCBpc24ndCBhIGdsb2JhbCwgYW5kIGlzbid0IHJlY29nbml6ZWQgb3V0c2lkZSBvZiB0ZXN0c1xuICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgICB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpO1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5EZXYoZmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VPcGFxdWVJZGVudGlmaWVyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbiAgICB9LFxuICAgIHVzZU9wYXF1ZUlkZW50aWZpZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU9wYXF1ZUlkZW50aWZpZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKHR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW1sYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgbmV4dFByb3BzLm1vZGUgPT09ICd1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZycpIHtcbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvIGluIEJsb2NraW5nIG1vZGUuXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7IC8vIFdlJ3JlIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgd2UgbmVlZCB0byBwdXNoIHRoaXMgdG8gdGhlIHN0YWNrIGFueXdheVxuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlJ3JlIG5vdCBoaWRkZW4gYW55bW9yZSwgcmVzZXQgdGhlIHN0YXRlXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuLy8gb3Vyc2VsdmVzIHRvIHRoaXMgY29uc3RyYWludCwgdGhvdWdoLiBJZiB0aGUgYmVoYXZpb3IgZGl2ZXJnZXMsIHdlIHNob3VsZFxuLy8gZm9yayB0aGUgZnVuY3Rpb24uXG5cblxudmFyIHVwZGF0ZUxlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudDtcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuXG4gICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgY2xhc3MgY29tcG9uZW50IHdpdGhvdXQgYW4gaW5zdGFuY2Ugb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkXG4gICAgICAvLyBpbnNpZGUgYSBub24tY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG9cbiAgICAgIC8vIHRyZWF0IGl0IGxpa2UgYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICBpZiAoIShjdXJyZW50ICE9PSBudWxsICYmIHVwZGF0ZVF1ZXVlICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIklmIHRoZSByb290IGRvZXMgbm90IGhhdmUgYW4gdXBkYXRlUXVldWUsIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgYmFpbGVkIG91dC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmVsZW1lbnQgOiBudWxsO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290Lmh5ZHJhdGUgJiYgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBjdXJyZW50IGNoaWxkcmVuIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gV2UgYWx3YXlzIHRyeSB0byBoeWRyYXRlLiBJZiB0aGlzIGlzbid0IGEgaHlkcmF0aW9uIHBhc3MgdGhlcmUgd29uJ3RcbiAgICAvLyBiZSBhbnkgY2hpbGRyZW4gdG8gaHlkcmF0ZSB3aGljaCBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSB0aGluZyBhc1xuICAgIC8vIG5vdCBoeWRyYXRpbmcuXG4gICAge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7XG5cbiAgICAgIGlmIChtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhW2ldO1xuICAgICAgICAgIHZhciB2ZXJzaW9uID0gbXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YVtpICsgMV07XG4gICAgICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHJlc2V0IGh5ZHJhdGlvbiBzdGF0ZSBpbiBjYXNlIHdlIGFib3J0ZWQgYW5kIHJlc3VtZWQgYW5vdGhlclxuICAgIC8vIHJvb3QuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQm91bmRhcmllcyB3aXRob3V0IGZhbGxiYWNrcyBvciBzaG91bGQgYmUgYXZvaWRlZCBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2VcbiAgICAgIC8vIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIG5leHRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSkge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgIGlmIChuZXh0UHJvcHMuZmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3BzLnVuc3RhYmxlX2V4cGVjdGVkTG9hZFRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgQ1BVLWJvdW5kIHRyZWUuIFNraXAgdGhpcyB0cmVlIGFuZCBzaG93IGEgcGxhY2Vob2xkZXIgdG9cbiAgICAgIC8vIHVuYmxvY2sgdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQuIFRoZW4gaW1tZWRpYXRlbHkgcmV0cnkgYWZ0ZXIgdGhlXG4gICAgICAvLyBpbml0aWFsIGNvbW1pdC5cbiAgICAgIHZhciBfZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXMgdG9cbiAgICAgIC8vIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtcyBvZlxuICAgICAgLy8gcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLCBpdCdzXG4gICAgICAvLyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzIGNvbW1pdHRlZC4gSWZcbiAgICAgIC8vIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZSBwYWludGVkLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLiBXZSBjYW4gdXNlIGFueVxuICAgICAgLy8gUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmcgc2luY2Ugd2UncmUgbGVhdmluZ1xuICAgICAgLy8gaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9mYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBJZiB0aGUgY3VycmVudCBmaWJlciBoYXMgYSBTdXNwZW5zZVN0YXRlLCB0aGF0IG1lYW5zIGl0J3MgYWxyZWFkeSBzaG93aW5nXG4gICAgLy8gYSBmYWxsYmFjay5cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50My5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4zID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBpcyBub3QgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2suXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRpbWVkIG91dC5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjQgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjQsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgX3ByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5tZW1vaXplZFN0YXRlID0gX3ByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKF9wcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpOyAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiBDb250aW51ZSByZW5kZXJpbmcgdGhlIGNoaWxkcmVuLCBsaWtlIHdlXG4gICAgICAgIC8vIG5vcm1hbGx5IGRvLlxuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW41ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuNSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBCbG9ja2luZ01vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBlZmZlY3QgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LiBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBEZWxldGlvbnMgYXJlIHN0b3JlZFxuICAgIC8vIG9uIHRoZSBzYW1lIGxpc3QgYXMgZWZmZWN0cy4gV2Ugd2FudCB0byBrZWVwIHRoZSBlZmZlY3RzIGZyb20gdGhlIHByaW1hcnlcbiAgICAvLyB0cmVlLiBTbyB3ZSBjb3B5IHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50J3MgZWZmZWN0IGxpc3QsIHdoaWNoIGRvZXMgbm90XG4gICAgLy8gaW5jbHVkZSB0aGUgZmFsbGJhY2sgZGVsZXRpb24gZWZmZWN0LlxuXG5cbiAgICB2YXIgcHJvZ3Jlc3NlZExhc3RFZmZlY3QgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKHByb2dyZXNzZWRMYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmZpcnN0RWZmZWN0O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IHByb2dyZXNzZWRMYXN0RWZmZWN0O1xuICAgICAgcHJvZ3Jlc3NlZExhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IFJlc2V0IHRoaXMgc29tZXdoZXJlIGVsc2U/IExvbCBsZWdhY3kgbW9kZSBpcyBzbyB3ZWlyZC5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCBsYXN0RWZmZWN0QmVmb3JlUmVuZGVyaW5nKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZSxcbiAgICAgIGxhc3RFZmZlY3Q6IGxhc3RFZmZlY3RCZWZvcmVSZW5kZXJpbmdcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbGFzdEVmZmVjdEJlZm9yZVJlbmRlcmluZztcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgbmV3VmFsdWUpO1xuXG4gIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkQml0cyA9IGNhbGN1bGF0ZUNoYW5nZWRCaXRzKGNvbnRleHQsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG5cbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuICAgIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0ICE9PSBudWxsKSB7XG4gICAgICBsYXN0Lm5leHRFZmZlY3QgPSBjdXJyZW50O1xuICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHVwZGF0ZUxhbmVzID0gd29ya0luUHJvZ3Jlc3MubGFuZXM7XG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAgICAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gICAgICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cblxuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICB9IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG5cblxuICAgICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgdXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQzID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQzLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MywgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlTGVnYWN5SGlkZGVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFmaWJlclJvb3QuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQuXG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvciB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbFxuICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeSBiZSBlbXB0eSkuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgJiYgIXByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBzdWJ0cmVlZSBpcyBydW5uaW5nIGluIGJsb2NraW5nIG1vZGUgd2UgY2FuIHN1c3BlbmQsXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvbid0IHN1c3BlbmQuXG4gICAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBCbG9ja2luZ01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IE9ubHkgc2NoZWR1bGUgdXBkYXRlcyBpZiB0aGVzZSB2YWx1ZXMgYXJlIG5vbiBlcXVhbCwgaS5lLiBpdCBjaGFuZ2VkLlxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhXG4gICAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS4gVGhpcyBmbGFnIGlzIGFsc28gdXNlZCB0byBoaWRlIHRoZVxuICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbi4gSW4gbXV0YXRpb24gbW9kZSwgd2UgYWxzbyBuZWVkIHRoZSBmbGFnIHRvXG4gICAgICAgICAgICAvLyAqdW5oaWRlKiBjaGlsZHJlbiB0aGF0IHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHNvIGNoZWNrIGlmIHRoaXNcbiAgICAgICAgICAgIC8vIGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHRvby5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVubmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbm5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVubmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbm5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cblxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVubmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5uYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVubmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSByb3cgd2UganVzdCByZW5kZXJlZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgd2UgcmVuZGVyZWQgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gY2hpbGQuIFRoZSBuZXN0ZWQgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGFwcGVuZGVkIHRoZW1zZWx2ZXMuXG4gICAgICAgICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZW1vdmUgYW55IGVmZmVjdHMgdGhhdCB3ZXJlIGFwcGVuZGVkIGFmdGVyIHRoaXMgcG9pbnQuXG5cbiAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IC8vIFdlJ3JlIGRvbmUuXG5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFya1NwYXduZWRXb3JrKFNvbWVSZXRyeUxhbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgbmV3UHJvcHMubW9kZSAhPT0gJ3Vuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nJykge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKCEoKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlRoZSByb290IGZhaWxlZCB0byB1bm1vdW50IGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspIHtcbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICBwb3BQcm92aWRlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lKHNvdXJjZS50eXBlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lKGJvdW5kYXJ5LnR5cGUpO1xuXG4gICAgICBpZiAoZXJyb3JCb3VuZGFyeU5hbWUpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTsgLy8gT25seSBsb2cgaGVyZSBpZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZFxuXG4gICAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXQgb25seSBpZlxuICAvLyBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoXG4gIC8vIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7IC8vIEl0cyBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgc291cmNlRmliZXIuZmlyc3RFZmZlY3QgPSBzb3VyY2VGaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcblxuICAgIGlmICgoc291cmNlRmliZXIubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIG1lbW9pemVkU3RhdGUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIHdlIGF0dGVtcHRlZFxuICAgICAgLy8gdG8gcmVuZGVyIGl0LlxuICAgICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzSW52aXNpYmxlUGFyZW50Qm91bmRhcnkgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpOyAvLyBTY2hlZHVsZSB0aGUgbmVhcmVzdCBTdXNwZW5zZSB0byByZS1yZW5kZXIgdGhlIHRpbWVkIG91dCB2aWV3LlxuXG4gICAgdmFyIF93b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudEJvdW5kYXJ5KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgbmVhcmVzdCBib3VuZGFyeS5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIHByb21pc2Ugb24gdGhlIGJvdW5kYXJ5IGZpYmVyLiBJZiB0aGUgYm91bmRhcnkgdGltZXMgb3V0LCB3ZSdsbFxuICAgICAgICAvLyBhdHRhY2ggYW5vdGhlciBsaXN0ZW5lciB0byBmbGlwIHRoZSBib3VuZGFyeSBiYWNrIHRvIGl0cyBub3JtYWwgc3RhdGUuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSBfd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICAgICAgICB9IC8vIElmIHRoZSBib3VuZGFyeSBpcyBvdXRzaWRlIG9mIGJsb2NraW5nIG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAgICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIEluIHRoZSBjb21taXQgcGhhc2UsIHdlJ2xsIHNjaGVkdWxlIGFcbiAgICAgICAgLy8gc3Vic2VxdWVudCBzeW5jaHJvbm91cyB1cGRhdGUgdG8gcmUtcmVuZGVyIHRoZSBTdXNwZW5zZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgY29tcG9uZW50IHRoYXQgc3VzcGVuZGVkIHdhc1xuICAgICAgICAvLyBpbnNpZGUgYSBibG9ja2luZyBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuXG5cbiAgICAgICAgaWYgKChfd29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpOyAvLyBFeGl0IHdpdGhvdXQgc3VzcGVuZGluZy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgICAgICAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAgICAgICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgICAgICAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgICAgICAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgICAgICAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgICAgICAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAgICAgICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgICAgICAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgICAgICAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgICAgICAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gICAgICAgIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAgICAgICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAgICAgICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgICAgICAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAgICAgICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAgICAgICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgICBfd29ya0luUHJvZ3Jlc3MgPSBfd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIH0gd2hpbGUgKF93b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7IC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG5cblxuICAgIHZhbHVlID0gbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lKHNvdXJjZUZpYmVyLnR5cGUpIHx8ICdBIFJlYWN0IGNvbXBvbmVudCcpICsgJyBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG4nICsgJ1xcbicgKyAnQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byAnICsgJ3Byb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LicpO1xuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IoKTtcbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyLCBudWxsLCBjdXJyZW50LCBpbnN0YW5jZSk7XG5cbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIHJlZiwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICB2YXIgcmVmRXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgcmVmRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSkge1xuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuXG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBCbG9jazpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFNuYXBzaG90KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgU25hcHNob3QpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KHRhZywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIHRhZykgPT09IHRhZykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudCh0YWcsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB0YWcpID09PSB0YWcpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIHVzZUVmZmVjdChhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArICd1c2VFZmZlY3QoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgIG5leHQgPSBfZWZmZWN0Lm5leHQsXG4gICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgIGlmICgodGFnICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxICYmICh0YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdFVubW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0TW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBuZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lLCBmaW5pc2hlZFJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciBjdXJyZW50UmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59IC8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5cblxuZnVuY3Rpb24gY29tbWl0VW5tb3VudChmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQpO1xuXG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgQmxvY2s6XG4gICAgICB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICB2YXIgX2VmZmVjdDIgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdDIuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QyLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RVbm1vdW50KGN1cnJlbnQsIGVmZmVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICB7XG4gICAgICAgICAgdW5tb3VudEhvc3RDb21wb25lbnRzKGZpbmlzaGVkUm9vdCwgY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmRhbWVudGFsQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgcm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBXaGlsZSB3ZSdyZSBpbnNpZGUgYSByZW1vdmVkIGhvc3Qgbm9kZSB3ZSBkb24ndCB3YW50IHRvIGNhbGxcbiAgLy8gcmVtb3ZlQ2hpbGQgb24gdGhlIGlubmVyIG5vZGVzIGJlY2F1c2UgdGhleSdyZSByZW1vdmVkIGJ5IHRoZSB0b3BcbiAgLy8gY2FsbCBhbnl3YXkuIFdlIGFsc28gd2FudCB0byBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50IG9uIGFsbFxuICAvLyBjb21wb3NpdGVzIGJlZm9yZSB0aGlzIGhvc3Qgbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZXJlZm9yZVxuICAvLyB3ZSBkbyBhbiBpbm5lciBsb29wIHdoaWxlIHdlJ3JlIHN0aWxsIGluc2lkZSB0aGUgaG9zdCBub2RlLlxuICB2YXIgbm9kZSA9IHJvb3Q7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb21taXRVbm1vdW50KGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiBtb3JlIGNvbXBvc2l0ZSBvciBob3N0IG5vZGVzLlxuICAgIC8vIFNraXAgcG9ydGFscyBiZWNhdXNlIGNvbW1pdFVubW91bnQoKSBjdXJyZW50bHkgdmlzaXRzIHRoZW0gcmVjdXJzaXZlbHkuXG5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoIC8vIElmIHdlIHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyB1c2luZyBjb21taXRVbm1vdW50IGFib3ZlLlxuICAgIC8vIElmIHdlIGRvbid0IHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyBoZXJlIGluc3RlYWQuXG4gICAgIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVycyB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuIElkZWFsbHksIHdlXG4gIC8vIHNob3VsZCBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLiBUaGlzIGNoaWxkXG4gIC8vIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vIE5vdGU6IHdlIGNhbm5vdCBudWxsIG91dCBzaWJsaW5nIGhlcmUsIG90aGVyd2lzZSBpdCBjYW4gY2F1c2UgaXNzdWVzXG4gIC8vIHdpdGggZmluZERPTU5vZGUgYW5kIGhvdyBpdCByZXF1aXJlcyB0aGUgc2libGluZyBmaWVsZCB0byBjYXJyeSBvdXRcbiAgLy8gdHJhdmVyc2FsIGluIGEgbGF0ZXIgZWZmZWN0LiBTZWUgUFIgIzE2ODIwLiBXZSBub3cgY2xlYXIgdGhlIHNpYmxpbmdcbiAgLy8gZmllbGQgYWZ0ZXIgZWZmZWN0cywgc2VlOiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cy5cbiAgLy9cbiAgLy8gRG9uJ3QgZGlzY29ubmVjdCBzdGF0ZU5vZGUgbm93OyBpdCB3aWxsIGJlIGRldGFjaGVkIGluIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzLlxuICAvLyBJdCBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGFuIGVycm9yIGJvdW5kYXJ5LFxuICAvLyBhbmQgb25lIG9mIGl0cyBkZXNjZW5kYW50cyB0aHJvd3Mgd2hpbGUgdW5tb3VudGluZyBhIHBhc3NpdmUgZWZmZWN0LlxuICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICBmaWJlci5jaGlsZCA9IG51bGw7XG4gIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIGZpYmVyLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgZmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgdmFyIHBhcmVudDtcbiAgdmFyIGlzQ29udGFpbmVyO1xuICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcGFyZW50ID0gcGFyZW50U3RhdGVOb2RlO1xuICAgICAgaXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgaXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cblxuICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgfVxuXG4gIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICBpZiAoaXNDb250YWluZXIpIHtcbiAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QgfHwgZW5hYmxlRnVuZGFtZW50YWxBUEkgKSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IGlzSG9zdCA/IG5vZGUuc3RhdGVOb2RlIDogbm9kZS5zdGF0ZU5vZGUuaW5zdGFuY2U7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCB8fCBlbmFibGVGdW5kYW1lbnRhbEFQSSApIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gaXNIb3N0ID8gbm9kZS5zdGF0ZU5vZGUgOiBub2RlLnN0YXRlTm9kZS5pbnN0YW5jZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVubW91bnRIb3N0Q29tcG9uZW50cyhmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgdmFyIG5vZGUgPSBjdXJyZW50OyAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuXG4gIHZhciBjdXJyZW50UGFyZW50SXNWYWxpZCA9IGZhbHNlOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICB2YXIgY3VycmVudFBhcmVudDtcbiAgdmFyIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmICghY3VycmVudFBhcmVudElzVmFsaWQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLnJldHVybjtcblxuICAgICAgZmluZFBhcmVudDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKCEocGFyZW50ICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGU7XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50U3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcblxuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIEFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSB1bm1vdW50ZWQsIGl0IGlzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGVcbiAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cblxuICAgICAgaWYgKGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGQoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuXG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgIC8vIFdlIHdpbGwgcmVhc3NpZ24gaXQgYmFjayB3aGVuIHdlIHBvcCB0aGUgcG9ydGFsIG9uIHRoZSB3YXkgdXAuXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlOyAvLyBWaXNpdCBjaGlsZHJlbiBiZWNhdXNlIHBvcnRhbHMgbWlnaHQgY29udGFpbiBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFVubW91bnQoZmluaXNoZWRSb290LCBub2RlKTsgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB3ZSBtYXkgZmluZCBtb3JlIGhvc3QgY29tcG9uZW50cyBiZWxvdy5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoZmluaXNoZWRSb290LCBjdXJyZW50KTtcbiAgfVxuXG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgZGV0YWNoRmliZXJNdXRhdGlvbihjdXJyZW50KTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZGV0YWNoRmliZXJNdXRhdGlvbihhbHRlcm5hdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFdvcmsoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3Jvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKF9yb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgaHlkcmF0ZWQuIE5vIG5lZWQgdG8gaHlkcmF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIF9yb290Lmh5ZHJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKF9yb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlQ29tcG9uZW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuZGFtZW50YWxDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNvbXBvbmVudChmaW5pc2hlZFdvcmspIHtcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlICE9PSBudWxsKSB7XG4gICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG5cbiAgICB7XG4gICAgICAvLyBIaWRlIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkgY2hpbGRyZW4uIFRPRE86XG4gICAgICAvLyBJZGVhbGx5LCB0aGlzIGVmZmVjdCB3b3VsZCBoYXZlIGJlZW4gc2NoZWR1bGVkIG9uIHRoZSBPZmZzY3JlZW4gZmliZXJcbiAgICAgIC8vIGl0c2VsZi4gVGhhdCdzIGhvdyB1bmhpZGluZyB3b3JrczogdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc2NoZWR1bGVzIGFuXG4gICAgICAvLyBlZmZlY3Qgb24gaXRzZWxmLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgZGlkbid0IGNvbXBsZXRlLFxuICAgICAgLy8gc28gdGhlIGZpYmVyIHdhcyBuZXZlciBhZGRlZCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIG5vcm1hbCBwYXRoLiBXZVxuICAgICAgLy8gY291bGQgaGF2ZSBhcHBlbmRlZCBpdCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIFN1c3BlbnNlIGNvbXBvbmVudCdzXG4gICAgICAvLyBzZWNvbmQgcGFzcywgYnV0IGRvaW5nIGl0IHRoaXMgd2F5IGlzIGxlc3MgY29tcGxpY2F0ZWQuIFRoaXMgd291bGQgYmVcbiAgICAgIC8vIHNpbXBsZXIgaWYgd2UgZ290IHJpZCBvZiB0aGUgZWZmZWN0IGxpc3QgYW5kIHRyYXZlcnNlZCB0aGUgdHJlZSwgbGlrZVxuICAgICAgLy8gd2UncmUgcGxhbm5pbmcgdG8gZG8uXG4gICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ocHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod2FrZWFibGUuX19yZWFjdERvTm90VHJhY2VJbnRlcmFjdGlvbnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbi8vIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGJvdW5kYXJ5IGlzIGFscmVhZHkgaGlkZGVuLlxuLy8gVE9ETzogVXNlIGFuIGVmZmVjdCB0YWcuXG5cblxuZnVuY3Rpb24gaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKG9sZFN0YXRlID09PSBudWxsIHx8IG9sZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlICE9PSBudWxsICYmIG5ld1N0YXRlLmRlaHlkcmF0ZWQgPT09IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb21taXRSZXNldFRleHRDb250ZW50KGN1cnJlbnQpIHtcblxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQuc3RhdGVOb2RlKTtcbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciQxID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IkMSgnc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIElzU29tZVJlbmRlcmVyQWN0aW5nID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSXNTb21lUmVuZGVyZXJBY3Rpbmc7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgRXZlbnRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBEaXNjcmV0ZUV2ZW50Q29udGV4dCA9XG4vKiAgICAgICAgICovXG40O1xudmFyIExlZ2FjeVVuYmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgKi9cbjg7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgUmV0cnlBZnRlckVycm9yID1cbi8qICAgICAgICovXG42NDtcbnZhciBSb290SW5jb21wbGV0ZSA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5jb21wbGV0ZTsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgcGluZ2VkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xudmFyIG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID0gTm9Qcmlvcml0eSQxO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xudmFyIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsgLy8gTWFya3MgdGhlIG5lZWQgdG8gcmVzY2hlZHVsZSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGVzZSBsYW5lc1xuLy8gZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIHRyYWNlZCBhY3Jvc3MgY29tcG9uZW50c1xuLy8gdGhhdCBzcGF3biBuZXcgd29yayBkdXJpbmcgcmVuZGVyLiBFLmcuIGhpZGRlbiBib3VuZGFyaWVzLCBzdXNwZW5kZWQgU1NSXG4vLyBoeWRyYXRpb24gb3IgU3VzcGVuc2VMaXN0LlxuLy8gVE9ETzogQ2FuIHVzZSBhIGJpdG1hc2sgaW5zdGVhZCBvZiBhbiBhcnJheVxuXG52YXIgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbnZhciBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgPSBOb0xhbmVzOyAvLyBEZXYgb25seSBmbGFnIHRoYXQgdHJhY2tzIGlmIHBhc3NpdmUgZWZmZWN0cyBhcmUgY3VycmVudGx5IGJlaW5nIGZsdXNoZWQuXG4vLyBXZSB3YXJuIGFib3V0IHN0YXRlIHVwZGF0ZXMgZm9yIHVubW91bnRlZCBjb21wb25lbnRzIGRpZmZlcmVudGx5IGluIHRoaXMgY2FzZS5cblxudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZSBpbnB1dHNcbiAgLy8gdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLiBGb3IgZXhhbXBsZSwgd2UgdXNlIHRoZSBgcmVuZGVyTGFuZXNgXG4gIC8vIHRvIGF2b2lkIGNob29zaW5nIGEgbGFuZSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuXG4gIC8vXG4gIC8vIEhvd2V2ZXIsIHRoZSBcImluY2x1ZGVkXCIgbGFuZXMgY291bGQgYmUgbXV0YXRlZCBpbiBiZXR3ZWVuIHVwZGF0ZXMgaW4gdGhlXG4gIC8vIHNhbWUgZXZlbnQsIGxpa2UgaWYgeW91IHBlcmZvcm0gYW4gdXBkYXRlIGluc2lkZSBgZmx1c2hTeW5jYC4gT3IgYW55IG90aGVyXG4gIC8vIGNvZGUgcGF0aCB0aGF0IG1pZ2h0IGNhbGwgYHByZXBhcmVGcmVzaFN0YWNrYC5cbiAgLy9cbiAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzIG92ZXIuXG4gIC8vIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cbiAgLy9cbiAgLy8gV2UnbGwgZG8gdGhlIHNhbWUgZm9yIGBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXNgIGJlbG93LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmIChjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGN1cnJlbnRFdmVudFBlbmRpbmdMYW5lcyA9IG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ICE9PSBudWxsID8gbW9zdFJlY2VudGx5VXBkYXRlZFJvb3QucGVuZGluZ0xhbmVzIDogTm9MYW5lcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZFRyYW5zaXRpb25MYW5lKGN1cnJlbnRFdmVudFdpcExhbmVzLCBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMpO1xuICB9IC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlcGVuZGVuY3kgb24gdGhlIFNjaGVkdWxlciBwcmlvcml0eS5cbiAgLy8gVG8gZG8gdGhhdCwgd2UncmUgcmVwbGFjaW5nIGl0IHdpdGggYW4gdXBkYXRlIGxhbmUgcHJpb3JpdHkuXG5cblxuICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpOyAvLyBUaGUgb2xkIGJlaGF2aW9yIHdhcyB1c2luZyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFNjaGVkdWxlci5cbiAgLy8gVGhpcyBjb3VwbGVzIFJlYWN0IHRvIHRoZSBTY2hlZHVsZXIgaW50ZXJuYWxzLCBzbyB3ZSdyZSByZXBsYWNpbmcgaXRcbiAgLy8gd2l0aCB0aGUgY3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eSBhYm92ZS4gQXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpc1xuICAvLyBjb3VsZCBiZSBwcm9ibGVtYXRpYywgaWYgd2UncmUgbm90IGluc2lkZSBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsXG4gIC8vIHRoZW4gd2UnbGwgZ2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBydW5uaW5nIFNjaGVkdWxlciB0YXNrLFxuICAvLyB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdCB3ZSB3YW50LlxuXG4gIHZhciBsYW5lO1xuXG4gIGlmICggLy8gVE9ETzogVGVtcG9yYXJ5LiBXZSdyZSByZW1vdmluZyB0aGUgY29uY2VwdCBvZiBkaXNjcmV0ZSB1cGRhdGVzLlxuICAoZXhlY3V0aW9uQ29udGV4dCAmIERpc2NyZXRlRXZlbnRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHNjaGVkdWxlclByaW9yaXR5ID09PSBVc2VyQmxvY2tpbmdQcmlvcml0eSQyKSB7XG4gICAgbGFuZSA9IGZpbmRVcGRhdGVMYW5lKElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHksIGN1cnJlbnRFdmVudFdpcExhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyTGFuZVByaW9yaXR5ID0gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eSk7XG5cbiAgICBsYW5lID0gZmluZFVwZGF0ZUxhbmUoc2NoZWR1bGVyTGFuZVByaW9yaXR5LCBjdXJyZW50RXZlbnRXaXBMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBTZWUgYHJlcXVlc3RVcGRhdGVMYW5lYCBmb3IgZXhwbGFuYXRpb24gb2YgYGN1cnJlbnRFdmVudFdpcExhbmVzYFxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRSZXRyeUxhbmUoY3VycmVudEV2ZW50V2lwTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcbiAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpO1xuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiByZXF1ZXN0VXBkYXRlTGFuZVByaW9yaXR5IGFsc28gcmVhZHMgdGhlIHByaW9yaXR5LiBQYXNzIHRoZVxuICAvLyBwcmlvcml0eSBhcyBhbiBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzIG9uZS5cblxuXG4gIHZhciBwcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICBpZiAobGFuZSA9PT0gU3luY0xhbmUpIHtcbiAgICBpZiAoIC8vIENoZWNrIGlmIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzXG4gICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBMZWdhY3lVbmJhdGNoZWRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIC8vIENoZWNrIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gUmVnaXN0ZXIgcGVuZGluZyBpbnRlcmFjdGlvbnMgb24gdGhlIHJvb3QgdG8gYXZvaWQgbG9zaW5nIHRyYWNlZCBpbnRlcmFjdGlvbiBkYXRhLlxuICAgICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmUpOyAvLyBUaGlzIGlzIGEgbGVnYWN5IGVkZ2UgY2FzZS4gVGhlIGluaXRpYWwgbW91bnQgb2YgYSBSZWFjdERPTS5yZW5kZXItZWRcbiAgICAgIC8vIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzIHNob3VsZCBiZSBzeW5jaHJvbm91cywgYnV0IGxheW91dCB1cGRhdGVzXG4gICAgICAvLyBzaG91bGQgYmUgZGVmZXJyZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmF0Y2guXG5cbiAgICAgIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNjaGVkdWxlIGEgZGlzY3JldGUgdXBkYXRlIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IFN5bmMuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgRGlzY3JldGVFdmVudENvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgKCAvLyBPbmx5IHVwZGF0ZXMgYXQgdXNlci1ibG9ja2luZyBwcmlvcml0eSBvciBncmVhdGVyIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gZGlzY3JldGUsIGV2ZW4gaW5zaWRlIGEgZGlzY3JldGUgZXZlbnQuXG4gICAgcHJpb3JpdHlMZXZlbCA9PT0gVXNlckJsb2NraW5nUHJpb3JpdHkkMiB8fCBwcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSQxKSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgZXZlbnQuIFRyYWNrIHRoZSBsb3dlc3QgcHJpb3JpdHlcbiAgICAgIC8vIGRpc2NyZXRlIHVwZGF0ZSBwZXIgcm9vdCBzbyB3ZSBjYW4gZmx1c2ggdGhlbSBlYXJseSwgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG5ldyBTZXQoW3Jvb3RdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuYWRkKHJvb3QpO1xuICAgICAgfVxuICAgIH0gLy8gU2NoZWR1bGUgb3RoZXIgdXBkYXRlcyBhZnRlciBpbiBjYXNlIHRoZSBjYWxsYmFjayBpcyBzeW5jLlxuXG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG4gIH0gLy8gV2UgdXNlIHRoaXMgd2hlbiBhc3NpZ25pbmcgYSBsYW5lIGZvciBhIHRyYW5zaXRpb24gaW5zaWRlXG4gIC8vIGByZXF1ZXN0VXBkYXRlTGFuZWAuIFdlIGFzc3VtZSBpdCdzIHRoZSBzYW1lIGFzIHRoZSByb290IGJlaW5nIHVwZGF0ZWQsXG4gIC8vIHNpbmNlIGluIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZSByb290IGFwcCBpdCBwcm9iYWJseSBpcy4gSWYgaXQncyBub3RcbiAgLy8gdGhlIHNhbWUgcm9vdCwgdGhlbiBpdCdzIG5vdCBhIGh1Z2UgZGVhbCwgd2UganVzdCBtaWdodCBiYXRjaCBtb3JlIHN0dWZmXG4gIC8vIHRvZ2V0aGVyIG1vcmUgdGhhbiBuZWNlc3NhcnkuXG5cblxuICBtb3N0UmVjZW50bHlVcGRhdGVkUm9vdCA9IHJvb3Q7XG59IC8vIFRoaXMgaXMgc3BsaXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXJrIGEgZmliZXIgd2l0aCBwZW5kaW5nXG4vLyB3b3JrIHdpdGhvdXQgdHJlYXRpbmcgaXQgYXMgYSB0eXBpY2FsIHVwZGF0ZSB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBhbiBldmVudDtcbi8vIGUuZy4gcmV0cnlpbmcgYSBTdXNwZW5zZSBib3VuZGFyeSBpc24ndCBhbiB1cGRhdGUsIGJ1dCBpdCBkb2VzIHNjaGVkdWxlIHdvcmtcbi8vIG9uIGEgZmliZXIuXG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgZXhwaXJhdGlvbiB0aW1lLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpOyAvLyBUaGlzIHJldHVybnMgdGhlIHByaW9yaXR5IGxldmVsIGNvbXB1dGVkIGR1cmluZyB0aGUgYGdldE5leHRMYW5lc2AgY2FsbC5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IHJldHVybk5leHRMYW5lc1ByaW9yaXR5KCk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayhleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5KSB7XG4gICAgICAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZSBwcmlvcml0eSBjaGFuZ2VkLiBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ld1xuICAgIC8vIG9uZSBiZWxvdy5cblxuXG4gICAgY2FuY2VsQ2FsbGJhY2soZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmVQcmlvcml0eSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfSBlbHNlIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSkge1xuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgcGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gbGFuZVByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShuZXdDYWxsYmFja1ByaW9yaXR5KTtcbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QpIHtcbiAgLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudEV2ZW50UGVuZGluZ0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGV4cGlyYXRpb24gdGltZSB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcyk7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgIC8vIFRoZSByZW5kZXIgaW5jbHVkZWQgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHdoZW4gdW5oaWRpbmcgYSBoaWRkZW4gdHJlZSwgd2UgaW5jbHVkZSBhbGwgdGhlIGxhbmVzXG4gICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgLy8gbGFuZXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCByZW5kZXJpbmcgd2l0aC5cbiAgICAvL1xuICAgIC8vIFNvIHdlJ2xsIHRocm93IG91dCB0aGUgY3VycmVudCB3b3JrIGFuZCByZXN0YXJ0LlxuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICB9IGVsc2UgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAgIC8vIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuXG4gICAgICBpZiAocm9vdC5oeWRyYXRlKSB7XG4gICAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgfSAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG5cblxuICAgICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluY29tcGxldGU6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcm9vdCBleGl0IHN0YXR1cy5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiICk7XG4gICAgfVxuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXM7XG4gIHZhciBleGl0U3RhdHVzO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiYgaW5jbHVkZXNTb21lTGFuZShyb290LmV4cGlyZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpKSB7XG4gICAgLy8gVGhlcmUncyBhIHBhcnRpYWwgdHJlZSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBpdHMgbGFuZXMgaGFzIGV4cGlyZWQuIEZpbmlzaFxuICAgIC8vIHJlbmRlcmluZyBpdCBiZWZvcmUgcmVuZGVyaW5nIHRoZSByZXN0IG9mIHRoZSBleHBpcmVkIHdvcmsuXG4gICAgbGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gICAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgICAgLy8gVGhlIHJlbmRlciBpbmNsdWRlZCBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHVuaGlkaW5nIGEgaGlkZGVuIHRyZWUsIHdlIGluY2x1ZGUgYWxsIHRoZSBsYW5lc1xuICAgICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgICAvLyBsYW5lcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHJlbmRlcmluZyB3aXRoLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIHBhcnQgb2YgdGhlIHRyZWUgaXMgcmVuZGVyZWRcbiAgICAgIC8vIGNvbmN1cnJlbnRseS4gSWYgdGhlIHdob2xlIHRyZWUgaXMgcmVuZGVyZWQgc3luY2hyb25vdXNseSwgdGhlbiB0aGVyZVxuICAgICAgLy8gYXJlIG5vIGludGVybGVhdmVkIGV2ZW50cy5cbiAgICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gIH1cblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAvLyBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cblxuICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9IC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cblxuXG4gICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmbHVzaERpc2NyZXRlVXBkYXRlcygpIHtcbiAgLy8gVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gZmx1c2ggaW5zaWRlIGJhdGNoZWRVcGRhdGVzLCBidXQgbm90IGluc2lkZSBgYWN0YC5cbiAgLy8gSG93ZXZlciwgYGFjdGAgdXNlcyBgYmF0Y2hlZFVwZGF0ZXNgLCBzbyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaFxuICAvLyB0aG9zZSB0d28gY2FzZXMuIE5lZWQgdG8gZml4IHRoaXMgYmVmb3JlIGV4cG9zaW5nIGZsdXNoRGlzY3JldGVVcGRhdGVzXG4gIC8vIGFzIGEgcHVibGljIEFQSS5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKEJhdGNoZWRDb250ZXh0IHwgUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgICBlcnJvcigndW5zdGFibGVfZmx1c2hEaXNjcmV0ZVVwZGF0ZXM6IENhbm5vdCBmbHVzaCB1cGRhdGVzIHdoZW4gUmVhY3QgaXMgJyArICdhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFdlJ3JlIGFscmVhZHkgcmVuZGVyaW5nLCBzbyB3ZSBjYW4ndCBzeW5jaHJvbm91c2x5IGZsdXNoIHBlbmRpbmcgd29yay5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmVzdGVkIGV2ZW50IGRpc3BhdGNoIHRyaWdnZXJlZCBieSBhIGxpZmVjeWNsZS9lZmZlY3QsXG4gICAgLy8gbGlrZSBgZWwuZm9jdXMoKWAuIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZsdXNoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcygpOyAvLyBJZiB0aGUgZGlzY3JldGUgdXBkYXRlcyBzY2hlZHVsZWQgcGFzc2l2ZSBlZmZlY3RzLCBmbHVzaCB0aGVtIG5vdyBzbyB0aGF0XG4gIC8vIHRoZXkgZmlyZSBiZWZvcmUgdGhlIG5leHQgc2VyaWFsIGV2ZW50LlxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbn1cblxuZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGlzY3JldGVVcGRhdGVzKCkge1xuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIC8vIEZvciBlYWNoIHJvb3Qgd2l0aCBwZW5kaW5nIGRpc2NyZXRlIHVwZGF0ZXMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG9cbiAgICAvLyBpbW1lZGlhdGVseSBmbHVzaCB0aGVtLlxuICAgIHZhciByb290cyA9IHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXM7XG4gICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG51bGw7XG4gICAgcm9vdHMuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIH0pO1xuICB9IC8vIE5vdyBmbHVzaCB0aGUgaW1tZWRpYXRlIHF1ZXVlLlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaFxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZEV2ZW50VXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRXZlbnRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyQxKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRGlzY3JldGVFdmVudENvbnRleHQ7XG5cbiAge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcnVuV2l0aFByaW9yaXR5JDEoVXNlckJsb2NraW5nUHJpb3JpdHkkMiwgZm4uYmluZChudWxsLCBhLCBiLCBjLCBkKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoXG4gICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5iYXRjaGVkVXBkYXRlcyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0ICY9IH5CYXRjaGVkQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBMZWdhY3lVbmJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luYyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gIGlmICgocHJldkV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oYSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShJbW1lZGlhdGVQcmlvcml0eSQxLCBmbi5iaW5kKG51bGwsIGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgICAvLyB0aGUgc3RhY2suXG5cbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluY29tcGxldGU7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAge1xuICAgIHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gcHVzaEludGVyYWN0aW9ucyhyb290KSB7XG4gIHtcbiAgICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zO1xuICAgIHJldHVybiBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEludGVyYWN0aW9ucyhwcmV2SW50ZXJhY3Rpb25zKSB7XG4gIHtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5jb21wbGV0ZSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGUgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdENvbXBsZXRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gICAgc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gcHVzaEludGVyYWN0aW9ucyhyb290KTtcblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgIHN0YXJ0V29ya09uUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHB1c2hJbnRlcmFjdGlvbnMocm9vdCk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcblxuICB7XG4gICAgcG9wSW50ZXJhY3Rpb25zKHByZXZJbnRlcmFjdGlvbnMpO1xuICB9XG5cbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuXG4gICAgcmV0dXJuIFJvb3RJbmNvbXBsZXRlO1xuICB9IGVsc2Uge1xuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNldENoaWxkTGFuZXMoY29tcGxldGVkV29yayk7XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJiAvLyBEbyBub3QgYXBwZW5kIGVmZmVjdHMgdG8gcGFyZW50cyBpZiBhIHNpYmxpbmcgZmFpbGVkIHRvIGNvbXBsZXRlXG4gICAgICAocmV0dXJuRmliZXIuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdvcmsubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmxhc3RFZmZlY3Q7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBmaWJlciBoYWQgc2lkZS1lZmZlY3RzLCB3ZSBhcHBlbmQgaXQgQUZURVIgdGhlIGNoaWxkcmVuJ3NcbiAgICAgICAgLy8gc2lkZS1lZmZlY3RzLiBXZSBjYW4gcGVyZm9ybSBjZXJ0YWluIHNpZGUtZWZmZWN0cyBlYXJsaWVyIGlmIG5lZWRlZCxcbiAgICAgICAgLy8gYnkgZG9pbmcgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGVmZmVjdCBsaXN0LiBXZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIG91ciBvd24gc2lkZS1lZmZlY3Qgb24gb3VyIG93biBsaXN0IGJlY2F1c2UgaWYgZW5kIHVwXG4gICAgICAgIC8vIHJldXNpbmcgY2hpbGRyZW4gd2UnbGwgc2NoZWR1bGUgdGhpcyBlZmZlY3Qgb250byBpdHNlbGYgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gYXQgdGhlIGVuZC5cblxuXG4gICAgICAgIHZhciBmbGFncyA9IGNvbXBsZXRlZFdvcmsuZmxhZ3M7IC8vIFNraXAgYm90aCBOb1dvcmsgYW5kIFBlcmZvcm1lZFdvcmsgdGFncyB3aGVuIGNyZWF0aW5nIHRoZSBlZmZlY3RcbiAgICAgICAgLy8gbGlzdC4gUGVyZm9ybWVkV29yayBlZmZlY3QgaXMgcmVhZCBieSBSZWFjdCBEZXZUb29scyBidXQgc2hvdWxkbid0IGJlXG4gICAgICAgIC8vIGNvbW1pdHRlZC5cblxuICAgICAgICBpZiAoZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBleHBpcmF0aW9uIHRpbWUuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgZWZmZWN0IGxpc3QuXG4gICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDaGlsZExhbmVzKGNvbXBsZXRlZFdvcmspIHtcbiAgaWYgKCAvLyBUT0RPOiBNb3ZlIHRoaXMgY2hlY2sgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBtb3ZpbmcgYHJlc2V0Q2hpbGRMYW5lc2BcbiAgLy8gdG8gc3dpdGNoIHN0YXRlbWVudCBpbiBgY29tcGxldGVXb3JrYC5cbiAgKGNvbXBsZXRlZFdvcmsudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQgfHwgY29tcGxldGVkV29yay50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkgJiYgY29tcGxldGVkV29yay5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmICFpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkgJiYgKGNvbXBsZXRlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvbmVudCBhcmUgaGlkZGVuLiBEb24ndCBidWJibGUgdGhlaXJcbiAgICAvLyBleHBpcmF0aW9uIHRpbWVzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lczsgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG5cbiAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCB8fCBjb21wbGV0ZWRXb3JrLmNoaWxkICE9PSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZDtcbiAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG5cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gY29tcGxldGVkV29yay50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIGNvbXBsZXRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290KSB7XG4gIHZhciByZW5kZXJQcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcbiAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgY29tbWl0Um9vdEltcGwuYmluZChudWxsLCByb290LCByZW5kZXJQcmlvcml0eUxldmVsKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoIShmaW5pc2hlZFdvcmsgIT09IHJvb3QuY3VycmVudCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpOyAvLyBDbGVhciBhbHJlYWR5IGZpbmlzaGVkIGRpc2NyZXRlIHVwZGF0ZXMgaW4gY2FzZSB0aGF0IGEgbGF0ZXIgY2FsbCBvZlxuICAvLyBgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNgIHN0YXJ0cyBhIHVzZWxlc3MgcmVuZGVyIHBhc3Mgd2hpY2ggbWF5IGNhbmNlbHNcbiAgLy8gYSBzY2hlZHVsZWQgdGltZW91dC5cblxuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIGlmICghaGFzRGlzY3JldGVMYW5lcyhyZW1haW5pbmdMYW5lcykgJiYgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcy5oYXMocm9vdCkpIHtcbiAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIEdldCB0aGUgbGlzdCBvZiBlZmZlY3RzLlxuXG5cbiAgdmFyIGZpcnN0RWZmZWN0O1xuXG4gIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmIGl0XG4gICAgLy8gaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCkge1xuXG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMsIG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIGVycm9yKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuXG4gICAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfSAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbXV0YXRpb24gcGhhc2UsIHdoZXJlIHdlIG11dGF0ZSB0aGUgaG9zdCB0cmVlLlxuXG5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRNdXRhdGlvbkVmZmVjdHMsIG51bGwsIHJvb3QsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIF9lcnJvcik7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcbiAgICAvLyB0aGUgaG9zdCB0cmVlIGFmdGVyIGl0J3MgYmVlbiBtdXRhdGVkLiBUaGUgaWRpb21hdGljIHVzZSBjYXNlIGZvciB0aGlzIGlzXG4gICAgLy8gbGF5b3V0LCBidXQgY2xhc3MgY29tcG9uZW50IGxpZmVjeWNsZXMgYWxzbyBmaXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLlxuXG4gICAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAge1xuICAgICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY29tbWl0TGF5b3V0RWZmZWN0cywgbnVsbCwgcm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvcjIgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBfZXJyb3IyKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7XG5cbiAgICBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVGVsbCBTY2hlZHVsZXIgdG8geWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIHNvIHRoZSBicm93c2VyIGhhcyBhblxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG5cbiAgICB7XG4gICAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzUmVuZGVyUHJpb3JpdHkgPSByZW5kZXJQcmlvcml0eUxldmVsO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIGVmZmVjdCBjaGFpbiBhdCB0aGlzIHBvaW50IHNvIGxldCdzIGNsZWFyIHRoZVxuICAgIC8vIG5leHRFZmZlY3QgcG9pbnRlcnMgdG8gYXNzaXN0IHdpdGggR0MuIElmIHdlIGhhdmUgcGFzc2l2ZSBlZmZlY3RzLCB3ZSdsbFxuICAgIC8vIGNsZWFyIHRoaXMgaW4gZmx1c2hQYXNzaXZlRWZmZWN0cy5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHROZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgbmV4dEVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgICAgaWYgKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhuZXh0RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgbmV4dEVmZmVjdCA9IG5leHROZXh0RWZmZWN0O1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSBzcGF3bmVkV29ya0R1cmluZ1JlbmRlcjtcbiAgICAgICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwaXJhdGlvblRpbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgZXhwaXJhdGlvblRpbWVzW2ldLCByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cywgdGhlbiB3ZSBjYW4gY29tcGxldGUgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb25zLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCB3YWl0IHVudGlsIGFmdGVyIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIGZsdXNoZWQuXG4gICAgICAvLyBXYWl0IHRvIGRvIHRoaXMgdW50aWwgYWZ0ZXIgcmVtYWluaW5nIHdvcmsgaGFzIGJlZW4gc2NoZWR1bGVkLFxuICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwcmVtYXR1cmVseSBzaWduYWwgY29tcGxldGUgZm9yIGludGVyYWN0aW9ucyB3aGVuIHRoZXJlJ3MgZS5nLiBoaWRkZW4gd29yay5cbiAgICAgIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjMgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBfZXJyb3IzO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgTGVnYWN5VW5iYXRjaGVkQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIGEgUmVhY3RET00ucmVuZGVyLWVkIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzLiBUaGUgY29tbWl0IGZpcmVkXG4gICAgLy8gc3luY2hyb25vdXNseSwgYnV0IGxheW91dCB1cGRhdGVzIHNob3VsZCBiZSBkZWZlcnJlZCB1bnRpbCB0aGUgZW5kXG4gICAgLy8gb2YgdGhlIGJhdGNoLlxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgJiYgZm9jdXNlZEluc3RhbmNlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgaWYgKGRvZXNGaWJlckNvbnRhaW4obmV4dEVmZmVjdCwgZm9jdXNlZEluc3RhbmNlSGFuZGxlKSkge1xuICAgICAgICAgIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBvdXQgb2YgdGhlIGhvdCBwYXRoIHVzaW5nIGEgZGVkaWNhdGVkIGVmZmVjdCB0YWcuXG4gICAgICAgIGlmIChuZXh0RWZmZWN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgbmV4dEVmZmVjdCkgJiYgZG9lc0ZpYmVyQ29udGFpbihuZXh0RWZmZWN0LCBmb2N1c2VkSW5zdGFuY2VIYW5kbGUpKSB7XG4gICAgICAgICAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVDeWNsZXMoY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBmbHVzaCBhdFxuICAgICAgLy8gdGhlIGVhcmxpZXN0IG9wcG9ydHVuaXR5LlxuICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBUT0RPOiBTaG91bGQgcHJvYmFibHkgbW92ZSB0aGUgYnVsayBvZiB0aGlzIGZ1bmN0aW9uIHRvIGNvbW1pdFdvcmsuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgIGNvbW1pdFJlc2V0VGV4dENvbnRlbnQobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjb21taXREZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgcGxhY2VtZW50LFxuICAgIC8vIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMuIFRvIGF2b2lkIG5lZWRpbmcgdG8gYWRkIGEgY2FzZSBmb3IgZXZlcnkgcG9zc2libGVcbiAgICAvLyBiaXRtYXAgdmFsdWUsIHdlIHJlbW92ZSB0aGUgc2Vjb25kYXJ5IGVmZmVjdHMgZnJvbSB0aGUgZWZmZWN0IHRhZyBhbmRcbiAgICAvLyBzd2l0Y2ggb24gdGhhdCB2YWx1ZS5cblxuXG4gICAgdmFyIHByaW1hcnlGbGFncyA9IGZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uIHwgSHlkcmF0aW5nKTtcblxuICAgIHN3aXRjaCAocHJpbWFyeUZsYWdzKSB7XG4gICAgICBjYXNlIFBsYWNlbWVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFBsYWNlbWVudChuZXh0RWZmZWN0KTsgLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgICAgICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgICAgICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG4gICAgICAgICAgbmV4dEVmZmVjdC5mbGFncyAmPSB+UGxhY2VtZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpOyAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgICAgICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG5cbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5QbGFjZW1lbnQ7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmc6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmdBbmRVcGRhdGU6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFVwZGF0ZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfY3VycmVudDMgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgICAgICBjb21taXRXb3JrKF9jdXJyZW50MywgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKHJvb3QsIG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiAoVXBkYXRlIHwgQ2FsbGJhY2spKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgY29tbWl0TGlmZUN5Y2xlcyhyb290LCBjdXJyZW50LCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKG5leHRFZmZlY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgaWYgKHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ICE9PSBOb1ByaW9yaXR5JDEpIHtcbiAgICB2YXIgcHJpb3JpdHlMZXZlbCA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID4gTm9ybWFsUHJpb3JpdHkkMSA/IE5vcm1hbFByaW9yaXR5JDEgOiBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eTtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eSA9IE5vUHJpb3JpdHkkMTtcblxuICAgIHtcbiAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsLCBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdE1vdW50KGZpYmVyLCBlZmZlY3QpIHtcbiAgcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBzY2hlZHVsZUNhbGxiYWNrKE5vcm1hbFByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0VW5tb3VudChmaWJlciwgZWZmZWN0KSB7XG4gIHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdENyZWF0ZShlZmZlY3QpIHtcbiAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkNhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IEFMTCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0IGRlc3Ryb3kgZnVuY3Rpb25zIGFyZSBjYWxsZWRcbiAgLy8gYmVmb3JlIEFOWSBwYXNzaXZlIGVmZmVjdCBjcmVhdGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuXG4gIC8vIE90aGVyd2lzZSBlZmZlY3RzIGluIHNpYmxpbmcgY29tcG9uZW50cyBtaWdodCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLlxuICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IG1heSB1bmludGVudGlvbmFsbHkgb3ZlcnJpZGUgYSByZWZcbiAgLy8gdmFsdWUgc2V0IGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50LlxuICAvLyBMYXlvdXQgZWZmZWN0cyBoYXZlIHRoZSBzYW1lIGNvbnN0cmFpbnQuXG4gIC8vIEZpcnN0IHBhc3M6IERlc3Ryb3kgc3RhbGUgcGFzc2l2ZSBlZmZlY3RzLlxuXG4gIHZhciB1bm1vdW50RWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudEVmZmVjdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgX2VmZmVjdCA9IHVubW91bnRFZmZlY3RzW2ldO1xuICAgIHZhciBmaWJlciA9IHVubW91bnRFZmZlY3RzW2kgKyAxXTtcbiAgICB2YXIgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveTtcbiAgICBfZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICB7XG4gICAgICBmaWJlci5mbGFncyAmPSB+UGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2O1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuZmxhZ3MgJj0gflBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBpZiAoIShmaWJlciAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTZWNvbmQgcGFzczogQ3JlYXRlIG5ldyBwYXNzaXZlIGVmZmVjdHMuXG5cblxuICB2YXIgbW91bnRFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW91bnRFZmZlY3RzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgIHZhciBfZWZmZWN0MiA9IG1vdW50RWZmZWN0c1tfaV07XG4gICAgdmFyIF9maWJlciA9IG1vdW50RWZmZWN0c1tfaSArIDFdO1xuXG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKF9maWJlcik7XG5cbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGludm9rZVBhc3NpdmVFZmZlY3RDcmVhdGUsIG51bGwsIF9lZmZlY3QyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgaWYgKCEoX2ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBiZSB3b3JraW5nIG9uIGFuIGVmZmVjdC5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZXJyb3I0ID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKF9maWJlciwgX2Vycm9yNCk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuICB9IC8vIE5vdGU6IFRoaXMgY3VycmVudGx5IGFzc3VtZXMgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cyBvbiB0aGUgcm9vdCBmaWJlclxuICAvLyBiZWNhdXNlIHRoZSByb290IGlzIG5vdCBwYXJ0IG9mIGl0cyBvd24gZWZmZWN0IGxpc3QuXG4gIC8vIFRoaXMgY291bGQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cblxuICB2YXIgZWZmZWN0ID0gcm9vdC5jdXJyZW50LmZpcnN0RWZmZWN0O1xuXG4gIHdoaWxlIChlZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dE5leHRFZmZlY3QgPSBlZmZlY3QubmV4dEVmZmVjdDsgLy8gUmVtb3ZlIG5leHRFZmZlY3QgcG9pbnRlciB0byBhc3Npc3QgR0NcblxuICAgIGVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgIGlmIChlZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZWZmZWN0KTtcbiAgICB9XG5cbiAgICBlZmZlY3QgPSBuZXh0TmV4dEVmZmVjdDtcbiAgfVxuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgZmluaXNoUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTsgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuXG4gIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsID8gMCA6IG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCArIDE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChyb290RmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgU3luY0xhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICAgIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBTeW5jTGFuZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQuXG4gICAgICAgICAgLy8gV2UgY2FuJ3Qgc2NoZWR1bGUgYW55IGZvbGxvdyB1cCB3b3JrIGZvciB0aGUgcm9vdCBiZWNhdXNlIHRoZSBmaWJlciBpcyBhbHJlYWR5IHVubW91bnRlZCxcbiAgICAgICAgICAvLyBidXQgd2UgY2FuIHN0aWxsIGNhbGwgdGhlIGxvZy1vbmx5IGJvdW5kYXJ5IHNvIHRoZSBlcnJvciBpc24ndCBzd2FsbG93ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUT0RPIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBiYW5kYWlkIGZvciB0aGUgb2xkIHJlY29uY2lsZXIgZm9yay5cbiAgICAgICAgICAvLyBXZSBjYW4gZGVsZXRlIHRoaXMgc3BlY2lhbCBjYXNlIG9uY2UgdGhlIG5ldyBmb3JrIGlzIG1lcmdlZC5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvclRvSWdub3JlKSB7Ly8gVE9ETyBJZ25vcmUgdGhpcyBlcnJvcj8gUmV0aHJvdyBpdD9cbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGFuIGVkZ2UgY2FzZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHBpbmdlZExhbmVzKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIChCbG9ja2luZ01vZGUgfCBDb25jdXJyZW50TW9kZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBCbG9jaykge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IEJsb2NrKSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIHVubW91bnRzIGZvciB0aGlzIEZpYmVyLFxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGV5IHdvdWxkIGhhdmUgcHJldmVudGVkIHRoaXMgdXBkYXRlLlxuXG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2KSAhPT0gTm9GbGFncykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykgOyBlbHNlIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gVGhpcyBcIiArICdpcyBhIG5vLW9wLCBidXQgaXQgaW5kaWNhdGVzIGEgbWVtb3J5IGxlYWsgaW4geW91ciBhcHBsaWNhdGlvbi4gVG8gJyArICdmaXgsIGNhbmNlbCBhbGwgc3Vic2NyaXB0aW9ucyBhbmQgYXN5bmNocm9ub3VzIHRhc2tzIGluICVzLicsIHRhZyA9PT0gQ2xhc3NDb21wb25lbnQgPyAndGhlIGNvbXBvbmVudFdpbGxVbm1vdW50IG1ldGhvZCcgOiAnYSB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbicpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuIFRyZWF0IGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGFuIGVycm9yLlxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayh1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTsgLy8gYGludm9rZUd1YXJkZWRDYWxsYmFja2Agc29tZXRpbWVzIHNldHMgYW4gZXhwYW5kbyBgX3N1cHByZXNzTG9nZ2luZ2AuXG4gICAgICAgIC8vIFJldGhyb3cgdGhpcyBlcnJvciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuXG5cbiAgICAgICAgdGhyb3cgcmVwbGF5RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGJyYW5jaCBpcyByZWFjaGFibGUgaWYgdGhlIHJlbmRlciBwaGFzZSBpcyBpbXB1cmUuXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIGEgJ3NoYXJlZCcgdmFyaWFibGUgdGhhdCBjaGFuZ2VzIHdoZW4gYWN0KCkgb3BlbnMvY2xvc2VzIGluIHRlc3RzLlxuXG5cbnZhciBJc1RoaXNSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5mdW5jdGlvbiB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpIHtcbiAge1xuICAgIGlmICggSXNTb21lUmVuZGVyZXJBY3RpbmcuY3VycmVudCA9PT0gdHJ1ZSAmJiBJc1RoaXNSZW5kZXJlckFjdGluZy5jdXJyZW50ICE9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgd3JvbmcgYWN0KCkgYXJvdW5kIHlvdXIgdGVzdCBpbnRlcmFjdGlvbnMuXFxuXCIgKyAnQmUgc3VyZSB0byB1c2UgdGhlIG1hdGNoaW5nIHZlcnNpb24gb2YgYWN0KCkgY29ycmVzcG9uZGluZyB0byB5b3VyIHJlbmRlcmVyOlxcblxcbicgKyAnLy8gZm9yIHJlYWN0LWRvbTpcXG4nICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2ltcG9ydCB7YWN0fSBmcicgKyBcIm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XFxuXCIgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTtcXG5cXG4nICsgJy8vIGZvciByZWFjdC10ZXN0LXJlbmRlcmVyOlxcbicgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnaW1wb3J0IFRlc3RSZW5kZXJlciBmcicgKyBcIm9tIHJlYWN0LXRlc3QtcmVuZGVyZXInO1xcblwiICsgJ2NvbnN0IHthY3R9ID0gVGVzdFJlbmRlcmVyO1xcbicgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTsnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdFZmZlY3RzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggKGZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSAhPT0gTm9Nb2RlICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIHJhbiBhbiBlZmZlY3QsIGJ1dCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luRGV2ID0gd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luREVWOyAvLyBJbiB0ZXN0cywgd2Ugd2FudCB0byBlbmZvcmNlIGEgbW9ja2VkIHNjaGVkdWxlci5cblxudmFyIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gZmFsc2U7IC8vIFRPRE8gQmVmb3JlIHdlIHJlbGVhc2UgY29uY3VycmVudCBtb2RlLCByZXZpc2l0IHRoaXMgYW5kIGRlY2lkZSB3aGV0aGVyIGEgbW9ja2VkXG4vLyBzY2hlZHVsZXIgaXMgdGhlIGFjdHVhbCByZWNvbW1lbmRhdGlvbi4gVGhlIGFsdGVybmF0aXZlIGNvdWxkIGJlIGEgdGVzdGluZyBidWlsZCxcbi8vIGEgbmV3IGxpYiwgb3Igd2hhdGV2ZXI7IHdlIGR1bm5vIGp1c3QgeWV0LiBUaGlzIG1lc3NhZ2UgaXMgZm9yIGVhcmx5IGFkb3B0ZXJzXG4vLyB0byBnZXQgdGhlaXIgdGVzdHMgcmlnaHQuXG5cbmZ1bmN0aW9uIHdhcm5JZlVubW9ja2VkU2NoZWR1bGVyKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkFib3V0VW5tb2NrZWRTY2hlZHVsZXIgPT09IGZhbHNlICYmIFNjaGVkdWxlci51bnN0YWJsZV9mbHVzaEFsbFdpdGhvdXRBc3NlcnRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpYmVyLm1vZGUgJiBCbG9ja2luZ01vZGUgfHwgZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignSW4gQ29uY3VycmVudCBvciBTeW5jIG1vZGVzLCB0aGUgXCJzY2hlZHVsZXJcIiBtb2R1bGUgbmVlZHMgdG8gYmUgbW9ja2VkICcgKyAndG8gZ3VhcmFudGVlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyB0ZXN0cyBhbmQgYnJvd3NlcnMuICcgKyAnRm9yIGV4YW1wbGUsIHdpdGggamVzdDogXFxuJyArIC8vIEJyZWFrIHVwIHJlcXVpcmVzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICBcImplc3QubW9jaygnc2NoZWR1bGVyJywgKCkgPT4gcmVxdWlyZVwiICsgXCIoJ3NjaGVkdWxlci91bnN0YWJsZV9tb2NrJykpO1xcblxcblwiICsgJ0ZvciBtb3JlIGluZm8sIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9tb2NrLXNjaGVkdWxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQocm9vdCwgbGFuZSkge1xuICAvLyBJbnRlcmFjdGlvbiB0aHJlYWRzIGFyZSB1bmlxdWUgcGVyIHJvb3QgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAgLy8gTk9URTogSW50ZW50aW9uYWxseSB1bnNvdW5kIGNhc3QuIEFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCBpdCdzIGEgbnVtYmVyXG4gIC8vIGFuZCBpdCByZXByZXNlbnRzIGEgYmF0Y2ggb2Ygd29yay4gQ291bGQgbWFrZSBhIGhlbHBlciBmdW5jdGlvbiBpbnN0ZWFkLFxuICAvLyBidXQgbWVoIHRoaXMgaXMgZmluZSBmb3Igbm93LlxuICByZXR1cm4gbGFuZSAqIDEwMDAgKyByb290LmludGVyYWN0aW9uVGhyZWFkSUQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtTcGF3bmVkV29yayhsYW5lKSB7XG5cbiAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID09PSBudWxsKSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBbbGFuZV07XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIucHVzaChsYW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUludGVyYWN0aW9ucyhyb290LCBsYW5lLCBpbnRlcmFjdGlvbnMpIHtcblxuICBpZiAoaW50ZXJhY3Rpb25zLnNpemUgPiAwKSB7XG4gICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgIHZhciBwZW5kaW5nSW50ZXJhY3Rpb25zID0gcGVuZGluZ0ludGVyYWN0aW9uTWFwLmdldChsYW5lKTtcblxuICAgIGlmIChwZW5kaW5nSW50ZXJhY3Rpb25zICE9IG51bGwpIHtcbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciBwcmV2aW91c2x5IHVuc2NoZWR1bGVkIGludGVyYWN0aW9uLlxuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuc2V0KGxhbmUsIG5ldyBTZXQoaW50ZXJhY3Rpb25zKSk7IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG5cbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmUpO1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lKSB7XG5cbiAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSwgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKSB7XG4gIC8vIHdlIGNhbiBhY2N1cmF0ZWx5IGF0dHJpYnV0ZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gaXQsIEFuZCBzbyB0aGF0IGNhc2NhZGluZ1xuICAvLyB3b3JrIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gIHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgc2NoZWR1bGVkTGFuZSkge1xuICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBzY2hlZHVsZWRMYW5lKSkge1xuICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHNldCBvZiBpbnRlcmFjdGlvbnMgb24gdGhlIEZpYmVyUm9vdCBmb3IgYSBmZXcgcmVhc29uczpcbiAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KClcbiAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVjYWxjdWxhdGUgaXQuIFdlIHdpbGwgYWxzbyB1c2UgaXQgaW4gY29tbWl0V29yaygpIHRvXG4gIC8vIHBhc3MgdG8gYW55IFByb2ZpbGVyIG9uUmVuZGVyKCkgaG9va3MuIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGFcbiAgLy8gd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cblxuICByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25zO1xuXG4gIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgdGhlIHN1YnNjcmliZXIgdGhyb3dzLCByZXRocm93IGl0IGluIGEgc2VwYXJhdGUgdGFza1xuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuICB2YXIgcmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3Vic2NyaWJlcjtcblxuICB0cnkge1xuICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgLy8gRklYTUU6IE1vcmUgdGhhbiBvbmUgbGFuZSBjYW4gZmluaXNoIGluIGEgc2luZ2xlIGNvbW1pdC5cbiAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChyb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQocm9vdC5tZW1vaXplZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgIC8vIFVubGVzcyB0aGUgcmVuZGVyIHdhcyBzdXNwZW5kZWQgb3IgY2FzY2FkaW5nIHdvcmsgd2FzIHNjaGVkdWxlZCxcbiAgICAvLyBJbiB3aGljaCBjYXNl4oCTIGxlYXZlIHBlbmRpbmcgaW50ZXJhY3Rpb25zIHVudGlsIHRoZSBzdWJzZXF1ZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgbGFuZSkge1xuICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb24gY291bnQgaWYgd2UncmUgZG9uZS5cbiAgICAgIC8vIElmIHRoZXJlJ3Mgc3RpbGwgd29yayBhdCB0aGUgY3VycmVudCBwcmlvcml0eSxcbiAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCwgbGFuZSkpIHtcbiAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShsYW5lKTtcbiAgICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIGBhY3RgIHRlc3RpbmcgQVBJXG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBhY3RpbmdVcGRhdGVzU2NvcGVEZXB0aCA+IDA7XG59XG4vLyBzbyB3ZSBjYW4gdGVsbCBpZiBhbnkgYXN5bmMgYWN0KCkgY2FsbHMgdHJ5IHRvIHJ1biBpbiBwYXJhbGxlbC5cblxuXG52YXIgYWN0aW5nVXBkYXRlc1Njb3BlRGVwdGggPSAwO1xuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICBmaWJlci5zaWJsaW5nID0gbnVsbDtcbiAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbn1cblxudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgZGVidWdDb3VudGVyID0gMTtcblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMubmV4dEVmZmVjdCA9IG51bGw7XG4gIHRoaXMuZmlyc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnSUQgPSBkZWJ1Z0NvdW50ZXIrKztcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEID0gY3VycmVudC5fZGVidWdJRDtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHdvcmtJblByb2dyZXNzLm5leHRFZmZlY3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZykge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZSB8IEJsb2NraW5nTW9kZSB8IFN0cmljdE1vZGU7XG4gIH0gZWxzZSBpZiAodGFnID09PSBCbG9ja2luZ1Jvb3QpIHtcbiAgICBtb2RlID0gQmxvY2tpbmdNb2RlIHwgU3RyaWN0TW9kZTtcbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IERlYnVnVHJhY2luZ01vZGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RNb2RlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUxlZ2FjeUhpZGRlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvciggXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgYXMgYSBwcm9wJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpOyAvLyBUT0RPOiBUaGUgUHJvZmlsZXIgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGluIGdldENvbXBvbmVudE5hbWUgc28gdGhhdCBpdCByZWxpZXMgb24gdGhlIHRhZ1xuICAvLyBpbnN0ZWFkLlxuXG4gIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAge1xuICAgIC8vIFRPRE86IFRoZSBTdXNwZW5zZUxpc3RDb21wb25lbnQgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG4gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgICAvLyBpbnN0ZWFkLlxuICAgIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIH1cblxuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIE9mZnNjcmVlbkNvbXBvbmVudCBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICB9XG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tTGVnYWN5SGlkZGVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihMZWdhY3lIaWRkZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIExlZ2FjeUhpZGRlbiBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTtcbiAgfVxuXG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7IC8vIFRPRE86IFRoZXNlIHNob3VsZCBub3QgbmVlZCBhIHR5cGUuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0Lm5leHRFZmZlY3QgPSBzb3VyY2UubmV4dEVmZmVjdDtcbiAgdGFyZ2V0LmZpcnN0RWZmZWN0ID0gc291cmNlLmZpcnN0RWZmZWN0O1xuICB0YXJnZXQubGFzdEVmZmVjdCA9IHNvdXJjZS5sYXN0RWZmZWN0O1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z0lEID0gc291cmNlLl9kZWJ1Z0lEO1xuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmludGVyYWN0aW9uVGhyZWFkSUQgPSB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCk7XG4gICAgdGhpcy5tZW1vaXplZEludGVyYWN0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBCbG9ja2luZ1Jvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSAnY3JlYXRlQmxvY2tpbmdSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gJ2NyZWF0ZUxlZ2FjeVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBoeWRyYXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIE9iamVjdC5rZXlzKGNvbXBvbmVudCkgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGh5ZHJhdGlvbkNhbGxiYWNrcykge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmVW5tb2NrZWRTY2hlZHVsZXIoY3VycmVudCQxKTtcbiAgICAgIHdhcm5JZk5vdFNjb3BlZFdpdGhNYXRjaGluZ0FjdChjdXJyZW50JDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWUoY3VycmVudC50eXBlKSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5uYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmU7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQyKHByaW9yaXR5LCBmbikge1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChob3N0RmliZXIudGFnID09PSBGdW5kYW1lbnRhbENvbXBvbmVudCkge1xuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlLmluc3RhbmNlO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gX2Fzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IF9hc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBfYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gY3JlYXRlUm9vdEltcGwoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NQmxvY2tpbmdSb290KGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKTtcbn1cblxuUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTUJsb2NraW5nUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01CbG9ja2luZ1Jvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgZnVuY3Rpb24gKCkge1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIC8vIFRhZyBpcyBlaXRoZXIgTGVnYWN5Um9vdCBvciBDb25jdXJyZW50IFJvb3RcbiAgdmFyIGh5ZHJhdGUgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlID09PSB0cnVlO1xuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0aW9uT3B0aW9ucyB8fCBudWxsO1xuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzIHx8IG51bGw7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgdGFnLCBoeWRyYXRlKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lci5ub2RlVHlwZTtcblxuICB7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTUJsb2NraW5nUm9vdChjb250YWluZXIsIExlZ2FjeVJvb3QsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWxlbWVudCAmJiByb290RWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKSB7XG4gIHZhciBzaG91bGRIeWRyYXRlID0gZm9yY2VIeWRyYXRlIHx8IHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpOyAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cblxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAge1xuICAgICAgICBpZiAoIXdhcm5lZCAmJiByb290U2libGluZy5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RTaWJsaW5nLmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSkge1xuICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcigncmVuZGVyKCk6IFRhcmdldCBub2RlIGhhcyBtYXJrdXAgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCB0aGVyZSAnICsgJ2FyZSB1bnJlbGF0ZWQgbm9kZXMgYXMgd2VsbC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGNhdXNlZCBieSAnICsgJ3doaXRlLXNwYWNlIGluc2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcblxuICAgICAgd2FybigncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE4LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIHNob3VsZEh5ZHJhdGUgPyB7XG4gICAgaHlkcmF0ZTogdHJ1ZVxuICB9IDogdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH0gLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cblxuXG4gIHZhciByb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciBmaWJlclJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBmaWJlclJvb3QgPSByb290Ll9pbnRlcm5hbFJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCBmaWJlclJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpYmVyUm9vdCA9IHJvb3QuX2ludGVybmFsUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgZmliZXJSb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2UoZmliZXJSb290KTtcbn1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgY3JlYXRlUm9vdChjb250YWluZXIsIHtoeWRyYXRlOiB0cnVlfSkucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyTm9kZSkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgaGFzKHBhcmVudENvbXBvbmVudCkpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwicGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnRcIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0VXNlckJsb2NraW5nSHlkcmF0aW9uKGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkkMik7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzJDEsIGZsdXNoRGlzY3JldGVVcGRhdGVzLCBiYXRjaGVkRXZlbnRVcGRhdGVzJDEpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuXG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCkge1xuICAgICAgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdUaGUgUmVhY3RET00udW5zdGFibGVfY3JlYXRlUG9ydGFsKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdERPTS5jcmVhdGVQb3J0YWwoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLCAnICsgJ2J1dCB3aXRob3V0IHRoZSBcInVuc3RhYmxlX1wiIHByZWZpeC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwga2V5KTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMsIGFuZCBSZWFjdFRlc3RVdGlsc0FjdC5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGZsdXNoUGFzc2l2ZUVmZmVjdHMsIC8vIFRPRE86IFRoaXMgaXMgcmVsYXRlZCB0byBgYWN0YCwgbm90IGV2ZW50cy4gTW92ZSB0byBzZXBhcmF0ZSBrZXk/XG4gIElzVGhpc1JlbmRlcmVyQWN0aW5nXVxufTtcbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWwgPSB1bnN0YWJsZV9jcmVhdGVQb3J0YWw7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gIC8vIENhbGwgdGhpcy5jb25zdHJ1Y3Rvci5nRFNGUCB0byBzdXBwb3J0IHN1Yi1jbGFzc2VzLlxuICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgaWYgKHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAvLyBDYWxsIHRoaXMuY29uc3RydWN0b3IuZ0RTRlAgdG8gc3VwcG9ydCBzdWItY2xhc3Nlcy5cbiAgLy8gVXNlIHRoZSBzZXRTdGF0ZSgpIHVwZGF0ZXIgdG8gZW5zdXJlIHN0YXRlIGlzbid0IHN0YWxlIGluIGNlcnRhaW4gZWRnZSBjYXNlcy5cbiAgZnVuY3Rpb24gdXBkYXRlcihwcmV2U3RhdGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZSA6IG51bGw7XG4gIH1cbiAgLy8gQmluZGluZyBcInRoaXNcIiBpcyBpbXBvcnRhbnQgZm9yIHNoYWxsb3cgcmVuZGVyZXIgc3VwcG9ydC5cbiAgdGhpcy5zZXRTdGF0ZSh1cGRhdGVyLmJpbmQodGhpcykpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gIHRyeSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHByZXZTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgdGhpcy5wcm9wcyA9IG5leHRQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgIHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnID0gdHJ1ZTtcbiAgICB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90ID0gdGhpcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5wcm9wcyA9IHByZXZQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gcHJldlN0YXRlO1xuICB9XG59XG5cbi8vIFJlYWN0IG1heSB3YXJuIGFib3V0IGNXTS9jV1JQL2NXVSBtZXRob2RzIGJlaW5nIGRlcHJlY2F0ZWQuXG4vLyBBZGQgYSBmbGFnIHRvIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGZvciB0aGlzIHNwZWNpYWwgY2FzZS5cbmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcbmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuXG5mdW5jdGlvbiBwb2x5ZmlsbChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgaWYgKCFwcm90b3R5cGUgfHwgIXByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBwb2x5ZmlsbCBjbGFzcyBjb21wb25lbnRzJyk7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH1cblxuICAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gIC8vIEVycm9yIGlmIGFueSBvZiB0aGVzZSBsaWZlY3ljbGVzIGFyZSBwcmVzZW50LFxuICAvLyBCZWNhdXNlIHRoZXkgd291bGQgd29yayBkaWZmZXJlbnRseSBiZXR3ZWVuIG9sZGVyIGFuZCBuZXdlciAoMTYuMyspIHZlcnNpb25zIG9mIFJlYWN0LlxuICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgfVxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICB9XG4gIGlmIChcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHxcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbFxuICApIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZTtcbiAgICB2YXIgbmV3QXBpTmFtZSA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSdcbiAgICAgICAgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICtcbiAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICcgdXNlcyAnICtcbiAgICAgICAgbmV3QXBpTmFtZSArXG4gICAgICAgICcgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczonICtcbiAgICAgICAgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJykgK1xuICAgICAgICAoZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbFxuICAgICAgICAgID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWVcbiAgICAgICAgICA6ICcnKSArXG4gICAgICAgIChmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJykgK1xuICAgICAgICAnXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArXG4gICAgICAgICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IDw9IDE2LjIgZG9lcyBub3Qgc3VwcG9ydCBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV00gYW5kIGNXUlAgdG8gaW52b2tlIHRoZSBuZXcgc3RhdGljIGxpZmVjeWNsZS5cbiAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgUmVhY3Qgd2lsbCBpZ25vcmUgdGhlc2UgbGlmZWN5Y2xlcyBpZiBnRFNGUCBleGlzdHMuXG4gIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBjb21wb25lbnRXaWxsTW91bnQ7XG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuICB9XG5cbiAgLy8gUmVhY3QgPD0gMTYuMiBkb2VzIG5vdCBzdXBwb3J0IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV1UgdG8gaW52b2tlIHRoZSBuZXcgbGlmZWN5Y2xlLlxuICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBSZWFjdCB3aWxsIGlnbm9yZSB0aGF0IGxpZmVjeWNsZSBpZiBnU0JVIGV4aXN0cy5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwb2x5ZmlsbCBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGZvciBjb21wb25lbnRzIHRoYXQgZG8gbm90IGRlZmluZSBjb21wb25lbnREaWRVcGRhdGUoKSBvbiB0aGUgcHJvdG90eXBlJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGNvbXBvbmVudFdpbGxVcGRhdGU7XG5cbiAgICB2YXIgY29tcG9uZW50RGlkVXBkYXRlID0gcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZTtcblxuICAgIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGVQb2x5ZmlsbChcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZSxcbiAgICAgIG1heWJlU25hcHNob3RcbiAgICApIHtcbiAgICAgIC8vIDE2LjMrIHdpbGwgbm90IGV4ZWN1dGUgb3VyIHdpbGwtdXBkYXRlIG1ldGhvZDtcbiAgICAgIC8vIEl0IHdpbGwgcGFzcyBhIHNuYXBzaG90IHZhbHVlIHRvIGRpZC11cGRhdGUgdGhvdWdoLlxuICAgICAgLy8gT2xkZXIgdmVyc2lvbnMgd2lsbCByZXF1aXJlIG91ciBwb2x5ZmlsbGVkIHdpbGwtdXBkYXRlIHZhbHVlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgYm90aCBjYXNlcywgYnV0IGNhbid0IGp1c3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBcIm1heWJlU25hcHNob3RcIixcbiAgICAgIC8vIEJlY2F1c2UgZm9yIDw9IDE1LnggdmVyc2lvbnMgdGhpcyBtaWdodCBiZSBhIFwicHJldkNvbnRleHRcIiBvYmplY3QuXG4gICAgICAvLyBXZSBhbHNvIGNhbid0IGp1c3QgY2hlY2sgXCJfX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFwiLFxuICAgICAgLy8gQmVjYXVzZSBnZXQtc25hcHNob3QgbWlnaHQgcmV0dXJuIGEgZmFsc3kgdmFsdWUuXG4gICAgICAvLyBTbyBjaGVjayBmb3IgdGhlIGV4cGxpY2l0IF9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZyBmbGFnIHRvIGRldGVybWluZSBiZWhhdmlvci5cbiAgICAgIHZhciBzbmFwc2hvdCA9IHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnXG4gICAgICAgID8gdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFxuICAgICAgICA6IG1heWJlU25hcHNob3Q7XG5cbiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZS5jYWxsKHRoaXMsIHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB7IHBvbHlmaWxsIH07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFJlZHV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZWR1eENvbnRleHQ7IiwiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcblxuZnVuY3Rpb24gUHJvdmlkZXIoX3JlZikge1xuICB2YXIgc3RvcmUgPSBfcmVmLnN0b3JlLFxuICAgICAgY29udGV4dCA9IF9yZWYuY29udGV4dCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUpO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uXG4gICAgfTtcbiAgfSwgW3N0b3JlXSk7XG4gIHZhciBwcmV2aW91c1N0YXRlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCk7XG4gIH0sIFtzdG9yZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbjtcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG5cbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgcHJldmlvdXNTdGF0ZV0pO1xuICB2YXIgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFByb3ZpZGVyLnByb3BUeXBlcyA9IHtcbiAgICBzdG9yZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHN1YnNjcmliZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZ2V0U3RhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9KSxcbiAgICBjb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0RGlzcGxheU5hbWVcIiwgXCJtZXRob2ROYW1lXCIsIFwicmVuZGVyQ291bnRQcm9wXCIsIFwic2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzXCIsIFwic3RvcmVLZXlcIiwgXCJ3aXRoUmVmXCIsIFwiZm9yd2FyZFJlZlwiLCBcImNvbnRleHRcIl0sXG4gICAgX2V4Y2x1ZGVkMiA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5pbXBvcnQgaG9pc3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudFR5cGUsIGlzQ29udGV4dENvbnN1bWVyIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JzsgLy8gRGVmaW5lIHNvbWUgY29uc3RhbnQgYXJyYXlzIGp1c3QgdG8gYXZvaWQgcmUtY3JlYXRpbmcgdGhlc2VcblxudmFyIEVNUFRZX0FSUkFZID0gW107XG52YXIgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdO1xuXG52YXIgc3RyaW5naWZ5Q29tcG9uZW50ID0gZnVuY3Rpb24gc3RyaW5naWZ5Q29tcG9uZW50KENvbXApIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQ29tcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBTdHJpbmcoQ29tcCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHN0b3JlU3RhdGVVcGRhdGVzUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIHZhciB1cGRhdGVDb3VudCA9IHN0YXRlWzFdO1xuICByZXR1cm4gW2FjdGlvbi5wYXlsb2FkLCB1cGRhdGVDb3VudCArIDFdO1xufVxuXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBlZmZlY3RGdW5jLmFwcGx5KHZvaWQgMCwgZWZmZWN0QXJncyk7XG4gIH0sIGRlcGVuZGVuY2llcyk7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGFjdHVhbENoaWxkUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgLy8gV2Ugd2FudCB0byBjYXB0dXJlIHRoZSB3cmFwcGVyIHByb3BzIGFuZCBjaGlsZCBwcm9wcyB3ZSB1c2VkIGZvciBsYXRlciBjb21wYXJpc29uc1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBhY3R1YWxDaGlsZFByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoKSB7XG4gIC8vIElmIHdlJ3JlIG5vdCBzdWJzY3JpYmVkIHRvIHRoZSBzdG9yZSwgbm90aGluZyB0byBkbyBoZXJlXG4gIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47IC8vIENhcHR1cmUgdmFsdWVzIGZvciBjaGVja2luZyBpZiBhbmQgd2hlbiB0aGlzIGNvbXBvbmVudCB1bm1vdW50c1xuXG4gIHZhciBkaWRVbnN1YnNjcmliZSA9IGZhbHNlO1xuICB2YXIgbGFzdFRocm93bkVycm9yID0gbnVsbDsgLy8gV2UnbGwgcnVuIHRoaXMgY2FsbGJhY2sgZXZlcnkgdGltZSBhIHN0b3JlIHN1YnNjcmlwdGlvbiB1cGRhdGUgcHJvcGFnYXRlcyB0byB0aGlzIGNvbXBvbmVudFxuXG4gIHZhciBjaGVja0ZvclVwZGF0ZXMgPSBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBEb24ndCBydW4gc3RhbGUgbGlzdGVuZXJzLlxuICAgICAgLy8gUmVkdXggZG9lc24ndCBndWFyYW50ZWUgdW5zdWJzY3JpcHRpb25zIGhhcHBlbiB1bnRpbCBuZXh0IGRpc3BhdGNoLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICB2YXIgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBfZGlkXyBjaGFuZ2UgKG9yIHdlIGNhdWdodCBhbiBlcnJvciksIHRoaXMgd3JhcHBlciBjb21wb25lbnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cbiAgICAgIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnU1RPUkVfVVBEQVRFRCcsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9OyAvLyBBY3R1YWxseSBzdWJzY3JpYmUgdG8gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yIChvciBzdG9yZSlcblxuXG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7IC8vIFB1bGwgZGF0YSBmcm9tIHRoZSBzdG9yZSBhZnRlciBmaXJzdCByZW5kZXIgaW4gY2FzZSB0aGUgc3RvcmUgaGFzXG4gIC8vIGNoYW5nZWQgc2luY2Ugd2UgYmVnYW4uXG5cbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG5cbiAgdmFyIHVuc3Vic2NyaWJlV3JhcHBlciA9IGZ1bmN0aW9uIHVuc3Vic2NyaWJlV3JhcHBlcigpIHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufVxuXG52YXIgaW5pdFN0YXRlVXBkYXRlcyA9IGZ1bmN0aW9uIGluaXRTdGF0ZVVwZGF0ZXMoKSB7XG4gIHJldHVybiBbbnVsbCwgMF07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25uZWN0QWR2YW5jZWQoXG4vKlxuICBzZWxlY3RvckZhY3RvcnkgaXMgYSBmdW5jIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gdXNlZCB0b1xuICBjb21wdXRlIG5ldyBwcm9wcyBmcm9tIHN0YXRlLCBwcm9wcywgYW5kIGRpc3BhdGNoLiBGb3IgZXhhbXBsZTpcbiAgICAgZXhwb3J0IGRlZmF1bHQgY29ubmVjdEFkdmFuY2VkKChkaXNwYXRjaCwgb3B0aW9ucykgPT4gKHN0YXRlLCBwcm9wcykgPT4gKHtcbiAgICAgIHRoaW5nOiBzdGF0ZS50aGluZ3NbcHJvcHMudGhpbmdJZF0sXG4gICAgICBzYXZlVGhpbmc6IGZpZWxkcyA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9ycy5zYXZlVGhpbmcocHJvcHMudGhpbmdJZCwgZmllbGRzKSksXG4gICAgfSkpKFlvdXJDb21wb25lbnQpXG4gICBBY2Nlc3MgdG8gZGlzcGF0Y2ggaXMgcHJvdmlkZWQgdG8gdGhlIGZhY3Rvcnkgc28gc2VsZWN0b3JGYWN0b3JpZXMgY2FuIGJpbmQgYWN0aW9uQ3JlYXRvcnNcbiAgb3V0c2lkZSBvZiB0aGVpciBzZWxlY3RvciBhcyBhbiBvcHRpbWl6YXRpb24uIE9wdGlvbnMgcGFzc2VkIHRvIGNvbm5lY3RBZHZhbmNlZCBhcmUgcGFzc2VkIHRvXG4gIHRoZSBzZWxlY3RvckZhY3RvcnksIGFsb25nIHdpdGggZGlzcGxheU5hbWUgYW5kIFdyYXBwZWRDb21wb25lbnQsIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICBOb3RlIHRoYXQgc2VsZWN0b3JGYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgY2FjaGluZy9tZW1vaXphdGlvbiBvZiBpbmJvdW5kIGFuZCBvdXRib3VuZFxuICBwcm9wcy4gRG8gbm90IHVzZSBjb25uZWN0QWR2YW5jZWQgZGlyZWN0bHkgd2l0aG91dCBtZW1vaXppbmcgcmVzdWx0cyBiZXR3ZWVuIGNhbGxzIHRvIHlvdXJcbiAgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUgQ29ubmVjdCBjb21wb25lbnQgd2lsbCByZS1yZW5kZXIgb24gZXZlcnkgc3RhdGUgb3IgcHJvcHMgY2hhbmdlLlxuKi9cbnNlbGVjdG9yRmFjdG9yeSwgLy8gb3B0aW9ucyBvYmplY3Q6XG5fcmVmKSB7XG4gIGlmIChfcmVmID09PSB2b2lkIDApIHtcbiAgICBfcmVmID0ge307XG4gIH1cblxuICB2YXIgX3JlZjIgPSBfcmVmLFxuICAgICAgX3JlZjIkZ2V0RGlzcGxheU5hbWUgPSBfcmVmMi5nZXREaXNwbGF5TmFtZSxcbiAgICAgIGdldERpc3BsYXlOYW1lID0gX3JlZjIkZ2V0RGlzcGxheU5hbWUgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiQ29ubmVjdEFkdmFuY2VkKFwiICsgbmFtZSArIFwiKVwiO1xuICB9IDogX3JlZjIkZ2V0RGlzcGxheU5hbWUsXG4gICAgICBfcmVmMiRtZXRob2ROYW1lID0gX3JlZjIubWV0aG9kTmFtZSxcbiAgICAgIG1ldGhvZE5hbWUgPSBfcmVmMiRtZXRob2ROYW1lID09PSB2b2lkIDAgPyAnY29ubmVjdEFkdmFuY2VkJyA6IF9yZWYyJG1ldGhvZE5hbWUsXG4gICAgICBfcmVmMiRyZW5kZXJDb3VudFByb3AgPSBfcmVmMi5yZW5kZXJDb3VudFByb3AsXG4gICAgICByZW5kZXJDb3VudFByb3AgPSBfcmVmMiRyZW5kZXJDb3VudFByb3AgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYyJHJlbmRlckNvdW50UHJvcCxcbiAgICAgIF9yZWYyJHNob3VsZEhhbmRsZVN0YSA9IF9yZWYyLnNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IF9yZWYyJHNob3VsZEhhbmRsZVN0YSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYyJHNob3VsZEhhbmRsZVN0YSxcbiAgICAgIF9yZWYyJHN0b3JlS2V5ID0gX3JlZjIuc3RvcmVLZXksXG4gICAgICBzdG9yZUtleSA9IF9yZWYyJHN0b3JlS2V5ID09PSB2b2lkIDAgPyAnc3RvcmUnIDogX3JlZjIkc3RvcmVLZXksXG4gICAgICBfcmVmMiR3aXRoUmVmID0gX3JlZjIud2l0aFJlZixcbiAgICAgIHdpdGhSZWYgPSBfcmVmMiR3aXRoUmVmID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHdpdGhSZWYsXG4gICAgICBfcmVmMiRmb3J3YXJkUmVmID0gX3JlZjIuZm9yd2FyZFJlZixcbiAgICAgIGZvcndhcmRSZWYgPSBfcmVmMiRmb3J3YXJkUmVmID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGZvcndhcmRSZWYsXG4gICAgICBfcmVmMiRjb250ZXh0ID0gX3JlZjIuY29udGV4dCxcbiAgICAgIGNvbnRleHQgPSBfcmVmMiRjb250ZXh0ID09PSB2b2lkIDAgPyBSZWFjdFJlZHV4Q29udGV4dCA6IF9yZWYyJGNvbnRleHQsXG4gICAgICBjb25uZWN0T3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHJlbmRlckNvdW50UHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZW5kZXJDb3VudFByb3AgaXMgcmVtb3ZlZC4gcmVuZGVyIGNvdW50aW5nIGlzIGJ1aWx0IGludG8gdGhlIGxhdGVzdCBSZWFjdCBEZXYgVG9vbHMgcHJvZmlsaW5nIGV4dGVuc2lvblwiKTtcbiAgICB9XG5cbiAgICBpZiAod2l0aFJlZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aXRoUmVmIGlzIHJlbW92ZWQuIFRvIGFjY2VzcyB0aGUgd3JhcHBlZCBpbnN0YW5jZSwgdXNlIGEgcmVmIG9uIHRoZSBjb25uZWN0ZWQgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgdmFyIGN1c3RvbVN0b3JlV2FybmluZ01lc3NhZ2UgPSAnVG8gdXNlIGEgY3VzdG9tIFJlZHV4IHN0b3JlIGZvciBzcGVjaWZpYyBjb21wb25lbnRzLCBjcmVhdGUgYSBjdXN0b20gUmVhY3QgY29udGV4dCB3aXRoICcgKyBcIlJlYWN0LmNyZWF0ZUNvbnRleHQoKSwgYW5kIHBhc3MgdGhlIGNvbnRleHQgb2JqZWN0IHRvIFJlYWN0IFJlZHV4J3MgUHJvdmlkZXIgYW5kIHNwZWNpZmljIGNvbXBvbmVudHNcIiArICcgbGlrZTogPFByb3ZpZGVyIGNvbnRleHQ9e015Q29udGV4dH0+PENvbm5lY3RlZENvbXBvbmVudCBjb250ZXh0PXtNeUNvbnRleHR9IC8+PC9Qcm92aWRlcj4uICcgKyAnWW91IG1heSBhbHNvIHBhc3MgYSB7Y29udGV4dCA6IE15Q29udGV4dH0gb3B0aW9uIHRvIGNvbm5lY3QnO1xuXG4gICAgaWYgKHN0b3JlS2V5ICE9PSAnc3RvcmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0b3JlS2V5IGhhcyBiZWVuIHJlbW92ZWQgYW5kIGRvZXMgbm90IGRvIGFueXRoaW5nLiAnICsgY3VzdG9tU3RvcmVXYXJuaW5nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIENvbnRleHQgPSBjb250ZXh0O1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcFdpdGhDb25uZWN0KFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgY29tcG9uZW50IHRvIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBcIiArIChtZXRob2ROYW1lICsgXCIuIEluc3RlYWQgcmVjZWl2ZWQgXCIgKyBzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCkpKTtcbiAgICB9XG5cbiAgICB2YXIgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZSh3cmFwcGVkQ29tcG9uZW50TmFtZSk7XG5cbiAgICB2YXIgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IF9leHRlbmRzKHt9LCBjb25uZWN0T3B0aW9ucywge1xuICAgICAgZ2V0RGlzcGxheU5hbWU6IGdldERpc3BsYXlOYW1lLFxuICAgICAgbWV0aG9kTmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlbmRlckNvdW50UHJvcDogcmVuZGVyQ291bnRQcm9wLFxuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBzdG9yZUtleTogc3RvcmVLZXksXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZTogd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50OiBXcmFwcGVkQ29tcG9uZW50XG4gICAgfSk7XG5cbiAgICB2YXIgcHVyZSA9IGNvbm5lY3RPcHRpb25zLnB1cmU7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVDaGlsZFNlbGVjdG9yKHN0b3JlKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JGYWN0b3J5KHN0b3JlLmRpc3BhdGNoLCBzZWxlY3RvckZhY3RvcnlPcHRpb25zKTtcbiAgICB9IC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGluIFwicHVyZVwiIG1vZGUsIHdlIGRvbid0IHdhbnQgdG8gbWVtb2l6ZSB2YWx1ZXMuXG4gICAgLy8gVG8gYXZvaWQgY29uZGl0aW9uYWxseSBjYWxsaW5nIGhvb2tzLCB3ZSBmYWxsIGJhY2sgdG8gYSB0aW55IHdyYXBwZXJcbiAgICAvLyB0aGF0IGp1c3QgZXhlY3V0ZXMgdGhlIGdpdmVuIGNhbGxiYWNrIGltbWVkaWF0ZWx5LlxuXG5cbiAgICB2YXIgdXNlUHVyZU9ubHlNZW1vID0gcHVyZSA/IHVzZU1lbW8gOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgIHZhciBfdXNlTWVtbyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFjdHVhbCBcImRhdGFcIiBwcm9wcyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVyIGNvbXBvbmVudCxcbiAgICAgICAgLy8gYW5kIHZhbHVlcyBuZWVkZWQgdG8gY29udHJvbCBiZWhhdmlvciAoZm9yd2FyZGVkIHJlZnMsIGFsdGVybmF0ZSBjb250ZXh0IGluc3RhbmNlcykuXG4gICAgICAgIC8vIFRvIG1haW50YWluIHRoZSB3cmFwcGVyUHJvcHMgb2JqZWN0IHJlZmVyZW5jZSwgbWVtb2l6ZSB0aGlzIGRlc3RydWN0dXJpbmcuXG4gICAgICAgIHZhciByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmID0gcHJvcHMucmVhY3RSZWR1eEZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIHdyYXBwZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBfZXhjbHVkZWQyKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKSxcbiAgICAgICAgICBwcm9wc0NvbnRleHQgPSBfdXNlTWVtb1swXSxcbiAgICAgICAgICByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmID0gX3VzZU1lbW9bMV0sXG4gICAgICAgICAgd3JhcHBlclByb3BzID0gX3VzZU1lbW9bMl07XG5cbiAgICAgIHZhciBDb250ZXh0VG9Vc2UgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVXNlcnMgbWF5IG9wdGlvbmFsbHkgcGFzcyBpbiBhIGN1c3RvbSBjb250ZXh0IGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIG91ciBSZWFjdFJlZHV4Q29udGV4dC5cbiAgICAgICAgLy8gTWVtb2l6ZSB0aGUgY2hlY2sgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGNvbnRleHQgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZS5cbiAgICAgICAgcmV0dXJuIHByb3BzQ29udGV4dCAmJiBwcm9wc0NvbnRleHQuQ29uc3VtZXIgJiYgaXNDb250ZXh0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbCkpID8gcHJvcHNDb250ZXh0IDogQ29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTsgLy8gUmV0cmlldmUgdGhlIHN0b3JlIGFuZCBhbmNlc3RvciBzdWJzY3JpcHRpb24gdmlhIGNvbnRleHQsIGlmIGF2YWlsYWJsZVxuXG4gICAgICB2YXIgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA9IEJvb2xlYW4ocHJvcHMuc3RvcmUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZ2V0U3RhdGUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgXFxcInN0b3JlXFxcIiBpbiB0aGUgY29udGV4dCBvZiBcIiArIChcIlxcXCJcIiArIGRpc3BsYXlOYW1lICsgXCJcXFwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBcIikgKyBcIm9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBcIiArIChcIlJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gXCIgKyBkaXNwbGF5TmFtZSArIFwiIGluIGNvbm5lY3Qgb3B0aW9ucy5cIikpO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICB2YXIgc3RvcmUgPSBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBwcm9wcy5zdG9yZSA6IGNvbnRleHRWYWx1ZS5zdG9yZTtcbiAgICAgIHZhciBjaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVGhlIGNoaWxkIHByb3BzIHNlbGVjdG9yIG5lZWRzIHRoZSBzdG9yZSByZWZlcmVuY2UgYXMgYW4gaW5wdXQuXG4gICAgICAgIC8vIFJlLWNyZWF0ZSB0aGlzIHNlbGVjdG9yIHdoZW5ldmVyIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGRTZWxlY3RvcihzdG9yZSk7XG4gICAgICB9LCBbc3RvcmVdKTtcblxuICAgICAgdmFyIF91c2VNZW1vMiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICAvLyBUaGlzIFN1YnNjcmlwdGlvbidzIHNvdXJjZSBzaG91bGQgbWF0Y2ggd2hlcmUgc3RvcmUgY2FtZSBmcm9tOiBwcm9wcyB2cy4gY29udGV4dC4gQSBjb21wb25lbnRcbiAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzdG9yZSB2aWEgcHJvcHMgc2hvdWxkbid0IHVzZSBzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0LCBvciB2aWNlIHZlcnNhLlxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBudWxsIDogY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbik7IC8vIGBub3RpZnlOZXN0ZWRTdWJzYCBpcyBkdXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHN1YnNjcmlwdGlvbmAgd2lsbCB0aGVuIGJlIG51bGwuIFRoaXMgY2FuXG4gICAgICAgIC8vIHByb2JhYmx5IGJlIGF2b2lkZWQgaWYgU3Vic2NyaXB0aW9uJ3MgbGlzdGVuZXJzIGxvZ2ljIGlzIGNoYW5nZWQgdG8gbm90IGNhbGwgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRoYXQgaGF2ZSBiZWVuIHVuc3Vic2NyaWJlZCBpbiB0aGUgIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AuXG5cbiAgICAgICAgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGluXG4gICAgICAgIC8vIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLCB3aGVyZSBgc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gVGhpcyBjYW5cbiAgICAgICAgLy8gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24ncyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZSAgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcC5cbiAgICAgICAgdmFyIG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKSxcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSBfdXNlTWVtbzJbMF0sXG4gICAgICAgICAgbm90aWZ5TmVzdGVkU3VicyA9IF91c2VNZW1vMlsxXTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cblxuICAgICAgdmFyIG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICB9LCBbZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWUsIHN1YnNjcmlwdGlvbl0pOyAvLyBXZSBuZWVkIHRvIGZvcmNlIHRoaXMgd3JhcHBlciBjb21wb25lbnQgdG8gcmUtcmVuZGVyIHdoZW5ldmVyIGEgUmVkdXggc3RvcmUgdXBkYXRlXG4gICAgICAvLyBjYXVzZXMgYSBjaGFuZ2UgdG8gdGhlIGNhbGN1bGF0ZWQgY2hpbGQgY29tcG9uZW50IHByb3BzIChvciB3ZSBjYXVnaHQgYW4gZXJyb3IgaW4gbWFwU3RhdGUpXG5cbiAgICAgIHZhciBfdXNlUmVkdWNlciA9IHVzZVJlZHVjZXIoc3RvcmVTdGF0ZVVwZGF0ZXNSZWR1Y2VyLCBFTVBUWV9BUlJBWSwgaW5pdFN0YXRlVXBkYXRlcyksXG4gICAgICAgICAgX3VzZVJlZHVjZXIkID0gX3VzZVJlZHVjZXJbMF0sXG4gICAgICAgICAgcHJldmlvdXNTdGF0ZVVwZGF0ZVJlc3VsdCA9IF91c2VSZWR1Y2VyJFswXSxcbiAgICAgICAgICBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoID0gX3VzZVJlZHVjZXJbMV07IC8vIFByb3BhZ2F0ZSBhbnkgbWFwU3RhdGUvbWFwRGlzcGF0Y2ggZXJyb3JzIHVwd2FyZHNcblxuXG4gICAgICBpZiAocHJldmlvdXNTdGF0ZVVwZGF0ZVJlc3VsdCAmJiBwcmV2aW91c1N0YXRlVXBkYXRlUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQuZXJyb3I7XG4gICAgICB9IC8vIFNldCB1cCByZWZzIHRvIGNvb3JkaW5hdGUgdmFsdWVzIGJldHdlZW4gdGhlIHN1YnNjcmlwdGlvbiBlZmZlY3QgYW5kIHRoZSByZW5kZXIgbG9naWNcblxuXG4gICAgICB2YXIgbGFzdENoaWxkUHJvcHMgPSB1c2VSZWYoKTtcbiAgICAgIHZhciBsYXN0V3JhcHBlclByb3BzID0gdXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICB2YXIgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IHVzZVJlZigpO1xuICAgICAgdmFyIHJlbmRlcklzU2NoZWR1bGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgICAgIHZhciBhY3R1YWxDaGlsZFByb3BzID0gdXNlUHVyZU9ubHlNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVHJpY2t5IGxvZ2ljIGhlcmU6XG4gICAgICAgIC8vIC0gVGhpcyByZW5kZXIgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQgYnkgYSBSZWR1eCBzdG9yZSB1cGRhdGUgdGhhdCBwcm9kdWNlZCBuZXcgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldyBjaGlsZCBwcm9wcywgYW5kIHRoZSBzYW1lIHdyYXBwZXIgcHJvcHMsIHdlIGtub3cgd2Ugc2hvdWxkIHVzZSB0aGUgbmV3IGNoaWxkIHByb3BzIGFzLWlzLlxuICAgICAgICAvLyBCdXQsIGlmIHdlIGhhdmUgbmV3IHdyYXBwZXIgcHJvcHMsIHRob3NlIG1pZ2h0IGNoYW5nZSB0aGUgY2hpbGQgcHJvcHMsIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhpbmdzLlxuICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgJiYgd3JhcHBlclByb3BzID09PSBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50O1xuICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgIC8vIFRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgQmFkIFRoaW5ncyAoVE0pIHRvIGhhcHBlbiBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJlY2F1c2Ugb24gcmVuZGVycyBfbm90XyBjYXVzZWQgYnkgc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0aGUgbGF0ZXN0IHN0b3JlIHN0YXRlXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9wc1NlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCksIHdyYXBwZXJQcm9wcyk7XG4gICAgICB9LCBbc3RvcmUsIHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgYWN0dWFsQ2hpbGRQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pOyAvLyBPdXIgcmUtc3Vic2NyaWJlIGxvZ2ljIG9ubHkgcnVucyB3aGVuIHRoZSBzdG9yZS9zdWJzY3JpcHRpb24gc2V0dXAgY2hhbmdlc1xuXG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3Moc3Vic2NyaWJlVXBkYXRlcywgW3Nob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2hdLCBbc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yXSk7IC8vIE5vdyB0aGF0IGFsbCB0aGF0J3MgZG9uZSwgd2UgY2FuIGZpbmFsbHkgdHJ5IHRvIGFjdHVhbGx5IHJlbmRlciB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgLy8gV2UgbWVtb2l6ZSB0aGUgZWxlbWVudHMgZm9yIHRoZSByZW5kZXJlZCBjaGlsZCBjb21wb25lbnQgYXMgYW4gb3B0aW1pemF0aW9uLlxuXG4gICAgICB2YXIgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgIHJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICB9KSk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBpcyBzdWJzY3JpYmVkIHRvIHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdG8gcGFzcyBpdHMgb3duXG4gICAgICAgICAgLy8gc3Vic2NyaXB0aW9uIGluc3RhbmNlIGRvd24gdG8gb3VyIGRlc2NlbmRhbnRzLiBUaGF0IG1lYW5zIHJlbmRlcmluZyB0aGUgc2FtZVxuICAgICAgICAgIC8vIENvbnRleHQgaW5zdGFuY2UsIGFuZCBwdXR0aW5nIGEgZGlmZmVyZW50IHZhbHVlIGludG8gdGhlIGNvbnRleHQuXG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRUb1VzZS5Qcm92aWRlciwge1xuICAgICAgICAgICAgdmFsdWU6IG92ZXJyaWRkZW5Db250ZXh0VmFsdWVcbiAgICAgICAgICB9LCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfSAvLyBJZiB3ZSdyZSBpbiBcInB1cmVcIiBtb2RlLCBlbnN1cmUgb3VyIHdyYXBwZXIgY29tcG9uZW50IG9ubHkgcmUtcmVuZGVycyB3aGVuIGluY29taW5nIHByb3BzIGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIENvbm5lY3QgPSBwdXJlID8gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pIDogQ29ubmVjdEZ1bmN0aW9uO1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IENvbm5lY3RGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIHZhciBmb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwdXJlXCIsIFwiYXJlU3RhdGVzRXF1YWxcIiwgXCJhcmVPd25Qcm9wc0VxdWFsXCIsIFwiYXJlU3RhdGVQcm9wc0VxdWFsXCIsIFwiYXJlTWVyZ2VkUHJvcHNFcXVhbFwiXTtcbmltcG9ydCBjb25uZWN0QWR2YW5jZWQgZnJvbSAnLi4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuLi91dGlscy9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IGRlZmF1bHRNYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBEaXNwYXRjaFRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIGZyb20gJy4vbWVyZ2VQcm9wcyc7XG5pbXBvcnQgZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSBmcm9tICcuL3NlbGVjdG9yRmFjdG9yeSc7XG4vKlxuICBjb25uZWN0IGlzIGEgZmFjYWRlIG92ZXIgY29ubmVjdEFkdmFuY2VkLiBJdCB0dXJucyBpdHMgYXJncyBpbnRvIGEgY29tcGF0aWJsZVxuICBzZWxlY3RvckZhY3RvcnksIHdoaWNoIGhhcyB0aGUgc2lnbmF0dXJlOlxuXG4gICAgKGRpc3BhdGNoLCBvcHRpb25zKSA9PiAobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpID0+IG5leHRGaW5hbFByb3BzXG4gIFxuICBjb25uZWN0IHBhc3NlcyBpdHMgYXJncyB0byBjb25uZWN0QWR2YW5jZWQgYXMgb3B0aW9ucywgd2hpY2ggd2lsbCBpbiB0dXJuIHBhc3MgdGhlbSB0b1xuICBzZWxlY3RvckZhY3RvcnkgZWFjaCB0aW1lIGEgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2UgaXMgaW5zdGFudGlhdGVkIG9yIGhvdCByZWxvYWRlZC5cblxuICBzZWxlY3RvckZhY3RvcnkgcmV0dXJucyBhIGZpbmFsIHByb3BzIHNlbGVjdG9yIGZyb20gaXRzIG1hcFN0YXRlVG9Qcm9wcyxcbiAgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcywgbWVyZ2VQcm9wcyxcbiAgbWVyZ2VQcm9wc0ZhY3RvcmllcywgYW5kIHB1cmUgYXJncy5cblxuICBUaGUgcmVzdWx0aW5nIGZpbmFsIHByb3BzIHNlbGVjdG9yIGlzIGNhbGxlZCBieSB0aGUgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2Ugd2hlbmV2ZXJcbiAgaXQgcmVjZWl2ZXMgbmV3IHByb3BzIG9yIHN0b3JlIHN0YXRlLlxuICovXG5cbmZ1bmN0aW9uIG1hdGNoKGFyZywgZmFjdG9yaWVzLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSBmYWN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFjdG9yaWVzW2ldKGFyZyk7XG4gICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIG9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIG9mIHR5cGUgXCIgKyB0eXBlb2YgYXJnICsgXCIgZm9yIFwiICsgbmFtZSArIFwiIGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgXCIgKyBvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lICsgXCIuXCIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufSAvLyBjcmVhdGVDb25uZWN0IHdpdGggZGVmYXVsdCBhcmdzIGJ1aWxkcyB0aGUgJ29mZmljaWFsJyBjb25uZWN0IGJlaGF2aW9yLiBDYWxsaW5nIGl0IHdpdGhcbi8vIGRpZmZlcmVudCBvcHRpb25zIG9wZW5zIHVwIHNvbWUgdGVzdGluZyBhbmQgZXh0ZW5zaWJpbGl0eSBzY2VuYXJpb3NcblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdChfdGVtcCkge1xuICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgX3JlZiRjb25uZWN0SE9DID0gX3JlZi5jb25uZWN0SE9DLFxuICAgICAgY29ubmVjdEhPQyA9IF9yZWYkY29ubmVjdEhPQyA9PT0gdm9pZCAwID8gY29ubmVjdEFkdmFuY2VkIDogX3JlZiRjb25uZWN0SE9DLFxuICAgICAgX3JlZiRtYXBTdGF0ZVRvUHJvcHNGID0gX3JlZi5tYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsXG4gICAgICBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPT09IHZvaWQgMCA/IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgOiBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YsXG4gICAgICBfcmVmJG1hcERpc3BhdGNoVG9Qcm8gPSBfcmVmLm1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9PT0gdm9pZCAwID8gZGVmYXVsdE1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA6IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyxcbiAgICAgIF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9IF9yZWYubWVyZ2VQcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1lcmdlUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1lcmdlUHJvcHNGYWN0b3IgPT09IHZvaWQgMCA/IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIDogX3JlZiRtZXJnZVByb3BzRmFjdG9yLFxuICAgICAgX3JlZiRzZWxlY3RvckZhY3RvcnkgPSBfcmVmLnNlbGVjdG9yRmFjdG9yeSxcbiAgICAgIHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYkc2VsZWN0b3JGYWN0b3J5ID09PSB2b2lkIDAgPyBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IDogX3JlZiRzZWxlY3RvckZhY3Rvcnk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIF9yZWYyKSB7XG4gICAgaWYgKF9yZWYyID09PSB2b2lkIDApIHtcbiAgICAgIF9yZWYyID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9yZWYzID0gX3JlZjIsXG4gICAgICAgIF9yZWYzJHB1cmUgPSBfcmVmMy5wdXJlLFxuICAgICAgICBwdXJlID0gX3JlZjMkcHVyZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYzJHB1cmUsXG4gICAgICAgIF9yZWYzJGFyZVN0YXRlc0VxdWFsID0gX3JlZjMuYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIGFyZVN0YXRlc0VxdWFsID0gX3JlZjMkYXJlU3RhdGVzRXF1YWwgPT09IHZvaWQgMCA/IHN0cmljdEVxdWFsIDogX3JlZjMkYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIF9yZWYzJGFyZU93blByb3BzRXF1YSA9IF9yZWYzLmFyZU93blByb3BzRXF1YWwsXG4gICAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmMyRhcmVPd25Qcm9wc0VxdWEgPT09IHZvaWQgMCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYzJGFyZU93blByb3BzRXF1YSxcbiAgICAgICAgX3JlZjMkYXJlU3RhdGVQcm9wc0VxID0gX3JlZjMuYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmMyRhcmVTdGF0ZVByb3BzRXEgPT09IHZvaWQgMCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYzJGFyZVN0YXRlUHJvcHNFcSxcbiAgICAgICAgX3JlZjMkYXJlTWVyZ2VkUHJvcHNFID0gX3JlZjMuYXJlTWVyZ2VkUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IF9yZWYzJGFyZU1lcmdlZFByb3BzRSA9PT0gdm9pZCAwID8gc2hhbGxvd0VxdWFsIDogX3JlZjMkYXJlTWVyZ2VkUHJvcHNFLFxuICAgICAgICBleHRyYU9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMywgX2V4Y2x1ZGVkKTtcblxuICAgIHZhciBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWF0Y2gobWFwU3RhdGVUb1Byb3BzLCBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgICB2YXIgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hdGNoKG1hcERpc3BhdGNoVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG4gICAgdmFyIGluaXRNZXJnZVByb3BzID0gbWF0Y2gobWVyZ2VQcm9wcywgbWVyZ2VQcm9wc0ZhY3RvcmllcywgJ21lcmdlUHJvcHMnKTtcbiAgICByZXR1cm4gY29ubmVjdEhPQyhzZWxlY3RvckZhY3RvcnksIF9leHRlbmRzKHtcbiAgICAgIC8vIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIG1ldGhvZE5hbWU6ICdjb25uZWN0JyxcbiAgICAgIC8vIHVzZWQgdG8gY29tcHV0ZSBDb25uZWN0J3MgZGlzcGxheU5hbWUgZnJvbSB0aGUgd3JhcHBlZCBjb21wb25lbnQncyBkaXNwbGF5TmFtZS5cbiAgICAgIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBcIkNvbm5lY3QoXCIgKyBuYW1lICsgXCIpXCI7XG4gICAgICB9LFxuICAgICAgLy8gaWYgbWFwU3RhdGVUb1Byb3BzIGlzIGZhbHN5LCB0aGUgQ29ubmVjdCBjb21wb25lbnQgZG9lc24ndCBzdWJzY3JpYmUgdG8gc3RvcmUgc3RhdGUgY2hhbmdlc1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyksXG4gICAgICAvLyBwYXNzZWQgdGhyb3VnaCB0byBzZWxlY3RvckZhY3RvcnlcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHM6IGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzOiBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHM6IGluaXRNZXJnZVByb3BzLFxuICAgICAgcHVyZTogcHVyZSxcbiAgICAgIGFyZVN0YXRlc0VxdWFsOiBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWw6IGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWw6IGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWw6IGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9LCBleHRyYU9wdGlvbnMpKTtcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9jcmVhdGVDb25uZWN0KCk7IiwiaW1wb3J0IGJpbmRBY3Rpb25DcmVhdG9ycyBmcm9tICcuLi91dGlscy9iaW5kQWN0aW9uQ3JlYXRvcnMnO1xuaW1wb3J0IHsgd3JhcE1hcFRvUHJvcHNDb25zdGFudCwgd3JhcE1hcFRvUHJvcHNGdW5jIH0gZnJvbSAnLi93cmFwTWFwVG9Qcm9wcyc7XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24obWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoXG4gICAgfTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdvYmplY3QnID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpO1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBkZWZhdWx0IFt3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbiwgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZywgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0XTsiLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbihtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBTdGF0ZVRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZyhtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGRlZmF1bHQgW3doZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nXTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBfcmVmLmRpc3BsYXlOYW1lLFxuICAgICAgICBwdXJlID0gX3JlZi5wdXJlLFxuICAgICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gX3JlZi5hcmVNZXJnZWRQcm9wc0VxdWFsO1xuICAgIHZhciBoYXNSdW5PbmNlID0gZmFsc2U7XG4gICAgdmFyIG1lcmdlZFByb3BzO1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIHZhciBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFwdXJlIHx8ICFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtZXJnZVByb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWVyZ2VQcm9wcztcbiAgfSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBkZWZhdWx0IFt3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24sIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkXTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gaW1wdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihzdGF0ZSwgb3duUHJvcHMpIHtcbiAgICByZXR1cm4gbWVyZ2VQcm9wcyhtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKSwgbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyksIG93blByb3BzKTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIF9yZWYpIHtcbiAgdmFyIGFyZVN0YXRlc0VxdWFsID0gX3JlZi5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmLmFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmLmFyZVN0YXRlUHJvcHNFcXVhbDtcbiAgdmFyIGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIG93blByb3BzO1xuICB2YXIgc3RhdGVQcm9wcztcbiAgdmFyIGRpc3BhdGNoUHJvcHM7XG4gIHZhciBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgdmFyIG5leHRTdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICB2YXIgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChuZXh0U3RhdGUsIHN0YXRlKTtcbiAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IG5leHRPd25Qcm9wcztcbiAgICBpZiAocHJvcHNDaGFuZ2VkICYmIHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHMoKTtcbiAgICBpZiAoc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3U3RhdGUoKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufSAvLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gSWYgcHVyZSBpcyB0cnVlLCB0aGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3RBZHZhbmNlZCdzIHNob3VsZENvbXBvbmVudFVwZGF0ZSB0byByZXR1cm4gZmFsc2UgaWYgZmluYWxcbi8vIHByb3BzIGhhdmUgbm90IGNoYW5nZWQuIElmIGZhbHNlLCB0aGUgc2VsZWN0b3Igd2lsbCBhbHdheXMgcmV0dXJuIGEgbmV3XG4vLyBvYmplY3QgYW5kIHNob3VsZENvbXBvbmVudFVwZGF0ZSB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZjIpIHtcbiAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBfcmVmMi5pbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IF9yZWYyLmluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyA9IF9yZWYyLmluaXRNZXJnZVByb3BzLFxuICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgdmFyIG1hcERpc3BhdGNoVG9Qcm9wcyA9IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgb3B0aW9ucy5kaXNwbGF5TmFtZSk7XG4gIH1cblxuICB2YXIgc2VsZWN0b3JGYWN0b3J5ID0gb3B0aW9ucy5wdXJlID8gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgOiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuICByZXR1cm4gc2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSwgZGlzcGxheU5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIGluIFwiICsgZGlzcGxheU5hbWUgKyBcIi5cIik7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoXCJUaGUgc2VsZWN0b3IgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIG9mIFwiICsgZGlzcGxheU5hbWUgKyBcIiBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycsIGRpc3BsYXlOYW1lKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG5cbiAgICBjb25zdGFudFNlbGVjdG9yLmRlcGVuZHNPbk93blByb3BzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNvbnN0YW50U2VsZWN0b3I7XG4gIH07XG59IC8vIGRlcGVuZHNPbk93blByb3BzIGlzIHVzZWQgYnkgY3JlYXRlTWFwVG9Qcm9wc1Byb3h5IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhc3MgcHJvcHMgYXMgYXJnc1xuLy8gdG8gdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgd3JhcHBlZC4gSXQgaXMgYWxzbyB1c2VkIGJ5IG1ha2VQdXJlUHJvcHNTZWxlY3RvciB0byBkZXRlcm1pbmVcbi8vIHdoZXRoZXIgbWFwVG9Qcm9wcyBuZWVkcyB0byBiZSBpbnZva2VkIHdoZW4gcHJvcHMgaGF2ZSBjaGFuZ2VkLlxuLy9cbi8vIEEgbGVuZ3RoIG9mIG9uZSBzaWduYWxzIHRoYXQgbWFwVG9Qcm9wcyBkb2VzIG5vdCBkZXBlbmQgb24gcHJvcHMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbi8vIEEgbGVuZ3RoIG9mIHplcm8gaXMgYXNzdW1lZCB0byBtZWFuIG1hcFRvUHJvcHMgaXMgZ2V0dGluZyBhcmdzIHZpYSBhcmd1bWVudHMgb3IgLi4uYXJncyBhbmRcbi8vIHRoZXJlZm9yZSBub3QgcmVwb3J0aW5nIGl0cyBsZW5ndGggYWNjdXJhdGVseS4uXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzICE9PSBudWxsICYmIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZTtcblxuICAgIHZhciBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gpO1xuICAgIH07IC8vIGFsbG93IGRldGVjdEZhY3RvcnlBbmRWZXJpZnkgdG8gZ2V0IG93blByb3BzXG5cblxuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIHZhciBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59IiwiaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4vY29tcG9uZW50cy9Qcm92aWRlcic7XG5pbXBvcnQgY29ubmVjdEFkdmFuY2VkIGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2Nvbm5lY3QvY29ubmVjdCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCB7IFByb3ZpZGVyLCBjb25uZWN0QWR2YW5jZWQsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlRGlzcGF0Y2hgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoSG9vayhjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQ7XG4gIH1cblxuICB2YXIgdXNlU3RvcmUgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIHZhciBzdG9yZSA9IHVzZVN0b3JlKCk7XG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBgZGlzcGF0Y2hgIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXG4gKiBpbXBvcnQgeyB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuICpcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xuICogICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKClcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxuICogICByZXR1cm4gKFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxuICogICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtpbmNyZWFzZUNvdW50ZXJ9PkluY3JlYXNlIGNvdW50ZXI8L2J1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgKVxuICogfVxuICovXG5cbmV4cG9ydCB2YXIgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0Jztcbi8qKlxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGAuIFRoaXMgaXMgYSBsb3ctbGV2ZWxcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbiAqIGltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuICpcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xuICogICBjb25zdCB7IHN0b3JlIH0gPSB1c2VSZWR1eENvbnRleHQoKVxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cbiAqIH1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdXhDb250ZXh0KCkge1xuICB2YXIgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChSZWFjdFJlZHV4Q29udGV4dCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcmVhY3QtcmVkdXggY29udGV4dCB2YWx1ZTsgcGxlYXNlIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIHdyYXBwZWQgaW4gYSA8UHJvdmlkZXI+Jyk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dFZhbHVlO1xufSIsImltcG9ydCB7IHVzZVJlZHVjZXIsIHVzZVJlZiwgdXNlTWVtbywgdXNlQ29udGV4dCwgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxudmFyIHJlZkVxdWFsaXR5ID0gZnVuY3Rpb24gcmVmRXF1YWxpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn07XG5cbmZ1bmN0aW9uIHVzZVNlbGVjdG9yV2l0aFN0b3JlQW5kU3Vic2NyaXB0aW9uKHNlbGVjdG9yLCBlcXVhbGl0eUZuLCBzdG9yZSwgY29udGV4dFN1Yikge1xuICB2YXIgX3VzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMgKyAxO1xuICB9LCAwKSxcbiAgICAgIGZvcmNlUmVuZGVyID0gX3VzZVJlZHVjZXJbMV07XG5cbiAgdmFyIHN1YnNjcmlwdGlvbiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGNvbnRleHRTdWIpO1xuICB9LCBbc3RvcmUsIGNvbnRleHRTdWJdKTtcbiAgdmFyIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSB1c2VSZWYoKTtcbiAgdmFyIGxhdGVzdFNlbGVjdG9yID0gdXNlUmVmKCk7XG4gIHZhciBsYXRlc3RTdG9yZVN0YXRlID0gdXNlUmVmKCk7XG4gIHZhciBsYXRlc3RTZWxlY3RlZFN0YXRlID0gdXNlUmVmKCk7XG4gIHZhciBzdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgdmFyIHNlbGVjdGVkU3RhdGU7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2VsZWN0b3IgIT09IGxhdGVzdFNlbGVjdG9yLmN1cnJlbnQgfHwgc3RvcmVTdGF0ZSAhPT0gbGF0ZXN0U3RvcmVTdGF0ZS5jdXJyZW50IHx8IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCkge1xuICAgICAgdmFyIG5ld1NlbGVjdGVkU3RhdGUgPSBzZWxlY3RvcihzdG9yZVN0YXRlKTsgLy8gZW5zdXJlIGxhdGVzdCBzZWxlY3RlZCBzdGF0ZSBpcyByZXVzZWQgc28gdGhhdCBhIGN1c3RvbSBlcXVhbGl0eSBmdW5jdGlvbiBjYW4gcmVzdWx0IGluIGlkZW50aWNhbCByZWZlcmVuY2VzXG5cbiAgICAgIGlmIChsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCAhZXF1YWxpdHlGbihuZXdTZWxlY3RlZFN0YXRlLCBsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQpKSB7XG4gICAgICAgIHNlbGVjdGVkU3RhdGUgPSBuZXdTZWxlY3RlZFN0YXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgIGVyci5tZXNzYWdlICs9IFwiXFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcXG5cIiArIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudC5zdGFjayArIFwiXFxuXFxuXCI7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbGF0ZXN0U2VsZWN0b3IuY3VycmVudCA9IHNlbGVjdG9yO1xuICAgIGxhdGVzdFN0b3JlU3RhdGUuY3VycmVudCA9IHN0b3JlU3RhdGU7XG4gICAgbGF0ZXN0U2VsZWN0ZWRTdGF0ZS5jdXJyZW50ID0gc2VsZWN0ZWRTdGF0ZTtcbiAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV3U3RvcmVTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7IC8vIEF2b2lkIGNhbGxpbmcgc2VsZWN0b3IgbXVsdGlwbGUgdGltZXMgaWYgdGhlIHN0b3JlJ3Mgc3RhdGUgaGFzIG5vdCBjaGFuZ2VkXG5cbiAgICAgICAgaWYgKG5ld1N0b3JlU3RhdGUgPT09IGxhdGVzdFN0b3JlU3RhdGUuY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbmV3U2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdG9yLmN1cnJlbnQobmV3U3RvcmVTdGF0ZSk7XG5cbiAgICAgICAgaWYgKGVxdWFsaXR5Rm4oX25ld1NlbGVjdGVkU3RhdGUsIGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQgPSBfbmV3U2VsZWN0ZWRTdGF0ZTtcbiAgICAgICAgbGF0ZXN0U3RvcmVTdGF0ZS5jdXJyZW50ID0gbmV3U3RvcmVTdGF0ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyB3ZSBpZ25vcmUgYWxsIGVycm9ycyBoZXJlLCBzaW5jZSB3aGVuIHRoZSBjb21wb25lbnRcbiAgICAgICAgLy8gaXMgcmUtcmVuZGVyZWQsIHRoZSBzZWxlY3RvcnMgYXJlIGNhbGxlZCBhZ2FpbiwgYW5kXG4gICAgICAgIC8vIHdpbGwgdGhyb3cgYWdhaW4sIGlmIG5laXRoZXIgcHJvcHMgbm9yIHN0b3JlIHN0YXRlXG4gICAgICAgIC8vIGNoYW5nZWRcbiAgICAgICAgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50ID0gZXJyO1xuICAgICAgfVxuXG4gICAgICBmb3JjZVJlbmRlcigpO1xuICAgIH1cblxuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICBjaGVja0ZvclVwZGF0ZXMoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgIH07XG4gIH0sIFtzdG9yZSwgc3Vic2NyaXB0aW9uXSk7XG4gIHJldHVybiBzZWxlY3RlZFN0YXRlO1xufVxuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JIb29rKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkge1xuICAgIGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dDtcbiAgfVxuXG4gIHZhciB1c2VSZWR1eENvbnRleHQgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoY29udGV4dCk7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbikge1xuICAgIGlmIChlcXVhbGl0eUZuID09PSB2b2lkIDApIHtcbiAgICAgIGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZXF1YWxpdHlGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF91c2VSZWR1eENvbnRleHQgPSB1c2VSZWR1eENvbnRleHQoKSxcbiAgICAgICAgc3RvcmUgPSBfdXNlUmVkdXhDb250ZXh0LnN0b3JlLFxuICAgICAgICBjb250ZXh0U3ViID0gX3VzZVJlZHV4Q29udGV4dC5zdWJzY3JpcHRpb247XG5cbiAgICB2YXIgc2VsZWN0ZWRTdGF0ZSA9IHVzZVNlbGVjdG9yV2l0aFN0b3JlQW5kU3Vic2NyaXB0aW9uKHNlbGVjdG9yLCBlcXVhbGl0eUZuLCBzdG9yZSwgY29udGV4dFN1Yik7XG4gICAgdXNlRGVidWdWYWx1ZShzZWxlY3RlZFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbiAgfTtcbn1cbi8qKlxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggc3RvcmUncyBzdGF0ZS4gVGhpcyBob29rIHRha2VzIGEgc2VsZWN0b3IgZnVuY3Rpb25cbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxuICpcbiAqIFRoaXMgaG9vayB0YWtlcyBhbiBvcHRpb25hbCBlcXVhbGl0eSBjb21wYXJpc29uIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxuICogd2hldGhlciB0aGUgY29tcG9uZW50IG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbj19IGVxdWFsaXR5Rm4gdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eVxuICpcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuICogaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbiAqXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICgpID0+IHtcbiAqICAgY29uc3QgY291bnRlciA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmNvdW50ZXIpXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxuICogfVxuICovXG5cbmV4cG9ydCB2YXIgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTdG9yZWAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQ7XG4gIH1cblxuICB2YXIgdXNlUmVkdXhDb250ZXh0ID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU3RvcmUoKSB7XG4gICAgdmFyIF91c2VSZWR1eENvbnRleHQgPSB1c2VSZWR1eENvbnRleHQoKSxcbiAgICAgICAgc3RvcmUgPSBfdXNlUmVkdXhDb250ZXh0LnN0b3JlO1xuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbiAqIGltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAncmVhY3QtcmVkdXgnXG4gKlxuICogZXhwb3J0IGNvbnN0IEV4YW1wbGVDb21wb25lbnQgPSAoKSA9PiB7XG4gKiAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKVxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cbiAqIH1cbiAqL1xuXG5leHBvcnQgdmFyIHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsImV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyBhcyBiYXRjaCB9IGZyb20gJy4vdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcyc7XG5pbXBvcnQgeyBzZXRCYXRjaCB9IGZyb20gJy4vdXRpbHMvYmF0Y2gnOyAvLyBFbmFibGUgYmF0Y2hlZCB1cGRhdGVzIGluIG91ciBzdWJzY3JpcHRpb25zIGZvciB1c2Vcbi8vIHdpdGggc3RhbmRhcmQgUmVhY3QgcmVuZGVyZXJzIChSZWFjdERPTSwgUmVhY3QgTmF0aXZlKVxuXG5zZXRCYXRjaChiYXRjaCk7XG5leHBvcnQgeyBiYXRjaCB9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgdmFyIGJhdGNoID0gZ2V0QmF0Y2goKTtcbiAgdmFyIGZpcnN0ID0gbnVsbDtcbiAgdmFyIGxhc3QgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG4gICAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgICBiYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgICAgdmFyIGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG52YXIgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7fSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViKSB7XG4gIHZhciB1bnN1YnNjcmliZTtcbiAgdmFyIGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG5cbiAgZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIGxpc3RlbmVycy5zdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICBsaXN0ZW5lcnMubm90aWZ5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2VXcmFwcGVyKCkge1xuICAgIGlmIChzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odW5zdWJzY3JpYmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlID0gcGFyZW50U3ViID8gcGFyZW50U3ViLmFkZE5lc3RlZFN1YihoYW5kbGVDaGFuZ2VXcmFwcGVyKSA6IHN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2VXcmFwcGVyKTtcbiAgICAgIGxpc3RlbmVycyA9IGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHVuc3Vic2NyaWJlID0gdW5kZWZpbmVkO1xuICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdWJzY3JpcHRpb24gPSB7XG4gICAgYWRkTmVzdGVkU3ViOiBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3Viczogbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyOiBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZDogaXNTdWJzY3JpYmVkLFxuICAgIHRyeVN1YnNjcmliZTogdHJ5U3Vic2NyaWJlLFxuICAgIHRyeVVuc3Vic2NyaWJlOiB0cnlVbnN1YnNjcmliZSxcbiAgICBnZXRMaXN0ZW5lcnM6IGZ1bmN0aW9uIGdldExpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbnZhciBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCB2YXIgc2V0QmF0Y2ggPSBmdW5jdGlvbiBzZXRCYXRjaChuZXdCYXRjaCkge1xuICByZXR1cm4gYmF0Y2ggPSBuZXdCYXRjaDtcbn07IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgdmFyIGdldEJhdGNoID0gZnVuY3Rpb24gZ2V0QmF0Y2goKSB7XG4gIHJldHVybiBiYXRjaDtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGtleSkge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgX2xvb3Aoa2V5KTtcbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufSIsIi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIGJhc2VQcm90byA9IHByb3RvO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xuICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XG59IiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLXVucmVzb2x2ZWQgKi9cbmV4cG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJzsiLCJmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuXG5leHBvcnQgdmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0OyIsImltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJy4vaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcm5pbmcnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKG1ldGhvZE5hbWUgKyBcIigpIGluIFwiICsgZGlzcGxheU5hbWUgKyBcIiBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCBcIiArIHZhbHVlICsgXCIuXCIpO1xuICB9XG59IiwiLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG5cbn0iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3JlYWN0JykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdyZWFjdCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuUmVhY3RUYWJsZSA9IHt9LCBnbG9iYWwuUmVhY3QpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCBSZWFjdCkgeyAndXNlIHN0cmljdCc7XG5cbiAgUmVhY3QgPSBSZWFjdCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVhY3QsICdkZWZhdWx0JykgPyBSZWFjdFsnZGVmYXVsdCddIDogUmVhY3Q7XG5cbiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IHt9O1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIga2V5LCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcblxuICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgICAgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG5cbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpO1xuICB9XG5cbiAgdmFyIHJlbmRlckVyciA9ICdSZW5kZXJlciBFcnJvciDimJ3vuI8nO1xuICB2YXIgYWN0aW9ucyA9IHtcbiAgICBpbml0OiAnaW5pdCdcbiAgfTtcbiAgdmFyIGRlZmF1bHRSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJlcihfcmVmKSB7XG4gICAgdmFyIF9yZWYkdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICB2YWx1ZSA9IF9yZWYkdmFsdWUgPT09IHZvaWQgMCA/ICcnIDogX3JlZiR2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHZhciBlbXB0eVJlbmRlcmVyID0gZnVuY3Rpb24gZW1wdHlSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgXCJcXHhBMFwiKTtcbiAgfTtcbiAgdmFyIGRlZmF1bHRDb2x1bW4gPSB7XG4gICAgQ2VsbDogZGVmYXVsdFJlbmRlcmVyLFxuICAgIHdpZHRoOiAxNTAsXG4gICAgbWluV2lkdGg6IDAsXG4gICAgbWF4V2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gIH07XG5cbiAgZnVuY3Rpb24gbWVyZ2VQcm9wcygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcHJvcExpc3QgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwcm9wTGlzdFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcExpc3QucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywgbmV4dCkge1xuICAgICAgdmFyIHN0eWxlID0gbmV4dC5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBuZXh0LmNsYXNzTmFtZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UobmV4dCwgW1wic3R5bGVcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gICAgICBwcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywge30sIHJlc3QpO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgcHJvcHMuc3R5bGUgPSBwcm9wcy5zdHlsZSA/IF9leHRlbmRzKHt9LCBwcm9wcy5zdHlsZSB8fCB7fSwge30sIHN0eWxlIHx8IHt9KSA6IHN0eWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSA/IHByb3BzLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZSA6IGNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNsYXNzTmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVByb3BHZXR0ZXIocHJldlByb3BzLCB1c2VyUHJvcHMsIG1ldGEpIHtcbiAgICAvLyBIYW5kbGUgYSBsYW1iZGEsIHBhc3MgaXQgdGhlIHByZXZpb3VzIHByb3BzXG4gICAgaWYgKHR5cGVvZiB1c2VyUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBoYW5kbGVQcm9wR2V0dGVyKHt9LCB1c2VyUHJvcHMocHJldlByb3BzLCBtZXRhKSk7XG4gICAgfSAvLyBIYW5kbGUgYW4gYXJyYXksIG1lcmdlIGVhY2ggaXRlbSBhcyBzZXBhcmF0ZSBwcm9wc1xuXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1c2VyUHJvcHMpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VQcm9wcy5hcHBseSh2b2lkIDAsIFtwcmV2UHJvcHNdLmNvbmNhdCh1c2VyUHJvcHMpKTtcbiAgICB9IC8vIEhhbmRsZSBhbiBvYmplY3QgYnkgZGVmYXVsdCwgbWVyZ2UgdGhlIHR3byBvYmplY3RzXG5cblxuICAgIHJldHVybiBtZXJnZVByb3BzKHByZXZQcm9wcywgdXNlclByb3BzKTtcbiAgfVxuXG4gIHZhciBtYWtlUHJvcEdldHRlciA9IGZ1bmN0aW9uIG1ha2VQcm9wR2V0dGVyKGhvb2tzLCBtZXRhKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAodXNlclByb3BzKSB7XG4gICAgICBpZiAodXNlclByb3BzID09PSB2b2lkIDApIHtcbiAgICAgICAgdXNlclByb3BzID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXS5jb25jYXQoaG9va3MsIFt1c2VyUHJvcHNdKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVByb3BHZXR0ZXIocHJldiwgbmV4dCwgX2V4dGVuZHMoe30sIG1ldGEsIHtcbiAgICAgICAgICB1c2VyUHJvcHM6IHVzZXJQcm9wc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7fSk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIHJlZHVjZUhvb2tzID0gZnVuY3Rpb24gcmVkdWNlSG9va3MoaG9va3MsIGluaXRpYWwsIG1ldGEsIGFsbG93VW5kZWZpbmVkKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBob29rcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBuZXh0KHByZXYsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICghYWxsb3dVbmRlZmluZWQgJiYgdHlwZW9mIG5leHRWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8obmV4dCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBUYWJsZTogQSByZWR1Y2VyIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgdW5kZWZpbmVkISBUaGlzIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfSwgaW5pdGlhbCk7XG4gIH07XG4gIHZhciBsb29wSG9va3MgPSBmdW5jdGlvbiBsb29wSG9va3MoaG9va3MsIGNvbnRleHQsIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBob29rKGNvbnRleHQsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgbmV4dFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhob29rLCBuZXh0VmFsdWUpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgVGFibGU6IEEgbG9vcC10eXBlIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgYSB2YWx1ZSEgVGhpcyBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBmdW5jdGlvbiBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBiZWZvcmVzLCBwbHVnaW5OYW1lLCBhZnRlcnMpIHtcbiAgICBpZiAoIGFmdGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmaW5pbmcgcGx1Z2lucyBpbiB0aGUgXFxcImFmdGVyXFxcIiBzZWN0aW9uIG9mIGVuc3VyZVBsdWdpbk9yZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHNlZSBwbHVnaW4gXCIgKyBwbHVnaW5OYW1lICsgXCIpXCIpO1xuICAgIH1cblxuICAgIHZhciBwbHVnaW5JbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucGx1Z2luTmFtZSA9PT0gcGx1Z2luTmFtZTtcbiAgICB9KTtcblxuICAgIGlmIChwbHVnaW5JbmRleCA9PT0gLTEpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsdWdpbiBcXFwiXCIgKyBwbHVnaW5OYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQgaW4gdGhlIHBsdWdpbiBsaXN0IVxcblRoaXMgdXN1YWxseSBtZWFucyB5b3UgbmVlZCB0byBuZWVkIHRvIG5hbWUgeW91ciBwbHVnaW4gaG9vayBieSBzZXR0aW5nIHRoZSAncGx1Z2luTmFtZScgcHJvcGVydHkgb2YgdGhlIGhvb2sgZnVuY3Rpb24sIGVnOlxcblxcbiAgXCIgKyBwbHVnaW5OYW1lICsgXCIucGx1Z2luTmFtZSA9ICdcIiArIHBsdWdpbk5hbWUgKyBcIidcXG5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmVmb3Jlcy5mb3JFYWNoKGZ1bmN0aW9uIChiZWZvcmUpIHtcbiAgICAgIHZhciBiZWZvcmVJbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5wbHVnaW5OYW1lID09PSBiZWZvcmU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGJlZm9yZUluZGV4ID4gLTEgJiYgYmVmb3JlSW5kZXggPiBwbHVnaW5JbmRleCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QgVGFibGU6IFRoZSBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4gaG9vayBtdXN0IGJlIHBsYWNlZCBhZnRlciB0aGUgXCIgKyBiZWZvcmUgKyBcIiBwbHVnaW4gaG9vayFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmFsVXBkYXRlKHVwZGF0ZXIsIG9sZCkge1xuICAgIHJldHVybiB0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZXIob2xkKSA6IHVwZGF0ZXI7XG4gIH1cbiAgZnVuY3Rpb24gdXNlR2V0TGF0ZXN0KG9iaikge1xuICAgIHZhciByZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgICByZWYuY3VycmVudCA9IG9iajtcbiAgICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlZi5jdXJyZW50O1xuICAgIH0sIFtdKTtcbiAgfSAvLyBTU1IgaGFzIGlzc3VlcyB3aXRoIHVzZUxheW91dEVmZmVjdCBzdGlsbCwgc28gdXNlIHVzZUVmZmVjdCBkdXJpbmcgU1NSXG5cbiAgdmFyIHNhZmVVc2VMYXlvdXRFZmZlY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xuICBmdW5jdGlvbiB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZuLCBkZXBzKSB7XG4gICAgdmFyIG1vdW50ZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIHNhZmVVc2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG1vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICBmbigpO1xuICAgICAgfVxuXG4gICAgICBtb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB9LCBkZXBzKTtcbiAgfVxuICBmdW5jdGlvbiB1c2VBc3luY0RlYm91bmNlKGRlZmF1bHRGbiwgZGVmYXVsdFdhaXQpIHtcbiAgICBpZiAoZGVmYXVsdFdhaXQgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFdhaXQgPSAwO1xuICAgIH1cblxuICAgIHZhciBkZWJvdW5jZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgdmFyIGdldERlZmF1bHRGbiA9IHVzZUdldExhdGVzdChkZWZhdWx0Rm4pO1xuICAgIHZhciBnZXREZWZhdWx0V2FpdCA9IHVzZUdldExhdGVzdChkZWZhdWx0V2FpdCk7XG4gICAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICB2YXIgX2xlbjIsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgX2tleTIsXG4gICAgICAgICAgICBfYXJnczIgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBmb3IgKF9sZW4yID0gX2FyZ3MyLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICAgICAgYXJnc1tfa2V5Ml0gPSBfYXJnczJbX2tleTJdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZGVib3VuY2VSZWYuY3VycmVudC5wcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVib3VuY2VSZWYuY3VycmVudC50aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgICAgICAgX2FzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWJvdW5jZVJlZi5jdXJyZW50LnRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IGRlYm91bmNlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZuKCkuYXBwbHkodm9pZCAwLCBhcmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDAucmVzb2x2ZS5jYWxsKF9jb250ZXh0LnQwLCBfY29udGV4dC50MSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDIgPSBfY29udGV4dFtcImNhdGNoXCJdKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnJlamVjdChfY29udGV4dC50Mik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxMik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzEsIDksIDEyLCAxNV1dKTtcbiAgICAgICAgICAgICAgICB9KSksIGdldERlZmF1bHRXYWl0KCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCksIFtnZXREZWZhdWx0Rm4sIGdldERlZmF1bHRXYWl0XSk7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZVJlbmRlcmVyKGluc3RhbmNlLCBjb2x1bW4sIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlLCB1c2VyUHJvcHMpIHtcbiAgICAgIGlmICh1c2VyUHJvcHMgPT09IHZvaWQgMCkge1xuICAgICAgICB1c2VyUHJvcHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIENvbXAgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyBjb2x1bW5bdHlwZV0gOiB0eXBlO1xuXG4gICAgICBpZiAodHlwZW9mIENvbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb2x1bW4pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVuZGVyRXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsZXhSZW5kZXIoQ29tcCwgX2V4dGVuZHMoe30sIGluc3RhbmNlLCB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICB9LCBtZXRhLCB7fSwgdXNlclByb3BzKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBmbGV4UmVuZGVyKENvbXAsIHByb3BzKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RDb21wb25lbnQoQ29tcCkgPyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXAsIHByb3BzKSA6IENvbXA7XG4gIH1cblxuICBmdW5jdGlvbiBpc1JlYWN0Q29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgfHwgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0V4b3RpY0NvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29tcG9uZW50KTtcbiAgICAgIHJldHVybiBwcm90by5wcm90b3R5cGUgJiYgcHJvdG8ucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG4gICAgfSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFeG90aWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBjb21wb25lbnQuJCR0eXBlb2YgPT09ICdzeW1ib2wnICYmIFsncmVhY3QubWVtbycsICdyZWFjdC5mb3J3YXJkX3JlZiddLmluY2x1ZGVzKGNvbXBvbmVudC4kJHR5cGVvZi5kZXNjcmlwdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rQ29sdW1uU3RydWN0dXJlKGNvbHVtbnMsIHBhcmVudCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgICAgZGVwdGggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4gPSBfZXh0ZW5kcyh7fSwgY29sdW1uLCB7XG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBkZXB0aDogZGVwdGhcbiAgICAgIH0pO1xuICAgICAgYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKTtcblxuICAgICAgaWYgKGNvbHVtbi5jb2x1bW5zKSB7XG4gICAgICAgIGNvbHVtbi5jb2x1bW5zID0gbGlua0NvbHVtblN0cnVjdHVyZShjb2x1bW4uY29sdW1ucywgY29sdW1uLCBkZXB0aCArIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZsYXR0ZW5Db2x1bW5zKGNvbHVtbnMpIHtcbiAgICByZXR1cm4gZmxhdHRlbkJ5KGNvbHVtbnMsICdjb2x1bW5zJyk7XG4gIH1cbiAgZnVuY3Rpb24gYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgZm9yIHN0cmluZyBhY2Nlc3NvclxuICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgIEhlYWRlciA9IGNvbHVtbi5IZWFkZXI7XG5cbiAgICBpZiAodHlwZW9mIGFjY2Vzc29yID09PSAnc3RyaW5nJykge1xuICAgICAgaWQgPSBpZCB8fCBhY2Nlc3NvcjtcbiAgICAgIHZhciBhY2Nlc3NvclBhdGggPSBhY2Nlc3Nvci5zcGxpdCgnLicpO1xuXG4gICAgICBhY2Nlc3NvciA9IGZ1bmN0aW9uIGFjY2Vzc29yKHJvdykge1xuICAgICAgICByZXR1cm4gZ2V0Qnkocm93LCBhY2Nlc3NvclBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWlkICYmIHR5cGVvZiBIZWFkZXIgPT09ICdzdHJpbmcnICYmIEhlYWRlcikge1xuICAgICAgaWQgPSBIZWFkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFpZCAmJiBjb2x1bW4uY29sdW1ucykge1xuICAgICAgY29uc29sZS5lcnJvcihjb2x1bW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGNvbHVtbiBJRCAob3IgdW5pcXVlIFwiSGVhZGVyXCIgdmFsdWUpIGlzIHJlcXVpcmVkIScpO1xuICAgIH1cblxuICAgIGlmICghaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY29sdW1uKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBjb2x1bW4gSUQgKG9yIHN0cmluZyBhY2Nlc3NvcikgaXMgcmVxdWlyZWQhJyk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGFjY2Vzc29yOiBhY2Nlc3NvclxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgZnVuY3Rpb24gZGVjb3JhdGVDb2x1bW4oY29sdW1uLCB1c2VyRGVmYXVsdENvbHVtbikge1xuICAgIGlmICghdXNlckRlZmF1bHRDb2x1bW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCBfZXh0ZW5kcyh7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSBmYWxsYmFjayBoZWFkZXIsIGp1c3QgaW4gY2FzZVxuICAgICAgSGVhZGVyOiBlbXB0eVJlbmRlcmVyLFxuICAgICAgRm9vdGVyOiBlbXB0eVJlbmRlcmVyXG4gICAgfSwgZGVmYXVsdENvbHVtbiwge30sIHVzZXJEZWZhdWx0Q29sdW1uLCB7fSwgY29sdW1uKSk7XG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIG9yaWdpbmFsV2lkdGg6IGNvbHVtbi53aWR0aFxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH0gLy8gQnVpbGQgdGhlIGhlYWRlciBncm91cHMgZnJvbSB0aGUgYm90dG9tIHVwXG5cbiAgZnVuY3Rpb24gbWFrZUhlYWRlckdyb3VwcyhhbGxDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcykge1xuICAgIGlmIChhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9PT0gdm9pZCAwKSB7XG4gICAgICBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJHcm91cHMgPSBbXTtcbiAgICB2YXIgc2NhbkNvbHVtbnMgPSBhbGxDb2x1bW5zO1xuICAgIHZhciB1aWQgPSAwO1xuXG4gICAgdmFyIGdldFVJRCA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcbiAgICAgIHJldHVybiB1aWQrKztcbiAgICB9O1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBUaGUgaGVhZGVyIGdyb3VwIHdlIGFyZSBjcmVhdGluZ1xuICAgICAgdmFyIGhlYWRlckdyb3VwID0ge1xuICAgICAgICBoZWFkZXJzOiBbXVxuICAgICAgfTsgLy8gVGhlIHBhcmVudCBjb2x1bW5zIHdlJ3JlIGdvaW5nIHRvIHNjYW4gbmV4dFxuXG4gICAgICB2YXIgcGFyZW50Q29sdW1ucyA9IFtdO1xuICAgICAgdmFyIGhhc1BhcmVudHMgPSBzY2FuQ29sdW1ucy5zb21lKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnBhcmVudDtcbiAgICAgIH0pOyAvLyBTY2FuIGVhY2ggY29sdW1uIGZvciBwYXJlbnRzXG5cbiAgICAgIHNjYW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAvLyBXaGF0IGlzIHRoZSBsYXRlc3QgKGxhc3QpIHBhcmVudCBjb2x1bW4/XG4gICAgICAgIHZhciBsYXRlc3RQYXJlbnRDb2x1bW4gPSBbXS5jb25jYXQocGFyZW50Q29sdW1ucykucmV2ZXJzZSgpWzBdO1xuICAgICAgICB2YXIgbmV3UGFyZW50O1xuXG4gICAgICAgIGlmIChoYXNQYXJlbnRzKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBoYXMgYSBwYXJlbnQsIGFkZCBpdCBpZiBuZWNlc3NhcnlcbiAgICAgICAgICBpZiAoY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgbmV3UGFyZW50ID0gX2V4dGVuZHMoe30sIGNvbHVtbi5wYXJlbnQsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogY29sdW1uLnBhcmVudC5pZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5wYXJlbnQuaWQgKyBcIl9cIiArIGdldFVJRCgpLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBbY29sdW1uXVxuICAgICAgICAgICAgfSwgYWRkaXRpb25hbEhlYWRlclByb3BlcnRpZXMoY29sdW1uKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG90aGVyIGNvbHVtbnMgaGF2ZSBwYXJlbnRzLCB3ZSdsbCBuZWVkIHRvIGFkZCBhIHBsYWNlIGhvbGRlciBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbElkID0gY29sdW1uLmlkICsgXCJfcGxhY2Vob2xkZXJcIjtcbiAgICAgICAgICAgIG5ld1BhcmVudCA9IGRlY29yYXRlQ29sdW1uKF9leHRlbmRzKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogb3JpZ2luYWxJZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5pZCArIFwiX3BsYWNlaG9sZGVyX1wiICsgZ2V0VUlEKCksXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyT2Y6IGNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyczogW2NvbHVtbl1cbiAgICAgICAgICAgIH0sIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKGNvbHVtbikpLCBkZWZhdWx0Q29sdW1uKTtcbiAgICAgICAgICB9IC8vIElmIHRoZSByZXN1bHRpbmcgcGFyZW50IGNvbHVtbnMgYXJlIHRoZSBzYW1lLCBqdXN0IGFkZFxuICAgICAgICAgIC8vIHRoZSBjb2x1bW4gYW5kIGluY3JlbWVudCB0aGUgaGVhZGVyIHNwYW5cblxuXG4gICAgICAgICAgaWYgKGxhdGVzdFBhcmVudENvbHVtbiAmJiBsYXRlc3RQYXJlbnRDb2x1bW4ub3JpZ2luYWxJZCA9PT0gbmV3UGFyZW50Lm9yaWdpbmFsSWQpIHtcbiAgICAgICAgICAgIGxhdGVzdFBhcmVudENvbHVtbi5oZWFkZXJzLnB1c2goY29sdW1uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50Q29sdW1ucy5wdXNoKG5ld1BhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycy5wdXNoKGNvbHVtbik7XG4gICAgICB9KTtcbiAgICAgIGhlYWRlckdyb3Vwcy5wdXNoKGhlYWRlckdyb3VwKTsgLy8gU3RhcnQgc2Nhbm5pbmcgdGhlIHBhcmVudCBjb2x1bW5zXG5cbiAgICAgIHNjYW5Db2x1bW5zID0gcGFyZW50Q29sdW1ucztcbiAgICB9O1xuXG4gICAgd2hpbGUgKHNjYW5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyR3JvdXBzLnJldmVyc2UoKTtcbiAgfVxuICB2YXIgcGF0aE9iakNhY2hlID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBnZXRCeShvYmosIHBhdGgsIGRlZikge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB2YXIgY2FjaGVLZXkgPSB0eXBlb2YgcGF0aCA9PT0gJ2Z1bmN0aW9uJyA/IHBhdGggOiBKU09OLnN0cmluZ2lmeShwYXRoKTtcblxuICAgIHZhciBwYXRoT2JqID0gcGF0aE9iakNhY2hlLmdldChjYWNoZUtleSkgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhdGhPYmogPSBtYWtlUGF0aEFycmF5KHBhdGgpO1xuICAgICAgcGF0aE9iakNhY2hlLnNldChjYWNoZUtleSwgcGF0aE9iaik7XG4gICAgICByZXR1cm4gcGF0aE9iajtcbiAgICB9KCk7XG5cbiAgICB2YXIgdmFsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbCA9IHBhdGhPYmoucmVkdWNlKGZ1bmN0aW9uIChjdXJzb3IsIHBhdGhQYXJ0KSB7XG4gICAgICAgIHJldHVybiBjdXJzb3JbcGF0aFBhcnRdO1xuICAgICAgfSwgb2JqKTtcbiAgICB9IGNhdGNoIChlKSB7Ly8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyA/IHZhbCA6IGRlZjtcbiAgfVxuICBmdW5jdGlvbiBnZXRGaXJzdERlZmluZWQoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYXJnc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihhKSB7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZmxhdHRlbkJ5KGFyciwga2V5KSB7XG4gICAgdmFyIGZsYXQgPSBbXTtcblxuICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24gcmVjdXJzZShhcnIpIHtcbiAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIGlmICghZFtrZXldKSB7XG4gICAgICAgICAgZmxhdC5wdXNoKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2UoZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlY3Vyc2UoYXJyKTtcbiAgICByZXR1cm4gZmxhdDtcbiAgfVxuICBmdW5jdGlvbiBleHBhbmRSb3dzKHJvd3MsIF9yZWYpIHtcbiAgICB2YXIgbWFudWFsRXhwYW5kZWRLZXkgPSBfcmVmLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICAgIF9yZWYkZXhwYW5kU3ViUm93cyA9IF9yZWYuZXhwYW5kU3ViUm93cyxcbiAgICAgICAgZXhwYW5kU3ViUm93cyA9IF9yZWYkZXhwYW5kU3ViUm93cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkZXhwYW5kU3ViUm93cztcbiAgICB2YXIgZXhwYW5kZWRSb3dzID0gW107XG5cbiAgICB2YXIgaGFuZGxlUm93ID0gZnVuY3Rpb24gaGFuZGxlUm93KHJvdywgYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgIGlmIChhZGRUb0V4cGFuZGVkUm93cyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGFkZFRvRXhwYW5kZWRSb3dzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcm93LmlzRXhwYW5kZWQgPSByb3cub3JpZ2luYWwgJiYgcm93Lm9yaWdpbmFsW21hbnVhbEV4cGFuZGVkS2V5XSB8fCBleHBhbmRlZFtyb3cuaWRdO1xuICAgICAgcm93LmNhbkV4cGFuZCA9IHJvdy5zdWJSb3dzICYmICEhcm93LnN1YlJvd3MubGVuZ3RoO1xuXG4gICAgICBpZiAoYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgZXhwYW5kZWRSb3dzLnB1c2gocm93KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCAmJiByb3cuaXNFeHBhbmRlZCkge1xuICAgICAgICByb3cuc3ViUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlUm93KHJvdywgZXhwYW5kU3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGhhbmRsZVJvdyhyb3cpO1xuICAgIH0pO1xuICAgIHJldHVybiBleHBhbmRlZFJvd3M7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RmlsdGVyTWV0aG9kKGZpbHRlciwgdXNlckZpbHRlclR5cGVzLCBmaWx0ZXJUeXBlcykge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGZpbHRlcikgfHwgdXNlckZpbHRlclR5cGVzW2ZpbHRlcl0gfHwgZmlsdGVyVHlwZXNbZmlsdGVyXSB8fCBmaWx0ZXJUeXBlcy50ZXh0O1xuICB9XG4gIGZ1bmN0aW9uIHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoYXV0b1JlbW92ZSwgdmFsdWUsIGNvbHVtbikge1xuICAgIHJldHVybiBhdXRvUmVtb3ZlID8gYXV0b1JlbW92ZSh2YWx1ZSwgY29sdW1uKSA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gIH1cbiAgZnVuY3Rpb24gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmcoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC1UYWJsZTogWW91IGhhdmUgbm90IGNhbGxlZCBwcmVwYXJlUm93KHJvdykgb25lIG9yIG1vcmUgcm93cyB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gcmVuZGVyLicpO1xuICB9XG4gIHZhciBwYXNzaXZlU3VwcG9ydGVkID0gbnVsbDtcbiAgZnVuY3Rpb24gcGFzc2l2ZUV2ZW50U3VwcG9ydGVkKCkge1xuICAgIC8vIG1lbW9pemUgc3VwcG9ydCB0byBhdm9pZCBhZGRpbmcgbXVsdGlwbGUgdGVzdCBldmVudHNcbiAgICBpZiAodHlwZW9mIHBhc3NpdmVTdXBwb3J0ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHBhc3NpdmVTdXBwb3J0ZWQ7XG4gICAgdmFyIHN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwYXNzaXZlU3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuICAgIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkO1xuICB9IC8vXG5cbiAgdmFyIHJlT3BlbkJyYWNrZXQgPSAvXFxbL2c7XG4gIHZhciByZUNsb3NlQnJhY2tldCA9IC9cXF0vZztcblxuICBmdW5jdGlvbiBtYWtlUGF0aEFycmF5KG9iaikge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChvYmopIC8vIHJlbW92ZSBhbGwgcGVyaW9kcyBpbiBwYXJ0c1xuICAgIC5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoZCkucmVwbGFjZSgnLicsICdfJyk7XG4gICAgfSkgLy8gam9pbiBwYXJ0cyB1c2luZyBwZXJpb2RcbiAgICAuam9pbignLicpIC8vIHJlcGxhY2UgYnJhY2tldHMgd2l0aCBwZXJpb2RzXG4gICAgLnJlcGxhY2UocmVPcGVuQnJhY2tldCwgJy4nKS5yZXBsYWNlKHJlQ2xvc2VCcmFja2V0LCAnJykgLy8gc3BsaXQgaXQgYmFjayBvdXQgb24gcGVyaW9kc1xuICAgIC5zcGxpdCgnLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyLCBuZXdBcnIpIHtcbiAgICBpZiAobmV3QXJyID09PSB2b2lkIDApIHtcbiAgICAgIG5ld0FyciA9IFtdO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBuZXdBcnIucHVzaChhcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBmbGF0dGVuRGVlcChhcnJbaV0sIG5ld0Fycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0FycjtcbiAgfVxuXG4gIHZhciBkZWZhdWx0R2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZVByb3BzKHByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIHJvbGU6ICd0YWJsZSdcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyhwcm9wcykge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICByb2xlOiAncm93Z3JvdXAnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0SGVhZGVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0SGVhZGVyUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQsXG4gICAgICByb2xlOiAnY29sdW1uaGVhZGVyJ1xuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldEZvb3RlclByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3RlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnRcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRIZWFkZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHMocHJvcHMsIF9yZWYzKSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjMuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJHcm91cF9cIiArIGluZGV4LFxuICAgICAgcm9sZTogJ3JvdydcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3Rlckdyb3VwUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjQuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJHcm91cF9cIiArIGluZGV4XG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Um93UHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Um93UHJvcHMocHJvcHMsIF9yZWY1KSB7XG4gICAgdmFyIHJvdyA9IF9yZWY1LnJvdztcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcInJvd19cIiArIHJvdy5pZCxcbiAgICAgIHJvbGU6ICdyb3cnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Q2VsbFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldENlbGxQcm9wcyhwcm9wcywgX3JlZjYpIHtcbiAgICB2YXIgY2VsbCA9IF9yZWY2LmNlbGw7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJjZWxsX1wiICsgY2VsbC5yb3cuaWQgKyBcIl9cIiArIGNlbGwuY29sdW1uLmlkLFxuICAgICAgcm9sZTogJ2NlbGwnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VEZWZhdWx0UGx1Z2luSG9va3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZU9wdGlvbnM6IFtdLFxuICAgICAgc3RhdGVSZWR1Y2VyczogW10sXG4gICAgICB1c2VDb250cm9sbGVkU3RhdGU6IFtdLFxuICAgICAgY29sdW1uczogW10sXG4gICAgICBjb2x1bW5zRGVwczogW10sXG4gICAgICBhbGxDb2x1bW5zOiBbXSxcbiAgICAgIGFsbENvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGFjY2Vzc1ZhbHVlOiBbXSxcbiAgICAgIG1hdGVyaWFsaXplZENvbHVtbnM6IFtdLFxuICAgICAgbWF0ZXJpYWxpemVkQ29sdW1uc0RlcHM6IFtdLFxuICAgICAgdXNlSW5zdGFuY2VBZnRlckRhdGE6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnM6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGhlYWRlckdyb3VwczogW10sXG4gICAgICBoZWFkZXJHcm91cHNEZXBzOiBbXSxcbiAgICAgIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9uczogW10sXG4gICAgICB1c2VJbnN0YW5jZTogW10sXG4gICAgICBwcmVwYXJlUm93OiBbXSxcbiAgICAgIGdldFRhYmxlUHJvcHM6IFtkZWZhdWx0R2V0VGFibGVQcm9wc10sXG4gICAgICBnZXRUYWJsZUJvZHlQcm9wczogW2RlZmF1bHRHZXRUYWJsZUJvZHlQcm9wc10sXG4gICAgICBnZXRIZWFkZXJHcm91cFByb3BzOiBbZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHNdLFxuICAgICAgZ2V0Rm9vdGVyR3JvdXBQcm9wczogW2RlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzXSxcbiAgICAgIGdldEhlYWRlclByb3BzOiBbZGVmYXVsdEdldEhlYWRlclByb3BzXSxcbiAgICAgIGdldEZvb3RlclByb3BzOiBbZGVmYXVsdEdldEZvb3RlclByb3BzXSxcbiAgICAgIGdldFJvd1Byb3BzOiBbZGVmYXVsdEdldFJvd1Byb3BzXSxcbiAgICAgIGdldENlbGxQcm9wczogW2RlZmF1bHRHZXRDZWxsUHJvcHNdLFxuICAgICAgdXNlRmluYWxJbnN0YW5jZTogW11cbiAgICB9O1xuICB9XG5cbiAgYWN0aW9ucy5yZXNldEhpZGRlbkNvbHVtbnMgPSAncmVzZXRIaWRkZW5Db2x1bW5zJztcbiAgYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uID0gJ3RvZ2dsZUhpZGVDb2x1bW4nO1xuICBhY3Rpb25zLnNldEhpZGRlbkNvbHVtbnMgPSAnc2V0SGlkZGVuQ29sdW1ucyc7XG4gIGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMgPSAndG9nZ2xlSGlkZUFsbENvbHVtbnMnO1xuICB2YXIgdXNlQ29sdW1uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIHVzZUNvbHVtblZpc2liaWxpdHkoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVIaWRkZW5Qcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMpO1xuICAgIGhvb2tzLmhlYWRlckdyb3Vwc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnNdKTtcbiAgICB9KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlKTtcbiAgfTtcbiAgdXNlQ29sdW1uVmlzaWJpbGl0eS5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtblZpc2liaWxpdHknO1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYyLmNvbHVtbjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuKCFlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNvbHVtbi5pc1Zpc2libGUsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBDb2x1bW4gVmlzaWJsZSdcbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVIaWRlQWxsQ29sdW1ucyghZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiAhaW5zdGFuY2UuYWxsQ29sdW1uc0hpZGRlbiAmJiAhaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGgsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ29sdW1ucyBIaWRkZW4nLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogIWluc3RhbmNlLmFsbENvbHVtbnNIaWRkZW4gJiYgaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGhcbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1ucykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBoaWRkZW5Db2x1bW5zOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuaGlkZGVuQ29sdW1ucyB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4pIHtcbiAgICAgIHZhciBzaG91bGQgPSB0eXBlb2YgYWN0aW9uLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IGFjdGlvbi52YWx1ZSA6ICFzdGF0ZS5oaWRkZW5Db2x1bW5zLmluY2x1ZGVzKGFjdGlvbi5jb2x1bW5JZCk7XG4gICAgICB2YXIgaGlkZGVuQ29sdW1ucyA9IHNob3VsZCA/IFtdLmNvbmNhdChzdGF0ZS5oaWRkZW5Db2x1bW5zLCBbYWN0aW9uLmNvbHVtbklkXSkgOiBzdGF0ZS5oaWRkZW5Db2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZCAhPT0gYWN0aW9uLmNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGhpZGRlbkNvbHVtbnNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRIaWRkZW5Db2x1bW5zKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnZhbHVlLCBzdGF0ZS5oaWRkZW5Db2x1bW5zKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVBbGxDb2x1bW5zKSB7XG4gICAgICB2YXIgc2hvdWxkQWxsID0gdHlwZW9mIGFjdGlvbi52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBhY3Rpb24udmFsdWUgOiAhc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IHNob3VsZEFsbCA/IGluc3RhbmNlLmFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQ7XG4gICAgICAgIH0pIDogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBoZWFkZXJzID0gaW5zdGFuY2UuaGVhZGVycyxcbiAgICAgICAgaGlkZGVuQ29sdW1ucyA9IGluc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnM7XG4gICAgdmFyIGlzTW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgICBpZiAoIWlzTW91bnRlZFJlZi5jdXJyZW50KSA7XG5cbiAgICB2YXIgaGFuZGxlQ29sdW1uID0gZnVuY3Rpb24gaGFuZGxlQ29sdW1uKGNvbHVtbiwgcGFyZW50VmlzaWJsZSkge1xuICAgICAgY29sdW1uLmlzVmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgIWhpZGRlbkNvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmlkKTtcbiAgICAgIHZhciB0b3RhbFZpc2libGVIZWFkZXJDb3VudCA9IDA7XG5cbiAgICAgIGlmIChjb2x1bW4uaGVhZGVycyAmJiBjb2x1bW4uaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY29sdW1uLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViQ29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJDb2x1bW4sIGNvbHVtbi5pc1Zpc2libGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gY29sdW1uLmlzVmlzaWJsZSA/IDEgOiAwO1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQgPSB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICAgIHJldHVybiB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICB9O1xuXG4gICAgdmFyIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YkhlYWRlcikge1xuICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJIZWFkZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBoaWRkZW5Db2x1bW5zID0gaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEhpID0gaW5zdGFuY2UuYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyA9IF9pbnN0YW5jZSRhdXRvUmVzZXRIaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRIaTtcbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2UpO1xuICAgIHZhciBhbGxDb2x1bW5zSGlkZGVuID0gYWxsQ29sdW1ucy5sZW5ndGggPT09IGhpZGRlbkNvbHVtbnMubGVuZ3RoO1xuICAgIHZhciB0b2dnbGVIaWRlQ29sdW1uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uLFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHNldEhpZGRlbkNvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlSGlkZUFsbENvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4sXG4gICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb2x1bW4uZ2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGRlblByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGdldEF1dG9SZXNldEhpZGRlbkNvbHVtbnMgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0SGlkZGVuQ29sdW1ucygpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1uc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBhbGxDb2x1bW5zSGlkZGVuOiBhbGxDb2x1bW5zSGlkZGVuLFxuICAgICAgdG9nZ2xlSGlkZUNvbHVtbjogdG9nZ2xlSGlkZUNvbHVtbixcbiAgICAgIHNldEhpZGRlbkNvbHVtbnM6IHNldEhpZGRlbkNvbHVtbnMsXG4gICAgICB0b2dnbGVIaWRlQWxsQ29sdW1uczogdG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzOiBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzXG4gICAgfSk7XG4gIH1cblxuICB2YXIgZGVmYXVsdEluaXRpYWxTdGF0ZSA9IHt9O1xuICB2YXIgZGVmYXVsdENvbHVtbkluc3RhbmNlID0ge307XG5cbiAgdmFyIGRlZmF1bHRSZWR1Y2VyID0gZnVuY3Rpb24gZGVmYXVsdFJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgcHJldlN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0U3ViUm93cyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRTdWJSb3dzKHJvdywgaW5kZXgpIHtcbiAgICByZXR1cm4gcm93LnN1YlJvd3MgfHwgW107XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSb3dJZCA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRSb3dJZChyb3csIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gXCJcIiArIChwYXJlbnQgPyBbcGFyZW50LmlkLCBpbmRleF0uam9pbignLicpIDogaW5kZXgpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0VXNlQ29udHJvbGxlZFN0YXRlID0gZnVuY3Rpb24gZGVmYXVsdFVzZUNvbnRyb2xsZWRTdGF0ZShkKSB7XG4gICAgcmV0dXJuIGQ7XG4gIH07XG5cbiAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0cyhwcm9wcykge1xuICAgIHZhciBfcHJvcHMkaW5pdGlhbFN0YXRlID0gcHJvcHMuaW5pdGlhbFN0YXRlLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfcHJvcHMkaW5pdGlhbFN0YXRlID09PSB2b2lkIDAgPyBkZWZhdWx0SW5pdGlhbFN0YXRlIDogX3Byb3BzJGluaXRpYWxTdGF0ZSxcbiAgICAgICAgX3Byb3BzJGRlZmF1bHRDb2x1bW4gPSBwcm9wcy5kZWZhdWx0Q29sdW1uLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX3Byb3BzJGRlZmF1bHRDb2x1bW4gPT09IHZvaWQgMCA/IGRlZmF1bHRDb2x1bW5JbnN0YW5jZSA6IF9wcm9wcyRkZWZhdWx0Q29sdW1uLFxuICAgICAgICBfcHJvcHMkZ2V0U3ViUm93cyA9IHByb3BzLmdldFN1YlJvd3MsXG4gICAgICAgIGdldFN1YlJvd3MgPSBfcHJvcHMkZ2V0U3ViUm93cyA9PT0gdm9pZCAwID8gZGVmYXVsdEdldFN1YlJvd3MgOiBfcHJvcHMkZ2V0U3ViUm93cyxcbiAgICAgICAgX3Byb3BzJGdldFJvd0lkID0gcHJvcHMuZ2V0Um93SWQsXG4gICAgICAgIGdldFJvd0lkID0gX3Byb3BzJGdldFJvd0lkID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0Um93SWQgOiBfcHJvcHMkZ2V0Um93SWQsXG4gICAgICAgIF9wcm9wcyRzdGF0ZVJlZHVjZXIgPSBwcm9wcy5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9wcm9wcyRzdGF0ZVJlZHVjZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRSZWR1Y2VyIDogX3Byb3BzJHN0YXRlUmVkdWNlcixcbiAgICAgICAgX3Byb3BzJHVzZUNvbnRyb2xsZWRTID0gcHJvcHMudXNlQ29udHJvbGxlZFN0YXRlLFxuICAgICAgICB1c2VDb250cm9sbGVkU3RhdGUgPSBfcHJvcHMkdXNlQ29udHJvbGxlZFMgPT09IHZvaWQgMCA/IGRlZmF1bHRVc2VDb250cm9sbGVkU3RhdGUgOiBfcHJvcHMkdXNlQ29udHJvbGxlZFMsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wiaW5pdGlhbFN0YXRlXCIsIFwiZGVmYXVsdENvbHVtblwiLCBcImdldFN1YlJvd3NcIiwgXCJnZXRSb3dJZFwiLCBcInN0YXRlUmVkdWNlclwiLCBcInVzZUNvbnRyb2xsZWRTdGF0ZVwiXSk7XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGluaXRpYWxTdGF0ZTogaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdENvbHVtbjogZGVmYXVsdENvbHVtbixcbiAgICAgIGdldFN1YlJvd3M6IGdldFN1YlJvd3MsXG4gICAgICBnZXRSb3dJZDogZ2V0Um93SWQsXG4gICAgICBzdGF0ZVJlZHVjZXI6IHN0YXRlUmVkdWNlcixcbiAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZTogdXNlQ29udHJvbGxlZFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgdXNlVGFibGUgPSBmdW5jdGlvbiB1c2VUYWJsZShwcm9wcykge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHBsdWdpbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgcHJvcHNcbiAgICBwcm9wcyA9IGFwcGx5RGVmYXVsdHMocHJvcHMpOyAvLyBBZGQgY29yZSBwbHVnaW5zXG5cbiAgICBwbHVnaW5zID0gW3VzZUNvbHVtblZpc2liaWxpdHldLmNvbmNhdChwbHVnaW5zKTsgLy8gQ3JlYXRlIHRoZSB0YWJsZSBpbnN0YW5jZVxuXG4gICAgdmFyIGluc3RhbmNlUmVmID0gUmVhY3QudXNlUmVmKHt9KTsgLy8gQ3JlYXRlIGEgZ2V0dGVyIGZvciB0aGUgaW5zdGFuY2UgKGhlbHBzIGF2b2lkIGEgbG90IG9mIHBvdGVudGlhbCBtZW1vcnkgbGVha3MpXG5cbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2VSZWYuY3VycmVudCk7IC8vIEFzc2lnbiB0aGUgcHJvcHMsIHBsdWdpbnMgYW5kIGhvb2tzIHRvIHRoZSBpbnN0YW5jZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBob29rczogbWFrZURlZmF1bHRQbHVnaW5Ib29rcygpXG4gICAgfSkpOyAvLyBBbGxvdyBwbHVnaW5zIHRvIHJlZ2lzdGVyIGhvb2tzIGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cbiAgICBwbHVnaW5zLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHBsdWdpbihnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICB9KTsgLy8gQ29uc3VtZSBhbGwgaG9va3MgYW5kIG1ha2UgYSBnZXR0ZXIgZm9yIHRoZW1cblxuICAgIHZhciBnZXRIb29rcyA9IHVzZUdldExhdGVzdChnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICBnZXRJbnN0YW5jZSgpLmdldEhvb2tzID0gZ2V0SG9va3M7XG4gICAgZGVsZXRlIGdldEluc3RhbmNlKCkuaG9va3M7IC8vIEFsbG93IHVzZU9wdGlvbnMgaG9va3MgdG8gbW9kaWZ5IHRoZSBvcHRpb25zIGNvbWluZyBpbnRvIHRoZSB0YWJsZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCByZWR1Y2VIb29rcyhnZXRIb29rcygpLnVzZU9wdGlvbnMsIGFwcGx5RGVmYXVsdHMocHJvcHMpKSk7XG5cbiAgICB2YXIgX2dldEluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgZGF0YSA9IF9nZXRJbnN0YW5jZS5kYXRhLFxuICAgICAgICB1c2VyQ29sdW1ucyA9IF9nZXRJbnN0YW5jZS5jb2x1bW5zLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfZ2V0SW5zdGFuY2UuaW5pdGlhbFN0YXRlLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX2dldEluc3RhbmNlLmRlZmF1bHRDb2x1bW4sXG4gICAgICAgIGdldFN1YlJvd3MgPSBfZ2V0SW5zdGFuY2UuZ2V0U3ViUm93cyxcbiAgICAgICAgZ2V0Um93SWQgPSBfZ2V0SW5zdGFuY2UuZ2V0Um93SWQsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9nZXRJbnN0YW5jZS5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZSA9IF9nZXRJbnN0YW5jZS51c2VDb250cm9sbGVkU3RhdGU7IC8vIFNldHVwIHVzZXIgcmVkdWNlciByZWZcblxuXG4gICAgdmFyIGdldFN0YXRlUmVkdWNlciA9IHVzZUdldExhdGVzdChzdGF0ZVJlZHVjZXIpOyAvLyBCdWlsZCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIHJlZHVjZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgLy8gRGV0ZWN0IGludmFsaWQgYWN0aW9uc1xuICAgICAgaWYgKCFhY3Rpb24udHlwZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQWN0aW9uIPCfkYYnKTtcbiAgICAgIH0gLy8gUmVkdWNlIHRoZSBzdGF0ZSBmcm9tIGFsbCBwbHVnaW4gcmVkdWNlcnNcblxuXG4gICAgICByZXR1cm4gW10uY29uY2F0KGdldEhvb2tzKCkuc3RhdGVSZWR1Y2VycywgQXJyYXkuaXNBcnJheShnZXRTdGF0ZVJlZHVjZXIoKSkgPyBnZXRTdGF0ZVJlZHVjZXIoKSA6IFtnZXRTdGF0ZVJlZHVjZXIoKV0pLnJlZHVjZShmdW5jdGlvbiAocywgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlcihzLCBhY3Rpb24sIHN0YXRlLCBnZXRJbnN0YW5jZSgpKSB8fCBzO1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0U3RhdGVSZWR1Y2VyLCBnZXRJbnN0YW5jZV0pOyAvLyBTdGFydCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIF9SZWFjdCR1c2VSZWR1Y2VyID0gUmVhY3QudXNlUmVkdWNlcihyZWR1Y2VyLCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VyKGluaXRpYWxTdGF0ZSwge1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmluaXRcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgICAgICByZWR1Y2VyU3RhdGUgPSBfUmVhY3QkdXNlUmVkdWNlclswXSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfUmVhY3QkdXNlUmVkdWNlclsxXTsgLy8gQWxsb3cgdGhlIHVzZXIgdG8gY29udHJvbCB0aGUgZmluYWwgc3RhdGUgd2l0aCBob29rc1xuXG5cbiAgICB2YXIgc3RhdGUgPSByZWR1Y2VIb29rcyhbXS5jb25jYXQoZ2V0SG9va3MoKS51c2VDb250cm9sbGVkU3RhdGUsIFt1c2VDb250cm9sbGVkU3RhdGVdKSwgcmVkdWNlclN0YXRlLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24oZ2V0SW5zdGFuY2UoKSwge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoXG4gICAgfSk7IC8vIERlY29yYXRlIEFsbCB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBsaW5rQ29sdW1uU3RydWN0dXJlKHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1ucywgdXNlckNvbHVtbnMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pKTtcbiAgICB9LCBbZ2V0SG9va3MsIGdldEluc3RhbmNlLCB1c2VyQ29sdW1uc10uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1uc0RlcHMsIFtdLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pKSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5jb2x1bW5zID0gY29sdW1uczsgLy8gR2V0IHRoZSBmbGF0IGxpc3Qgb2YgYWxsIGNvbHVtbnMgYW5kIGFsbG93IGhvb2tzIHRvIGRlY29yYXRlXG4gICAgLy8gdGhvc2UgY29sdW1ucyAoYW5kIHRyaWdnZXIgdGhpcyBtZW1vaXphdGlvbiB2aWEgZGVwcylcblxuICAgIHZhciBhbGxDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zLCBmbGF0dGVuQ29sdW1ucyhjb2x1bW5zKSwge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSkubWFwKGFzc2lnbkNvbHVtbkFjY2Vzc29yKTtcbiAgICB9LCBbY29sdW1ucywgZ2V0SG9va3MsIGdldEluc3RhbmNlXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmFsbENvbHVtbnMgPSBhbGxDb2x1bW5zOyAvLyBBY2Nlc3MgdGhlIHJvdyBtb2RlbCB1c2luZyBpbml0aWFsIGNvbHVtbnNcblxuICAgIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgIHZhciBmbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIHJvd3NCeUlkID0ge307XG4gICAgICB2YXIgYWxsQ29sdW1uc1F1ZXVlID0gW10uY29uY2F0KGFsbENvbHVtbnMpO1xuXG4gICAgICB3aGlsZSAoYWxsQ29sdW1uc1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1uc1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgcm93czogcm93cyxcbiAgICAgICAgICBmbGF0Um93czogZmxhdFJvd3MsXG4gICAgICAgICAgcm93c0J5SWQ6IHJvd3NCeUlkLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIGdldFJvd0lkOiBnZXRSb3dJZCxcbiAgICAgICAgICBnZXRTdWJSb3dzOiBnZXRTdWJSb3dzLFxuICAgICAgICAgIGFjY2Vzc1ZhbHVlSG9va3M6IGdldEhvb2tzKCkuYWNjZXNzVmFsdWUsXG4gICAgICAgICAgZ2V0SW5zdGFuY2U6IGdldEluc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgfSwgW2FsbENvbHVtbnMsIGRhdGEsIGdldFJvd0lkLCBnZXRTdWJSb3dzLCBnZXRIb29rcywgZ2V0SW5zdGFuY2VdKSxcbiAgICAgICAgcm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBmbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICByb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdO1xuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCB7XG4gICAgICByb3dzOiByb3dzLFxuICAgICAgaW5pdGlhbFJvd3M6IFtdLmNvbmNhdChyb3dzKSxcbiAgICAgIGZsYXRSb3dzOiBmbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiByb3dzQnlJZCAvLyBtYXRlcmlhbGl6ZWRDb2x1bW5zLFxuXG4gICAgfSk7XG4gICAgbG9vcEhvb2tzKGdldEhvb2tzKCkudXNlSW5zdGFuY2VBZnRlckRhdGEsIGdldEluc3RhbmNlKCkpOyAvLyBHZXQgdGhlIGZsYXQgbGlzdCBvZiBhbGwgY29sdW1ucyBBRlRFUiB0aGUgcm93c1xuICAgIC8vIGhhdmUgYmVlbiBhY2Nlc3MsIGFuZCBhbGxvdyBob29rcyB0byBkZWNvcmF0ZVxuICAgIC8vIHRob3NlIGNvbHVtbnMgKGFuZCB0cmlnZ2VyIHRoaXMgbWVtb2l6YXRpb24gdmlhIGRlcHMpXG5cbiAgICB2YXIgdmlzaWJsZUNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VIb29rcyhnZXRIb29rcygpLnZpc2libGVDb2x1bW5zLCBhbGxDb2x1bW5zLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRlQ29sdW1uKGQsIGRlZmF1bHRDb2x1bW4pO1xuICAgICAgfSk7XG4gICAgfSwgW2dldEhvb2tzLCBhbGxDb2x1bW5zLCBnZXRJbnN0YW5jZSwgZGVmYXVsdENvbHVtbl0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkudmlzaWJsZUNvbHVtbnNEZXBzLCBbXSwge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KSkpOyAvLyBDb21iaW5lIG5ldyB2aXNpYmxlIGNvbHVtbnMgd2l0aCBhbGwgY29sdW1uc1xuXG4gICAgYWxsQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvbHVtbnMgPSBbXS5jb25jYXQodmlzaWJsZUNvbHVtbnMpO1xuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uLmlkO1xuICAgICAgICB9KSkge1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFthbGxDb2x1bW5zLCB2aXNpYmxlQ29sdW1uc10pO1xuICAgIGdldEluc3RhbmNlKCkuYWxsQ29sdW1ucyA9IGFsbENvbHVtbnM7XG5cbiAgICB7XG4gICAgICB2YXIgZHVwbGljYXRlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4sIGkpIHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSkgIT09IGk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGR1cGxpY2F0ZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhhbGxDb2x1bW5zKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIGNvbHVtbnMgd2VyZSBmb3VuZCB3aXRoIGlkczogXFxcIlwiICsgZHVwbGljYXRlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSkuam9pbignLCAnKSArIFwiXFxcIiBpbiB0aGUgY29sdW1ucyBhcnJheSBhYm92ZVwiKTtcbiAgICAgIH1cbiAgICB9IC8vIE1ha2UgdGhlIGhlYWRlckdyb3Vwc1xuXG5cbiAgICB2YXIgaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5oZWFkZXJHcm91cHMsIG1ha2VIZWFkZXJHcm91cHModmlzaWJsZUNvbHVtbnMsIGRlZmF1bHRDb2x1bW4pLCBnZXRJbnN0YW5jZSgpKTtcbiAgICB9LCBbZ2V0SG9va3MsIHZpc2libGVDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBnZXRJbnN0YW5jZV0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuaGVhZGVyR3JvdXBzRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlckdyb3VwcyA9IGhlYWRlckdyb3VwczsgLy8gR2V0IHRoZSBmaXJzdCBsZXZlbCBvZiBoZWFkZXJzXG5cbiAgICB2YXIgaGVhZGVycyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwcy5sZW5ndGggPyBoZWFkZXJHcm91cHNbMF0uaGVhZGVycyA6IFtdO1xuICAgIH0sIFtoZWFkZXJHcm91cHNdKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlcnMgPSBoZWFkZXJzOyAvLyBQcm92aWRlIGEgZmxhdCBoZWFkZXIgbGlzdCBmb3IgdXRpbGl0aWVzXG5cbiAgICBnZXRJbnN0YW5jZSgpLmZsYXRIZWFkZXJzID0gaGVhZGVyR3JvdXBzLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBoZWFkZXJHcm91cCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChhbGwsIGhlYWRlckdyb3VwLmhlYWRlcnMpO1xuICAgIH0sIFtdKTtcbiAgICBsb29wSG9va3MoZ2V0SG9va3MoKS51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMsIGdldEluc3RhbmNlKCkpOyAvLyBGaWx0ZXIgY29sdW1ucyBkb3duIHRvIHZpc2libGUgb25lc1xuXG4gICAgdmFyIHZpc2libGVDb2x1bW5zRGVwID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pc1Zpc2libGU7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pZDtcbiAgICB9KS5zb3J0KCkuam9pbignXycpO1xuICAgIHZpc2libGVDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlzVmlzaWJsZTtcbiAgICAgIH0pO1xuICAgIH0sIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbdmlzaWJsZUNvbHVtbnMsIHZpc2libGVDb2x1bW5zRGVwXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS52aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zOyAvLyBIZWFkZXIgVmlzaWJpbGl0eSBpcyBuZWVkZWQgYnkgdGhpcyBwb2ludFxuXG4gICAgdmFyIF9jYWxjdWxhdGVIZWFkZXJXaWR0aCA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzKSxcbiAgICAgICAgdG90YWxDb2x1bW5zTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGhbMF0sXG4gICAgICAgIHRvdGFsQ29sdW1uc1dpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoWzFdLFxuICAgICAgICB0b3RhbENvbHVtbnNNYXhXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aFsyXTtcblxuICAgIGdldEluc3RhbmNlKCkudG90YWxDb2x1bW5zTWluV2lkdGggPSB0b3RhbENvbHVtbnNNaW5XaWR0aDtcbiAgICBnZXRJbnN0YW5jZSgpLnRvdGFsQ29sdW1uc1dpZHRoID0gdG90YWxDb2x1bW5zV2lkdGg7XG4gICAgZ2V0SW5zdGFuY2UoKS50b3RhbENvbHVtbnNNYXhXaWR0aCA9IHRvdGFsQ29sdW1uc01heFdpZHRoO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUluc3RhbmNlLCBnZXRJbnN0YW5jZSgpKSAvLyBFYWNoIG1hdGVyaWFsaXplZCBoZWFkZXIgbmVlZHMgdG8gYmUgYXNzaWduZWQgYSByZW5kZXIgZnVuY3Rpb24gYW5kIG90aGVyXG4gICAgLy8gcHJvcCBnZXR0ZXIgcHJvcGVydGllcyBoZXJlLlxuICAgIDtcbiAgICBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5mbGF0SGVhZGVycywgZ2V0SW5zdGFuY2UoKS5hbGxDb2x1bW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIC8vIEdpdmUgY29sdW1ucy9oZWFkZXJzIHJlbmRlcmluZyBwb3dlclxuICAgICAgY29sdW1uLnJlbmRlciA9IG1ha2VSZW5kZXJlcihnZXRJbnN0YW5jZSgpLCBjb2x1bW4pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0SGVhZGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEhlYWRlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0Rm9vdGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEZvb3RlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRGb290ZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaGVhZGVyR3JvdXBzLmZpbHRlcihmdW5jdGlvbiAoaGVhZGVyR3JvdXAsIGkpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgaGVhZGVycyBhbmQgaGVhZGVyR3JvdXBzIHRoYXQgZG9uJ3QgaGF2ZSB2aXNpYmxlIGNvbHVtbnNcbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycyA9IGhlYWRlckdyb3VwLmhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICB2YXIgcmVjdXJzZSA9IGZ1bmN0aW9uIHJlY3Vyc2UoaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgICAgICB9KS5sZW5ndGg7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChjb2x1bW4uaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNWaXNpYmxlO1xuICAgICAgICB9KTsgLy8gR2l2ZSBoZWFkZXJHcm91cHMgZ2V0Um93UHJvcHNcblxuICAgICAgICBpZiAoaGVhZGVyR3JvdXAuaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBoZWFkZXJHcm91cC5nZXRIZWFkZXJHcm91cFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJHcm91cFByb3BzLCB7XG4gICAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICAgIGhlYWRlckdyb3VwOiBoZWFkZXJHcm91cCxcbiAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGVhZGVyR3JvdXAuZ2V0Rm9vdGVyR3JvdXBQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Rm9vdGVyR3JvdXBQcm9wcywge1xuICAgICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgICBoZWFkZXJHcm91cDogaGVhZGVyR3JvdXAsXG4gICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSwgW2hlYWRlckdyb3VwcywgZ2V0SW5zdGFuY2UsIGdldEhvb2tzXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5mb290ZXJHcm91cHMgPSBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5oZWFkZXJHcm91cHMpLnJldmVyc2UoKTsgLy8gVGhlIHByZXBhcmVSb3cgZnVuY3Rpb24gaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkgYW5kIE1VU1QgYmUgY2FsbGVkIG9uXG4gICAgLy8gYW55IHJvd3MgdGhlIHVzZXIgd2lzaGVzIHRvIGJlIGRpc3BsYXllZC5cblxuICAgIGdldEluc3RhbmNlKCkucHJlcGFyZVJvdyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJvdy5nZXRSb3dQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Um93UHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIHJvdzogcm93XG4gICAgICB9KTsgLy8gQnVpbGQgdGhlIHZpc2libGUgY2VsbHMgZm9yIGVhY2ggcm93XG5cbiAgICAgIHJvdy5hbGxDZWxscyA9IGFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcm93LnZhbHVlc1tjb2x1bW4uaWRdO1xuICAgICAgICB2YXIgY2VsbCA9IHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTsgLy8gR2l2ZSBlYWNoIGNlbGwgYSBnZXRDZWxsUHJvcHMgYmFzZVxuXG4gICAgICAgIGNlbGwuZ2V0Q2VsbFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRDZWxsUHJvcHMsIHtcbiAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICBjZWxsOiBjZWxsXG4gICAgICAgIH0pOyAvLyBHaXZlIGVhY2ggY2VsbCBhIHJlbmRlcmVyIGZ1bmN0aW9uIChzdXBwb3J0cyBtdWx0aXBsZSByZW5kZXJlcnMpXG5cbiAgICAgICAgY2VsbC5yZW5kZXIgPSBtYWtlUmVuZGVyZXIoZ2V0SW5zdGFuY2UoKSwgY29sdW1uLCB7XG4gICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgY2VsbDogY2VsbCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgfSk7XG4gICAgICByb3cuY2VsbHMgPSB2aXNpYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gcm93LmFsbENlbGxzLmZpbmQoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICByZXR1cm4gY2VsbC5jb2x1bW4uaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gbmVlZCB0byBhcHBseSBhbnkgcm93IHNwZWNpZmljIGhvb2tzICh1c2VFeHBhbmRlZCByZXF1aXJlcyB0aGlzKVxuXG4gICAgICBsb29wSG9va3MoZ2V0SG9va3MoKS5wcmVwYXJlUm93LCByb3csIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0SW5zdGFuY2UsIGFsbENvbHVtbnMsIHZpc2libGVDb2x1bW5zXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5nZXRUYWJsZVByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUYWJsZVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuZ2V0VGFibGVCb2R5UHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRhYmxlQm9keVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUZpbmFsSW5zdGFuY2UsIGdldEluc3RhbmNlKCkpO1xuICAgIHJldHVybiBnZXRJbnN0YW5jZSgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzLCBsZWZ0KSB7XG4gICAgaWYgKGxlZnQgPT09IHZvaWQgMCkge1xuICAgICAgbGVmdCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHN1bVRvdGFsTWluV2lkdGggPSAwO1xuICAgIHZhciBzdW1Ub3RhbFdpZHRoID0gMDtcbiAgICB2YXIgc3VtVG90YWxNYXhXaWR0aCA9IDA7XG4gICAgdmFyIHN1bVRvdGFsRmxleFdpZHRoID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHN1YkhlYWRlcnMgPSBoZWFkZXIuaGVhZGVycztcbiAgICAgIGhlYWRlci50b3RhbExlZnQgPSBsZWZ0O1xuXG4gICAgICBpZiAoc3ViSGVhZGVycyAmJiBzdWJIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgX2NhbGN1bGF0ZUhlYWRlcldpZHRoMiA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhzdWJIZWFkZXJzLCBsZWZ0KSxcbiAgICAgICAgICAgIHRvdGFsTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyWzBdLFxuICAgICAgICAgICAgdG90YWxXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aDJbMV0sXG4gICAgICAgICAgICB0b3RhbE1heFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlsyXSxcbiAgICAgICAgICAgIHRvdGFsRmxleFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlszXTtcblxuICAgICAgICBoZWFkZXIudG90YWxNaW5XaWR0aCA9IHRvdGFsTWluV2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbFdpZHRoID0gdG90YWxXaWR0aDtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSB0b3RhbE1heFdpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxGbGV4V2lkdGggPSB0b3RhbEZsZXhXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlci50b3RhbE1pbldpZHRoID0gaGVhZGVyLm1pbldpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxXaWR0aCA9IE1hdGgubWluKE1hdGgubWF4KGhlYWRlci5taW5XaWR0aCwgaGVhZGVyLndpZHRoKSwgaGVhZGVyLm1heFdpZHRoKTtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSBoZWFkZXIubWF4V2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbEZsZXhXaWR0aCA9IGhlYWRlci5jYW5SZXNpemUgPyBoZWFkZXIudG90YWxXaWR0aCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWFkZXIuaXNWaXNpYmxlKSB7XG4gICAgICAgIGxlZnQgKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWluV2lkdGggKz0gaGVhZGVyLnRvdGFsTWluV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsV2lkdGggKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWF4V2lkdGggKz0gaGVhZGVyLnRvdGFsTWF4V2lkdGg7XG4gICAgICAgIHN1bVRvdGFsRmxleFdpZHRoICs9IGhlYWRlci50b3RhbEZsZXhXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW3N1bVRvdGFsTWluV2lkdGgsIHN1bVRvdGFsV2lkdGgsIHN1bVRvdGFsTWF4V2lkdGgsIHN1bVRvdGFsRmxleFdpZHRoXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oX3JlZikge1xuICAgIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgICByb3dzID0gX3JlZi5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IF9yZWYuZmxhdFJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gX3JlZi5yb3dzQnlJZCxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW4sXG4gICAgICAgIGdldFJvd0lkID0gX3JlZi5nZXRSb3dJZCxcbiAgICAgICAgZ2V0U3ViUm93cyA9IF9yZWYuZ2V0U3ViUm93cyxcbiAgICAgICAgYWNjZXNzVmFsdWVIb29rcyA9IF9yZWYuYWNjZXNzVmFsdWVIb29rcyxcbiAgICAgICAgZ2V0SW5zdGFuY2UgPSBfcmVmLmdldEluc3RhbmNlO1xuXG4gICAgLy8gQWNjZXNzIHRoZSByb3cncyBkYXRhIGNvbHVtbi1ieS1jb2x1bW5cbiAgICAvLyBXZSBkbyBpdCB0aGlzIHdheSBzbyB3ZSBjYW4gaW5jcmVtZW50YWxseSBhZGQgbWF0ZXJpYWxpemVkXG4gICAgLy8gY29sdW1ucyBhZnRlciB0aGUgZmlyc3QgcGFzcyBhbmQgYXZvaWQgZXhjZXNzaXZlIGxvb3BpbmdcbiAgICB2YXIgYWNjZXNzUm93ID0gZnVuY3Rpb24gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgZGVwdGgsIHBhcmVudCwgcGFyZW50Um93cykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UgYXJvdW5kXG4gICAgICB2YXIgb3JpZ2luYWwgPSBvcmlnaW5hbFJvdztcbiAgICAgIHZhciBpZCA9IGdldFJvd0lkKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcGFyZW50KTtcbiAgICAgIHZhciByb3cgPSByb3dzQnlJZFtpZF07IC8vIElmIHRoZSByb3cgaGFzbid0IGJlZW4gY3JlYXRlZCwgbGV0J3MgbWFrZSBpdFxuXG4gICAgICBpZiAoIXJvdykge1xuICAgICAgICByb3cgPSB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICBpbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgIGNlbGxzOiBbe31dIC8vIFRoaXMgaXMgYSBkdW1teSBjZWxsXG5cbiAgICAgICAgfTsgLy8gT3ZlcnJpZGUgY29tbW9uIGFycmF5IGZ1bmN0aW9ucyAoYW5kIHRoZSBkdW1teSBjZWxsJ3MgZ2V0Q2VsbFByb3BzIGZ1bmN0aW9uKVxuICAgICAgICAvLyB0byBzaG93IGFuIGVycm9yIGlmIGl0IGlzIGFjY2Vzc2VkIHdpdGhvdXQgY2FsbGluZyBwcmVwYXJlUm93XG5cbiAgICAgICAgcm93LmNlbGxzLm1hcCA9IHVucHJlcGFyZWRBY2Nlc3NXYXJuaW5nO1xuICAgICAgICByb3cuY2VsbHMuZmlsdGVyID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxscy5mb3JFYWNoID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxsc1swXS5nZXRDZWxsUHJvcHMgPSB1bnByZXBhcmVkQWNjZXNzV2FybmluZzsgLy8gQ3JlYXRlIHRoZSBjZWxscyBhbmQgdmFsdWVzXG5cbiAgICAgICAgcm93LnZhbHVlcyA9IHt9OyAvLyBQdXNoIHRoaXMgcm93IGludG8gdGhlIHBhcmVudFJvd3MgYXJyYXlcblxuICAgICAgICBwYXJlbnRSb3dzLnB1c2gocm93KTsgLy8gS2VlcCB0cmFjayBvZiBldmVyeSByb3cgaW4gYSBmbGF0IGFycmF5XG5cbiAgICAgICAgZmxhdFJvd3MucHVzaChyb3cpOyAvLyBBbHNvIGtlZXAgdHJhY2sgb2YgZXZlcnkgcm93IGJ5IGl0cyBJRFxuXG4gICAgICAgIHJvd3NCeUlkW2lkXSA9IHJvdzsgLy8gR2V0IHRoZSBvcmlnaW5hbCBzdWJyb3dzXG5cbiAgICAgICAgcm93Lm9yaWdpbmFsU3ViUm93cyA9IGdldFN1YlJvd3Mob3JpZ2luYWxSb3csIHJvd0luZGV4KTsgLy8gVGhlbiByZWN1cnNpdmVseSBhY2Nlc3MgdGhlbVxuXG4gICAgICAgIGlmIChyb3cub3JpZ2luYWxTdWJSb3dzKSB7XG4gICAgICAgICAgdmFyIHN1YlJvd3MgPSBbXTtcbiAgICAgICAgICByb3cub3JpZ2luYWxTdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3csIHN1YlJvd3MpO1xuICAgICAgICAgIH0pOyAvLyBLZWVwIHRoZSBuZXcgc3ViUm93cyBhcnJheSBvbiB0aGUgcm93XG5cbiAgICAgICAgICByb3cuc3ViUm93cyA9IHN1YlJvd3M7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocm93LnN1YlJvd3MpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJvdyBleGlzdHMsIHRoZW4gaXQncyBhbHJlYWR5IGJlZW4gYWNjZXNzZWRcbiAgICAgICAgLy8gS2VlcCByZWN1cnNpbmcsIGJ1dCBkb24ndCB3b3JyeSBhYm91dCBwYXNzaW5nIHRoZVxuICAgICAgICAvLyBhY2N1bWxhdG9yIGFycmF5ICh0aG9zZSByb3dzIGFscmVhZHkgZXhpc3QpXG4gICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3cpO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gSWYgdGhlIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3IsIHVzZSBpdCB0byBnZXQgYSB2YWx1ZVxuXG5cbiAgICAgIGlmIChjb2x1bW4uYWNjZXNzb3IpIHtcbiAgICAgICAgcm93LnZhbHVlc1tjb2x1bW4uaWRdID0gY29sdW1uLmFjY2Vzc29yKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcm93LCBwYXJlbnRSb3dzLCBkYXRhKTtcbiAgICAgIH0gLy8gQWxsb3cgcGx1Z2lucyB0byBtYW5pcHVsYXRlIHRoZSBjb2x1bW4gdmFsdWVcblxuXG4gICAgICByb3cudmFsdWVzW2NvbHVtbi5pZF0gPSByZWR1Y2VIb29rcyhhY2Nlc3NWYWx1ZUhvb2tzLCByb3cudmFsdWVzW2NvbHVtbi5pZF0sIHtcbiAgICAgICAgcm93OiByb3csXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAob3JpZ2luYWxSb3csIHJvd0luZGV4KSB7XG4gICAgICByZXR1cm4gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgMCwgdW5kZWZpbmVkLCByb3dzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbnMucmVzZXRFeHBhbmRlZCA9ICdyZXNldEV4cGFuZGVkJztcbiAgYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCA9ICd0b2dnbGVSb3dFeHBhbmRlZCc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkID0gJ3RvZ2dsZUFsbFJvd3NFeHBhbmRlZCc7XG4gIHZhciB1c2VFeHBhbmRlZCA9IGZ1bmN0aW9uIHVzZUV4cGFuZGVkKGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQxKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDEpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93KTtcbiAgfTtcbiAgdXNlRXhwYW5kZWQucGx1Z2luTmFtZSA9ICd1c2VFeHBhbmRlZCc7XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCgpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgQWxsIFJvd3MgRXhwYW5kZWQnXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIHJvdyA9IF9yZWYyLnJvdztcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQoKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIFJvdyBFeHBhbmRlZCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQxKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGV4cGFuZGVkOiB7fVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldEV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGV4cGFuZGVkOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZXhwYW5kZWQgfHwge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVBbGxSb3dzRXhwYW5kZWQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IGluc3RhbmNlLmlzQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQ7XG4gICAgICB2YXIgZXhwYW5kQWxsID0gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogIWlzQWxsUm93c0V4cGFuZGVkO1xuXG4gICAgICBpZiAoZXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBleHBhbmRlZCA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3dzQnlJZCkuZm9yRWFjaChmdW5jdGlvbiAocm93SWQpIHtcbiAgICAgICAgICBleHBhbmRlZFtyb3dJZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBleHBhbmRlZDoge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCkge1xuICAgICAgdmFyIGlkID0gYWN0aW9uLmlkLFxuICAgICAgICAgIHNldEV4cGFuZGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGV4aXN0cyA9IHN0YXRlLmV4cGFuZGVkW2lkXTtcbiAgICAgIHZhciBzaG91bGRFeGlzdCA9IHR5cGVvZiBzZXRFeHBhbmRlZCAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRFeHBhbmRlZCA6ICFleGlzdHM7XG5cbiAgICAgIGlmICghZXhpc3RzICYmIHNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBfZXh0ZW5kcyh7fSwgc3RhdGUuZXhwYW5kZWQsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2lkXSA9IHRydWUsIF9leHRlbmRzMikpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChleGlzdHMgJiYgIXNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfc3RhdGUkZXhwYW5kZWQgPSBzdGF0ZS5leHBhbmRlZCxcbiAgICAgICAgICAgIF8gPSBfc3RhdGUkZXhwYW5kZWRbaWRdLFxuICAgICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9zdGF0ZSRleHBhbmRlZCwgW2lkXS5tYXAoX3RvUHJvcGVydHlLZXkpKTtcblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZXhwYW5kZWQ6IHJlc3RcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkMShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9IGluc3RhbmNlLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBtYW51YWxFeHBhbmRlZEtleSA9IF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9PT0gdm9pZCAwID8gJ2V4cGFuZGVkJyA6IF9pbnN0YW5jZSRtYW51YWxFeHBhbixcbiAgICAgICAgX2luc3RhbmNlJHBhZ2luYXRlRXhwID0gaW5zdGFuY2UucGFnaW5hdGVFeHBhbmRlZFJvd3MsXG4gICAgICAgIHBhZ2luYXRlRXhwYW5kZWRSb3dzID0gX2luc3RhbmNlJHBhZ2luYXRlRXhwID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHBhZ2luYXRlRXhwLFxuICAgICAgICBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPSBpbnN0YW5jZS5leHBhbmRTdWJSb3dzLFxuICAgICAgICBleHBhbmRTdWJSb3dzID0gX2luc3RhbmNlJGV4cGFuZFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGV4cGFuZFN1YlJvLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPSBpbnN0YW5jZS5hdXRvUmVzZXRFeHBhbmRlZCxcbiAgICAgICAgYXV0b1Jlc2V0RXhwYW5kZWQgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0RXgsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICBleHBhbmRlZCA9IGluc3RhbmNlLnN0YXRlLmV4cGFuZGVkLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlU29ydEJ5JywgJ3VzZUdyb3VwQnknLCAndXNlUGl2b3RDb2x1bW5zJywgJ3VzZUdsb2JhbEZpbHRlciddLCAndXNlRXhwYW5kZWQnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RXhwYW5kZWQgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0RXhwYW5kZWQpO1xuICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMocm93c0J5SWQpLmxlbmd0aCAmJiBPYmplY3Qua2V5cyhleHBhbmRlZCkubGVuZ3RoKTtcblxuICAgIGlmIChpc0FsbFJvd3NFeHBhbmRlZCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIWV4cGFuZGVkW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c0V4cGFuZGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSAvLyBCeXBhc3MgYW55IGVmZmVjdHMgZnJvbSBmaXJpbmcgd2hlbiB0aGlzIGNoYW5nZXNcblxuXG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0RXhwYW5kZWQoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldEV4cGFuZGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGF0YV0pO1xuICAgIHZhciB0b2dnbGVSb3dFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpZCwgdmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciB0b2dnbGVBbGxSb3dzRXhwYW5kZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBleHBhbmRlZFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYWdpbmF0ZUV4cGFuZGVkUm93cykge1xuICAgICAgICByZXR1cm4gZXhwYW5kUm93cyhyb3dzLCB7XG4gICAgICAgICAgbWFudWFsRXhwYW5kZWRLZXk6IG1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbcGFnaW5hdGVFeHBhbmRlZFJvd3MsIHJvd3MsIG1hbnVhbEV4cGFuZGVkS2V5LCBleHBhbmRlZCwgZXhwYW5kU3ViUm93c10pO1xuICAgIHZhciBleHBhbmRlZERlcHRoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluZEV4cGFuZGVkRGVwdGgoZXhwYW5kZWQpO1xuICAgIH0sIFtleHBhbmRlZF0pO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgdmFyIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwcmVFeHBhbmRlZFJvd3M6IHJvd3MsXG4gICAgICBleHBhbmRlZFJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIHJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIGV4cGFuZGVkRGVwdGg6IGV4cGFuZGVkRGVwdGgsXG4gICAgICBpc0FsbFJvd3NFeHBhbmRlZDogaXNBbGxSb3dzRXhwYW5kZWQsXG4gICAgICB0b2dnbGVSb3dFeHBhbmRlZDogdG9nZ2xlUm93RXhwYW5kZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzRXhwYW5kZWQ6IHRvZ2dsZUFsbFJvd3NFeHBhbmRlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyhyb3csIF9yZWYzKSB7XG4gICAgdmFyIGdldEhvb2tzID0gX3JlZjMuaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGluc3RhbmNlID0gX3JlZjMuaW5zdGFuY2U7XG5cbiAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUm93RXhwYW5kZWQocm93LmlkLCBzZXQpO1xuICAgIH07XG5cbiAgICByb3cuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgcm93OiByb3dcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRFeHBhbmRlZERlcHRoKGV4cGFuZGVkKSB7XG4gICAgdmFyIG1heERlcHRoID0gMDtcbiAgICBPYmplY3Qua2V5cyhleHBhbmRlZCkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHZhciBzcGxpdElkID0gaWQuc3BsaXQoJy4nKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIHNwbGl0SWQubGVuZ3RoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF4RGVwdGg7XG4gIH1cblxuICB2YXIgdGV4dCA9IGZ1bmN0aW9uIHRleHQocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJvd3MgPSByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFN0cmluZyhmaWx0ZXJWYWx1ZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93cztcbiAgfTtcblxuICB0ZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dCA9IGZ1bmN0aW9uIGV4YWN0VGV4dChyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXhhY3RUZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dENhc2UgPSBmdW5jdGlvbiBleGFjdFRleHRDYXNlKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocm93VmFsdWUpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpIDogdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0VGV4dENhc2UuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyhyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlcy5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlc0FsbCA9IGZ1bmN0aW9uIGluY2x1ZGVzQWxsKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd1ZhbHVlLmluY2x1ZGVzKHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNBbGwuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNTb21lID0gZnVuY3Rpb24gaW5jbHVkZXNTb21lKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gcm93VmFsdWUuaW5jbHVkZXModmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlc1NvbWUuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNWYWx1ZSA9IGZ1bmN0aW9uIGluY2x1ZGVzVmFsdWUocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWUuaW5jbHVkZXMocm93VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNWYWx1ZS5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBleGFjdCA9IGZ1bmN0aW9uIGV4YWN0KHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09PSBmaWx0ZXJWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xuICB9O1xuXG4gIHZhciBlcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09IGZpbHRlclZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXF1YWxzLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbCA9PSBudWxsO1xuICB9O1xuXG4gIHZhciBiZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2Vlbihyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgdmFyIF9yZWYgPSBmaWx0ZXJWYWx1ZSB8fCBbXSxcbiAgICAgICAgbWluID0gX3JlZlswXSxcbiAgICAgICAgbWF4ID0gX3JlZlsxXTtcblxuICAgIG1pbiA9IHR5cGVvZiBtaW4gPT09ICdudW1iZXInID8gbWluIDogLUluZmluaXR5O1xuICAgIG1heCA9IHR5cGVvZiBtYXggPT09ICdudW1iZXInID8gbWF4IDogSW5maW5pdHk7XG5cbiAgICBpZiAobWluID4gbWF4KSB7XG4gICAgICB2YXIgdGVtcCA9IG1pbjtcbiAgICAgIG1pbiA9IG1heDtcbiAgICAgIG1heCA9IHRlbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSA+PSBtaW4gJiYgcm93VmFsdWUgPD0gbWF4O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgYmV0d2Vlbi5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8IHR5cGVvZiB2YWxbMF0gIT09ICdudW1iZXInICYmIHR5cGVvZiB2YWxbMV0gIT09ICdudW1iZXInO1xuICB9O1xuXG4gIHZhciBmaWx0ZXJUeXBlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdGV4dDogdGV4dCxcbiAgICBleGFjdFRleHQ6IGV4YWN0VGV4dCxcbiAgICBleGFjdFRleHRDYXNlOiBleGFjdFRleHRDYXNlLFxuICAgIGluY2x1ZGVzOiBpbmNsdWRlcyxcbiAgICBpbmNsdWRlc0FsbDogaW5jbHVkZXNBbGwsXG4gICAgaW5jbHVkZXNTb21lOiBpbmNsdWRlc1NvbWUsXG4gICAgaW5jbHVkZXNWYWx1ZTogaW5jbHVkZXNWYWx1ZSxcbiAgICBleGFjdDogZXhhY3QsXG4gICAgZXF1YWxzOiBlcXVhbHMsXG4gICAgYmV0d2VlbjogYmV0d2VlblxuICB9KTtcblxuICBhY3Rpb25zLnJlc2V0RmlsdGVycyA9ICdyZXNldEZpbHRlcnMnO1xuICBhY3Rpb25zLnNldEZpbHRlciA9ICdzZXRGaWx0ZXInO1xuICBhY3Rpb25zLnNldEFsbEZpbHRlcnMgPSAnc2V0QWxsRmlsdGVycyc7XG4gIHZhciB1c2VGaWx0ZXJzID0gZnVuY3Rpb24gdXNlRmlsdGVycyhob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDIpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMik7XG4gIH07XG4gIHVzZUZpbHRlcnMucGx1Z2luTmFtZSA9ICd1c2VGaWx0ZXJzJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJDIoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZmlsdGVyczogW11cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRGaWx0ZXJzKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGZpbHRlcnM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5maWx0ZXJzIHx8IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0RmlsdGVyKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBhY3Rpb24uZmlsdGVyVmFsdWU7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC1UYWJsZTogQ291bGQgbm90IGZpbmQgYSBjb2x1bW4gd2l0aCBpZDogXCIgKyBjb2x1bW5JZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoY29sdW1uLmZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgcHJldmlvdXNmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgcHJldmlvdXNmaWx0ZXIgJiYgcHJldmlvdXNmaWx0ZXIudmFsdWUpOyAvL1xuXG4gICAgICBpZiAoc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJNZXRob2QuYXV0b1JlbW92ZSwgbmV3RmlsdGVyLCBjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgIT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldmlvdXNmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBpZiAoZC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBmaWx0ZXJzOiBbXS5jb25jYXQoc3RhdGUuZmlsdGVycywgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICB9XSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRBbGxGaWx0ZXJzKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IGFjdGlvbi5maWx0ZXJzO1xuICAgICAgdmFyIF9hbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgICBfdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICBmaWx0ZXJzOiBmdW5jdGlvbmFsVXBkYXRlKGZpbHRlcnMsIHN0YXRlLmZpbHRlcnMpLmZpbHRlcihmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbiA9IF9hbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBmaWx0ZXIuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGNvbHVtbi5maWx0ZXIsIF91c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmIChzaG91bGRBdXRvUmVtb3ZlRmlsdGVyKGZpbHRlck1ldGhvZC5hdXRvUmVtb3ZlLCBmaWx0ZXIudmFsdWUsIGNvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDIoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIG1hbnVhbEZpbHRlcnMgPSBpbnN0YW5jZS5tYW51YWxGaWx0ZXJzLFxuICAgICAgICBfaW5zdGFuY2UkZGVmYXVsdENhbkYgPSBpbnN0YW5jZS5kZWZhdWx0Q2FuRmlsdGVyLFxuICAgICAgICBkZWZhdWx0Q2FuRmlsdGVyID0gX2luc3RhbmNlJGRlZmF1bHRDYW5GID09PSB2b2lkIDAgPyBmYWxzZSA6IF9pbnN0YW5jZSRkZWZhdWx0Q2FuRixcbiAgICAgICAgZGlzYWJsZUZpbHRlcnMgPSBpbnN0YW5jZS5kaXNhYmxlRmlsdGVycyxcbiAgICAgICAgZmlsdGVycyA9IGluc3RhbmNlLnN0YXRlLmZpbHRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRGaSA9IGluc3RhbmNlLmF1dG9SZXNldEZpbHRlcnMsXG4gICAgICAgIGF1dG9SZXNldEZpbHRlcnMgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RmkgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Rmk7XG4gICAgdmFyIHNldEZpbHRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRGaWx0ZXIsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0QWxsRmlsdGVycyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChmaWx0ZXJzKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0QWxsRmlsdGVycyxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc1xuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgICBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyID0gY29sdW1uLmRlZmF1bHRDYW5GaWx0ZXIsXG4gICAgICAgICAgY29sdW1uRGlzYWJsZUZpbHRlcnMgPSBjb2x1bW4uZGlzYWJsZUZpbHRlcnM7IC8vIERldGVybWluZSBpZiBhIGNvbHVtbiBpcyBmaWx0ZXJhYmxlXG5cbiAgICAgIGNvbHVtbi5jYW5GaWx0ZXIgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyLCBkZWZhdWx0Q2FuRmlsdGVyLCBmYWxzZSk7IC8vIFByb3ZpZGUgdGhlIGNvbHVtbiBhIHdheSBvZiB1cGRhdGluZyB0aGUgZmlsdGVyIHZhbHVlXG5cbiAgICAgIGNvbHVtbi5zZXRGaWx0ZXIgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoY29sdW1uLmlkLCB2YWwpO1xuICAgICAgfTsgLy8gUHJvdmlkZSB0aGUgY3VycmVudCBmaWx0ZXIgdmFsdWUgdG8gdGhlIGNvbHVtbiBmb3JcbiAgICAgIC8vIGNvbnZlbmllbmNlXG5cblxuICAgICAgdmFyIGZvdW5kID0gZmlsdGVycy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmZpbHRlclZhbHVlID0gZm91bmQgJiYgZm91bmQudmFsdWU7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxGaWx0ZXJzIHx8ICFmaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZmlsdGVyZWRSb3dzQnlJZCA9IHt9OyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKHJvd3MsIGRlcHRoKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZGVwdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpbHRlcmVkUm93cyA9IHJvd3M7XG4gICAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcnMucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZFNvRmFyLCBfcmVmKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbklkID0gX3JlZi5pZCxcbiAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlcnMgY29sdW1uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkU29GYXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZpbHRlck1ldGhvZCA9IGdldEZpbHRlck1ldGhvZChjb2x1bW4uZmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmICghZmlsdGVyTWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhIHZhbGlkICdjb2x1bW4uZmlsdGVyJyBmb3IgY29sdW1uIHdpdGggdGhlIElEOiBcIiArIGNvbHVtbi5pZCArIFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH0gLy8gUGFzcyB0aGUgcm93cywgaWQsIGZpbHRlclZhbHVlIGFuZCBjb2x1bW4gdG8gdGhlIGZpbHRlck1ldGhvZFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgZmlsdGVyZWQgcm93cyBiYWNrXG5cblxuICAgICAgICAgIGNvbHVtbi5maWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRTb0ZhciwgW2NvbHVtbklkXSwgZmlsdGVyVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBjb2x1bW4uZmlsdGVyZWRSb3dzO1xuICAgICAgICB9LCByb3dzKTsgLy8gQXBwbHkgdGhlIGZpbHRlciB0byBhbnkgc3ViUm93c1xuICAgICAgICAvLyBXZSB0ZWNobmljYWxseSBjb3VsZCBkbyB0aGlzIHJlY3Vyc2l2ZWx5IGluIHRoZSBhYm92ZSBsb29wLFxuICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBzZXZlcmVseSBoaW5kZXIgdGhlIEFQSSBmb3IgdGhlIHVzZXIsIHNpbmNlIHRoZXlcbiAgICAgICAgLy8gd291bGQgYmUgcmVxdWlyZWQgdG8gZG8gdGhhdCByZWN1cnNpb24gaW4gc29tZSBzY2VuYXJpb3NcblxuICAgICAgICBmaWx0ZXJlZFJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgZmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgZmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93O1xuXG4gICAgICAgICAgaWYgKCFyb3cuc3ViUm93cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdy5zdWJSb3dzID0gcm93LnN1YlJvd3MgJiYgcm93LnN1YlJvd3MubGVuZ3RoID4gMCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSkgOiByb3cuc3ViUm93cztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW2ZpbHRlclJvd3Mocm93cyksIGZpbHRlcmVkRmxhdFJvd3MsIGZpbHRlcmVkUm93c0J5SWRdO1xuICAgIH0sIFttYW51YWxGaWx0ZXJzLCBmaWx0ZXJzLCByb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGFsbENvbHVtbnMsIHVzZXJGaWx0ZXJUeXBlc10pLFxuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBmaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE5vdyB0aGF0IGVhY2ggZmlsdGVyZWQgY29sdW1uIGhhcyBpdCdzIHBhcnRpYWxseSBmaWx0ZXJlZCByb3dzLFxuICAgICAgLy8gbGV0cyBhc3NpZ24gdGhlIGZpbmFsIGZpbHRlcmVkIHJvd3MgdG8gYWxsIG9mIHRoZSBvdGhlciBjb2x1bW5zXG4gICAgICB2YXIgbm9uRmlsdGVyZWRDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gIWZpbHRlcnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW4uaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIFRoaXMgZXNzZW50aWFsbHkgZW5hYmxlcyBmYWNldGVkIGZpbHRlciBvcHRpb25zIHRvIGJlIGJ1aWx0IGVhc2lseVxuICAgICAgLy8gdXNpbmcgZXZlcnkgY29sdW1uJ3MgcHJlRmlsdGVyZWRSb3dzIHZhbHVlXG5cbiAgICAgIG5vbkZpbHRlcmVkQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgICAgY29sdW1uLmZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgIH0pO1xuICAgIH0sIFtmaWx0ZXJlZFJvd3MsIGZpbHRlcnMsIGFsbENvbHVtbnNdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RmlsdGVycyA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRGaWx0ZXJzKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRGaWx0ZXJzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRGaWx0ZXJzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgbWFudWFsRmlsdGVycyA/IG51bGwgOiBkYXRhXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcHJlRmlsdGVyZWRSb3dzOiByb3dzLFxuICAgICAgcHJlRmlsdGVyZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBwcmVGaWx0ZXJlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGZpbHRlcmVkUm93czogZmlsdGVyZWRSb3dzLFxuICAgICAgZmlsdGVyZWRGbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIGZpbHRlcmVkUm93c0J5SWQ6IGZpbHRlcmVkUm93c0J5SWQsXG4gICAgICByb3dzOiBmaWx0ZXJlZFJvd3MsXG4gICAgICBmbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiBmaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgc2V0RmlsdGVyOiBzZXRGaWx0ZXIsXG4gICAgICBzZXRBbGxGaWx0ZXJzOiBzZXRBbGxGaWx0ZXJzXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyID0gJ3Jlc2V0R2xvYmFsRmlsdGVyJztcbiAgYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIgPSAnc2V0R2xvYmFsRmlsdGVyJztcbiAgdmFyIHVzZUdsb2JhbEZpbHRlciA9IGZ1bmN0aW9uIHVzZUdsb2JhbEZpbHRlcihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDMpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMyk7XG4gIH07XG4gIHVzZUdsb2JhbEZpbHRlci5wbHVnaW5OYW1lID0gJ3VzZUdsb2JhbEZpbHRlcic7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQzKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdsb2JhbEZpbHRlcjogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLmdsb2JhbEZpbHRlciB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIpIHtcbiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGFjdGlvbi5maWx0ZXJWYWx1ZTtcbiAgICAgIHZhciB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS51c2VyRmlsdGVyVHlwZXM7XG4gICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGluc3RhbmNlLmdsb2JhbEZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgc3RhdGUuZ2xvYmFsRmlsdGVyKTsgLy9cblxuICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyTWV0aG9kLmF1dG9SZW1vdmUsIG5ld0ZpbHRlcikpIHtcbiAgICAgICAgdmFyIGdsb2JhbEZpbHRlciA9IHN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgICAgIHN0YXRlV2l0aG91dEdsb2JhbEZpbHRlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHN0YXRlLCBbXCJnbG9iYWxGaWx0ZXJcIl0pO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVdpdGhvdXRHbG9iYWxGaWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyOiBuZXdGaWx0ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDMoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IGluc3RhbmNlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgbWFudWFsR2xvYmFsRmlsdGVyID0gaW5zdGFuY2UubWFudWFsR2xvYmFsRmlsdGVyLFxuICAgICAgICBnbG9iYWxGaWx0ZXJWYWx1ZSA9IGluc3RhbmNlLnN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEdsID0gaW5zdGFuY2UuYXV0b1Jlc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgICBhdXRvUmVzZXRHbG9iYWxGaWx0ZXIgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wsXG4gICAgICAgIGRpc2FibGVHbG9iYWxGaWx0ZXIgPSBpbnN0YW5jZS5kaXNhYmxlR2xvYmFsRmlsdGVyO1xuICAgIHZhciBzZXRHbG9iYWxGaWx0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7IC8vIFRPRE86IENyZWF0ZSBhIGZpbHRlciBjYWNoZSBmb3IgaW5jcmVtZW50YWwgaGlnaCBzcGVlZCBtdWx0aS1maWx0ZXJpbmdcbiAgICAvLyBUaGlzIGdldHMgcHJldHR5IGNvbXBsaWNhdGVkIHByZXR0eSBmYXN0LCBzaW5jZSB5b3UgaGF2ZSB0byBtYWludGFpbiBhXG4gICAgLy8gY2FjaGUgZm9yIGVhY2ggcm93IGdyb3VwICh0b3AtbGV2ZWwgcm93cywgYW5kIGVhY2ggcm93J3MgcmVjdXJzaXZlIHN1YnJvd3MpXG4gICAgLy8gVGhpcyB3b3VsZCBtYWtlIG11bHRpLWZpbHRlcmluZyBhIGxvdCBmYXN0ZXIgdGhvdWdoLiBUb28gZmFyP1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR2xvYmFsRmlsdGVyIHx8IHR5cGVvZiBnbG9iYWxGaWx0ZXJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlsdGVyZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIGZpbHRlcmVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgaWYgKCFmaWx0ZXJNZXRob2QpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IGZpbmQgYSB2YWxpZCAnZ2xvYmFsRmlsdGVyJyBvcHRpb24uXCIpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cblxuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIGNvbHVtbkRpc2FibGVHbG9iYWxGaWx0ZXIgPSBjb2x1bW4uZGlzYWJsZUdsb2JhbEZpbHRlcjtcbiAgICAgICAgY29sdW1uLmNhbkZpbHRlciA9IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlR2xvYmFsRmlsdGVyID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHbG9iYWxGaWx0ZXIgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBmaWx0ZXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmNhbkZpbHRlciA9PT0gdHJ1ZTtcbiAgICAgIH0pOyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKGZpbHRlcmVkUm93cykge1xuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRSb3dzLCBmaWx0ZXJhYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSksIGdsb2JhbEZpbHRlclZhbHVlKTtcbiAgICAgICAgZmlsdGVyZWRSb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIGZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICAgIGZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvdztcbiAgICAgICAgICByb3cuc3ViUm93cyA9IHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MpIDogcm93LnN1YlJvd3M7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtmaWx0ZXJSb3dzKHJvd3MpLCBmaWx0ZXJlZEZsYXRSb3dzLCBmaWx0ZXJlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR2xvYmFsRmlsdGVyLCBnbG9iYWxGaWx0ZXJWYWx1ZSwgZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMsIGFsbENvbHVtbnMsIHJvd3MsIGZsYXRSb3dzLCByb3dzQnlJZCwgZGlzYWJsZUdsb2JhbEZpbHRlcl0pLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldEdsb2JhbEZpbHRlcik7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRHbG9iYWxGaWx0ZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxHbG9iYWxGaWx0ZXIgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkUm93czogcm93cyxcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGZsYXRSb3dzLFxuICAgICAgcHJlR2xvYmFsRmlsdGVyZWRSb3dzQnlJZDogcm93c0J5SWQsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3M6IGdsb2JhbEZpbHRlcmVkUm93cyxcbiAgICAgIGdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkOiBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgcm93czogZ2xvYmFsRmlsdGVyZWRSb3dzLFxuICAgICAgZmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ2xvYmFsRmlsdGVyZWRSb3dzQnlJZCxcbiAgICAgIHNldEdsb2JhbEZpbHRlcjogc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgZGlzYWJsZUdsb2JhbEZpbHRlcjogZGlzYWJsZUdsb2JhbEZpbHRlclxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3VtKHZhbHVlcywgYWdncmVnYXRlZFZhbHVlcykge1xuICAgIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3QgYWRkIHRoZSBhZ2dyZWdhdGlvbnMgdG9nZXRoZXIgaW5zdGVhZCBvZlxuICAgIC8vIHByb2Nlc3MgbGVhZiBub2RlcyBpbmRpdmlkdWFsbHlcbiAgICByZXR1cm4gYWdncmVnYXRlZFZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgbmV4dCkge1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgbmV4dCA9PT0gJ251bWJlcicgPyBuZXh0IDogMCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgZnVuY3Rpb24gbWluKHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW47XG4gIH1cbiAgZnVuY3Rpb24gbWF4KHZhbHVlcykge1xuICAgIHZhciBtYXggPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtYXg7XG4gIH1cbiAgZnVuY3Rpb24gbWluTWF4KHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YXIgbWF4ID0gdmFsdWVzWzBdIHx8IDA7XG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1pbiArIFwiLi5cIiArIG1heDtcbiAgfVxuICBmdW5jdGlvbiBhdmVyYWdlKHZhbHVlcykge1xuICAgIHJldHVybiBzdW0obnVsbCwgdmFsdWVzKSAvIHZhbHVlcy5sZW5ndGg7XG4gIH1cbiAgZnVuY3Rpb24gbWVkaWFuKHZhbHVlcykge1xuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgIHZhciBudW1zID0gW10uY29uY2F0KHZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoICUgMiAhPT0gMCA/IG51bXNbbWlkXSA6IChudW1zW21pZCAtIDFdICsgbnVtc1ttaWRdKSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlKHZhbHVlcykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKS52YWx1ZXMoKSk7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlQ291bnQodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKS5zaXplO1xuICB9XG4gIGZ1bmN0aW9uIGNvdW50KHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9XG5cbiAgdmFyIGFnZ3JlZ2F0aW9ucyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgc3VtOiBzdW0sXG4gICAgbWluOiBtaW4sXG4gICAgbWF4OiBtYXgsXG4gICAgbWluTWF4OiBtaW5NYXgsXG4gICAgYXZlcmFnZTogYXZlcmFnZSxcbiAgICBtZWRpYW46IG1lZGlhbixcbiAgICB1bmlxdWU6IHVuaXF1ZSxcbiAgICB1bmlxdWVDb3VudDogdW5pcXVlQ291bnQsXG4gICAgY291bnQ6IGNvdW50XG4gIH0pO1xuXG4gIHZhciBlbXB0eUFycmF5ID0gW107XG4gIHZhciBlbXB0eU9iamVjdCA9IHt9OyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldEdyb3VwQnkgPSAncmVzZXRHcm91cEJ5JztcbiAgYWN0aW9ucy5zZXRHcm91cEJ5ID0gJ3NldEdyb3VwQnknO1xuICBhY3Rpb25zLnRvZ2dsZUdyb3VwQnkgPSAndG9nZ2xlR3JvdXBCeSc7XG4gIHZhciB1c2VHcm91cEJ5ID0gZnVuY3Rpb24gdXNlR3JvdXBCeShob29rcykge1xuICAgIGhvb2tzLmdldEdyb3VwQnlUb2dnbGVQcm9wcyA9IFtkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ0KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgICB9KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1ucy5wdXNoKHZpc2libGVDb2x1bW5zKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDQpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDEpO1xuICB9O1xuICB1c2VHcm91cEJ5LnBsdWdpbk5hbWUgPSAndXNlR3JvdXBCeSc7XG5cbiAgdmFyIGRlZmF1bHRHZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmMi5oZWFkZXI7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogaGVhZGVyLmNhbkdyb3VwQnkgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZUdyb3VwQnkoKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGhlYWRlci5jYW5Hcm91cEJ5ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgR3JvdXBCeSdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ0KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGdyb3VwQnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R3JvdXBCeSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncm91cEJ5OiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZ3JvdXBCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEdyb3VwQnkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVHcm91cEJ5KSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgc2V0R3JvdXBCeSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZEdyb3VwQnkgPSB0eXBlb2Ygc2V0R3JvdXBCeSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRHcm91cEJ5IDogIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoY29sdW1uSWQpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRHcm91cEJ5KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncm91cEJ5OiBbXS5jb25jYXQoc3RhdGUuZ3JvdXBCeSwgW2NvbHVtbklkXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogc3RhdGUuZ3JvdXBCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyhjb2x1bW5zLCBfcmVmMykge1xuICAgIHZhciBncm91cEJ5ID0gX3JlZjMuaW5zdGFuY2Uuc3RhdGUuZ3JvdXBCeTtcbiAgICAvLyBTb3J0IGdyb3VwZWQgY29sdW1ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbiBsaXN0XG4gICAgLy8gYmVmb3JlIHRoZSBoZWFkZXJzIGFyZSBidWlsdFxuICAgIHZhciBncm91cEJ5Q29sdW1ucyA9IGdyb3VwQnkubWFwKGZ1bmN0aW9uIChnKSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5pZCA9PT0gZztcbiAgICAgIH0pO1xuICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICB2YXIgbm9uR3JvdXBCeUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gIWdyb3VwQnkuaW5jbHVkZXMoY29sLmlkKTtcbiAgICB9KTtcbiAgICBjb2x1bW5zID0gW10uY29uY2F0KGdyb3VwQnlDb2x1bW5zLCBub25Hcm91cEJ5Q29sdW1ucyk7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc0dyb3VwZWQgPSBncm91cEJ5LmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4uZ3JvdXBlZEluZGV4ID0gZ3JvdXBCeS5pbmRleE9mKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICB2YXIgZGVmYXVsdFVzZXJBZ2dyZWdhdGlvbnMgPSB7fTtcblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ0KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZmxhdFJvd3MgPSBpbnN0YW5jZS5mbGF0Um93cyxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIF9pbnN0YW5jZSRncm91cEJ5Rm4gPSBpbnN0YW5jZS5ncm91cEJ5Rm4sXG4gICAgICAgIGdyb3VwQnlGbiA9IF9pbnN0YW5jZSRncm91cEJ5Rm4gPT09IHZvaWQgMCA/IGRlZmF1bHRHcm91cEJ5Rm4gOiBfaW5zdGFuY2UkZ3JvdXBCeUZuLFxuICAgICAgICBtYW51YWxHcm91cEJ5ID0gaW5zdGFuY2UubWFudWFsR3JvdXBCeSxcbiAgICAgICAgX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID0gaW5zdGFuY2UuYWdncmVnYXRpb25zLFxuICAgICAgICB1c2VyQWdncmVnYXRpb25zID0gX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID09PSB2b2lkIDAgPyBkZWZhdWx0VXNlckFnZ3JlZ2F0aW9ucyA6IF9pbnN0YW5jZSRhZ2dyZWdhdGlvbixcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGdyb3VwQnkgPSBpbnN0YW5jZS5zdGF0ZS5ncm91cEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0R3IgPSBpbnN0YW5jZS5hdXRvUmVzZXRHcm91cEJ5LFxuICAgICAgICBhdXRvUmVzZXRHcm91cEJ5ID0gX2luc3RhbmNlJGF1dG9SZXNldEdyID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldEdyLFxuICAgICAgICBkaXNhYmxlR3JvdXBCeSA9IGluc3RhbmNlLmRpc2FibGVHcm91cEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuR3JvdXBCeSA9IGluc3RhbmNlLmRlZmF1bHRDYW5Hcm91cEJ5LFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQ29sdW1uT3JkZXInLCAndXNlRmlsdGVycyddLCAndXNlR3JvdXBCeScpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uR3JvdXBCeSA9IGNvbHVtbi5kZWZhdWx0R3JvdXBCeSxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlR3JvdXBCeSA9IGNvbHVtbi5kaXNhYmxlR3JvdXBCeTtcbiAgICAgIGNvbHVtbi5jYW5Hcm91cEJ5ID0gYWNjZXNzb3IgPyBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhbkdyb3VwQnksIGNvbHVtbkRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpIDogZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbi5jYW5Hcm91cEJ5LCBkZWZhdWx0Q29sdW1uR3JvdXBCeSwgZGVmYXVsdENhbkdyb3VwQnksIGZhbHNlKTtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Hcm91cEJ5KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVHcm91cEJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVHcm91cEJ5KGNvbHVtbi5pZCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbi5BZ2dyZWdhdGVkID0gY29sdW1uLkFnZ3JlZ2F0ZWQgfHwgY29sdW1uLkNlbGw7XG4gICAgfSk7XG4gICAgdmFyIHRvZ2dsZUdyb3VwQnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoY29sdW1uSWQsIHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlR3JvdXBCeSxcbiAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBzZXRHcm91cEJ5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0R3JvdXBCeSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIGhlYWRlci5nZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEdyb3VwQnlUb2dnbGVQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR3JvdXBCeSB8fCAhZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGVtcHR5QXJyYXksIGVtcHR5T2JqZWN0LCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfSAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdCBvZiBmaWx0ZXJlZCBjb2x1bW5zIGV4aXN0XG5cblxuICAgICAgdmFyIGV4aXN0aW5nR3JvdXBCeSA9IGdyb3VwQnkuZmlsdGVyKGZ1bmN0aW9uIChnKSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IGc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIEZpbmQgdGhlIGNvbHVtbnMgdGhhdCBjYW4gb3IgYXJlIGFnZ3JlZ2F0aW5nXG4gICAgICAvLyBVc2VzIGVhY2ggY29sdW1uIHRvIGFnZ3JlZ2F0ZSByb3dzIGludG8gYSBzaW5nbGUgdmFsdWVcblxuICAgICAgdmFyIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyA9IGZ1bmN0aW9uIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyhsZWFmUm93cywgZ3JvdXBlZFJvd3MsIGRlcHRoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAvLyBEb24ndCBhZ2dyZWdhdGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXBCeVxuICAgICAgICAgIGlmIChleGlzdGluZ0dyb3VwQnkuaW5jbHVkZXMoY29sdW1uLmlkKSkge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBncm91cGVkUm93c1swXSA/IGdyb3VwZWRSb3dzWzBdLnZhbHVlc1tjb2x1bW4uaWRdIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIEFnZ3JlZ2F0ZSB0aGUgdmFsdWVzXG5cblxuICAgICAgICAgIHZhciBhZ2dyZWdhdGVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlID09PSAnZnVuY3Rpb24nID8gY29sdW1uLmFnZ3JlZ2F0ZSA6IHVzZXJBZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVdO1xuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZuKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcbiAgICAgICAgICAgIHZhciBncm91cGVkVmFsdWVzID0gZ3JvdXBlZFJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJvdy52YWx1ZXNbY29sdW1uLmlkXTtcbiAgICAgICAgICAgIH0pOyAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcblxuICAgICAgICAgICAgdmFyIGxlYWZWYWx1ZXMgPSBsZWFmUm93cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICB2YXIgY29sdW1uVmFsdWUgPSByb3cudmFsdWVzW2NvbHVtbi5pZF07XG5cbiAgICAgICAgICAgICAgaWYgKCFkZXB0aCAmJiBjb2x1bW4uYWdncmVnYXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWdncmVnYXRlVmFsdWVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlVmFsdWUgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uYWdncmVnYXRlVmFsdWUgOiB1c2VyQWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlRm4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0IFRhYmxlOiBJbnZhbGlkIGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSBvcHRpb24gZm9yIGNvbHVtbiBsaXN0ZWQgYWJvdmVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZUZuKGNvbHVtblZhbHVlLCByb3csIGNvbHVtbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhbHVlc1tjb2x1bW4uaWRdID0gYWdncmVnYXRlRm4obGVhZlZhbHVlcywgZ3JvdXBlZFZhbHVlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uYWdncmVnYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdCBUYWJsZTogSW52YWxpZCBjb2x1bW4uYWdncmVnYXRlIG9wdGlvbiBmb3IgY29sdW1uIGxpc3RlZCBhYm92ZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZ3JvdXBlZFJvd3NCeUlkID0ge307XG4gICAgICB2YXIgb25seUdyb3VwZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIG9ubHlHcm91cGVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBub25Hcm91cGVkRmxhdFJvd3MgPSBbXTtcbiAgICAgIHZhciBub25Hcm91cGVkUm93c0J5SWQgPSB7fTsgLy8gUmVjdXJzaXZlbHkgZ3JvdXAgdGhlIGRhdGFcblxuICAgICAgdmFyIGdyb3VwVXBSZWN1cnNpdmVseSA9IGZ1bmN0aW9uIGdyb3VwVXBSZWN1cnNpdmVseShyb3dzLCBkZXB0aCwgcGFyZW50SWQpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgICBkZXB0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGxldmVsLCBqdXN0IHJldHVybiB0aGUgcm93c1xuICAgICAgICBpZiAoZGVwdGggPT09IGV4aXN0aW5nR3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb2x1bW5JZCA9IGV4aXN0aW5nR3JvdXBCeVtkZXB0aF07IC8vIEdyb3VwIHRoZSByb3dzIHRvZ2V0aGVyIGZvciB0aGlzIGxldmVsXG5cbiAgICAgICAgdmFyIHJvd0dyb3Vwc01hcCA9IGdyb3VwQnlGbihyb3dzLCBjb2x1bW5JZCk7IC8vIFBlZm9ybSBhZ2dyZWdhdGlvbnMgZm9yIGVhY2ggZ3JvdXBcblxuICAgICAgICB2YXIgYWdncmVnYXRlZEdyb3VwZWRSb3dzID0gT2JqZWN0LmVudHJpZXMocm93R3JvdXBzTWFwKS5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgIHZhciBncm91cEJ5VmFsID0gX3JlZjRbMF0sXG4gICAgICAgICAgICAgIGdyb3VwZWRSb3dzID0gX3JlZjRbMV07XG4gICAgICAgICAgdmFyIGlkID0gY29sdW1uSWQgKyBcIjpcIiArIGdyb3VwQnlWYWw7XG4gICAgICAgICAgaWQgPSBwYXJlbnRJZCA/IHBhcmVudElkICsgXCI+XCIgKyBpZCA6IGlkOyAvLyBGaXJzdCwgUmVjdXJzZSB0byBncm91cCBzdWIgcm93cyBiZWZvcmUgYWdncmVnYXRpb25cblxuICAgICAgICAgIHZhciBzdWJSb3dzID0gZ3JvdXBVcFJlY3Vyc2l2ZWx5KGdyb3VwZWRSb3dzLCBkZXB0aCArIDEsIGlkKTsgLy8gRmxhdHRlbiB0aGUgbGVhZiByb3dzIG9mIHRoZSByb3dzIGluIHRoaXMgZ3JvdXBcblxuICAgICAgICAgIHZhciBsZWFmUm93cyA9IGRlcHRoID8gZmxhdHRlbkJ5KGdyb3VwZWRSb3dzLCAnbGVhZlJvd3MnKSA6IGdyb3VwZWRSb3dzO1xuICAgICAgICAgIHZhciB2YWx1ZXMgPSBhZ2dyZWdhdGVSb3dzVG9WYWx1ZXMobGVhZlJvd3MsIGdyb3VwZWRSb3dzLCBkZXB0aCk7XG4gICAgICAgICAgdmFyIHJvdyA9IHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGlzR3JvdXBlZDogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwQnlJRDogY29sdW1uSWQsXG4gICAgICAgICAgICBncm91cEJ5VmFsOiBncm91cEJ5VmFsLFxuICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICBzdWJSb3dzOiBzdWJSb3dzLFxuICAgICAgICAgICAgbGVhZlJvd3M6IGxlYWZSb3dzLFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKHN1YlJvdykge1xuICAgICAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgIGdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuXG4gICAgICAgICAgICBpZiAoc3ViUm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgb25seUdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGVkR3JvdXBlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZFJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkocm93cyk7XG4gICAgICBncm91cGVkUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJSb3cpIHtcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgZ3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG5cbiAgICAgICAgaWYgKHN1YlJvdy5pc0dyb3VwZWQpIHtcbiAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIEFzc2lnbiB0aGUgbmV3IGRhdGFcblxuICAgICAgcmV0dXJuIFtncm91cGVkUm93cywgZ3JvdXBlZEZsYXRSb3dzLCBncm91cGVkUm93c0J5SWQsIG9ubHlHcm91cGVkRmxhdFJvd3MsIG9ubHlHcm91cGVkUm93c0J5SWQsIG5vbkdyb3VwZWRGbGF0Um93cywgbm9uR3JvdXBlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR3JvdXBCeSwgZ3JvdXBCeSwgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkLCBhbGxDb2x1bW5zLCB1c2VyQWdncmVnYXRpb25zLCBncm91cEJ5Rm5dKSxcbiAgICAgICAgZ3JvdXBlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIGdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdLFxuICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bM10sXG4gICAgICAgIG9ubHlHcm91cGVkUm93c0J5SWQgPSBfUmVhY3QkdXNlTWVtb1s0XSxcbiAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bNV0sXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzZdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldEdyb3VwQnkgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0R3JvdXBCeSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R3JvdXBCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0R3JvdXBCeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbnVhbEdyb3VwQnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdyb3VwZWRSb3dzOiByb3dzLFxuICAgICAgcHJlR3JvdXBlZEZsYXRSb3c6IGZsYXRSb3dzLFxuICAgICAgcHJlR3JvdXBlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGdyb3VwZWRSb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGdyb3VwZWRGbGF0Um93czogZ3JvdXBlZEZsYXRSb3dzLFxuICAgICAgZ3JvdXBlZFJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzOiBvbmx5R3JvdXBlZEZsYXRSb3dzLFxuICAgICAgb25seUdyb3VwZWRSb3dzQnlJZDogb25seUdyb3VwZWRSb3dzQnlJZCxcbiAgICAgIG5vbkdyb3VwZWRGbGF0Um93czogbm9uR3JvdXBlZEZsYXRSb3dzLFxuICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkOiBub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICByb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBncm91cGVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ3JvdXBlZFJvd3NCeUlkLFxuICAgICAgdG9nZ2xlR3JvdXBCeTogdG9nZ2xlR3JvdXBCeSxcbiAgICAgIHNldEdyb3VwQnk6IHNldEdyb3VwQnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMShyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgdmFyIF9yb3ckc3ViUm93cztcblxuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIGdyb3VwQnkgYW5kIHRoZSBwaXZvdCBjZWxsIGZvciB0aGUgcm93XG4gICAgICBjZWxsLmlzR3JvdXBlZCA9IGNlbGwuY29sdW1uLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pZCA9PT0gcm93Lmdyb3VwQnlJRDsgLy8gUGxhY2Vob2xkZXIgY2VsbHMgYXJlIGFueSBjb2x1bW5zIGluIHRoZSBncm91cEJ5IHRoYXQgYXJlIG5vdCBncm91cGVkXG5cbiAgICAgIGNlbGwuaXNQbGFjZWhvbGRlciA9ICFjZWxsLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pc0dyb3VwZWQ7IC8vIEFnZ3JlZ2F0ZWQgY2VsbHMgYXJlIG5vdCBncm91cGVkLCBub3QgcmVwZWF0ZWQsIGJ1dCBzdGlsbCBoYXZlIHN1YlJvd3NcblxuICAgICAgY2VsbC5pc0FnZ3JlZ2F0ZWQgPSAhY2VsbC5pc0dyb3VwZWQgJiYgIWNlbGwuaXNQbGFjZWhvbGRlciAmJiAoKF9yb3ckc3ViUm93cyA9IHJvdy5zdWJSb3dzKSA9PSBudWxsID8gdm9pZCAwIDogX3JvdyRzdWJSb3dzLmxlbmd0aCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0R3JvdXBCeUZuKHJvd3MsIGNvbHVtbklkKSB7XG4gICAgcmV0dXJuIHJvd3MucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCByb3csIGkpIHtcbiAgICAgIC8vIFRPRE86IE1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IGEga2V5IHNlcmlhbGl6ZXIgaGVyZSBzb1xuICAgICAgLy8gaXJyZWd1bGFyIGNvbHVtbiB2YWx1ZXMgY2FuIHN0aWxsIGJlIGdyb3VwZWQgaWYgbmVlZGVkP1xuICAgICAgdmFyIHJlc0tleSA9IFwiXCIgKyByb3cudmFsdWVzW2NvbHVtbklkXTtcbiAgICAgIHByZXZbcmVzS2V5XSA9IEFycmF5LmlzQXJyYXkocHJldltyZXNLZXldKSA/IHByZXZbcmVzS2V5XSA6IFtdO1xuICAgICAgcHJldltyZXNLZXldLnB1c2gocm93KTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHZhciByZVNwbGl0QWxwaGFOdW1lcmljID0gLyhbMC05XSspL2dtOyAvLyBNaXhlZCBzb3J0aW5nIGlzIHNsb3csIGJ1dCB2ZXJ5IGluY2x1c2l2ZSBvZiBtYW55IGVkZ2UgY2FzZXMuXG4gIC8vIEl0IGhhbmRsZXMgbnVtYmVycywgbWl4ZWQgYWxwaGFudW1lcmljIGNvbWJpbmF0aW9ucywgYW5kIGV2ZW5cbiAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbmQgSW5maW5pdHlcblxuICB2YXIgYWxwaGFudW1lcmljID0gZnVuY3Rpb24gYWxwaGFudW1lcmljKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIF9nZXRSb3dWYWx1ZXNCeUNvbHVtbiA9IGdldFJvd1ZhbHVlc0J5Q29sdW1uSUQocm93QSwgcm93QiwgY29sdW1uSWQpLFxuICAgICAgICBhID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uWzFdOyAvLyBGb3JjZSB0byBzdHJpbmdzIChvciBcIlwiIGZvciB1bnN1cHBvcnRlZCB0eXBlcylcblxuXG4gICAgYSA9IHRvU3RyaW5nKGEpO1xuICAgIGIgPSB0b1N0cmluZyhiKTsgLy8gU3BsaXQgb24gbnVtYmVyIGdyb3VwcywgYnV0IGtlZXAgdGhlIGRlbGltaXRlclxuICAgIC8vIFRoZW4gcmVtb3ZlIGZhbHNleSBzcGxpdCB2YWx1ZXNcblxuICAgIGEgPSBhLnNwbGl0KHJlU3BsaXRBbHBoYU51bWVyaWMpLmZpbHRlcihCb29sZWFuKTtcbiAgICBiID0gYi5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5maWx0ZXIoQm9vbGVhbik7IC8vIFdoaWxlXG5cbiAgICB3aGlsZSAoYS5sZW5ndGggJiYgYi5sZW5ndGgpIHtcbiAgICAgIHZhciBhYSA9IGEuc2hpZnQoKTtcbiAgICAgIHZhciBiYiA9IGIuc2hpZnQoKTtcbiAgICAgIHZhciBhbiA9IHBhcnNlSW50KGFhLCAxMCk7XG4gICAgICB2YXIgYm4gPSBwYXJzZUludChiYiwgMTApO1xuICAgICAgdmFyIGNvbWJvID0gW2FuLCBibl0uc29ydCgpOyAvLyBCb3RoIGFyZSBzdHJpbmdcblxuICAgICAgaWYgKGlzTmFOKGNvbWJvWzBdKSkge1xuICAgICAgICBpZiAoYWEgPiBiYikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJiID4gYWEpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gT25lIGlzIGEgc3RyaW5nLCBvbmUgaXMgYSBudW1iZXJcblxuXG4gICAgICBpZiAoaXNOYU4oY29tYm9bMV0pKSB7XG4gICAgICAgIHJldHVybiBpc05hTihhbikgPyAtMSA6IDE7XG4gICAgICB9IC8vIEJvdGggYXJlIG51bWJlcnNcblxuXG4gICAgICBpZiAoYW4gPiBibikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJuID4gYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICB9O1xuICBmdW5jdGlvbiBkYXRldGltZShyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW4yID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW4yWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uMlsxXTtcblxuICAgIGEgPSBhLmdldFRpbWUoKTtcbiAgICBiID0gYi5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBiYXNpYyhyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW4zID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW4zWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uM1sxXTtcblxuICAgIHJldHVybiBjb21wYXJlQmFzaWMoYSwgYik7XG4gIH1cbiAgZnVuY3Rpb24gc3RyaW5nKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIF9nZXRSb3dWYWx1ZXNCeUNvbHVtbjQgPSBnZXRSb3dWYWx1ZXNCeUNvbHVtbklEKHJvd0EsIHJvd0IsIGNvbHVtbklkKSxcbiAgICAgICAgYSA9IF9nZXRSb3dWYWx1ZXNCeUNvbHVtbjRbMF0sXG4gICAgICAgIGIgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW40WzFdO1xuXG4gICAgYSA9IGEuc3BsaXQoJycpLmZpbHRlcihCb29sZWFuKTtcbiAgICBiID0gYi5zcGxpdCgnJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgd2hpbGUgKGEubGVuZ3RoICYmIGIubGVuZ3RoKSB7XG4gICAgICB2YXIgYWEgPSBhLnNoaWZ0KCk7XG4gICAgICB2YXIgYmIgPSBiLnNoaWZ0KCk7XG4gICAgICB2YXIgYWxvd2VyID0gYWEudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBibG93ZXIgPSBiYi50b0xvd2VyQ2FzZSgpOyAvLyBDYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gdW50aWwgY2hhcmFjdGVycyBtYXRjaFxuXG4gICAgICBpZiAoYWxvd2VyID4gYmxvd2VyKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmxvd2VyID4gYWxvd2VyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gLy8gSWYgbG93ZXJjYXNlIGNoYXJhY3RlcnMgYXJlIGlkZW50aWNhbFxuXG5cbiAgICAgIGlmIChhYSA+IGJiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmIgPiBhYSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICB9XG4gIGZ1bmN0aW9uIG51bWJlcihyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW41ID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW41WzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uNVsxXTtcblxuICAgIHZhciByZXBsYWNlTm9uTnVtZXJpYyA9IC9bXjAtOS5dL2dpO1xuICAgIGEgPSBOdW1iZXIoU3RyaW5nKGEpLnJlcGxhY2UocmVwbGFjZU5vbk51bWVyaWMsICcnKSk7XG4gICAgYiA9IE51bWJlcihTdHJpbmcoYikucmVwbGFjZShyZXBsYWNlTm9uTnVtZXJpYywgJycpKTtcbiAgICByZXR1cm4gY29tcGFyZUJhc2ljKGEsIGIpO1xuICB9IC8vIFV0aWxzXG5cbiAgZnVuY3Rpb24gY29tcGFyZUJhc2ljKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhID4gYiA/IDEgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJvd1ZhbHVlc0J5Q29sdW1uSUQocm93MSwgcm93MiwgY29sdW1uSWQpIHtcbiAgICByZXR1cm4gW3JvdzEudmFsdWVzW2NvbHVtbklkXSwgcm93Mi52YWx1ZXNbY29sdW1uSWRdXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvU3RyaW5nKGEpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4oYSkgfHwgYSA9PT0gSW5maW5pdHkgfHwgYSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyhhKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgc29ydFR5cGVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBhbHBoYW51bWVyaWM6IGFscGhhbnVtZXJpYyxcbiAgICBkYXRldGltZTogZGF0ZXRpbWUsXG4gICAgYmFzaWM6IGJhc2ljLFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIG51bWJlcjogbnVtYmVyXG4gIH0pO1xuXG4gIGFjdGlvbnMucmVzZXRTb3J0QnkgPSAncmVzZXRTb3J0QnknO1xuICBhY3Rpb25zLnNldFNvcnRCeSA9ICdzZXRTb3J0QnknO1xuICBhY3Rpb25zLnRvZ2dsZVNvcnRCeSA9ICd0b2dnbGVTb3J0QnknO1xuICBhY3Rpb25zLmNsZWFyU29ydEJ5ID0gJ2NsZWFyU29ydEJ5JztcbiAgZGVmYXVsdENvbHVtbi5zb3J0VHlwZSA9ICdhbHBoYW51bWVyaWMnO1xuICBkZWZhdWx0Q29sdW1uLnNvcnREZXNjRmlyc3QgPSBmYWxzZTtcbiAgdmFyIHVzZVNvcnRCeSA9IGZ1bmN0aW9uIHVzZVNvcnRCeShob29rcykge1xuICAgIGhvb2tzLmdldFNvcnRCeVRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRTb3J0QnlUb2dnbGVQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkNSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ1KTtcbiAgfTtcbiAgdXNlU29ydEJ5LnBsdWdpbk5hbWUgPSAndXNlU29ydEJ5JztcblxuICB2YXIgZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgdmFyIF9pbnN0YW5jZSRpc011bHRpU29ydCA9IGluc3RhbmNlLmlzTXVsdGlTb3J0RXZlbnQsXG4gICAgICAgIGlzTXVsdGlTb3J0RXZlbnQgPSBfaW5zdGFuY2UkaXNNdWx0aVNvcnQgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5zaGlmdEtleTtcbiAgICB9IDogX2luc3RhbmNlJGlzTXVsdGlTb3J0O1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2xpY2s6IGNvbHVtbi5jYW5Tb3J0ID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkodW5kZWZpbmVkLCAhaW5zdGFuY2UuZGlzYWJsZU11bHRpU29ydCAmJiBpc011bHRpU29ydEV2ZW50KGUpKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGNvbHVtbi5jYW5Tb3J0ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6IGNvbHVtbi5jYW5Tb3J0ID8gJ1RvZ2dsZSBTb3J0QnknIDogdW5kZWZpbmVkXG4gICAgfV07XG4gIH07IC8vIFJlZHVjZXJcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkNShzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzb3J0Qnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0U29ydEJ5KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnNvcnRCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNsZWFyU29ydEJ5KSB7XG4gICAgICB2YXIgc29ydEJ5ID0gc3RhdGUuc29ydEJ5O1xuICAgICAgdmFyIG5ld1NvcnRCeSA9IHNvcnRCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgIT09IGFjdGlvbi5jb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IG5ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFNvcnRCeSkge1xuICAgICAgdmFyIF9zb3J0QnkgPSBhY3Rpb24uc29ydEJ5O1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IF9zb3J0QnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVTb3J0QnkpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBkZXNjID0gYWN0aW9uLmRlc2MsXG4gICAgICAgICAgbXVsdGkgPSBhY3Rpb24ubXVsdGk7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgZGlzYWJsZU11bHRpU29ydCA9IGluc3RhbmNlLmRpc2FibGVNdWx0aVNvcnQsXG4gICAgICAgICAgZGlzYWJsZVNvcnRSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlU29ydFJlbW92ZSxcbiAgICAgICAgICBkaXNhYmxlTXVsdGlSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlTXVsdGlSZW1vdmUsXG4gICAgICAgICAgX2luc3RhbmNlJG1heE11bHRpU29yID0gaW5zdGFuY2UubWF4TXVsdGlTb3J0Q29sQ291bnQsXG4gICAgICAgICAgbWF4TXVsdGlTb3J0Q29sQ291bnQgPSBfaW5zdGFuY2UkbWF4TXVsdGlTb3IgPT09IHZvaWQgMCA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogX2luc3RhbmNlJG1heE11bHRpU29yO1xuICAgICAgdmFyIF9zb3J0QnkyID0gc3RhdGUuc29ydEJ5OyAvLyBGaW5kIHRoZSBjb2x1bW4gZm9yIHRoaXMgY29sdW1uSWRcblxuICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0RGVzY0ZpcnN0ID0gY29sdW1uLnNvcnREZXNjRmlyc3Q7IC8vIEZpbmQgYW55IGV4aXN0aW5nIHNvcnRCeSBmb3IgdGhpcyBjb2x1bW5cblxuICAgICAgdmFyIGV4aXN0aW5nU29ydEJ5ID0gX3NvcnRCeTIuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBfc29ydEJ5Mi5maW5kSW5kZXgoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBoYXNEZXNjRGVmaW5lZCA9IHR5cGVvZiBkZXNjICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjICE9PSBudWxsO1xuICAgICAgdmFyIF9uZXdTb3J0QnkgPSBbXTsgLy8gV2hhdCBzaG91bGQgd2UgZG8gd2l0aCB0aGlzIHNvcnQgYWN0aW9uP1xuXG4gICAgICB2YXIgc29ydEFjdGlvbjtcblxuICAgICAgaWYgKCFkaXNhYmxlTXVsdGlTb3J0ICYmIG11bHRpKSB7XG4gICAgICAgIGlmIChleGlzdGluZ1NvcnRCeSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAndG9nZ2xlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ2FkZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCBtb2RlXG4gICAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSBfc29ydEJ5Mi5sZW5ndGggLSAxIHx8IF9zb3J0QnkyLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdTb3J0QnkpIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ3RvZ2dsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydEFjdGlvbiA9ICdyZXBsYWNlJztcbiAgICAgICAgfVxuICAgICAgfSAvLyBIYW5kbGUgdG9nZ2xlIHN0YXRlcyB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBzb3J0QnlcblxuXG4gICAgICBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScgJiYgLy8gTXVzdCBiZSB0b2dnbGluZ1xuICAgICAgIWRpc2FibGVTb3J0UmVtb3ZlICYmIC8vIElmIGRpc2FibGVTb3J0UmVtb3ZlLCBkaXNhYmxlIGluIGdlbmVyYWxcbiAgICAgICFoYXNEZXNjRGVmaW5lZCAmJiAoIC8vIE11c3Qgbm90IGJlIHNldHRpbmcgZGVzY1xuICAgICAgbXVsdGkgPyAhZGlzYWJsZU11bHRpUmVtb3ZlIDogdHJ1ZSkgJiYgKCAvLyBJZiBtdWx0aSwgZG9uJ3QgYWxsb3cgaWYgZGlzYWJsZU11bHRpUmVtb3ZlXG4gICAgICBleGlzdGluZ1NvcnRCeSAmJiAvLyBGaW5hbGx5LCBkZXRlY3QgaWYgaXQgc2hvdWxkIGluZGVlZCBiZSByZW1vdmVkXG4gICAgICBleGlzdGluZ1NvcnRCeS5kZXNjICYmICFzb3J0RGVzY0ZpcnN0IHx8ICFleGlzdGluZ1NvcnRCeS5kZXNjICYmIHNvcnREZXNjRmlyc3QpKSB7XG4gICAgICAgIHNvcnRBY3Rpb24gPSAncmVtb3ZlJztcbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnRBY3Rpb24gPT09ICdyZXBsYWNlJykge1xuICAgICAgICBfbmV3U29ydEJ5ID0gW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ2FkZCcpIHtcbiAgICAgICAgX25ld1NvcnRCeSA9IFtdLmNvbmNhdChfc29ydEJ5MiwgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XSk7IC8vIFRha2UgbGF0ZXN0IG4gY29sdW1uc1xuXG4gICAgICAgIF9uZXdTb3J0Qnkuc3BsaWNlKDAsIF9uZXdTb3J0QnkubGVuZ3RoIC0gbWF4TXVsdGlTb3J0Q29sQ291bnQpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0QWN0aW9uID09PSAndG9nZ2xlJykge1xuICAgICAgICAvLyBUaGlzIGZsaXBzIChvciBzZXRzKSB0aGVcbiAgICAgICAgX25ld1NvcnRCeSA9IF9zb3J0QnkyLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBkLCB7XG4gICAgICAgICAgICAgIGRlc2M6IGhhc0Rlc2NEZWZpbmVkID8gZGVzYyA6ICFleGlzdGluZ1NvcnRCeS5kZXNjXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRBY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICAgIF9uZXdTb3J0QnkgPSBfc29ydEJ5Mi5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogX25ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkNShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gaW5zdGFuY2UuZmxhdFJvd3MsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBfaW5zdGFuY2Ukb3JkZXJCeUZuID0gaW5zdGFuY2Uub3JkZXJCeUZuLFxuICAgICAgICBvcmRlckJ5Rm4gPSBfaW5zdGFuY2Ukb3JkZXJCeUZuID09PSB2b2lkIDAgPyBkZWZhdWx0T3JkZXJCeUZuIDogX2luc3RhbmNlJG9yZGVyQnlGbixcbiAgICAgICAgdXNlclNvcnRUeXBlcyA9IGluc3RhbmNlLnNvcnRUeXBlcyxcbiAgICAgICAgbWFudWFsU29ydEJ5ID0gaW5zdGFuY2UubWFudWFsU29ydEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuU29ydCA9IGluc3RhbmNlLmRlZmF1bHRDYW5Tb3J0LFxuICAgICAgICBkaXNhYmxlU29ydEJ5ID0gaW5zdGFuY2UuZGlzYWJsZVNvcnRCeSxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgc29ydEJ5ID0gaW5zdGFuY2Uuc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNvID0gaW5zdGFuY2UuYXV0b1Jlc2V0U29ydEJ5LFxuICAgICAgICBhdXRvUmVzZXRTb3J0QnkgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U28gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U287XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VGaWx0ZXJzJywgJ3VzZUdsb2JhbEZpbHRlcicsICd1c2VHcm91cEJ5JywgJ3VzZVBpdm90Q29sdW1ucyddLCAndXNlU29ydEJ5Jyk7XG4gICAgdmFyIHNldFNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChzb3J0QnkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRTb3J0QnksXG4gICAgICAgIHNvcnRCeTogc29ydEJ5XG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gVXBkYXRlcyBzb3J0aW5nIGJhc2VkIG9uIGEgY29sdW1uSWQsIGRlc2MgZmxhZyBhbmQgbXVsdGkgZmxhZ1xuXG4gICAgdmFyIHRvZ2dsZVNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZGVzYywgbXVsdGkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVTb3J0QnksXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZGVzYzogZGVzYyxcbiAgICAgICAgbXVsdGk6IG11bHRpXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gdXNlIHJlZmVyZW5jZSB0byBhdm9pZCBtZW1vcnkgbGVhayBpbiAjMTYwOFxuXG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTsgLy8gQWRkIHRoZSBnZXRTb3J0QnlUb2dnbGVQcm9wcyBtZXRob2QgdG8gY29sdW1ucyBhbmQgaGVhZGVyc1xuXG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICB2YXIgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgICAgZGVmYXVsdENvbHVtbkNhblNvcnQgPSBjb2x1bW4uY2FuU29ydCxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlU29ydEJ5ID0gY29sdW1uLmRpc2FibGVTb3J0QnksXG4gICAgICAgICAgaWQgPSBjb2x1bW4uaWQ7XG4gICAgICB2YXIgY2FuU29ydCA9IGFjY2Vzc29yID8gZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRpc2FibGVTb3J0QnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZVNvcnRCeSA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChkZWZhdWx0Q2FuU29ydCwgZGVmYXVsdENvbHVtbkNhblNvcnQsIGZhbHNlKTtcbiAgICAgIGNvbHVtbi5jYW5Tb3J0ID0gY2FuU29ydDtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Tb3J0KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkgPSBmdW5jdGlvbiAoZGVzYywgbXVsdGkpIHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlU29ydEJ5KGNvbHVtbi5pZCwgZGVzYywgbXVsdGkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbHVtbi5jbGVhclNvcnRCeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBhY3Rpb25zLmNsZWFyU29ydEJ5LFxuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4uZ2V0U29ydEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFNvcnRCeVRvZ2dsZVByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgICB2YXIgY29sdW1uU29ydCA9IHNvcnRCeS5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmlzU29ydGVkID0gISFjb2x1bW5Tb3J0O1xuICAgICAgY29sdW1uLnNvcnRlZEluZGV4ID0gc29ydEJ5LmZpbmRJbmRleChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGNvbHVtbi5pc1NvcnRlZERlc2MgPSBjb2x1bW4uaXNTb3J0ZWQgPyBjb2x1bW5Tb3J0LmRlc2MgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxTb3J0QnkgfHwgIXNvcnRCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93c107XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3J0ZWRGbGF0Um93cyA9IFtdOyAvLyBGaWx0ZXIgb3V0IHNvcnRCeXMgdGhhdCBjb3JyZXNwb25kIHRvIG5vbiBleGlzdGluZyBjb2x1bW5zXG5cbiAgICAgIHZhciBhdmFpbGFibGVTb3J0QnkgPSBzb3J0QnkuZmlsdGVyKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBzb3J0RGF0YSA9IGZ1bmN0aW9uIHNvcnREYXRhKHJvd3MpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmRlckJ5Rm4gdG8gY29tcG9zZSBtdWx0aXBsZSBzb3J0QnkncyB0b2dldGhlci5cbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gcGVyZm9ybSBhIHN0YWJsZSBzb3J0aW5nIHVzaW5nIHRoZSByb3cgaW5kZXhcbiAgICAgICAgLy8gaWYgbmVlZGVkLlxuICAgICAgICB2YXIgc29ydGVkRGF0YSA9IG9yZGVyQnlGbihyb3dzLCBhdmFpbGFibGVTb3J0QnkubWFwKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBjdXN0b20gc29ydGluZyBtZXRob2RzIGZvciBlYWNoIGNvbHVtblxuICAgICAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBzb3J0LmlkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LVRhYmxlOiBDb3VsZCBub3QgZmluZCBhIGNvbHVtbiB3aXRoIGlkOiBcIiArIHNvcnQuaWQgKyBcIiB3aGlsZSBzb3J0aW5nXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzb3J0VHlwZSA9IGNvbHVtbi5zb3J0VHlwZTsgLy8gTG9vayB1cCBzb3J0QnkgZnVuY3Rpb25zIGluIHRoaXMgb3JkZXI6XG4gICAgICAgICAgLy8gY29sdW1uIGZ1bmN0aW9uXG4gICAgICAgICAgLy8gY29sdW1uIHN0cmluZyBsb29rdXAgb24gdXNlciBzb3J0VHlwZVxuICAgICAgICAgIC8vIGNvbHVtbiBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBmdW5jdGlvblxuICAgICAgICAgIC8vIGRlZmF1bHQgc3RyaW5nIGxvb2t1cCBvbiB1c2VyIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG5cbiAgICAgICAgICB2YXIgc29ydE1ldGhvZCA9IGlzRnVuY3Rpb24oc29ydFR5cGUpIHx8ICh1c2VyU29ydFR5cGVzIHx8IHt9KVtzb3J0VHlwZV0gfHwgc29ydFR5cGVzW3NvcnRUeXBlXTtcblxuICAgICAgICAgIGlmICghc29ydE1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QtVGFibGU6IENvdWxkIG5vdCBmaW5kIGEgdmFsaWQgc29ydFR5cGUgb2YgJ1wiICsgc29ydFR5cGUgKyBcIicgZm9yIGNvbHVtbiAnXCIgKyBzb3J0LmlkICsgXCInLlwiKTtcbiAgICAgICAgICB9IC8vIFJldHVybiB0aGUgY29ycmVjdCBzb3J0Rm4uXG4gICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBpbiBhc2NlbmRpbmcgb3JkZXJcblxuXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydE1ldGhvZChhLCBiLCBzb3J0LmlkLCBzb3J0LmRlc2MpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pLCAvLyBNYXAgdGhlIGRpcmVjdGlvbnNcbiAgICAgICAgYXZhaWxhYmxlU29ydEJ5Lm1hcChmdW5jdGlvbiAoc29ydCkge1xuICAgICAgICAgIC8vIERldGVjdCBhbmQgdXNlIHRoZSBzb3J0SW52ZXJ0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5zb3J0SW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0LmRlc2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICFzb3J0LmRlc2M7XG4gICAgICAgIH0pKTsgLy8gSWYgdGhlcmUgYXJlIHN1Yi1yb3dzLCBzb3J0IHRoZW1cblxuICAgICAgICBzb3J0ZWREYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHNvcnRlZEZsYXRSb3dzLnB1c2gocm93KTtcblxuICAgICAgICAgIGlmICghcm93LnN1YlJvd3MgfHwgcm93LnN1YlJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93LnN1YlJvd3MgPSBzb3J0RGF0YShyb3cuc3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkRGF0YTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbc29ydERhdGEocm93cyksIHNvcnRlZEZsYXRSb3dzXTtcbiAgICB9LCBbbWFudWFsU29ydEJ5LCBzb3J0QnksIHJvd3MsIGZsYXRSb3dzLCBhbGxDb2x1bW5zLCBvcmRlckJ5Rm4sIHVzZXJTb3J0VHlwZXNdKSxcbiAgICAgICAgc29ydGVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBzb3J0ZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldFNvcnRCeSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRTb3J0QnkpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFNvcnRCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0U29ydEJ5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFttYW51YWxTb3J0QnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZVNvcnRlZFJvd3M6IHJvd3MsXG4gICAgICBwcmVTb3J0ZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBzb3J0ZWRSb3dzOiBzb3J0ZWRSb3dzLFxuICAgICAgc29ydGVkRmxhdFJvd3M6IHNvcnRlZEZsYXRSb3dzLFxuICAgICAgcm93czogc29ydGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBzb3J0ZWRGbGF0Um93cyxcbiAgICAgIHNldFNvcnRCeTogc2V0U29ydEJ5LFxuICAgICAgdG9nZ2xlU29ydEJ5OiB0b2dnbGVTb3J0QnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRPcmRlckJ5Rm4oYXJyLCBmdW5jcywgZGlycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoYXJyKS5zb3J0KGZ1bmN0aW9uIChyb3dBLCByb3dCKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBzb3J0Rm4gPSBmdW5jc1tpXTtcbiAgICAgICAgdmFyIGRlc2MgPSBkaXJzW2ldID09PSBmYWxzZSB8fCBkaXJzW2ldID09PSAnZGVzYyc7XG4gICAgICAgIHZhciBzb3J0SW50ID0gc29ydEZuKHJvd0EsIHJvd0IpO1xuXG4gICAgICAgIGlmIChzb3J0SW50ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2MgPyAtc29ydEludCA6IHNvcnRJbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpcnNbMF0gPyByb3dBLmluZGV4IC0gcm93Qi5pbmRleCA6IHJvd0IuaW5kZXggLSByb3dBLmluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUgPSAndXNlUGFnaW5hdGlvbic7IC8vIEFjdGlvbnNcblxuICBhY3Rpb25zLnJlc2V0UGFnZSA9ICdyZXNldFBhZ2UnO1xuICBhY3Rpb25zLmdvdG9QYWdlID0gJ2dvdG9QYWdlJztcbiAgYWN0aW9ucy5zZXRQYWdlU2l6ZSA9ICdzZXRQYWdlU2l6ZSc7XG4gIHZhciB1c2VQYWdpbmF0aW9uID0gZnVuY3Rpb24gdXNlUGFnaW5hdGlvbihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDYpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkNik7XG4gIH07XG4gIHVzZVBhZ2luYXRpb24ucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ2KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgcGFnZUluZGV4OiAwXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0UGFnZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5wYWdlSW5kZXggfHwgMFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmdvdG9QYWdlKSB7XG4gICAgICB2YXIgcGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlO1xuICAgICAgdmFyIG5ld1BhZ2VJbmRleCA9IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnBhZ2VJbmRleCwgc3RhdGUucGFnZUluZGV4KTtcbiAgICAgIHZhciBjYW5OYXZpZ2F0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAobmV3UGFnZUluZGV4ID4gc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIG5leHQgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBzdGF0ZS5wYWdlU2l6ZSA6IG5ld1BhZ2VJbmRleCA8IHBhZ2VDb3VudDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UGFnZUluZGV4IDwgc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIHByZXYgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IG5ld1BhZ2VJbmRleCA+IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNhbk5hdmlnYXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IG5ld1BhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFBhZ2VTaXplKSB7XG4gICAgICB2YXIgcGFnZVNpemUgPSBhY3Rpb24ucGFnZVNpemU7XG4gICAgICB2YXIgdG9wUm93SW5kZXggPSBzdGF0ZS5wYWdlU2l6ZSAqIHN0YXRlLnBhZ2VJbmRleDtcbiAgICAgIHZhciBwYWdlSW5kZXggPSBNYXRoLmZsb29yKHRvcFJvd0luZGV4IC8gcGFnZVNpemUpO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ2KGluc3RhbmNlKSB7XG4gICAgdmFyIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0UGEgPSBpbnN0YW5jZS5hdXRvUmVzZXRQYWdlLFxuICAgICAgICBhdXRvUmVzZXRQYWdlID0gX2luc3RhbmNlJGF1dG9SZXNldFBhID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBhLFxuICAgICAgICBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPSBpbnN0YW5jZS5tYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgbWFudWFsRXhwYW5kZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPT09IHZvaWQgMCA/ICdleHBhbmRlZCcgOiBfaW5zdGFuY2UkbWFudWFsRXhwYW4sXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICB1c2VyUGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPSBpbnN0YW5jZS5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3MgPSBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkcGFnaW5hdGVFeHAsXG4gICAgICAgIF9pbnN0YW5jZSRleHBhbmRTdWJSbyA9IGluc3RhbmNlLmV4cGFuZFN1YlJvd3MsXG4gICAgICAgIGV4cGFuZFN1YlJvd3MgPSBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkZXhwYW5kU3ViUm8sXG4gICAgICAgIF9pbnN0YW5jZSRzdGF0ZSA9IGluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwYWdlU2l6ZSA9IF9pbnN0YW5jZSRzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgcGFnZUluZGV4ID0gX2luc3RhbmNlJHN0YXRlLnBhZ2VJbmRleCxcbiAgICAgICAgZXhwYW5kZWQgPSBfaW5zdGFuY2Ukc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IF9pbnN0YW5jZSRzdGF0ZS5nbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlcnMgPSBfaW5zdGFuY2Ukc3RhdGUuZmlsdGVycyxcbiAgICAgICAgZ3JvdXBCeSA9IF9pbnN0YW5jZSRzdGF0ZS5ncm91cEJ5LFxuICAgICAgICBzb3J0QnkgPSBfaW5zdGFuY2Ukc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgbWFudWFsUGFnaW5hdGlvbiA9IGluc3RhbmNlLm1hbnVhbFBhZ2luYXRpb247XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VHbG9iYWxGaWx0ZXInLCAndXNlRmlsdGVycycsICd1c2VHcm91cEJ5JywgJ3VzZVNvcnRCeScsICd1c2VFeHBhbmRlZCddLCAndXNlUGFnaW5hdGlvbicpO1xuICAgIHZhciBnZXRBdXRvUmVzZXRQYWdlID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFBhZ2UpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBhZ2UoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldFBhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxQYWdpbmF0aW9uID8gbnVsbCA6IGRhdGEsIGdsb2JhbEZpbHRlciwgZmlsdGVycywgZ3JvdXBCeSwgc29ydEJ5XSk7XG4gICAgdmFyIHBhZ2VDb3VudCA9IG1hbnVhbFBhZ2luYXRpb24gPyB1c2VyUGFnZUNvdW50IDogTWF0aC5jZWlsKHJvd3MubGVuZ3RoIC8gcGFnZVNpemUpO1xuICAgIHZhciBwYWdlT3B0aW9ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHBhZ2VDb3VudCA+IDAgPyBbXS5jb25jYXQobmV3IEFycmF5KHBhZ2VDb3VudCkpLmZpbGwobnVsbCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfSkgOiBbXTtcbiAgICB9LCBbcGFnZUNvdW50XSk7XG4gICAgdmFyIHBhZ2UgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwYWdlO1xuXG4gICAgICBpZiAobWFudWFsUGFnaW5hdGlvbikge1xuICAgICAgICBwYWdlID0gcm93cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYWdlU3RhcnQgPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleDtcbiAgICAgICAgdmFyIHBhZ2VFbmQgPSBwYWdlU3RhcnQgKyBwYWdlU2l6ZTtcbiAgICAgICAgcGFnZSA9IHJvd3Muc2xpY2UocGFnZVN0YXJ0LCBwYWdlRW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2luYXRlRXhwYW5kZWRSb3dzKSB7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhwYW5kUm93cyhwYWdlLCB7XG4gICAgICAgIG1hbnVhbEV4cGFuZGVkS2V5OiBtYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICB9KTtcbiAgICB9LCBbZXhwYW5kU3ViUm93cywgZXhwYW5kZWQsIG1hbnVhbEV4cGFuZGVkS2V5LCBtYW51YWxQYWdpbmF0aW9uLCBwYWdlSW5kZXgsIHBhZ2VTaXplLCBwYWdpbmF0ZUV4cGFuZGVkUm93cywgcm93c10pO1xuICAgIHZhciBjYW5QcmV2aW91c1BhZ2UgPSBwYWdlSW5kZXggPiAwO1xuICAgIHZhciBjYW5OZXh0UGFnZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBwYWdlU2l6ZSA6IHBhZ2VJbmRleCA8IHBhZ2VDb3VudCAtIDE7XG4gICAgdmFyIGdvdG9QYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBhZ2VJbmRleCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmdvdG9QYWdlLFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHByZXZpb3VzUGFnZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnb3RvUGFnZShmdW5jdGlvbiAob2xkKSB7XG4gICAgICAgIHJldHVybiBvbGQgLSAxO1xuICAgICAgfSk7XG4gICAgfSwgW2dvdG9QYWdlXSk7XG4gICAgdmFyIG5leHRQYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdvdG9QYWdlKGZ1bmN0aW9uIChvbGQpIHtcbiAgICAgICAgcmV0dXJuIG9sZCArIDE7XG4gICAgICB9KTtcbiAgICB9LCBbZ290b1BhZ2VdKTtcbiAgICB2YXIgc2V0UGFnZVNpemUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocGFnZVNpemUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRQYWdlU2l6ZSxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwYWdlT3B0aW9uczogcGFnZU9wdGlvbnMsXG4gICAgICBwYWdlQ291bnQ6IHBhZ2VDb3VudCxcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICBjYW5QcmV2aW91c1BhZ2U6IGNhblByZXZpb3VzUGFnZSxcbiAgICAgIGNhbk5leHRQYWdlOiBjYW5OZXh0UGFnZSxcbiAgICAgIGdvdG9QYWdlOiBnb3RvUGFnZSxcbiAgICAgIHByZXZpb3VzUGFnZTogcHJldmlvdXNQYWdlLFxuICAgICAgbmV4dFBhZ2U6IG5leHRQYWdlLFxuICAgICAgc2V0UGFnZVNpemU6IHNldFBhZ2VTaXplXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0UGl2b3QgPSAncmVzZXRQaXZvdCc7XG4gIGFjdGlvbnMudG9nZ2xlUGl2b3QgPSAndG9nZ2xlUGl2b3QnO1xuICB2YXIgX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnMoaG9va3MpIHtcbiAgICBob29rcy5nZXRQaXZvdFRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRQaXZvdFRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ3KTtcbiAgICBob29rcy51c2VJbnN0YW5jZUFmdGVyRGF0YS5wdXNoKHVzZUluc3RhbmNlQWZ0ZXJEYXRhKTtcbiAgICBob29rcy5hbGxDb2x1bW5zLnB1c2goYWxsQ29sdW1ucyk7XG4gICAgaG9va3MuYWNjZXNzVmFsdWUucHVzaChhY2Nlc3NWYWx1ZSk7XG4gICAgaG9va3MubWF0ZXJpYWxpemVkQ29sdW1ucy5wdXNoKG1hdGVyaWFsaXplZENvbHVtbnMpO1xuICAgIGhvb2tzLm1hdGVyaWFsaXplZENvbHVtbnNEZXBzLnB1c2gobWF0ZXJpYWxpemVkQ29sdW1uc0RlcHMpO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zLnB1c2godmlzaWJsZUNvbHVtbnMkMSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnNEZXBzLnB1c2godmlzaWJsZUNvbHVtbnNEZXBzKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDcpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDIpO1xuICB9O1xuICBfVU5TVEFCTEVfdXNlUGl2b3RDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUGl2b3RDb2x1bW5zJztcbiAgdmFyIGRlZmF1bHRQaXZvdENvbHVtbnMgPSBbXTtcblxuICB2YXIgZGVmYXVsdEdldFBpdm90VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UGl2b3RUb2dnbGVQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmLmhlYWRlcjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBoZWFkZXIuY2FuUGl2b3QgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZVBpdm90KCk7XG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiBoZWFkZXIuY2FuUGl2b3QgPyAncG9pbnRlcicgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBQaXZvdCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ3KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBpdm90Q29sdW1uczogZGVmYXVsdFBpdm90Q29sdW1uc1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldFBpdm90KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnBpdm90Q29sdW1ucyB8fCBkZWZhdWx0UGl2b3RDb2x1bW5zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUGl2b3QpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBzZXRQaXZvdCA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZFBpdm90ID0gdHlwZW9mIHNldFBpdm90ICE9PSAndW5kZWZpbmVkJyA/IHNldFBpdm90IDogIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhjb2x1bW5JZCk7XG5cbiAgICAgIGlmIChyZXNvbHZlZFBpdm90KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBwaXZvdENvbHVtbnM6IFtdLmNvbmNhdChzdGF0ZS5waXZvdENvbHVtbnMsIFtjb2x1bW5JZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogc3RhdGUucGl2b3RDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkICE9PSBjb2x1bW5JZDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQWZ0ZXJEYXRhKGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2UuYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhbGxDb2x1bW5zKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjIuaW5zdGFuY2U7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4udW5pcXVlVmFsdWVzID0gbmV3IFNldCgpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjZXNzVmFsdWUodmFsdWUsIF9yZWYzKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYzLmNvbHVtbjtcblxuICAgIGlmIChjb2x1bW4udW5pcXVlVmFsdWVzICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbHVtbi51bmlxdWVWYWx1ZXMuYWRkKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zKG1hdGVyaWFsaXplZCwgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIHN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoIXN0YXRlLnBpdm90Q29sdW1ucy5sZW5ndGggfHwgIXN0YXRlLmdyb3VwQnkgfHwgIXN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbWF0ZXJpYWxpemVkO1xuICAgIH1cblxuICAgIHZhciBwaXZvdENvbHVtbnMgPSBzdGF0ZS5waXZvdENvbHVtbnMubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdmFyIHNvdXJjZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2UgJiYgIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoZC5pZCkgJiYgIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhkLmlkKTtcbiAgICB9KTtcblxuICAgIHZhciBidWlsZFBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIGJ1aWxkUGl2b3RDb2x1bW5zKGRlcHRoLCBwYXJlbnQsIHBpdm90RmlsdGVycykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAocGl2b3RGaWx0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgICAgcGl2b3RGaWx0ZXJzID0gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBwaXZvdENvbHVtbiA9IHBpdm90Q29sdW1uc1tkZXB0aF07XG5cbiAgICAgIGlmICghcGl2b3RDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNvbHVtbnMubWFwKGZ1bmN0aW9uIChzb3VyY2VDb2x1bW4pIHtcbiAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBvZmZlciBzdXBwb3J0IGhlcmUgZm9yIHJlbmVzdGluZyBwaXZvdGVkXG4gICAgICAgICAgLy8gY29sdW1ucyBpbnNpZGUgY29waWVzIG9mIHRoZWlyIGhlYWRlciBncm91cHMuIEZvciBub3csXG4gICAgICAgICAgLy8gdGhhdCBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlICgxKSBvdmVya2lsbCBvbiBuZXN0aW5nLCBjb25zaWRlcmluZ1xuICAgICAgICAgIC8vIHlvdSBhbHJlYWR5IGdldCBuZXN0aW5nIGZvciBldmVyeSBwaXZvdCBsZXZlbCBhbmQgKDIpXG4gICAgICAgICAgLy8gcmVhbGx5IGhhcmQuIDopXG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzb3VyY2VDb2x1bW4sIHtcbiAgICAgICAgICAgIGNhblBpdm90OiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGl2b3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaWQ6IFwiXCIgKyAocGFyZW50ID8gcGFyZW50LmlkICsgXCIuXCIgKyBzb3VyY2VDb2x1bW4uaWQgOiBzb3VyY2VDb2x1bW4uaWQpLFxuICAgICAgICAgICAgYWNjZXNzb3I6IGZ1bmN0aW9uIGFjY2Vzc29yKG9yaWdpbmFsUm93LCBpLCByb3cpIHtcbiAgICAgICAgICAgICAgaWYgKHBpdm90RmlsdGVycy5ldmVyeShmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihyb3cpO1xuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3NvdXJjZUNvbHVtbi5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB1bmlxdWVWYWx1ZXMgPSBBcnJheS5mcm9tKHBpdm90Q29sdW1uLnVuaXF1ZVZhbHVlcykuc29ydCgpO1xuICAgICAgcmV0dXJuIHVuaXF1ZVZhbHVlcy5tYXAoZnVuY3Rpb24gKHVuaXF1ZVZhbHVlKSB7XG4gICAgICAgIHZhciBjb2x1bW5Hcm91cCA9IF9leHRlbmRzKHt9LCBwaXZvdENvbHVtbiwge1xuICAgICAgICAgIEhlYWRlcjogcGl2b3RDb2x1bW4uUGl2b3RIZWFkZXIgfHwgdHlwZW9mIHBpdm90Q29sdW1uLmhlYWRlciA9PT0gJ3N0cmluZycgPyBwaXZvdENvbHVtbi5IZWFkZXIgKyBcIjogXCIgKyB1bmlxdWVWYWx1ZSA6IHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIGlzUGl2b3RHcm91cDogdHJ1ZSxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgaWQ6IHBhcmVudCA/IHBhcmVudC5pZCArIFwiLlwiICsgcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlIDogcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIHBpdm90VmFsdWU6IHVuaXF1ZVZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbHVtbkdyb3VwLmNvbHVtbnMgPSBidWlsZFBpdm90Q29sdW1ucyhkZXB0aCArIDEsIGNvbHVtbkdyb3VwLCBbXS5jb25jYXQocGl2b3RGaWx0ZXJzLCBbZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3Bpdm90Q29sdW1uLmlkXSA9PT0gdW5pcXVlVmFsdWU7XG4gICAgICAgIH1dKSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5Hcm91cDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgbmV3TWF0ZXJpYWxpemVkID0gZmxhdHRlbkNvbHVtbnMoYnVpbGRQaXZvdENvbHVtbnMoKSk7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChtYXRlcmlhbGl6ZWQsIG5ld01hdGVyaWFsaXplZCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zRGVwcyhkZXBzLCBfcmVmNSkge1xuICAgIHZhciBfcmVmNSRpbnN0YW5jZSRzdGF0ZSA9IF9yZWY1Lmluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwaXZvdENvbHVtbnMgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5waXZvdENvbHVtbnMsXG4gICAgICAgIGdyb3VwQnkgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5ncm91cEJ5O1xuICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW3Bpdm90Q29sdW1ucywgZ3JvdXBCeV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZUNvbHVtbnMkMSh2aXNpYmxlQ29sdW1ucywgX3JlZjYpIHtcbiAgICB2YXIgc3RhdGUgPSBfcmVmNi5pbnN0YW5jZS5zdGF0ZTtcbiAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2U7XG4gICAgfSk7XG5cbiAgICBpZiAoc3RhdGUucGl2b3RDb2x1bW5zLmxlbmd0aCAmJiBzdGF0ZS5ncm91cEJ5ICYmIHN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uaXNHcm91cGVkIHx8IGNvbHVtbi5pc1Bpdm90ZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1uc0RlcHMoZGVwcywgX3JlZjcpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW10uY29uY2F0KGRlcHMsIFtpbnN0YW5jZS5zdGF0ZS5waXZvdENvbHVtbnMsIGluc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDcoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFBpID0gaW5zdGFuY2UuYXV0b1Jlc2V0UGl2b3QsXG4gICAgICAgIGF1dG9SZXNldFBpdm90ID0gX2luc3RhbmNlJGF1dG9SZXNldFBpID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBpLFxuICAgICAgICBtYW5hdWxQaXZvdCA9IGluc3RhbmNlLm1hbmF1bFBpdm90LFxuICAgICAgICBkaXNhYmxlUGl2b3QgPSBpbnN0YW5jZS5kaXNhYmxlUGl2b3QsXG4gICAgICAgIGRlZmF1bHRDYW5QaXZvdCA9IGluc3RhbmNlLmRlZmF1bHRDYW5QaXZvdDtcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUdyb3VwQnknXSwgJ3VzZVBpdm90Q29sdW1ucycpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uUGl2b3QgPSBjb2x1bW4uZGVmYXVsdFBpdm90LFxuICAgICAgICAgIGNvbHVtbkRpc2FibGVQaXZvdCA9IGNvbHVtbi5kaXNhYmxlUGl2b3Q7XG4gICAgICBjb2x1bW4uY2FuUGl2b3QgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW4uY2FuUGl2b3QsIGNvbHVtbkRpc2FibGVQaXZvdCA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUGl2b3QgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSkgOiBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhblBpdm90LCBkZWZhdWx0Q29sdW1uUGl2b3QsIGRlZmF1bHRDYW5QaXZvdCwgZmFsc2UpO1xuXG4gICAgICBpZiAoY29sdW1uLmNhblBpdm90KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVQaXZvdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUGl2b3QoY29sdW1uLmlkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29sdW1uLkFnZ3JlZ2F0ZWQgPSBjb2x1bW4uQWdncmVnYXRlZCB8fCBjb2x1bW4uQ2VsbDtcbiAgICB9KTtcblxuICAgIHZhciB0b2dnbGVQaXZvdCA9IGZ1bmN0aW9uIHRvZ2dsZVBpdm90KGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVBpdm90LFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZsYXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgaGVhZGVyLmdldFBpdm90VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFBpdm90VG9nZ2xlUHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIGhlYWRlcjogaGVhZGVyXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UGl2b3QgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0UGl2b3QpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBpdm90KCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRQaXZvdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbmF1bFBpdm90ID8gbnVsbCA6IGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICB0b2dnbGVQaXZvdDogdG9nZ2xlUGl2b3RcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMihyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIHBpdm90Q29sdW1ucyBhbmQgdGhlIHBpdm90IGNlbGwgZm9yIHRoZSByb3dcbiAgICAgIGNlbGwuaXNQaXZvdGVkID0gY2VsbC5jb2x1bW4uaXNQaXZvdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUkMSA9ICd1c2VSb3dTZWxlY3QnOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldFNlbGVjdGVkUm93cyA9ICdyZXNldFNlbGVjdGVkUm93cyc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c1NlbGVjdGVkID0gJ3RvZ2dsZUFsbFJvd3NTZWxlY3RlZCc7XG4gIGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQgPSAndG9nZ2xlUm93U2VsZWN0ZWQnO1xuICBhY3Rpb25zLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSAndG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCc7XG4gIHZhciB1c2VSb3dTZWxlY3QgPSBmdW5jdGlvbiB1c2VSb3dTZWxlY3QoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ4KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDgpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDMpO1xuICB9O1xuICB1c2VSb3dTZWxlY3QucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWUkMTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZVJvd1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICAgIHJvdyA9IF9yZWYucm93O1xuICAgIHZhciBfaW5zdGFuY2UkbWFudWFsUm93U2UgPSBpbnN0YW5jZS5tYW51YWxSb3dTZWxlY3RlZEtleSxcbiAgICAgICAgbWFudWFsUm93U2VsZWN0ZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsUm93U2UgPT09IHZvaWQgMCA/ICdpc1NlbGVjdGVkJyA6IF9pbnN0YW5jZSRtYW51YWxSb3dTZTtcbiAgICB2YXIgY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvdy5vcmlnaW5hbCAmJiByb3cub3JpZ2luYWxbbWFudWFsUm93U2VsZWN0ZWRLZXldKSB7XG4gICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tlZCA9IHJvdy5pc1NlbGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZChlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBSb3cgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogcm93LmlzU29tZVNlbGVjdGVkXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIEFsbCBSb3dzIFNlbGVjdGVkJyxcbiAgICAgIGluZGV0ZXJtaW5hdGU6IEJvb2xlYW4oIWluc3RhbmNlLmlzQWxsUm93c1NlbGVjdGVkICYmIE9iamVjdC5rZXlzKGluc3RhbmNlLnN0YXRlLnNlbGVjdGVkUm93SWRzKS5sZW5ndGgpXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYzLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ3VycmVudCBQYWdlIFJvd3MgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogQm9vbGVhbighaW5zdGFuY2UuaXNBbGxQYWdlUm93c1NlbGVjdGVkICYmIGluc3RhbmNlLnBhZ2Uuc29tZShmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgdmFyIGlkID0gX3JlZjQuaWQ7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSlcbiAgICB9XTtcbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkOChzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzZWxlY3RlZFJvd0lkczoge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3MpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5zZWxlY3RlZFJvd0lkcyB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIHNldFNlbGVjdGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGlzQWxsUm93c1NlbGVjdGVkID0gaW5zdGFuY2UuaXNBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgICBfaW5zdGFuY2Ukbm9uR3JvdXBlZFIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkID0gX2luc3RhbmNlJG5vbkdyb3VwZWRSID09PSB2b2lkIDAgPyByb3dzQnlJZCA6IF9pbnN0YW5jZSRub25Hcm91cGVkUjtcbiAgICAgIHZhciBzZWxlY3RBbGwgPSB0eXBlb2Ygc2V0U2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnID8gc2V0U2VsZWN0ZWQgOiAhaXNBbGxSb3dzU2VsZWN0ZWQ7IC8vIE9ubHkgcmVtb3ZlL2FkZCB0aGUgcm93cyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cbiAgICAgIC8vICBMZWF2ZSBhbGwgdGhlIG90aGVyIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWQgYWxvbmUuXG5cbiAgICAgIHZhciBzZWxlY3RlZFJvd0lkcyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgaWYgKHNlbGVjdEFsbCkge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dJZHNbcm93SWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGVjdGVkUm93SWRzW3Jvd0lkXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IHNlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQpIHtcbiAgICAgIHZhciBpZCA9IGFjdGlvbi5pZCxcbiAgICAgICAgICBfc2V0U2VsZWN0ZWQgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgX3Jvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvID0gaW5zdGFuY2Uuc2VsZWN0U3ViUm93cyxcbiAgICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvLFxuICAgICAgICAgIGdldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB2YXIgc2hvdWxkRXhpc3QgPSB0eXBlb2YgX3NldFNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZCA6ICFpc1NlbGVjdGVkO1xuXG4gICAgICBpZiAoaXNTZWxlY3RlZCA9PT0gc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3U2VsZWN0ZWRSb3dJZHMgPSBfZXh0ZW5kcyh7fSwgc3RhdGUuc2VsZWN0ZWRSb3dJZHMpO1xuXG4gICAgICB2YXIgaGFuZGxlUm93QnlJZCA9IGZ1bmN0aW9uIGhhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZFtpZF07XG5cbiAgICAgICAgaWYgKCFyb3cuaXNHcm91cGVkKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEV4aXN0KSB7XG4gICAgICAgICAgICBuZXdTZWxlY3RlZFJvd0lkc1tpZF0gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RTdWJSb3dzICYmIGdldFN1YlJvd3Mocm93KSkge1xuICAgICAgICAgIHJldHVybiBnZXRTdWJSb3dzKHJvdykuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGVSb3dCeUlkKGlkKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IG5ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIF9zZXRTZWxlY3RlZDIgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBwYWdlID0gaW5zdGFuY2UucGFnZSxcbiAgICAgICAgICBfcm93c0J5SWQyID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvMiA9IGluc3RhbmNlLnNlbGVjdFN1YlJvd3MsXG4gICAgICAgICAgX3NlbGVjdFN1YlJvd3MgPSBfaW5zdGFuY2Ukc2VsZWN0U3ViUm8yID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvMixcbiAgICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgX2dldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuXG4gICAgICB2YXIgX3NlbGVjdEFsbCA9IHR5cGVvZiBfc2V0U2VsZWN0ZWQyICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZDIgOiAhaXNBbGxQYWdlUm93c1NlbGVjdGVkO1xuXG4gICAgICB2YXIgX25ld1NlbGVjdGVkUm93SWRzID0gX2V4dGVuZHMoe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgdmFyIF9oYW5kbGVSb3dCeUlkID0gZnVuY3Rpb24gX2hhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZDJbaWRdO1xuXG4gICAgICAgIGlmICghcm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgIGlmIChfc2VsZWN0QWxsKSB7XG4gICAgICAgICAgICBfbmV3U2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIF9uZXdTZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9zZWxlY3RTdWJSb3dzICYmIF9nZXRTdWJSb3dzKHJvdykpIHtcbiAgICAgICAgICByZXR1cm4gX2dldFN1YlJvd3Mocm93KS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBfaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBwYWdlLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICByZXR1cm4gX2hhbmRsZVJvd0J5SWQocm93LmlkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzZWxlY3RlZFJvd0lkczogX25ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ4KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPT09IHZvaWQgMCA/IHJvd3NCeUlkIDogX2luc3RhbmNlJG5vbkdyb3VwZWRSMixcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNlID0gaW5zdGFuY2UuYXV0b1Jlc2V0U2VsZWN0ZWRSb3dzLFxuICAgICAgICBhdXRvUmVzZXRTZWxlY3RlZFJvd3MgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UsXG4gICAgICAgIHNlbGVjdGVkUm93SWRzID0gaW5zdGFuY2Uuc3RhdGUuc2VsZWN0ZWRSb3dJZHMsXG4gICAgICAgIF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMgPSBpbnN0YW5jZS5zZWxlY3RTdWJSb3dzLFxuICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvMyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlLFxuICAgICAgICBnZXRTdWJSb3dzID0gaW5zdGFuY2UuZ2V0U3ViUm93cztcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUZpbHRlcnMnLCAndXNlR3JvdXBCeScsICd1c2VTb3J0QnknLCAndXNlRXhwYW5kZWQnLCAndXNlUGFnaW5hdGlvbiddLCAndXNlUm93U2VsZWN0Jyk7XG4gICAgdmFyIHNlbGVjdGVkRmxhdFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxlY3RlZEZsYXRSb3dzID0gW107XG4gICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IHNlbGVjdFN1YlJvd3MgPyBnZXRSb3dJc1NlbGVjdGVkKHJvdywgc2VsZWN0ZWRSb3dJZHMsIGdldFN1YlJvd3MpIDogISFzZWxlY3RlZFJvd0lkc1tyb3cuaWRdO1xuICAgICAgICByb3cuaXNTZWxlY3RlZCA9ICEhaXNTZWxlY3RlZDtcbiAgICAgICAgcm93LmlzU29tZVNlbGVjdGVkID0gaXNTZWxlY3RlZCA9PT0gbnVsbDtcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEZsYXRSb3dzO1xuICAgIH0sIFtyb3dzLCBzZWxlY3RTdWJSb3dzLCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93c10pO1xuICAgIHZhciBpc0FsbFJvd3NTZWxlY3RlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5sZW5ndGggJiYgT2JqZWN0LmtleXMoc2VsZWN0ZWRSb3dJZHMpLmxlbmd0aCk7XG4gICAgdmFyIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9IGlzQWxsUm93c1NlbGVjdGVkO1xuXG4gICAgaWYgKGlzQWxsUm93c1NlbGVjdGVkKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIXNlbGVjdGVkUm93SWRzW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc0FsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgaWYgKHBhZ2UgJiYgcGFnZS5sZW5ndGggJiYgcGFnZS5zb21lKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgICB2YXIgaWQgPSBfcmVmNS5pZDtcbiAgICAgICAgcmV0dXJuICFzZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSkge1xuICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFNlbGVjdGVkUm93cyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBkYXRhXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlUm93U2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVJvd1NlbGVjdGVkLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICB2YXIgZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIHZhciBnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBzZWxlY3RlZEZsYXRSb3dzOiBzZWxlY3RlZEZsYXRSb3dzLFxuICAgICAgaXNBbGxSb3dzU2VsZWN0ZWQ6IGlzQWxsUm93c1NlbGVjdGVkLFxuICAgICAgaXNBbGxQYWdlUm93c1NlbGVjdGVkOiBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0b2dnbGVSb3dTZWxlY3RlZDogdG9nZ2xlUm93U2VsZWN0ZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQ6IHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyxcbiAgICAgIGdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wczogZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzLFxuICAgICAgdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZDogdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyQzKHJvdywgX3JlZjYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNi5pbnN0YW5jZTtcblxuICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVSb3dTZWxlY3RlZChyb3cuaWQsIHNldCk7XG4gICAgfTtcblxuICAgIHJvdy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoaW5zdGFuY2UuZ2V0SG9va3MoKS5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Um93SXNTZWxlY3RlZChyb3csIHNlbGVjdGVkUm93SWRzLCBnZXRTdWJSb3dzKSB7XG4gICAgaWYgKHNlbGVjdGVkUm93SWRzW3Jvdy5pZF0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdWJSb3dzID0gZ2V0U3ViUm93cyhyb3cpO1xuXG4gICAgaWYgKHN1YlJvd3MgJiYgc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgIHZhciBhbGxDaGlsZHJlblNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHZhciBzb21lU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoc3ViUm93KSB7XG4gICAgICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGtub3cgYm90aCBvZiB0aGVzZVxuICAgICAgICBpZiAoc29tZVNlbGVjdGVkICYmICFhbGxDaGlsZHJlblNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldFJvd0lzU2VsZWN0ZWQoc3ViUm93LCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93cykpIHtcbiAgICAgICAgICBzb21lU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFsbENoaWxkcmVuU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWxsQ2hpbGRyZW5TZWxlY3RlZCA/IHRydWUgOiBzb21lU2VsZWN0ZWQgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3Nvcihyb3cpIHtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgPSBmdW5jdGlvbiBkZWZhdWx0SW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yKGNlbGwpIHtcbiAgICByZXR1cm4ge307XG4gIH07IC8vIEFjdGlvbnNcblxuXG4gIGFjdGlvbnMuc2V0Um93U3RhdGUgPSAnc2V0Um93U3RhdGUnO1xuICBhY3Rpb25zLnNldENlbGxTdGF0ZSA9ICdzZXRDZWxsU3RhdGUnO1xuICBhY3Rpb25zLnJlc2V0Um93U3RhdGUgPSAncmVzZXRSb3dTdGF0ZSc7XG4gIHZhciB1c2VSb3dTdGF0ZSA9IGZ1bmN0aW9uIHVzZVJvd1N0YXRlKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkOSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ5KTtcbiAgICBob29rcy5wcmVwYXJlUm93LnB1c2gocHJlcGFyZVJvdyQ0KTtcbiAgfTtcbiAgdXNlUm93U3RhdGUucGx1Z2luTmFtZSA9ICd1c2VSb3dTdGF0ZSc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ5KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgdmFyIF9pbnN0YW5jZSRpbml0aWFsUm93UyA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UyA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yIDogX2luc3RhbmNlJGluaXRpYWxSb3dTLFxuICAgICAgICBfaW5zdGFuY2UkaW5pdGlhbENlbGwgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZDtcblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICByb3dTdGF0ZToge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSb3dTdGF0ZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICByb3dTdGF0ZTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnJvd1N0YXRlIHx8IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0Um93U3RhdGUpIHtcbiAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgIHZhciByb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBvbGRSb3dTdGF0ZSA9IHR5cGVvZiBzdGF0ZS5yb3dTdGF0ZVtyb3dJZF0gIT09ICd1bmRlZmluZWQnID8gc3RhdGUucm93U3RhdGVbcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbcm93SWRdKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcm93U3RhdGU6IF9leHRlbmRzKHt9LCBzdGF0ZS5yb3dTdGF0ZSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcm93SWRdID0gZnVuY3Rpb25hbFVwZGF0ZSh2YWx1ZSwgb2xkUm93U3RhdGUpLCBfZXh0ZW5kczIpKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENlbGxTdGF0ZSkge1xuICAgICAgdmFyIF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCwgX3Jvd3NCeUlkJF9yb3dJZCwgX3Jvd3NCeUlkJF9yb3dJZCRjZWxsLCBfZXh0ZW5kczMsIF9leHRlbmRzNDtcblxuICAgICAgdmFyIF9yb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBfdmFsdWUgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBfb2xkUm93U3RhdGUgPSB0eXBlb2Ygc3RhdGUucm93U3RhdGVbX3Jvd0lkXSAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZS5yb3dTdGF0ZVtfcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbX3Jvd0lkXSk7XG5cbiAgICAgIHZhciBvbGRDZWxsU3RhdGUgPSB0eXBlb2YgKF9vbGRSb3dTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogKF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCA9IF9vbGRSb3dTdGF0ZS5jZWxsU3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfb2xkUm93U3RhdGUkY2VsbFN0YXRbY29sdW1uSWRdKSAhPT0gJ3VuZGVmaW5lZCcgPyBfb2xkUm93U3RhdGUuY2VsbFN0YXRlW2NvbHVtbklkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcigoX3Jvd3NCeUlkJF9yb3dJZCA9IHJvd3NCeUlkW19yb3dJZF0pID09IG51bGwgPyB2b2lkIDAgOiAoX3Jvd3NCeUlkJF9yb3dJZCRjZWxsID0gX3Jvd3NCeUlkJF9yb3dJZC5jZWxscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9yb3dzQnlJZCRfcm93SWQkY2VsbC5maW5kKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgIHJldHVybiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHJvd1N0YXRlOiBfZXh0ZW5kcyh7fSwgc3RhdGUucm93U3RhdGUsIChfZXh0ZW5kczQgPSB7fSwgX2V4dGVuZHM0W19yb3dJZF0gPSBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLCB7XG4gICAgICAgICAgY2VsbFN0YXRlOiBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLmNlbGxTdGF0ZSB8fCB7fSwgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNbY29sdW1uSWRdID0gZnVuY3Rpb25hbFVwZGF0ZShfdmFsdWUsIG9sZENlbGxTdGF0ZSksIF9leHRlbmRzMykpXG4gICAgICAgIH0pLCBfZXh0ZW5kczQpKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkOShpbnN0YW5jZSkge1xuICAgIHZhciBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPSBpbnN0YW5jZS5hdXRvUmVzZXRSb3dTdGF0ZSxcbiAgICAgICAgYXV0b1Jlc2V0Um93U3RhdGUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8sXG4gICAgICAgIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIHZhciBzZXRSb3dTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3dJZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Um93U3RhdGUsXG4gICAgICAgIHJvd0lkOiByb3dJZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0Q2VsbFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHJvd0lkLCBjb2x1bW5JZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Q2VsbFN0YXRlLFxuICAgICAgICByb3dJZDogcm93SWQsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0Um93U3RhdGUgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0Um93U3RhdGUpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFJvd1N0YXRlKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSb3dTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHNldFJvd1N0YXRlOiBzZXRSb3dTdGF0ZSxcbiAgICAgIHNldENlbGxTdGF0ZTogc2V0Q2VsbFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlUm93JDQocm93LCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICB2YXIgX2luc3RhbmNlJGluaXRpYWxSb3dTMiA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UzIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsUm93UzIsXG4gICAgICAgIF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgOiBfaW5zdGFuY2UkaW5pdGlhbENlbGwyLFxuICAgICAgICByb3dTdGF0ZSA9IGluc3RhbmNlLnN0YXRlLnJvd1N0YXRlO1xuXG4gICAgaWYgKHJvdykge1xuICAgICAgcm93LnN0YXRlID0gdHlwZW9mIHJvd1N0YXRlW3Jvdy5pZF0gIT09ICd1bmRlZmluZWQnID8gcm93U3RhdGVbcm93LmlkXSA6IGluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yKHJvdyk7XG5cbiAgICAgIHJvdy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zZXRSb3dTdGF0ZShyb3cuaWQsIHVwZGF0ZXIpO1xuICAgICAgfTtcblxuICAgICAgcm93LmNlbGxzLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgaWYgKCFyb3cuc3RhdGUuY2VsbFN0YXRlKSB7XG4gICAgICAgICAgcm93LnN0YXRlLmNlbGxTdGF0ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbC5zdGF0ZSA9IHR5cGVvZiByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSAhPT0gJ3VuZGVmaW5lZCcgPyByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcihjZWxsKTtcblxuICAgICAgICBjZWxsLnNldFN0YXRlID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Q2VsbFN0YXRlKHJvdy5pZCwgY2VsbC5jb2x1bW4uaWQsIHVwZGF0ZXIpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9ucy5yZXNldENvbHVtbk9yZGVyID0gJ3Jlc2V0Q29sdW1uT3JkZXInO1xuICBhY3Rpb25zLnNldENvbHVtbk9yZGVyID0gJ3NldENvbHVtbk9yZGVyJztcbiAgdmFyIHVzZUNvbHVtbk9yZGVyID0gZnVuY3Rpb24gdXNlQ29sdW1uT3JkZXIoaG9va3MpIHtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciRhKTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmNvbHVtbk9yZGVyXSk7XG4gICAgfSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnMucHVzaCh2aXNpYmxlQ29sdW1ucyQyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJGEpO1xuICB9O1xuICB1c2VDb2x1bW5PcmRlci5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtbk9yZGVyJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJGEoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uT3JkZXI6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0Q29sdW1uT3JkZXIpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uT3JkZXI6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlciB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGNvbHVtbk9yZGVyOiBmdW5jdGlvbmFsVXBkYXRlKGFjdGlvbi5jb2x1bW5PcmRlciwgc3RhdGUuY29sdW1uT3JkZXIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyQyKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbk9yZGVyID0gX3JlZjIuaW5zdGFuY2Uuc3RhdGUuY29sdW1uT3JkZXI7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBvcmRlciwgcmV0dXJuIHRoZSBub3JtYWwgY29sdW1uc1xuICAgIGlmICghY29sdW1uT3JkZXIgfHwgIWNvbHVtbk9yZGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgdmFyIGNvbHVtbk9yZGVyQ29weSA9IFtdLmNvbmNhdChjb2x1bW5PcmRlcik7IC8vIElmIHRoZXJlIGlzIGFuIG9yZGVyLCBtYWtlIGEgY29weSBvZiB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnNDb3B5ID0gW10uY29uY2F0KGNvbHVtbnMpOyAvLyBBbmQgbWFrZSBhIG5ldyBvcmRlcmVkIGFycmF5IG9mIHRoZSBjb2x1bW5zXG5cbiAgICB2YXIgY29sdW1uc0luT3JkZXIgPSBbXTsgLy8gTG9vcCBvdmVyIHRoZSBjb2x1bW5zIGFuZCBwbGFjZSB0aGVtIGluIG9yZGVyIGludG8gdGhlIG5ldyBhcnJheVxuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgdGFyZ2V0Q29sdW1uSWQgPSBjb2x1bW5PcmRlckNvcHkuc2hpZnQoKTtcbiAgICAgIHZhciBmb3VuZEluZGV4ID0gY29sdW1uc0NvcHkuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSB0YXJnZXRDb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZm91bmRJbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbHVtbnNJbk9yZGVyLnB1c2goY29sdW1uc0NvcHkuc3BsaWNlKGZvdW5kSW5kZXgsIDEpWzBdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKGNvbHVtbnNDb3B5Lmxlbmd0aCAmJiBjb2x1bW5PcmRlckNvcHkubGVuZ3RoKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIGFueSBjb2x1bW5zIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBlbmRcblxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb2x1bW5zSW5PcmRlciwgY29sdW1uc0NvcHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYShpbnN0YW5jZSkge1xuICAgIHZhciBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGluc3RhbmNlLnNldENvbHVtbk9yZGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldENvbHVtbk9yZGVyLFxuICAgICAgICBjb2x1bW5PcmRlcjogY29sdW1uT3JkZXJcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICB9XG5cbiAgZGVmYXVsdENvbHVtbi5jYW5SZXNpemUgPSB0cnVlOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nID0gJ2NvbHVtblN0YXJ0UmVzaXppbmcnO1xuICBhY3Rpb25zLmNvbHVtblJlc2l6aW5nID0gJ2NvbHVtblJlc2l6aW5nJztcbiAgYWN0aW9ucy5jb2x1bW5Eb25lUmVzaXppbmcgPSAnY29sdW1uRG9uZVJlc2l6aW5nJztcbiAgYWN0aW9ucy5yZXNldFJlc2l6ZSA9ICdyZXNldFJlc2l6ZSc7XG4gIHZhciB1c2VSZXNpemVDb2x1bW5zID0gZnVuY3Rpb24gdXNlUmVzaXplQ29sdW1ucyhob29rcykge1xuICAgIGhvb2tzLmdldFJlc2l6ZXJQcm9wcyA9IFtkZWZhdWx0R2V0UmVzaXplclByb3BzXTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICB9XG4gICAgfSk7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYik7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSRiKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSZXNpemVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UmVzaXplclByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgaGVhZGVyID0gX3JlZi5oZWFkZXI7XG4gICAgdmFyIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2g7XG5cbiAgICB2YXIgb25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKSB7XG4gICAgICB2YXIgaXNUb3VjaEV2ZW50ID0gZmFsc2U7XG5cbiAgICAgIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICAvLyBsZXRzIG5vdCByZXNwb25kIHRvIG11bHRpcGxlIHRvdWNoZXMgKGUuZy4gMiBvciAzIGZpbmdlcnMpXG4gICAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpc1RvdWNoRXZlbnQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVhZGVyc1RvUmVzaXplID0gZ2V0TGVhZkhlYWRlcnMoaGVhZGVyKTtcbiAgICAgIHZhciBoZWFkZXJJZFdpZHRocyA9IGhlYWRlcnNUb1Jlc2l6ZS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIFtkLmlkLCBkLnRvdGFsV2lkdGhdO1xuICAgICAgfSk7XG4gICAgICB2YXIgY2xpZW50WCA9IGlzVG91Y2hFdmVudCA/IE1hdGgucm91bmQoZS50b3VjaGVzWzBdLmNsaWVudFgpIDogZS5jbGllbnRYO1xuXG4gICAgICB2YXIgZGlzcGF0Y2hNb3ZlID0gZnVuY3Rpb24gZGlzcGF0Y2hNb3ZlKGNsaWVudFhQb3MpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uUmVzaXppbmcsXG4gICAgICAgICAgY2xpZW50WDogY2xpZW50WFBvc1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBkaXNwYXRjaEVuZCA9IGZ1bmN0aW9uIGRpc3BhdGNoRW5kKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uRG9uZVJlc2l6aW5nXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdmFyIGhhbmRsZXJzQW5kRXZlbnRzID0ge1xuICAgICAgICBtb3VzZToge1xuICAgICAgICAgIG1vdmVFdmVudDogJ21vdXNlbW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaE1vdmUoZS5jbGllbnRYKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwRXZlbnQ6ICdtb3VzZXVwJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyc0FuZEV2ZW50cy5tb3VzZS5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlcnNBbmRFdmVudHMubW91c2UudXBIYW5kbGVyKTtcbiAgICAgICAgICAgIGRpc3BhdGNoRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0b3VjaDoge1xuICAgICAgICAgIG1vdmVFdmVudDogJ3RvdWNobW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaE1vdmUoZS50b3VjaGVzWzBdLmNsaWVudFgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBFdmVudDogJ3RvdWNoZW5kJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXJzQW5kRXZlbnRzLnRvdWNoLm1vdmVFdmVudCwgaGFuZGxlcnNBbmRFdmVudHMudG91Y2gubW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC51cEV2ZW50LCBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkaXNwYXRjaEVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBldmVudHMgPSBpc1RvdWNoRXZlbnQgPyBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaCA6IGhhbmRsZXJzQW5kRXZlbnRzLm1vdXNlO1xuICAgICAgdmFyIHBhc3NpdmVJZlN1cHBvcnRlZCA9IHBhc3NpdmVFdmVudFN1cHBvcnRlZCgpID8ge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSA6IGZhbHNlO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZUV2ZW50LCBldmVudHMubW92ZUhhbmRsZXIsIHBhc3NpdmVJZlN1cHBvcnRlZCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy51cEV2ZW50LCBldmVudHMudXBIYW5kbGVyLCBwYXNzaXZlSWZTdXBwb3J0ZWQpO1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmNvbHVtblN0YXJ0UmVzaXppbmcsXG4gICAgICAgIGNvbHVtbklkOiBoZWFkZXIuaWQsXG4gICAgICAgIGNvbHVtbldpZHRoOiBoZWFkZXIudG90YWxXaWR0aCxcbiAgICAgICAgaGVhZGVySWRXaWR0aHM6IGhlYWRlcklkV2lkdGhzLFxuICAgICAgICBjbGllbnRYOiBjbGllbnRYXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucGVyc2lzdCgpIHx8IG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKTtcbiAgICAgIH0sXG4gICAgICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgICAgIHJldHVybiBlLnBlcnNpc3QoKSB8fCBvblJlc2l6ZVN0YXJ0KGUsIGhlYWRlcik7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgIH0sXG4gICAgICBkcmFnZ2FibGU6IGZhbHNlLFxuICAgICAgcm9sZTogJ3NlcGFyYXRvcidcbiAgICB9XTtcbiAgfTtcblxuICB1c2VSZXNpemVDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUmVzaXplQ29sdW1ucyc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRiKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSZXNpemUpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nKSB7XG4gICAgICB2YXIgY2xpZW50WCA9IGFjdGlvbi5jbGllbnRYLFxuICAgICAgICAgIGNvbHVtbklkID0gYWN0aW9uLmNvbHVtbklkLFxuICAgICAgICAgIGNvbHVtbldpZHRoID0gYWN0aW9uLmNvbHVtbldpZHRoLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzID0gYWN0aW9uLmhlYWRlcklkV2lkdGhzO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBjbGllbnRYLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzOiBoZWFkZXJJZFdpZHRocyxcbiAgICAgICAgICBjb2x1bW5XaWR0aDogY29sdW1uV2lkdGgsXG4gICAgICAgICAgaXNSZXNpemluZ0NvbHVtbjogY29sdW1uSWRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5SZXNpemluZykge1xuICAgICAgdmFyIF9jbGllbnRYID0gYWN0aW9uLmNsaWVudFg7XG5cbiAgICAgIHZhciBfc3RhdGUkY29sdW1uUmVzaXppbmcgPSBzdGF0ZS5jb2x1bW5SZXNpemluZyxcbiAgICAgICAgICBzdGFydFggPSBfc3RhdGUkY29sdW1uUmVzaXppbmcuc3RhcnRYLFxuICAgICAgICAgIF9jb2x1bW5XaWR0aCA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICBfc3RhdGUkY29sdW1uUmVzaXppbmcyID0gX3N0YXRlJGNvbHVtblJlc2l6aW5nLmhlYWRlcklkV2lkdGhzLFxuICAgICAgICAgIF9oZWFkZXJJZFdpZHRocyA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZzIgPT09IHZvaWQgMCA/IFtdIDogX3N0YXRlJGNvbHVtblJlc2l6aW5nMjtcblxuICAgICAgdmFyIGRlbHRhWCA9IF9jbGllbnRYIC0gc3RhcnRYO1xuICAgICAgdmFyIHBlcmNlbnRhZ2VEZWx0YVggPSBkZWx0YVggLyBfY29sdW1uV2lkdGg7XG4gICAgICB2YXIgbmV3Q29sdW1uV2lkdGhzID0ge307XG5cbiAgICAgIF9oZWFkZXJJZFdpZHRocy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIgaGVhZGVySWQgPSBfcmVmMlswXSxcbiAgICAgICAgICAgIGhlYWRlcldpZHRoID0gX3JlZjJbMV07XG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1toZWFkZXJJZF0gPSBNYXRoLm1heChoZWFkZXJXaWR0aCArIGhlYWRlcldpZHRoICogcGVyY2VudGFnZURlbHRhWCwgMCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBfZXh0ZW5kcyh7fSwgc3RhdGUuY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzLCB7fSwgbmV3Q29sdW1uV2lkdGhzKVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNvbHVtbkRvbmVSZXNpemluZykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBudWxsLFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IG51bGxcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSA9IGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBkaXNhYmxlUmVzaXppbmcgPSBpbnN0YW5jZS5kaXNhYmxlUmVzaXppbmcsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGNvbHVtblJlc2l6aW5nID0gaW5zdGFuY2Uuc3RhdGUuY29sdW1uUmVzaXppbmc7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIHZhciBjYW5SZXNpemUgPSBnZXRGaXJzdERlZmluZWQoaGVhZGVyLmRpc2FibGVSZXNpemluZyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUmVzaXppbmcgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBoZWFkZXIuY2FuUmVzaXplID0gY2FuUmVzaXplO1xuICAgICAgaGVhZGVyLndpZHRoID0gY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzW2hlYWRlci5pZF0gfHwgaGVhZGVyLm9yaWdpbmFsV2lkdGggfHwgaGVhZGVyLndpZHRoO1xuICAgICAgaGVhZGVyLmlzUmVzaXppbmcgPSBjb2x1bW5SZXNpemluZy5pc1Jlc2l6aW5nQ29sdW1uID09PSBoZWFkZXIuaWQ7XG5cbiAgICAgIGlmIChjYW5SZXNpemUpIHtcbiAgICAgICAgaGVhZGVyLmdldFJlc2l6ZXJQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0UmVzaXplclByb3BzLCB7XG4gICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYihpbnN0YW5jZSkge1xuICAgIHZhciBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFJlID0gaW5zdGFuY2UuYXV0b1Jlc2V0UmVzaXplLFxuICAgICAgICBhdXRvUmVzZXRSZXNpemUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUsXG4gICAgICAgIGNvbHVtbnMgPSBpbnN0YW5jZS5jb2x1bW5zO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQWJzb2x1dGVMYXlvdXQnXSwgJ3VzZVJlc2l6ZUNvbHVtbnMnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UmVzaXplID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFJlc2l6ZSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0UmVzaXplKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2NvbHVtbnNdKTtcbiAgICB2YXIgcmVzZXRSZXNpemluZyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHJlc2V0UmVzaXppbmc6IHJlc2V0UmVzaXppbmdcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlYWZIZWFkZXJzKGhlYWRlcikge1xuICAgIHZhciBsZWFmSGVhZGVycyA9IFtdO1xuXG4gICAgdmFyIHJlY3Vyc2VIZWFkZXIgPSBmdW5jdGlvbiByZWN1cnNlSGVhZGVyKGhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlci5jb2x1bW5zICYmIGhlYWRlci5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5tYXAocmVjdXJzZUhlYWRlcik7XG4gICAgICB9XG5cbiAgICAgIGxlYWZIZWFkZXJzLnB1c2goaGVhZGVyKTtcbiAgICB9O1xuXG4gICAgcmVjdXJzZUhlYWRlcihoZWFkZXIpO1xuICAgIHJldHVybiBsZWFmSGVhZGVycztcbiAgfVxuXG4gIHZhciBjZWxsU3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMFxuICB9O1xuICB2YXIgdXNlQWJzb2x1dGVMYXlvdXQgPSBmdW5jdGlvbiB1c2VBYnNvbHV0ZUxheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFRhYmxlQm9keVByb3BzLnB1c2goZ2V0Um93U3R5bGVzKTtcbiAgICBob29rcy5nZXRSb3dQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmLmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY29sdW1uLnRvdGFsTGVmdCArIFwicHhcIixcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldENlbGxQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjZWxsID0gX3JlZjIuY2VsbDtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY2VsbC5jb2x1bW4udG90YWxMZWZ0ICsgXCJweFwiLFxuICAgICAgICAgIHdpZHRoOiBjZWxsLmNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRGb290ZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjMpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcywge1xuICAgICAgICAgIGxlZnQ6IGNvbHVtbi50b3RhbExlZnQgKyBcInB4XCIsXG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgfTtcbiAgdXNlQWJzb2x1dGVMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VBYnNvbHV0ZUxheW91dCc7XG5cbiAgdmFyIGdldFJvd1N0eWxlcyA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6IGluc3RhbmNlLnRvdGFsQ29sdW1uc1dpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGNlbGxTdHlsZXMkMSA9IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMSA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICB3aWR0aDogaW5zdGFuY2UudG90YWxDb2x1bW5zV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgdXNlQmxvY2tMYXlvdXQgPSBmdW5jdGlvbiB1c2VCbG9ja0xheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDEpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMSk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQxKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYzKSB7XG4gICAgICB2YXIgY2VsbCA9IF9yZWYzLmNlbGw7XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZnVuY3Rpb24gKHByb3BzLCBfcmVmNCkge1xuICAgICAgdmFyIGNvbHVtbiA9IF9yZWY0LmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzJDEsIHtcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICB9O1xuICB1c2VCbG9ja0xheW91dC5wbHVnaW5OYW1lID0gJ3VzZUJsb2NrTGF5b3V0JztcblxuICBmdW5jdGlvbiB1c2VGbGV4TGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMpO1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDIpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMik7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQyKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGdldEhlYWRlclByb3BzKTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChnZXRDZWxsUHJvcHMpO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZ2V0Rm9vdGVyUHJvcHMpO1xuICB9XG4gIHVzZUZsZXhMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VGbGV4TGF5b3V0JztcblxuICB2YXIgZ2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMiA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXg6ICcxIDAgYXV0bycsXG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRIZWFkZXJQcm9wcyA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgIGZsZXg6IGNvbHVtbi50b3RhbEZsZXhXaWR0aCA/IGNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiIDogdW5kZWZpbmVkLFxuICAgICAgICBtaW5XaWR0aDogY29sdW1uLnRvdGFsTWluV2lkdGggKyBcInB4XCIsXG4gICAgICAgIHdpZHRoOiBjb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRDZWxsUHJvcHMgPSBmdW5jdGlvbiBnZXRDZWxsUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGNlbGwgPSBfcmVmNC5jZWxsO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjZWxsLmNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiLFxuICAgICAgICBtaW5XaWR0aDogY2VsbC5jb2x1bW4udG90YWxNaW5XaWR0aCArIFwicHhcIixcbiAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0Rm9vdGVyUHJvcHMgPSBmdW5jdGlvbiBnZXRGb290ZXJQcm9wcyhwcm9wcywgX3JlZjUpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjUuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjb2x1bW4udG90YWxGbGV4V2lkdGggPyBjb2x1bW4udG90YWxGbGV4V2lkdGggKyBcIiAwIGF1dG9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluV2lkdGg6IGNvbHVtbi50b3RhbE1pbldpZHRoICsgXCJweFwiLFxuICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiB1c2VHcmlkTGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYyk7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMkMSk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChnZXRIZWFkZXJQcm9wcyQxKTtcbiAgfVxuICB1c2VHcmlkTGF5b3V0LnBsdWdpbk5hbWUgPSAndXNlR3JpZExheW91dCc7XG5cbiAgdmFyIGdldFRhYmxlUHJvcHMkMSA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICAgICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBpbnN0YW5jZS5zdGF0ZS5ncmlkTGF5b3V0LmNvbHVtbldpZHRocy5tYXAoZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSkuam9pbihcIiBcIilcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0SGVhZGVyUHJvcHMkMSA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgaWQ6IFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW4uaWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIiAvL2VuYWJsZXMgYSBzY3JvbGwgd3JhcHBlciB0byBiZSBwbGFjZWQgYXJvdW5kIHRoZSB0YWJsZSBhbmQgaGF2ZSBzdGlja3kgaGVhZGVyc1xuXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRjKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBcImluaXRcIikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZ3JpZExheW91dDoge1xuICAgICAgICAgIGNvbHVtbldpZHRoczogaW5zdGFuY2UuY29sdW1ucy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiY29sdW1uU3RhcnRSZXNpemluZ1wiKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQ7XG4gICAgICB2YXIgY29sdW1uSW5kZXggPSBpbnN0YW5jZS52aXNpYmxlQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIGVsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpO1xuXG4gICAgICBpZiAoZWxXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncmlkTGF5b3V0OiBfZXh0ZW5kcyh7fSwgc3RhdGUuZ3JpZExheW91dCwge1xuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgc3RhcnRpbmdXaWR0aDogZWxXaWR0aFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJjb2x1bW5SZXNpemluZ1wiKSB7XG4gICAgICB2YXIgX3N0YXRlJGdyaWRMYXlvdXQgPSBzdGF0ZS5ncmlkTGF5b3V0LFxuICAgICAgICAgIF9jb2x1bW5JbmRleCA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbkluZGV4LFxuICAgICAgICAgIHN0YXJ0aW5nV2lkdGggPSBfc3RhdGUkZ3JpZExheW91dC5zdGFydGluZ1dpZHRoLFxuICAgICAgICAgIGNvbHVtbldpZHRocyA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbldpZHRocztcbiAgICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5jb2x1bW5SZXNpemluZy5zdGFydFggLSBhY3Rpb24uY2xpZW50WDtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHN0YXJ0aW5nV2lkdGggLSBjaGFuZ2U7XG4gICAgICB2YXIgY29sdW1uV2lkdGhzQ29weSA9IFtdLmNvbmNhdChjb2x1bW5XaWR0aHMpO1xuICAgICAgY29sdW1uV2lkdGhzQ29weVtfY29sdW1uSW5kZXhdID0gbmV3V2lkdGggKyBcInB4XCI7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdyaWRMYXlvdXQ6IF9leHRlbmRzKHt9LCBzdGF0ZS5ncmlkTGF5b3V0LCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBjb2x1bW5XaWR0aHNDb3B5XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpIHtcbiAgICB2YXIgX2RvY3VtZW50JGdldEVsZW1lbnRCO1xuXG4gICAgdmFyIHdpZHRoID0gKF9kb2N1bWVudCRnZXRFbGVtZW50QiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW5JZCkpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jdW1lbnQkZ2V0RWxlbWVudEIub2Zmc2V0V2lkdGg7XG5cbiAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydHMuX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnM7XG4gIGV4cG9ydHMuYWN0aW9ucyA9IGFjdGlvbnM7XG4gIGV4cG9ydHMuZGVmYXVsdENvbHVtbiA9IGRlZmF1bHRDb2x1bW47XG4gIGV4cG9ydHMuZGVmYXVsdEdyb3VwQnlGbiA9IGRlZmF1bHRHcm91cEJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdE9yZGVyQnlGbiA9IGRlZmF1bHRPcmRlckJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdFJlbmRlcmVyID0gZGVmYXVsdFJlbmRlcmVyO1xuICBleHBvcnRzLmVtcHR5UmVuZGVyZXIgPSBlbXB0eVJlbmRlcmVyO1xuICBleHBvcnRzLmVuc3VyZVBsdWdpbk9yZGVyID0gZW5zdXJlUGx1Z2luT3JkZXI7XG4gIGV4cG9ydHMuZmxleFJlbmRlciA9IGZsZXhSZW5kZXI7XG4gIGV4cG9ydHMuZnVuY3Rpb25hbFVwZGF0ZSA9IGZ1bmN0aW9uYWxVcGRhdGU7XG4gIGV4cG9ydHMubG9vcEhvb2tzID0gbG9vcEhvb2tzO1xuICBleHBvcnRzLm1ha2VQcm9wR2V0dGVyID0gbWFrZVByb3BHZXR0ZXI7XG4gIGV4cG9ydHMubWFrZVJlbmRlcmVyID0gbWFrZVJlbmRlcmVyO1xuICBleHBvcnRzLnJlZHVjZUhvb2tzID0gcmVkdWNlSG9va3M7XG4gIGV4cG9ydHMuc2FmZVVzZUxheW91dEVmZmVjdCA9IHNhZmVVc2VMYXlvdXRFZmZlY3Q7XG4gIGV4cG9ydHMudXNlQWJzb2x1dGVMYXlvdXQgPSB1c2VBYnNvbHV0ZUxheW91dDtcbiAgZXhwb3J0cy51c2VBc3luY0RlYm91bmNlID0gdXNlQXN5bmNEZWJvdW5jZTtcbiAgZXhwb3J0cy51c2VCbG9ja0xheW91dCA9IHVzZUJsb2NrTGF5b3V0O1xuICBleHBvcnRzLnVzZUNvbHVtbk9yZGVyID0gdXNlQ29sdW1uT3JkZXI7XG4gIGV4cG9ydHMudXNlRXhwYW5kZWQgPSB1c2VFeHBhbmRlZDtcbiAgZXhwb3J0cy51c2VGaWx0ZXJzID0gdXNlRmlsdGVycztcbiAgZXhwb3J0cy51c2VGbGV4TGF5b3V0ID0gdXNlRmxleExheW91dDtcbiAgZXhwb3J0cy51c2VHZXRMYXRlc3QgPSB1c2VHZXRMYXRlc3Q7XG4gIGV4cG9ydHMudXNlR2xvYmFsRmlsdGVyID0gdXNlR2xvYmFsRmlsdGVyO1xuICBleHBvcnRzLnVzZUdyaWRMYXlvdXQgPSB1c2VHcmlkTGF5b3V0O1xuICBleHBvcnRzLnVzZUdyb3VwQnkgPSB1c2VHcm91cEJ5O1xuICBleHBvcnRzLnVzZU1vdW50ZWRMYXlvdXRFZmZlY3QgPSB1c2VNb3VudGVkTGF5b3V0RWZmZWN0O1xuICBleHBvcnRzLnVzZVBhZ2luYXRpb24gPSB1c2VQYWdpbmF0aW9uO1xuICBleHBvcnRzLnVzZVJlc2l6ZUNvbHVtbnMgPSB1c2VSZXNpemVDb2x1bW5zO1xuICBleHBvcnRzLnVzZVJvd1NlbGVjdCA9IHVzZVJvd1NlbGVjdDtcbiAgZXhwb3J0cy51c2VSb3dTdGF0ZSA9IHVzZVJvd1N0YXRlO1xuICBleHBvcnRzLnVzZVNvcnRCeSA9IHVzZVNvcnRCeTtcbiAgZXhwb3J0cy51c2VUYWJsZSA9IHVzZVRhYmxlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC10YWJsZS5kZXZlbG9wbWVudC5qcy5tYXBcbiIsImlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLnByb2R1Y3Rpb24ubWluLmpzJylcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzJylcbn1cbiIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyB0aW1lb3V0c1NoYXBlIH0gZnJvbSAnLi91dGlscy9Qcm9wVHlwZXMnO1xuaW1wb3J0IFRyYW5zaXRpb25Hcm91cENvbnRleHQgZnJvbSAnLi9UcmFuc2l0aW9uR3JvdXBDb250ZXh0JztcbmV4cG9ydCB2YXIgVU5NT1VOVEVEID0gJ3VubW91bnRlZCc7XG5leHBvcnQgdmFyIEVYSVRFRCA9ICdleGl0ZWQnO1xuZXhwb3J0IHZhciBFTlRFUklORyA9ICdlbnRlcmluZyc7XG5leHBvcnQgdmFyIEVOVEVSRUQgPSAnZW50ZXJlZCc7XG5leHBvcnQgdmFyIEVYSVRJTkcgPSAnZXhpdGluZyc7XG4vKipcbiAqIFRoZSBUcmFuc2l0aW9uIGNvbXBvbmVudCBsZXRzIHlvdSBkZXNjcmliZSBhIHRyYW5zaXRpb24gZnJvbSBvbmUgY29tcG9uZW50XG4gKiBzdGF0ZSB0byBhbm90aGVyIF9vdmVyIHRpbWVfIHdpdGggYSBzaW1wbGUgZGVjbGFyYXRpdmUgQVBJLiBNb3N0IGNvbW1vbmx5XG4gKiBpdCdzIHVzZWQgdG8gYW5pbWF0ZSB0aGUgbW91bnRpbmcgYW5kIHVubW91bnRpbmcgb2YgYSBjb21wb25lbnQsIGJ1dCBjYW4gYWxzb1xuICogYmUgdXNlZCB0byBkZXNjcmliZSBpbi1wbGFjZSB0cmFuc2l0aW9uIHN0YXRlcyBhcyB3ZWxsLlxuICpcbiAqIC0tLVxuICpcbiAqICoqTm90ZSoqOiBgVHJhbnNpdGlvbmAgaXMgYSBwbGF0Zm9ybS1hZ25vc3RpYyBiYXNlIGNvbXBvbmVudC4gSWYgeW91J3JlIHVzaW5nXG4gKiB0cmFuc2l0aW9ucyBpbiBDU1MsIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZVxuICogW2BDU1NUcmFuc2l0aW9uYF0oaHR0cHM6Ly9yZWFjdGNvbW11bml0eS5vcmcvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9jc3MtdHJhbnNpdGlvbilcbiAqIGluc3RlYWQuIEl0IGluaGVyaXRzIGFsbCB0aGUgZmVhdHVyZXMgb2YgYFRyYW5zaXRpb25gLCBidXQgY29udGFpbnNcbiAqIGFkZGl0aW9uYWwgZmVhdHVyZXMgbmVjZXNzYXJ5IHRvIHBsYXkgbmljZSB3aXRoIENTUyB0cmFuc2l0aW9ucyAoaGVuY2UgdGhlXG4gKiBuYW1lIG9mIHRoZSBjb21wb25lbnQpLlxuICpcbiAqIC0tLVxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgZG9lcyBub3QgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHRoZVxuICogY29tcG9uZW50IGl0IHJlbmRlcnMsIGl0IG9ubHkgdHJhY2tzIFwiZW50ZXJcIiBhbmQgXCJleGl0XCIgc3RhdGVzIGZvciB0aGVcbiAqIGNvbXBvbmVudHMuIEl0J3MgdXAgdG8geW91IHRvIGdpdmUgbWVhbmluZyBhbmQgZWZmZWN0IHRvIHRob3NlIHN0YXRlcy4gRm9yXG4gKiBleGFtcGxlIHdlIGNhbiBhZGQgc3R5bGVzIHRvIGEgY29tcG9uZW50IHdoZW4gaXQgZW50ZXJzIG9yIGV4aXRzOlxuICpcbiAqIGBgYGpzeFxuICogaW1wb3J0IHsgVHJhbnNpdGlvbiB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAnO1xuICpcbiAqIGNvbnN0IGR1cmF0aW9uID0gMzAwO1xuICpcbiAqIGNvbnN0IGRlZmF1bHRTdHlsZSA9IHtcbiAqICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHtkdXJhdGlvbn1tcyBlYXNlLWluLW91dGAsXG4gKiAgIG9wYWNpdHk6IDAsXG4gKiB9XG4gKlxuICogY29uc3QgdHJhbnNpdGlvblN0eWxlcyA9IHtcbiAqICAgZW50ZXJpbmc6IHsgb3BhY2l0eTogMSB9LFxuICogICBlbnRlcmVkOiAgeyBvcGFjaXR5OiAxIH0sXG4gKiAgIGV4aXRpbmc6ICB7IG9wYWNpdHk6IDAgfSxcbiAqICAgZXhpdGVkOiAgeyBvcGFjaXR5OiAwIH0sXG4gKiB9O1xuICpcbiAqIGNvbnN0IEZhZGUgPSAoeyBpbjogaW5Qcm9wIH0pID0+IChcbiAqICAgPFRyYW5zaXRpb24gaW49e2luUHJvcH0gdGltZW91dD17ZHVyYXRpb259PlxuICogICAgIHtzdGF0ZSA9PiAoXG4gKiAgICAgICA8ZGl2IHN0eWxlPXt7XG4gKiAgICAgICAgIC4uLmRlZmF1bHRTdHlsZSxcbiAqICAgICAgICAgLi4udHJhbnNpdGlvblN0eWxlc1tzdGF0ZV1cbiAqICAgICAgIH19PlxuICogICAgICAgICBJJ20gYSBmYWRlIFRyYW5zaXRpb24hXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICApfVxuICogICA8L1RyYW5zaXRpb24+XG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlcmUgYXJlIDQgbWFpbiBzdGF0ZXMgYSBUcmFuc2l0aW9uIGNhbiBiZSBpbjpcbiAqICAtIGAnZW50ZXJpbmcnYFxuICogIC0gYCdlbnRlcmVkJ2BcbiAqICAtIGAnZXhpdGluZydgXG4gKiAgLSBgJ2V4aXRlZCdgXG4gKlxuICogVHJhbnNpdGlvbiBzdGF0ZSBpcyB0b2dnbGVkIHZpYSB0aGUgYGluYCBwcm9wLiBXaGVuIGB0cnVlYCB0aGUgY29tcG9uZW50XG4gKiBiZWdpbnMgdGhlIFwiRW50ZXJcIiBzdGFnZS4gRHVyaW5nIHRoaXMgc3RhZ2UsIHRoZSBjb21wb25lbnQgd2lsbCBzaGlmdCBmcm9tXG4gKiBpdHMgY3VycmVudCB0cmFuc2l0aW9uIHN0YXRlLCB0byBgJ2VudGVyaW5nJ2AgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGVcbiAqIHRyYW5zaXRpb24gYW5kIHRoZW4gdG8gdGhlIGAnZW50ZXJlZCdgIHN0YWdlIG9uY2UgaXQncyBjb21wbGV0ZS4gTGV0J3MgdGFrZVxuICogdGhlIGZvbGxvd2luZyBleGFtcGxlICh3ZSdsbCB1c2UgdGhlXG4gKiBbdXNlU3RhdGVdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9ob29rcy1yZWZlcmVuY2UuaHRtbCN1c2VzdGF0ZSkgaG9vayk6XG4gKlxuICogYGBganN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IFtpblByb3AsIHNldEluUHJvcF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxUcmFuc2l0aW9uIGluPXtpblByb3B9IHRpbWVvdXQ9ezUwMH0+XG4gKiAgICAgICAgIHtzdGF0ZSA9PiAoXG4gKiAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICl9XG4gKiAgICAgICA8L1RyYW5zaXRpb24+XG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldEluUHJvcCh0cnVlKX0+XG4gKiAgICAgICAgIENsaWNrIHRvIEVudGVyXG4gKiAgICAgICA8L2J1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIHRoZSBjb21wb25lbnQgd2lsbCBzaGlmdCB0byB0aGUgYCdlbnRlcmluZydgIHN0YXRlXG4gKiBhbmQgc3RheSB0aGVyZSBmb3IgNTAwbXMgKHRoZSB2YWx1ZSBvZiBgdGltZW91dGApIGJlZm9yZSBpdCBmaW5hbGx5IHN3aXRjaGVzXG4gKiB0byBgJ2VudGVyZWQnYC5cbiAqXG4gKiBXaGVuIGBpbmAgaXMgYGZhbHNlYCB0aGUgc2FtZSB0aGluZyBoYXBwZW5zIGV4Y2VwdCB0aGUgc3RhdGUgbW92ZXMgZnJvbVxuICogYCdleGl0aW5nJ2AgdG8gYCdleGl0ZWQnYC5cbiAqL1xuXG52YXIgVHJhbnNpdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShUcmFuc2l0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpIHx8IHRoaXM7XG4gICAgdmFyIHBhcmVudEdyb3VwID0gY29udGV4dDsgLy8gSW4gdGhlIGNvbnRleHQgb2YgYSBUcmFuc2l0aW9uR3JvdXAgYWxsIGVudGVycyBhcmUgcmVhbGx5IGFwcGVhcnNcblxuICAgIHZhciBhcHBlYXIgPSBwYXJlbnRHcm91cCAmJiAhcGFyZW50R3JvdXAuaXNNb3VudGluZyA/IHByb3BzLmVudGVyIDogcHJvcHMuYXBwZWFyO1xuICAgIHZhciBpbml0aWFsU3RhdHVzO1xuICAgIF90aGlzLmFwcGVhclN0YXR1cyA9IG51bGw7XG5cbiAgICBpZiAocHJvcHMuaW4pIHtcbiAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IEVYSVRFRDtcbiAgICAgICAgX3RoaXMuYXBwZWFyU3RhdHVzID0gRU5URVJJTkc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRU5URVJFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLnVubW91bnRPbkV4aXQgfHwgcHJvcHMubW91bnRPbkVudGVyKSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBVTk1PVU5URUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRVhJVEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc3RhdHVzOiBpbml0aWFsU3RhdHVzXG4gICAgfTtcbiAgICBfdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRyYW5zaXRpb24uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYsIHByZXZTdGF0ZSkge1xuICAgIHZhciBuZXh0SW4gPSBfcmVmLmluO1xuXG4gICAgaWYgKG5leHRJbiAmJiBwcmV2U3RhdGUuc3RhdHVzID09PSBVTk1PVU5URUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHByZXZQcm9wcykge1xuICAvLyAgIGxldCBuZXh0U3RhdHVzID0gbnVsbFxuICAvLyAgIGlmIChwcmV2UHJvcHMgIT09IHRoaXMucHJvcHMpIHtcbiAgLy8gICAgIGNvbnN0IHsgc3RhdHVzIH0gPSB0aGlzLnN0YXRlXG4gIC8vICAgICBpZiAodGhpcy5wcm9wcy5pbikge1xuICAvLyAgICAgICBpZiAoc3RhdHVzICE9PSBFTlRFUklORyAmJiBzdGF0dXMgIT09IEVOVEVSRUQpIHtcbiAgLy8gICAgICAgICBuZXh0U3RhdHVzID0gRU5URVJJTkdcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcgfHwgc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gIC8vICAgICAgICAgbmV4dFN0YXR1cyA9IEVYSVRJTkdcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4geyBuZXh0U3RhdHVzIH1cbiAgLy8gfVxuICA7XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zaXRpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKHRydWUsIHRoaXMuYXBwZWFyU3RhdHVzKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBuZXh0U3RhdHVzID0gbnVsbDtcblxuICAgIGlmIChwcmV2UHJvcHMgIT09IHRoaXMucHJvcHMpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgICAgaWYgKHRoaXMucHJvcHMuaW4pIHtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gRU5URVJJTkcgJiYgc3RhdHVzICE9PSBFTlRFUkVEKSB7XG4gICAgICAgICAgbmV4dFN0YXR1cyA9IEVOVEVSSU5HO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBFTlRFUklORyB8fCBzdGF0dXMgPT09IEVOVEVSRUQpIHtcbiAgICAgICAgICBuZXh0U3RhdHVzID0gRVhJVElORztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzKGZhbHNlLCBuZXh0U3RhdHVzKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmNhbmNlbE5leHRDYWxsYmFjaygpO1xuICB9O1xuXG4gIF9wcm90by5nZXRUaW1lb3V0cyA9IGZ1bmN0aW9uIGdldFRpbWVvdXRzKCkge1xuICAgIHZhciB0aW1lb3V0ID0gdGhpcy5wcm9wcy50aW1lb3V0O1xuICAgIHZhciBleGl0LCBlbnRlciwgYXBwZWFyO1xuICAgIGV4aXQgPSBlbnRlciA9IGFwcGVhciA9IHRpbWVvdXQ7XG5cbiAgICBpZiAodGltZW91dCAhPSBudWxsICYmIHR5cGVvZiB0aW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgZXhpdCA9IHRpbWVvdXQuZXhpdDtcbiAgICAgIGVudGVyID0gdGltZW91dC5lbnRlcjsgLy8gVE9ETzogcmVtb3ZlIGZhbGxiYWNrIGZvciBuZXh0IG1ham9yXG5cbiAgICAgIGFwcGVhciA9IHRpbWVvdXQuYXBwZWFyICE9PSB1bmRlZmluZWQgPyB0aW1lb3V0LmFwcGVhciA6IGVudGVyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBleGl0OiBleGl0LFxuICAgICAgZW50ZXI6IGVudGVyLFxuICAgICAgYXBwZWFyOiBhcHBlYXJcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by51cGRhdGVTdGF0dXMgPSBmdW5jdGlvbiB1cGRhdGVTdGF0dXMobW91bnRpbmcsIG5leHRTdGF0dXMpIHtcbiAgICBpZiAobW91bnRpbmcgPT09IHZvaWQgMCkge1xuICAgICAgbW91bnRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgLy8gbmV4dFN0YXR1cyB3aWxsIGFsd2F5cyBiZSBFTlRFUklORyBvciBFWElUSU5HLlxuICAgICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcblxuICAgICAgaWYgKG5leHRTdGF0dXMgPT09IEVOVEVSSU5HKSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUVudGVyKG1vdW50aW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUV4aXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMudW5tb3VudE9uRXhpdCAmJiB0aGlzLnN0YXRlLnN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBVTk1PVU5URURcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucGVyZm9ybUVudGVyID0gZnVuY3Rpb24gcGVyZm9ybUVudGVyKG1vdW50aW5nKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgZW50ZXIgPSB0aGlzLnByb3BzLmVudGVyO1xuICAgIHZhciBhcHBlYXJpbmcgPSB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQuaXNNb3VudGluZyA6IG1vdW50aW5nO1xuXG4gICAgdmFyIF9yZWYyID0gdGhpcy5wcm9wcy5ub2RlUmVmID8gW2FwcGVhcmluZ10gOiBbUmVhY3RET00uZmluZERPTU5vZGUodGhpcyksIGFwcGVhcmluZ10sXG4gICAgICAgIG1heWJlTm9kZSA9IF9yZWYyWzBdLFxuICAgICAgICBtYXliZUFwcGVhcmluZyA9IF9yZWYyWzFdO1xuXG4gICAgdmFyIHRpbWVvdXRzID0gdGhpcy5nZXRUaW1lb3V0cygpO1xuICAgIHZhciBlbnRlclRpbWVvdXQgPSBhcHBlYXJpbmcgPyB0aW1lb3V0cy5hcHBlYXIgOiB0aW1lb3V0cy5lbnRlcjsgLy8gbm8gZW50ZXIgYW5pbWF0aW9uIHNraXAgcmlnaHQgdG8gRU5URVJFRFxuICAgIC8vIGlmIHdlIGFyZSBtb3VudGluZyBhbmQgcnVubmluZyB0aGlzIGl0IG1lYW5zIGFwcGVhciBfbXVzdF8gYmUgc2V0XG5cbiAgICBpZiAoIW1vdW50aW5nICYmICFlbnRlciB8fCBjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBFTlRFUkVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5wcm9wcy5vbkVudGVyZWQobWF5YmVOb2RlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25FbnRlcihtYXliZU5vZGUsIG1heWJlQXBwZWFyaW5nKTtcbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6IEVOVEVSSU5HXG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJpbmcobWF5YmVOb2RlLCBtYXliZUFwcGVhcmluZyk7XG5cbiAgICAgIF90aGlzMi5vblRyYW5zaXRpb25FbmQoZW50ZXJUaW1lb3V0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgIHN0YXR1czogRU5URVJFRFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJlZChtYXliZU5vZGUsIG1heWJlQXBwZWFyaW5nKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8ucGVyZm9ybUV4aXQgPSBmdW5jdGlvbiBwZXJmb3JtRXhpdCgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBleGl0ID0gdGhpcy5wcm9wcy5leGl0O1xuICAgIHZhciB0aW1lb3V0cyA9IHRoaXMuZ2V0VGltZW91dHMoKTtcbiAgICB2YXIgbWF5YmVOb2RlID0gdGhpcy5wcm9wcy5ub2RlUmVmID8gdW5kZWZpbmVkIDogUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7IC8vIG5vIGV4aXQgYW5pbWF0aW9uIHNraXAgcmlnaHQgdG8gRVhJVEVEXG5cbiAgICBpZiAoIWV4aXQgfHwgY29uZmlnLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRlZChtYXliZU5vZGUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vbkV4aXQobWF5YmVOb2RlKTtcbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6IEVYSVRJTkdcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczMucHJvcHMub25FeGl0aW5nKG1heWJlTm9kZSk7XG5cbiAgICAgIF90aGlzMy5vblRyYW5zaXRpb25FbmQodGltZW91dHMuZXhpdCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgICBzdGF0dXM6IEVYSVRFRFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGVkKG1heWJlTm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmNhbmNlbE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIGNhbmNlbE5leHRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5uZXh0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCgpO1xuICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2FmZVNldFN0YXRlID0gZnVuY3Rpb24gc2FmZVNldFN0YXRlKG5leHRTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAvLyBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCB0aGVyZSBhcmUgd2VpcmQgcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAvLyBzZXRTdGF0ZSBjYWxsYmFja3MgYW5kIHVubW91bnRpbmcgaW4gdGVzdGluZywgc28gYWx3YXlzIG1ha2Ugc3VyZSB0aGF0XG4gICAgLy8gd2UgY2FuIGNhbmNlbCBhbnkgcGVuZGluZyBzZXRTdGF0ZSBjYWxsYmFja3MgYWZ0ZXIgd2UgdW5tb3VudC5cbiAgICBjYWxsYmFjayA9IHRoaXMuc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKTtcbiAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIF9wcm90by5zZXROZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiBzZXROZXh0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBhY3RpdmUgPSB0cnVlO1xuXG4gICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIF90aGlzNC5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5uZXh0Q2FsbGJhY2s7XG4gIH07XG5cbiAgX3Byb3RvLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZCh0aW1lb3V0LCBoYW5kbGVyKSB7XG4gICAgdGhpcy5zZXROZXh0Q2FsbGJhY2soaGFuZGxlcik7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyB0aGlzLnByb3BzLm5vZGVSZWYuY3VycmVudCA6IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIHZhciBkb2VzTm90SGF2ZVRpbWVvdXRPckxpc3RlbmVyID0gdGltZW91dCA9PSBudWxsICYmICF0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyO1xuXG4gICAgaWYgKCFub2RlIHx8IGRvZXNOb3RIYXZlVGltZW91dE9yTGlzdGVuZXIpIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyKSB7XG4gICAgICB2YXIgX3JlZjMgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyBbdGhpcy5uZXh0Q2FsbGJhY2tdIDogW25vZGUsIHRoaXMubmV4dENhbGxiYWNrXSxcbiAgICAgICAgICBtYXliZU5vZGUgPSBfcmVmM1swXSxcbiAgICAgICAgICBtYXliZU5leHRDYWxsYmFjayA9IF9yZWYzWzFdO1xuXG4gICAgICB0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyKG1heWJlTm9kZSwgbWF5YmVOZXh0Q2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgX2luID0gX3RoaXMkcHJvcHMuaW4sXG4gICAgICAgIF9tb3VudE9uRW50ZXIgPSBfdGhpcyRwcm9wcy5tb3VudE9uRW50ZXIsXG4gICAgICAgIF91bm1vdW50T25FeGl0ID0gX3RoaXMkcHJvcHMudW5tb3VudE9uRXhpdCxcbiAgICAgICAgX2FwcGVhciA9IF90aGlzJHByb3BzLmFwcGVhcixcbiAgICAgICAgX2VudGVyID0gX3RoaXMkcHJvcHMuZW50ZXIsXG4gICAgICAgIF9leGl0ID0gX3RoaXMkcHJvcHMuZXhpdCxcbiAgICAgICAgX3RpbWVvdXQgPSBfdGhpcyRwcm9wcy50aW1lb3V0LFxuICAgICAgICBfYWRkRW5kTGlzdGVuZXIgPSBfdGhpcyRwcm9wcy5hZGRFbmRMaXN0ZW5lcixcbiAgICAgICAgX29uRW50ZXIgPSBfdGhpcyRwcm9wcy5vbkVudGVyLFxuICAgICAgICBfb25FbnRlcmluZyA9IF90aGlzJHByb3BzLm9uRW50ZXJpbmcsXG4gICAgICAgIF9vbkVudGVyZWQgPSBfdGhpcyRwcm9wcy5vbkVudGVyZWQsXG4gICAgICAgIF9vbkV4aXQgPSBfdGhpcyRwcm9wcy5vbkV4aXQsXG4gICAgICAgIF9vbkV4aXRpbmcgPSBfdGhpcyRwcm9wcy5vbkV4aXRpbmcsXG4gICAgICAgIF9vbkV4aXRlZCA9IF90aGlzJHByb3BzLm9uRXhpdGVkLFxuICAgICAgICBfbm9kZVJlZiA9IF90aGlzJHByb3BzLm5vZGVSZWYsXG4gICAgICAgIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJpblwiLCBcIm1vdW50T25FbnRlclwiLCBcInVubW91bnRPbkV4aXRcIiwgXCJhcHBlYXJcIiwgXCJlbnRlclwiLCBcImV4aXRcIiwgXCJ0aW1lb3V0XCIsIFwiYWRkRW5kTGlzdGVuZXJcIiwgXCJvbkVudGVyXCIsIFwib25FbnRlcmluZ1wiLCBcIm9uRW50ZXJlZFwiLCBcIm9uRXhpdFwiLCBcIm9uRXhpdGluZ1wiLCBcIm9uRXhpdGVkXCIsIFwibm9kZVJlZlwiXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gYWxsb3dzIGZvciBuZXN0ZWQgVHJhbnNpdGlvbnNcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSwgdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gY2hpbGRyZW4oc3RhdHVzLCBjaGlsZFByb3BzKSA6IFJlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwgY2hpbGRQcm9wcykpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5jb250ZXh0VHlwZSA9IFRyYW5zaXRpb25Hcm91cENvbnRleHQ7XG5UcmFuc2l0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqXG4gICAqIEEgUmVhY3QgcmVmZXJlbmNlIHRvIERPTSBlbGVtZW50IHRoYXQgbmVlZCB0byB0cmFuc2l0aW9uOlxuICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTExMjcxMzAvNDY3MTkzMlxuICAgKlxuICAgKiAgIC0gV2hlbiBgbm9kZVJlZmAgcHJvcCBpcyB1c2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZCB0byBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICogICAgICAoZS5nLiBgb25FbnRlcmApIGJlY2F1c2UgdXNlciBhbHJlYWR5IGhhcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBub2RlLlxuICAgKiAgIC0gV2hlbiBjaGFuZ2luZyBga2V5YCBwcm9wIG9mIGBUcmFuc2l0aW9uYCBpbiBhIGBUcmFuc2l0aW9uR3JvdXBgIGEgbmV3XG4gICAqICAgICBgbm9kZVJlZmAgbmVlZCB0byBiZSBwcm92aWRlZCB0byBgVHJhbnNpdGlvbmAgd2l0aCBjaGFuZ2VkIGBrZXlgIHByb3BcbiAgICogICAgIChzZWVcbiAgICogICAgIFt0ZXN0L0NTU1RyYW5zaXRpb24tdGVzdC5qc10oaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9ibG9iLzEzNDM1Zjg5N2IzYWI3MWY2ZTE5ZDcyNGYxNDU1OTZmNTkxMDU4MWMvdGVzdC9DU1NUcmFuc2l0aW9uLXRlc3QuanMjTDM2Mi1MNDM3KSkuXG4gICAqL1xuICBub2RlUmVmOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGN1cnJlbnQ6IHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/IFByb3BUeXBlcy5hbnkgOiBmdW5jdGlvbiAocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHZhbHVlID0gcHJvcFZhbHVlW2tleV07XG4gICAgICByZXR1cm4gUHJvcFR5cGVzLmluc3RhbmNlT2YodmFsdWUgJiYgJ293bmVyRG9jdW1lbnQnIGluIHZhbHVlID8gdmFsdWUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5FbGVtZW50IDogRWxlbWVudCkocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCk7XG4gICAgfVxuICB9KSxcblxuICAvKipcbiAgICogQSBgZnVuY3Rpb25gIGNoaWxkIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBSZWFjdCBlbGVtZW50LiBUaGlzIGZ1bmN0aW9uIGlzXG4gICAqIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IHRyYW5zaXRpb24gc3RhdHVzIChgJ2VudGVyaW5nJ2AsIGAnZW50ZXJlZCdgLFxuICAgKiBgJ2V4aXRpbmcnYCwgYCdleGl0ZWQnYCksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFwcGx5IGNvbnRleHRcbiAgICogc3BlY2lmaWMgcHJvcHMgdG8gYSBjb21wb25lbnQuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiA8VHJhbnNpdGlvbiBpbj17dGhpcy5zdGF0ZS5pbn0gdGltZW91dD17MTUwfT5cbiAgICogICB7c3RhdGUgPT4gKFxuICAgKiAgICAgPE15Q29tcG9uZW50IGNsYXNzTmFtZT17YGZhZGUgZmFkZS0ke3N0YXRlfWB9IC8+XG4gICAqICAgKX1cbiAgICogPC9UcmFuc2l0aW9uPlxuICAgKiBgYGBcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLCBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkXSkuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBzdGF0ZXNcbiAgICovXG4gIGluOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgY2hpbGQgY29tcG9uZW50IGlzIG1vdW50ZWQgaW1tZWRpYXRlbHkgYWxvbmcgd2l0aFxuICAgKiB0aGUgcGFyZW50IGBUcmFuc2l0aW9uYCBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIFwibGF6eSBtb3VudFwiIHRoZSBjb21wb25lbnQgb24gdGhlXG4gICAqIGZpcnN0IGBpbj17dHJ1ZX1gIHlvdSBjYW4gc2V0IGBtb3VudE9uRW50ZXJgLiBBZnRlciB0aGUgZmlyc3QgZW50ZXIgdHJhbnNpdGlvbiB0aGUgY29tcG9uZW50IHdpbGwgc3RheVxuICAgKiBtb3VudGVkLCBldmVuIG9uIFwiZXhpdGVkXCIsIHVubGVzcyB5b3UgYWxzbyBzcGVjaWZ5IGB1bm1vdW50T25FeGl0YC5cbiAgICovXG4gIG1vdW50T25FbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGNoaWxkIGNvbXBvbmVudCBzdGF5cyBtb3VudGVkIGFmdGVyIGl0IHJlYWNoZXMgdGhlIGAnZXhpdGVkJ2Agc3RhdGUuXG4gICAqIFNldCBgdW5tb3VudE9uRXhpdGAgaWYgeW91J2QgcHJlZmVyIHRvIHVubW91bnQgdGhlIGNvbXBvbmVudCBhZnRlciBpdCBmaW5pc2hlcyBleGl0aW5nLlxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGNoaWxkIGNvbXBvbmVudCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBlbnRlciB0cmFuc2l0aW9uIHdoZW5cbiAgICogaXQgZmlyc3QgbW91bnRzLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBgaW5gLiBJZiB5b3Ugd2FudCB0aGlzXG4gICAqIGJlaGF2aW9yLCBzZXQgYm90aCBgYXBwZWFyYCBhbmQgYGluYCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqID4gKipOb3RlKio6IHRoZXJlIGFyZSBubyBzcGVjaWFsIGFwcGVhciBzdGF0ZXMgbGlrZSBgYXBwZWFyaW5nYC9gYXBwZWFyZWRgLCB0aGlzIHByb3BcbiAgICogPiBvbmx5IGFkZHMgYW4gYWRkaXRpb25hbCBlbnRlciB0cmFuc2l0aW9uLiBIb3dldmVyLCBpbiB0aGVcbiAgICogPiBgPENTU1RyYW5zaXRpb24+YCBjb21wb25lbnQgdGhhdCBmaXJzdCBlbnRlciB0cmFuc2l0aW9uIGRvZXMgcmVzdWx0IGluXG4gICAqID4gYWRkaXRpb25hbCBgLmFwcGVhci0qYCBjbGFzc2VzLCB0aGF0IHdheSB5b3UgY2FuIGNob29zZSB0byBzdHlsZSBpdFxuICAgKiA+IGRpZmZlcmVudGx5LlxuICAgKi9cbiAgYXBwZWFyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgZW50ZXIgdHJhbnNpdGlvbnMuXG4gICAqL1xuICBlbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIGV4aXQgdHJhbnNpdGlvbnMuXG4gICAqL1xuICBleGl0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFJlcXVpcmVkIHVubGVzcyBgYWRkRW5kTGlzdGVuZXJgIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBZb3UgbWF5IHNwZWNpZnkgYSBzaW5nbGUgdGltZW91dCBmb3IgYWxsIHRyYW5zaXRpb25zOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogdGltZW91dD17NTAwfVxuICAgKiBgYGBcbiAgICpcbiAgICogb3IgaW5kaXZpZHVhbGx5OlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogdGltZW91dD17e1xuICAgKiAgYXBwZWFyOiA1MDAsXG4gICAqICBlbnRlcjogMzAwLFxuICAgKiAgZXhpdDogNTAwLFxuICAgKiB9fVxuICAgKiBgYGBcbiAgICpcbiAgICogLSBgYXBwZWFyYCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgYGVudGVyYFxuICAgKiAtIGBlbnRlcmAgZGVmYXVsdHMgdG8gYDBgXG4gICAqIC0gYGV4aXRgIGRlZmF1bHRzIHRvIGAwYFxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgeyBlbnRlcj86IG51bWJlciwgZXhpdD86IG51bWJlciwgYXBwZWFyPzogbnVtYmVyIH19XG4gICAqL1xuICB0aW1lb3V0OiBmdW5jdGlvbiB0aW1lb3V0KHByb3BzKSB7XG4gICAgdmFyIHB0ID0gdGltZW91dHNTaGFwZTtcbiAgICBpZiAoIXByb3BzLmFkZEVuZExpc3RlbmVyKSBwdCA9IHB0LmlzUmVxdWlyZWQ7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHQuYXBwbHkodm9pZCAwLCBbcHJvcHNdLmNvbmNhdChhcmdzKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSB0cmFuc2l0aW9uIGVuZCB0cmlnZ2VyLiBDYWxsZWQgd2l0aCB0aGUgdHJhbnNpdGlvbmluZ1xuICAgKiBET00gbm9kZSBhbmQgYSBgZG9uZWAgY2FsbGJhY2suIEFsbG93cyBmb3IgbW9yZSBmaW5lIGdyYWluZWQgdHJhbnNpdGlvbiBlbmRcbiAgICogbG9naWMuIFRpbWVvdXRzIGFyZSBzdGlsbCB1c2VkIGFzIGEgZmFsbGJhY2sgaWYgcHJvdmlkZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiBhZGRFbmRMaXN0ZW5lcj17KG5vZGUsIGRvbmUpID0+IHtcbiAgICogICAvLyB1c2UgdGhlIGNzcyB0cmFuc2l0aW9uZW5kIGV2ZW50IHRvIG1hcmsgdGhlIGZpbmlzaCBvZiBhIHRyYW5zaXRpb25cbiAgICogICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBkb25lLCBmYWxzZSk7XG4gICAqIH19XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRW5kTGlzdGVuZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZW50ZXJpbmdcIiBzdGF0dXMgaXMgYXBwbGllZC4gQW4gZXh0cmEgcGFyYW1ldGVyXG4gICAqIGBpc0FwcGVhcmluZ2AgaXMgc3VwcGxpZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGVudGVyIHN0YWdlIGlzIG9jY3VycmluZyBvbiB0aGUgaW5pdGlhbCBtb3VudFxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCwgaXNBcHBlYXJpbmc6IGJvb2wpIC0+IHZvaWRcbiAgICovXG4gIG9uRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJlbnRlcmluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLiBBbiBleHRyYSBwYXJhbWV0ZXJcbiAgICogYGlzQXBwZWFyaW5nYCBpcyBzdXBwbGllZCB0byBpbmRpY2F0ZSBpZiB0aGUgZW50ZXIgc3RhZ2UgaXMgb2NjdXJyaW5nIG9uIHRoZSBpbml0aWFsIG1vdW50XG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50LCBpc0FwcGVhcmluZzogYm9vbClcbiAgICovXG4gIG9uRW50ZXJpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJlbnRlcmVkXCIgc3RhdHVzIGlzIGFwcGxpZWQuIEFuIGV4dHJhIHBhcmFtZXRlclxuICAgKiBgaXNBcHBlYXJpbmdgIGlzIHN1cHBsaWVkIHRvIGluZGljYXRlIGlmIHRoZSBlbnRlciBzdGFnZSBpcyBvY2N1cnJpbmcgb24gdGhlIGluaXRpYWwgbW91bnRcbiAgICpcbiAgICogKipOb3RlKio6IHdoZW4gYG5vZGVSZWZgIHByb3AgaXMgcGFzc2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQsIGlzQXBwZWFyaW5nOiBib29sKSAtPiB2b2lkXG4gICAqL1xuICBvbkVudGVyZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZXhpdGluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCkgLT4gdm9pZFxuICAgKi9cbiAgb25FeGl0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCkgLT4gdm9pZFxuICAgKi9cbiAgb25FeGl0aW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGVkXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWRcbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQpIC0+IHZvaWRcbiAgICovXG4gIG9uRXhpdGVkOiBQcm9wVHlwZXMuZnVuY1xufSA6IHt9OyAvLyBOYW1lIHRoZSBmdW5jdGlvbiBzbyBpdCBpcyBjbGVhcmVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5UcmFuc2l0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICBtb3VudE9uRW50ZXI6IGZhbHNlLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgYXBwZWFyOiBmYWxzZSxcbiAgZW50ZXI6IHRydWUsXG4gIGV4aXQ6IHRydWUsXG4gIG9uRW50ZXI6IG5vb3AsXG4gIG9uRW50ZXJpbmc6IG5vb3AsXG4gIG9uRW50ZXJlZDogbm9vcCxcbiAgb25FeGl0OiBub29wLFxuICBvbkV4aXRpbmc6IG5vb3AsXG4gIG9uRXhpdGVkOiBub29wXG59O1xuVHJhbnNpdGlvbi5VTk1PVU5URUQgPSBVTk1PVU5URUQ7XG5UcmFuc2l0aW9uLkVYSVRFRCA9IEVYSVRFRDtcblRyYW5zaXRpb24uRU5URVJJTkcgPSBFTlRFUklORztcblRyYW5zaXRpb24uRU5URVJFRCA9IEVOVEVSRUQ7XG5UcmFuc2l0aW9uLkVYSVRJTkcgPSBFWElUSU5HO1xuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIGRpc2FibGVkOiBmYWxzZVxufTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuZXhwb3J0IHZhciB0aW1lb3V0c1NoYXBlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gIGVudGVyOiBQcm9wVHlwZXMubnVtYmVyLFxuICBleGl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBhcHBlYXI6IFByb3BUeXBlcy5udW1iZXJcbn0pLmlzUmVxdWlyZWRdKSA6IG51bGw7XG5leHBvcnQgdmFyIGNsYXNzTmFtZXNTaGFwZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuc2hhcGUoe1xuICBlbnRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgZXhpdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWN0aXZlOiBQcm9wVHlwZXMuc3RyaW5nXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgZW50ZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGVudGVyRG9uZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZW50ZXJBY3RpdmU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGV4aXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGV4aXREb25lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBleGl0QWN0aXZlOiBQcm9wVHlwZXMuc3RyaW5nXG59KV0pIDogbnVsbDsiLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAweGVhY2E7XG5leHBvcnRzLkZyYWdtZW50ID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBleHBvcnRzLkZyYWdtZW50ID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBleHBvcnRzLkZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bjtcbnZhciBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjtcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIHNlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IHNlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JmY3MvcHVsbC8xMDdcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuZnVuY3Rpb24ganN4REVWKHR5cGUsIGNvbmZpZywgbWF5YmVLZXksIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICB2YXIga2V5ID0gbnVsbDtcbiAgICB2YXIgcmVmID0gbnVsbDsgLy8gQ3VycmVudGx5LCBrZXkgY2FuIGJlIHNwcmVhZCBpbiBhcyBhIHByb3AuIFRoaXMgY2F1c2VzIGEgcG90ZW50aWFsXG4gICAgLy8gaXNzdWUgaWYga2V5IGlzIGFsc28gZXhwbGljaXRseSBkZWNsYXJlZCAoaWUuIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+XG4gICAgLy8gb3IgPGRpdiBrZXk9XCJIaVwiIHsuLi5wcm9wc30gLz4gKS4gV2Ugd2FudCB0byBkZXByZWNhdGUga2V5IHNwcmVhZCxcbiAgICAvLyBidXQgYXMgYW4gaW50ZXJtZWRpYXJ5IHN0ZXAsIHdlIHdpbGwgdXNlIGpzeERFViBmb3IgZXZlcnl0aGluZyBleGNlcHRcbiAgICAvLyA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPiwgYmVjYXVzZSB3ZSBhcmVuJ3QgY3VycmVudGx5IGFibGUgdG8gdGVsbCBpZlxuICAgIC8vIGtleSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGJlIHVuZGVmaW5lZCBvciBub3QuXG5cbiAgICBpZiAobWF5YmVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gJycgKyBtYXliZUtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZik7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gICAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAge1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB7XG4gICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICAgIGlmICghaW5mbykge1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpO1xuXG4gICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZVN0cmluZztcblxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgc291cmNlLCBzZWxmKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0NoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2ldLCB0eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCdSZWFjdC5qc3g6IFN0YXRpYyBjaGlsZHJlbiBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LiAnICsgJ1lvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gJyArICdVc2UgdGhlIEJhYmVsIHRyYW5zZm9ybSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbiwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuanN4ID0ganN4O1xuZXhwb3J0cy5qc3hzID0ganN4cztcbiAgfSkoKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbmV4cG9ydHMuRnJhZ21lbnQgPSAweGVhY2I7XG5leHBvcnRzLlN0cmljdE1vZGUgPSAweGVhY2M7XG5leHBvcnRzLlByb2ZpbGVyID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG5leHBvcnRzLlN1c3BlbnNlID0gMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSAweGVhZDk7XG52YXIgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSAweGVhZGE7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IDB4ZWFkNTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gMHhlYWQ3O1xudmFyIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gMHhlYWUwO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gMHhlYWUxO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gMHhlYWUyO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IDB4ZWFlMztcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wb3J0YWwnKTtcbiAgZXhwb3J0cy5GcmFnbWVudCA9IHN5bWJvbEZvcigncmVhY3QuZnJhZ21lbnQnKTtcbiAgZXhwb3J0cy5TdHJpY3RNb2RlID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBleHBvcnRzLlByb2ZpbGVyID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgZXhwb3J0cy5TdXNwZW5zZSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogMFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYWN0KCkgdG8gdHJhY2sgd2hldGhlciB5b3UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlLlxuICovXG52YXIgSXNTb21lUmVuZGVyZXJBY3RpbmcgPSB7XG4gIGN1cnJlbnQ6IGZhbHNlXG59O1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyLFxuICBJc1NvbWVSZW5kZXJlckFjdGluZzogSXNTb21lUmVuZGVyZXJBY3RpbmcsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAoISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiICk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5cbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIGV4cG9ydHMuUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdHJpY3RNb2RlOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gJycgKyBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSBudWxsICYmIHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignY3JlYXRlQ29udGV4dDogRXhwZWN0ZWQgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjYWxjdWxhdGVDaGFuZ2VkQml0cyxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHNcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG4gICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gZGVmYXVsdEV4cG9ydDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHJldHVybiBwYXlsb2FkLl9yZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAocmVuZGVyLmRpc3BsYXlOYW1lID09IG51bGwpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IGV4cG9ydHMuUHJvZmlsZXIgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdHJpY3RNb2RlIHx8IHR5cGUgPT09IGV4cG9ydHMuU3VzcGVuc2UgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICBpZiAoIShkaXNwYXRjaGVyICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgaWYgKHVuc3RhYmxlX29ic2VydmVkQml0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcigndXNlQ29udGV4dCgpIHNlY29uZCBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlICcgKyAndXNlIGluIFJlYWN0LiBQYXNzaW5nIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHBhc3NlZDogJXMuJXMnLCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMsIHR5cGVvZiB1bnN0YWJsZV9vYnNlcnZlZEJpdHMgPT09ICdudW1iZXInICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzJdKSA/ICdcXG5cXG5EaWQgeW91IGNhbGwgYXJyYXkubWFwKHVzZUNvbnRleHQpPyAnICsgJ0NhbGxpbmcgSG9va3MgaW5zaWRlIGEgbG9vcCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyA6ICcnKTtcbiAgICB9IC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cblxuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cyk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuU3VzcGVuc2U6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxue1xuXG4gIHRyeSB7XG4gICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW2Zyb3plbk9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtmcm96ZW5PYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJleHBvcnQgdmFyIEtFWV9QUkVGSVggPSAncGVyc2lzdDonO1xuZXhwb3J0IHZhciBGTFVTSCA9ICdwZXJzaXN0L0ZMVVNIJztcbmV4cG9ydCB2YXIgUkVIWURSQVRFID0gJ3BlcnNpc3QvUkVIWURSQVRFJztcbmV4cG9ydCB2YXIgUEFVU0UgPSAncGVyc2lzdC9QQVVTRSc7XG5leHBvcnQgdmFyIFBFUlNJU1QgPSAncGVyc2lzdC9QRVJTSVNUJztcbmV4cG9ydCB2YXIgUFVSR0UgPSAncGVyc2lzdC9QVVJHRSc7XG5leHBvcnQgdmFyIFJFR0lTVEVSID0gJ3BlcnNpc3QvUkVHSVNURVInO1xuZXhwb3J0IHZhciBERUZBVUxUX1ZFUlNJT04gPSAtMTsiLCJpbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVNaWdyYXRlKG1pZ3JhdGlvbnMsIGNvbmZpZykge1xuICB2YXIgX3JlZiA9IGNvbmZpZyB8fCB7fSxcbiAgICAgIGRlYnVnID0gX3JlZi5kZWJ1ZztcblxuICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBjdXJyZW50VmVyc2lvbikge1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogbm8gaW5ib3VuZCBzdGF0ZSwgc2tpcHBpbmcgbWlncmF0aW9uJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgdmFyIGluYm91bmRWZXJzaW9uID0gc3RhdGUuX3BlcnNpc3QgJiYgc3RhdGUuX3BlcnNpc3QudmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gc3RhdGUuX3BlcnNpc3QudmVyc2lvbiA6IERFRkFVTFRfVkVSU0lPTjtcblxuICAgIGlmIChpbmJvdW5kVmVyc2lvbiA9PT0gY3VycmVudFZlcnNpb24pIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogdmVyc2lvbnMgbWF0Y2gsIG5vb3AgbWlncmF0aW9uJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5ib3VuZFZlcnNpb24gPiBjdXJyZW50VmVyc2lvbikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIGNvbnNvbGUuZXJyb3IoJ3JlZHV4LXBlcnNpc3Q6IGRvd25ncmFkaW5nIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIG1pZ3JhdGlvbktleXMgPSBPYmplY3Qua2V5cyhtaWdyYXRpb25zKS5tYXAoZnVuY3Rpb24gKHZlcikge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZlcik7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVyc2lvbiA+PSBrZXkgJiYga2V5ID4gaW5ib3VuZFZlcnNpb247XG4gICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogbWlncmF0aW9uS2V5cycsIG1pZ3JhdGlvbktleXMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBtaWdyYXRlZFN0YXRlID0gbWlncmF0aW9uS2V5cy5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCB2ZXJzaW9uS2V5KSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogcnVubmluZyBtaWdyYXRpb24gZm9yIHZlcnNpb25LZXknLCB2ZXJzaW9uS2V5KTtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGlvbnNbdmVyc2lvbktleV0oc3RhdGUpO1xuICAgICAgfSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtaWdyYXRlZFN0YXRlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgfTtcbn0iLCJpbXBvcnQgeyBLRVlfUFJFRklYLCBSRUhZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG4vLyBAVE9ETyByZW1vdmUgb25jZSBmbG93IDwgMC42MyBzdXBwb3J0IGlzIG5vIGxvbmdlciByZXF1aXJlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVBlcnNpc3RvaWQoY29uZmlnKSB7XG4gIC8vIGRlZmF1bHRzXG4gIHZhciBibGFja2xpc3QgPSBjb25maWcuYmxhY2tsaXN0IHx8IG51bGw7XG4gIHZhciB3aGl0ZWxpc3QgPSBjb25maWcud2hpdGVsaXN0IHx8IG51bGw7XG4gIHZhciB0cmFuc2Zvcm1zID0gY29uZmlnLnRyYW5zZm9ybXMgfHwgW107XG4gIHZhciB0aHJvdHRsZSA9IGNvbmZpZy50aHJvdHRsZSB8fCAwO1xuICB2YXIgc3RvcmFnZUtleSA9IFwiXCIuY29uY2F0KGNvbmZpZy5rZXlQcmVmaXggIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5rZXlQcmVmaXggOiBLRVlfUFJFRklYKS5jb25jYXQoY29uZmlnLmtleSk7XG4gIHZhciBzdG9yYWdlID0gY29uZmlnLnN0b3JhZ2U7XG4gIHZhciBzZXJpYWxpemU7XG5cbiAgaWYgKGNvbmZpZy5zZXJpYWxpemUgPT09IGZhbHNlKSB7XG4gICAgc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5zZXJpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZXJpYWxpemUgPSBjb25maWcuc2VyaWFsaXplO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZSA9IGRlZmF1bHRTZXJpYWxpemU7XG4gIH1cblxuICB2YXIgd3JpdGVGYWlsSGFuZGxlciA9IGNvbmZpZy53cml0ZUZhaWxIYW5kbGVyIHx8IG51bGw7IC8vIGluaXRpYWxpemUgc3RhdGVmdWwgdmFsdWVzXG5cbiAgdmFyIGxhc3RTdGF0ZSA9IHt9O1xuICB2YXIgc3RhZ2VkU3RhdGUgPSB7fTtcbiAgdmFyIGtleXNUb1Byb2Nlc3MgPSBbXTtcbiAgdmFyIHRpbWVJdGVyYXRvciA9IG51bGw7XG4gIHZhciB3cml0ZVByb21pc2UgPSBudWxsO1xuXG4gIHZhciB1cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc3RhdGUpIHtcbiAgICAvLyBhZGQgYW55IGNoYW5nZWQga2V5cyB0byB0aGUgcXVldWVcbiAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoIXBhc3NXaGl0ZWxpc3RCbGFja2xpc3Qoa2V5KSkgcmV0dXJuOyAvLyBpcyBrZXlzcGFjZSBpZ25vcmVkPyBub29wXG5cbiAgICAgIGlmIChsYXN0U3RhdGVba2V5XSA9PT0gc3RhdGVba2V5XSkgcmV0dXJuOyAvLyB2YWx1ZSB1bmNoYW5nZWQ/IG5vb3BcblxuICAgICAgaWYgKGtleXNUb1Byb2Nlc3MuaW5kZXhPZihrZXkpICE9PSAtMSkgcmV0dXJuOyAvLyBpcyBrZXkgYWxyZWFkeSBxdWV1ZWQ/IG5vb3BcblxuICAgICAga2V5c1RvUHJvY2Vzcy5wdXNoKGtleSk7IC8vIGFkZCBrZXkgdG8gcXVldWVcbiAgICB9KTsgLy9pZiBhbnkga2V5IGlzIG1pc3NpbmcgaW4gdGhlIG5ldyBzdGF0ZSB3aGljaCB3YXMgcHJlc2VudCBpbiB0aGUgbGFzdFN0YXRlLFxuICAgIC8vYWRkIGl0IGZvciBwcm9jZXNzaW5nIHRvb1xuXG4gICAgT2JqZWN0LmtleXMobGFzdFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChzdGF0ZVtrZXldID09PSB1bmRlZmluZWQgJiYgcGFzc1doaXRlbGlzdEJsYWNrbGlzdChrZXkpICYmIGtleXNUb1Byb2Nlc3MuaW5kZXhPZihrZXkpID09PSAtMSAmJiBsYXN0U3RhdGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleXNUb1Byb2Nlc3MucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pOyAvLyBzdGFydCB0aGUgdGltZSBpdGVyYXRvciBpZiBub3QgcnVubmluZyAocmVhZDogdGhyb3R0bGUpXG5cbiAgICBpZiAodGltZUl0ZXJhdG9yID09PSBudWxsKSB7XG4gICAgICB0aW1lSXRlcmF0b3IgPSBzZXRJbnRlcnZhbChwcm9jZXNzTmV4dEtleSwgdGhyb3R0bGUpO1xuICAgIH1cblxuICAgIGxhc3RTdGF0ZSA9IHN0YXRlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NOZXh0S2V5KCkge1xuICAgIGlmIChrZXlzVG9Qcm9jZXNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRpbWVJdGVyYXRvcikgY2xlYXJJbnRlcnZhbCh0aW1lSXRlcmF0b3IpO1xuICAgICAgdGltZUl0ZXJhdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0ga2V5c1RvUHJvY2Vzcy5zaGlmdCgpO1xuICAgIHZhciBlbmRTdGF0ZSA9IHRyYW5zZm9ybXMucmVkdWNlKGZ1bmN0aW9uIChzdWJTdGF0ZSwgdHJhbnNmb3JtZXIpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5pbihzdWJTdGF0ZSwga2V5LCBsYXN0U3RhdGUpO1xuICAgIH0sIGxhc3RTdGF0ZVtrZXldKTtcblxuICAgIGlmIChlbmRTdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZWRTdGF0ZVtrZXldID0gc2VyaWFsaXplKGVuZFN0YXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdyZWR1eC1wZXJzaXN0L2NyZWF0ZVBlcnNpc3RvaWQ6IGVycm9yIHNlcmlhbGl6aW5nIHN0YXRlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy9pZiB0aGUgZW5kU3RhdGUgaXMgdW5kZWZpbmVkLCBubyBuZWVkIHRvIHBlcnNpc3QgdGhlIGV4aXN0aW5nIHNlcmlhbGl6ZWQgY29udGVudFxuICAgICAgZGVsZXRlIHN0YWdlZFN0YXRlW2tleV07XG4gICAgfVxuXG4gICAgaWYgKGtleXNUb1Byb2Nlc3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB3cml0ZVN0YWdlZFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVTdGFnZWRTdGF0ZSgpIHtcbiAgICAvLyBjbGVhbnVwIGFueSByZW1vdmVkIGtleXMganVzdCBiZWZvcmUgd3JpdGUuXG4gICAgT2JqZWN0LmtleXMoc3RhZ2VkU3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGxhc3RTdGF0ZVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHN0YWdlZFN0YXRlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgd3JpdGVQcm9taXNlID0gc3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIHNlcmlhbGl6ZShzdGFnZWRTdGF0ZSkpLmNhdGNoKG9uV3JpdGVGYWlsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhc3NXaGl0ZWxpc3RCbGFja2xpc3Qoa2V5KSB7XG4gICAgaWYgKHdoaXRlbGlzdCAmJiB3aGl0ZWxpc3QuaW5kZXhPZihrZXkpID09PSAtMSAmJiBrZXkgIT09ICdfcGVyc2lzdCcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdC5pbmRleE9mKGtleSkgIT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvbldyaXRlRmFpbChlcnIpIHtcbiAgICAvLyBAVE9ETyBhZGQgZmFpbCBoYW5kbGVycyAodHlwaWNhbGx5IHN0b3JhZ2UgZnVsbClcbiAgICBpZiAod3JpdGVGYWlsSGFuZGxlcikgd3JpdGVGYWlsSGFuZGxlcihlcnIpO1xuXG4gICAgaWYgKGVyciAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdG9yaW5nIGRhdGEnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChrZXlzVG9Qcm9jZXNzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcHJvY2Vzc05leHRLZXkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JpdGVQcm9taXNlIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuICB9OyAvLyByZXR1cm4gYHBlcnNpc3RvaWRgXG5cblxuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIGZsdXNoOiBmbHVzaFxuICB9O1xufSAvLyBATk9URSBpbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGV4cG9zZWQgdmlhIGNvbmZpZ1xuXG5mdW5jdGlvbiBkZWZhdWx0U2VyaWFsaXplKGRhdGEpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zZm9ybSggLy8gQE5PVEUgaW5ib3VuZDogdHJhbnNmb3JtIHN0YXRlIGNvbWluZyBmcm9tIHJlZHV4IG9uIGl0cyB3YXkgdG8gYmVpbmcgc2VyaWFsaXplZCBhbmQgc3RvcmVkXG5pbmJvdW5kLCAvLyBATk9URSBvdXRib3VuZDogdHJhbnNmb3JtIHN0YXRlIGNvbWluZyBmcm9tIHN0b3JhZ2UsIG9uIGl0cyB3YXkgdG8gYmUgcmVoeWRyYXRlZCBpbnRvIHJlZHV4XG5vdXRib3VuZCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIHdoaXRlbGlzdCA9IGNvbmZpZy53aGl0ZWxpc3QgfHwgbnVsbDtcbiAgdmFyIGJsYWNrbGlzdCA9IGNvbmZpZy5ibGFja2xpc3QgfHwgbnVsbDtcblxuICBmdW5jdGlvbiB3aGl0ZWxpc3RCbGFja2xpc3RDaGVjayhrZXkpIHtcbiAgICBpZiAod2hpdGVsaXN0ICYmIHdoaXRlbGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdC5pbmRleE9mKGtleSkgIT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluOiBmdW5jdGlvbiBfaW4oc3RhdGUsIGtleSwgZnVsbFN0YXRlKSB7XG4gICAgICByZXR1cm4gIXdoaXRlbGlzdEJsYWNrbGlzdENoZWNrKGtleSkgJiYgaW5ib3VuZCA/IGluYm91bmQoc3RhdGUsIGtleSwgZnVsbFN0YXRlKSA6IHN0YXRlO1xuICAgIH0sXG4gICAgb3V0OiBmdW5jdGlvbiBvdXQoc3RhdGUsIGtleSwgZnVsbFN0YXRlKSB7XG4gICAgICByZXR1cm4gIXdoaXRlbGlzdEJsYWNrbGlzdENoZWNrKGtleSkgJiYgb3V0Ym91bmQgPyBvdXRib3VuZChzdGF0ZSwga2V5LCBmdWxsU3RhdGUpIDogc3RhdGU7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCB7IEtFWV9QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdG9yZWRTdGF0ZShjb25maWcpIHtcbiAgdmFyIHRyYW5zZm9ybXMgPSBjb25maWcudHJhbnNmb3JtcyB8fCBbXTtcbiAgdmFyIHN0b3JhZ2VLZXkgPSBcIlwiLmNvbmNhdChjb25maWcua2V5UHJlZml4ICE9PSB1bmRlZmluZWQgPyBjb25maWcua2V5UHJlZml4IDogS0VZX1BSRUZJWCkuY29uY2F0KGNvbmZpZy5rZXkpO1xuICB2YXIgc3RvcmFnZSA9IGNvbmZpZy5zdG9yYWdlO1xuICB2YXIgZGVidWcgPSBjb25maWcuZGVidWc7XG4gIHZhciBkZXNlcmlhbGl6ZTtcblxuICBpZiAoY29uZmlnLmRlc2VyaWFsaXplID09PSBmYWxzZSkge1xuICAgIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gZGVzZXJpYWxpemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnLmRlc2VyaWFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVzZXJpYWxpemUgPSBjb25maWcuZGVzZXJpYWxpemU7XG4gIH0gZWxzZSB7XG4gICAgZGVzZXJpYWxpemUgPSBkZWZhdWx0RGVzZXJpYWxpemU7XG4gIH1cblxuICByZXR1cm4gc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpLnRoZW4oZnVuY3Rpb24gKHNlcmlhbGl6ZWQpIHtcbiAgICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7ZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgc3RhdGUgPSB7fTtcbiAgICAgICAgdmFyIHJhd1N0YXRlID0gZGVzZXJpYWxpemUoc2VyaWFsaXplZCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHJhd1N0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBzdGF0ZVtrZXldID0gdHJhbnNmb3Jtcy5yZWR1Y2VSaWdodChmdW5jdGlvbiAoc3ViU3RhdGUsIHRyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIub3V0KHN1YlN0YXRlLCBrZXksIHJhd1N0YXRlKTtcbiAgICAgICAgICB9LCBkZXNlcmlhbGl6ZShyYXdTdGF0ZVtrZXldKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIGNvbnNvbGUubG9nKFwicmVkdXgtcGVyc2lzdC9nZXRTdG9yZWRTdGF0ZTogRXJyb3IgcmVzdG9yaW5nIGRhdGEgXCIuY29uY2F0KHNlcmlhbGl6ZWQpLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdERlc2VyaWFsaXplKHNlcmlhbCkge1xuICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWwpO1xufSIsImV4cG9ydCB7IGRlZmF1bHQgYXMgcGVyc2lzdFJlZHVjZXIgfSBmcm9tICcuL3BlcnNpc3RSZWR1Y2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGVyc2lzdENvbWJpbmVSZWR1Y2VycyB9IGZyb20gJy4vcGVyc2lzdENvbWJpbmVSZWR1Y2Vycyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBlcnNpc3RTdG9yZSB9IGZyb20gJy4vcGVyc2lzdFN0b3JlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlTWlncmF0ZSB9IGZyb20gJy4vY3JlYXRlTWlncmF0ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vY3JlYXRlVHJhbnNmb3JtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0U3RvcmVkU3RhdGUgfSBmcm9tICcuL2dldFN0b3JlZFN0YXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlUGVyc2lzdG9pZCB9IGZyb20gJy4vY3JlYXRlUGVyc2lzdG9pZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHB1cmdlU3RvcmVkU3RhdGUgfSBmcm9tICcuL3B1cmdlU3RvcmVkU3RhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuXG5leHBvcnQgdmFyIFBlcnNpc3RHYXRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGVyc2lzdEdhdGUsIF9QdXJlQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQZXJzaXN0R2F0ZSgpIHtcbiAgICB2YXIgX2dldFByb3RvdHlwZU9mMjtcblxuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQZXJzaXN0R2F0ZSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX2dldFByb3RvdHlwZU9mMiA9IF9nZXRQcm90b3R5cGVPZihQZXJzaXN0R2F0ZSkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgIGJvb3RzdHJhcHBlZDogZmFsc2VcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfdW5zdWJzY3JpYmVcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVQZXJzaXN0b3JTdGF0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGVyc2lzdG9yID0gX3RoaXMucHJvcHMucGVyc2lzdG9yO1xuXG4gICAgICB2YXIgX3BlcnNpc3RvciRnZXRTdGF0ZSA9IHBlcnNpc3Rvci5nZXRTdGF0ZSgpLFxuICAgICAgICAgIGJvb3RzdHJhcHBlZCA9IF9wZXJzaXN0b3IkZ2V0U3RhdGUuYm9vdHN0cmFwcGVkO1xuXG4gICAgICBpZiAoYm9vdHN0cmFwcGVkKSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkJlZm9yZUxpZnQpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoX3RoaXMucHJvcHMub25CZWZvcmVMaWZ0KCkpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgYm9vdHN0cmFwcGVkOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBib290c3RyYXBwZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLl91bnN1YnNjcmliZSAmJiBfdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQZXJzaXN0R2F0ZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZSA9IHRoaXMucHJvcHMucGVyc2lzdG9yLnN1YnNjcmliZSh0aGlzLmhhbmRsZVBlcnNpc3RvclN0YXRlKTtcbiAgICAgIHRoaXMuaGFuZGxlUGVyc2lzdG9yU3RhdGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZSAmJiB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmNoaWxkcmVuID09PSAnZnVuY3Rpb24nICYmIHRoaXMucHJvcHMubG9hZGluZykgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdDogUGVyc2lzdEdhdGUgZXhwZWN0cyBlaXRoZXIgYSBmdW5jdGlvbiBjaGlsZCBvciBsb2FkaW5nIHByb3AsIGJ1dCBub3QgYm90aC4gVGhlIGxvYWRpbmcgcHJvcCB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbih0aGlzLnN0YXRlLmJvb3RzdHJhcHBlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmJvb3RzdHJhcHBlZCA/IHRoaXMucHJvcHMuY2hpbGRyZW4gOiB0aGlzLnByb3BzLmxvYWRpbmc7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBlcnNpc3RHYXRlO1xufShQdXJlQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KFBlcnNpc3RHYXRlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNoaWxkcmVuOiBudWxsLFxuICBsb2FkaW5nOiBudWxsXG59KTsiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgcGVyc2lzdFJlZHVjZXIgZnJvbSAnLi9wZXJzaXN0UmVkdWNlcic7XG5pbXBvcnQgYXV0b01lcmdlTGV2ZWwyIGZyb20gJy4vc3RhdGVSZWNvbmNpbGVyL2F1dG9NZXJnZUxldmVsMic7XG4vLyBjb21iaW5lUmVkdWNlcnMgKyBwZXJzaXN0UmVkdWNlciB3aXRoIHN0YXRlUmVjb25jaWxlciBkZWZhdWx0ZWQgdG8gYXV0b01lcmdlTGV2ZWwyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZXJzaXN0Q29tYmluZVJlZHVjZXJzKGNvbmZpZywgcmVkdWNlcnMpIHtcbiAgY29uZmlnLnN0YXRlUmVjb25jaWxlciA9IGNvbmZpZy5zdGF0ZVJlY29uY2lsZXIgPT09IHVuZGVmaW5lZCA/IGF1dG9NZXJnZUxldmVsMiA6IGNvbmZpZy5zdGF0ZVJlY29uY2lsZXI7XG4gIHJldHVybiBwZXJzaXN0UmVkdWNlcihjb25maWcsIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycykpO1xufSIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IEZMVVNILCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFSFlEUkFURSwgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGF1dG9NZXJnZUxldmVsMSBmcm9tICcuL3N0YXRlUmVjb25jaWxlci9hdXRvTWVyZ2VMZXZlbDEnO1xuaW1wb3J0IGNyZWF0ZVBlcnNpc3RvaWQgZnJvbSAnLi9jcmVhdGVQZXJzaXN0b2lkJztcbmltcG9ydCBkZWZhdWx0R2V0U3RvcmVkU3RhdGUgZnJvbSAnLi9nZXRTdG9yZWRTdGF0ZSc7XG5pbXBvcnQgcHVyZ2VTdG9yZWRTdGF0ZSBmcm9tICcuL3B1cmdlU3RvcmVkU3RhdGUnO1xudmFyIERFRkFVTFRfVElNRU9VVCA9IDUwMDA7XG4vKlxuICBAVE9ETyBhZGQgdmFsaWRhdGlvbiAvIGhhbmRsaW5nIGZvcjpcbiAgLSBwZXJzaXN0aW5nIGEgcmVkdWNlciB3aGljaCBoYXMgbmVzdGVkIF9wZXJzaXN0XG4gIC0gaGFuZGxpbmcgYWN0aW9ucyB0aGF0IGZpcmUgYmVmb3JlIHJleWRyYXRlIGlzIGNhbGxlZFxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGVyc2lzdFJlZHVjZXIoY29uZmlnLCBiYXNlUmVkdWNlcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBpcyByZXF1aXJlZCBmb3IgcGVyc2lzdFJlZHVjZXInKTtcbiAgICBpZiAoIWNvbmZpZy5rZXkpIHRocm93IG5ldyBFcnJvcigna2V5IGlzIHJlcXVpcmVkIGluIHBlcnNpc3RvciBjb25maWcnKTtcbiAgICBpZiAoIWNvbmZpZy5zdG9yYWdlKSB0aHJvdyBuZXcgRXJyb3IoXCJyZWR1eC1wZXJzaXN0OiBjb25maWcuc3RvcmFnZSBpcyByZXF1aXJlZC4gVHJ5IHVzaW5nIG9uZSBvZiB0aGUgcHJvdmlkZWQgc3RvcmFnZSBlbmdpbmVzIGBpbXBvcnQgc3RvcmFnZSBmcm9tICdyZWR1eC1wZXJzaXN0L2xpYi9zdG9yYWdlJ2BcIik7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uICE9PSB1bmRlZmluZWQgPyBjb25maWcudmVyc2lvbiA6IERFRkFVTFRfVkVSU0lPTjtcbiAgdmFyIGRlYnVnID0gY29uZmlnLmRlYnVnIHx8IGZhbHNlO1xuICB2YXIgc3RhdGVSZWNvbmNpbGVyID0gY29uZmlnLnN0YXRlUmVjb25jaWxlciA9PT0gdW5kZWZpbmVkID8gYXV0b01lcmdlTGV2ZWwxIDogY29uZmlnLnN0YXRlUmVjb25jaWxlcjtcbiAgdmFyIGdldFN0b3JlZFN0YXRlID0gY29uZmlnLmdldFN0b3JlZFN0YXRlIHx8IGRlZmF1bHRHZXRTdG9yZWRTdGF0ZTtcbiAgdmFyIHRpbWVvdXQgPSBjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnRpbWVvdXQgOiBERUZBVUxUX1RJTUVPVVQ7XG4gIHZhciBfcGVyc2lzdG9pZCA9IG51bGw7XG4gIHZhciBfcHVyZ2UgPSBmYWxzZTtcbiAgdmFyIF9wYXVzZWQgPSB0cnVlO1xuXG4gIHZhciBjb25kaXRpb25hbFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsVXBkYXRlKHN0YXRlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBwZXJzaXN0b2lkIG9ubHkgaWYgd2UgYXJlIHJlaHlkcmF0ZWQgYW5kIG5vdCBwYXVzZWRcbiAgICBzdGF0ZS5fcGVyc2lzdC5yZWh5ZHJhdGVkICYmIF9wZXJzaXN0b2lkICYmICFfcGF1c2VkICYmIF9wZXJzaXN0b2lkLnVwZGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgIHZhciBfcmVmID0gc3RhdGUgfHwge30sXG4gICAgICAgIF9wZXJzaXN0ID0gX3JlZi5fcGVyc2lzdCxcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbXCJfcGVyc2lzdFwiXSk7IC8vICRGbG93SWdub3JlIG5lZWQgdG8gdXBkYXRlIFN0YXRlIHR5cGVcblxuXG4gICAgdmFyIHJlc3RTdGF0ZSA9IHJlc3Q7XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFBFUlNJU1QpIHtcbiAgICAgIHZhciBfc2VhbGVkID0gZmFsc2U7XG5cbiAgICAgIHZhciBfcmVoeWRyYXRlID0gZnVuY3Rpb24gX3JlaHlkcmF0ZShwYXlsb2FkLCBlcnIpIHtcbiAgICAgICAgLy8gZGV2IHdhcm5pbmcgaWYgd2UgYXJlIGFscmVhZHkgc2VhbGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIF9zZWFsZWQpIGNvbnNvbGUuZXJyb3IoXCJyZWR1eC1wZXJzaXN0OiByZWh5ZHJhdGUgZm9yIFxcXCJcIi5jb25jYXQoY29uZmlnLmtleSwgXCJcXFwiIGNhbGxlZCBhZnRlciB0aW1lb3V0LlwiKSwgcGF5bG9hZCwgZXJyKTsgLy8gb25seSByZWh5ZHJhdGUgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IHNlYWxlZFxuXG4gICAgICAgIGlmICghX3NlYWxlZCkge1xuICAgICAgICAgIGFjdGlvbi5yZWh5ZHJhdGUoY29uZmlnLmtleSwgcGF5bG9hZCwgZXJyKTtcbiAgICAgICAgICBfc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGltZW91dCAmJiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIV9zZWFsZWQgJiYgX3JlaHlkcmF0ZSh1bmRlZmluZWQsIG5ldyBFcnJvcihcInJlZHV4LXBlcnNpc3Q6IHBlcnNpc3QgdGltZWQgb3V0IGZvciBwZXJzaXN0IGtleSBcXFwiXCIuY29uY2F0KGNvbmZpZy5rZXksIFwiXFxcIlwiKSkpO1xuICAgICAgfSwgdGltZW91dCk7IC8vIEBOT1RFIFBFUlNJU1QgcmVzdW1lcyBpZiBwYXVzZWQuXG5cbiAgICAgIF9wYXVzZWQgPSBmYWxzZTsgLy8gQE5PVEUgb25seSBldmVyIGNyZWF0ZSBwZXJzaXN0b2lkIG9uY2UsIGVuc3VyZSB3ZSBjYWxsIGl0IGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgX3BlcnNpc3QgaGFzIGFscmVhZHkgYmVlbiBzZXRcblxuICAgICAgaWYgKCFfcGVyc2lzdG9pZCkgX3BlcnNpc3RvaWQgPSBjcmVhdGVQZXJzaXN0b2lkKGNvbmZpZyk7IC8vIEBOT1RFIFBFUlNJU1QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgbm9vcCBhZnRlciB0aGUgZmlyc3RcblxuICAgICAgaWYgKF9wZXJzaXN0KSB7XG4gICAgICAgIC8vIFdlIHN0aWxsIG5lZWQgdG8gY2FsbCB0aGUgYmFzZSByZWR1Y2VyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbmVzdGVkXG4gICAgICAgIC8vIHVzZXMgb2YgcGVyc2lzdFJlZHVjZXIgd2hpY2ggbmVlZCB0byBiZSBhd2FyZSBvZiB0aGUgUEVSU0lTVCBhY3Rpb25cbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGJhc2VSZWR1Y2VyKHJlc3RTdGF0ZSwgYWN0aW9uKSwge1xuICAgICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24ucmVoeWRyYXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhY3Rpb24ucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcigncmVkdXgtcGVyc2lzdDogZWl0aGVyIHJlaHlkcmF0ZSBvciByZWdpc3RlciBpcyBub3QgYSBmdW5jdGlvbiBvbiB0aGUgUEVSU0lTVCBhY3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgYWN0aW9uIGlzIGJlaW5nIHJlcGxheWVkLiBUaGlzIGlzIGFuIHVuZXhwbG9yZWQgdXNlIGNhc2UsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIGFuZCB3ZSB3aWxsIGZpZ3VyZSBvdXQgYSByZXNvbHV0aW9uLicpO1xuICAgICAgYWN0aW9uLnJlZ2lzdGVyKGNvbmZpZy5rZXkpO1xuICAgICAgZ2V0U3RvcmVkU3RhdGUoY29uZmlnKS50aGVuKGZ1bmN0aW9uIChyZXN0b3JlZFN0YXRlKSB7XG4gICAgICAgIHZhciBtaWdyYXRlID0gY29uZmlnLm1pZ3JhdGUgfHwgZnVuY3Rpb24gKHMsIHYpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1pZ3JhdGUocmVzdG9yZWRTdGF0ZSwgdmVyc2lvbikudGhlbihmdW5jdGlvbiAobWlncmF0ZWRTdGF0ZSkge1xuICAgICAgICAgIF9yZWh5ZHJhdGUobWlncmF0ZWRTdGF0ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChtaWdyYXRlRXJyKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbWlncmF0ZUVycikgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdDogbWlncmF0aW9uIGVycm9yJywgbWlncmF0ZUVycik7XG5cbiAgICAgICAgICBfcmVoeWRyYXRlKHVuZGVmaW5lZCwgbWlncmF0ZUVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBfcmVoeWRyYXRlKHVuZGVmaW5lZCwgZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGJhc2VSZWR1Y2VyKHJlc3RTdGF0ZSwgYWN0aW9uKSwge1xuICAgICAgICBfcGVyc2lzdDoge1xuICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgcmVoeWRyYXRlZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gUFVSR0UpIHtcbiAgICAgIF9wdXJnZSA9IHRydWU7XG4gICAgICBhY3Rpb24ucmVzdWx0KHB1cmdlU3RvcmVkU3RhdGUoY29uZmlnKSk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgYmFzZVJlZHVjZXIocmVzdFN0YXRlLCBhY3Rpb24pLCB7XG4gICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gRkxVU0gpIHtcbiAgICAgIGFjdGlvbi5yZXN1bHQoX3BlcnNpc3RvaWQgJiYgX3BlcnNpc3RvaWQuZmx1c2goKSk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgYmFzZVJlZHVjZXIocmVzdFN0YXRlLCBhY3Rpb24pLCB7XG4gICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gUEFVU0UpIHtcbiAgICAgIF9wYXVzZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IFJFSFlEUkFURSkge1xuICAgICAgLy8gbm9vcCBvbiByZXN0U3RhdGUgaWYgcHVyZ2luZ1xuICAgICAgaWYgKF9wdXJnZSkgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHJlc3RTdGF0ZSwge1xuICAgICAgICBfcGVyc2lzdDogX29iamVjdFNwcmVhZCh7fSwgX3BlcnNpc3QsIHtcbiAgICAgICAgICByZWh5ZHJhdGVkOiB0cnVlXG4gICAgICAgIH0pIC8vIEBOT1RFIGlmIGtleSBkb2VzIG5vdCBtYXRjaCwgd2lsbCBjb250aW51ZSB0byBkZWZhdWx0IGVsc2UgYmVsb3dcblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3Rpb24ua2V5ID09PSBjb25maWcua2V5KSB7XG4gICAgICAgIHZhciByZWR1Y2VkU3RhdGUgPSBiYXNlUmVkdWNlcihyZXN0U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIHZhciBpbmJvdW5kU3RhdGUgPSBhY3Rpb24ucGF5bG9hZDsgLy8gb25seSByZWNvbmNpbGUgc3RhdGUgaWYgc3RhdGVSZWNvbmNpbGVyIGFuZCBpbmJvdW5kU3RhdGUgYXJlIGJvdGggZGVmaW5lZFxuXG4gICAgICAgIHZhciByZWNvbmNpbGVkUmVzdCA9IHN0YXRlUmVjb25jaWxlciAhPT0gZmFsc2UgJiYgaW5ib3VuZFN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZVJlY29uY2lsZXIoaW5ib3VuZFN0YXRlLCBzdGF0ZSwgcmVkdWNlZFN0YXRlLCBjb25maWcpIDogcmVkdWNlZFN0YXRlO1xuXG4gICAgICAgIHZhciBfbmV3U3RhdGUgPSBfb2JqZWN0U3ByZWFkKHt9LCByZWNvbmNpbGVkUmVzdCwge1xuICAgICAgICAgIF9wZXJzaXN0OiBfb2JqZWN0U3ByZWFkKHt9LCBfcGVyc2lzdCwge1xuICAgICAgICAgICAgcmVoeWRyYXRlZDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25kaXRpb25hbFVwZGF0ZShfbmV3U3RhdGUpO1xuICAgICAgfVxuICAgIH0gLy8gaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBoYW5kbGVkIFBFUlNJU1QsIHN0cmFpZ2h0IHBhc3N0aHJvdWdoXG5cblxuICAgIGlmICghX3BlcnNpc3QpIHJldHVybiBiYXNlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsgLy8gcnVuIGJhc2UgcmVkdWNlcjpcbiAgICAvLyBpcyBzdGF0ZSBtb2RpZmllZCA/IHJldHVybiBvcmlnaW5hbCA6IHJldHVybiB1cGRhdGVkXG5cbiAgICB2YXIgbmV3U3RhdGUgPSBiYXNlUmVkdWNlcihyZXN0U3RhdGUsIGFjdGlvbik7XG4gICAgaWYgKG5ld1N0YXRlID09PSByZXN0U3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICByZXR1cm4gY29uZGl0aW9uYWxVcGRhdGUoX29iamVjdFNwcmVhZCh7fSwgbmV3U3RhdGUsIHtcbiAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgIH0pKTtcbiAgfTtcbn0iLCJmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoc291cmNlLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB7IEZMVVNILCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFR0lTVEVSLCBSRUhZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICByZWdpc3RyeTogW10sXG4gIGJvb3RzdHJhcHBlZDogZmFsc2Vcbn07XG5cbnZhciBwZXJzaXN0b3JSZWR1Y2VyID0gZnVuY3Rpb24gcGVyc2lzdG9yUmVkdWNlcigpIHtcbiAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBpbml0aWFsU3RhdGU7XG4gIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBSRUdJU1RFUjpcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICByZWdpc3RyeTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdGF0ZS5yZWdpc3RyeSksIFthY3Rpb24ua2V5XSlcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBSRUhZRFJBVEU6XG4gICAgICB2YXIgZmlyc3RJbmRleCA9IHN0YXRlLnJlZ2lzdHJ5LmluZGV4T2YoYWN0aW9uLmtleSk7XG5cbiAgICAgIHZhciByZWdpc3RyeSA9IF90b0NvbnN1bWFibGVBcnJheShzdGF0ZS5yZWdpc3RyeSk7XG5cbiAgICAgIHJlZ2lzdHJ5LnNwbGljZShmaXJzdEluZGV4LCAxKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksXG4gICAgICAgIGJvb3RzdHJhcHBlZDogcmVnaXN0cnkubGVuZ3RoID09PSAwXG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBlcnNpc3RTdG9yZShzdG9yZSwgb3B0aW9ucywgY2IpIHtcbiAgLy8gaGVscCBjYXRjaCBpbmNvcnJlY3QgdXNhZ2Ugb2YgcGFzc2luZyBQZXJzaXN0Q29uZmlnIGluIGFzIFBlcnNpc3Rvck9wdGlvbnNcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgb3B0aW9uc1RvVGVzdCA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIGJhbm5lZEtleXMgPSBbJ2JsYWNrbGlzdCcsICd3aGl0ZWxpc3QnLCAndHJhbnNmb3JtcycsICdzdG9yYWdlJywgJ2tleVByZWZpeCcsICdtaWdyYXRlJ107XG4gICAgYmFubmVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBpZiAoISFvcHRpb25zVG9UZXN0W2tdKSBjb25zb2xlLmVycm9yKFwicmVkdXgtcGVyc2lzdDogaW52YWxpZCBvcHRpb24gcGFzc2VkIHRvIHBlcnNpc3RTdG9yZTogXFxcIlwiLmNvbmNhdChrLCBcIlxcXCIuIFlvdSBtYXkgYmUgaW5jb3JyZWN0bHkgcGFzc2luZyBwZXJzaXN0Q29uZmlnIGludG8gcGVyc2lzdFN0b3JlLCB3aGVyZWFzIGl0IHNob3VsZCBiZSBwYXNzZWQgaW50byBwZXJzaXN0UmVkdWNlci5cIikpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJvb3N0cmFwcGVkQ2IgPSBjYiB8fCBmYWxzZTtcblxuICB2YXIgX3BTdG9yZSA9IGNyZWF0ZVN0b3JlKHBlcnNpc3RvclJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgb3B0aW9ucyAmJiBvcHRpb25zLmVuaGFuY2VyID8gb3B0aW9ucy5lbmhhbmNlciA6IHVuZGVmaW5lZCk7XG5cbiAgdmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIoa2V5KSB7XG4gICAgX3BTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiBSRUdJU1RFUixcbiAgICAgIGtleToga2V5XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlaHlkcmF0ZSA9IGZ1bmN0aW9uIHJlaHlkcmF0ZShrZXksIHBheWxvYWQsIGVycikge1xuICAgIHZhciByZWh5ZHJhdGVBY3Rpb24gPSB7XG4gICAgICB0eXBlOiBSRUhZRFJBVEUsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgZXJyOiBlcnIsXG4gICAgICBrZXk6IGtleSAvLyBkaXNwYXRjaCB0byBgc3RvcmVgIHRvIHJlaHlkcmF0ZSBhbmQgYHBlcnNpc3RvcmAgdG8gdHJhY2sgcmVzdWx0XG5cbiAgICB9O1xuICAgIHN0b3JlLmRpc3BhdGNoKHJlaHlkcmF0ZUFjdGlvbik7XG5cbiAgICBfcFN0b3JlLmRpc3BhdGNoKHJlaHlkcmF0ZUFjdGlvbik7XG5cbiAgICBpZiAoYm9vc3RyYXBwZWRDYiAmJiBwZXJzaXN0b3IuZ2V0U3RhdGUoKS5ib290c3RyYXBwZWQpIHtcbiAgICAgIGJvb3N0cmFwcGVkQ2IoKTtcbiAgICAgIGJvb3N0cmFwcGVkQ2IgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlcnNpc3RvciA9IF9vYmplY3RTcHJlYWQoe30sIF9wU3RvcmUsIHtcbiAgICBwdXJnZTogZnVuY3Rpb24gcHVyZ2UoKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQVVJHRSxcbiAgICAgICAgcmVzdWx0OiBmdW5jdGlvbiByZXN1bHQocHVyZ2VSZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocHVyZ2VSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKTtcbiAgICB9LFxuICAgIGZsdXNoOiBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBzdG9yZS5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IEZMVVNILFxuICAgICAgICByZXN1bHQ6IGZ1bmN0aW9uIHJlc3VsdChmbHVzaFJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChmbHVzaFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpO1xuICAgIH0sXG4gICAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQQVVTRVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBwZXJzaXN0OiBmdW5jdGlvbiBwZXJzaXN0KCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQRVJTSVNULFxuICAgICAgICByZWdpc3RlcjogcmVnaXN0ZXIsXG4gICAgICAgIHJlaHlkcmF0ZTogcmVoeWRyYXRlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICghKG9wdGlvbnMgJiYgb3B0aW9ucy5tYW51YWxQZXJzaXN0KSkge1xuICAgIHBlcnNpc3Rvci5wZXJzaXN0KCk7XG4gIH1cblxuICByZXR1cm4gcGVyc2lzdG9yO1xufSIsImltcG9ydCB7IEtFWV9QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwdXJnZVN0b3JlZFN0YXRlKGNvbmZpZykge1xuICB2YXIgc3RvcmFnZSA9IGNvbmZpZy5zdG9yYWdlO1xuICB2YXIgc3RvcmFnZUtleSA9IFwiXCIuY29uY2F0KGNvbmZpZy5rZXlQcmVmaXggIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5rZXlQcmVmaXggOiBLRVlfUFJFRklYKS5jb25jYXQoY29uZmlnLmtleSk7XG4gIHJldHVybiBzdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSwgd2FybklmUmVtb3ZlRXJyb3IpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZW1vdmVFcnJvcihlcnIpIHtcbiAgaWYgKGVyciAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdC9wdXJnZVN0b3JlZFN0YXRlOiBFcnJvciBwdXJnaW5nIGRhdGEgc3RvcmVkIHN0YXRlJywgZXJyKTtcbiAgfVxufSIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qXG4gIGF1dG9NZXJnZUxldmVsMTogXG4gICAgLSBtZXJnZXMgMSBsZXZlbCBvZiBzdWJzdGF0ZVxuICAgIC0gc2tpcHMgc3Vic3RhdGUgaWYgYWxyZWFkeSBtb2RpZmllZFxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1dG9NZXJnZUxldmVsMShpbmJvdW5kU3RhdGUsIG9yaWdpbmFsU3RhdGUsIHJlZHVjZWRTdGF0ZSwgX3JlZikge1xuICB2YXIgZGVidWcgPSBfcmVmLmRlYnVnO1xuXG4gIHZhciBuZXdTdGF0ZSA9IF9vYmplY3RTcHJlYWQoe30sIHJlZHVjZWRTdGF0ZSk7IC8vIG9ubHkgcmVoeWRyYXRlIGlmIGluYm91bmRTdGF0ZSBleGlzdHMgYW5kIGlzIGFuIG9iamVjdFxuXG5cbiAgaWYgKGluYm91bmRTdGF0ZSAmJiBfdHlwZW9mKGluYm91bmRTdGF0ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgT2JqZWN0LmtleXMoaW5ib3VuZFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8vIGlnbm9yZSBfcGVyc2lzdCBkYXRhXG4gICAgICBpZiAoa2V5ID09PSAnX3BlcnNpc3QnKSByZXR1cm47IC8vIGlmIHJlZHVjZXIgbW9kaWZpZXMgc3Vic3RhdGUsIHNraXAgYXV0byByZWh5ZHJhdGlvblxuXG4gICAgICBpZiAob3JpZ2luYWxTdGF0ZVtrZXldICE9PSByZWR1Y2VkU3RhdGVba2V5XSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkZWJ1ZykgY29uc29sZS5sb2coJ3JlZHV4LXBlcnNpc3Qvc3RhdGVSZWNvbmNpbGVyOiBzdWIgc3RhdGUgZm9yIGtleSBgJXNgIG1vZGlmaWVkLCBza2lwcGluZy4nLCBrZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG90aGVyd2lzZSBoYXJkIHNldCB0aGUgbmV3IHZhbHVlXG5cblxuICAgICAgbmV3U3RhdGVba2V5XSA9IGluYm91bmRTdGF0ZVtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcgJiYgaW5ib3VuZFN0YXRlICYmIF90eXBlb2YoaW5ib3VuZFN0YXRlKSA9PT0gJ29iamVjdCcpIGNvbnNvbGUubG9nKFwicmVkdXgtcGVyc2lzdC9zdGF0ZVJlY29uY2lsZXI6IHJlaHlkcmF0ZWQga2V5cyAnXCIuY29uY2F0KE9iamVjdC5rZXlzKGluYm91bmRTdGF0ZSkuam9pbignLCAnKSwgXCInXCIpKTtcbiAgcmV0dXJuIG5ld1N0YXRlO1xufSIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qXG4gIGF1dG9NZXJnZUxldmVsMjogXG4gICAgLSBtZXJnZXMgMiBsZXZlbCBvZiBzdWJzdGF0ZVxuICAgIC0gc2tpcHMgc3Vic3RhdGUgaWYgYWxyZWFkeSBtb2RpZmllZFxuICAgIC0gdGhpcyBpcyBlc3NlbnRpYWxseSByZWR1eC1wZXJpc3QgdjQgYmVoYXZpb3JcbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvTWVyZ2VMZXZlbDIoaW5ib3VuZFN0YXRlLCBvcmlnaW5hbFN0YXRlLCByZWR1Y2VkU3RhdGUsIF9yZWYpIHtcbiAgdmFyIGRlYnVnID0gX3JlZi5kZWJ1ZztcblxuICB2YXIgbmV3U3RhdGUgPSBfb2JqZWN0U3ByZWFkKHt9LCByZWR1Y2VkU3RhdGUpOyAvLyBvbmx5IHJlaHlkcmF0ZSBpZiBpbmJvdW5kU3RhdGUgZXhpc3RzIGFuZCBpcyBhbiBvYmplY3RcblxuXG4gIGlmIChpbmJvdW5kU3RhdGUgJiYgX3R5cGVvZihpbmJvdW5kU3RhdGUpID09PSAnb2JqZWN0Jykge1xuICAgIE9iamVjdC5rZXlzKGluYm91bmRTdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAvLyBpZ25vcmUgX3BlcnNpc3QgZGF0YVxuICAgICAgaWYgKGtleSA9PT0gJ19wZXJzaXN0JykgcmV0dXJuOyAvLyBpZiByZWR1Y2VyIG1vZGlmaWVzIHN1YnN0YXRlLCBza2lwIGF1dG8gcmVoeWRyYXRpb25cblxuICAgICAgaWYgKG9yaWdpbmFsU3RhdGVba2V5XSAhPT0gcmVkdWNlZFN0YXRlW2tleV0pIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIGNvbnNvbGUubG9nKCdyZWR1eC1wZXJzaXN0L3N0YXRlUmVjb25jaWxlcjogc3ViIHN0YXRlIGZvciBrZXkgYCVzYCBtb2RpZmllZCwgc2tpcHBpbmcuJywga2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbkVub3VnaE9iamVjdChyZWR1Y2VkU3RhdGVba2V5XSkpIHtcbiAgICAgICAgLy8gaWYgb2JqZWN0IGlzIHBsYWluIGVub3VnaCBzaGFsbG93IG1lcmdlIHRoZSBuZXcgdmFsdWVzIChoZW5jZSBcIkxldmVsMlwiKVxuICAgICAgICBuZXdTdGF0ZVtrZXldID0gX29iamVjdFNwcmVhZCh7fSwgbmV3U3RhdGVba2V5XSwge30sIGluYm91bmRTdGF0ZVtrZXldKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBvdGhlcndpc2UgaGFyZCBzZXRcblxuXG4gICAgICBuZXdTdGF0ZVtrZXldID0gaW5ib3VuZFN0YXRlW2tleV07XG4gICAgfSk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkZWJ1ZyAmJiBpbmJvdW5kU3RhdGUgJiYgX3R5cGVvZihpbmJvdW5kU3RhdGUpID09PSAnb2JqZWN0JykgY29uc29sZS5sb2coXCJyZWR1eC1wZXJzaXN0L3N0YXRlUmVjb25jaWxlcjogcmVoeWRyYXRlZCBrZXlzICdcIi5jb25jYXQoT2JqZWN0LmtleXMoaW5ib3VuZFN0YXRlKS5qb2luKCcsICcpLCBcIidcIikpO1xuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5Fbm91Z2hPYmplY3Qobykge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvKSAmJiBfdHlwZW9mKG8pID09PSAnb2JqZWN0Jztcbn0iLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiAnSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gJyArICdjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSAnICsgJ3RvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihlbmhhbmNlcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKHJlZHVjZXIpICsgXCInXCIpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGlzIG1ha2VzIGEgc2hhbGxvdyBjb3B5IG9mIGN1cnJlbnRMaXN0ZW5lcnMgc28gd2UgY2FuIHVzZVxuICAgKiBuZXh0TGlzdGVuZXJzIGFzIGEgdGVtcG9yYXJ5IGxpc3Qgd2hpbGUgZGlzcGF0Y2hpbmcuXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgYW55IGJ1Z3MgYXJvdW5kIGNvbnN1bWVycyBjYWxsaW5nXG4gICAqIHN1YnNjcmliZS91bnN1YnNjcmliZSBpbiB0aGUgbWlkZGxlIG9mIGEgZGlzcGF0Y2guXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1RoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gJyArICdQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihsaXN0ZW5lcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhICcgKyAnY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiAnWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgICB9XG5cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcIkFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnXCIgKyBraW5kT2YoYWN0aW9uKSArIFwiJy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiAnUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByZWR1Y2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdG9yZSB0byBjYWxjdWxhdGUgdGhlIHN0YXRlLlxuICAgKlxuICAgKiBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYXBwIGltcGxlbWVudHMgY29kZSBzcGxpdHRpbmcgYW5kIHlvdSB3YW50IHRvXG4gICAqIGxvYWQgc29tZSBvZiB0aGUgcmVkdWNlcnMgZHluYW1pY2FsbHkuIFlvdSBtaWdodCBhbHNvIG5lZWQgdGhpcyBpZiB5b3VcbiAgICogaW1wbGVtZW50IGEgaG90IHJlbG9hZGluZyBtZWNoYW5pc20gZm9yIFJlZHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0UmVkdWNlciBUaGUgcmVkdWNlciBmb3IgdGhlIHN0b3JlIHRvIHVzZSBpbnN0ZWFkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG5cblxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IFwiRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobmV4dFJlZHVjZXIpKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyOyAvLyBUaGlzIGFjdGlvbiBoYXMgYSBzaW1pbGlhciBlZmZlY3QgdG8gQWN0aW9uVHlwZXMuSU5JVC5cbiAgICAvLyBBbnkgcmVkdWNlcnMgdGhhdCBleGlzdGVkIGluIGJvdGggdGhlIG5ldyBhbmQgb2xkIHJvb3RSZWR1Y2VyXG4gICAgLy8gd2lsbCByZWNlaXZlIHRoZSBwcmV2aW91cyBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgICAvLyB0aGUgbmV3IHN0YXRlIHRyZWUgd2l0aCBhbnkgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBvbGQgb25lLlxuXG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbnRlcm9wZXJhYmlsaXR5IHBvaW50IGZvciBvYnNlcnZhYmxlL3JlYWN0aXZlIGxpYnJhcmllcy5cbiAgICogQHJldHVybnMge29ic2VydmFibGV9IEEgbWluaW1hbCBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIG9ic2VydmFibGUgcHJvcG9zYWw6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGVcbiAgICovXG5cblxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogXCJFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG9ic2VydmVyKSArIFwiJ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9IC8vIFdoZW4gYSBzdG9yZSBpcyBjcmVhdGVkLCBhbiBcIklOSVRcIiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCBzbyB0aGF0IGV2ZXJ5XG4gIC8vIHJlZHVjZXIgcmV0dXJucyB0aGVpciBpbml0aWFsIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAvLyB0aGUgaW5pdGlhbCBzdGF0ZSB0cmVlLlxuXG5cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgfSk7XG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMlskJG9ic2VydmFibGVdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG5cbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcblxufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gXCJUaGUgXCIgKyBhcmd1bWVudE5hbWUgKyBcIiBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFxcXCJcIiArIGtpbmRPZihpbnB1dFN0YXRlKSArIFwiXFxcIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBcIiArIChcImtleXM6IFxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiXCIpO1xuICB9XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldO1xuICB9KTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFwiVW5leHBlY3RlZCBcIiArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgXCIgXCIgKyAoXCJcXFwiXCIgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIiBmb3VuZCBpbiBcIiArIGFyZ3VtZW50TmFtZSArIFwiLiBcIikgKyBcIkV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIgKyAoXCJcXFwiXCIgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gXCIgKyBcIklmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBcIiArIFwiZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBcIiArIFwibm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgXCIgKyBcInlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gXCIgKyAoXCJEb24ndCB0cnkgdG8gaGFuZGxlICdcIiArIEFjdGlvblR5cGVzLklOSVQgKyBcIicgb3Igb3RoZXIgYWN0aW9ucyBpbiBcXFwicmVkdXgvKlxcXCIgXCIpICsgXCJuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBcIiArIFwiY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgXCIgKyBcImluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBcIiArIFwiYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuXCIpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCByZWR1Y2VyIGZ1bmN0aW9ucywgaW50byBhIHNpbmdsZVxuICogcmVkdWNlciBmdW5jdGlvbi4gSXQgd2lsbCBjYWxsIGV2ZXJ5IGNoaWxkIHJlZHVjZXIsIGFuZCBnYXRoZXIgdGhlaXIgcmVzdWx0c1xuICogaW50byBhIHNpbmdsZSBzdGF0ZSBvYmplY3QsIHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiB0aGUgcGFzc2VkXG4gKiByZWR1Y2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVkdWNlcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudFxuICogcmVkdWNlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkIGludG8gb25lLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpblxuICogaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXMgcmVkdWNlcnNgIHN5bnRheC4gVGhlIHJlZHVjZXJzIG1heSBuZXZlciByZXR1cm5cbiAqIHVuZGVmaW5lZCBmb3IgYW55IGFjdGlvbi4gSW5zdGVhZCwgdGhleSBzaG91bGQgcmV0dXJuIHRoZWlyIGluaXRpYWwgc3RhdGVcbiAqIGlmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlbSB3YXMgdW5kZWZpbmVkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueVxuICogdW5yZWNvZ25pemVkIGFjdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgZXZlcnkgcmVkdWNlciBpbnNpZGUgdGhlXG4gKiBwYXNzZWQgb2JqZWN0LCBhbmQgYnVpbGRzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUuXG4gKi9cblxuXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcmVkdWNlcktleXNbaV07XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3YXJuaW5nKFwiTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTsgLy8gVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB3YXJuIGFib3V0IHRoZSBzYW1lXG4gIC8vIGtleXMgbXVsdGlwbGUgdGltZXMuXG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG5cbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlID0ge307XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcblxuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGF0ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG5cbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlIFwiICsgKGFjdGlvblR5cGUgPyBcIlxcXCJcIiArIFN0cmluZyhhY3Rpb25UeXBlKSArIFwiXFxcIlwiIDogJyh1bmtub3duIHR5cGUpJykgKyBcIiwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBfa2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZC4gXCIgKyBcIlRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gXCIgKyBcIklmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGFjdGlvbiBjcmVhdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBkaXNwYXRjaCB3cmFwcGVkIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwiYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJ1wiICsga2luZE9mKGFjdGlvbkNyZWF0b3JzKSArIFwiJy4gXCIgKyBcIkRpZCB5b3Ugd3JpdGUgXFxcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIiBpbnN0ZWFkIG9mIFxcXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIj9cIik7XG4gIH1cblxuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdG9yZSA9IGNyZWF0ZVN0b3JlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcblxuICAgICAgdmFyIF9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiAnRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gJyArICdPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodm9pZCAwLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpLCB7fSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKlxuICogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuICogSWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1pbmlmaWVkIGFuZCBOT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLCB3YXJuIHRoZSB1c2VyLlxuICovXG5cbmZ1bmN0aW9uIGlzQ3J1c2hlZCgpIHt9XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBpc0NydXNoZWQubmFtZSA9PT0gJ3N0cmluZycgJiYgaXNDcnVzaGVkLm5hbWUgIT09ICdpc0NydXNoZWQnKSB7XG4gIHdhcm5pbmcoJ1lvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIuICcgKyAnVGhpcyBtZWFucyB0aGF0IHlvdSBhcmUgcnVubmluZyBhIHNsb3dlciBkZXZlbG9wbWVudCBidWlsZCBvZiBSZWR1eC4gJyArICdZb3UgY2FuIHVzZSBsb29zZS1lbnZpZnkgKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJ0b3NoL2xvb3NlLWVudmlmeSkgZm9yIGJyb3dzZXJpZnkgJyArICdvciBzZXR0aW5nIG1vZGUgdG8gcHJvZHVjdGlvbiBpbiB3ZWJwYWNrIChodHRwczovL3dlYnBhY2suanMub3JnL2NvbmNlcHRzL21vZGUvKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlIH07XG4iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbnZhciBSZWZsZWN0O1xuKGZ1bmN0aW9uIChSZWZsZWN0KSB7XG4gICAgLy8gTWV0YWRhdGEgUHJvcG9zYWxcbiAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhL1xuICAgIChmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgICAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOlxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByb290LlJlZmxlY3QgPSBSZWZsZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIocm9vdC5SZWZsZWN0LCBleHBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yeShleHBvcnRlcik7XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VFeHBvcnRlcih0YXJnZXQsIHByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KShmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcbiAgICAgICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgICAgIC8vIGZlYXR1cmUgdGVzdCBmb3IgU3ltYm9sIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB2YXIgdG9QcmltaXRpdmVTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLnRvUHJpbWl0aXZlIDogXCJAQHRvUHJpbWl0aXZlXCI7XG4gICAgICAgIHZhciBpdGVyYXRvclN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wuaXRlcmF0b3IgOiBcIkBAaXRlcmF0b3JcIjtcbiAgICAgICAgdmFyIHN1cHBvcnRzQ3JlYXRlID0gdHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIjsgLy8gZmVhdHVyZSB0ZXN0IGZvciBPYmplY3QuY3JlYXRlIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzUHJvdG8gPSB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5OyAvLyBmZWF0dXJlIHRlc3QgZm9yIF9fcHJvdG9fXyBzdXBwb3J0XG4gICAgICAgIHZhciBkb3duTGV2ZWwgPSAhc3VwcG9ydHNDcmVhdGUgJiYgIXN1cHBvcnRzUHJvdG87XG4gICAgICAgIHZhciBIYXNoTWFwID0ge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGFuIG9iamVjdCBpbiBkaWN0aW9uYXJ5IG1vZGUgKGEuay5hLiBcInNsb3dcIiBtb2RlIGluIHY4KVxuICAgICAgICAgICAgY3JlYXRlOiBzdXBwb3J0c0NyZWF0ZVxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoT2JqZWN0LmNyZWF0ZShudWxsKSk7IH1cbiAgICAgICAgICAgICAgICA6IHN1cHBvcnRzUHJvdG9cbiAgICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7IF9fcHJvdG9fXzogbnVsbCB9KTsgfVxuICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHt9KTsgfSxcbiAgICAgICAgICAgIGhhczogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KTsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBrZXkgaW4gbWFwOyB9LFxuICAgICAgICAgICAgZ2V0OiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gbWFwW2tleV07IH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIExvYWQgZ2xvYmFsIG9yIHNoaW0gdmVyc2lvbnMgb2YgTWFwLCBTZXQsIGFuZCBXZWFrTWFwXG4gICAgICAgIHZhciBmdW5jdGlvblByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihGdW5jdGlvbik7XG4gICAgICAgIHZhciB1c2VQb2x5ZmlsbCA9IHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W1wiUkVGTEVDVF9NRVRBREFUQV9VU0VfTUFQX1BPTFlGSUxMXCJdID09PSBcInRydWVcIjtcbiAgICAgICAgdmFyIF9NYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IE1hcCA6IENyZWF0ZU1hcFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciBfU2V0ID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG4gICAgICAgIHZhciBNZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUobWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YU1hcC5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IE1ldGFkYXRhLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIE1ldGFkYXRhLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gTWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICBNZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5zZXQoUCwgbWV0YWRhdGFNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4xLjEgT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgbWV0YWRhdGFNYXAuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKGtleXNPYmopO1xuICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IEl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYgRUNNQVNjcmlwdCBEYXRhIFR5cDBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5fY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVLZXkgIT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMuaW5kZXhPZih0aGlzLl9jYWNoZUtleSA9IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBBcnJheShzaXplKSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVVUlEKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gR2VuUmFuZG9tQnl0ZXMoVVVJRF9TSVpFKTtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHJhbmRvbSAtIFJGQyA0MTIyIMKnIDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCIvLyBDYWNoZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBFcmlrIFJhc211c3NlbidzIGBscnUtbWVtb2l6ZWA6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXJpa3Jhcy9scnUtbWVtb2l6ZVxudmFyIE5PVF9GT1VORCA9ICdOT1RfRk9VTkQnO1xuXG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25DYWNoZShlcXVhbHMpIHtcbiAgdmFyIGVudHJ5O1xuICByZXR1cm4ge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGVudHJ5ICYmIGVxdWFscyhlbnRyeS5rZXksIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICAgIH0sXG4gICAgcHV0OiBmdW5jdGlvbiBwdXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZW50cnkgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH07XG4gICAgfSxcbiAgICBnZXRFbnRyaWVzOiBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGVudHJ5ID8gW2VudHJ5XSA6IFtdO1xuICAgIH0sXG4gICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMcnVDYWNoZShtYXhTaXplLCBlcXVhbHMpIHtcbiAgdmFyIGVudHJpZXMgPSBbXTtcblxuICBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGNhY2hlSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIHJldHVybiBlcXVhbHMoa2V5LCBlbnRyeS5rZXkpO1xuICAgIH0pOyAvLyBXZSBmb3VuZCBhIGNhY2hlZCBlbnRyeVxuXG4gICAgaWYgKGNhY2hlSW5kZXggPiAtMSkge1xuICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tjYWNoZUluZGV4XTsgLy8gQ2FjaGVkIGVudHJ5IG5vdCBhdCB0b3Agb2YgY2FjaGUsIG1vdmUgaXQgdG8gdGhlIHRvcFxuXG4gICAgICBpZiAoY2FjaGVJbmRleCA+IDApIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoY2FjaGVJbmRleCwgMSk7XG4gICAgICAgIGVudHJpZXMudW5zaGlmdChlbnRyeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICB9IC8vIE5vIGVudHJ5IGZvdW5kIGluIGNhY2hlLCByZXR1cm4gc2VudGluZWxcblxuXG4gICAgcmV0dXJuIE5PVF9GT1VORDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGdldChrZXkpID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIC8vIFRPRE8gSXMgdW5zaGlmdCBzbG93P1xuICAgICAgZW50cmllcy51bnNoaWZ0KHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgICAgZW50cmllcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZW50cmllcyA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6IGdldCxcbiAgICBwdXQ6IHB1dCxcbiAgICBnZXRFbnRyaWVzOiBnZXRFbnRyaWVzLFxuICAgIGNsZWFyOiBjbGVhclxuICB9O1xufVxuXG5leHBvcnQgdmFyIGRlZmF1bHRFcXVhbGl0eUNoZWNrID0gZnVuY3Rpb24gZGVmYXVsdEVxdWFsaXR5Q2hlY2soYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVLZXlDb21wYXJhdG9yKGVxdWFsaXR5Q2hlY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsKHByZXYsIG5leHQpIHtcbiAgICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gRG8gdGhpcyBpbiBhIGZvciBsb29wIChhbmQgbm90IGEgYGZvckVhY2hgIG9yIGFuIGBldmVyeWApIHNvIHdlIGNhbiBkZXRlcm1pbmUgZXF1YWxpdHkgYXMgZmFzdCBhcyBwb3NzaWJsZS5cblxuXG4gICAgdmFyIGxlbmd0aCA9IHByZXYubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbGl0eUNoZWNrKHByZXZbaV0sIG5leHRbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbi8vIGRlZmF1bHRNZW1vaXplIG5vdyBzdXBwb3J0cyBhIGNvbmZpZ3VyYWJsZSBjYWNoZSBzaXplIHdpdGggTFJVIGJlaGF2aW9yLFxuLy8gYW5kIG9wdGlvbmFsIGNvbXBhcmlzb24gb2YgdGhlIHJlc3VsdCB2YWx1ZSB3aXRoIGV4aXN0aW5nIHZhbHVlc1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZW1vaXplKGZ1bmMsIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMpIHtcbiAgdmFyIHByb3ZpZGVkT3B0aW9ucyA9IHR5cGVvZiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zID09PSAnb2JqZWN0JyA/IGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgOiB7XG4gICAgZXF1YWxpdHlDaGVjazogZXF1YWxpdHlDaGVja09yT3B0aW9uc1xuICB9O1xuICB2YXIgX3Byb3ZpZGVkT3B0aW9ucyRlcXVhID0gcHJvdmlkZWRPcHRpb25zLmVxdWFsaXR5Q2hlY2ssXG4gICAgICBlcXVhbGl0eUNoZWNrID0gX3Byb3ZpZGVkT3B0aW9ucyRlcXVhID09PSB2b2lkIDAgPyBkZWZhdWx0RXF1YWxpdHlDaGVjayA6IF9wcm92aWRlZE9wdGlvbnMkZXF1YSxcbiAgICAgIF9wcm92aWRlZE9wdGlvbnMkbWF4UyA9IHByb3ZpZGVkT3B0aW9ucy5tYXhTaXplLFxuICAgICAgbWF4U2l6ZSA9IF9wcm92aWRlZE9wdGlvbnMkbWF4UyA9PT0gdm9pZCAwID8gMSA6IF9wcm92aWRlZE9wdGlvbnMkbWF4UyxcbiAgICAgIHJlc3VsdEVxdWFsaXR5Q2hlY2sgPSBwcm92aWRlZE9wdGlvbnMucmVzdWx0RXF1YWxpdHlDaGVjaztcbiAgdmFyIGNvbXBhcmF0b3IgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjayk7XG4gIHZhciBjYWNoZSA9IG1heFNpemUgPT09IDEgPyBjcmVhdGVTaW5nbGV0b25DYWNoZShjb21wYXJhdG9yKSA6IGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGNvbXBhcmF0b3IpOyAvLyB3ZSByZWZlcmVuY2UgYXJndW1lbnRzIGluc3RlYWQgb2Ygc3ByZWFkaW5nIHRoZW0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcblxuICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICB2YXIgdmFsdWUgPSBjYWNoZS5nZXQoYXJndW1lbnRzKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB2YWx1ZSA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBjYWNoZS5nZXRFbnRyaWVzKCk7XG4gICAgICAgIHZhciBtYXRjaGluZ0VudHJ5ID0gZW50cmllcy5maW5kKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRFcXVhbGl0eUNoZWNrKGVudHJ5LnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtYXRjaGluZ0VudHJ5KSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaGluZ0VudHJ5LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhY2hlLnB1dChhcmd1bWVudHMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWNoZS5jbGVhcigpO1xuICB9O1xuXG4gIHJldHVybiBtZW1vaXplZDtcbn0iLCJpbXBvcnQgeyBkZWZhdWx0TWVtb2l6ZSwgZGVmYXVsdEVxdWFsaXR5Q2hlY2sgfSBmcm9tICcuL2RlZmF1bHRNZW1vaXplJztcbmV4cG9ydCB7IGRlZmF1bHRNZW1vaXplLCBkZWZhdWx0RXF1YWxpdHlDaGVjayB9O1xuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoZnVuY3MpIHtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoZnVuY3NbMF0pID8gZnVuY3NbMF0gOiBmdW5jcztcblxuICBpZiAoIWRlcGVuZGVuY2llcy5ldmVyeShmdW5jdGlvbiAoZGVwKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkZXAgPT09ICdmdW5jdGlvbic7XG4gIH0pKSB7XG4gICAgdmFyIGRlcGVuZGVuY3lUeXBlcyA9IGRlcGVuZGVuY2llcy5tYXAoZnVuY3Rpb24gKGRlcCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBkZXAgPT09ICdmdW5jdGlvbicgPyBcImZ1bmN0aW9uIFwiICsgKGRlcC5uYW1lIHx8ICd1bm5hbWVkJykgKyBcIigpXCIgOiB0eXBlb2YgZGVwO1xuICAgIH0pLmpvaW4oJywgJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgYnV0IHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IFtcIiArIGRlcGVuZGVuY3lUeXBlcyArIFwiXVwiKTtcbiAgfVxuXG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvckNyZWF0b3IobWVtb2l6ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWVtb2l6ZU9wdGlvbnNGcm9tQXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWVtb2l6ZU9wdGlvbnNGcm9tQXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgY3JlYXRlU2VsZWN0b3IgPSBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvcigpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBmdW5jc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBfcmVjb21wdXRhdGlvbnMgPSAwO1xuXG4gICAgdmFyIF9sYXN0UmVzdWx0OyAvLyBEdWUgdG8gdGhlIGludHJpY2FjaWVzIG9mIHJlc3QgcGFyYW1zLCB3ZSBjYW4ndCBkbyBhbiBvcHRpb25hbCBhcmcgYWZ0ZXIgYC4uLmZ1bmNzYC5cbiAgICAvLyBTbywgc3RhcnQgYnkgZGVjbGFyaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuXG4gICAgLy8gKEFuZCB5ZXMsIHRoZSB3b3JkcyAnbWVtb2l6ZScgYW5kICdvcHRpb25zJyBhcHBlYXIgdG9vIG1hbnkgdGltZXMgaW4gdGhpcyBuZXh0IHNlcXVlbmNlLilcblxuXG4gICAgdmFyIGRpcmVjdGx5UGFzc2VkT3B0aW9ucyA9IHtcbiAgICAgIG1lbW9pemVPcHRpb25zOiB1bmRlZmluZWRcbiAgICB9OyAvLyBOb3JtYWxseSwgdGhlIHJlc3VsdCBmdW5jIG9yIFwib3V0cHV0IHNlbGVjdG9yXCIgaXMgdGhlIGxhc3QgYXJnXG5cbiAgICB2YXIgcmVzdWx0RnVuYyA9IGZ1bmNzLnBvcCgpOyAvLyBJZiB0aGUgcmVzdWx0IGZ1bmMgaXMgYWN0dWFsbHkgYW4gX29iamVjdF8sIGFzc3VtZSBpdCdzIG91ciBvcHRpb25zIG9iamVjdFxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHRGdW5jID09PSAnb2JqZWN0Jykge1xuICAgICAgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0gcmVzdWx0RnVuYzsgLy8gYW5kIHBvcCB0aGUgcmVhbCByZXN1bHQgZnVuYyBvZmZcblxuICAgICAgcmVzdWx0RnVuYyA9IGZ1bmNzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0RnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbiBvdXRwdXQgZnVuY3Rpb24gYWZ0ZXIgdGhlIGlucHV0cywgYnV0IHJlY2VpdmVkOiBbXCIgKyB0eXBlb2YgcmVzdWx0RnVuYyArIFwiXVwiKTtcbiAgICB9IC8vIERldGVybWluZSB3aGljaCBzZXQgb2Ygb3B0aW9ucyB3ZSdyZSB1c2luZy4gUHJlZmVyIG9wdGlvbnMgcGFzc2VkIGRpcmVjdGx5LFxuICAgIC8vIGJ1dCBmYWxsIGJhY2sgdG8gb3B0aW9ucyBnaXZlbiB0byBjcmVhdGVTZWxlY3RvckNyZWF0b3IuXG5cblxuICAgIHZhciBfZGlyZWN0bHlQYXNzZWRPcHRpb24gPSBkaXJlY3RseVBhc3NlZE9wdGlvbnMsXG4gICAgICAgIF9kaXJlY3RseVBhc3NlZE9wdGlvbjIgPSBfZGlyZWN0bHlQYXNzZWRPcHRpb24ubWVtb2l6ZU9wdGlvbnMsXG4gICAgICAgIG1lbW9pemVPcHRpb25zID0gX2RpcmVjdGx5UGFzc2VkT3B0aW9uMiA9PT0gdm9pZCAwID8gbWVtb2l6ZU9wdGlvbnNGcm9tQXJncyA6IF9kaXJlY3RseVBhc3NlZE9wdGlvbjI7IC8vIFNpbXBsaWZ5aW5nIGFzc3VtcHRpb246IGl0J3MgdW5saWtlbHkgdGhhdCB0aGUgZmlyc3Qgb3B0aW9ucyBhcmcgb2YgdGhlIHByb3ZpZGVkIG1lbW9pemVyXG4gICAgLy8gaXMgYW4gYXJyYXkuIEluIG1vc3QgbGlicyBJJ3ZlIGxvb2tlZCBhdCwgaXQncyBhbiBlcXVhbGl0eSBmdW5jdGlvbiBvciBvcHRpb25zIG9iamVjdC5cbiAgICAvLyBCYXNlZCBvbiB0aGF0LCBpZiBgbWVtb2l6ZU9wdGlvbnNgIF9pc18gYW4gYXJyYXksIHdlIGFzc3VtZSBpdCdzIGEgZnVsbFxuICAgIC8vIHVzZXItcHJvdmlkZWQgYXJyYXkgb2Ygb3B0aW9ucy4gT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGp1c3QgdGhlIF9maXJzdF8gYXJnLCBhbmQgc29cbiAgICAvLyB3ZSB3cmFwIGl0IGluIGFuIGFycmF5IHNvIHdlIGNhbiBhcHBseSBpdC5cblxuICAgIHZhciBmaW5hbE1lbW9pemVPcHRpb25zID0gQXJyYXkuaXNBcnJheShtZW1vaXplT3B0aW9ucykgPyBtZW1vaXplT3B0aW9ucyA6IFttZW1vaXplT3B0aW9uc107XG4gICAgdmFyIGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhmdW5jcyk7XG4gICAgdmFyIG1lbW9pemVkUmVzdWx0RnVuYyA9IG1lbW9pemUuYXBwbHkodm9pZCAwLCBbZnVuY3Rpb24gKCkge1xuICAgICAgX3JlY29tcHV0YXRpb25zKys7IC8vIGFwcGx5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIHNwcmVhZGluZyBmb3IgcGVyZm9ybWFuY2UuXG5cbiAgICAgIHJldHVybiByZXN1bHRGdW5jLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfV0uY29uY2F0KGZpbmFsTWVtb2l6ZU9wdGlvbnMpKTsgLy8gSWYgYSBzZWxlY3RvciBpcyBjYWxsZWQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBhcmd1bWVudHMgd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSBvdXIgZGVwZW5kZW5jaWVzIGFnYWluLlxuXG4gICAgdmFyIHNlbGVjdG9yID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICB2YXIgbGVuZ3RoID0gZGVwZW5kZW5jaWVzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBhcHBseSBhcmd1bWVudHMgaW5zdGVhZCBvZiBzcHJlYWRpbmcgYW5kIG11dGF0ZSBhIGxvY2FsIGxpc3Qgb2YgcGFyYW1zIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBwYXJhbXMucHVzaChkZXBlbmRlbmNpZXNbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICB9IC8vIGFwcGx5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIHNwcmVhZGluZyBmb3IgcGVyZm9ybWFuY2UuXG5cblxuICAgICAgX2xhc3RSZXN1bHQgPSBtZW1vaXplZFJlc3VsdEZ1bmMuYXBwbHkobnVsbCwgcGFyYW1zKTtcbiAgICAgIHJldHVybiBfbGFzdFJlc3VsdDtcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHNlbGVjdG9yLCB7XG4gICAgICByZXN1bHRGdW5jOiByZXN1bHRGdW5jLFxuICAgICAgbWVtb2l6ZWRSZXN1bHRGdW5jOiBtZW1vaXplZFJlc3VsdEZ1bmMsXG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcyxcbiAgICAgIGxhc3RSZXN1bHQ6IGZ1bmN0aW9uIGxhc3RSZXN1bHQoKSB7XG4gICAgICAgIHJldHVybiBfbGFzdFJlc3VsdDtcbiAgICAgIH0sXG4gICAgICByZWNvbXB1dGF0aW9uczogZnVuY3Rpb24gcmVjb21wdXRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfcmVjb21wdXRhdGlvbnM7XG4gICAgICB9LFxuICAgICAgcmVzZXRSZWNvbXB1dGF0aW9uczogZnVuY3Rpb24gcmVzZXRSZWNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9yZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9OyAvLyBAdHMtaWdub3JlXG5cblxuICByZXR1cm4gY3JlYXRlU2VsZWN0b3I7XG59XG5leHBvcnQgdmFyIGNyZWF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY3JlYXRlU2VsZWN0b3JDcmVhdG9yKGRlZmF1bHRNZW1vaXplKTtcbi8vIE1hbnVhbCBkZWZpbml0aW9uIG9mIHN0YXRlIGFuZCBvdXRwdXQgYXJndW1lbnRzXG5leHBvcnQgdmFyIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciA9IGZ1bmN0aW9uIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvcihzZWxlY3RvcnMsIHNlbGVjdG9yQ3JlYXRvcikge1xuICBpZiAoc2VsZWN0b3JDcmVhdG9yID09PSB2b2lkIDApIHtcbiAgICBzZWxlY3RvckNyZWF0b3IgPSBjcmVhdGVTZWxlY3RvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3JzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIGV4cGVjdHMgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0ICcgKyAoXCJ3aGVyZSBlYWNoIHByb3BlcnR5IGlzIGEgc2VsZWN0b3IsIGluc3RlYWQgcmVjZWl2ZWQgYSBcIiArIHR5cGVvZiBzZWxlY3RvcnMpKTtcbiAgfVxuXG4gIHZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0b3JzKTtcbiAgdmFyIHJlc3VsdFNlbGVjdG9yID0gc2VsZWN0b3JDcmVhdG9yKCAvLyBAdHMtaWdub3JlXG4gIG9iamVjdEtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gc2VsZWN0b3JzW2tleV07XG4gIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIHZhbHVlc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKGZ1bmN0aW9uIChjb21wb3NpdGlvbiwgdmFsdWUsIGluZGV4KSB7XG4gICAgICBjb21wb3NpdGlvbltvYmplY3RLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBjb21wb3NpdGlvbjtcbiAgICB9LCB7fSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0U2VsZWN0b3I7XG59OyIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgREVGQVVMVF9USFJFQURfSUQgPSAwOyAvLyBDb3VudGVycyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuXG5cbnZhciBpbnRlcmFjdGlvbklEQ291bnRlciA9IDA7XG52YXIgdGhyZWFkSURDb3VudGVyID0gMDsgLy8gU2V0IG9mIGN1cnJlbnRseSB0cmFjZWQgaW50ZXJhY3Rpb25zLlxuLy8gSW50ZXJhY3Rpb25zIFwic3RhY2tcIuKAk1xuLy8gTWVhbmluZyB0aGF0IG5ld2x5IHRyYWNlZCBpbnRlcmFjdGlvbnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBzZXQuXG4vLyBXaGVuIGFuIGludGVyYWN0aW9uIGdvZXMgb3V0IG9mIHNjb3BlLCB0aGUgcHJldmlvdXMgc2V0IChpZiBhbnkpIGlzIHJlc3RvcmVkLlxuXG5leHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmID0gbnVsbDsgLy8gTGlzdGVuZXIocykgdG8gbm90aWZ5IHdoZW4gaW50ZXJhY3Rpb25zIGJlZ2luIGFuZCBlbmQuXG5cbmV4cG9ydHMuX19zdWJzY3JpYmVyUmVmID0gbnVsbDtcblxue1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmID0ge1xuICAgIGN1cnJlbnQ6IG5ldyBTZXQoKVxuICB9O1xuICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZiA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9jbGVhcihjYWxsYmFjaykge1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBuZXcgU2V0KCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50KCkge1xuICB7XG4gICAgcmV0dXJuIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0VGhyZWFkSUQoKSB7XG4gIHJldHVybiArK3RocmVhZElEQ291bnRlcjtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3RyYWNlKG5hbWUsIHRpbWVzdGFtcCwgY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgX19jb3VudDogMSxcbiAgICBpZDogaW50ZXJhY3Rpb25JRENvdW50ZXIrKyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHRpbWVzdGFtcDogdGltZXN0YW1wXG4gIH07XG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50OyAvLyBUcmFjZWQgaW50ZXJhY3Rpb25zIHNob3VsZCBzdGFjay9hY2N1bXVsYXRlLlxuICAvLyBUbyBkbyB0aGF0LCBjbG9uZSB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gIC8vIFRoZSBwcmV2aW91cyBzZXQgd2lsbCBiZSByZXN0b3JlZCB1cG9uIGNvbXBsZXRpb24uXG5cbiAgdmFyIGludGVyYWN0aW9ucyA9IG5ldyBTZXQocHJldkludGVyYWN0aW9ucyk7XG4gIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBpbnRlcmFjdGlvbnM7XG4gIHZhciBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcbiAgdmFyIHJldHVyblZhbHVlO1xuXG4gIHRyeSB7XG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbik7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07IC8vIElmIG5vIGFzeW5jIHdvcmsgd2FzIHNjaGVkdWxlZCBmb3IgdGhpcyBpbnRlcmFjdGlvbixcbiAgICAgICAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBpdCdzIGNvbXBsZXRlZC5cblxuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsICYmIGludGVyYWN0aW9uLl9fY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXAoY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICB2YXIgd3JhcHBlZEludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgdmFyIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICB9IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gIC8vIFVwZGF0ZSBhZnRlciBjYWxsaW5nIHN1YnNjcmliZXJzIGluIGNhc2Ugb2YgZXJyb3IuXG5cblxuICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgaW50ZXJhY3Rpb24uX19jb3VudCsrO1xuICB9KTtcbiAgdmFyIGhhc1J1biA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWQoKSB7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gd3JhcHBlZEludGVyYWN0aW9ucztcbiAgICBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZCh3cmFwcGVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCFoYXNSdW4pIHtcbiAgICAgICAgLy8gV2Ugb25seSBleHBlY3QgYSB3cmFwcGVkIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uY2UsXG4gICAgICAgIC8vIEJ1dCBpbiB0aGUgZXZlbnQgdGhhdCBpdCdzIGV4ZWN1dGVkIG1vcmUgdGhhbiBvbmNl4oCTXG4gICAgICAgIC8vIE9ubHkgZGVjcmVtZW50IHRoZSBvdXRzdGFuZGluZyBpbnRlcmFjdGlvbiBjb3VudHMgb25jZS5cbiAgICAgICAgaGFzUnVuID0gdHJ1ZTsgLy8gVXBkYXRlIHBlbmRpbmcgYXN5bmMgY291bnRzIGZvciBhbGwgd3JhcHBlZCBpbnRlcmFjdGlvbnMuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IHNjaGVkdWxlZCBhc3luYyB3b3JrIGZvciBhbnkgb2YgdGhlbSxcbiAgICAgICAgLy8gTWFyayB0aGVtIGFzIGNvbXBsZXRlZC5cblxuICAgICAgICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3cmFwcGVkLmNhbmNlbCA9IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBzdWJzY3JpYmVyLm9uV29ya0NhbmNlbGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gVXBkYXRlIHBlbmRpbmcgYXN5bmMgY291bnRzIGZvciBhbGwgd3JhcHBlZCBpbnRlcmFjdGlvbnMuXG4gICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBzY2hlZHVsZWQgYXN5bmMgd29yayBmb3IgYW55IG9mIHRoZW0sXG4gICAgICAvLyBNYXJrIHRoZW0gYXMgY29tcGxldGVkLlxuICAgICAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07XG5cbiAgICAgICAgaWYgKHN1YnNjcmliZXIgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbnZhciBzdWJzY3JpYmVycyA9IG51bGw7XG5cbntcbiAgc3Vic2NyaWJlcnMgPSBuZXcgU2V0KCk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7XG4gIHtcbiAgICBzdWJzY3JpYmVycy5hZGQoc3Vic2NyaWJlcik7XG5cbiAgICBpZiAoc3Vic2NyaWJlcnMuc2l6ZSA9PT0gMSkge1xuICAgICAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudCA9IHtcbiAgICAgICAgb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQ6IG9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkLFxuICAgICAgICBvbkludGVyYWN0aW9uVHJhY2VkOiBvbkludGVyYWN0aW9uVHJhY2VkLFxuICAgICAgICBvbldvcmtDYW5jZWxlZDogb25Xb3JrQ2FuY2VsZWQsXG4gICAgICAgIG9uV29ya1NjaGVkdWxlZDogb25Xb3JrU2NoZWR1bGVkLFxuICAgICAgICBvbldvcmtTdGFydGVkOiBvbldvcmtTdGFydGVkLFxuICAgICAgICBvbldvcmtTdG9wcGVkOiBvbldvcmtTdG9wcGVkXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5zdGFibGVfdW5zdWJzY3JpYmUoc3Vic2NyaWJlcikge1xuICB7XG4gICAgc3Vic2NyaWJlcnMuZGVsZXRlKHN1YnNjcmliZXIpO1xuXG4gICAgaWYgKHN1YnNjcmliZXJzLnNpemUgPT09IDApIHtcbiAgICAgIGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbikge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCkge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5leHBvcnRzLnVuc3RhYmxlX2NsZWFyID0gdW5zdGFibGVfY2xlYXI7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnQgPSB1bnN0YWJsZV9nZXRDdXJyZW50O1xuZXhwb3J0cy51bnN0YWJsZV9nZXRUaHJlYWRJRCA9IHVuc3RhYmxlX2dldFRocmVhZElEO1xuZXhwb3J0cy51bnN0YWJsZV9zdWJzY3JpYmUgPSB1bnN0YWJsZV9zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3RyYWNlID0gdW5zdGFibGVfdHJhY2U7XG5leHBvcnRzLnVuc3RhYmxlX3Vuc3Vic2NyaWJlID0gdW5zdGFibGVfdW5zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXAgPSB1bnN0YWJsZV93cmFwO1xuICB9KSgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjIwLjJcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcblxudmFyIHJlcXVlc3RIb3N0Q2FsbGJhY2s7XG52YXIgcmVxdWVzdEhvc3RUaW1lb3V0O1xudmFyIGNhbmNlbEhvc3RUaW1lb3V0O1xudmFyIHJlcXVlc3RQYWludDtcbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn1cblxuaWYgKCAvLyBJZiBTY2hlZHVsZXIgcnVucyBpbiBhIG5vbi1ET00gZW52aXJvbm1lbnQsIGl0IGZhbGxzIGJhY2sgdG8gYSBuYWl2ZVxuLy8gaW1wbGVtZW50YXRpb24gdXNpbmcgc2V0VGltZW91dC5cbnR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IC8vIENoZWNrIGlmIE1lc3NhZ2VDaGFubmVsIGlzIHN1cHBvcnRlZCwgdG9vLlxudHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAnZnVuY3Rpb24nKSB7XG4gIC8vIElmIHRoaXMgYWNjaWRlbnRhbGx5IGdldHMgaW1wb3J0ZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCwgZS5nLiBKYXZhU2NyaXB0Q29yZSxcbiAgLy8gZmFsbGJhY2sgdG8gYSBuYWl2ZSBpbXBsZW1lbnRhdGlvbi5cbiAgdmFyIF9jYWxsYmFjayA9IG51bGw7XG4gIHZhciBfdGltZW91dElEID0gbnVsbDtcblxuICB2YXIgX2ZsdXNoQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF9jYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgdmFyIGhhc1JlbWFpbmluZ1RpbWUgPSB0cnVlO1xuXG4gICAgICAgIF9jYWxsYmFjayhoYXNSZW1haW5pbmdUaW1lLCBjdXJyZW50VGltZSk7XG5cbiAgICAgICAgX2NhbGxiYWNrID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2V0VGltZW91dChfZmx1c2hDYWxsYmFjaywgMCk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJlcXVlc3RIb3N0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICBpZiAoX2NhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAvLyBQcm90ZWN0IGFnYWluc3QgcmUtZW50cmFuY3kuXG4gICAgICBzZXRUaW1lb3V0KHJlcXVlc3RIb3N0Q2FsbGJhY2ssIDAsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NhbGxiYWNrID0gY2I7XG4gICAgICBzZXRUaW1lb3V0KF9mbHVzaENhbGxiYWNrLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgcmVxdWVzdEhvc3RUaW1lb3V0ID0gZnVuY3Rpb24gKGNiLCBtcykge1xuICAgIF90aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGNiLCBtcyk7XG4gIH07XG5cbiAgY2FuY2VsSG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KF90aW1lb3V0SUQpO1xuICB9O1xuXG4gIGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJlcXVlc3RQYWludCA9IGV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmdW5jdGlvbiAoKSB7fTtcbn0gZWxzZSB7XG4gIC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuICB2YXIgX3NldFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dDtcbiAgdmFyIF9jbGVhclRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0O1xuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBUT0RPOiBTY2hlZHVsZXIgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoZXNlIG1ldGhvZHMgdG8gYmUgcG9seWZpbGxlZC4gQnV0XG4gICAgLy8gbWF5YmUgd2Ugd2FudCB0byBjb250aW51ZSB3YXJuaW5nIGlmIHRoZXkgZG9uJ3QgZXhpc3QsIHRvIHByZXNlcnZlIHRoZVxuICAgIC8vIG9wdGlvbiB0byByZWx5IG9uIGl0IGluIHRoZSBmdXR1cmU/XG4gICAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgICAgY29uc29sZVsnZXJyb3InXShcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBcIiArICdNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbEFuaW1hdGlvbkZyYW1lLiBcIiArICdNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgdmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gIHZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuICAvLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4gIC8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4gIC8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbiAgdmFyIHlpZWxkSW50ZXJ2YWwgPSA1O1xuICB2YXIgZGVhZGxpbmUgPSAwOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5cbiAge1xuICAgIC8vIGBpc0lucHV0UGVuZGluZ2AgaXMgbm90IGF2YWlsYWJsZS4gU2luY2Ugd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZlxuICAgIC8vIHRoZXJlJ3MgcGVuZGluZyBpbnB1dCwgYWx3YXlzIHlpZWxkIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLlxuICAgIGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKSA+PSBkZWFkbGluZTtcbiAgICB9OyAvLyBTaW5jZSB3ZSB5aWVsZCBldmVyeSBmcmFtZSByZWdhcmRsZXNzLCBgcmVxdWVzdFBhaW50YCBoYXMgbm8gZWZmZWN0LlxuXG5cbiAgICByZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuXG4gIGV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmdW5jdGlvbiAoZnBzKSB7XG4gICAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZwcyA+IDApIHtcbiAgICAgIHlpZWxkSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgICB5aWVsZEludGVydmFsID0gNTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBZaWVsZCBhZnRlciBgeWllbGRJbnRlcnZhbGAgbXMsIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSB2c3luY1xuICAgICAgLy8gY3ljbGUuIFRoaXMgbWVhbnMgdGhlcmUncyBhbHdheXMgdGltZSByZW1haW5pbmcgYXQgdGhlIGJlZ2lubmluZyBvZlxuICAgICAgLy8gdGhlIG1lc3NhZ2UgZXZlbnQuXG5cbiAgICAgIGRlYWRsaW5lID0gY3VycmVudFRpbWUgKyB5aWVsZEludGVydmFsO1xuICAgICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuXG4gICAgICAgIGlmICghaGFzTW9yZVdvcmspIHtcbiAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAgICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG4gIH07XG5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIG1zKSB7XG4gICAgdGFza1RpbWVvdXRJRCA9IF9zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICAgIH0sIG1zKTtcbiAgfTtcblxuICBjYW5jZWxIb3N0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfY2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuXG4gICAgdGFza1RpbWVvdXRJRCA9IC0xO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICByZXR1cm4gZmlyc3QgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBmaXJzdDtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG5cbiAgaWYgKGZpcnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAobGVmdCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jeS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci10cmFjaW5nLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxuLy8gcHJvdG90eXBlIGNsYXNzIGZvciBoYXNoIGZ1bmN0aW9uc1xuZnVuY3Rpb24gSGFzaCAoYmxvY2tTaXplLCBmaW5hbFNpemUpIHtcbiAgdGhpcy5fYmxvY2sgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplKVxuICB0aGlzLl9maW5hbFNpemUgPSBmaW5hbFNpemVcbiAgdGhpcy5fYmxvY2tTaXplID0gYmxvY2tTaXplXG4gIHRoaXMuX2xlbiA9IDBcbn1cblxuSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gZW5jIHx8ICd1dGY4J1xuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBlbmMpXG4gIH1cblxuICB2YXIgYmxvY2sgPSB0aGlzLl9ibG9ja1xuICB2YXIgYmxvY2tTaXplID0gdGhpcy5fYmxvY2tTaXplXG4gIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aFxuICB2YXIgYWNjdW0gPSB0aGlzLl9sZW5cblxuICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7KSB7XG4gICAgdmFyIGFzc2lnbmVkID0gYWNjdW0gJSBibG9ja1NpemVcbiAgICB2YXIgcmVtYWluZGVyID0gTWF0aC5taW4obGVuZ3RoIC0gb2Zmc2V0LCBibG9ja1NpemUgLSBhc3NpZ25lZClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtYWluZGVyOyBpKyspIHtcbiAgICAgIGJsb2NrW2Fzc2lnbmVkICsgaV0gPSBkYXRhW29mZnNldCArIGldXG4gICAgfVxuXG4gICAgYWNjdW0gKz0gcmVtYWluZGVyXG4gICAgb2Zmc2V0ICs9IHJlbWFpbmRlclxuXG4gICAgaWYgKChhY2N1bSAlIGJsb2NrU2l6ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShibG9jaylcbiAgICB9XG4gIH1cblxuICB0aGlzLl9sZW4gKz0gbGVuZ3RoXG4gIHJldHVybiB0aGlzXG59XG5cbkhhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdmFyIHJlbSA9IHRoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZVxuXG4gIHRoaXMuX2Jsb2NrW3JlbV0gPSAweDgwXG5cbiAgLy8gemVybyAocmVtICsgMSkgdHJhaWxpbmcgYml0cywgd2hlcmUgKHJlbSArIDEpIGlzIHRoZSBzbWFsbGVzdFxuICAvLyBub24tbmVnYXRpdmUgc29sdXRpb24gdG8gdGhlIGVxdWF0aW9uIChsZW5ndGggKyAxICsgKHJlbSArIDEpKSA9PT0gZmluYWxTaXplIG1vZCBibG9ja1NpemVcbiAgdGhpcy5fYmxvY2suZmlsbCgwLCByZW0gKyAxKVxuXG4gIGlmIChyZW0gPj0gdGhpcy5fZmluYWxTaXplKSB7XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKVxuICAgIHRoaXMuX2Jsb2NrLmZpbGwoMClcbiAgfVxuXG4gIHZhciBiaXRzID0gdGhpcy5fbGVuICogOFxuXG4gIC8vIHVpbnQzMlxuICBpZiAoYml0cyA8PSAweGZmZmZmZmZmKSB7XG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShiaXRzLCB0aGlzLl9ibG9ja1NpemUgLSA0KVxuXG4gIC8vIHVpbnQ2NFxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dCaXRzID0gKGJpdHMgJiAweGZmZmZmZmZmKSA+Pj4gMFxuICAgIHZhciBoaWdoQml0cyA9IChiaXRzIC0gbG93Qml0cykgLyAweDEwMDAwMDAwMFxuXG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShoaWdoQml0cywgdGhpcy5fYmxvY2tTaXplIC0gOClcbiAgICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGxvd0JpdHMsIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpXG4gIH1cblxuICB0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaCgpXG5cbiAgcmV0dXJuIGVuYyA/IGhhc2gudG9TdHJpbmcoZW5jKSA6IGhhc2hcbn1cblxuSGFzaC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hcbiIsInZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBTSEEgKGFsZ29yaXRobSkge1xuICBhbGdvcml0aG0gPSBhbGdvcml0aG0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBBbGdvcml0aG0gPSBleHBvcnRzW2FsZ29yaXRobV1cbiAgaWYgKCFBbGdvcml0aG0pIHRocm93IG5ldyBFcnJvcihhbGdvcml0aG0gKyAnIGlzIG5vdCBzdXBwb3J0ZWQgKHdlIGFjY2VwdCBwdWxsIHJlcXVlc3RzKScpXG5cbiAgcmV0dXJuIG5ldyBBbGdvcml0aG0oKVxufVxuXG5leHBvcnRzLnNoYSA9IHJlcXVpcmUoJy4vc2hhJylcbmV4cG9ydHMuc2hhMSA9IHJlcXVpcmUoJy4vc2hhMScpXG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhMjI0JylcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEyNTYnKVxuZXhwb3J0cy5zaGEzODQgPSByZXF1aXJlKCcuL3NoYTM4NCcpXG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTAsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzaGExLmpzIG9mIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNIQS0wIGFuZCBTSEEtMSBpcyBqdXN0IGEgYml0d2lzZSByb3RhdGUgbGVmdFxuICogb3BlcmF0aW9uIHdhcyBhZGRlZC5cbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMgfCAwLCAweGNhNjJjMWQ2IHwgMFxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg4MClcblxuZnVuY3Rpb24gU2hhICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEsIEhhc2gpXG5cblNoYS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYSA9IDB4Njc0NTIzMDFcbiAgdGhpcy5fYiA9IDB4ZWZjZGFiODlcbiAgdGhpcy5fYyA9IDB4OThiYWRjZmVcbiAgdGhpcy5fZCA9IDB4MTAzMjU0NzZcbiAgdGhpcy5fZSA9IDB4YzNkMmUxZjBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYSA9IHRoaXMuX2EgfCAwXG4gIHZhciBiID0gdGhpcy5fYiB8IDBcbiAgdmFyIGMgPSB0aGlzLl9jIHwgMFxuICB2YXIgZCA9IHRoaXMuX2QgfCAwXG4gIHZhciBlID0gdGhpcy5fZSB8IDBcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIFdbaV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0KVxuICBmb3IgKDsgaSA8IDgwOyArK2kpIFdbaV0gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjApXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSB8IDAsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IgfCAwLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jIHwgMCwgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCB8IDAsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lIHwgMCwgMTYpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGFcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTEsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBWZXJzaW9uIDIuMWEgQ29weXJpZ2h0IFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDIuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBkZXRhaWxzLlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgSyA9IFtcbiAgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYyB8IDAsIDB4Y2E2MmMxZDYgfCAwXG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDgwKVxuXG5mdW5jdGlvbiBTaGExICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGExLCBIYXNoKVxuXG5TaGExLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2NzQ1MjMwMVxuICB0aGlzLl9iID0gMHhlZmNkYWI4OVxuICB0aGlzLl9jID0gMHg5OGJhZGNmZVxuICB0aGlzLl9kID0gMHgxMDMyNTQ3NlxuICB0aGlzLl9lID0gMHhjM2QyZTFmMFxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIHJvdGwxIChudW0pIHtcbiAgcmV0dXJuIChudW0gPDwgMSkgfCAobnVtID4+PiAzMSlcbn1cblxuZnVuY3Rpb24gcm90bDUgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCA1KSB8IChudW0gPj4+IDI3KVxufVxuXG5mdW5jdGlvbiByb3RsMzAgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAzMCkgfCAobnVtID4+PiAyKVxufVxuXG5mdW5jdGlvbiBmdCAocywgYiwgYywgZCkge1xuICBpZiAocyA9PT0gMCkgcmV0dXJuIChiICYgYykgfCAoKH5iKSAmIGQpXG4gIGlmIChzID09PSAyKSByZXR1cm4gKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpXG4gIHJldHVybiBiIF4gYyBeIGRcbn1cblxuU2hhMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhID0gdGhpcy5fYSB8IDBcbiAgdmFyIGIgPSB0aGlzLl9iIHwgMFxuICB2YXIgYyA9IHRoaXMuX2MgfCAwXG4gIHZhciBkID0gdGhpcy5fZCB8IDBcbiAgdmFyIGUgPSB0aGlzLl9lIHwgMFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gIGZvciAoOyBpIDwgODA7ICsraSkgV1tpXSA9IHJvdGwxKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0pXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhMS5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMVxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTIyNCAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTIyNCwgU2hhMjU2KVxuXG5TaGEyMjQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2IgPSAweDM2N2NkNTA3XG4gIHRoaXMuX2MgPSAweDMwNzBkZDE3XG4gIHRoaXMuX2QgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2UgPSAweGZmYzAwYjMxXG4gIHRoaXMuX2YgPSAweDY4NTgxNTExXG4gIHRoaXMuX2cgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2ggPSAweGJlZmE0ZmE0XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuU2hhMjI0LnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjgpXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSwgMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYiwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYywgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCwgMTIpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2UsIDE2KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9mLCAyMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZywgMjQpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyMjRcbiIsIi8qKlxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0sIFNIQS0yNTYsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgMTgwLTJcbiAqIFZlcnNpb24gMi4yLWJldGEgQ29weXJpZ2h0IEFuZ2VsIE1hcmluLCBQYXVsIEpvaG5zdG9uIDIwMDAgLSAyMDA5LlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICpcbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NDI4QTJGOTgsIDB4NzEzNzQ0OTEsIDB4QjVDMEZCQ0YsIDB4RTlCNURCQTUsXG4gIDB4Mzk1NkMyNUIsIDB4NTlGMTExRjEsIDB4OTIzRjgyQTQsIDB4QUIxQzVFRDUsXG4gIDB4RDgwN0FBOTgsIDB4MTI4MzVCMDEsIDB4MjQzMTg1QkUsIDB4NTUwQzdEQzMsXG4gIDB4NzJCRTVENzQsIDB4ODBERUIxRkUsIDB4OUJEQzA2QTcsIDB4QzE5QkYxNzQsXG4gIDB4RTQ5QjY5QzEsIDB4RUZCRTQ3ODYsIDB4MEZDMTlEQzYsIDB4MjQwQ0ExQ0MsXG4gIDB4MkRFOTJDNkYsIDB4NEE3NDg0QUEsIDB4NUNCMEE5REMsIDB4NzZGOTg4REEsXG4gIDB4OTgzRTUxNTIsIDB4QTgzMUM2NkQsIDB4QjAwMzI3QzgsIDB4QkY1OTdGQzcsXG4gIDB4QzZFMDBCRjMsIDB4RDVBNzkxNDcsIDB4MDZDQTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdCNzBBODUsIDB4MkUxQjIxMzgsIDB4NEQyQzZERkMsIDB4NTMzODBEMTMsXG4gIDB4NjUwQTczNTQsIDB4NzY2QTBBQkIsIDB4ODFDMkM5MkUsIDB4OTI3MjJDODUsXG4gIDB4QTJCRkU4QTEsIDB4QTgxQTY2NEIsIDB4QzI0QjhCNzAsIDB4Qzc2QzUxQTMsXG4gIDB4RDE5MkU4MTksIDB4RDY5OTA2MjQsIDB4RjQwRTM1ODUsIDB4MTA2QUEwNzAsXG4gIDB4MTlBNEMxMTYsIDB4MUUzNzZDMDgsIDB4Mjc0ODc3NEMsIDB4MzRCMEJDQjUsXG4gIDB4MzkxQzBDQjMsIDB4NEVEOEFBNEEsIDB4NUI5Q0NBNEYsIDB4NjgyRTZGRjMsXG4gIDB4NzQ4RjgyRUUsIDB4NzhBNTYzNkYsIDB4ODRDODc4MTQsIDB4OENDNzAyMDgsXG4gIDB4OTBCRUZGRkEsIDB4QTQ1MDZDRUIsIDB4QkVGOUEzRjcsIDB4QzY3MTc4RjJcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTI1NiAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTI1NiwgSGFzaClcblxuU2hhMjU2LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2YTA5ZTY2N1xuICB0aGlzLl9iID0gMHhiYjY3YWU4NVxuICB0aGlzLl9jID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kID0gMHhhNTRmZjUzYVxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZlxuICB0aGlzLl9mID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9nID0gMHgxZjgzZDlhYlxuICB0aGlzLl9oID0gMHg1YmUwY2QxOVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGNoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDIgfCB4IDw8IDMwKSBeICh4ID4+PiAxMyB8IHggPDwgMTkpIF4gKHggPj4+IDIyIHwgeCA8PCAxMClcbn1cblxuZnVuY3Rpb24gc2lnbWExICh4KSB7XG4gIHJldHVybiAoeCA+Pj4gNiB8IHggPDwgMjYpIF4gKHggPj4+IDExIHwgeCA8PCAyMSkgXiAoeCA+Pj4gMjUgfCB4IDw8IDcpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDcgfCB4IDw8IDI1KSBeICh4ID4+PiAxOCB8IHggPDwgMTQpIF4gKHggPj4+IDMpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDE3IHwgeCA8PCAxNSkgXiAoeCA+Pj4gMTkgfCB4IDw8IDEzKSBeICh4ID4+PiAxMClcbn1cblxuU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG4gIHZhciBmID0gdGhpcy5fZiB8IDBcbiAgdmFyIGcgPSB0aGlzLl9nIHwgMFxuICB2YXIgaCA9IHRoaXMuX2ggfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA2NDsgKytpKSBXW2ldID0gKGdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIGdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdKSB8IDBcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICB2YXIgVDEgPSAoaCArIHNpZ21hMShlKSArIGNoKGUsIGYsIGcpICsgS1tqXSArIFdbal0pIHwgMFxuICAgIHZhciBUMiA9IChzaWdtYTAoYSkgKyBtYWooYSwgYiwgYykpIHwgMFxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IChkICsgVDEpIHwgMFxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSAoVDEgKyBUMikgfCAwXG4gIH1cblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDMyKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IsIDQpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lLCAxNilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2csIDI0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9oLCAyOClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTI1NlxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIFNIQTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgVyA9IG5ldyBBcnJheSgxNjApXG5cbmZ1bmN0aW9uIFNoYTM4NCAoKSB7XG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMuX3cgPSBXXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDEyOCwgMTEyKVxufVxuXG5pbmhlcml0cyhTaGEzODQsIFNIQTUxMilcblxuU2hhMzg0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4Y2JiYjlkNWRcbiAgdGhpcy5fYmggPSAweDYyOWEyOTJhXG4gIHRoaXMuX2NoID0gMHg5MTU5MDE1YVxuICB0aGlzLl9kaCA9IDB4MTUyZmVjZDhcbiAgdGhpcy5fZWggPSAweDY3MzMyNjY3XG4gIHRoaXMuX2ZoID0gMHg4ZWI0NGE4N1xuICB0aGlzLl9naCA9IDB4ZGIwYzJlMGRcbiAgdGhpcy5faGggPSAweDQ3YjU0ODFkXG5cbiAgdGhpcy5fYWwgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2JsID0gMHgzNjdjZDUwN1xuICB0aGlzLl9jbCA9IDB4MzA3MGRkMTdcbiAgdGhpcy5fZGwgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2VsID0gMHhmZmMwMGIzMVxuICB0aGlzLl9mbCA9IDB4Njg1ODE1MTFcbiAgdGhpcy5fZ2wgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2hsID0gMHhiZWZhNGZhNFxuXG4gIHJldHVybiB0aGlzXG59XG5cblNoYTM4NC5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQ4KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYWgsIHRoaXMuX2FsLCAwKVxuICB3cml0ZUludDY0QkUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLCB0aGlzLl9kbCwgMjQpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTM4NFxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBLID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhNTEyICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTUxMiwgSGFzaClcblxuU2hhNTEyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4NmEwOWU2NjdcbiAgdGhpcy5fYmggPSAweGJiNjdhZTg1XG4gIHRoaXMuX2NoID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kaCA9IDB4YTU0ZmY1M2FcbiAgdGhpcy5fZWggPSAweDUxMGU1MjdmXG4gIHRoaXMuX2ZoID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9naCA9IDB4MWY4M2Q5YWJcbiAgdGhpcy5faGggPSAweDViZTBjZDE5XG5cbiAgdGhpcy5fYWwgPSAweGYzYmNjOTA4XG4gIHRoaXMuX2JsID0gMHg4NGNhYTczYlxuICB0aGlzLl9jbCA9IDB4ZmU5NGY4MmJcbiAgdGhpcy5fZGwgPSAweDVmMWQzNmYxXG4gIHRoaXMuX2VsID0gMHhhZGU2ODJkMVxuICB0aGlzLl9mbCA9IDB4MmIzZTZjMWZcbiAgdGhpcy5fZ2wgPSAweGZiNDFiZDZiXG4gIHRoaXMuX2hsID0gMHgxMzdlMjE3OVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIENoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAyOCB8IHhsIDw8IDQpIF4gKHhsID4+PiAyIHwgeCA8PCAzMCkgXiAoeGwgPj4+IDcgfCB4IDw8IDI1KVxufVxuXG5mdW5jdGlvbiBzaWdtYTEgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMTQgfCB4bCA8PCAxOCkgXiAoeCA+Pj4gMTggfCB4bCA8PCAxNCkgXiAoeGwgPj4+IDkgfCB4IDw8IDIzKVxufVxuXG5mdW5jdGlvbiBHYW1tYTAgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMGwgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcgfCB4bCA8PCAyNSlcbn1cblxuZnVuY3Rpb24gR2FtbWExICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDE5IHwgeGwgPDwgMTMpIF4gKHhsID4+PiAyOSB8IHggPDwgMykgXiAoeCA+Pj4gNilcbn1cblxuZnVuY3Rpb24gR2FtbWExbCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxOSB8IHhsIDw8IDEzKSBeICh4bCA+Pj4gMjkgfCB4IDw8IDMpIF4gKHggPj4+IDYgfCB4bCA8PCAyNilcbn1cblxuZnVuY3Rpb24gZ2V0Q2FycnkgKGEsIGIpIHtcbiAgcmV0dXJuIChhID4+PiAwKSA8IChiID4+PiAwKSA/IDEgOiAwXG59XG5cblNoYTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhaCA9IHRoaXMuX2FoIHwgMFxuICB2YXIgYmggPSB0aGlzLl9iaCB8IDBcbiAgdmFyIGNoID0gdGhpcy5fY2ggfCAwXG4gIHZhciBkaCA9IHRoaXMuX2RoIHwgMFxuICB2YXIgZWggPSB0aGlzLl9laCB8IDBcbiAgdmFyIGZoID0gdGhpcy5fZmggfCAwXG4gIHZhciBnaCA9IHRoaXMuX2doIHwgMFxuICB2YXIgaGggPSB0aGlzLl9oaCB8IDBcblxuICB2YXIgYWwgPSB0aGlzLl9hbCB8IDBcbiAgdmFyIGJsID0gdGhpcy5fYmwgfCAwXG4gIHZhciBjbCA9IHRoaXMuX2NsIHwgMFxuICB2YXIgZGwgPSB0aGlzLl9kbCB8IDBcbiAgdmFyIGVsID0gdGhpcy5fZWwgfCAwXG4gIHZhciBmbCA9IHRoaXMuX2ZsIHwgMFxuICB2YXIgZ2wgPSB0aGlzLl9nbCB8IDBcbiAgdmFyIGhsID0gdGhpcy5faGwgfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSArPSAyKSB7XG4gICAgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gICAgV1tpICsgMV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0ICsgNClcbiAgfVxuICBmb3IgKDsgaSA8IDE2MDsgaSArPSAyKSB7XG4gICAgdmFyIHhoID0gV1tpIC0gMTUgKiAyXVxuICAgIHZhciB4bCA9IFdbaSAtIDE1ICogMiArIDFdXG4gICAgdmFyIGdhbW1hMCA9IEdhbW1hMCh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMGwgPSBHYW1tYTBsKHhsLCB4aClcblxuICAgIHhoID0gV1tpIC0gMiAqIDJdXG4gICAgeGwgPSBXW2kgLSAyICogMiArIDFdXG4gICAgdmFyIGdhbW1hMSA9IEdhbW1hMSh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMWwgPSBHYW1tYTFsKHhsLCB4aClcblxuICAgIC8vIFdbaV0gPSBnYW1tYTAgKyBXW2kgLSA3XSArIGdhbW1hMSArIFdbaSAtIDE2XVxuICAgIHZhciBXaTdoID0gV1tpIC0gNyAqIDJdXG4gICAgdmFyIFdpN2wgPSBXW2kgLSA3ICogMiArIDFdXG5cbiAgICB2YXIgV2kxNmggPSBXW2kgLSAxNiAqIDJdXG4gICAgdmFyIFdpMTZsID0gV1tpIC0gMTYgKiAyICsgMV1cblxuICAgIHZhciBXaWwgPSAoZ2FtbWEwbCArIFdpN2wpIHwgMFxuICAgIHZhciBXaWggPSAoZ2FtbWEwICsgV2k3aCArIGdldENhcnJ5KFdpbCwgZ2FtbWEwbCkpIHwgMFxuICAgIFdpbCA9IChXaWwgKyBnYW1tYTFsKSB8IDBcbiAgICBXaWggPSAoV2loICsgZ2FtbWExICsgZ2V0Q2FycnkoV2lsLCBnYW1tYTFsKSkgfCAwXG4gICAgV2lsID0gKFdpbCArIFdpMTZsKSB8IDBcbiAgICBXaWggPSAoV2loICsgV2kxNmggKyBnZXRDYXJyeShXaWwsIFdpMTZsKSkgfCAwXG5cbiAgICBXW2ldID0gV2loXG4gICAgV1tpICsgMV0gPSBXaWxcbiAgfVxuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgMTYwOyBqICs9IDIpIHtcbiAgICBXaWggPSBXW2pdXG4gICAgV2lsID0gV1tqICsgMV1cblxuICAgIHZhciBtYWpoID0gbWFqKGFoLCBiaCwgY2gpXG4gICAgdmFyIG1hamwgPSBtYWooYWwsIGJsLCBjbClcblxuICAgIHZhciBzaWdtYTBoID0gc2lnbWEwKGFoLCBhbClcbiAgICB2YXIgc2lnbWEwbCA9IHNpZ21hMChhbCwgYWgpXG4gICAgdmFyIHNpZ21hMWggPSBzaWdtYTEoZWgsIGVsKVxuICAgIHZhciBzaWdtYTFsID0gc2lnbWExKGVsLCBlaClcblxuICAgIC8vIHQxID0gaCArIHNpZ21hMSArIGNoICsgS1tqXSArIFdbal1cbiAgICB2YXIgS2loID0gS1tqXVxuICAgIHZhciBLaWwgPSBLW2ogKyAxXVxuXG4gICAgdmFyIGNoaCA9IENoKGVoLCBmaCwgZ2gpXG4gICAgdmFyIGNobCA9IENoKGVsLCBmbCwgZ2wpXG5cbiAgICB2YXIgdDFsID0gKGhsICsgc2lnbWExbCkgfCAwXG4gICAgdmFyIHQxaCA9IChoaCArIHNpZ21hMWggKyBnZXRDYXJyeSh0MWwsIGhsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIGNobCkgfCAwXG4gICAgdDFoID0gKHQxaCArIGNoaCArIGdldENhcnJ5KHQxbCwgY2hsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIEtpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIEtpaCArIGdldENhcnJ5KHQxbCwgS2lsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIFdpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIFdpaCArIGdldENhcnJ5KHQxbCwgV2lsKSkgfCAwXG5cbiAgICAvLyB0MiA9IHNpZ21hMCArIG1halxuICAgIHZhciB0MmwgPSAoc2lnbWEwbCArIG1hamwpIHwgMFxuICAgIHZhciB0MmggPSAoc2lnbWEwaCArIG1hamggKyBnZXRDYXJyeSh0MmwsIHNpZ21hMGwpKSB8IDBcblxuICAgIGhoID0gZ2hcbiAgICBobCA9IGdsXG4gICAgZ2ggPSBmaFxuICAgIGdsID0gZmxcbiAgICBmaCA9IGVoXG4gICAgZmwgPSBlbFxuICAgIGVsID0gKGRsICsgdDFsKSB8IDBcbiAgICBlaCA9IChkaCArIHQxaCArIGdldENhcnJ5KGVsLCBkbCkpIHwgMFxuICAgIGRoID0gY2hcbiAgICBkbCA9IGNsXG4gICAgY2ggPSBiaFxuICAgIGNsID0gYmxcbiAgICBiaCA9IGFoXG4gICAgYmwgPSBhbFxuICAgIGFsID0gKHQxbCArIHQybCkgfCAwXG4gICAgYWggPSAodDFoICsgdDJoICsgZ2V0Q2FycnkoYWwsIHQxbCkpIHwgMFxuICB9XG5cbiAgdGhpcy5fYWwgPSAodGhpcy5fYWwgKyBhbCkgfCAwXG4gIHRoaXMuX2JsID0gKHRoaXMuX2JsICsgYmwpIHwgMFxuICB0aGlzLl9jbCA9ICh0aGlzLl9jbCArIGNsKSB8IDBcbiAgdGhpcy5fZGwgPSAodGhpcy5fZGwgKyBkbCkgfCAwXG4gIHRoaXMuX2VsID0gKHRoaXMuX2VsICsgZWwpIHwgMFxuICB0aGlzLl9mbCA9ICh0aGlzLl9mbCArIGZsKSB8IDBcbiAgdGhpcy5fZ2wgPSAodGhpcy5fZ2wgKyBnbCkgfCAwXG4gIHRoaXMuX2hsID0gKHRoaXMuX2hsICsgaGwpIHwgMFxuXG4gIHRoaXMuX2FoID0gKHRoaXMuX2FoICsgYWggKyBnZXRDYXJyeSh0aGlzLl9hbCwgYWwpKSB8IDBcbiAgdGhpcy5fYmggPSAodGhpcy5fYmggKyBiaCArIGdldENhcnJ5KHRoaXMuX2JsLCBibCkpIHwgMFxuICB0aGlzLl9jaCA9ICh0aGlzLl9jaCArIGNoICsgZ2V0Q2FycnkodGhpcy5fY2wsIGNsKSkgfCAwXG4gIHRoaXMuX2RoID0gKHRoaXMuX2RoICsgZGggKyBnZXRDYXJyeSh0aGlzLl9kbCwgZGwpKSB8IDBcbiAgdGhpcy5fZWggPSAodGhpcy5fZWggKyBlaCArIGdldENhcnJ5KHRoaXMuX2VsLCBlbCkpIHwgMFxuICB0aGlzLl9maCA9ICh0aGlzLl9maCArIGZoICsgZ2V0Q2FycnkodGhpcy5fZmwsIGZsKSkgfCAwXG4gIHRoaXMuX2doID0gKHRoaXMuX2doICsgZ2ggKyBnZXRDYXJyeSh0aGlzLl9nbCwgZ2wpKSB8IDBcbiAgdGhpcy5faGggPSAodGhpcy5faGggKyBoaCArIGdldENhcnJ5KHRoaXMuX2hsLCBobCkpIHwgMFxufVxuXG5TaGE1MTIucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgSCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg2NClcblxuICBmdW5jdGlvbiB3cml0ZUludDY0QkUgKGgsIGwsIG9mZnNldCkge1xuICAgIEgud3JpdGVJbnQzMkJFKGgsIG9mZnNldClcbiAgICBILndyaXRlSW50MzJCRShsLCBvZmZzZXQgKyA0KVxuICB9XG5cbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2FoLCB0aGlzLl9hbCwgMClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2JoLCB0aGlzLl9ibCwgOClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLCB0aGlzLl9jbCwgMTYpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9kaCwgdGhpcy5fZGwsIDI0KVxuICB3cml0ZUludDY0QkUodGhpcy5fZWgsIHRoaXMuX2VsLCAzMilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLCB0aGlzLl9mbCwgNDApXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9naCwgdGhpcy5fZ2wsIDQ4KVxuICB3cml0ZUludDY0QkUodGhpcy5faGgsIHRoaXMuX2hsLCA1NilcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTUxMlxuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IE1zc3FsUGFyYW1ldGVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvTXNzcWxQYXJhbWV0ZXJcIjtcbmltcG9ydCB7IFNxbFNlcnZlckRyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbi8qKlxuICogQ2FjaGVzIHF1ZXJ5IHJlc3VsdCBpbnRvIGN1cnJlbnQgZGF0YWJhc2UsIGludG8gc2VwYXJhdGUgdGFibGUgY2FsbGVkIFwicXVlcnktcmVzdWx0LWNhY2hlXCIuXG4gKi9cbnZhciBEYlF1ZXJ5UmVzdWx0Q2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIERiUXVlcnlSZXN1bHRDYWNoZShjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHZhciBzY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMuc2NoZW1hO1xuICAgICAgICB2YXIgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFiYXNlO1xuICAgICAgICB2YXIgY2FjaGVPcHRpb25zID0gdHlwZW9mIHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlID09PSBcIm9iamVjdFwiID8gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGUgOiB7fTtcbiAgICAgICAgdmFyIGNhY2hlVGFibGVOYW1lID0gY2FjaGVPcHRpb25zLnRhYmxlTmFtZSB8fCBcInF1ZXJ5LXJlc3VsdC1jYWNoZVwiO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVEYXRhYmFzZSA9IGRhdGFiYXNlO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVTY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRDYWNoZVRhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShjYWNoZVRhYmxlTmFtZSwgc2NoZW1hLCBkYXRhYmFzZSk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB3aXRoIGdpdmVuIGNhY2hlIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIERiUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHdpdGggZ2l2ZW4gY2FjaGUgcHJvdmlkZXIuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0YWJsZSBmb3Igc3RvcmluZyBjYWNoZSBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5zeW5jaHJvbml6ZSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZHJpdmVyLCB0YWJsZUV4aXN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLmdldFF1ZXJ5UnVubmVyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5oYXNUYWJsZSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUV4aXN0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUobmV3IFRhYmxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMucXVlcnlSZXN1bHRDYWNoZURhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHRoaXMucXVlcnlSZXN1bHRDYWNoZVNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jYWNoZUlkIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25TdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVJZGVudGlmaWVyIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiBkcml2ZXIubWFwcGVkRGF0YVR5cGVzLmNhY2hlVGltZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVEdXJhdGlvbiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVRdWVyeSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiBkcml2ZXIubWFwcGVkRGF0YVR5cGVzLmNhY2hlUmVzdWx0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhY2hlcyBnaXZlbiBxdWVyeSByZXN1bHQuXG4gICAgICogUmV0dXJucyBjYWNoZSByZXN1bHQgaWYgZm91bmQuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgcmVzdWx0IGlzIG5vdCBjYWNoZWQuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5nZXRGcm9tQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLmdldFF1ZXJ5UnVubmVyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgICAgICAuZnJvbSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSwgXCJjYWNoZVwiKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIHFiXG4gICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcImNhY2hlXCIpICsgXCIuXCIgKyBxYi5lc2NhcGUoXCJpZGVudGlmaWVyXCIpICsgXCIgPSA6aWRlbnRpZmllclwiKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHsgaWRlbnRpZmllcjogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciA/IG5ldyBNc3NxbFBhcmFtZXRlcihvcHRpb25zLmlkZW50aWZpZXIsIFwibnZhcmNoYXJcIikgOiBvcHRpb25zLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgICAuZ2V0UmF3T25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcWJcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlKFwiZGJtc19sb2IuY29tcGFyZShcIiArIHFiLmVzY2FwZShcImNhY2hlXCIpICsgXCIuXCIgKyBxYi5lc2NhcGUoXCJxdWVyeVwiKSArIFwiLCA6cXVlcnkpID0gMFwiLCB7IHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IH0pXG4gICAgICAgICAgICAgICAgICAgIC5nZXRSYXdPbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxYlxuICAgICAgICAgICAgICAgIC53aGVyZShxYi5lc2NhcGUoXCJjYWNoZVwiKSArIFwiLlwiICsgcWIuZXNjYXBlKFwicXVlcnlcIikgKyBcIiA9IDpxdWVyeVwiKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHsgcXVlcnk6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIgPyBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5xdWVyeSwgXCJudmFyY2hhclwiKSA6IG9wdGlvbnMucXVlcnkgfSlcbiAgICAgICAgICAgICAgICAuZ2V0UmF3T25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGNhY2hlIGlzIGV4cGlyZWQgb3Igbm90LlxuICAgICAqL1xuICAgIERiUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuaXNFeHBpcmVkID0gZnVuY3Rpb24gKHNhdmVkQ2FjaGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gdHlwZW9mIHNhdmVkQ2FjaGUuZHVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChzYXZlZENhY2hlLmR1cmF0aW9uKSA6IHNhdmVkQ2FjaGUuZHVyYXRpb247XG4gICAgICAgIHJldHVybiAoKHR5cGVvZiBzYXZlZENhY2hlLnRpbWUgPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChzYXZlZENhY2hlLnRpbWUpIDogc2F2ZWRDYWNoZS50aW1lKSArIGR1cmF0aW9uKSA8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGdpdmVuIHF1ZXJ5IHJlc3VsdCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5zdG9yZUluQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc2F2ZWRDYWNoZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNob3VsZENyZWF0ZVF1ZXJ5UnVubmVyLCBpbnNlcnRlZFZhbHVlcywgcWIsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ3JlYXRlUXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lciA9PT0gdW5kZWZpbmVkIHx8IChxdWVyeVJ1bm5lciA9PT0gbnVsbCB8fCBxdWVyeVJ1bm5lciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcXVlcnlSdW5uZXIuZ2V0UmVwbGljYXRpb25Nb2RlKCkpID09PSBcInNsYXZlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlSdW5uZXIgPT09IHVuZGVmaW5lZCB8fCBzaG91bGRDcmVhdGVRdWVyeVJ1bm5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKFwibWFzdGVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRWYWx1ZXMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHsgLy8gdG9kbzogYmFkIGFic3RyYWN0aW9uLCByZS1pbXBsZW1lbnQgdGhpcyBwYXJ0LCBwcm9iYWJseSBiZXR0ZXIgaWYgd2UgY3JlYXRlIGFuIGVudGl0eSBtZXRhZGF0YSBmb3IgY2FjaGUgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZhbHVlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogbmV3IE1zc3FsUGFyYW1ldGVyKG9wdGlvbnMuaWRlbnRpZmllciwgXCJudmFyY2hhclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogbmV3IE1zc3FsUGFyYW1ldGVyKG9wdGlvbnMudGltZSwgXCJiaWdpbnRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5kdXJhdGlvbiwgXCJpbnRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5xdWVyeSwgXCJudmFyY2hhclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5yZXN1bHQsIFwibnZhcmNoYXJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNhdmVkQ2FjaGUgJiYgc2F2ZWRDYWNoZS5pZGVudGlmaWVyKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMucXVlcnlSZXN1bHRDYWNoZVRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoaW5zZXJ0ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUocWIuZXNjYXBlKFwiaWRlbnRpZmllclwiKSArIFwiID0gOmNvbmRpdGlvblwiLCB7IGNvbmRpdGlvbjogaW5zZXJ0ZWRWYWx1ZXMuaWRlbnRpZmllciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzYXZlZENhY2hlICYmIHNhdmVkQ2FjaGUucXVlcnkpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gcXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldChpbnNlcnRlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLndoZXJlKFwiZGJtc19sb2IuY29tcGFyZShcXFwicXVlcnlcXFwiLCA6Y29uZGl0aW9uKSA9IDBcIiwgeyBjb25kaXRpb246IGluc2VydGVkVmFsdWVzLnF1ZXJ5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUocWIuZXNjYXBlKFwicXVlcnlcIikgKyBcIiA9IDpjb25kaXRpb25cIiwgeyBjb25kaXRpb246IGluc2VydGVkVmFsdWVzLnF1ZXJ5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogLy8gb3RoZXJ3aXNlIGluc2VydFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhpbnNlcnRlZFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZENyZWF0ZVF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGV2ZXJ5dGhpbmcgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRRdWVyeVJ1bm5lcihxdWVyeVJ1bm5lcikuY2xlYXJUYWJsZSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgY2FjaGVkIHJlc3VsdHMgYnkgZ2l2ZW4gaWRlbnRpZmllcnMgZnJvbSBjYWNoZS5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpZGVudGlmaWVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaWRlbnRpZmllcnMubWFwKGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHFiID0gX3RoaXMuZ2V0UXVlcnlSdW5uZXIocXVlcnlSdW5uZXIpLm1hbmFnZXIuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFiLmRlbGV0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKF90aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcImlkZW50aWZpZXJcIikgKyBcIiA9IDppZGVudGlmaWVyXCIsIHsgaWRlbnRpZmllcjogaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcXVlcnkgcnVubmVyIHRvIHdvcmsgd2l0aC5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmdldFF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVJ1bm5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIH07XG4gICAgcmV0dXJuIERiUXVlcnlSZXN1bHRDYWNoZTtcbn0oKSk7XG5leHBvcnQgeyBEYlF1ZXJ5UmVzdWx0Q2FjaGUgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGJRdWVyeVJlc3VsdENhY2hlLmpzLm1hcFxuIiwiaW1wb3J0IHsgUmVkaXNRdWVyeVJlc3VsdENhY2hlIH0gZnJvbSBcIi4vUmVkaXNRdWVyeVJlc3VsdENhY2hlXCI7XG5pbXBvcnQgeyBEYlF1ZXJ5UmVzdWx0Q2FjaGUgfSBmcm9tIFwiLi9EYlF1ZXJ5UmVzdWx0Q2FjaGVcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvci9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogQ2FjaGVzIHF1ZXJ5IHJlc3VsdCBpbnRvIFJlZGlzIGRhdGFiYXNlLlxuICovXG52YXIgUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5KGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgcmVzdWx0IGNhY2hlIGJhc2VkIG9uIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICBRdWVyeVJlc3VsdENhY2hlRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRvIHVzZSBjYWNoZSB5b3UgbmVlZCB0byBlbmFibGUgaXQgaW4gY29ubmVjdGlvbiBvcHRpb25zIGJ5IHNldHRpbmcgY2FjaGU6IHRydWUgb3IgcHJvdmlkaW5nIHNvbWUgY2FjaGluZyBvcHRpb25zLiBFeGFtcGxlOiB7IGhvc3Q6IC4uLiwgdXNlcm5hbWU6IC4uLiwgY2FjaGU6IHRydWUgfVwiKTtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGU7XG4gICAgICAgIGlmIChjYWNoZS5wcm92aWRlciAmJiB0eXBlb2YgY2FjaGUucHJvdmlkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnByb3ZpZGVyKHRoaXMuY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlLnR5cGUgPT09IFwicmVkaXNcIiB8fCBjYWNoZS50eXBlID09PSBcImlvcmVkaXNcIiB8fCBjYWNoZS50eXBlID09PSBcImlvcmVkaXMvY2x1c3RlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZGlzUXVlcnlSZXN1bHRDYWNoZSh0aGlzLmNvbm5lY3Rpb24sIGNhY2hlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYlF1ZXJ5UmVzdWx0Q2FjaGUodGhpcy5jb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIENhY2hlcyBxdWVyeSByZXN1bHQgaW50byBSZWRpcyBkYXRhYmFzZS5cbiAqL1xudmFyIFJlZGlzUXVlcnlSZXN1bHRDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVkaXNRdWVyeVJlc3VsdENhY2hlKGNvbm5lY3Rpb24sIGNsaWVudFR5cGUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jbGllbnRUeXBlID0gY2xpZW50VHlwZTtcbiAgICAgICAgdGhpcy5yZWRpcyA9IHRoaXMubG9hZFJlZGlzKCk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB3aXRoIGdpdmVuIGNhY2hlIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlT3B0aW9ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBjYWNoZU9wdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGllbnRUeXBlID09PSBcInJlZGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlT3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSB0aGlzLnJlZGlzLmNyZWF0ZUNsaWVudChjYWNoZU9wdGlvbnMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IHRoaXMucmVkaXMuY3JlYXRlQ2xpZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jbGllbnRUeXBlID09PSBcImlvcmVkaXNcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zICYmIGNhY2hlT3B0aW9ucy5wb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzKGNhY2hlT3B0aW9ucy5wb3J0LCBjYWNoZU9wdGlvbnMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzKGNhY2hlT3B0aW9ucy5wb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYWNoZU9wdGlvbnMgJiYgY2FjaGVPcHRpb25zLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbmV3IHRoaXMucmVkaXMoY2FjaGVPcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBuZXcgdGhpcy5yZWRpcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xpZW50VHlwZSA9PT0gXCJpb3JlZGlzL2NsdXN0ZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zICYmIGNhY2hlT3B0aW9ucy5vcHRpb25zICYmIEFycmF5LmlzQXJyYXkoY2FjaGVPcHRpb25zLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzLkNsdXN0ZXIoY2FjaGVPcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhY2hlT3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucy5zdGFydHVwTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbmV3IHRoaXMucmVkaXMuQ2x1c3RlcihjYWNoZU9wdGlvbnMub3B0aW9ucy5zdGFydHVwTm9kZXMsIGNhY2hlT3B0aW9ucy5vcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIm9wdGlvbnMuc3RhcnR1cE5vZGVzIHJlcXVpcmVkIGZvciBcIiArIHRoaXMuY2xpZW50VHlwZSArIFwiLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB0aGUgY29ubmVjdGlvblxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jbGllbnQucXVpdChmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGFibGUgZm9yIHN0b3JpbmcgY2FjaGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuc3luY2hyb25pemUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhY2hlcyBnaXZlbiBxdWVyeSByZXN1bHQuXG4gICAgICogUmV0dXJucyBjYWNoZSByZXN1bHQgaWYgZm91bmQuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgcmVzdWx0IGlzIG5vdCBjYWNoZWQuXG4gICAgICovXG4gICAgUmVkaXNRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5nZXRGcm9tQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5nZXQob3B0aW9ucy5pZGVudGlmaWVyLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIG9rKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50LmdldChvcHRpb25zLnF1ZXJ5LCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIG9rKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvayh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjYWNoZSBpcyBleHBpcmVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmlzRXhwaXJlZCA9IGZ1bmN0aW9uIChzYXZlZENhY2hlKSB7XG4gICAgICAgIHJldHVybiAoc2F2ZWRDYWNoZS50aW1lICsgc2F2ZWRDYWNoZS5kdXJhdGlvbikgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBnaXZlbiBxdWVyeSByZXN1bHQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuc3RvcmVJbkNhY2hlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNhdmVkQ2FjaGUsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5zZXQob3B0aW9ucy5pZGVudGlmaWVyLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgXCJQWFwiLCBvcHRpb25zLmR1cmF0aW9uLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50LnNldChvcHRpb25zLnF1ZXJ5LCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgXCJQWFwiLCBvcHRpb25zLmR1cmF0aW9uLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyBldmVyeXRoaW5nIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgUmVkaXNRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5mbHVzaGRiKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBjYWNoZWQgcmVzdWx0cyBieSBnaXZlbiBpZGVudGlmaWVycyBmcm9tIGNhY2hlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGlkZW50aWZpZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChpZGVudGlmaWVycy5tYXAoZnVuY3Rpb24gKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlS2V5KGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2luZ2xlIGtleSBmcm9tIHJlZGlzIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuZGVsZXRlS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICBfdGhpcy5jbGllbnQuZGVsKGtleSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoZXJyKTtcbiAgICAgICAgICAgICAgICBvaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgcmVkaXMgZGVwZW5kZW5jeS5cbiAgICAgKi9cbiAgICBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmxvYWRSZWRpcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudFR5cGUgPT09IFwiaW9yZWRpcy9jbHVzdGVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGxhdGZvcm1Ub29scy5sb2FkKFwiaW9yZWRpc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQbGF0Zm9ybVRvb2xzLmxvYWQodGhpcy5jbGllbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCB1c2UgY2FjaGUgYmVjYXVzZSBcIiArIHRoaXMuY2xpZW50VHlwZSArIFwiIGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBydW4gXFxcIm5wbSBpIFwiICsgdGhpcy5jbGllbnRUeXBlICsgXCIgLS1zYXZlXFxcIi5cIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGU7XG59KCkpO1xuZXhwb3J0IHsgUmVkaXNRdWVyeVJlc3VsdENhY2hlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZGlzUXVlcnlSZXN1bHRDYWNoZS5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVlcFBhcnRpYWwuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eVRhcmdldC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0TGl0ZXJhbC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VHlwZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kgfSBmcm9tIFwiLi4vbmFtaW5nLXN0cmF0ZWd5L0RlZmF1bHROYW1pbmdTdHJhdGVneVwiO1xuaW1wb3J0IHsgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvclwiO1xuaW1wb3J0IHsgQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBNaWdyYXRpb25FeGVjdXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vTWlncmF0aW9uRXhlY3V0b3JcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9tb25nb2RiL01vbmdvRHJpdmVyXCI7XG5pbXBvcnQgeyBNb25nb0VudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5LW1hbmFnZXIvTW9uZ29FbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvciB9IGZyb20gXCIuLi9tZXRhZGF0YS1idWlsZGVyL0VudGl0eU1ldGFkYXRhVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB9IGZyb20gXCIuLi9lbnRpdHktbWFuYWdlci9FbnRpdHlNYW5hZ2VyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRHJpdmVyRmFjdG9yeSB9IGZyb20gXCIuLi9kcml2ZXIvRHJpdmVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuL0Nvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXJcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gXCIuLi9sb2dnZXIvTG9nZ2VyRmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnkgfSBmcm9tIFwiLi4vY2FjaGUvUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnlcIjtcbmltcG9ydCB7IFNxbGpzRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHktbWFuYWdlci9TcWxqc0VudGl0eU1hbmFnZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uTG9hZGVyIH0gZnJvbSBcIi4uL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25Mb2FkZXJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIENvbm5lY3Rpb24gaXMgYSBzaW5nbGUgZGF0YWJhc2UgT1JNIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBkYXRhYmFzZS5cbiAqIEl0cyBub3QgcmVxdWlyZWQgdG8gYmUgYSBkYXRhYmFzZSBjb25uZWN0aW9uLCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSBpdCBjYW4gY3JlYXRlIGNvbm5lY3Rpb24gcG9vbC5cbiAqIFlvdSBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB0byBtdWx0aXBsZSBkYXRhYmFzZXMgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAqL1xudmFyIENvbm5lY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogTWlncmF0aW9uIGluc3RhbmNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1pZ3JhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSBzdWJzY3JpYmVyIGluc3RhbmNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGwgZW50aXR5IG1ldGFkYXRhcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhcyA9IFtdO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgXCJkZWZhdWx0XCI7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5jcmVhdGUodGhpcy5vcHRpb25zLmxvZ2dlciwgdGhpcy5vcHRpb25zLmxvZ2dpbmcpO1xuICAgICAgICB0aGlzLmRyaXZlciA9IG5ldyBEcml2ZXJGYWN0b3J5KCkuY3JlYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5uYW1pbmdTdHJhdGVneSA9IG9wdGlvbnMubmFtaW5nU3RyYXRlZ3kgfHwgbmV3IERlZmF1bHROYW1pbmdTdHJhdGVneSgpO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGUgPSBvcHRpb25zLmNhY2hlID8gbmV3IFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5KHRoaXMpLmNyZWF0ZSgpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlbGF0aW9uTG9hZGVyID0gbmV3IFJlbGF0aW9uTG9hZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25uZWN0aW9uLnByb3RvdHlwZSwgXCJtb25nb01hbmFnZXJcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbW9uZ29kYiBlbnRpdHkgbWFuYWdlciB0aGF0IGFsbG93cyB0byBwZXJmb3JtIG1vbmdvZGItc3BlY2lmaWMgcmVwb3NpdG9yeSBvcGVyYXRpb25zXG4gICAgICAgICAqIHdpdGggYW55IGVudGl0eSBpbiB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBvbmx5IGluIG1vbmdvZGIgY29ubmVjdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMubWFuYWdlciBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk1vbmdvRW50aXR5TWFuYWdlciBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgTW9uZ29EQiBkYXRhYmFzZXMuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25uZWN0aW9uLnByb3RvdHlwZSwgXCJzcWxqc01hbmFnZXJcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHNxbC5qcyBzcGVjaWZpYyBFbnRpdHkgTWFuYWdlciB0aGF0IGFsbG93cyB0byBwZXJmb3JtIHNwZWNpYWwgbG9hZCBhbmQgc2F2ZSBvcGVyYXRpb25zXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgc3FsanMgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLm1hbmFnZXIgaW5zdGFuY2VvZiBTcWxqc0VudGl0eU1hbmFnZXIpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxqc0VudGl0eU1hbmFnZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIFNxbGpzIGRhdGFiYXNlcy5cIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBvbiBhcHBsaWNhdGlvbiBib290c3RyYXAuXG4gICAgICogVGhpcyBtZXRob2Qgbm90IG5lY2Vzc2FyaWx5IGNyZWF0ZXMgZGF0YWJhc2UgY29ubmVjdGlvbiAoZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLFxuICAgICAqIGJ1dCBpdCBhbHNvIGNhbiBzZXR1cCBhIGNvbm5lY3Rpb24gcG9vbCB3aXRoIGRhdGFiYXNlIHRvIHVzZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yKHRoaXMubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZSB2aWEgaXRzIGRyaXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcml2ZXIuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UgdmlhIGl0cyBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSZXN1bHRDYWNoZS5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjb25uZWN0ZWQgc3RhdHVzIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RVdGlscy5hc3NpZ24odGhpcywgeyBpc0Nvbm5lY3RlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs0LCAxMiwgLCAxNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgYWxsIG1ldGFkYXRhcyByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRNZXRhZGF0YXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLmFmdGVyQ29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZHJvcFNjaGVtYSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BEYXRhYmFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zeW5jaHJvbml6ZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnN5bmNocm9uaXplKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLm1pZ3JhdGlvbnNSdW4pIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucnVuTWlncmF0aW9ucyh7IHRyYW5zYWN0aW9uOiB0aGlzLm9wdGlvbnMubWlncmF0aW9uc1RyYW5zYWN0aW9uTW9kZSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZm9yIHNvbWUgcmVhc29uIGJ1aWxkIG1ldGFkYXRhIGZhaWwgKGZvciBleGFtcGxlIHZhbGlkYXRpb24gZXJyb3IgZHVyaW5nIGVudGl0eSBtZXRhZGF0YSBjaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsb3NlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZm9yIHNvbWUgcmVhc29uIGJ1aWxkIG1ldGFkYXRhIGZhaWwgKGZvciBleGFtcGxlIHZhbGlkYXRpb24gZXJyb3IgZHVyaW5nIGVudGl0eSBtZXRhZGF0YSBjaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8xO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2UuXG4gICAgICogT25jZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgeW91IGNhbm5vdCB1c2UgcmVwb3NpdG9yaWVzIG9yIHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgZXhjZXB0IG9wZW5pbmcgY29ubmVjdGlvbiBhZ2Fpbi5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IodGhpcy5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLmRpc2Nvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSZXN1bHRDYWNoZS5kaXNjb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCB7IGlzQ29ubmVjdGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRhdGFiYXNlIHNjaGVtYSBmb3IgYWxsIGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhpcyBjb25uZWN0aW9uLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHJvcEJlZm9yZVN5bmMgSWYgc2V0IHRvIHRydWUgdGhlbiBpdCBkcm9wcyB0aGUgZGF0YWJhc2Ugd2l0aCBhbGwgaXRzIHRhYmxlcyBhbmQgZGF0YVxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnN5bmNocm9uaXplID0gZnVuY3Rpb24gKGRyb3BCZWZvcmVTeW5jKSB7XG4gICAgICAgIGlmIChkcm9wQmVmb3JlU3luYyA9PT0gdm9pZCAwKSB7IGRyb3BCZWZvcmVTeW5jID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYUJ1aWxkZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkcm9wQmVmb3JlU3luYykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BEYXRhYmFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFCdWlsZGVyID0gdGhpcy5kcml2ZXIuY3JlYXRlU2NoZW1hQnVpbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgc2NoZW1hQnVpbGRlci5idWlsZCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSBkYXRhYmFzZSBhbmQgYWxsIGl0cyBkYXRhLlxuICAgICAqIEJlIGNhcmVmdWwgd2l0aCB0aGlzIG1ldGhvZCBvbiBwcm9kdWN0aW9uIHNpbmNlIHRoaXMgbWV0aG9kIHdpbGwgZXJhc2UgYWxsIHlvdXIgZGF0YWJhc2UgdGFibGVzIGFuZCB0aGVpciBkYXRhLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgLy8gVE9ETyByZW5hbWVcbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgZGF0YWJhc2VzXzIsIGRhdGFiYXNlc18xLCBkYXRhYmFzZXNfMV8xLCBkYXRhYmFzZSwgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsICwgMTMsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciB8fCB0aGlzLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlc18yID0gdGhpcy5kcml2ZXIuZGF0YWJhc2UgPyBbdGhpcy5kcml2ZXIuZGF0YWJhc2VdIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5kYXRhYmFzZSAmJiBkYXRhYmFzZXNfMi5pbmRleE9mKG1ldGFkYXRhLmRhdGFiYXNlKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlc18yLnB1c2gobWV0YWRhdGEuZGF0YWJhc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMiwgNywgOCwgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzXzEgPSBfX3ZhbHVlcyhkYXRhYmFzZXNfMiksIGRhdGFiYXNlc18xXzEgPSBkYXRhYmFzZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWRhdGFiYXNlc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSA9IGRhdGFiYXNlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jbGVhckRhdGFiYXNlKGRhdGFiYXNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzXzFfMSA9IGRhdGFiYXNlc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YWJhc2VzXzFfMSAmJiAhZGF0YWJhc2VzXzFfMS5kb25lICYmIChfYSA9IGRhdGFiYXNlc18xLnJldHVybikpIF9hLmNhbGwoZGF0YWJhc2VzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNsZWFyRGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUnVucyBhbGwgcGVuZGluZyBtaWdyYXRpb25zLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUucnVuTWlncmF0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25FeGVjdXRvciwgc3VjY2Vzc01pZ3JhdGlvbnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlncmF0aW9uRXhlY3V0b3IgPSBuZXcgTWlncmF0aW9uRXhlY3V0b3IodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvci50cmFuc2FjdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMudHJhbnNhY3Rpb24pIHx8IFwiYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25FeGVjdXRvci5leGVjdXRlUGVuZGluZ01pZ3JhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHN1Y2Nlc3NNaWdyYXRpb25zXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIGxhc3QgZXhlY3V0ZWQgbWlncmF0aW9uLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUudW5kb0xhc3RNaWdyYXRpb24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWlncmF0aW9uRXhlY3V0b3I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlncmF0aW9uRXhlY3V0b3IgPSBuZXcgTWlncmF0aW9uRXhlY3V0b3IodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvci50cmFuc2FjdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMudHJhbnNhY3Rpb24pIHx8IFwiYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25FeGVjdXRvci51bmRvTGFzdE1pZ3JhdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCBtaWdyYXRpb25zIGFuZCB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHBlbmRpbmcgbWlncmF0aW9uc1xuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnNob3dNaWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWlncmF0aW9uRXhlY3V0b3I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yKHRoaXMubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvciA9IG5ldyBNaWdyYXRpb25FeGVjdXRvcih0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1pZ3JhdGlvbkV4ZWN1dG9yLnNob3dNaWdyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnRpdHkgbWV0YWRhdGEgZXhpc3QgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MsIHRhcmdldCBuYW1lIG9yIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuaGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZE1ldGFkYXRhKHRhcmdldCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBzY2hlbWEgbmFtZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldFJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyB0cmVlIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3Mgb3IgbmFtZS5cbiAgICAgKiBPbmx5IHRyZWUtdHlwZSBlbnRpdGllcyBjYW4gaGF2ZSBhIFRyZWVSZXBvc2l0b3J5LCBsaWtlIG9uZXMgZGVjb3JhdGVkIHdpdGggQFRyZWUgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldFRyZWVSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFRyZWVSZXBvc2l0b3J5KHRhcmdldCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIG1vbmdvZGItc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIFdvcmtzIG9ubHkgaWYgY29ubmVjdGlvbiBpcyBtb25nb2RiLXNwZWNpZmljLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldE1vbmdvUmVwb3NpdG9yeSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKCEodGhpcy5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiWW91IGNhbiB1c2UgZ2V0TW9uZ29SZXBvc2l0b3J5IG9ubHkgZm9yIE1vbmdvREIgY29ubmVjdGlvbnMuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFJlcG9zaXRvcnkodGFyZ2V0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgY3VzdG9tIGVudGl0eSByZXBvc2l0b3J5IG1hcmtlZCB3aXRoIEBFbnRpdHlSZXBvc2l0b3J5IGRlY29yYXRvci5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRDdXN0b21SZXBvc2l0b3J5ID0gZnVuY3Rpb24gKGN1c3RvbVJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRDdXN0b21SZXBvc2l0b3J5KGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUudHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLm1hbmFnZXIudHJhbnNhY3Rpb24oaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1c2VkUXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUXVlcmllcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IE1vbmdvREIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UnVubmVyICYmIHF1ZXJ5UnVubmVyLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZFF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXIgfHwgdGhpcy5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsICwgMywgNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdXNlZFF1ZXJ5UnVubmVyLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcXVlcnlSdW5uZXIpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdXNlZFF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNxbCBxdWVyeS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoZW50aXR5T3JSdW5uZXIsIGFsaWFzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJRdWVyeSBCdWlsZGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgTW9uZ29EQi5cIik7XG4gICAgICAgIGlmIChhbGlhcykge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YShlbnRpdHlPclJ1bm5lcik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcih0aGlzLCBxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAuc2VsZWN0KGFsaWFzKVxuICAgICAgICAgICAgICAgIC5mcm9tKG1ldGFkYXRhLnRhcmdldCwgYWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXIodGhpcywgZW50aXR5T3JSdW5uZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgcnVubmVyIHVzZWQgZm9yIHBlcmZvcm0gcXVlcmllcyBvbiBhIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqIFVzaW5nIHF1ZXJ5IHJ1bm5lcnMgeW91IGNhbiBjb250cm9sIHlvdXIgcXVlcmllcyB0byBleGVjdXRlIHVzaW5nIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZFxuICAgICAqIG1hbnVhbGx5IGNvbnRyb2wgeW91ciBkYXRhYmFzZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIE1vZGUgaXMgdXNlZCBpbiByZXBsaWNhdGlvbiBtb2RlIGFuZCBpbmRpY2F0ZXMgd2hhdGV2ZXIgeW91IHdhbnQgdG8gY29ubmVjdFxuICAgICAqIHRvIG1hc3RlciBkYXRhYmFzZSBvciBhbnkgb2Ygc2xhdmUgZGF0YWJhc2VzLlxuICAgICAqIElmIHlvdSBwZXJmb3JtIHdyaXRlcyB5b3UgbXVzdCB1c2UgbWFzdGVyIGRhdGFiYXNlLFxuICAgICAqIGlmIHlvdSBwZXJmb3JtIHJlYWRzIHlvdSBjYW4gdXNlIHNsYXZlIGRhdGFiYXNlcy5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IFwibWFzdGVyXCI7IH1cbiAgICAgICAgdmFyIHF1ZXJ5UnVubmVyID0gdGhpcy5kcml2ZXIuY3JlYXRlUXVlcnlSdW5uZXIobW9kZSk7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcy5jcmVhdGVFbnRpdHlNYW5hZ2VyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihxdWVyeVJ1bm5lciwgeyBtYW5hZ2VyOiBtYW5hZ2VyIH0pO1xuICAgICAgICByZXR1cm4gcXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtZXRhZGF0YSBvZiB0aGUganVuY3Rpb24gdGFibGUgKG1hbnktdG8tbWFueSB0YWJsZSkuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0TWFueVRvTWFueU1ldGFkYXRhID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgcmVsYXRpb25Qcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIHJlbGF0aW9uTWV0YWRhdGEgPSB0aGlzLmdldE1ldGFkYXRhKGVudGl0eVRhcmdldCkuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghcmVsYXRpb25NZXRhZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcXFwiXCIgKyByZWxhdGlvblByb3BlcnR5UGF0aCArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIFwiICsgZW50aXR5VGFyZ2V0ICsgXCIgZW50aXR5LlwiKTtcbiAgICAgICAgaWYgKCFyZWxhdGlvbk1ldGFkYXRhLmlzTWFueVRvTWFueSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcXFwiXCIgKyBlbnRpdHlUYXJnZXQgKyBcIiNcIiArIHJlbGF0aW9uUHJvcGVydHlQYXRoICsgXCJcXFwiIGRvZXMgbm90IGhhdmUgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLlwiICtcbiAgICAgICAgICAgICAgICBcIllvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9ubHkgb24gbWFueS10by1tYW55IHJlbGF0aW9ucy5cIik7XG4gICAgICAgIHJldHVybiByZWxhdGlvbk1ldGFkYXRhLmp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIEVudGl0eSBNYW5hZ2VyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uIHdpdGggdGhlIGhlbHAgb2YgdGhlIEVudGl0eU1hbmFnZXJGYWN0b3J5LlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUVudGl0eU1hbmFnZXIgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZSh0aGlzLCBxdWVyeVJ1bm5lcik7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRmluZHMgZXhpc3QgZW50aXR5IG1ldGFkYXRhIGJ5IHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MsIHRhcmdldCBuYW1lIG9yIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuZmluZE1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlNZXRhZGF0YXMuZmluZChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS50YXJnZXQgPT09IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEubmFtZSA9PT0gdGFyZ2V0Lm9wdGlvbnMubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhYmxlUGF0aCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLm5hbWUgPT09IHRhcmdldCB8fCBtZXRhZGF0YS50YWJsZU5hbWUgPT09IHRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIG1ldGFkYXRhcyBmb3IgYWxsIHJlZ2lzdGVyZWQgY2xhc3NlcyBpbnNpZGUgdGhpcyBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmJ1aWxkTWV0YWRhdGFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlciA9IG5ldyBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyKHRoaXMpO1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGFWYWxpZGF0b3IgPSBuZXcgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IoKTtcbiAgICAgICAgLy8gY3JlYXRlIHN1YnNjcmliZXJzIGluc3RhbmNlcyBpZiB0aGV5IGFyZSBub3QgZGlzYWxsb3dlZCBmcm9tIGhpZ2gtbGV2ZWwgKGZvciBleGFtcGxlIHRoZXkgY2FuIGRpc2FsbG93ZWQgZnJvbSBtaWdyYXRpb25zIHJ1biBwcm9jZXNzKVxuICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSBjb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmJ1aWxkU3Vic2NyaWJlcnModGhpcy5vcHRpb25zLnN1YnNjcmliZXJzIHx8IFtdKTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHsgc3Vic2NyaWJlcnM6IHN1YnNjcmliZXJzIH0pO1xuICAgICAgICAvLyBidWlsZCBlbnRpdHkgbWV0YWRhdGFzXG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YXMgPSBjb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmJ1aWxkRW50aXR5TWV0YWRhdGFzKHRoaXMub3B0aW9ucy5lbnRpdGllcyB8fCBbXSk7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCB7IGVudGl0eU1ldGFkYXRhczogZW50aXR5TWV0YWRhdGFzIH0pO1xuICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9uIGluc3RhbmNlc1xuICAgICAgICB2YXIgbWlncmF0aW9ucyA9IGNvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIuYnVpbGRNaWdyYXRpb25zKHRoaXMub3B0aW9ucy5taWdyYXRpb25zIHx8IFtdKTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHsgbWlncmF0aW9uczogbWlncmF0aW9ucyB9KTtcbiAgICAgICAgLy8gdmFsaWRhdGUgYWxsIGNyZWF0ZWQgZW50aXR5IG1ldGFkYXRhcyB0byBtYWtlIHN1cmUgdXNlciBjcmVhdGVkIGVudGl0aWVzIGFyZSB2YWxpZCBhbmQgY29ycmVjdFxuICAgICAgICBlbnRpdHlNZXRhZGF0YVZhbGlkYXRvci52YWxpZGF0ZU1hbnkodGhpcy5lbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFibGVUeXBlICE9PSBcInZpZXdcIjsgfSksIHRoaXMuZHJpdmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb24gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXBcbiIsImltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9Db25uZWN0aW9uTm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvci9BbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yXCI7XG4vKipcbiAqIENvbm5lY3Rpb25NYW5hZ2VyIGlzIHVzZWQgdG8gc3RvcmUgYW5kIG1hbmFnZSBtdWx0aXBsZSBvcm0gY29ubmVjdGlvbnMuXG4gKiBJdCBhbHNvIHByb3ZpZGVzIHVzZWZ1bCBmYWN0b3J5IG1ldGhvZHMgdG8gc2ltcGxpZnkgY29ubmVjdGlvbiBjcmVhdGlvbi5cbiAqL1xudmFyIENvbm5lY3Rpb25NYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25NYW5hZ2VyKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgbG9va3VwIHRvIHF1aWNrbHkgZ2V0IGZyb20gYSBjb25uZWN0aW9uIG5hbWUgdG8gdGhlIENvbm5lY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLCBcImNvbm5lY3Rpb25zXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbnMgcmVnaXN0ZXJlZCBpbiB0aGlzIGNvbm5lY3Rpb24gbWFuYWdlci5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb25uZWN0aW9uTWFwLnZhbHVlcygpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGluIHRoZSBtYW5hZ2VyLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFwLmhhcyhuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcmVnaXN0ZXJlZCBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogSWYgY29ubmVjdGlvbiBuYW1lIGlzIG5vdCBnaXZlbiB0aGVuIGl0IHdpbGwgZ2V0IGEgZGVmYXVsdCBjb25uZWN0aW9uLlxuICAgICAqIFRocm93cyBlcnJvciBpZiBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgd2FzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkgeyBuYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25NYXAuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3IobmFtZSk7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBjb25uZWN0aW9uIG9wdGlvbnMgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgbWFuYWdlci5cbiAgICAgKiBDb25uZWN0aW9uIHdvbid0IGJlIGVzdGFibGlzaGVkLCB5b3UnbGwgbmVlZCB0byBtYW51YWxseSBjYWxsIGNvbm5lY3QgbWV0aG9kIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBjaGVjayBpZiBzdWNoIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICAgIHZhciBleGlzdENvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25NYXAuZ2V0KG9wdGlvbnMubmFtZSB8fCBcImRlZmF1bHRcIik7XG4gICAgICAgIGlmIChleGlzdENvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGlmIGNvbm5lY3Rpb24gaXMgcmVnaXN0ZXJlZCBhbmQgaXRzIG5vdCBjbG9zZWQgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKGV4aXN0Q29ubmVjdGlvbi5pc0Nvbm5lY3RlZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvcihvcHRpb25zLm5hbWUgfHwgXCJkZWZhdWx0XCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uXG4gICAgICAgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbk1hcC5zZXQoY29ubmVjdGlvbi5uYW1lLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk1hbmFnZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbk1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGltcG9ydENsYXNzZXNGcm9tRGlyZWN0b3JpZXMgfSBmcm9tIFwiLi4vdXRpbC9EaXJlY3RvcnlFeHBvcnRlZENsYXNzZXNMb2FkZXJcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IGdldEZyb21Db250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuLi9tZXRhZGF0YS1idWlsZGVyL0VudGl0eU1ldGFkYXRhQnVpbGRlclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi4vZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWFUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG4vKipcbiAqIEJ1aWxkcyBtaWdyYXRpb24gaW5zdGFuY2VzLCBzdWJzY3JpYmVyIGluc3RhbmNlcyBhbmQgZW50aXR5IG1ldGFkYXRhcyBmb3IgdGhlIGdpdmVuIGNsYXNzZXMuXG4gKi9cbnZhciBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBtaWdyYXRpb24gaW5zdGFuY2VzIGZvciB0aGUgZ2l2ZW4gY2xhc3NlcyBvciBkaXJlY3Rvcmllcy5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5idWlsZE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQoT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyhtaWdyYXRpb25zKSwgMiksIG1pZ3JhdGlvbkNsYXNzZXMgPSBfYVswXSwgbWlncmF0aW9uRGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGFsbE1pZ3JhdGlvbkNsYXNzZXMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChtaWdyYXRpb25DbGFzc2VzKSwgZmFsc2UpLCBfX3JlYWQoaW1wb3J0Q2xhc3Nlc0Zyb21EaXJlY3Rvcmllcyh0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLCBtaWdyYXRpb25EaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBhbGxNaWdyYXRpb25DbGFzc2VzLm1hcChmdW5jdGlvbiAobWlncmF0aW9uQ2xhc3MpIHsgcmV0dXJuIGdldEZyb21Db250YWluZXIobWlncmF0aW9uQ2xhc3MpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBzdWJzY3JpYmVyIGluc3RhbmNlcyBmb3IgdGhlIGdpdmVuIGNsYXNzZXMgb3IgZGlyZWN0b3JpZXMuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuYnVpbGRTdWJzY3JpYmVycyA9IGZ1bmN0aW9uIChzdWJzY3JpYmVycykge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQoT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyhzdWJzY3JpYmVycyB8fCBbXSksIDIpLCBzdWJzY3JpYmVyQ2xhc3NlcyA9IF9hWzBdLCBzdWJzY3JpYmVyRGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGFsbFN1YnNjcmliZXJDbGFzc2VzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3Vic2NyaWJlckNsYXNzZXMpLCBmYWxzZSksIF9fcmVhZChpbXBvcnRDbGFzc2VzRnJvbURpcmVjdG9yaWVzKHRoaXMuY29ubmVjdGlvbi5sb2dnZXIsIHN1YnNjcmliZXJEaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKClcbiAgICAgICAgICAgIC5maWx0ZXJTdWJzY3JpYmVycyhhbGxTdWJzY3JpYmVyQ2xhc3NlcylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBnZXRGcm9tQ29udGFpbmVyKG1ldGFkYXRhLnRhcmdldCk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZSBnaXZlbiBjbGFzc2VzIG9yIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkRW50aXR5TWV0YWRhdGFzID0gZnVuY3Rpb24gKGVudGl0aWVzKSB7XG4gICAgICAgIC8vIHRvZG86IGluc3RlYWQgd2UgbmVlZCB0byBtZXJnZSBtdWx0aXBsZSBtZXRhZGF0YSBhcmdzIHN0b3JhZ2VzXG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChPcm1VdGlscy5zcGxpdENsYXNzZXNBbmRTdHJpbmdzKGVudGl0aWVzIHx8IFtdKSwgMiksIGVudGl0eUNsYXNzZXNPclNjaGVtYXMgPSBfYVswXSwgZW50aXR5RGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGVudGl0eUNsYXNzZXMgPSBlbnRpdHlDbGFzc2VzT3JTY2hlbWFzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHsgcmV0dXJuIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkgPT09IGZhbHNlOyB9KTtcbiAgICAgICAgdmFyIGVudGl0eVNjaGVtYXMgPSBlbnRpdHlDbGFzc2VzT3JTY2hlbWFzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHsgcmV0dXJuIGVudGl0eUNsYXNzIGluc3RhbmNlb2YgRW50aXR5U2NoZW1hOyB9KTtcbiAgICAgICAgdmFyIGFsbEVudGl0eUNsYXNzZXMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChlbnRpdHlDbGFzc2VzKSwgZmFsc2UpLCBfX3JlYWQoaW1wb3J0Q2xhc3Nlc0Zyb21EaXJlY3Rvcmllcyh0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLCBlbnRpdHlEaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIGFsbEVudGl0eUNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGVudGl0eVNjaGVtYXMucHVzaChlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZGVjb3JhdG9yRW50aXR5TWV0YWRhdGFzID0gbmV3IEVudGl0eU1ldGFkYXRhQnVpbGRlcih0aGlzLmNvbm5lY3Rpb24sIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKSkuYnVpbGQoYWxsRW50aXR5Q2xhc3Nlcyk7XG4gICAgICAgIHZhciBtZXRhZGF0YUFyZ3NTdG9yYWdlRnJvbVNjaGVtYSA9IG5ldyBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShlbnRpdHlTY2hlbWFzKTtcbiAgICAgICAgdmFyIHNjaGVtYUVudGl0eU1ldGFkYXRhcyA9IG5ldyBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIodGhpcy5jb25uZWN0aW9uLCBtZXRhZGF0YUFyZ3NTdG9yYWdlRnJvbVNjaGVtYSkuYnVpbGQoKTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGRlY29yYXRvckVudGl0eU1ldGFkYXRhcyksIGZhbHNlKSwgX19yZWFkKHNjaGVtYUVudGl0eU1ldGFkYXRhcyksIGZhbHNlKTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogQ29udGFpbmVyIHRvIGJlIHVzZWQgYnkgdGhpcyBsaWJyYXJ5IGZvciBpbnZlcnNpb24gY29udHJvbC4gSWYgY29udGFpbmVyIHdhcyBub3QgaW1wbGljaXRseSBzZXQgdGhlbiBieSBkZWZhdWx0XG4gKiBjb250YWluZXIgc2ltcGx5IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLlxuICovXG52YXIgZGVmYXVsdENvbnRhaW5lciA9IG5ldyAoLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGNsYXNzXzEoKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgfVxuICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzb21lQ2xhc3MpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZmluZChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS50eXBlID09PSBzb21lQ2xhc3M7IH0pO1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHsgdHlwZTogc29tZUNsYXNzLCBvYmplY3Q6IG5ldyBzb21lQ2xhc3MoKSB9O1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm9iamVjdDtcbiAgICB9O1xuICAgIHJldHVybiBjbGFzc18xO1xufSgpKSkoKTtcbnZhciB1c2VyQ29udGFpbmVyO1xudmFyIHVzZXJDb250YWluZXJPcHRpb25zO1xuLyoqXG4gKiBTZXRzIGNvbnRhaW5lciB0byBiZSB1c2VkIGJ5IHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRhaW5lcihpb2NDb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICB1c2VyQ29udGFpbmVyID0gaW9jQ29udGFpbmVyO1xuICAgIHVzZXJDb250YWluZXJPcHRpb25zID0gb3B0aW9ucztcbn1cbi8qKlxuICogR2V0cyB0aGUgSU9DIGNvbnRhaW5lciB1c2VkIGJ5IHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21Db250YWluZXIoc29tZUNsYXNzKSB7XG4gICAgaWYgKHVzZXJDb250YWluZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHVzZXJDb250YWluZXIuZ2V0KHNvbWVDbGFzcyk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKCF1c2VyQ29udGFpbmVyT3B0aW9ucyB8fCAhdXNlckNvbnRhaW5lck9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKCF1c2VyQ29udGFpbmVyT3B0aW9ucyB8fCAhdXNlckNvbnRhaW5lck9wdGlvbnMuZmFsbGJhY2tPbkVycm9ycylcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdENvbnRhaW5lci5nZXQoc29tZUNsYXNzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGNoZWNrLlxuICogQ2FuIGJlIHVzZWQgb24gZW50aXR5IHByb3BlcnR5IG9yIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgY2hlY2tzIHdpdGggY29tcG9zaXRlIGNvbHVtbnMgd2hlbiB1c2VkIG9uIGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrKG5hbWVPckV4cHJlc3Npb24sIG1heWJlRXhwcmVzc2lvbikge1xuICAgIHZhciBuYW1lID0gbWF5YmVFeHByZXNzaW9uID8gbmFtZU9yRXhwcmVzc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IG1heWJlRXhwcmVzc2lvbiA/IG1heWJlRXhwcmVzc2lvbiA6IG5hbWVPckV4cHJlc3Npb247XG4gICAgaWYgKCFleHByZXNzaW9uKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2hlY2sgZXhwcmVzc2lvbiBpcyByZXF1aXJlZFwiKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNsc09yT2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogcHJvcGVydHlOYW1lID8gY2xzT3JPYmplY3QuY29uc3RydWN0b3IgOiBjbHNPck9iamVjdCxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoZWNrLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG4vKipcbiAqIFVzZWQgdG8gZGVjbGFyZSBhIGNsYXNzIGFzIGEgY3VzdG9tIHJlcG9zaXRvcnkuXG4gKiBDdXN0b20gcmVwb3NpdG9yeSBjYW4gbWFuYWdlIHNvbWUgc3BlY2lmaWMgZW50aXR5IG9yIGp1c3QgYmUgZ2VuZXJpYy5cbiAqIEN1c3RvbSByZXBvc2l0b3J5IG9wdGlvbmFsbHkgY2FuIGV4dGVuZCBBYnN0cmFjdFJlcG9zaXRvcnksIFJlcG9zaXRvcnkgb3IgVHJlZVJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHlSZXBvc2l0b3J5KGVudGl0eSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlSZXBvc2l0b3JpZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGV4Y2x1c2lvbi5cbiAqIENhbiBiZSB1c2VkIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgZXhjbHVzaW9ucyB3aXRoIGNvbXBvc2l0ZSBjb2x1bW5zIHdoZW4gdXNlZCBvbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeGNsdXNpb24obmFtZU9yRXhwcmVzc2lvbiwgbWF5YmVFeHByZXNzaW9uKSB7XG4gICAgdmFyIG5hbWUgPSBtYXliZUV4cHJlc3Npb24gPyBuYW1lT3JFeHByZXNzaW9uIDogdW5kZWZpbmVkO1xuICAgIHZhciBleHByZXNzaW9uID0gbWF5YmVFeHByZXNzaW9uID8gbWF5YmVFeHByZXNzaW9uIDogbmFtZU9yRXhwcmVzc2lvbjtcbiAgICBpZiAoIWV4cHJlc3Npb24pXG4gICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFeGNsdXNpb24gZXhwcmVzc2lvbiBpcyByZXF1aXJlZFwiKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNsc09yT2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmV4Y2x1c2lvbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHByb3BlcnR5TmFtZSA/IGNsc09yT2JqZWN0LmNvbnN0cnVjdG9yIDogY2xzT3JPYmplY3QsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeGNsdXNpb24uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBjb2x1bW4gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBvbiBlbnRpdHkgaW5zZXJ0aW9uLlxuICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGdlbmVyYXRpb24gc3RyYXRlZ3kgLSBpbmNyZW1lbnQsIHV1aWQgYW5kIHJvd2lkIChjb2Nrcm9hY2hkYiBvbmx5KS5cbiAqIEluY3JlbWVudCB1c2VzIGEgbnVtYmVyIHdoaWNoIGluY3JlYXNlcyBieSBvbmUgb24gZWFjaCBpbnNlcnRpb24uXG4gKiBVdWlkIGdlbmVyYXRlcyBhIHNwZWNpYWwgVVVJRCB0b2tlbi5cbiAqIFJvd2lkIHN1cHBvcnRzIG9ubHkgaW4gQ29ja3JvYWNoREIgYW5kIHVzZXMgYHVuaXF1ZV9yb3dpZCgpYCBmdW5jdGlvblxuICpcbiAqIE5vdGUsIHNvbWUgZGF0YWJhc2VzIGRvIG5vdCBzdXBwb3J0IG5vbi1wcmltYXJ5IGdlbmVyYXRpb24gY29sdW1ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdlbmVyYXRlZChzdHJhdGVneSkge1xuICAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7IHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjsgfVxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZW5lcmF0ZWQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGluZGV4LlxuICogQ2FuIGJlIHVzZWQgb24gZW50aXR5IHByb3BlcnR5IG9yIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgaW5kaWNlcyB3aXRoIGNvbXBvc2l0ZSBjb2x1bW5zIHdoZW4gdXNlZCBvbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJbmRleChuYW1lT3JGaWVsZHNPck9wdGlvbnMsIG1heWJlRmllbGRzT3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckZpZWxkc09yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG5hbWVPckZpZWxkc09yT3B0aW9ucyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZmllbGRzID0gdHlwZW9mIG5hbWVPckZpZWxkc09yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG1heWJlRmllbGRzT3JPcHRpb25zIDogbmFtZU9yRmllbGRzT3JPcHRpb25zO1xuICAgIHZhciBvcHRpb25zID0gKHR5cGVvZiBuYW1lT3JGaWVsZHNPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobmFtZU9yRmllbGRzT3JPcHRpb25zKSkgPyBuYW1lT3JGaWVsZHNPck9wdGlvbnMgOiBtYXliZU9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBtYXliZUZpZWxkc09yT3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShtYXliZUZpZWxkc09yT3B0aW9ucykpID8gbWF5YmVGaWVsZHNPck9wdGlvbnMgOiBtYXliZU9wdGlvbnM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjbHNPck9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5pbmRpY2VzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBwcm9wZXJ0eU5hbWUgPyBjbHNPck9iamVjdC5jb25zdHJ1Y3RvciA6IGNsc09yT2JqZWN0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHByb3BlcnR5TmFtZSA/IFtwcm9wZXJ0eU5hbWVdIDogZmllbGRzLFxuICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMgJiYgb3B0aW9ucy5zeW5jaHJvbml6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUsXG4gICAgICAgICAgICB3aGVyZTogb3B0aW9ucyA/IG9wdGlvbnMud2hlcmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1bmlxdWU6IG9wdGlvbnMgJiYgb3B0aW9ucy51bmlxdWUgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICBzcGF0aWFsOiBvcHRpb25zICYmIG9wdGlvbnMuc3BhdGlhbCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGZ1bGx0ZXh0OiBvcHRpb25zICYmIG9wdGlvbnMuZnVsbHRleHQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZXI6IG9wdGlvbnMgPyBvcHRpb25zLnBhcnNlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNwYXJzZTogb3B0aW9ucyAmJiBvcHRpb25zLnNwYXJzZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5iYWNrZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgZXhwaXJlQWZ0ZXJTZWNvbmRzOiBvcHRpb25zID8gb3B0aW9ucy5leHBpcmVBZnRlclNlY29uZHMgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ29tcG9zaXRlIHVuaXF1ZSBjb25zdHJhaW50IG11c3QgYmUgc2V0IG9uIGVudGl0eSBjbGFzc2VzIGFuZCBtdXN0IHNwZWNpZnkgZW50aXR5J3MgZmllbGRzIHRvIGJlIHVuaXF1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVuaXF1ZShuYW1lT3JGaWVsZHMsIG1heWJlRmllbGRzKSB7XG4gICAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZU9yRmllbGRzID09PSBcInN0cmluZ1wiID8gbmFtZU9yRmllbGRzIDogdW5kZWZpbmVkO1xuICAgIHZhciBmaWVsZHMgPSB0eXBlb2YgbmFtZU9yRmllbGRzID09PSBcInN0cmluZ1wiID8gbWF5YmVGaWVsZHMgOiBuYW1lT3JGaWVsZHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjbHNPck9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHZhciBjb2x1bW5zID0gZmllbGRzO1xuICAgICAgICBpZiAocHJvcGVydHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIChwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IFtwcm9wZXJ0eU5hbWUudG9TdHJpbmcoKV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiBwcm9wZXJ0eU5hbWUgPyBjbHNPck9iamVjdC5jb25zdHJ1Y3RvciA6IGNsc09yT2JqZWN0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIH07XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goYXJncyk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yXCI7XG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKHR5cGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHwgdHlwZU9yT3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gdHlwZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgICAgIHZhciByZWZsZWN0TWV0YWRhdGFUeXBlID0gUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICAgICAgICAgIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSlcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IHR5cGU7XG4gICAgICAgIC8vIHNwZWNpZnkgSFNUT1JFIHR5cGUgaWYgY29sdW1uIGlzIEhTVE9SRVxuICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSBcImhzdG9yZVwiICYmICFvcHRpb25zLmhzdG9yZVR5cGUpXG4gICAgICAgICAgICBvcHRpb25zLmhzdG9yZVR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBPYmplY3QgPyBcIm9iamVjdFwiIDogXCJzdHJpbmdcIjtcbiAgICAgICAgaWYgKHR5cGVPck9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgeyAvLyByZWdpc3RlciBhbiBlbWJlZGRlZFxuICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVtYmVkZGVkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICBpc0FycmF5OiByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBBcnJheSB8fCBvcHRpb25zLmFycmF5ID09PSB0cnVlLFxuICAgICAgICAgICAgICAgIHByZWZpeDogb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZml4IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGVPck9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyByZWdpc3RlciBhIHJlZ3VsYXIgY29sdW1uXG4gICAgICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnVuaXF1ZXMucHVzaCh7IHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLCBjb2x1bW5zOiBbcHJvcGVydHlOYW1lXSB9KTtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIG1vZGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCIgPyBvcHRpb25zLmdlbmVyYXRlZCA6IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGEgY3JlYXRpb24gZGF0ZSBvZiB0aGUgaW5zZXJ0ZWQgb2JqZWN0LlxuICogQ3JlYXRpb24gZGF0ZSBpcyBnZW5lcmF0ZWQgYW5kIGluc2VydGVkIG9ubHkgb25jZSxcbiAqIGF0IHRoZSBmaXJzdCB0aW1lIHdoZW4geW91IGNyZWF0ZSBhbiBvYmplY3QsIHRoZSB2YWx1ZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSB0YWJsZSwgYW5kIGlzIG5ldmVyIHRvdWNoZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwiY3JlYXRlRGF0ZVwiLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DcmVhdGVEYXRlQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIFRoaXMgY29sdW1uIHdpbGwgc3RvcmUgYSBkZWxldGUgZGF0ZSBvZiB0aGUgc29mdC1kZWxldGVkIG9iamVjdC5cbiAqIFRoaXMgZGF0ZSBpcyBiZWluZyB1cGRhdGVkIGVhY2ggdGltZSB5b3Ugc29mdC1kZWxldGUgdGhlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlbGV0ZURhdGVDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJkZWxldGVEYXRlXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZURhdGVDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogU3BlY2lhbCB0eXBlIG9mIGNvbHVtbiB0aGF0IGlzIGF2YWlsYWJsZSBvbmx5IGZvciBNb25nb0RCIGRhdGFiYXNlLlxuICogTWFya3MgeW91ciBlbnRpdHkncyBjb2x1bW4gdG8gYmUgYW4gb2JqZWN0IGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2JqZWN0SWRDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gaWYgY29sdW1uIG9wdGlvbnMgYXJlIG5vdCBnaXZlbiB0aGVuIGNyZWF0ZSBhIG5ldyBlbXB0eSBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFvcHRpb25zLm5hbWUpXG4gICAgICAgICAgICBvcHRpb25zLm5hbWUgPSBcIl9pZFwiO1xuICAgICAgICAvLyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGEgbmV3IGNvbHVtbiBtZXRhZGF0YVxuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcIm9iamVjdElkXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9iamVjdElkQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yXCI7XG5pbXBvcnQgeyBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1ByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3JcIjtcbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKHR5cGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHR5cGVPck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgICB2YXIgcmVmbGVjdE1ldGFkYXRhVHlwZSA9IFJlZmxlY3QgJiYgUmVmbGVjdC5nZXRNZXRhZGF0YSA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHR5cGUgaW4gY29sdW1uIG9wdGlvbnMgdGhlbiBzZXQgdHlwZSBmcm9tIGZpcnN0IGZ1bmN0aW9uIGFyZ3VtZW50LCBvciBndWVzc2VkIG9uZVxuICAgICAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKVxuICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgICAgICBpZiAob3B0aW9ucy5udWxsYWJsZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG4gICAgICAgIC8vIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBuZXcgY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6IHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuZ2VuZXJhdGVkIDogXCJpbmNyZW1lbnRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmltYXJ5Q29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihzdHJhdGVneU9yT3B0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIHZhciBzdHJhdGVneTtcbiAgICBpZiAoc3RyYXRlZ3lPck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHJhdGVneU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHN0cmF0ZWd5ID0gc3RyYXRlZ3lPck9wdGlvbnM7XG4gICAgICAgIGlmIChzdHJhdGVneU9yT3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICB9XG4gICAgaWYgKG1heWJlT3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBzdHJhdGVneSA9PT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJyb3dpZFwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgICAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuICAgICAgICAvLyByZWdpc3RlciBjb2x1bW4gbWV0YWRhdGEgYXJnc1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcInJlZ3VsYXJcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBzdHJhdGVneTogc3RyYXRlZ3lcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpbWFyeUdlbmVyYXRlZENvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGFuIHVwZGF0ZSBkYXRlIG9mIHRoZSB1cGRhdGVkIG9iamVjdC5cbiAqIFRoaXMgZGF0ZSBpcyBiZWluZyB1cGRhdGVkIGVhY2ggdGltZSB5b3UgcGVyc2lzdCB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcInVwZGF0ZURhdGVcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMgPyBvcHRpb25zIDoge31cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXBkYXRlRGF0ZUNvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGEgbnVtYmVyIC0gdmVyc2lvbiBvZiB0aGUgZW50aXR5LlxuICogRXZlcnkgdGltZSB5b3VyIGVudGl0eSB3aWxsIGJlIHBlcnNpc3RlZCwgdGhpcyBudW1iZXIgd2lsbCBiZSBpbmNyZWFzZWQgYnkgb25lIC1cbiAqIHNvIHlvdSBjYW4gb3JnYW5pemUgdmlzaW9uaW5nIGFuZCB1cGRhdGUgc3RyYXRlZ2llcyBvZiB5b3VyIGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZlcnNpb25Db2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJ2ZXJzaW9uXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZlcnNpb25Db2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVmlld0NvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB2aWV3IGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZpZXdDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJyZWd1bGFyXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSB2aWV3LlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVmlld0VudGl0eShuYW1lT3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICB2YXIgb3B0aW9ucyA9ICh0eXBlb2YgbmFtZU9yT3B0aW9ucyA9PT0gXCJvYmplY3RcIiA/IG5hbWVPck9wdGlvbnMgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBvcHRpb25zLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBkZXBlbmRzT246IG9wdGlvbnMuZGVwZW5kc09uID8gbmV3IFNldChvcHRpb25zLmRlcGVuZHNPbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0eXBlOiBcInZpZXdcIixcbiAgICAgICAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogISFvcHRpb25zLm1hdGVyaWFsaXplZFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3RW50aXR5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIFNwZWNpYWwgdHlwZSBvZiB0aGUgdGFibGUgdXNlZCBpbiB0aGUgc2luZ2xlLXRhYmxlIGluaGVyaXRlZCB0YWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDaGlsZEVudGl0eShkaXNjcmltaW5hdG9yVmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAvLyByZWdpc3RlciBhIHRhYmxlIG1ldGFkYXRhXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIHR5cGU6IFwiZW50aXR5LWNoaWxkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZWdpc3RlciBkaXNjcmltaW5hdG9yIHZhbHVlIGlmIGl0IHdhcyBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGRpc2NyaW1pbmF0b3JWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5kaXNjcmltaW5hdG9yVmFsdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkaXNjcmltaW5hdG9yVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hpbGRFbnRpdHkuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWVPck9wdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgIHZhciBvcHRpb25zID0gKHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcIm9iamVjdFwiID8gbmFtZU9yT3B0aW9ucyA6IG1heWJlT3B0aW9ucykgfHwge307XG4gICAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG5hbWVPck9wdGlvbnMgOiBvcHRpb25zLm5hbWU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHR5cGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgb3JkZXJCeTogb3B0aW9ucy5vcmRlckJ5ID8gb3B0aW9ucy5vcmRlckJ5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5naW5lOiBvcHRpb25zLmVuZ2luZSA/IG9wdGlvbnMuZW5naW5lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IG9wdGlvbnMuZGF0YWJhc2UgPyBvcHRpb25zLmRhdGFiYXNlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSA/IG9wdGlvbnMuc2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMuc3luY2hyb25pemUsXG4gICAgICAgICAgICB3aXRob3V0Um93aWQ6IG9wdGlvbnMud2l0aG91dFJvd2lkXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBTZXRzIGZvciBlbnRpdHkgdG8gdXNlIHRhYmxlIGluaGVyaXRhbmNlIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUYWJsZUluaGVyaXRhbmNlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuaW5oZXJpdGFuY2VzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICBwYXR0ZXJuOiBvcHRpb25zICYmIG9wdGlvbnMucGF0dGVybiA/IG9wdGlvbnMucGF0dGVybiA6IFwiU1RJXCIsXG4gICAgICAgICAgICBjb2x1bW46IG9wdGlvbnMgJiYgb3B0aW9ucy5jb2x1bW4gPyB0eXBlb2Ygb3B0aW9ucy5jb2x1bW4gPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IG9wdGlvbnMuY29sdW1uIH0gOiBvcHRpb25zLmNvbHVtbiA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUluaGVyaXRhbmNlLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyVHlwZXMgfSBmcm9tIFwiLi4vLi4vbWV0YWRhdGEvdHlwZXMvRXZlbnRMaXN0ZW5lclR5cGVzXCI7XG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIHdoaWNoIHRoaXMgZGVjb3JhdG9yIGlzIGFwcGxpZWQgYWZ0ZXIgdGhpcyBlbnRpdHkgaW5zZXJ0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJJbnNlcnQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9JTlNFUlRcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWZ0ZXJJbnNlcnQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciBlbnRpdHkgaXMgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJMb2FkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfTE9BRFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZnRlckxvYWQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciB0aGlzIGVudGl0eSByZW1vdmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJSZW1vdmUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9SRU1PVkVcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWZ0ZXJSZW1vdmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciB0aGlzIGVudGl0eSB1cGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBZnRlclVwZGF0ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlMaXN0ZW5lcnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdHlwZTogRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX1VQREFURVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZnRlclVwZGF0ZS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiB3aGljaCB0aGlzIGRlY29yYXRvciBpcyBhcHBsaWVkIGJlZm9yZSB0aGlzIGVudGl0eSBpbnNlcnRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCZWZvcmVJbnNlcnQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfSU5TRVJUXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJlZm9yZUluc2VydC5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiB3aGljaCB0aGlzIGRlY29yYXRvciBpcyBhcHBsaWVkIGJlZm9yZSB0aGlzIGVudGl0eSByZW1vdmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQmVmb3JlUmVtb3ZlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX1JFTU9WRVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CZWZvcmVSZW1vdmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBiZWZvcmUgdGhpcyBlbnRpdHkgdXBkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQmVmb3JlVXBkYXRlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX1VQREFURVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CZWZvcmVVcGRhdGUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGxpc3RlbiB0byBPUk0gZXZlbnRzIGFuZCB0aGVpciBtZXRob2RzIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gZXZlbnRcbiAqIG9jY3Vycy4gVGhvc2UgY2xhc3NlcyBtdXN0IGltcGxlbWVudCBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRXZlbnRTdWJzY3JpYmVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlTdWJzY3JpYmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50U3Vic2NyaWJlci5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29sdW1uT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW50aXR5T3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5kZXhPcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luQ29sdW1uT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Sm9pblRhYmxlT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25PcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WYWx1ZVRyYW5zZm9ybWVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEpvaW5Db2x1bW4gZGVjb3JhdG9yIHVzZWQgb24gb25lLXRvLW9uZSByZWxhdGlvbnMgdG8gc3BlY2lmeSBvd25lciBzaWRlIG9mIHJlbGF0aW9uc2hpcC5cbiAqIEl0IGFsc28gY2FuIGJlIHVzZWQgb24gYm90aCBvbmUtdG8tb25lIGFuZCBtYW55LXRvLW9uZSByZWxhdGlvbnMgdG8gc3BlY2lmeSBjdXN0b20gY29sdW1uIG5hbWVcbiAqIG9yIGN1c3RvbSByZWZlcmVuY2VkIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEpvaW5Db2x1bW4ob3B0aW9uc09yT3B0aW9uc0FycmF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9uc09yT3B0aW9uc0FycmF5KSA/IG9wdGlvbnNPck9wdGlvbnNBcnJheSA6IFtvcHRpb25zT3JPcHRpb25zQXJyYXkgfHwge31dO1xuICAgICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5qb2luQ29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbk5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEpvaW5UYWJsZSBkZWNvcmF0b3IgaXMgdXNlZCBpbiBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwIHRvIHNwZWNpZnkgb3duZXIgc2lkZSBvZiByZWxhdGlvbnNoaXAuXG4gKiBJdHMgYWxzbyB1c2VkIHRvIHNldCBhIGN1c3RvbSBqdW5jdGlvbiB0YWJsZSdzIG5hbWUsIGNvbHVtbiBuYW1lcyBhbmQgcmVmZXJlbmNlZCBjb2x1bW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSm9pblRhYmxlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICBqb2luQ29sdW1uczogKG9wdGlvbnMgJiYgb3B0aW9ucy5qb2luQ29sdW1uID8gW29wdGlvbnMuam9pbkNvbHVtbl0gOiBvcHRpb25zLmpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uczogKG9wdGlvbnMgJiYgb3B0aW9ucy5pbnZlcnNlSm9pbkNvbHVtbiA/IFtvcHRpb25zLmludmVyc2VKb2luQ29sdW1uXSA6IG9wdGlvbnMuaW52ZXJzZUpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucyAmJiBvcHRpb25zLnNjaGVtYSA/IG9wdGlvbnMuc2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IG9wdGlvbnMgJiYgb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpvaW5UYWJsZS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBpbnZlcnNlU2lkZVByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgaW52ZXJzZVNpZGVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0aW9ucyA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhKSB7IC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICAgICAgICB2YXIgcmVmbGVjdGVkVHlwZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICBpZiAocmVmbGVjdGVkVHlwZSAmJiB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIilcbiAgICAgICAgICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tbWFueVwiLFxuICAgICAgICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICAgICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgICAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hbnlUb01hbnkuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICB2YXIgaW52ZXJzZVNpZGVQcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGludmVyc2VTaWRlT3JPcHRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG9wdGlvbnMgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1vbmVcIixcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICAgICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYW55VG9PbmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQSBvbmUtdG8tbWFueSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MixcbiAqIGJ1dCBFbnRpdHkyIGhhcyBvbmx5IG9uZSBFbnRpdHkxLiBFbnRpdHkyIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZiBFbnRpdHkxIG9uIGl0c1xuICogc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnkodHlwZUZ1bmN0aW9uT3JUYXJnZXQsIGludmVyc2VTaWRlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgICAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICAgICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lVG9NYW55LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRvIGNyZWF0ZSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGF2ZSBvbmx5IG9uZSBFbnRpdHkyLlxuICogRW50aXR5MSBpcyBhbiBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmFnZXMgRW50aXR5MSBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBpbnZlcnNlU2lkZVByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgaW52ZXJzZVNpZGVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0aW9ucyA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgICAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICAgICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgICAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZVRvT25lLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEhvbGRzIGEgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoZSBjbG9zdXJlIHRhYmxlIG9mIHRoZSBjb2x1bW4uXG4gKlxuICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIGRlY29yYXRvciwgaXQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB2ZXJzaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gUmVsYXRpb25Db3VudChyZWxhdGlvbiwgYWxpYXMsIHF1ZXJ5QnVpbGRlckZhY3RvcnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5yZWxhdGlvbkNvdW50cy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24sXG4gICAgICAgICAgICBhbGlhczogYWxpYXMsXG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXJGYWN0b3J5OiBxdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogU3BlY2lhbCBkZWNvcmF0b3IgdXNlZCB0byBleHRyYWN0IHJlbGF0aW9uIGlkIGludG8gc2VwYXJhdGUgZW50aXR5IHByb3BlcnR5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbGF0aW9uSWQocmVsYXRpb24sIGFsaWFzLCBxdWVyeUJ1aWxkZXJGYWN0b3J5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkucmVsYXRpb25JZHMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgcmVsYXRpb246IHJlbGF0aW9uLFxuICAgICAgICAgICAgYWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogcXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbklkLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb25nb1JlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vcmVwb3NpdG9yeS9Nb25nb1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFRyZWVSZXBvc2l0b3J5IH0gZnJvbSBcIi4uLy4uL3JlcG9zaXRvcnkvVHJlZVJlcG9zaXRvcnlcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvbihjb25uZWN0aW9uT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBtZXRob2QgLSB3ZSBnb25uYSBuZWVkIGl0XG4gICAgICAgIHZhciBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgIC8vIG92ZXJyaWRlIG1ldGhvZCBkZXNjcmlwdG9yIHdpdGggcHJveHkgbWV0aG9kXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7XG4gICAgICAgICAgICB2YXIgaXNvbGF0aW9uTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbk9yT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbk9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25Pck9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbk9yT3B0aW9ucy5jb25uZWN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uT3JPcHRpb25zLmNvbm5lY3Rpb25OYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uT3JPcHRpb25zLmlzb2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwgPSBjb25uZWN0aW9uT3JPcHRpb25zLmlzb2xhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0cmFuc2FjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKGVudGl0eU1hbmFnZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJnc1dpdGhJbmplY3RlZFRyYW5zYWN0aW9uTWFuYWdlckFuZFJlcG9zaXRvcmllcztcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgYWxsIEBUcmFuc2FjdGlvbk1hbmFnZXIoKSBhbmQgQFRyYW5zYWN0aW9uUmVwb3NpdG9yeSgpIGRlY29yYXRvciB1c2FnZXMgZm9yIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlck1ldGFkYXRhcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyVHJhbnNhY3Rpb25FbnRpdHlNYW5hZ2Vycyh0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyVHJhbnNhY3Rpb25SZXBvc2l0b3J5KHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgQFRyYW5zYWN0aW9uTWFuYWdlcigpIGRlY29yYXRvciB1c2FnZXMgdGhlIGluamVjdCB0aGVtXG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlck1ldGFkYXRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncyksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBtZXRob2QgcGFyYW1zIHdpdGggaW5qZWN0aW9uIG9mIHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMuc3BsaWNlKG1ldGFkYXRhLmluZGV4LCAwLCBlbnRpdHlNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcy5sZW5ndGggPT09IDApIHsgLy8gb3RoZXJ3aXNlIGlmIHRoZXJlJ3Mgbm8gdHJhbnNhY3Rpb24gcmVwb3NpdG9yaWVzIGluIHVzZSwgaW5qZWN0IGl0IGFzIGEgZmlyc3QgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMgPSBfX3NwcmVhZEFycmF5KFtlbnRpdHlNYW5hZ2VyXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdzV2l0aEluamVjdGVkVHJhbnNhY3Rpb25NYW5hZ2VyQW5kUmVwb3NpdG9yaWVzID0gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZvciBldmVyeSB1c2FnZSBvZiBAVHJhbnNhY3Rpb25SZXBvc2l0b3J5IGRlY29yYXRvclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVwb3NpdG9yeUluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXRlY3QgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeSBhbmQgZ2V0IGluc3RhbmNlIGZyb20gdHJhbnNhY3Rpb24gZW50aXR5IG1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXRhZGF0YS5yZXBvc2l0b3J5VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXBvc2l0b3J5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0UmVwb3NpdG9yeShtZXRhZGF0YS5lbnRpdHlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9uZ29SZXBvc2l0b3J5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0TW9uZ29SZXBvc2l0b3J5KG1ldGFkYXRhLmVudGl0eVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmVlUmVwb3NpdG9yeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5SW5zdGFuY2UgPSBlbnRpdHlNYW5hZ2VyLmdldFRyZWVSZXBvc2l0b3J5KG1ldGFkYXRhLmVudGl0eVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IHRoZSBUeXBlT1JNJ3Mgb25lcywgdGhlcmUgbXVzdCBiZSBjdXN0b20gcmVwb3NpdG9yeSBjbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0Q3VzdG9tUmVwb3NpdG9yeShtZXRhZGF0YS5yZXBvc2l0b3J5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBtZXRob2QgcGFyYW0gd2l0aCBpbmplY3Rpb24gb2YgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgICAgICBhcmdzV2l0aEluamVjdGVkVHJhbnNhY3Rpb25NYW5hZ2VyQW5kUmVwb3NpdG9yaWVzLnNwbGljZShtZXRhZGF0YS5pbmRleCwgMCwgcmVwb3NpdG9yeUluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkoX3RoaXMsIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5tYW5hZ2VyLnRyYW5zYWN0aW9uKGlzb2xhdGlvbkxldmVsLCB0cmFuc2FjdGlvbkNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5tYW5hZ2VyLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zYWN0aW9uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEluamVjdHMgdHJhbnNhY3Rpb24ncyBlbnRpdHkgbWFuYWdlciBpbnRvIHRoZSBtZXRob2Qgd3JhcHBlZCB3aXRoIEBUcmFuc2FjdGlvbiBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2FjdGlvbk1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvclwiO1xuLyoqXG4gKiBJbmplY3RzIHRyYW5zYWN0aW9uJ3MgcmVwb3NpdG9yeSBpbnRvIHRoZSBtZXRob2Qgd3JhcHBlZCB3aXRoIEBUcmFuc2FjdGlvbiBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvblJlcG9zaXRvcnkoZW50aXR5VHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgICAvLyBnZXQgcmVwb3NpdG9yeSB0eXBlXG4gICAgICAgIHZhciByZXBvc2l0b3J5VHlwZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlUeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIG9iamVjdCwgbWV0aG9kTmFtZSlbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RSZWZsZWN0TWV0aG9kUGFyYW1ldGVyVHlwZUVycm9yKG9iamVjdC5jb25zdHJ1Y3RvciwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRyYW5zYWN0aW9uUmVwb3NpdG9yaWVzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgcmVwb3NpdG9yeVR5cGU6IHJlcG9zaXRvcnlUeXBlLFxuICAgICAgICAgICAgZW50aXR5VHlwZTogZW50aXR5VHlwZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25SZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIE1hcmtzIGVudGl0eSB0byB3b3JrIGxpa2UgYSB0cmVlLlxuICogVHJlZSBwYXR0ZXJuIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdHJlZSBlbnRpdHkgc2hvdWxkIGJlIHNwZWNpZmllZC5cbiAqIEBUcmVlUGFyZW50IGRlY29yYXRvciBtdXN0IGJlIHVzZWQgaW4gdHJlZSBlbnRpdGllcy5cbiAqIFRyZWVSZXBvc2l0b3J5IGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgd2l0aCB0cmVlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVHJlZSh0eXBlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRyZWVzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgb3B0aW9uczogdHlwZSA9PT0gXCJjbG9zdXJlLXRhYmxlXCIgPyBvcHRpb25zIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBlbnRpdHkgcHJvcGVydHkgYXMgYSBjaGlsZHJlbiBvZiB0aGUgdHJlZS5cbiAqIFwiVHJlZSBjaGlsZHJlblwiIHdpbGwgY29udGFpbiBhbGwgY2hpbGRyZW4gKGJpbmQpIG9mIHRoaXMgZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVHJlZUNoaWxkcmVuKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIHJlZmxlY3RlZFR5cGUgPSBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaXNMYXp5ID0gKHJlZmxlY3RlZFR5cGUgJiYgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCIpIHx8IGZhbHNlO1xuICAgICAgICAvLyBhZGQgb25lLXRvLW1hbnkgcmVsYXRpb24gZm9yIHRoaXNcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlzVHJlZUNoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm9uZS10by1tYW55XCIsXG4gICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmplY3QuY29uc3RydWN0b3I7IH0sXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVDaGlsZHJlbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgXCJsZXZlbFwiL1wibGVuZ3RoXCIgY29sdW1uIHRvIHRoZSB0YWJsZSB0aGF0IGhvbGRzIGEgY2xvc3VyZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRyZWVMZXZlbENvbHVtbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwidHJlZUxldmVsXCIsXG4gICAgICAgICAgICBvcHRpb25zOiB7fVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmVlTGV2ZWxDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBlbnRpdHkgcHJvcGVydHkgYXMgYSBwYXJlbnQgb2YgdGhlIHRyZWUuXG4gKiBcIlRyZWUgcGFyZW50XCIgaW5kaWNhdGVzIHdobyBvd25zIChpcyBhIHBhcmVudCkgb2YgdGhpcyBlbnRpdHkgaW4gdHJlZSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmVlUGFyZW50KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIHJlZmxlY3RlZFR5cGUgPSBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaXNMYXp5ID0gKHJlZmxlY3RlZFR5cGUgJiYgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCIpIHx8IGZhbHNlO1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkucmVsYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgaXNUcmVlUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tb25lXCIsXG4gICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmplY3QuY29uc3RydWN0b3I7IH0sXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVQYXJlbnQuanMubWFwXG4iLCJpbXBvcnQgeyBNaXNzaW5nRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTWlzc2luZ0RyaXZlckVycm9yXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4vbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4vc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4vb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgU3FsaXRlRHJpdmVyIH0gZnJvbSBcIi4vc3FsaXRlL1NxbGl0ZURyaXZlclwiO1xuaW1wb3J0IHsgQ29yZG92YURyaXZlciB9IGZyb20gXCIuL2NvcmRvdmEvQ29yZG92YURyaXZlclwiO1xuaW1wb3J0IHsgUmVhY3ROYXRpdmVEcml2ZXIgfSBmcm9tIFwiLi9yZWFjdC1uYXRpdmUvUmVhY3ROYXRpdmVEcml2ZXJcIjtcbmltcG9ydCB7IE5hdGl2ZXNjcmlwdERyaXZlciB9IGZyb20gXCIuL25hdGl2ZXNjcmlwdC9OYXRpdmVzY3JpcHREcml2ZXJcIjtcbmltcG9ydCB7IFNxbGpzRHJpdmVyIH0gZnJvbSBcIi4vc3FsanMvU3FsanNEcml2ZXJcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4vbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4vcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IEV4cG9Ecml2ZXIgfSBmcm9tIFwiLi9leHBvL0V4cG9Ecml2ZXJcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4vYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgU2FwRHJpdmVyIH0gZnJvbSBcIi4vc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgQmV0dGVyU3FsaXRlM0RyaXZlciB9IGZyb20gXCIuL2JldHRlci1zcWxpdGUzL0JldHRlclNxbGl0ZTNEcml2ZXJcIjtcbmltcG9ydCB7IENhcGFjaXRvckRyaXZlciB9IGZyb20gXCIuL2NhcGFjaXRvci9DYXBhY2l0b3JEcml2ZXJcIjtcbi8qKlxuICogSGVscHMgdG8gY3JlYXRlIGRyaXZlcnMuXG4gKi9cbnZhciBEcml2ZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyaXZlckZhY3RvcnkoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZHJpdmVyIGRlcGVuZCBvbiBhIGdpdmVuIGNvbm5lY3Rpb24ncyBkcml2ZXIgdHlwZS5cbiAgICAgKi9cbiAgICBEcml2ZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgdHlwZSA9IGNvbm5lY3Rpb24ub3B0aW9ucy50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJteXNxbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXlzcWxEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwicG9zdGdyZXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImNvY2tyb2FjaGRiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2Nrcm9hY2hEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwic2FwXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXBEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwibWFyaWFkYlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXlzcWxEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwic3FsaXRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcWxpdGVEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiYmV0dGVyLXNxbGl0ZTNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJldHRlclNxbGl0ZTNEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiY29yZG92YVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29yZG92YURyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJuYXRpdmVzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZXNjcmlwdERyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJyZWFjdC1uYXRpdmVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlYWN0TmF0aXZlRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcInNxbGpzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcWxqc0RyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJvcmFjbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9yYWNsZURyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJtc3NxbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3FsU2VydmVyRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcIm1vbmdvZGJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vbmdvRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImV4cG9cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cG9Ecml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiYXVyb3JhLWRhdGEtYXBpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXJvcmFEYXRhQXBpRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImF1cm9yYS1kYXRhLWFwaS1wZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImNhcGFjaXRvclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FwYWNpdG9yRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RyaXZlckVycm9yKHR5cGUsIFtcbiAgICAgICAgICAgICAgICAgICAgXCJhdXJvcmEtZGF0YS1hcGlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhdXJvcmEtZGF0YS1hcGktcGdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJiZXR0ZXItc3FsaXRlM1wiLFxuICAgICAgICAgICAgICAgICAgICBcImNhcGFjaXRvclwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvY2tyb2FjaGRiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29yZG92YVwiLFxuICAgICAgICAgICAgICAgICAgICBcImV4cG9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJtYXJpYWRiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibW9uZ29kYlwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1zc3FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibXlzcWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJuYXRpdmVzY3JpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcmFjbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInJlYWN0LW5hdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInNhcFwiLFxuICAgICAgICAgICAgICAgICAgICBcInNxbGl0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInNxbGpzXCIsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEcml2ZXJGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IERyaXZlckZhY3RvcnkgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJpdmVyRmFjdG9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGhhc2gsIHNob3J0ZW4gfSBmcm9tIFwiLi4vdXRpbC9TdHJpbmdVdGlsc1wiO1xuLyoqXG4gKiBDb21tb24gZHJpdmVyIHV0aWxpdHkgZnVuY3Rpb25zLlxuICovXG52YXIgRHJpdmVyVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHJpdmVyVXRpbHMoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBhbmQgYnVpbGRzIGEgbmV3IGRyaXZlciBvcHRpb25zLlxuICAgICAqIEV4dHJhY3RzIHNldHRpbmdzIGZyb20gY29ubmVjdGlvbiB1cmwgYW5kIHNldHMgdG8gYSBuZXcgb3B0aW9ucyBvYmplY3QuXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGREcml2ZXJPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMsIGJ1aWxkT3B0aW9ucykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICAgICAgICB2YXIgdXJsRHJpdmVyT3B0aW9ucyA9IHRoaXMucGFyc2VDb25uZWN0aW9uVXJsKG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIGlmIChidWlsZE9wdGlvbnMgJiYgYnVpbGRPcHRpb25zLnVzZVNpZCAmJiB1cmxEcml2ZXJPcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgICAgICAgICAgICAgdXJsRHJpdmVyT3B0aW9ucy5zaWQgPSB1cmxEcml2ZXJPcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKE9iamVjdC5rZXlzKHVybERyaXZlck9wdGlvbnMpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsRHJpdmVyT3B0aW9uc1trZXldID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdXJsRHJpdmVyT3B0aW9uc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHVybERyaXZlck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGJ1aWxkRHJpdmVyT3B0aW9ucyBmb3IgTW9uZ29kREIgb25seSB0byBzdXBwb3J0IHJlcGxpY2Egc2V0XG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRNb25nb0RCRHJpdmVyT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zLCBidWlsZE9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICAgICAgdmFyIHVybERyaXZlck9wdGlvbnMgPSB0aGlzLnBhcnNlTW9uZ29EQkNvbm5lY3Rpb25Vcmwob3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgaWYgKGJ1aWxkT3B0aW9ucyAmJiBidWlsZE9wdGlvbnMudXNlU2lkICYmIHVybERyaXZlck9wdGlvbnMuZGF0YWJhc2UpIHtcbiAgICAgICAgICAgICAgICB1cmxEcml2ZXJPcHRpb25zLnNpZCA9IHVybERyaXZlck9wdGlvbnMuZGF0YWJhc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXModXJsRHJpdmVyT3B0aW9ucykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxEcml2ZXJPcHRpb25zW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxEcml2ZXJPcHRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgdXJsRHJpdmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSm9pbnMgYW5kIHNob3J0ZW5zIGFsaWFzIGlmIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBhbGlhcyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBsaW1pdCBhbGxvd2VkIGJ5IHRoZSBjdXJyZW50XG4gICAgICogZHJpdmVyLCByZXBsYWNlcyBpdCB3aXRoIGEgc2hvcnRlbmQgc3RyaW5nLCBpZiB0aGUgc2hvcnRlbmQgc3RyaW5nXG4gICAgICogaXMgc3RpbGwgdG9vIGxvbmcsIGl0IHdpbGwgdGhlbiBoYXNoIHRoZSBhbGlhcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkcml2ZXIgQ3VycmVudCBgRHJpdmVyYC5cbiAgICAgKiBAcGFyYW0gYnVpbGRPcHRpb25zIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgICAqIEBwYXJhbSBhbGlhcyBBbGlhcyBwYXJ0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQW4gYWxpYXMgdGhhdCBpcyBubyBsb25nZXIgdGhhbiB0aGUgZGl2ZXJzIG1heCBhbGlhcyBsZW5ndGguXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyA9IGZ1bmN0aW9uIChfYSwgYnVpbGRPcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXhBbGlhc0xlbmd0aCA9IF9hLm1heEFsaWFzTGVuZ3RoO1xuICAgICAgICB2YXIgYWxpYXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFsaWFzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnVpbGRPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBhbGlhcy51bnNoaWZ0KGJ1aWxkT3B0aW9ucyk7XG4gICAgICAgICAgICBidWlsZE9wdGlvbnMgPSB7IHNob3J0ZW46IGZhbHNlLCBqb2luZXI6IFwiX1wiIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWlsZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgc2hvcnRlbjogZmFsc2UsIGpvaW5lcjogXCJfXCIgfSwgYnVpbGRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3QWxpYXMgPSBhbGlhcy5sZW5ndGggPT09IDEgPyBhbGlhc1swXSA6IGFsaWFzLmpvaW4oYnVpbGRPcHRpb25zLmpvaW5lcik7XG4gICAgICAgIGlmIChtYXhBbGlhc0xlbmd0aCAmJiBtYXhBbGlhc0xlbmd0aCA+IDAgJiYgbmV3QWxpYXMubGVuZ3RoID4gbWF4QWxpYXNMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChidWlsZE9wdGlvbnMuc2hvcnRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBzaG9ydGVuZWRBbGlhcyA9IHNob3J0ZW4obmV3QWxpYXMpO1xuICAgICAgICAgICAgICAgIGlmIChzaG9ydGVuZWRBbGlhcy5sZW5ndGggPCBtYXhBbGlhc0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvcnRlbmVkQWxpYXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc2gobmV3QWxpYXMsIHsgbGVuZ3RoOiBtYXhBbGlhc0xlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3QWxpYXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGJ1aWxkQWxpYXNgIGluc3RlYWQuXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRDb2x1bW5BbGlhcyA9IGZ1bmN0aW9uIChfYSwgYnVpbGRPcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXhBbGlhc0xlbmd0aCA9IF9hLm1heEFsaWFzTGVuZ3RoO1xuICAgICAgICB2YXIgYWxpYXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFsaWFzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQWxpYXMuYXBwbHkodGhpcywgX19zcHJlYWRBcnJheShbeyBtYXhBbGlhc0xlbmd0aDogbWF4QWxpYXNMZW5ndGggfSwgYnVpbGRPcHRpb25zXSwgX19yZWFkKGFsaWFzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbm5lY3Rpb24gZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybC5cbiAgICAgKi9cbiAgICBEcml2ZXJVdGlscy5wYXJzZUNvbm5lY3Rpb25VcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdXJsLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgdmFyIGZpcnN0U2xhc2hlcyA9IHVybC5pbmRleE9mKFwiLy9cIik7XG4gICAgICAgIHZhciBwcmVCYXNlID0gdXJsLnN1YnN0cihmaXJzdFNsYXNoZXMgKyAyKTtcbiAgICAgICAgdmFyIHNlY29uZFNsYXNoID0gcHJlQmFzZS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgdmFyIGJhc2UgPSAoc2Vjb25kU2xhc2ggIT09IC0xKSA/IHByZUJhc2Uuc3Vic3RyKDAsIHNlY29uZFNsYXNoKSA6IHByZUJhc2U7XG4gICAgICAgIHZhciBhZnRlckJhc2UgPSAoc2Vjb25kU2xhc2ggIT09IC0xKSA/IHByZUJhc2Uuc3Vic3RyKHNlY29uZFNsYXNoICsgMSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHJlbW92ZSBtb25nb2RiIHF1ZXJ5IHBhcmFtc1xuICAgICAgICBpZiAoYWZ0ZXJCYXNlICYmIGFmdGVyQmFzZS5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyQmFzZSA9IGFmdGVyQmFzZS5zdWJzdHIoMCwgYWZ0ZXJCYXNlLmluZGV4T2YoXCI/XCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGFzdEF0U2lnbiA9IGJhc2UubGFzdEluZGV4T2YoXCJAXCIpO1xuICAgICAgICB2YXIgdXNlcm5hbWVBbmRQYXNzd29yZCA9IGJhc2Uuc3Vic3RyKDAsIGxhc3RBdFNpZ24pO1xuICAgICAgICB2YXIgaG9zdEFuZFBvcnQgPSBiYXNlLnN1YnN0cihsYXN0QXRTaWduICsgMSk7XG4gICAgICAgIHZhciB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQ7XG4gICAgICAgIHZhciBwYXNzd29yZCA9IFwiXCI7XG4gICAgICAgIHZhciBmaXJzdENvbG9uID0gdXNlcm5hbWVBbmRQYXNzd29yZC5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgaWYgKGZpcnN0Q29sb24gIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyKDAsIGZpcnN0Q29sb24pO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VybmFtZUFuZFBhc3N3b3JkLnN1YnN0cihmaXJzdENvbG9uICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gX19yZWFkKGhvc3RBbmRQb3J0LnNwbGl0KFwiOlwiKSwgMiksIGhvc3QgPSBfYVswXSwgcG9ydCA9IF9hWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICB1c2VybmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpLFxuICAgICAgICAgICAgcG9ydDogcG9ydCA/IHBhcnNlSW50KHBvcnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IGFmdGVyQmFzZSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbm5lY3Rpb24gZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybCBmb3IgTW9uZ29EQiB0byBzdXBwb3J0IHJlcGxpY2Egc2V0LlxuICAgICAqL1xuICAgIERyaXZlclV0aWxzLnBhcnNlTW9uZ29EQkNvbm5lY3Rpb25VcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciBfYSwgZV8zLCBfYjtcbiAgICAgICAgdmFyIHR5cGUgPSB1cmwuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICB2YXIgZmlyc3RTbGFzaGVzID0gdXJsLmluZGV4T2YoXCIvL1wiKTtcbiAgICAgICAgdmFyIHByZUJhc2UgPSB1cmwuc3Vic3RyKGZpcnN0U2xhc2hlcyArIDIpO1xuICAgICAgICB2YXIgc2Vjb25kU2xhc2ggPSBwcmVCYXNlLmluZGV4T2YoXCIvXCIpO1xuICAgICAgICB2YXIgYmFzZSA9IChzZWNvbmRTbGFzaCAhPT0gLTEpID8gcHJlQmFzZS5zdWJzdHIoMCwgc2Vjb25kU2xhc2gpIDogcHJlQmFzZTtcbiAgICAgICAgdmFyIGFmdGVyQmFzZSA9IChzZWNvbmRTbGFzaCAhPT0gLTEpID8gcHJlQmFzZS5zdWJzdHIoc2Vjb25kU2xhc2ggKyAxKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGFmdGVyUXVlc3Rpb25NYXJrID0gXCJcIjtcbiAgICAgICAgdmFyIGhvc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBwb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaG9zdFJlcGxpY2FTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciByZXBsaWNhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgb3B0aW9uc09iamVjdCA9IHt9O1xuICAgICAgICBpZiAoYWZ0ZXJCYXNlICYmIGFmdGVyQmFzZS5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHNwbGl0IHBhcmFtc1xuICAgICAgICAgICAgYWZ0ZXJRdWVzdGlvbk1hcmsgPSBhZnRlckJhc2Uuc3Vic3RyKChhZnRlckJhc2UuaW5kZXhPZihcIj9cIikgKyAxKSwgYWZ0ZXJCYXNlLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgb3B0aW9uc0xpc3QgPSBhZnRlclF1ZXN0aW9uTWFyay5zcGxpdChcIiZcIik7XG4gICAgICAgICAgICB2YXIgb3B0aW9uS2V5XzE7XG4gICAgICAgICAgICB2YXIgb3B0aW9uVmFsdWVfMTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBvcHRpb25zT2JqZWN0IGZvciBtZXJnZSB3aXRoIGNvbm5lY3Rpb25Vcmwgb2JqZWN0IGJlZm9yZSByZXR1cm5cbiAgICAgICAgICAgIG9wdGlvbnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbkl0ZW0pIHtcbiAgICAgICAgICAgICAgICBvcHRpb25LZXlfMSA9IG9wdGlvbkl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlXzEgPSBvcHRpb25JdGVtLnNwbGl0KFwiPVwiKVsxXTtcbiAgICAgICAgICAgICAgICBvcHRpb25zT2JqZWN0W29wdGlvbktleV8xXSA9IG9wdGlvblZhbHVlXzE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNwZWNpZmljIHJlcGxpY2FTZXQgdmFsdWUgdG8gc2V0IG9wdGlvbnMgYWJvdXQgaG9zdFJlcGxpY2FTZXRcbiAgICAgICAgICAgIHJlcGxpY2FTZXQgPSBvcHRpb25zT2JqZWN0W1wicmVwbGljYVNldFwiXTtcbiAgICAgICAgICAgIGFmdGVyQmFzZSA9IGFmdGVyQmFzZS5zdWJzdHIoMCwgYWZ0ZXJCYXNlLmluZGV4T2YoXCI/XCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGFzdEF0U2lnbiA9IGJhc2UubGFzdEluZGV4T2YoXCJAXCIpO1xuICAgICAgICB2YXIgdXNlcm5hbWVBbmRQYXNzd29yZCA9IGJhc2Uuc3Vic3RyKDAsIGxhc3RBdFNpZ24pO1xuICAgICAgICB2YXIgaG9zdEFuZFBvcnQgPSBiYXNlLnN1YnN0cihsYXN0QXRTaWduICsgMSk7XG4gICAgICAgIHZhciB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQ7XG4gICAgICAgIHZhciBwYXNzd29yZCA9IFwiXCI7XG4gICAgICAgIHZhciBmaXJzdENvbG9uID0gdXNlcm5hbWVBbmRQYXNzd29yZC5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgaWYgKGZpcnN0Q29sb24gIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyKDAsIGZpcnN0Q29sb24pO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VybmFtZUFuZFBhc3N3b3JkLnN1YnN0cihmaXJzdENvbG9uICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgcmVwbGljYVNldCBoYXZlIHZhbHVlIHNldCBJdCBhcyBob3N0bGlzdCwgSWYgbm90IHNldCBsaWtlIHN0YW5kYWxvbmUgaG9zdFxuICAgICAgICBpZiAocmVwbGljYVNldCkge1xuICAgICAgICAgICAgaG9zdFJlcGxpY2FTZXQgPSBob3N0QW5kUG9ydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9hID0gX19yZWFkKGhvc3RBbmRQb3J0LnNwbGl0KFwiOlwiKSwgMiksIGhvc3QgPSBfYVswXSwgcG9ydCA9IF9hWzFdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25uZWN0aW9uVXJsID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICBob3N0UmVwbGljYVNldDogaG9zdFJlcGxpY2FTZXQsXG4gICAgICAgICAgICB1c2VybmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpLFxuICAgICAgICAgICAgcG9ydDogcG9ydCA/IHBhcnNlSW50KHBvcnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IGFmdGVyQmFzZSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExvb3AgdG8gc2V0IGV2ZXJ5IG9wdGlvbnMgaW4gY29ubmVjdGlvblVybCB0byBvYmplY3RcbiAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXMob3B0aW9uc09iamVjdCkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lID0gX19yZWFkKF9kLnZhbHVlLCAyKSwga2V5ID0gX2VbMF0sIHZhbHVlID0gX2VbMV07XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblVybFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvblVybDtcbiAgICB9O1xuICAgIHJldHVybiBEcml2ZXJVdGlscztcbn0oKSk7XG5leHBvcnQgeyBEcml2ZXJVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ecml2ZXJVdGlscy5qcy5tYXBcbiIsIi8qKlxuICogVGhpcyBjbGFzcyBzdG9yZXMgcXVlcnkgYW5kIGl0cyBwYXJhbWV0ZXJzXG4gKi9cbnZhciBRdWVyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWVyeShxdWVyeSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgfVxuICAgIHJldHVybiBRdWVyeTtcbn0oKSk7XG5leHBvcnQgeyBRdWVyeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeS5qcy5tYXBcbiIsIi8qKlxuICogVGhpcyBjbGFzcyBzdG9yZXMgdXAgYW5kIGRvd24gcXVlcmllcyBuZWVkZWQgZm9yIG1pZ3JhdGlvbnMgZnVuY3Rpb25hbGl0eS5cbiAqL1xudmFyIFNxbEluTWVtb3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNxbEluTWVtb3J5KCkge1xuICAgICAgICB0aGlzLnVwUXVlcmllcyA9IFtdO1xuICAgICAgICB0aGlzLmRvd25RdWVyaWVzID0gW107XG4gICAgfVxuICAgIHJldHVybiBTcWxJbk1lbW9yeTtcbn0oKSk7XG5leHBvcnQgeyBTcWxJbk1lbW9yeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcWxJbk1lbW9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IFBsYXRmb3JtVG9vbHMgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sc1wiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBBcHBseVZhbHVlVHJhbnNmb3JtZXJzIH0gZnJvbSBcIi4uLy4uL3V0aWwvQXBwbHlWYWx1ZVRyYW5zZm9ybWVyc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vRHJpdmVyVXRpbHNcIjtcbnZhciBQb3N0Z3Jlc1dyYXBwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvc3RncmVzV3JhcHBlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb3N0Z3Jlc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBvc3RncmVzV3JhcHBlcjtcbn0oUG9zdGdyZXNEcml2ZXIpKTtcbnZhciBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLm9wdGlvbnMgPSBjb25uZWN0aW9uLm9wdGlvbnM7XG4gICAgICAgIF90aGlzLmlzUmVwbGljYXRlZCA9IGZhbHNlO1xuICAgICAgICAvLyBsb2FkIGRhdGEtYXBpIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICBfdGhpcy5jbGllbnQgPSBuZXcgX3RoaXMuRGF0YUFwaURyaXZlcihfdGhpcy5vcHRpb25zLnJlZ2lvbiwgX3RoaXMub3B0aW9ucy5zZWNyZXRBcm4sIF90aGlzLm9wdGlvbnMucmVzb3VyY2VBcm4sIF90aGlzLm9wdGlvbnMuZGF0YWJhc2UsIGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycykgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMpOyB9LCBfdGhpcy5vcHRpb25zLnNlcnZpY2VDb25maWdPcHRpb25zLCBfdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMpO1xuICAgICAgICBfdGhpcy5kYXRhYmFzZSA9IERyaXZlclV0aWxzLmJ1aWxkRHJpdmVyT3B0aW9ucyhfdGhpcy5vcHRpb25zKS5kYXRhYmFzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEltcGxlbWVudGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICogQmFzZWQgb24gcG9vbGluZyBvcHRpb25zLCBpdCBjYW4gZWl0aGVyIGNyZWF0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5LFxuICAgICAqIGVpdGhlciBjcmVhdGUgYSBwb29sIGFuZCBjcmVhdGUgY29ubmVjdGlvbiB3aGVuIG5lZWRlZC5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBydW5uZXIgdXNlZCB0byBleGVjdXRlIGRhdGFiYXNlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIodGhpcywgbmV3IHRoaXMuRGF0YUFwaURyaXZlcih0aGlzLm9wdGlvbnMucmVnaW9uLCB0aGlzLm9wdGlvbnMuc2VjcmV0QXJuLCB0aGlzLm9wdGlvbnMucmVzb3VyY2VBcm4sIHRoaXMub3B0aW9ucy5kYXRhYmFzZSwgZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7IHJldHVybiBfdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7IH0sIHRoaXMub3B0aW9ucy5zZXJ2aWNlQ29uZmlnT3B0aW9ucywgdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMpLCBtb2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGdpdmVuIHZhbHVlIHRvIGEgdmFsdWUgdG8gYmUgcGVyc2lzdGVkLCBiYXNlZCBvbiBpdHMgY29sdW1uIHR5cGUgYW5kIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5mb3JtYXRPcHRpb25zLmNhc3RQYXJhbWV0ZXJzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wcmVwYXJlUGVyc2lzdGVudFZhbHVlKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBnaXZlbiB2YWx1ZSB0byBhIHZhbHVlIHRvIGJlIHBlcnNpc3RlZCwgYmFzZWQgb24gaXRzIGNvbHVtbiB0eXBlIGFuZCBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLnByZXBhcmVIeWRyYXRlZFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMuY2FzdFBhcmFtZXRlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5wcmVwYXJlSHlkcmF0ZWRWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybUZyb20oY29sdW1uTWV0YWRhdGEudHJhbnNmb3JtZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUubG9hZERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRyaXZlciA9IHRoaXMub3B0aW9ucy5kcml2ZXIgfHwgUGxhdGZvcm1Ub29scy5sb2FkKFwidHlwZW9ybS1hdXJvcmEtZGF0YS1hcGktZHJpdmVyXCIpO1xuICAgICAgICB2YXIgcGcgPSBkcml2ZXIucGc7XG4gICAgICAgIHRoaXMuRGF0YUFwaURyaXZlciA9IHBnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgZ2l2ZW4gcXVlcnkuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLnByb3RvdHlwZS5leGVjdXRlUXVlcnkgPSBmdW5jdGlvbiAoY29ubmVjdGlvbiwgcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5xdWVyeShxdWVyeSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbnkgYWN0aW9uIGFmdGVyIGNvbm5lY3Rpb24gKGUuZy4gY3JlYXRlIGV4dGVuc2lvbnMgaW4gUG9zdGdyZXMgZHJpdmVyKS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLmFmdGVyQ29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbnNNZXRhZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGVja01ldGFkYXRhRm9yRXh0ZW5zaW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc01ldGFkYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbnNpb25zTWV0YWRhdGEuaGFzRXh0ZW5zaW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVuYWJsZUV4dGVuc2lvbnMoZXh0ZW5zaW9uc01ldGFkYXRhLCB0aGlzLmNvbm5lY3Rpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcjtcbn0oUG9zdGdyZXNXcmFwcGVyKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFBvc3RncmVzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vcG9zdGdyZXMvUG9zdGdyZXNRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL1F1ZXJ5UmVzdWx0XCI7XG52YXIgUG9zdGdyZXNRdWVyeVJ1bm5lcldyYXBwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyKGRyaXZlciwgbW9kZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZHJpdmVyLCBtb2RlKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUG9zdGdyZXNRdWVyeVJ1bm5lcldyYXBwZXI7XG59KFBvc3RncmVzUXVlcnlSdW5uZXIpKTtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHBvc3RncmVzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyKGRyaXZlciwgY2xpZW50LCBtb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRyaXZlciwgbW9kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzL3VzZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcGVyZm9ybSBmdXJ0aGVyIG9wZXJhdGlvbnMuXG4gICAgICogUmV0dXJucyBvYnRhaW5lZCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwic2xhdmVcIiAmJiB0aGlzLmRyaXZlci5pc1JlcGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSA9IHRoaXMuZHJpdmVyLm9idGFpblNsYXZlQ29ubmVjdGlvbigpLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgY29ubmVjdGlvbiA9IF9iWzBdLCByZWxlYXNlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3RlZFF1ZXJ5UnVubmVycy5wdXNoKF90aGlzKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VDYWxsYmFjayA9IHJlbGVhc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtYXN0ZXJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSA9IHRoaXMuZHJpdmVyLm9idGFpbk1hc3RlckNvbm5lY3Rpb24oKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGNvbm5lY3Rpb24gPSBfYlswXSwgcmVsZWFzZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMucHVzaChfdGhpcyk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWxlYXNlQ2FsbGJhY2sgPSByZWxlYXNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyYW5zYWN0aW9uIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnN0YXJ0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25TdGFydCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJvbGxiYWNrcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJvbGxiYWNrVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMsIHVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgaWYgKHVzZVN0cnVjdHVyZWRSZXN1bHQgPT09IHZvaWQgMCkgeyB1c2VTdHJ1Y3R1cmVkUmVzdWx0ID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJhdywgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbGllbnQucXVlcnkocXVlcnksIHBhcmFtZXRlcnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXcuaGFzT3duUHJvcGVydHkoJ3JlY29yZHMnKSkgJiYgQXJyYXkuaXNBcnJheShyYXcucmVjb3JkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgnbnVtYmVyT2ZSZWNvcmRzVXBkYXRlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFmZmVjdGVkID0gcmF3Lm51bWJlck9mUmVjb3Jkc1VwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXI7XG59KFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBDYXBhY2l0b3JRdWVyeVJ1bm5lciB9IGZyb20gXCIuL0NhcGFjaXRvclF1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciwgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yLCB9IGZyb20gXCIuLi8uLi9lcnJvclwiO1xudmFyIENhcGFjaXRvckRyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FwYWNpdG9yRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDYXBhY2l0b3JEcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb25uZWN0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kYXRhYmFzZSA9IF90aGlzLm9wdGlvbnMuZGF0YWJhc2U7XG4gICAgICAgIF90aGlzLmRyaXZlciA9IF90aGlzLm9wdGlvbnMuZHJpdmVyO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRyaXZlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImRyaXZlclwiKTtcbiAgICAgICAgLy8gbG9hZCBzcWxpdGUgcGFja2FnZVxuICAgICAgICBfdGhpcy5zcWxpdGUgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQ2FwYWNpdG9yRHJpdmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENhcGFjaXRvckRyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBDYXBhY2l0b3JEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IG5ldyBDYXBhY2l0b3JRdWVyeVJ1bm5lcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENhcGFjaXRvckRyaXZlci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VNb2RlLCBpc0RhdGFiYXNlRW5jcnl0ZWQsIGRhdGFiYXNlVmVyc2lvbiwgY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlTW9kZSA9IHRoaXMub3B0aW9ucy5tb2RlIHx8IFwibm8tZW5jcnlwdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXRhYmFzZUVuY3J5dGVkID0gZGF0YWJhc2VNb2RlICE9PSBcIm5vLWVuY3J5cHRpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlVmVyc2lvbiA9IHR5cGVvZiB0aGlzLm9wdGlvbnMudmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNxbGl0ZS5jcmVhdGVDb25uZWN0aW9uKHRoaXMub3B0aW9ucy5kYXRhYmFzZSwgaXNEYXRhYmFzZUVuY3J5dGVkLCBkYXRhYmFzZU1vZGUsIGRhdGFiYXNlVmVyc2lvbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY29ubmVjdGlvbi5vcGVuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBwcm9wZXJseS4gdGhpcyBhbHNvIG1ha2VzIG9uRGVsZXRlIHRvIHdvcmsgd2l0aCBzcWxpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBjb25uZWN0aW9uLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB0byB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5vcHRpb25zLmpvdXJuYWxNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiREVMRVRFXCIsIFwiVFJVTkNBVEVcIiwgXCJQRVJTSVNUXCIsIFwiTUVNT1JZXCIsIFwiV0FMXCIsIFwiT0ZGXCJdLmluZGV4T2YodGhpcy5vcHRpb25zLmpvdXJuYWxNb2RlKSAhPT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNvbm5lY3Rpb24ucXVlcnkoXCJQUkFHTUEgam91cm5hbF9tb2RlID0gXCIgKyB0aGlzLm9wdGlvbnMuam91cm5hbE1vZGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCBjb25uZWN0aW9uXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYXBhY2l0b3JEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsaXRlID0gdGhpcy5kcml2ZXI7XG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJDYXBhY2l0b3JcIiwgXCJAY2FwYWNpdG9yLWNvbW11bml0eS9zcWxpdGVcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYXBhY2l0b3JEcml2ZXI7XG59KEFic3RyYWN0U3FsaXRlRHJpdmVyKSk7XG5leHBvcnQgeyBDYXBhY2l0b3JEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FwYWNpdG9yRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlGYWlsZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL1F1ZXJ5UmVzdWx0XCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBzcWxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqL1xudmFyIENhcGFjaXRvclF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYXBhY2l0b3JRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQ2FwYWNpdG9yUXVlcnlSdW5uZXIoZHJpdmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRyaXZlciA9IGRyaXZlcjtcbiAgICAgICAgX3RoaXMuY29ubmVjdGlvbiA9IGRyaXZlci5jb25uZWN0aW9uO1xuICAgICAgICBfdGhpcy5icm9hZGNhc3RlciA9IG5ldyBCcm9hZGNhc3RlcihfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ2FwYWNpdG9yUXVlcnlSdW5uZXIucHJvdG90eXBlLmV4ZWN1dGVTZXQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhYmFzZUNvbm5lY3Rpb24uZXhlY3V0ZVNldChzZXQsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgQ2FwYWNpdG9yUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24sIGNvbW1hbmQsIHJhdywgcmVzdWx0LCBlcnJfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHF1ZXJ5LnN1YnN0cigwLCBxdWVyeS5pbmRleE9mKFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgOSwgLCAxMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoW1wiQkVHSU5cIiwgXCJST0xMQkFDS1wiLCBcIkNPTU1JVFwiLCBcIkNSRUFURVwiLCBcIkFMVEVSXCIsIFwiRFJPUFwiXS5pbmRleE9mKGNvbW1hbmQpICE9PSAtMSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWN1dGUocXVlcnksIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShbXCJJTlNFUlRcIiwgXCJVUERBVEVcIiwgXCJERUxFVEVcIl0uaW5kZXhPZihjb21tYW5kKSAhPT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGRhdGFiYXNlQ29ubmVjdGlvbi5ydW4ocXVlcnksIHBhcmFtZXRlcnMsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbNCAvKnlpZWxkKi8sIGRhdGFiYXNlQ29ubmVjdGlvbi5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyB8fCBbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgndmFsdWVzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3LnZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3Lmhhc093blByb3BlcnR5KCdjaGFuZ2VzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSByYXcuY2hhbmdlcy5jaGFuZ2VzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yYXcgPSByYXcuY2hhbmdlcy5sYXN0SWQgfHwgcmF3LmNoYW5nZXMuY2hhbmdlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQucmF3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZXJyXzEsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGFyYW1ldHJpemVzIGdpdmVuIG9iamVjdCBvZiB2YWx1ZXMuIFVzZWQgdG8gY3JlYXRlIGNvbHVtbj12YWx1ZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIENhcGFjaXRvclF1ZXJ5UnVubmVyLnByb3RvdHlwZS5wYXJhbWV0cml6ZSA9IGZ1bmN0aW9uIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RMaXRlcmFsKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gXCJcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIiArIFwiPT9cIjsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FwYWNpdG9yUXVlcnlSdW5uZXI7XG59KEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIpKTtcbmV4cG9ydCB7IENhcGFjaXRvclF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcGFjaXRvclF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IENvcmRvdmFRdWVyeVJ1bm5lciB9IGZyb20gXCIuL0NvcmRvdmFRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbmltcG9ydCB7IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbnZhciBDb3Jkb3ZhRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb3Jkb3ZhRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb3Jkb3ZhRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgLy8gdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgLy8gdGhpcy5vcHRpb25zID0gY29ubmVjdGlvbi5vcHRpb25zIGFzIENvcmRvdmFDb25uZWN0aW9uT3B0aW9ucztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmxvY2F0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlck9wdGlvbk5vdFNldEVycm9yKFwibG9jYXRpb25cIik7XG4gICAgICAgIC8vIGxvYWQgc3FsaXRlIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uY2xvc2Uob2ssIGZhaWwpO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgcnVubmVyIHVzZWQgdG8gZXhlY3V0ZSBkYXRhYmFzZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IG5ldyBDb3Jkb3ZhUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zLCBjb25uZWN0aW9uO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5vcHRpb25zLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLm9wdGlvbnMubG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZXh0cmEgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3FsaXRlLm9wZW5EYXRhYmFzZShvcHRpb25zLCBmdW5jdGlvbiAoZGIpIHsgcmV0dXJuIHJlc29sdmUoZGIpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBwcm9wZXJseS4gdGhpcyBhbHNvIG1ha2VzIG9uRGVsZXRlIHRvIHdvcmsgd2l0aCBzcWxpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZXhlY3V0ZVNxbChcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTjtcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9rKCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGZhaWwoZXJyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29ubmVjdGlvbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc3FsaXRlID0gdGhpcy5vcHRpb25zLmRyaXZlciB8fCB3aW5kb3cuc3FsaXRlUGx1Z2luO1xuICAgICAgICAgICAgdGhpcy5zcWxpdGUgPSBzcWxpdGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJDb3Jkb3ZhLVNRTGl0ZVwiLCBcImNvcmRvdmEtc3FsaXRlLXN0b3JhZ2VcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb3Jkb3ZhRHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgQ29yZG92YURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3Jkb3ZhRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlGYWlsZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgQ29yZG92YVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb3Jkb3ZhUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENvcmRvdmFRdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLmJyb2FkY2FzdGVyID0gbmV3IEJyb2FkY2FzdGVyKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24sIHF1ZXJ5U3RhcnRUaW1lLCByYXcsIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnlFbmRUaW1lLCBxdWVyeUV4ZWN1dGlvblRpbWUsIHJlc3VsdCwgcmVzdWx0U2V0LCBpLCBlcnJfMTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIHBhcmFtZXRlcnMsIGZ1bmN0aW9uIChyYXcpIHsgcmV0dXJuIG9rKHJhdyk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGZhaWwoZXJyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlTbG93KHF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkuc3Vic3RyKDAsIDExKSA9PT0gXCJJTlNFUlQgSU5UT1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdy5pbnNlcnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYXcucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRTZXQucHVzaChyYXcucm93cy5pdGVtKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZXN1bHRTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJlc3VsdFNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeUVycm9yKGVycl8xLCBxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihxdWVyeSwgcGFyYW1ldGVycywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBuZXcgcm93IHdpdGggZ2l2ZW4gdmFsdWVzIGludG8gdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqIFJldHVybnMgdmFsdWUgb2YgdGhlIGdlbmVyYXRlZCBjb2x1bW4gaWYgZ2l2ZW4gYW5kIGdlbmVyYXRlIGNvbHVtbiBleGlzdCBpbiB0aGUgdGFibGUuXG4gICAgIC8vIHRvZG86IGltcGxlbWVudCBuZXcgc3ludGF4XG4gICAgYXN5bmMgaW5zZXJ0KHRhYmxlTmFtZTogc3RyaW5nLCBrZXlWYWx1ZXM6IE9iamVjdExpdGVyYWwpOiBQcm9taXNlPEluc2VydFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoa2V5VmFsdWVzKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGtleXMubWFwKGtleSA9PiBgXCIke2tleX1cImApLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0ga2V5cy5tYXAoa2V5ID0+IFwiP1wiKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IHRoaXMuY29ubmVjdGlvbi5oYXNNZXRhZGF0YSh0YWJsZU5hbWUpID8gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhYmxlTmFtZSkuZ2VuZXJhdGVkQ29sdW1ucyA6IFtdO1xuICAgICAgICBjb25zdCBzcWwgPSBjb2x1bW5zLmxlbmd0aCA+IDAgPyAoYElOU0VSVCBJTlRPIFwiJHt0YWJsZU5hbWV9XCIoJHtjb2x1bW5zfSkgVkFMVUVTICgke3ZhbHVlc30pYCkgOiBgSU5TRVJUIElOVE8gXCIke3RhYmxlTmFtZX1cIiBERUZBVUxUIFZBTFVFU2A7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBrZXlzLm1hcChrZXkgPT4ga2V5VmFsdWVzW2tleV0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJbnNlcnRSZXN1bHQ+KGFzeW5jIChvaywgZmFpbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IF9fdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBkYXRhYmFzZUNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNvbm5lY3QoKTtcbiAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKHNxbCwgcGFyYW1ldGVycywgKHJlc3VsdFNldDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkTWFwID0gZ2VuZXJhdGVkQ29sdW1ucy5yZWR1Y2UoKG1hcCwgZ2VuZXJhdGVkQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2VuZXJhdGVkQ29sdW1uLmlzUHJpbWFyeSAmJiBnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiICYmIHJlc3VsdFNldC5pbnNlcnRJZCA/IHJlc3VsdFNldC5pbnNlcnRJZCA6IGtleVZhbHVlc1tnZW5lcmF0ZWRDb2x1bW4uZGF0YWJhc2VOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0sIHt9IGFzIE9iamVjdExpdGVyYWwpO1xuXG4gICAgICAgICAgICAgICAgb2soe1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkTWFwOiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIF9fdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnIsIHNxbCwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0qL1xuICAgIC8qKlxuICAgICAqIFdvdWxkIHN0YXJ0IGEgdHJhbnNhY3Rpb24gYnV0IHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIENvcmRvdmFRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgQ29yZG92YSBkcml2ZXInKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdvdWxkIHN0YXJ0IGEgdHJhbnNhY3Rpb24gYnV0IHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIENvcmRvdmFRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENvcmRvdmEgZHJpdmVyJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXb3VsZCBzdGFydCBhIHRyYW5zYWN0aW9uIGJ1dCB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhUXVlcnlSdW5uZXIucHJvdG90eXBlLnJvbGxiYWNrVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENvcmRvdmEgZHJpdmVyJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0YWJsZXMgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBkYXRhYmFzZS5cbiAgICAgKiBCZSBjYXJlZnVsIHdpdGggdXNpbmcgdGhpcyBtZXRob2QgYW5kIGF2b2lkIHVzaW5nIGl0IGluIHByb2R1Y3Rpb24gb3IgbWlncmF0aW9uc1xuICAgICAqIChiZWNhdXNlIGl0IGNhbiBjbGVhciBhbGwgeW91ciBkYXRhYmFzZSkuXG4gICAgICovXG4gICAgQ29yZG92YVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jbGVhckRhdGFiYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0Vmlld0Ryb3BzUXVlcnksIGRyb3BWaWV3UXVlcmllcywgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5LCBkcm9wVGFibGVRdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPRkY7XCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsICwgNywgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIFxcXCInIHx8IG5hbWUgfHwgJ1xcXCI7JyBhcyBxdWVyeSBGUk9NIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBXSEVSRSBcXFwidHlwZVxcXCIgPSAndmlldydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0Vmlld0Ryb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFZpZXdRdWVyaWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgXFxcIicgfHwgbmFtZSB8fCAnXFxcIjsnIGFzIHF1ZXJ5IEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiAhPSAnc3FsaXRlX3NlcXVlbmNlJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BWaWV3UXVlcmllcy5tYXAoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5KHFbXCJxdWVyeVwiXSk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OO1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBQYXJhbWV0cml6ZXMgZ2l2ZW4gb2JqZWN0IG9mIHZhbHVlcy4gVXNlZCB0byBjcmVhdGUgY29sdW1uPXZhbHVlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQ29yZG92YVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5wYXJhbWV0cml6ZSA9IGZ1bmN0aW9uIChvYmplY3RMaXRlcmFsLCBzdGFydEluZGV4KSB7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSB2b2lkIDApIHsgc3RhcnRJbmRleCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdExpdGVyYWwpLm1hcChmdW5jdGlvbiAoa2V5LCBpbmRleCkgeyByZXR1cm4gXCJcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIiArIFwiPT9cIjsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29yZG92YVF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBDb3Jkb3ZhUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29yZG92YVF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IEV4cG9RdWVyeVJ1bm5lciB9IGZyb20gXCIuL0V4cG9RdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbnZhciBFeHBvRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHBvRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBFeHBvRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRyaXZlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImRyaXZlclwiKTtcbiAgICAgICAgLy8gbG9hZCBzcWxpdGUgcGFja2FnZVxuICAgICAgICBfdGhpcy5zcWxpdGUgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBFeHBvRHJpdmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLl9kYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBydW5uZXIgdXNlZCB0byBleGVjdXRlIGRhdGFiYXNlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgRXhwb0RyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IEV4cG9RdWVyeVJ1bm5lcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEV4cG9Ecml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uXzEgPSBfdGhpcy5zcWxpdGUub3BlbkRhdGFiYXNlKF90aGlzLm9wdGlvbnMuZGF0YWJhc2UpO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAvLyB3b3JraW5nIHByb3Blcmx5LiB0aGlzIGFsc28gbWFrZXMgb25EZWxldGUgd29yayB3aXRoIHNxbGl0ZS5cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbl8xLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0c3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdHN4LmV4ZWN1dGVTcWwoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvayhkYXRhYmFzZUNvbm5lY3Rpb25fMSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoeyB0cmFuc2FjdGlvbjogdCwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRXhwb0RyaXZlcjtcbn0oQWJzdHJhY3RTcWxpdGVEcml2ZXIpKTtcbmV4cG9ydCB7IEV4cG9Ecml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwb0RyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBCcm9hZGNhc3RlciB9IGZyb20gXCIuLi8uLi9zdWJzY3JpYmVyL0Jyb2FkY2FzdGVyXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgRXhwb1F1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHBvUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEV4cG9RdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLmJyb2FkY2FzdGVyID0gbmV3IEJyb2FkY2FzdGVyKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJhbnNhY3Rpb24uIFdpdGhpbiBFeHBvLCBhbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBoYXBwZW4gaW4gYVxuICAgICAqIHRyYW5zYWN0aW9uIGNvbnRleHQsIHNvIGlzc3VpbmcgYSBgQkVHSU4gVFJBTlNBQ1RJT05gIGNvbW1hbmQgaXNcbiAgICAgKiByZWR1bmRhbnQgYW5kIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gICAgICpcbiAgICAgKiBgRXJyb3I6IEVycm9yIGNvZGUgMTogY2Fubm90IHN0YXJ0IGEgdHJhbnNhY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb25gXG4gICAgICpcbiAgICAgKiBJbnN0ZWFkLCB3ZSBrZWVwIHRyYWNrIG9mIGEgYFRyYW5zYWN0aW9uYCBvYmplY3QgaW4gYHRoaXMudHJhbnNhY3Rpb25gXG4gICAgICogYW5kIGNvbnRpbnVlIHVzaW5nIHRoZSBzYW1lIG9iamVjdCB1bnRpbCB3ZSB3aXNoIHRvIGNvbW1pdCB0aGVcbiAgICAgKiB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBFeHBvUXVlcnlSdW5uZXIucHJvdG90eXBlLnN0YXJ0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgJiYgdHlwZW9mIHRoaXMudHJhbnNhY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblN0YXJ0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICogU2luY2UgRXhwbyB3aWxsIGF1dG9tYXRpY2FsbHkgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBvbmNlIGFsbCB0aGVcbiAgICAgKiBjYWxsYmFja3Mgb2YgdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBoYXZlIGJlZW4gY29tcGxldGVkLCBcImNvbW1pdHRpbmdcIiBhXG4gICAgICogdHJhbnNhY3Rpb24gaW4gdGhpcyBkcml2ZXIncyBjb250ZXh0IG1lYW5zIHRoYXQgd2UgZGVsZXRlIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIG9iamVjdCBhbmQgc2V0IHRoZSBzdGFnZSBmb3IgdGhlIG5leHQgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgJiYgdHlwZW9mIHRoaXMudHJhbnNhY3Rpb24gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Db21taXQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9sbGJhY2tzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKiBUaGlzIG1ldGhvZCdzIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIGBjb21taXRUcmFuc2FjdGlvbigpYCBiZWNhdXNlXG4gICAgICogdGhlIHRyYW5zYWN0aW9uIGxpZmVjeWNsZSBpcyBoYW5kbGVkIHdpdGhpbiB0aGUgRXhwbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICogSXNzdWluZyBzZXBhcmF0ZSBzdGF0ZW1lbnRzIGZvciBgQ09NTUlUYCBvciBgUk9MTEJBQ0tgIGFyZW4ndCBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yb2xsYmFja1RyYW5zYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSAmJiB0eXBlb2YgdGhpcy50cmFuc2FjdGlvbiA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlQ29ubmVjdGlvbiwgcXVlcnlTdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgRXhwbyBTUUwgcXVlcmllcyBhcmUgZXhlY3V0ZWQgaW4gYSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24udHJhbnNhY3Rpb24oZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy50cmFuc2FjdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIHBhcmFtZXRlcnMsIGZ1bmN0aW9uICh0LCByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNsb3cgcXVlcmllcyBpZiBtYXhRdWVyeUV4ZWN1dGlvbiB0aW1lIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4UXVlcnlFeGVjdXRpb25UaW1lID0gX3RoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFF1ZXJ5RXhlY3V0aW9uVGltZSAmJiBxdWVyeUV4ZWN1dGlvblRpbWUgPiBtYXhRdWVyeUV4ZWN1dGlvblRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeVNsb3cocXVlcnlFeGVjdXRpb25UaW1lLCBxdWVyeSwgcGFyYW1ldGVycywgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGlkIG9mIGluc2VydGVkIHJvdywgaWYgcXVlcnkgd2FzIGluc2VydCBzdGF0ZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zdWJzdHIoMCwgMTEpID09PSBcIklOU0VSVCBJTlRPXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yYXcgPSByYXcuaW5zZXJ0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93c0FmZmVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHJhdy5yb3dzQWZmZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93cycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0U2V0ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U2V0LnB1c2gocmF3LnJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmVzdWx0U2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZXN1bHRTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQucmF3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZXJyLCBxdWVyeSwgcGFyYW1ldGVycywgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRXhwb1F1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBFeHBvUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwb1F1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBSZWFkYWJsZSwgV3JpdGFibGUgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sc1wiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBpbmdzLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4vTmF0aXZlc2NyaXB0UXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IERyaXZlck9wdGlvbk5vdFNldEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL0RyaXZlck9wdGlvbk5vdFNldEVycm9yXCI7XG5pbXBvcnQgeyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yXCI7XG4vKipcbiAqIE9yZ2FuaXplcyBjb21tdW5pY2F0aW9uIHdpdGggc3FsaXRlIERCTVMgd2l0aGluIE5hdGl2ZXNjcmlwdC5cbiAqL1xudmFyIE5hdGl2ZXNjcmlwdERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmF0aXZlc2NyaXB0RHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBOYXRpdmVzY3JpcHREcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb25uZWN0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb24ub3B0aW9ucztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgLy8gdmFsaWRhdGUgb3B0aW9ucyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBzZXRcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2FkIHNxbGl0ZSBwYWNrYWdlXG4gICAgICAgIF90aGlzLmxvYWREZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uY2xvc2UoKS50aGVuKG9rKS5jYXRjaChmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgTmF0aXZlc2NyaXB0RHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVUeXBlID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiYmxvYlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLm5vcm1hbGl6ZVR5cGUuY2FsbCh0aGlzLCBjb2x1bW4pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IF90aGlzLm9wdGlvbnMucmVhZE9ubHksXG4gICAgICAgICAgICAgICAga2V5OiBfdGhpcy5vcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICBtdWx0aXRocmVhZGluZzogX3RoaXMub3B0aW9ucy5tdWx0aXRocmVhZGluZyxcbiAgICAgICAgICAgICAgICBtaWdyYXRlOiBfdGhpcy5vcHRpb25zLm1pZ3JhdGUsXG4gICAgICAgICAgICAgICAgaW9zRmxhZ3M6IF90aGlzLm9wdGlvbnMuaW9zRmxhZ3MsXG4gICAgICAgICAgICAgICAgYW5kcm9pZEZsYWdzOiBfdGhpcy5vcHRpb25zLmFuZHJvaWRGbGFncyxcbiAgICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuZXh0cmEgfHwge30pO1xuICAgICAgICAgICAgbmV3IF90aGlzLnNxbGl0ZShfdGhpcy5vcHRpb25zLmRhdGFiYXNlLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyLCBkYikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgLy8gdXNlIG9iamVjdCBtb2RlIHRvIHdvcmsgd2l0aCBUeXBlT1JNXG4gICAgICAgICAgICAgICAgZGIucmVzdWx0VHlwZShfdGhpcy5zcWxpdGUuUkVTVUxUU0FTT0JKRUNUKTtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIsIFtdLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbGwgc2V0XG4gICAgICAgICAgICAgICAgICAgIG9rKGRiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIGRyaXZlciBkZXBlbmRlbmN5IGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5LCB0aGVuIHRyeSB0byBsb2FkIGl0IHZpYSBcInJlcXVpcmVcIi5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsaXRlID0gdGhpcy5kcml2ZXI7XG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJOYXRpdmVzY3JpcHRcIiwgXCJuYXRpdmVzY3JpcHQtc3FsaXRlXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmF0aXZlc2NyaXB0RHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgTmF0aXZlc2NyaXB0RHJpdmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdGl2ZXNjcmlwdERyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyIH0gZnJvbSBcIi4uLy4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJlc3VsdFwiO1xuLyoqXG4gKiBSdW5zIHF1ZXJpZXMgb24gYSBzaW5nbGUgc3FsaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmF0aXZlc2NyaXB0UXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyKGRyaXZlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5kcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBpc0luc2VydFF1ZXJ5LCBoYW5kbGVyLCBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnNlcnRRdWVyeSA9IHF1ZXJ5LnN1YnN0cigwLCAxMSkgPT09IFwiSU5TRVJUIElOVE9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXJyLCByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2xvdyBxdWVyaWVzIGlmIG1heFF1ZXJ5RXhlY3V0aW9uIHRpbWUgaXMgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IF90aGlzLmRyaXZlci5vcHRpb25zLm1heFF1ZXJ5RXhlY3V0aW9uVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5RXhlY3V0aW9uVGltZSA9IHF1ZXJ5RW5kVGltZSAtIHF1ZXJ5U3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnIsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwobmV3IFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGVycikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5zZXJ0UXVlcnkgJiYgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzID0gcmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2socmVzdWx0LnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnNlcnRRdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjU1FMKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5hbGwocXVlcnksIHBhcmFtZXRlcnMsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBhcmFtZXRyaXplcyBnaXZlbiBvYmplY3Qgb2YgdmFsdWVzLiBVc2VkIHRvIGNyZWF0ZSBjb2x1bW49dmFsdWUgcXVlcmllcy5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lci5wcm90b3R5cGUucGFyYW1ldHJpemUgPSBmdW5jdGlvbiAob2JqZWN0TGl0ZXJhbCwgc3RhcnRJbmRleCkge1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gdm9pZCAwKSB7IHN0YXJ0SW5kZXggPSAwOyB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RMaXRlcmFsKS5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsga2V5ICsgXCJcXFwiXCIgKyBcIj0/XCI7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVzY3JpcHRRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeUZhaWxlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBCYXNlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL0Jhc2VRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFRhYmxlQ2hlY2sgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDaGVja1wiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IFRhYmxlRXhjbHVzaW9uIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRXhjbHVzaW9uXCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG5pbXBvcnQgeyBUYWJsZUluZGV4IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vUXVlcnlcIjtcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL1ZlcnNpb25VdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbmltcG9ydCB7IE1ldGFkYXRhVGFibGVUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL01ldGFkYXRhVGFibGVUeXBlXCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBwb3N0Z3JlcyBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgUG9zdGdyZXNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9zdGdyZXNRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUG9zdGdyZXNRdWVyeVJ1bm5lcihkcml2ZXIsIG1vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICBfdGhpcy5icm9hZGNhc3RlciA9IG5ldyBCcm9hZGNhc3RlcihfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMvdXNlcyBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCB0byBwZXJmb3JtIGZ1cnRoZXIgb3BlcmF0aW9ucy5cbiAgICAgKiBSZXR1cm5zIG9idGFpbmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbik7XG4gICAgICAgIGlmICh0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcInNsYXZlXCIgJiYgdGhpcy5kcml2ZXIuaXNSZXBsaWNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2UgPSB0aGlzLmRyaXZlci5vYnRhaW5TbGF2ZUNvbm5lY3Rpb24oKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGNvbm5lY3Rpb24gPSBfYlswXSwgcmVsZWFzZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMucHVzaChfdGhpcyk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgb25FcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGVycikgeyByZXR1cm4gX3RoaXMucmVsZWFzZVBvc3RncmVzQ29ubmVjdGlvbihlcnIpOyB9O1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLm9uKFwiZXJyb3JcIiwgb25FcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG1hc3RlclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlID0gdGhpcy5kcml2ZXIub2J0YWluTWFzdGVyQ29ubmVjdGlvbigpLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgY29ubmVjdGlvbiA9IF9iWzBdLCByZWxlYXNlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3RlZFF1ZXJ5UnVubmVycy5wdXNoKF90aGlzKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciBvbkVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5yZWxlYXNlUG9zdGdyZXNDb25uZWN0aW9uKGVycik7IH07XG4gICAgICAgICAgICAgICAgX3RoaXMucmVsZWFzZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24ub24oXCJlcnJvclwiLCBvbkVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVsZWFzZSBhIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbCwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGFuIEVycm9yIHRvIHJlbGVhc2Ugd2l0aC5cbiAgICAgKiBQZXIgcGctcG9vbCBkb2N1bWVudGF0aW9uIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBwb29sIGZyb20gcmUtdXNpbmcgdGhlIGJyb2tlbiBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbGVhc2VQb3N0Z3Jlc0Nvbm5lY3Rpb24gPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxlYXNlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5kcml2ZXIuY29ubmVjdGVkUXVlcnlSdW5uZXJzLmluZGV4T2YodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdXNlZCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqIFlvdSBjYW5ub3QgdXNlIHF1ZXJ5IHJ1bm5lciBtZXRob2RzIG9uY2UgaXRzIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGVhc2VQb3N0Z3Jlc0Nvbm5lY3Rpb24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5zdGFydFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU1RBUlQgVFJBTlNBQ1RJT05cIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzb2xhdGlvbkxldmVsKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMIFwiICsgaXNvbGF0aW9uTGV2ZWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Db21taXQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJDT01NSVRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9sbGJhY2tzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yb2xsYmFja1RyYW5zYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUk9MTEJBQ0tcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBxdWVyeVN0YXJ0VGltZSwgcmF3LCBtYXhRdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5RW5kVGltZSwgcXVlcnlFeGVjdXRpb25UaW1lLCByZXN1bHQsIGVycl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGF0YWJhc2VDb25uZWN0aW9uLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXcuaGFzT3duUHJvcGVydHkoJ3Jvd3MnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy5yb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Lmhhc093blByb3BlcnR5KCdyb3dDb3VudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHJhdy5yb3dDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyYXcuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiREVMRVRFXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVUERBVEVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBVUERBVEUgYW5kIERFTEVURSBxdWVyeSBhZGRpdGlvbmFsbHkgcmV0dXJuIG51bWJlciBvZiBhZmZlY3RlZCByb3dzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gW3Jhdy5yb3dzLCByYXcucm93Q291bnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3LnJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnJfMSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByYXcgZGF0YSBzdHJlYW0uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBvbkVuZCwgb25FcnJvcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgUXVlcnlTdHJlYW0sIGRhdGFiYXNlQ29ubmVjdGlvbiwgc3RyZWFtO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlTdHJlYW0gPSB0aGlzLmRyaXZlci5sb2FkU3RyZWFtRGVwZW5kZW5jeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBkYXRhYmFzZUNvbm5lY3Rpb24ucXVlcnkobmV3IFF1ZXJ5U3RyZWFtKHF1ZXJ5LCBwYXJhbWV0ZXJzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsIG9uRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHN0cmVhbV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIGRhdGFiYXNlIG5hbWVzIGluY2x1ZGluZyBzeXN0ZW0gZGF0YWJhc2VzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldERhdGFiYXNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzY2hlbWEgbmFtZXMgaW5jbHVkaW5nIHN5c3RlbSBzY2hlbWFzLlxuICAgICAqIElmIGRhdGFiYXNlIHBhcmFtZXRlciBzcGVjaWZpZWQsIHJldHVybnMgc2NoZW1hcyBvZiB0aGF0IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFNjaGVtYXMgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc0RhdGFiYXNlID0gZnVuY3Rpb24gKGRhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgKiBGUk9NIHBnX2RhdGFiYXNlIFdIRVJFIGRhdG5hbWU9J1wiICsgZGF0YWJhc2UgKyBcIic7XCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZVxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldEN1cnJlbnREYXRhYmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBjdXJyZW50X2RhdGFiYXNlKClcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxdWVyeVswXVtcImN1cnJlbnRfZGF0YWJhc2VcIl1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5oYXNTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJzY2hlbWF0YVxcXCIgV0hFUkUgXFxcInNjaGVtYV9uYW1lXFxcIiA9ICdcIiArIHNjaGVtYSArIFwiJ1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBjdXJyZW50bHkgdXNpbmcgZGF0YWJhc2Ugc2NoZW1hXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0Q3VycmVudFNjaGVtYSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBjdXJyZW50X3NjaGVtYSgpXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcXVlcnlbMF1bXCJjdXJyZW50X3NjaGVtYVwiXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc1RhYmxlID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRUYWJsZU5hbWUsIF9hLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFRhYmxlTmFtZSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBhcnNlZFRhYmxlTmFtZS5zY2hlbWEpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwYXJzZWRUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNjaGVtYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJ0YWJsZXNcXFwiIFdIRVJFIFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgcGFyc2VkVGFibGVOYW1lLnNjaGVtYSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgcGFyc2VkVGFibGVOYW1lLnRhYmxlTmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRUYWJsZU5hbWUsIF9hLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFRhYmxlTmFtZSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBhcnNlZFRhYmxlTmFtZS5zY2hlbWEpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwYXJzZWRUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNjaGVtYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJjb2x1bW5zXFxcIiBXSEVSRSBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIHBhcnNlZFRhYmxlTmFtZS5zY2hlbWEgKyBcIicgQU5EIFxcXCJ0YWJsZV9uYW1lXFxcIiA9ICdcIiArIHBhcnNlZFRhYmxlTmFtZS50YWJsZU5hbWUgKyBcIicgQU5EIFxcXCJjb2x1bW5fbmFtZVxcXCIgPSAnXCIgKyBjb2x1bW5OYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkYXRhYmFzZS5cbiAgICAgKiBOb3RlOiBQb3N0Z3JlcyBkb2VzIG5vdCBzdXBwb3J0IGRhdGFiYXNlIGNyZWF0aW9uIGluc2lkZSBhIHRyYW5zYWN0aW9uIGJsb2NrLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlID0gZnVuY3Rpb24gKGRhdGFiYXNlLCBpZk5vdEV4aXN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUFscmVhZHlFeGlzdHMsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZk5vdEV4aXN0KSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRGF0YWJhc2UoZGF0YWJhc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VBbHJlYWR5RXhpc3RzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlQWxyZWFkeUV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IFwiQ1JFQVRFIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJEUk9QIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKG5ldyBRdWVyeSh1cCksIG5ldyBRdWVyeShkb3duKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgZGF0YWJhc2UuXG4gICAgICogTm90ZTogUG9zdGdyZXMgZG9lcyBub3Qgc3VwcG9ydCBkYXRhYmFzZSBkcm9wcGluZyBpbnNpZGUgYSB0cmFuc2FjdGlvbiBibG9jay5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZkV4aXN0ID8gXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFwiXCIgKyBkYXRhYmFzZSArIFwiXFxcIlwiIDogXCJEUk9QIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJDUkVBVEUgREFUQUJBU0UgXFxcIlwiICsgZGF0YWJhc2UgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXMobmV3IFF1ZXJ5KHVwKSwgbmV3IFF1ZXJ5KGRvd24pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hUGF0aCwgaWZOb3RFeGlzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVBhdGguaW5kZXhPZihcIi5cIikgPT09IC0xID8gc2NoZW1hUGF0aCA6IHNjaGVtYVBhdGguc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZk5vdEV4aXN0ID8gXCJDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiXCIgOiBcIkNSRUFURSBTQ0hFTUEgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJEUk9QIFNDSEVNQSBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIgQ0FTQ0FERVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyhuZXcgUXVlcnkodXApLCBuZXcgUXVlcnkoZG93bikpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYVBhdGgsIGlmRXhpc3QsIGlzQ2FzY2FkZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVBhdGguaW5kZXhPZihcIi5cIikgPT09IC0xID8gc2NoZW1hUGF0aCA6IHNjaGVtYVBhdGguc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZkV4aXN0ID8gXCJEUk9QIFNDSEVNQSBJRiBFWElTVFMgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiIFwiICsgKGlzQ2FzY2FkZSA/IFwiQ0FTQ0FERVwiIDogXCJcIikgOiBcIkRST1AgU0NIRU1BIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIiBcIiArIChpc0Nhc2NhZGUgPyBcIkNBU0NBREVcIiA6IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IFwiQ1JFQVRFIFNDSEVNQSBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXMobmV3IFF1ZXJ5KHVwKSwgbmV3IFF1ZXJ5KGRvd24pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBpZk5vdEV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgY3JlYXRlSW5kaWNlcykge1xuICAgICAgICBpZiAoaWZOb3RFeGlzdCA9PT0gdm9pZCAwKSB7IGlmTm90RXhpc3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY3JlYXRlRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBjcmVhdGVGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMgPT09IHZvaWQgMCkgeyBjcmVhdGVJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNUYWJsZUV4aXN0LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBlbnVtQ29sdW1ucywgY3JlYXRlZEVudW1UeXBlcywgZW51bUNvbHVtbnNfMSwgZW51bUNvbHVtbnNfMV8xLCBjb2x1bW4sIGhhc0VudW0sIGVudW1OYW1lLCBlXzFfMSwgZ2VuZXJhdGVkQ29sdW1ucywgZ2VuZXJhdGVkQ29sdW1uc18xLCBnZW5lcmF0ZWRDb2x1bW5zXzFfMSwgY29sdW1uLCB0YWJsZU5hbWVXaXRoU2NoZW1hLCB0YWJsZU5hbWUsIHNjaGVtYSwgaW5zZXJ0UXVlcnksIGRlbGV0ZVF1ZXJ5LCBlXzJfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZOb3RFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bUNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgY29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRW51bVR5cGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMywgOCwgOSwgMTBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzEgPSBfX3ZhbHVlcyhlbnVtQ29sdW1ucyksIGVudW1Db2x1bW5zXzFfMSA9IGVudW1Db2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnVtQ29sdW1uc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBlbnVtQ29sdW1uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc0VudW1UeXBlKHRhYmxlLCBjb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRW51bSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZW51bSB3aXRoIHRoZSBzYW1lIFwiZW51bU5hbWVcIiBpcyBkZWZpbmVkIG1vcmUgdGhlbiBvbmNlLCBtZSBtdXN0IHByZXZlbnQgZG91YmxlIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0VudW0gJiYgY3JlYXRlZEVudW1UeXBlcy5pbmRleE9mKGVudW1OYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRW51bVR5cGVzLnB1c2goZW51bU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZW51bU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcEVudW1UeXBlU3FsKHRhYmxlLCBjb2x1bW4sIGVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzFfMSA9IGVudW1Db2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db2x1bW5zXzFfMSAmJiAhZW51bUNvbHVtbnNfMV8xLmRvbmUgJiYgKF9hID0gZW51bUNvbHVtbnNfMS5yZXR1cm4pKSBfYS5jYWxsKGVudW1Db2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZENvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIiAmJiBjb2x1bW4uYXNFeHByZXNzaW9uOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy50cnlzLnB1c2goWzExLCAxNiwgMTcsIDE4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zXzEgPSBfX3ZhbHVlcyhnZW5lcmF0ZWRDb2x1bW5zKSwgZ2VuZXJhdGVkQ29sdW1uc18xXzEgPSBnZW5lcmF0ZWRDb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWdlbmVyYXRlZENvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGdlbmVyYXRlZENvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRUYWJsZU5hbWVXaXRoU2NoZW1hKHRhYmxlLm5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Muc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRyaXZlci5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uc18xXzEgPSBnZW5lcmF0ZWRDb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzMgLypicmVhayovLCAxOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzJfMSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0ZWRDb2x1bW5zXzFfMSAmJiAhZ2VuZXJhdGVkQ29sdW1uc18xXzEuZG9uZSAmJiAoX2IgPSBnZW5lcmF0ZWRDb2x1bW5zXzEucmV0dXJuKSkgX2IuY2FsbChnZW5lcmF0ZWRDb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKHRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjcmVhdGVGb3JlaWduS2V5cyBpcyB0cnVlLCB3ZSBtdXN0IGRyb3AgY3JlYXRlZCBmb3JlaWduIGtleXMgaW4gZG93biBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZVRhYmxlIGRvZXMgbm90IG5lZWQgc2VwYXJhdGUgbWV0aG9kIHRvIGNyZWF0ZSBmb3JlaWduIGtleXMsIGJlY2F1c2UgaXQgY3JlYXRlIGZrJ3MgaW4gdGhlIHNhbWUgcXVlcnkgd2l0aCB0YWJsZSBjcmVhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVGb3JlaWduS2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBkb3duUXVlcmllcy5wdXNoKF90aGlzLmRyb3BGb3JlaWduS2V5U3FsKHRhYmxlLCBmb3JlaWduS2V5KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZSh0YWJsZSwgaW5kZXguY29sdW1uTmFtZXMsIGluZGV4LndoZXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goX3RoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BUYWJsZSA9IGZ1bmN0aW9uICh0YXJnZXQsIGlmRXhpc3QsIGRyb3BGb3JlaWduS2V5cywgZHJvcEluZGljZXMpIHtcbiAgICAgICAgaWYgKGRyb3BGb3JlaWduS2V5cyA9PT0gdm9pZCAwKSB7IGRyb3BGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGRyb3BJbmRpY2VzID09PSB2b2lkIDApIHsgZHJvcEluZGljZXMgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpc1RhYmxlRXhpc3QsIGNyZWF0ZUZvcmVpZ25LZXlzLCB0YWJsZVBhdGgsIHRhYmxlLCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhcmdldCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RhYmxlRXhpc3QgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGFibGVFeGlzdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb3JlaWduS2V5cyA9IGRyb3BGb3JlaWduS2V5cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aCA9IHRoaXMuZ2V0VGFibGVQYXRoKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlUGF0aCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wSW5kaWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BGb3JlaWduS2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiB1cFF1ZXJpZXMucHVzaChfdGhpcy5kcm9wRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKHRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdmlldy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllcywgZG93blF1ZXJpZXMsIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVWaWV3U3FsKHZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gdXBRdWVyaWVzKS5wdXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmFwcGx5KF9hLCBbX2Uuc2VudCgpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFZpZXdTcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSAoX2MgPSBkb3duUXVlcmllcykucHVzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5hcHBseShfYywgW19lLnNlbnQoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlldyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZpZXdOYW1lLCB2aWV3LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgVmlldyA/IHRhcmdldC5uYW1lIDogdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRWaWV3KHZpZXdOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IChfYSA9IHVwUXVlcmllcykucHVzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5hcHBseShfYSwgW19lLnNlbnQoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZCA9IChfYyA9IGRvd25RdWVyaWVzKS5wdXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmFwcGx5KF9jLCBbX2Uuc2VudCgpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbmFtZVRhYmxlID0gZnVuY3Rpb24gKG9sZFRhYmxlT3JOYW1lLCBuZXdUYWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllcywgZG93blF1ZXJpZXMsIG9sZFRhYmxlLCBfYSwgbmV3VGFibGUsIF9iLCBzY2hlbWFOYW1lLCBvbGRUYWJsZU5hbWUsIGNvbHVtbk5hbWVzLCBvbGRQa05hbWUsIG5ld1BrTmFtZSwgZW51bUNvbHVtbnMsIGVudW1Db2x1bW5zXzIsIGVudW1Db2x1bW5zXzJfMSwgY29sdW1uLCBvbGRFbnVtVHlwZSwgZV8zXzE7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRUYWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9sZFRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZShvbGRUYWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlID0gb2xkVGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUob2xkVGFibGUpLCBzY2hlbWFOYW1lID0gX2Iuc2NoZW1hLCBvbGRUYWJsZU5hbWUgPSBfYi50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZS5uYW1lID0gc2NoZW1hTmFtZSA/IHNjaGVtYU5hbWUgKyBcIi5cIiArIG5ld1RhYmxlTmFtZSA6IG5ld1RhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKG9sZFRhYmxlKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdUYWJsZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aChuZXdUYWJsZSkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgb2xkVGFibGVOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBjb2x1bW4gcHJpbWFyeSBrZXkgY29uc3RyYWludFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RhYmxlLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IG5ld1RhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKG9sZFRhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKG5ld1RhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgobmV3VGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgb2xkUGtOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1BrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aChuZXdUYWJsZSkgKyBcIiBSRU5BTUUgQ09OU1RSQUlOVCBcXFwiXCIgKyBuZXdQa05hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgb2xkUGtOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBzZXF1ZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sLmlzR2VuZXJhdGVkICYmIGNvbC5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcXVlbmNlUGF0aCA9IF90aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKG9sZFRhYmxlLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXF1ZW5jZU5hbWUgPSBfdGhpcy5idWlsZFNlcXVlbmNlTmFtZShvbGRUYWJsZSwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2VxdWVuY2VQYXRoID0gX3RoaXMuYnVpbGRTZXF1ZW5jZVBhdGgobmV3VGFibGUsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NlcXVlbmNlTmFtZSA9IF90aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKG5ld1RhYmxlLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cCA9IFwiQUxURVIgU0VRVUVOQ0UgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHNlcXVlbmNlUGF0aCkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3U2VxdWVuY2VOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb3duID0gXCJBTFRFUiBTRVFVRU5DRSBcIiArIF90aGlzLmVzY2FwZVBhdGgobmV3U2VxdWVuY2VQYXRoKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBzZXF1ZW5jZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KHVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KGRvd24pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSB1bmlxdWUgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnVuaXF1ZXMuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdVbmlxdWVOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShuZXdUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZS5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBuZXdVbmlxdWVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgaW5kZXggY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBuZXcgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IF90aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZShuZXdUYWJsZSkuc2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJbmRleE5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZShuZXdUYWJsZSwgaW5kZXguY29sdW1uTmFtZXMsIGluZGV4LndoZXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gc2NoZW1hID8gXCJBTFRFUiBJTkRFWCBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiXCIgOiBcIkFMVEVSIElOREVYIFxcXCJcIiArIGluZGV4Lm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG5ld0luZGV4TmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb3duID0gc2NoZW1hID8gXCJBTFRFUiBJTkRFWCBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiXCIgOiBcIkFMVEVSIElOREVYIFxcXCJcIiArIG5ld0luZGV4TmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeSh1cCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KGRvd24pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSBuZXdJbmRleE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBmb3JlaWduIGtleSBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuZm9yZWlnbktleXMuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG5ldyBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Rm9yZWlnbktleU5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKG5ld1RhYmxlLCBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLCBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIiBUTyBcXFwiXCIgKyBuZXdGb3JlaWduS2V5TmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIF90aGlzLmVzY2FwZVBhdGgobmV3VGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgbmV3Rm9yZWlnbktleU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgZm9yZWlnbktleS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkubmFtZSA9IG5ld0ZvcmVpZ25LZXlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtQ29sdW1ucyA9IG5ld1RhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi50eXBlID09PSBcImVudW1cIiB8fCBjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFs0LCA5LCAxMCwgMTFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzIgPSBfX3ZhbHVlcyhlbnVtQ29sdW1ucyksIGVudW1Db2x1bW5zXzJfMSA9IGVudW1Db2x1bW5zXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnVtQ29sdW1uc18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBlbnVtQ29sdW1uc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHJlbmFtaW5nIGZvciB1c2VyLWRlZmluZWQgZW51bSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmVudW1OYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRVc2VyRGVmaW5lZFR5cGVOYW1lKG9sZFRhYmxlLCBjb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bVR5cGUgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUWVBFIFxcXCJcIiArIG9sZEVudW1UeXBlLnNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBvbGRFbnVtVHlwZS5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZShuZXdUYWJsZSwgY29sdW1uLCBmYWxzZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZShuZXdUYWJsZSwgY29sdW1uKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBvbGRFbnVtVHlwZS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bUNvbHVtbnNfMl8xID0gZW51bUNvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfM18xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8zID0geyBlcnJvcjogZV8zXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db2x1bW5zXzJfMSAmJiAhZW51bUNvbHVtbnNfMl8xLmRvbmUgJiYgKF9jID0gZW51bUNvbHVtbnNfMi5yZXR1cm4pKSBfYy5jYWxsKGVudW1Db2x1bW5zXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb2x1bW4gZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgaGFzRW51bSwgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZV8xLCBjb2x1bW5OYW1lc18xLCBwa05hbWUsIGNvbHVtbk5hbWVzLCBjb2x1bW5JbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGFibGVOYW1lV2l0aFNjaGVtYSwgdGFibGVOYW1lLCBzY2hlbWEsIGluc2VydFF1ZXJ5LCBkZWxldGVRdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRW51bVR5cGUodGFibGUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFbnVtID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNFbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVFbnVtVHlwZVNxbCh0YWJsZSwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmRyb3BFbnVtVHlwZVNxbCh0YWJsZSwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBcIiArIHRoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwodGFibGUsIGNvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT0xVTU4gXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG9yIHVwZGF0ZSBwcmltYXJ5IGtleSBjb25zdHJhaW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzUHJpbWFyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFibGUgYWxyZWFkeSBoYXZlIHByaW1hcnkga2V5LCBtZSBtdXN0IGRyb3AgaXQgYW5kIHJlY3JlYXRlIGFnYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lXzEgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lXzEgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZV8xICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzXzEgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBwcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGNsb25lZFRhYmxlLmluZGljZXMuZmluZChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBpbmRleC5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgY29sdW1uSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBjb2x1bW5JbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHVuaXF1ZSBjb25zdHJhaW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludCA9IG5ldyBUYWJsZVVuaXF1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW2NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBbY29sdW1uLm5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZUNvbnN0cmFpbnQubmFtZSArIFwiXFxcIiBVTklRVUUgKFxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbHVtbi5nZW5lcmF0ZWRUeXBlID09PSBcIlNUT1JFRFwiICYmIGNvbHVtbi5hc0V4cHJlc3Npb24pKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VGFibGVOYW1lV2l0aFNjaGVtYSh0YWJsZS5uYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Iuc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRyaXZlci5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW4ncyBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDT01NRU5UIE9OIENPTFVNTiBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIi5cXFwiXCIgKyBjb2x1bW4ubmFtZSArIFwiXFxcIiBJUyBcIiArIHRoaXMuZXNjYXBlQ29tbWVudChjb2x1bW4uY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkNPTU1FTlQgT04gQ09MVU1OIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiIElTIFwiICsgdGhpcy5lc2NhcGVDb21tZW50KGNvbHVtbi5jb21tZW50KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ2FjaGVkVGFibGUodGFibGUsIGNsb25lZFRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbHVtbnMgZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zXzEsIGNvbHVtbnNfMV8xLCBjb2x1bW4sIGVfNF8xO1xuICAgICAgICAgICAgdmFyIGVfNCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMSA9IF9fdmFsdWVzKGNvbHVtbnMpLCBjb2x1bW5zXzFfMSA9IGNvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZENvbHVtbih0YWJsZU9yTmFtZSwgY29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc18xXzEgPSBjb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNF8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV80ID0geyBlcnJvcjogZV80XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zXzFfMSAmJiAhY29sdW1uc18xXzEuZG9uZSAmJiAoX2EgPSBjb2x1bW5zXzEucmV0dXJuKSkgX2EuY2FsbChjb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVuYW1lcyBjb2x1bW4gaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbmFtZUNvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgb2xkVGFibGVDb2x1bW5Pck5hbWUsIG5ld1RhYmxlQ29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIG9sZENvbHVtbiwgbmV3Q29sdW1uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW4gPSBvbGRUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gb2xkVGFibGVDb2x1bW5Pck5hbWUgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gb2xkVGFibGVDb2x1bW5Pck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcXFwiXCIgKyBvbGRUYWJsZUNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiIHRhYmxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uID0gbmV3VGFibGVDb2x1bW5Pck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4gPSBvbGRDb2x1bW4uY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4ubmFtZSA9IG5ld1RhYmxlQ29sdW1uT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2hhbmdlQ29sdW1uKHRhYmxlLCBvbGRDb2x1bW4sIG5ld0NvbHVtbildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNoYW5nZUNvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgb2xkVGFibGVDb2x1bW5Pck5hbWUsIG5ld0NvbHVtbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgZGVmYXVsdFZhbHVlQ2hhbmdlZCwgb2xkQ29sdW1uLCBvbGRFbnVtVHlwZSwgcHJpbWFyeUNvbHVtbnMsIGNvbHVtbk5hbWVzLCBvbGRQa05hbWUsIG5ld1BrTmFtZSwgc2VxdWVuY2VQYXRoLCBzZXF1ZW5jZU5hbWUsIG5ld1NlcXVlbmNlUGF0aCwgbmV3U2VxdWVuY2VOYW1lLCB1cCwgZG93biwgb2xkVGFibGVDb2x1bW4sIGFycmF5U3VmZml4LCBuZXdFbnVtTmFtZSwgb2xkRW51bU5hbWUsIG9sZEVudW1OYW1lV2l0aG91dFNjaGVtYSwgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCwgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hX29sZCwgdXBUeXBlLCBkb3duVHlwZSwgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZSwgY29sdW1uTmFtZXMsIGNvbHVtbiwgcGtOYW1lLCBjb2x1bW5OYW1lcywgcHJpbWFyeUNvbHVtbiwgY29sdW1uLCBwa05hbWUsIGNvbHVtbk5hbWVzLCB1bmlxdWVDb25zdHJhaW50LCB1bmlxdWVDb25zdHJhaW50LCB0YWJsZU5hbWVXaXRoU2NoZW1hLCB0YWJsZU5hbWUsIHNjaGVtYTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZENvbHVtbiA9IG9sZFRhYmxlQ29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9sZFRhYmxlQ29sdW1uT3JOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG9sZFRhYmxlQ29sdW1uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2xkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXFxcIlwiICsgb2xkVGFibGVDb2x1bW5Pck5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIiB0YWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRDb2x1bW4udHlwZSAhPT0gbmV3Q29sdW1uLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvbGRDb2x1bW4ubGVuZ3RoICE9PSBuZXdDb2x1bW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmV3Q29sdW1uLmlzQXJyYXkgIT09IG9sZENvbHVtbi5pc0FycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFvbGRDb2x1bW4uZ2VuZXJhdGVkVHlwZSAmJiBuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAob2xkQ29sdW1uLmFzRXhwcmVzc2lvbiAhPT0gbmV3Q29sdW1uLmFzRXhwcmVzc2lvbiAmJiBuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIikpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGRhdGEgY29udmVyc2lvbiwgd2UganVzdCByZWNyZWF0ZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcENvbHVtbih0YWJsZSwgb2xkQ29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGRhdGEgY29udmVyc2lvbiwgd2UganVzdCByZWNyZWF0ZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYWRkQ29sdW1uKHRhYmxlLCBuZXdDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsb25lZCB0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRDb2x1bW4ubmFtZSAhPT0gbmV3Q29sdW1uLm5hbWUpKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT0xVTU4gXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9sZENvbHVtbi50eXBlID09PSBcImVudW1cIiB8fCBvbGRDb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFVzZXJEZWZpbmVkVHlwZU5hbWUodGFibGUsIG9sZENvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtVHlwZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRZUEUgXFxcIlwiICsgb2xkRW51bVR5cGUuc2NoZW1hICsgXCJcXFwiLlxcXCJcIiArIG9sZEVudW1UeXBlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFwiICsgdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBuZXdDb2x1bW4sIGZhbHNlKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUWVBFIFwiICsgdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBuZXdDb2x1bW4pICsgXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZEVudW1UeXBlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgY29sdW1uIHByaW1hcnkga2V5IGNvbnN0cmFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDb2x1bW4uaXNQcmltYXJ5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMgPSBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBvbGQgY29sdW1uIG5hbWUgd2l0aCBuZXcgY29sdW1uIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcy5zcGxpY2UoY29sdW1uTmFtZXMuaW5kZXhPZihvbGRDb2x1bW4ubmFtZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzLnB1c2gobmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG9sZFBrTmFtZSArIFwiXFxcIiBUTyBcXFwiXCIgKyBuZXdQa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgbmV3UGtOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG9sZFBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgY29sdW1uIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmlzR2VuZXJhdGVkID09PSB0cnVlICYmIG5ld0NvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZVBhdGggPSB0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBvbGRDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOYW1lID0gdGhpcy5idWlsZFNlcXVlbmNlTmFtZSh0YWJsZSwgb2xkQ29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlUGF0aCA9IHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZU5hbWUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKHRhYmxlLCBuZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBcIkFMVEVSIFNFUVVFTkNFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHNlcXVlbmNlUGF0aCkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3U2VxdWVuY2VOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IFwiQUxURVIgU0VRVUVOQ0UgXCIgKyB0aGlzLmVzY2FwZVBhdGgobmV3U2VxdWVuY2VQYXRoKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBzZXF1ZW5jZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkodXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShkb3duKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgdW5pcXVlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5maW5kQ29sdW1uVW5pcXVlcyhvbGRDb2x1bW4pLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG5ldyBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMuc3BsaWNlKHVuaXF1ZS5jb2x1bW5OYW1lcy5pbmRleE9mKG9sZENvbHVtbi5uYW1lKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLnB1c2gobmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdVbmlxdWVOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShjbG9uZWRUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZS5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBuZXdVbmlxdWVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgaW5kZXggY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmZpbmRDb2x1bW5JbmRpY2VzKG9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBuZXcgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY29sdW1uTmFtZXMuc3BsaWNlKGluZGV4LmNvbHVtbk5hbWVzLmluZGV4T2Yob2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcy5wdXNoKG5ld0NvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gX3RoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKS5zY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4TmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKGNsb25lZFRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXAgPSBzY2hlbWEgPyBcIkFMVEVSIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdJbmRleE5hbWUgKyBcIlxcXCJcIiA6IFwiQUxURVIgSU5ERVggXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvd24gPSBzY2hlbWEgPyBcIkFMVEVSIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBuZXdJbmRleE5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIGluZGV4Lm5hbWUgKyBcIlxcXCJcIiA6IFwiQUxURVIgSU5ERVggXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KHVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoZG93bikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgubmFtZSA9IG5ld0luZGV4TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMob2xkQ29sdW1uKS5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMuc3BsaWNlKGZvcmVpZ25LZXkuY29sdW1uTmFtZXMuaW5kZXhPZihvbGRDb2x1bW4ubmFtZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMucHVzaChuZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0ZvcmVpZ25LZXlOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZShjbG9uZWRUYWJsZSwgZm9yZWlnbktleS5jb2x1bW5OYW1lcywgX3RoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgX3RoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09OU1RSQUlOVCBcXFwiXCIgKyBmb3JlaWduS2V5Lm5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgbmV3Rm9yZWlnbktleU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld0ZvcmVpZ25LZXlOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSBuZXdGb3JlaWduS2V5TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGVDb2x1bW4gPSBjbG9uZWRUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG9sZENvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmNvbHVtbnNbY2xvbmVkVGFibGUuY29sdW1ucy5pbmRleE9mKG9sZFRhYmxlQ29sdW1uKV0ubmFtZSA9IG5ld0NvbHVtbi5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uLm5hbWUgPSBuZXdDb2x1bW4ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5wcmVjaXNpb24gIT09IG9sZENvbHVtbi5wcmVjaXNpb24gfHwgbmV3Q29sdW1uLnNjYWxlICE9PSBvbGRDb2x1bW4uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgVFlQRSBcIiArIHRoaXMuZHJpdmVyLmNyZWF0ZUZ1bGxUeXBlKG5ld0NvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgdGhpcy5kcml2ZXIuY3JlYXRlRnVsbFR5cGUob2xkQ29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXdDb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgbmV3Q29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAob2xkQ29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IG9sZENvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFPcm1VdGlscy5pc0FycmF5c0VxdWFsKG5ld0NvbHVtbi5lbnVtLCBvbGRDb2x1bW4uZW51bSkgfHwgbmV3Q29sdW1uLmVudW1OYW1lICE9PSBvbGRDb2x1bW4uZW51bU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlTdWZmaXggPSBuZXdDb2x1bW4uaXNBcnJheSA/IFwiW11cIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIG5ld0NvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIG9sZENvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtTmFtZVdpdGhTY2hlbWFfb2xkID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIHRydWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtTmFtZVdpdGhvdXRTY2hlbWFfb2xkID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIG9sZCBFTlVNXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIG9sZEVudW1OYW1lICsgXCIgUkVOQU1FIFRPIFwiICsgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hX29sZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIG9sZEVudW1OYW1lV2l0aFNjaGVtYV9vbGQgKyBcIiBSRU5BTUUgVE8gXCIgKyBvbGRFbnVtTmFtZVdpdGhvdXRTY2hlbWEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IEVOVU1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZUVudW1UeXBlU3FsKHRhYmxlLCBuZXdDb2x1bW4sIG5ld0VudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmRyb3BFbnVtVHlwZVNxbCh0YWJsZSwgbmV3Q29sdW1uLCBuZXdFbnVtTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbHVtbiBoYXZlIGRlZmF1bHQgdmFsdWUsIHdlIG11c3QgZHJvcCBpdCB0byBhdm9pZCBpc3N1ZXMgd2l0aCB0eXBlIGNhc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmRlZmF1bHQgIT09IG51bGwgJiYgb2xkQ29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGRlZmF1bHQgYXMgY2hhbmdlZCB0byBwcmV2ZW50IGRvdWJsZSB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIERFRkFVTFRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgREVGQVVMVCBcIiArIG9sZENvbHVtbi5kZWZhdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwVHlwZSA9IFwiXCIgKyBuZXdFbnVtTmFtZSArIGFycmF5U3VmZml4ICsgXCIgVVNJTkcgXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCI6OlxcXCJ0ZXh0XFxcIjo6XCIgKyBuZXdFbnVtTmFtZSArIGFycmF5U3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25UeXBlID0gXCJcIiArIG9sZEVudW1OYW1lV2l0aFNjaGVtYV9vbGQgKyBhcnJheVN1ZmZpeCArIFwiIFVTSU5HIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiOjpcXFwidGV4dFxcXCI6OlwiICsgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCArIGFycmF5U3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb2x1bW4gdG8gdXNlIG5ldyB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRZUEUgXCIgKyB1cFR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgZG93blR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGNvbHVtbiBkZWZhdWx0IG9yIGNyZWF0ZSBuZXcgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG5ld0NvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgbmV3Q29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgRFJPUCBERUZBVUxUXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBFTlVNXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wRW51bVR5cGVTcWwodGFibGUsIG9sZENvbHVtbiwgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVFbnVtVHlwZVNxbCh0YWJsZSwgb2xkQ29sdW1uLCBvbGRFbnVtTmFtZVdpdGhTY2hlbWFfb2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmlzTnVsbGFibGUgIT09IG5ld0NvbHVtbi5pc051bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc051bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgU0VUIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgTk9UIE5VTExcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmNvbW1lbnQgIT09IG5ld0NvbHVtbi5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQ09NTUVOVCBPTiBDT0xVTU4gXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIuXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgSVMgXCIgKyB0aGlzLmVzY2FwZUNvbW1lbnQobmV3Q29sdW1uLmNvbW1lbnQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDT01NRU5UIE9OIENPTFVNTiBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIi5cXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBJUyBcIiArIHRoaXMuZXNjYXBlQ29tbWVudChvbGRDb2x1bW4uY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb2x1bW4uaXNQcmltYXJ5ICE9PSBvbGRDb2x1bW4uaXNQcmltYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMgPSBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwcmltYXJ5IGNvbHVtbiBzdGF0ZSBjaGFuZ2VkLCB3ZSBtdXN0IGFsd2F5cyBkcm9wIGV4aXN0ZWQgY29uc3RyYWludC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa05hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1ByaW1hcnkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMucHVzaChuZXdDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBjbG9uZWRUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG5ld0NvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbiA9IHByaW1hcnlDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gbmV3Q29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1ucy5zcGxpY2UocHJpbWFyeUNvbHVtbnMuaW5kZXhPZihwcmltYXJ5Q29sdW1uKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNsb25lZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gbmV3Q29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW5vdGhlciBwcmltYXJ5IGtleXMsIHdlIG11c3QgcmVjcmVhdGUgY29uc3RyYWludC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1VuaXF1ZSAhPT0gb2xkQ29sdW1uLmlzVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1VuaXF1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW25ld0NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW25ld0NvbHVtbi5uYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgVU5JUVVFIChcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludCA9IGNsb25lZFRhYmxlLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiAhIXVuaXF1ZS5jb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBuZXdDb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS51bmlxdWVzLnNwbGljZShjbG9uZWRUYWJsZS51bmlxdWVzLmluZGV4T2YodW5pcXVlQ29uc3RyYWludCksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgVU5JUVVFIChcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDb2x1bW4uaXNHZW5lcmF0ZWQgIT09IG5ld0NvbHVtbi5pc0dlbmVyYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgIT09IFwidXVpZFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc0dlbmVyYXRlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyBcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiIE9XTkVEIEJZIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJEUk9QIFNFUVVFTkNFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbikpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgREVGQVVMVCBuZXh0dmFsKCdcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiJylcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIERFRkFVTFRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIERST1AgREVGQVVMVFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIG5leHR2YWwoJ1wiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbikpICsgXCInKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkRST1AgU0VRVUVOQ0UgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGhpcy5idWlsZFNlcXVlbmNlUGF0aCh0YWJsZSwgbmV3Q29sdW1uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyBcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiIE9XTkVEIEJZIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBtaWdodCBoYXZlIGNoYW5nZWQgd2hlbiB0aGUgZW51bSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uLmRlZmF1bHQgIT09IG9sZENvbHVtbi5kZWZhdWx0ICYmICFkZWZhdWx0VmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG5ld0NvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgbmV3Q29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG9sZENvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgb2xkQ29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIERST1AgREVGQVVMVFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkQ29sdW1uLmRlZmF1bHQgIT09IG51bGwgJiYgb2xkQ29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgRFJPUCBERUZBVUxUXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgU0VUIERFRkFVTFQgXCIgKyBvbGRDb2x1bW4uZGVmYXVsdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV3Q29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpICE9PSAob2xkQ29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpIHx8IG5ld0NvbHVtbi5zcmlkICE9PSBvbGRDb2x1bW4uc3JpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgdGhpcy5kcml2ZXIuY3JlYXRlRnVsbFR5cGUobmV3Q29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRZUEUgXCIgKyB0aGlzLmRyaXZlci5jcmVhdGVGdWxsVHlwZShvbGRDb2x1bW4pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSAhPT0gb2xkQ29sdW1uLmdlbmVyYXRlZFR5cGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghbmV3Q29sdW1uLmdlbmVyYXRlZFR5cGUgfHwgbmV3Q29sdW1uLmdlbmVyYXRlZFR5cGUgPT09IFwiVklSVFVBTFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRUYWJsZU5hbWVXaXRoU2NoZW1hKHRhYmxlLm5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Iuc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09MVU1OIFxcXCJcIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiIFRPIFxcXCJURU1QX09MRF9cIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBcIiArIHRoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwodGFibGUsIG5ld0NvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIlVQREFURSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBTRVQgXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgPSBcXFwiVEVNUF9PTERfXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTFVNTiBcXFwiVEVNUF9PTERfXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZHJpdmVyLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvbGRDb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgY2FuJ3QgY29weSBpdCBiYWNrIG9uIGRvd25ncmFkZS4gSXQgbmVlZHMgdG8gcmVnZW5lcmF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgXCIgKyB0aGlzLmJ1aWxkQ3JlYXRlQ29sdW1uU3FsKHRhYmxlLCBvbGRDb2x1bW4pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5ld0NvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9sZENvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvbGRDb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2hhbmdlQ29sdW1ucyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hhbmdlZENvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZWRDb2x1bW5zXzEsIGNoYW5nZWRDb2x1bW5zXzFfMSwgX2EsIG9sZENvbHVtbiwgbmV3Q29sdW1uLCBlXzVfMTtcbiAgICAgICAgICAgIHZhciBlXzUsIF9iO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uc18xID0gX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpLCBjaGFuZ2VkQ29sdW1uc18xXzEgPSBjaGFuZ2VkQ29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBjaGFuZ2VkQ29sdW1uc18xXzEudmFsdWUsIG9sZENvbHVtbiA9IF9hLm9sZENvbHVtbiwgbmV3Q29sdW1uID0gX2EubmV3Q29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGFuZ2VDb2x1bW4odGFibGVPck5hbWUsIG9sZENvbHVtbiwgbmV3Q29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMV8xID0gY2hhbmdlZENvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zXzFfMSAmJiAhY2hhbmdlZENvbHVtbnNfMV8xLmRvbmUgJiYgKF9iID0gY2hhbmdlZENvbHVtbnNfMS5yZXR1cm4pKSBfYi5jYWxsKGNoYW5nZWRDb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5Pck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY29sdW1uLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgcGtOYW1lLCBjb2x1bW5OYW1lcywgdGFibGVDb2x1bW4sIHBrTmFtZV8yLCBjb2x1bW5OYW1lc18yLCBjb2x1bW5JbmRleCwgY29sdW1uQ2hlY2ssIGNvbHVtblVuaXF1ZSwgaGFzRW51bSwgZW51bVR5cGUsIGVzY2FwZWRFbnVtTmFtZSwgdGFibGVOYW1lV2l0aFNjaGVtYSwgdGFibGVOYW1lLCBzY2hlbWEsIGluc2VydFF1ZXJ5LCBkZWxldGVRdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW5Pck5hbWUgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbk9yTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHByaW1hcnkga2V5IGNvbnN0cmFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNQcmltYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBwcmltYXJ5Q29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgoY2xvbmVkVGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbiA9IGNsb25lZFRhYmxlLmZpbmRDb2x1bW5CeU5hbWUoY29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHByaW1hcnkga2V5IGhhdmUgbXVsdGlwbGUgY29sdW1ucywgd2UgbXVzdCByZWNyZWF0ZSBpdCB3aXRob3V0IGRyb3BwZWQgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lXzIgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc18yID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIHByaW1hcnlDb2x1bW4ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZV8yICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzXzIgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMiArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSBjbG9uZWRUYWJsZS5pbmRpY2VzLmZpbmQoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBpbmRleC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgaW5kZXguY29sdW1uTmFtZXNbMF0gPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmluZGljZXMuc3BsaWNlKGNsb25lZFRhYmxlLmluZGljZXMuaW5kZXhPZihjb2x1bW5JbmRleCksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBjb2x1bW5JbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgY29sdW1uSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNoZWNrID0gY2xvbmVkVGFibGUuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGNoZWNrKSB7IHJldHVybiAhIWNoZWNrLmNvbHVtbk5hbWVzICYmIGNoZWNrLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBjaGVjay5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUuY2hlY2tzLnNwbGljZShjbG9uZWRUYWJsZS5jaGVja3MuaW5kZXhPZihjb2x1bW5DaGVjayksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY29sdW1uQ2hlY2spKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50U3FsKHRhYmxlLCBjb2x1bW5DaGVjaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVW5pcXVlID0gY2xvbmVkVGFibGUudW5pcXVlcy5maW5kKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIHVuaXF1ZS5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgdW5pcXVlLmNvbHVtbk5hbWVzWzBdID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5zcGxpY2UoY2xvbmVkVGFibGUudW5pcXVlcy5pbmRleE9mKGNvbHVtblVuaXF1ZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIGNvbHVtblVuaXF1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50U3FsKHRhYmxlLCBjb2x1bW5VbmlxdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09MVU1OIFxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIFwiICsgdGhpcy5idWlsZENyZWF0ZUNvbHVtblNxbCh0YWJsZSwgY29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRW51bVR5cGUodGFibGUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFbnVtID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNFbnVtKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSh0YWJsZSwgY29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1UeXBlID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEVudW1OYW1lID0gXCJcXFwiXCIgKyBlbnVtVHlwZS5zY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgZW51bVR5cGUubmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZXNjYXBlZEVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZXNjYXBlZEVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbHVtbi5nZW5lcmF0ZWRUeXBlID09PSBcIlNUT1JFRFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFRhYmxlTmFtZVdpdGhTY2hlbWEodGFibGUubmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVXaXRoU2NoZW1hID0gKF9iLnNlbnQoKSkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSB0YWJsZU5hbWVXaXRoU2NoZW1hWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UXVlcnkgPSB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZHJpdmVyLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKGluc2VydFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5yZW1vdmVDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zXzIsIGNvbHVtbnNfMl8xLCBjb2x1bW4sIGVfNl8xO1xuICAgICAgICAgICAgdmFyIGVfNiwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMiA9IF9fdmFsdWVzKGNvbHVtbnMpLCBjb2x1bW5zXzJfMSA9IGNvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNvbHVtbnNfMl8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BDb2x1bW4odGFibGVPck5hbWUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMl8xID0gY29sdW1uc18yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzZfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uc18yXzEgJiYgIWNvbHVtbnNfMl8xLmRvbmUgJiYgKF9hID0gY29sdW1uc18yLnJldHVybikpIF9hLmNhbGwoY29sdW1uc18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV82KSB0aHJvdyBlXzYuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJpbWFyeSBrZXkuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlUHJpbWFyeUtleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2xvbmVkVGFibGUsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlUHJpbWFyeUtleVNxbCh0YWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIHByaW1hcnksIGJlY2F1c2UgZHJvcFByaW1hcnlLZXlTcWwgYnVpbGQgY29uc3RyYWludCBuYW1lIGZyb20gdGFibGUgcHJpbWFyeSBjb2x1bW4gbmFtZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBjb2x1bW4ubmFtZTsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc1ByaW1hcnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wUHJpbWFyeUtleVNxbChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBjb21wb3NpdGUgcHJpbWFyeSBrZXlzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnVwZGF0ZVByaW1hcnlLZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNsb25lZFRhYmxlLCBjb2x1bW5OYW1lcywgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZV8zLCBjb2x1bW5OYW1lc1N0cmluZ18xLCBwa05hbWUsIGNvbHVtbk5hbWVzU3RyaW5nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZV8zID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBwcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc1N0cmluZ18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMyArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMyArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lc1N0cmluZ18xICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb2x1bW5zIGluIHRhYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW4ubmFtZSkgIT09IC0xOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnkgPSB0cnVlOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZXNTdHJpbmcgPSBjb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXNTdHJpbmcgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VDYWNoZWRUYWJsZSh0YWJsZSwgY2xvbmVkVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGEgcHJpbWFyeSBrZXkuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFByaW1hcnlLZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wUHJpbWFyeUtleVNxbCh0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5jcmVhdGVQcmltYXJ5S2V5U3FsKHRhYmxlLCB0YWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHVuaXF1ZSBjb25zdHJhaW50IG1heSBiZSBwYXNzZWQgd2l0aG91dCBuYW1lLiBJbiB0aGlzIGNhc2Ugd2UgZ2VuZXJhdGUgdW5pcXVlIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVuaXF1ZUNvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuZHJvcFVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVVbmlxdWVDb25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVuaXF1ZUNvbnN0cmFpbnRzXzEsIHVuaXF1ZUNvbnN0cmFpbnRzXzFfMSwgdW5pcXVlQ29uc3RyYWludCwgZV83XzE7XG4gICAgICAgICAgICB2YXIgZV83LCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludHNfMSA9IF9fdmFsdWVzKHVuaXF1ZUNvbnN0cmFpbnRzKSwgdW5pcXVlQ29uc3RyYWludHNfMV8xID0gdW5pcXVlQ29uc3RyYWludHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXVuaXF1ZUNvbnN0cmFpbnRzXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50c18xXzEgPSB1bmlxdWVDb25zdHJhaW50c18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzdfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNyA9IHsgZXJyb3I6IGVfN18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludHNfMV8xICYmICF1bmlxdWVDb25zdHJhaW50c18xXzEuZG9uZSAmJiAoX2EgPSB1bmlxdWVDb25zdHJhaW50c18xLnJldHVybikpIF9hLmNhbGwodW5pcXVlQ29uc3RyYWludHNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIHVuaXF1ZUNvbnN0cmFpbnQsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUgOiB0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUubmFtZSA9PT0gdW5pcXVlT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgdW5pcXVlIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmRyb3BVbmlxdWVDb25zdHJhaW50U3FsKHRhYmxlLCB1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVDb25zdHJhaW50c18yLCB1bmlxdWVDb25zdHJhaW50c18yXzEsIHVuaXF1ZUNvbnN0cmFpbnQsIGVfOF8xO1xuICAgICAgICAgICAgdmFyIGVfOCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzXzIgPSBfX3ZhbHVlcyh1bmlxdWVDb25zdHJhaW50cyksIHVuaXF1ZUNvbnN0cmFpbnRzXzJfMSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF1bmlxdWVDb25zdHJhaW50c18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludHNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wVW5pcXVlQ29uc3RyYWludCh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzXzJfMSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOF8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV84ID0geyBlcnJvcjogZV84XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVDb25zdHJhaW50c18yXzEgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzXzJfMS5kb25lICYmIChfYSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIucmV0dXJuKSkgX2EuY2FsbCh1bmlxdWVDb25zdHJhaW50c18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV84KSB0aHJvdyBlXzguZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja0NvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyB1bmlxdWUgY29uc3RyYWludCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIHVuaXF1ZSBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NvbnN0cmFpbnQubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jaGVja0NvbnN0cmFpbnROYW1lKHRhYmxlLCBjaGVja0NvbnN0cmFpbnQuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50U3FsKHRhYmxlLCBjaGVja0NvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hlY2tDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBjaGVja0NvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoY2hlY2tDb25zdHJhaW50KSB7IHJldHVybiBfdGhpcy5jcmVhdGVDaGVja0NvbnN0cmFpbnQodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwocHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENoZWNrQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hlY2tPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hlY2tDb25zdHJhaW50LCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb25zdHJhaW50ID0gY2hlY2tPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNoZWNrID8gY2hlY2tPck5hbWUgOiB0YWJsZS5jaGVja3MuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBjaGVja09yTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgY2hlY2sgY29uc3RyYWludCB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFwiICsgdGFibGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUNoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENoZWNrQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gY2hlY2tDb25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGNoZWNrQ29uc3RyYWludCkgeyByZXR1cm4gX3RoaXMuZHJvcENoZWNrQ29uc3RyYWludCh0YWJsZU9yTmFtZSwgY2hlY2tDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHVuaXF1ZSBjb25zdHJhaW50IG1heSBiZSBwYXNzZWQgd2l0aG91dCBuYW1lLiBJbiB0aGlzIGNhc2Ugd2UgZ2VuZXJhdGUgdW5pcXVlIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1c2lvbkNvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25Db25zdHJhaW50Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludFNxbCh0YWJsZSwgZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wRXhjbHVzaW9uQ29uc3RyYWludFNxbCh0YWJsZSwgZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZEV4Y2x1c2lvbkNvbnN0cmFpbnQoZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleGNsdXNpb25Db25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBleGNsdXNpb25Db25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnQodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBleGNsdXNpb24gY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGV4Y2x1c2lvbkNvbnN0cmFpbnQsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25Db25zdHJhaW50ID0gZXhjbHVzaW9uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVFeGNsdXNpb24gPyBleGNsdXNpb25Pck5hbWUgOiB0YWJsZS5leGNsdXNpb25zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gZXhjbHVzaW9uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVzaW9uQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgZXhjbHVzaW9uIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmRyb3BFeGNsdXNpb25Db25zdHJhaW50U3FsKHRhYmxlLCBleGNsdXNpb25Db25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRTcWwodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVFeGNsdXNpb25Db25zdHJhaW50KGV4Y2x1c2lvbkNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcyA9IGV4Y2x1c2lvbkNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZXhjbHVzaW9uQ29uc3RyYWludCkgeyByZXR1cm4gX3RoaXMuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnQodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZvcmVpZ24ga2V5LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBGSyBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIEZLIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcmVpZ25LZXkubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUodGFibGUsIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMsIHRoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZEZvcmVpZ25LZXkoZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBmb3JlaWduIGtleXMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRm9yZWlnbktleXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXlzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c18xLCBmb3JlaWduS2V5c18xXzEsIGZvcmVpZ25LZXksIGVfOV8xO1xuICAgICAgICAgICAgdmFyIGVfOSwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzEgPSBfX3ZhbHVlcyhmb3JlaWduS2V5cyksIGZvcmVpZ25LZXlzXzFfMSA9IGZvcmVpZ25LZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFmb3JlaWduS2V5c18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVGb3JlaWduS2V5KHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNfMV8xID0gZm9yZWlnbktleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV85XzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzkgPSB7IGVycm9yOiBlXzlfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXlzXzFfMSAmJiAhZm9yZWlnbktleXNfMV8xLmRvbmUgJiYgKF9hID0gZm9yZWlnbktleXNfMS5yZXR1cm4pKSBfYS5jYWxsKGZvcmVpZ25LZXlzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleSBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBmb3JlaWduS2V5LCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleSA9IGZvcmVpZ25LZXlPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkgPyBmb3JlaWduS2V5T3JOYW1lIDogdGFibGUuZm9yZWlnbktleXMuZmluZChmdW5jdGlvbiAoZmspIHsgcmV0dXJuIGZrLm5hbWUgPT09IGZvcmVpZ25LZXlPck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JlaWduS2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTdXBwbGllZCBmb3JlaWduIGtleSB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFwiICsgdGFibGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuZHJvcEZvcmVpZ25LZXlTcWwodGFibGUsIGZvcmVpZ25LZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuY3JlYXRlRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleXMgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9yZWlnbktleXNfMiwgZm9yZWlnbktleXNfMl8xLCBmb3JlaWduS2V5LCBlXzEwXzE7XG4gICAgICAgICAgICB2YXIgZV8xMCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzIgPSBfX3ZhbHVlcyhmb3JlaWduS2V5cyksIGZvcmVpZ25LZXlzXzJfMSA9IGZvcmVpZ25LZXlzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFmb3JlaWduS2V5c18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleXNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wRm9yZWlnbktleSh0YWJsZU9yTmFtZSwgZm9yZWlnbktleSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzJfMSA9IGZvcmVpZ25LZXlzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTBfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTAgPSB7IGVycm9yOiBlXzEwXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JlaWduS2V5c18yXzEgJiYgIWZvcmVpZ25LZXlzXzJfMS5kb25lICYmIChfYSA9IGZvcmVpZ25LZXlzXzIucmV0dXJuKSkgX2EuY2FsbChmb3JlaWduS2V5c18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMCkgdGhyb3cgZV8xMC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRleC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluZGV4Lm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUodGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmRyb3BJbmRleFNxbCh0YWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRpY2VzXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlc18xLCBpbmRpY2VzXzFfMSwgaW5kZXgsIGVfMTFfMTtcbiAgICAgICAgICAgIHZhciBlXzExLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc18xID0gX192YWx1ZXMoaW5kaWNlcyksIGluZGljZXNfMV8xID0gaW5kaWNlc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhaW5kaWNlc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVJbmRleCh0YWJsZU9yTmFtZSwgaW5kZXgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzFfMSA9IGluZGljZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMV8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMSA9IHsgZXJyb3I6IGVfMTFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGljZXNfMV8xICYmICFpbmRpY2VzXzFfMS5kb25lICYmIChfYSA9IGluZGljZXNfMS5yZXR1cm4pKSBfYS5jYWxsKGluZGljZXNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTEpIHRocm93IGVfMTEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGV4IGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgaW5kZXgsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lIDogdGFibGUuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWUgPT09IGluZGV4T3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGluZGV4IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbiBpbmRpY2VzIGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRpY2VzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBpbmRpY2VzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbmRpY2VzXzIsIGluZGljZXNfMl8xLCBpbmRleCwgZV8xMl8xO1xuICAgICAgICAgICAgdmFyIGVfMTIsIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzIgPSBfX3ZhbHVlcyhpbmRpY2VzKSwgaW5kaWNlc18yXzEgPSBpbmRpY2VzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFpbmRpY2VzXzJfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BJbmRleCh0YWJsZU9yTmFtZSwgaW5kZXgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzJfMSA9IGluZGljZXNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMiA9IHsgZXJyb3I6IGVfMTJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGljZXNfMl8xICYmICFpbmRpY2VzXzJfMS5kb25lICYmIChfYSA9IGluZGljZXNfMi5yZXR1cm4pKSBfYS5jYWxsKGluZGljZXNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgdGFibGUgY29udGVudHMuXG4gICAgICogTm90ZTogdGhpcyBvcGVyYXRpb24gdXNlcyBTUUwncyBUUlVOQ0FURSBxdWVyeSB3aGljaCBjYW5ub3QgYmUgcmV2ZXJ0ZWQgaW4gdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyVGFibGUgPSBmdW5jdGlvbiAodGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlRSVU5DQVRFIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlTmFtZSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRhYmxlcyBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzY2hlbWFzLCBzY2hlbWFOYW1lc1N0cmluZywgdmVyc2lvbiwgc2VsZWN0Vmlld0Ryb3BzUXVlcnksIGRyb3BWaWV3UXVlcmllcywgc2VsZWN0TWF0Vmlld0Ryb3BzUXVlcnksIGRyb3BNYXRWaWV3UXVlcmllcywgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5LCBkcm9wVGFibGVRdWVyaWVzLCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBtZXRhZGF0YS5zY2hlbWE7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2NoZW1hRXhpc3QgPSAhIXNjaGVtYXMuZmluZChmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgPT09IG1ldGFkYXRhLnNjaGVtYTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjaGVtYUV4aXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLnB1c2gobWV0YWRhdGEuc2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hcy5wdXNoKHRoaXMuZHJpdmVyLm9wdGlvbnMuc2NoZW1hIHx8IFwiY3VycmVudF9zY2hlbWEoKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYU5hbWVzU3RyaW5nID0gc2NoZW1hcy5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJjdXJyZW50X3NjaGVtYSgpXCIgPyBuYW1lIDogXCInXCIgKyBuYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCAxMywgLCAxOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRWZXJzaW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHZpZXdzXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIElGIEVYSVNUUyBcXFwiJyB8fCBzY2hlbWFuYW1lIHx8ICdcXFwiLlxcXCInIHx8IHZpZXduYW1lIHx8ICdcXFwiIENBU0NBREU7JyBhcyBcXFwicXVlcnlcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJGUk9NIFxcXCJwZ192aWV3c1xcXCIgV0hFUkUgXFxcInNjaGVtYW5hbWVcXFwiIElOIChcIiArIHNjaGVtYU5hbWVzU3RyaW5nICsgXCIpIEFORCBcXFwidmlld25hbWVcXFwiIE5PVCBJTiAoJ2dlb2dyYXBoeV9jb2x1bW5zJywgJ2dlb21ldHJ5X2NvbHVtbnMnLCAncmFzdGVyX2NvbHVtbnMnLCAncmFzdGVyX292ZXJ2aWV3cycpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RWaWV3RHJvcHNRdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wVmlld1F1ZXJpZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChkcm9wVmlld1F1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZlcnNpb25VdGlscy5pc0dyZWF0ZXJPckVxdWFsKHZlcnNpb24sIFwiOS4zXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE1hdFZpZXdEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgTUFURVJJQUxJWkVEIFZJRVcgSUYgRVhJU1RTIFxcXCInIHx8IHNjaGVtYW5hbWUgfHwgJ1xcXCIuXFxcIicgfHwgbWF0dmlld25hbWUgfHwgJ1xcXCIgQ0FTQ0FERTsnIGFzIFxcXCJxdWVyeVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkZST00gXFxcInBnX21hdHZpZXdzXFxcIiBXSEVSRSBcXFwic2NoZW1hbmFtZVxcXCIgSU4gKFwiICsgc2NoZW1hTmFtZXNTdHJpbmcgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNlbGVjdE1hdFZpZXdEcm9wc1F1ZXJ5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRWaWV3UXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BNYXRWaWV3UXVlcmllcy5tYXAoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5KHFbXCJxdWVyeVwiXSk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgSUYgRVhJU1RTIFxcXCInIHx8IHNjaGVtYW5hbWUgfHwgJ1xcXCIuXFxcIicgfHwgdGFibGVuYW1lIHx8ICdcXFwiIENBU0NBREU7JyBhcyBcXFwicXVlcnlcXFwiIEZST00gXFxcInBnX3RhYmxlc1xcXCIgV0hFUkUgXFxcInNjaGVtYW5hbWVcXFwiIElOIChcIiArIHNjaGVtYU5hbWVzU3RyaW5nICsgXCIpIEFORCBcXFwidGFibGVuYW1lXFxcIiBOT1QgSU4gKCdzcGF0aWFsX3JlZl9zeXMnKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBlbnVtIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BFbnVtVHlwZXMoc2NoZW1hTmFtZXNTdHJpbmcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgZW51bSB0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVmlld3MgPSBmdW5jdGlvbiAodmlld05hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoYXNUYWJsZSwgY3VycmVudERhdGFiYXNlLCBjdXJyZW50U2NoZW1hLCB2aWV3c0NvbmRpdGlvbiwgcXVlcnksIGRiVmlld3M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRoaXMuZ2V0VHlwZW9ybU1ldGFkYXRhVGFibGVOYW1lKCkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFibGUgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1RhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50RGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhYmFzZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q3VycmVudFNjaGVtYSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjaGVtYSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdzQ29uZGl0aW9uID0gdmlld05hbWVzLmxlbmd0aCA9PT0gMCA/IFwiMT0xXCIgOiB2aWV3TmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh0YWJsZU5hbWUpIHsgcmV0dXJuIF90aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZU5hbWUpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IF9hLnNjaGVtYSwgdGFibGVOYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IF90aGlzLmRyaXZlci5vcHRpb25zLnNjaGVtYSB8fCBjdXJyZW50U2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIoXFxcInRcXFwiLlxcXCJzY2hlbWFcXFwiID0gJ1wiICsgc2NoZW1hICsgXCInIEFORCBcXFwidFxcXCIuXFxcIm5hbWVcXFwiID0gJ1wiICsgdGFibGVOYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IFwiU0VMRUNUIFxcXCJ0XFxcIi4qIEZST00gXCIgKyB0aGlzLmVzY2FwZVBhdGgodGhpcy5nZXRUeXBlb3JtTWV0YWRhdGFUYWJsZU5hbWUoKSkgKyBcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY2F0YWxvZ1xcXCIuXFxcInBnX2NsYXNzXFxcIiBcXFwiY1xcXCIgT04gXFxcImNcXFwiLlxcXCJyZWxuYW1lXFxcIiA9IFxcXCJ0XFxcIi5cXFwibmFtZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwiblxcXCIgT04gXFxcIm5cXFwiLlxcXCJvaWRcXFwiID0gXFxcImNcXFwiLlxcXCJyZWxuYW1lc3BhY2VcXFwiIEFORCBcXFwiblxcXCIuXFxcIm5zcG5hbWVcXFwiID0gXFxcInRcXFwiLlxcXCJzY2hlbWFcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwidFxcXCIuXFxcInR5cGVcXFwiIElOICgnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXICsgXCInLCAnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyArIFwiJykgXCIgKyAodmlld3NDb25kaXRpb24gPyBcIkFORCAoXCIgKyB2aWV3c0NvbmRpdGlvbiArIFwiKVwiIDogXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYlZpZXdzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRiVmlld3MubWFwKGZ1bmN0aW9uIChkYlZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgVmlldygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gZGJWaWV3W1wic2NoZW1hXCJdID09PSBjdXJyZW50U2NoZW1hICYmICFfdGhpcy5kcml2ZXIub3B0aW9ucy5zY2hlbWEgPyB1bmRlZmluZWQgOiBkYlZpZXdbXCJzY2hlbWFcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGF0YWJhc2UgPSBjdXJyZW50RGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuc2NoZW1hID0gZGJWaWV3W1wic2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Lm5hbWUgPSBfdGhpcy5kcml2ZXIuYnVpbGRUYWJsZU5hbWUoZGJWaWV3W1wibmFtZVwiXSwgc2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5leHByZXNzaW9uID0gZGJWaWV3W1widmFsdWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcubWF0ZXJpYWxpemVkID0gZGJWaWV3W1widHlwZVwiXSA9PT0gTWV0YWRhdGFUYWJsZVR5cGUuTUFURVJJQUxJWkVEX1ZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBhbGwgdGFibGVzICh3aXRoIGdpdmVuIG5hbWVzKSBmcm9tIHRoZSBkYXRhYmFzZSBhbmQgY3JlYXRlcyBhIFRhYmxlIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVGFibGVzID0gZnVuY3Rpb24gKHRhYmxlTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTY2hlbWEsIGN1cnJlbnREYXRhYmFzZSwgZGJUYWJsZXMsIHRhYmxlc1NxbCwgX2EsIF9iLCBfYywgX2QsIHRhYmxlc0NvbmRpdGlvbiwgdGFibGVzU3FsLCBfZSwgX2YsIF9nLCBfaCwgY29sdW1uc0NvbmRpdGlvbiwgY29sdW1uc1NxbCwgY29uc3RyYWludHNDb25kaXRpb24sIGNvbnN0cmFpbnRzU3FsLCBpbmRpY2VzU3FsLCBmb3JlaWduS2V5c0NvbmRpdGlvbiwgaGFzUmVsaXNwYXJ0aXRpb25Db2x1bW4sIGlzUGFydGl0aW9uQ29uZGl0aW9uLCBmb3JlaWduS2V5c1NxbCwgX2osIGRiQ29sdW1ucywgZGJDb25zdHJhaW50cywgZGJJbmRpY2VzLCBkYkZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2spIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9rLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRhYmxlcyBnaXZlbiB0aGVuIG5vIG5lZWQgdG8gcHJvY2VlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlTmFtZXMgJiYgdGFibGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50U2NoZW1hKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2NoZW1hID0gX2suc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50RGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhYmFzZSA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiVGFibGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0YWJsZU5hbWVzKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlc1NxbCA9IFwiU0VMRUNUIFxcXCJ0YWJsZV9zY2hlbWFcXFwiLCBcXFwidGFibGVfbmFtZVxcXCIgRlJPTSBcXFwiaW5mb3JtYXRpb25fc2NoZW1hXFxcIi5cXFwidGFibGVzXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSAoX2EgPSBkYlRhYmxlcy5wdXNoKS5hcHBseTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gW2RiVGFibGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kID0gW1tdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkodGFibGVzU3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmFwcGx5KF9hLCBfYy5jb25jYXQoW19fc3ByZWFkQXJyYXkuYXBwbHkodm9pZCAwLCBfZC5jb25jYXQoW19fcmVhZC5hcHBseSh2b2lkIDAsIFtfay5zZW50KCldKSwgZmFsc2VdKSldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzQ29uZGl0aW9uID0gdGFibGVOYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhYmxlTmFtZSkgeyByZXR1cm4gX3RoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlTmFtZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZU5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgKHNjaGVtYSB8fCBjdXJyZW50U2NoZW1hKSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgdGFibGVOYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNTcWwgPSBcIlNFTEVDVCBcXFwidGFibGVfc2NoZW1hXFxcIiwgXFxcInRhYmxlX25hbWVcXFwiIEZST00gXFxcImluZm9ybWF0aW9uX3NjaGVtYVxcXCIuXFxcInRhYmxlc1xcXCIgV0hFUkUgXCIgKyB0YWJsZXNDb25kaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBfZiA9IChfZSA9IGRiVGFibGVzLnB1c2gpLmFwcGx5O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2cgPSBbZGJUYWJsZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2ggPSBbW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeSh0YWJsZXNTcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2YuYXBwbHkoX2UsIF9nLmNvbmNhdChbX19zcHJlYWRBcnJheS5hcHBseSh2b2lkIDAsIF9oLmNvbmNhdChbX19yZWFkLmFwcGx5KHZvaWQgMCwgW19rLnNlbnQoKV0pLCBmYWxzZV0pKV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9rLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFibGVzIHdlcmUgbm90IGZvdW5kIGluIHRoZSBkYiwgbm8gbmVlZCB0byBwcm9jZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJUYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNDb25kaXRpb24gPSBkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlX3NjaGVtYSA9IF9hLnRhYmxlX3NjaGVtYSwgdGFibGVfbmFtZSA9IF9hLnRhYmxlX25hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgdGFibGVfc2NoZW1hICsgXCInIEFORCBcXFwidGFibGVfbmFtZVxcXCIgPSAnXCIgKyB0YWJsZV9uYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zU3FsID0gXCJTRUxFQ1QgY29sdW1ucy4qLCBwZ19jYXRhbG9nLmNvbF9kZXNjcmlwdGlvbigoJ1xcXCInIHx8IHRhYmxlX2NhdGFsb2cgfHwgJ1xcXCIuXFxcIicgfHwgdGFibGVfc2NoZW1hIHx8ICdcXFwiLlxcXCInIHx8IHRhYmxlX25hbWUgfHwgJ1xcXCInKTo6cmVnY2xhc3M6Om9pZCwgb3JkaW5hbF9wb3NpdGlvbikgQVMgZGVzY3JpcHRpb24sIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIignXFxcIicgfHwgXFxcInVkdF9zY2hlbWFcXFwiIHx8ICdcXFwiLlxcXCInIHx8IFxcXCJ1ZHRfbmFtZVxcXCIgfHwgJ1xcXCInKTo6XFxcInJlZ3R5cGVcXFwiIEFTIFxcXCJyZWd0eXBlXFxcIiwgcGdfY2F0YWxvZy5mb3JtYXRfdHlwZShcXFwiY29sX2F0dHJcXFwiLlxcXCJhdHR0eXBpZFxcXCIsIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dHR5cG1vZFxcXCIpIEFTIFxcXCJmb3JtYXRfdHlwZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRlJPTSBcXFwiaW5mb3JtYXRpb25fc2NoZW1hXFxcIi5cXFwiY29sdW1uc1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTEVGVCBKT0lOIFxcXCJwZ19jYXRhbG9nXFxcIi5cXFwicGdfYXR0cmlidXRlXFxcIiBBUyBcXFwiY29sX2F0dHJcXFwiIE9OIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dG5hbWVcXFwiID0gXFxcImNvbHVtbnNcXFwiLlxcXCJjb2x1bW5fbmFtZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQU5EIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dHJlbGlkXFxcIiA9ICggXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VMRUNUIFxcXCJjbHNcXFwiLlxcXCJvaWRcXFwiIEZST00gXFxcInBnX2NhdGFsb2dcXFwiLlxcXCJwZ19jbGFzc1xcXCIgQVMgXFxcImNsc1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTEVGVCBKT0lOIFxcXCJwZ19jYXRhbG9nXFxcIi5cXFwicGdfbmFtZXNwYWNlXFxcIiBBUyBcXFwibnNcXFwiIE9OIFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwiY2xzXFxcIi5cXFwicmVsbmFtZXNwYWNlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJXSEVSRSBcXFwiY2xzXFxcIi5cXFwicmVsbmFtZVxcXCIgPSBcXFwiY29sdW1uc1xcXCIuXFxcInRhYmxlX25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFORCBcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiA9IFxcXCJjb2x1bW5zXFxcIi5cXFwidGFibGVfc2NoZW1hXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIldIRVJFIFwiICsgY29sdW1uc0NvbmRpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzQ29uZGl0aW9uID0gZGJUYWJsZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZV9zY2hlbWEgPSBfYS50YWJsZV9zY2hlbWEsIHRhYmxlX25hbWUgPSBfYS50YWJsZV9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIihcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiA9ICdcIiArIHRhYmxlX3NjaGVtYSArIFwiJyBBTkQgXFxcInRcXFwiLlxcXCJyZWxuYW1lXFxcIiA9ICdcIiArIHRhYmxlX25hbWUgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzU3FsID0gXCJTRUxFQ1QgXFxcIm5zXFxcIi5cXFwibnNwbmFtZVxcXCIgQVMgXFxcInRhYmxlX3NjaGVtYVxcXCIsIFxcXCJ0XFxcIi5cXFwicmVsbmFtZVxcXCIgQVMgXFxcInRhYmxlX25hbWVcXFwiLCBcXFwiY25zdFxcXCIuXFxcImNvbm5hbWVcXFwiIEFTIFxcXCJjb25zdHJhaW50X25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwZ19nZXRfY29uc3RyYWludGRlZihcXFwiY25zdFxcXCIuXFxcIm9pZFxcXCIpIEFTIFxcXCJleHByZXNzaW9uXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ0FTRSBcXFwiY25zdFxcXCIuXFxcImNvbnR5cGVcXFwiIFdIRU4gJ3AnIFRIRU4gJ1BSSU1BUlknIFdIRU4gJ3UnIFRIRU4gJ1VOSVFVRScgV0hFTiAnYycgVEhFTiAnQ0hFQ0snIFdIRU4gJ3gnIFRIRU4gJ0VYQ0xVREUnIEVORCBBUyBcXFwiY29uc3RyYWludF90eXBlXFxcIiwgXFxcImFcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZST00gXFxcInBnX2NvbnN0cmFpbnRcXFwiIFxcXCJjbnN0XFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19jbGFzc1xcXCIgXFxcInRcXFwiIE9OIFxcXCJ0XFxcIi5cXFwib2lkXFxcIiA9IFxcXCJjbnN0XFxcIi5cXFwiY29ucmVsaWRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5zXFxcIiBPTiBcXFwibnNcXFwiLlxcXCJvaWRcXFwiID0gXFxcImNuc3RcXFwiLlxcXCJjb25uYW1lc3BhY2VcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkxFRlQgSk9JTiBcXFwicGdfYXR0cmlidXRlXFxcIiBcXFwiYVxcXCIgT04gXFxcImFcXFwiLlxcXCJhdHRyZWxpZFxcXCIgPSBcXFwiY25zdFxcXCIuXFxcImNvbnJlbGlkXFxcIiBBTkQgXFxcImFcXFwiLlxcXCJhdHRudW1cXFwiID0gQU5ZIChcXFwiY25zdFxcXCIuXFxcImNvbmtleVxcXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwidFxcXCIuXFxcInJlbGtpbmRcXFwiIElOICgncicsICdwJykgQU5EIChcIiArIGNvbnN0cmFpbnRzQ29uZGl0aW9uICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1NxbCA9IFwiU0VMRUNUIFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9zY2hlbWFcXFwiLCBcXFwidFxcXCIuXFxcInJlbG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9uYW1lXFxcIiwgXFxcImlcXFwiLlxcXCJyZWxuYW1lXFxcIiBBUyBcXFwiY29uc3RyYWludF9uYW1lXFxcIiwgXFxcImFcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDQVNFIFxcXCJpeFxcXCIuXFxcImluZGlzdW5pcXVlXFxcIiBXSEVOICd0JyBUSEVOICdUUlVFJyBFTFNFJ0ZBTFNFJyBFTkQgQVMgXFxcImlzX3VuaXF1ZVxcXCIsIHBnX2dldF9leHByKFxcXCJpeFxcXCIuXFxcImluZHByZWRcXFwiLCBcXFwiaXhcXFwiLlxcXCJpbmRyZWxpZFxcXCIpIEFTIFxcXCJjb25kaXRpb25cXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwidHlwZXNcXFwiLlxcXCJ0eXBuYW1lXFxcIiBBUyBcXFwidHlwZV9uYW1lXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJGUk9NIFxcXCJwZ19jbGFzc1xcXCIgXFxcInRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX2luZGV4XFxcIiBcXFwiaXhcXFwiIE9OIFxcXCJpeFxcXCIuXFxcImluZHJlbGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19hdHRyaWJ1dGVcXFwiIFxcXCJhXFxcIiBPTiBcXFwiYVxcXCIuXFxcImF0dHJlbGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiAgQU5EIFxcXCJhXFxcIi5cXFwiYXR0bnVtXFxcIiA9IEFOWSAoXFxcIml4XFxcIi5cXFwiaW5ka2V5XFxcIikgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwibnNcXFwiIE9OIFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwidFxcXCIuXFxcInJlbG5hbWVzcGFjZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY2xhc3NcXFwiIFxcXCJpXFxcIiBPTiBcXFwiaVxcXCIuXFxcIm9pZFxcXCIgPSBcXFwiaXhcXFwiLlxcXCJpbmRleHJlbGlkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ190eXBlXFxcIiBcXFwidHlwZXNcXFwiIE9OIFxcXCJ0eXBlc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwiYVxcXCIuXFxcImF0dHR5cGlkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJMRUZUIEpPSU4gXFxcInBnX2NvbnN0cmFpbnRcXFwiIFxcXCJjbnN0XFxcIiBPTiBcXFwiY25zdFxcXCIuXFxcImNvbm5hbWVcXFwiID0gXFxcImlcXFwiLlxcXCJyZWxuYW1lXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFUkUgXFxcInRcXFwiLlxcXCJyZWxraW5kXFxcIiBJTiAoJ3InLCAncCcpIEFORCBcXFwiY25zdFxcXCIuXFxcImNvbnR5cGVcXFwiIElTIE5VTEwgQU5EIChcIiArIGNvbnN0cmFpbnRzQ29uZGl0aW9uICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNDb25kaXRpb24gPSBkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlX3NjaGVtYSA9IF9hLnRhYmxlX3NjaGVtYSwgdGFibGVfbmFtZSA9IF9hLnRhYmxlX25hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiID0gJ1wiICsgdGFibGVfc2NoZW1hICsgXCInIEFORCBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiA9ICdcIiArIHRhYmxlX25hbWUgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzU3VwcG9ydEZvclBhcnRpdGlvbmVkVGFibGVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNSZWxpc3BhcnRpdGlvbkNvbHVtbiA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFydGl0aW9uQ29uZGl0aW9uID0gaGFzUmVsaXNwYXJ0aXRpb25Db2x1bW4gPyBcIiBBTkQgXFxcImNsXFxcIi5cXFwicmVsaXNwYXJ0aXRpb25cXFwiID0gJ2YnXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNTcWwgPSBcIlNFTEVDVCBcXFwiY29uXFxcIi5cXFwiY29ubmFtZVxcXCIgQVMgXFxcImNvbnN0cmFpbnRfbmFtZVxcXCIsIFxcXCJjb25cXFwiLlxcXCJuc3BuYW1lXFxcIiBBUyBcXFwidGFibGVfc2NoZW1hXFxcIiwgXFxcImNvblxcXCIuXFxcInJlbG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9uYW1lXFxcIiwgXFxcImF0dDJcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiBBUyBcXFwicmVmZXJlbmNlZF90YWJsZV9zY2hlbWFcXFwiLCBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiBBUyBcXFwicmVmZXJlbmNlZF90YWJsZV9uYW1lXFxcIiwgXFxcImF0dFxcXCIuXFxcImF0dG5hbWVcXFwiIEFTIFxcXCJyZWZlcmVuY2VkX2NvbHVtbl9uYW1lXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmZkZWx0eXBlXFxcIiBBUyBcXFwib25fZGVsZXRlXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcImNvblxcXCIuXFxcImNvbmZ1cGR0eXBlXFxcIiBBUyBcXFwib25fdXBkYXRlXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmRlZmVycmFibGVcXFwiIEFTIFxcXCJkZWZlcnJhYmxlXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmRlZmVycmVkXFxcIiBBUyBcXFwiZGVmZXJyZWRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZST00gKCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTRUxFQ1QgVU5ORVNUIChcXFwiY29uMVxcXCIuXFxcImNvbmtleVxcXCIpIEFTIFxcXCJwYXJlbnRcXFwiLCBVTk5FU1QgKFxcXCJjb24xXFxcIi5cXFwiY29uZmtleVxcXCIpIEFTIFxcXCJjaGlsZFxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29uZnJlbGlkXFxcIiwgXFxcImNvbjFcXFwiLlxcXCJjb25yZWxpZFxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29ubmFtZVxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29udHlwZVxcXCIsIFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiwgXFxcImNvbjFcXFwiLlxcXCJjb25kZWZlcnJhYmxlXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ0FTRSBXSEVOIFxcXCJjb24xXFxcIi5cXFwiY29uZGVmZXJyZWRcXFwiIFRIRU4gJ0lOSVRJQUxMWSBERUZFUlJFRCcgRUxTRSAnSU5JVElBTExZIElNTUVESUFURScgRU5EIGFzIGNvbmRlZmVycmVkLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDQVNFIFxcXCJjb24xXFxcIi5cXFwiY29uZmRlbHR5cGVcXFwiIFdIRU4gJ2EnIFRIRU4gJ05PIEFDVElPTicgV0hFTiAncicgVEhFTiAnUkVTVFJJQ1QnIFdIRU4gJ2MnIFRIRU4gJ0NBU0NBREUnIFdIRU4gJ24nIFRIRU4gJ1NFVCBOVUxMJyBXSEVOICdkJyBUSEVOICdTRVQgREVGQVVMVCcgRU5EIGFzIFxcXCJjb25mZGVsdHlwZVxcXCIsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNBU0UgXFxcImNvbjFcXFwiLlxcXCJjb25mdXBkdHlwZVxcXCIgV0hFTiAnYScgVEhFTiAnTk8gQUNUSU9OJyBXSEVOICdyJyBUSEVOICdSRVNUUklDVCcgV0hFTiAnYycgVEhFTiAnQ0FTQ0FERScgV0hFTiAnbicgVEhFTiAnU0VUIE5VTEwnIFdIRU4gJ2QnIFRIRU4gJ1NFVCBERUZBVUxUJyBFTkQgYXMgXFxcImNvbmZ1cGR0eXBlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJGUk9NIFxcXCJwZ19jbGFzc1xcXCIgXFxcImNsXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19uYW1lc3BhY2VcXFwiIFxcXCJuc1xcXCIgT04gXFxcImNsXFxcIi5cXFwicmVsbmFtZXNwYWNlXFxcIiA9IFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY29uc3RyYWludFxcXCIgXFxcImNvbjFcXFwiIE9OIFxcXCJjb24xXFxcIi5cXFwiY29ucmVsaWRcXFwiID0gXFxcImNsXFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFUkUgXFxcImNvbjFcXFwiLlxcXCJjb250eXBlXFxcIiA9ICdmJyBBTkQgKFwiICsgZm9yZWlnbktleXNDb25kaXRpb24gKyBcIikgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIikgXFxcImNvblxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfYXR0cmlidXRlXFxcIiBcXFwiYXR0XFxcIiBPTiBcXFwiYXR0XFxcIi5cXFwiYXR0cmVsaWRcXFwiID0gXFxcImNvblxcXCIuXFxcImNvbmZyZWxpZFxcXCIgQU5EIFxcXCJhdHRcXFwiLlxcXCJhdHRudW1cXFwiID0gXFxcImNvblxcXCIuXFxcImNoaWxkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiSU5ORVIgSk9JTiBcXFwicGdfY2xhc3NcXFwiIFxcXCJjbFxcXCIgT04gXFxcImNsXFxcIi5cXFwib2lkXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJjb25mcmVsaWRcXFwiIFwiICsgaXNQYXJ0aXRpb25Db25kaXRpb24pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5zXFxcIiBPTiBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lc3BhY2VcXFwiID0gXFxcIm5zXFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19hdHRyaWJ1dGVcXFwiIFxcXCJhdHQyXFxcIiBPTiBcXFwiYXR0MlxcXCIuXFxcImF0dHJlbGlkXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJjb25yZWxpZFxcXCIgQU5EIFxcXCJhdHQyXFxcIi5cXFwiYXR0bnVtXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJwYXJlbnRcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoY29sdW1uc1NxbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoY29uc3RyYWludHNTcWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KGluZGljZXNTcWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KGZvcmVpZ25LZXlzU3FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9qID0gX19yZWFkLmFwcGx5KHZvaWQgMCwgW19rLnNlbnQoKSwgNF0pLCBkYkNvbHVtbnMgPSBfalswXSwgZGJDb25zdHJhaW50cyA9IF9qWzFdLCBkYkluZGljZXMgPSBfalsyXSwgZGJGb3JlaWduS2V5cyA9IF9qWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlcyBmb3IgbG9hZGVkIHRhYmxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKGRiVGFibGVzLm1hcChmdW5jdGlvbiAoZGJUYWJsZSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIGdldFNjaGVtYUZyb21LZXksIHNjaGVtYSwgX2EsIHRhYmxlVW5pcXVlQ29uc3RyYWludHMsIHRhYmxlQ2hlY2tDb25zdHJhaW50cywgdGFibGVFeGNsdXNpb25Db25zdHJhaW50cywgdGFibGVGb3JlaWduS2V5Q29uc3RyYWludHMsIHRhYmxlSW5kZXhDb25zdHJhaW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBuZXcgVGFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbUtleSA9IGZ1bmN0aW9uIChkYk9iamVjdCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGJPYmplY3Rba2V5XSA9PT0gY3VycmVudFNjaGVtYSAmJiAoIV90aGlzLmRyaXZlci5vcHRpb25zLnNjaGVtYSB8fCBfdGhpcy5kcml2ZXIub3B0aW9ucy5zY2hlbWEgPT09IGN1cnJlbnRTY2hlbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRiT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGdldFNjaGVtYUZyb21LZXkoZGJUYWJsZSwgXCJ0YWJsZV9zY2hlbWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmRhdGFiYXNlID0gY3VycmVudERhdGFiYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zY2hlbWEgPSBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lID0gdGhpcy5kcml2ZXIuYnVpbGRUYWJsZU5hbWUoZGJUYWJsZVtcInRhYmxlX25hbWVcIl0sIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW5zIGZyb20gdGhlIGxvYWRlZCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRiQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGRiQ29sdW1uKSB7IHJldHVybiAoZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdID09PSBkYlRhYmxlW1widGFibGVfbmFtZVwiXSAmJiBkYkNvbHVtbltcInRhYmxlX3NjaGVtYVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX3NjaGVtYVwiXSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZGJDb2x1bW4pIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQ29uc3RyYWludHMsIHRhYmxlQ29sdW1uLCBuYW1lXzEsIGJ1aWx0RW51bU5hbWUsIGVudW1OYW1lLCBzcWwsIHJlc3VsdHMsIHR5cGUsIGdlb21ldHJ5Q29sdW1uU3FsLCByZXN1bHRzLCBnZW9ncmFwaHlDb2x1bW5TcWwsIHJlc3VsdHMsIGxlbmd0aF8xLCBtYXRjaCwgdW5pcXVlQ29uc3RyYWludHMsIGlzQ29uc3RyYWludENvbXBvc2l0ZSwgc2VyaWFsRGVmYXVsdE5hbWUsIHNlcmlhbERlZmF1bHRQYXRoLCBkZWZhdWx0V2l0aG91dFF1b3RlcywgYXNFeHByZXNzaW9uUXVlcnksIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29uc3RyYWludHMgPSBkYkNvbnN0cmFpbnRzLmZpbHRlcihmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb2x1bW5fbmFtZVwiXSA9PT0gZGJDb2x1bW5bXCJjb2x1bW5fbmFtZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5uYW1lID0gZGJDb2x1bW5bXCJjb2x1bW5fbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gZGJDb2x1bW5bXCJyZWd0eXBlXCJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29sdW1uLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwiZGVjaW1hbFwiIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwiZmxvYXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlc2UgcHJvcGVydGllcyB3YXMgc2V0LCBhbmQgYW5vdGhlciB3YXMgbm90LCBQb3N0Z3JlcyBzZXRzICcwJyBpbiB0byB1bnNwZWNpZmllZCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzZXQgJ3VuZGVmaW5lZCcgaW4gdG8gdW5zcGVjaWZpZWQgcHJvcGVydHkgdG8gYXZvaWQgY2hhbmdpbmcgY29sdW1uIG9uIHN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl0gIT09IG51bGwgJiYgIXRoaXMuaXNEZWZhdWx0Q29sdW1uUHJlY2lzaW9uKHRhYmxlLCB0YWJsZUNvbHVtbiwgZGJDb2x1bW5bXCJudW1lcmljX3ByZWNpc2lvblwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnByZWNpc2lvbiA9IGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGJDb2x1bW5bXCJudW1lcmljX3NjYWxlXCJdICE9PSBudWxsICYmICF0aGlzLmlzRGVmYXVsdENvbHVtblNjYWxlKHRhYmxlLCB0YWJsZUNvbHVtbiwgZGJDb2x1bW5bXCJudW1lcmljX3NjYWxlXCJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ucHJlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbltcIm51bWVyaWNfc2NhbGVcIl0gIT09IG51bGwgJiYgIXRoaXMuaXNEZWZhdWx0Q29sdW1uU2NhbGUodGFibGUsIHRhYmxlQ29sdW1uLCBkYkNvbHVtbltcIm51bWVyaWNfc2NhbGVcIl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zY2FsZSA9IGRiQ29sdW1uW1wibnVtZXJpY19zY2FsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcIm51bWVyaWNfcHJlY2lzaW9uXCJdICE9PSBudWxsICYmICF0aGlzLmlzRGVmYXVsdENvbHVtblByZWNpc2lvbih0YWJsZSwgdGFibGVDb2x1bW4sIGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVDb2x1bW4udHlwZSA9PT0gXCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZSB3aXRob3V0IHRpbWUgem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZSB3aXRoIHRpbWUgem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4udHlwZSA9PT0gXCJ0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5wcmVjaXNpb24gPSAhdGhpcy5pc0RlZmF1bHRDb2x1bW5QcmVjaXNpb24odGFibGUsIHRhYmxlQ29sdW1uLCBkYkNvbHVtbltcImRhdGV0aW1lX3ByZWNpc2lvblwiXSkgPyBkYkNvbHVtbltcImRhdGV0aW1lX3ByZWNpc2lvblwiXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGJDb2x1bW5bXCJkYXRhX3R5cGVcIl0gPT09IFwiVVNFUi1ERUZJTkVEXCIgfHwgZGJDb2x1bW5bXCJkYXRhX3R5cGVcIl0gPT09IFwiQVJSQVlcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSh0YWJsZSwgdGFibGVDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGBlbnVtTmFtZWAgaXMgc3BlY2lmaWVkIGJ5IHVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfMSA9IChfYS5zZW50KCkpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRFbnVtTmFtZSA9IHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgdGFibGVDb2x1bW4sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZSA9IGJ1aWx0RW51bU5hbWUgIT09IG5hbWVfMSA/IG5hbWVfMSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlNFTEVDVCBcXFwiZVxcXCIuXFxcImVudW1sYWJlbFxcXCIgQVMgXFxcInZhbHVlXFxcIiBGUk9NIFxcXCJwZ19lbnVtXFxcIiBcXFwiZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX3R5cGVcXFwiIFxcXCJ0XFxcIiBPTiBcXFwidFxcXCIuXFxcIm9pZFxcXCIgPSBcXFwiZVxcXCIuXFxcImVudW10eXBpZFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5cXFwiIE9OIFxcXCJuXFxcIi5cXFwib2lkXFxcIiA9IFxcXCJ0XFxcIi5cXFwidHlwbmFtZXNwYWNlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFxcXCJuXFxcIi5cXFwibnNwbmFtZVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORCBcXFwidFxcXCIuXFxcInR5cG5hbWVcXFwiID0gJ1wiICsgKGVudW1OYW1lIHx8IG5hbWVfMSkgKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gXCJlbnVtXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmVudW0gPSByZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZXN1bHRbXCJ2YWx1ZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmVudW1OYW1lID0gZW51bU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbltcImRhdGFfdHlwZVwiXSA9PT0gXCJBUlJBWVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzQXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGFibGVDb2x1bW4udHlwZS5yZXBsYWNlKFwiW11cIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0eXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVDb2x1bW4udHlwZSA9PT0gXCJnZW9tZXRyeVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlDb2x1bW5TcWwgPSBcIlNFTEVDVCAqIEZST00gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImZfdGFibGVfc2NoZW1hXFxcIiBcXFwidGFibGVfc2NoZW1hXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX3RhYmxlX25hbWVcXFwiIFxcXCJ0YWJsZV9uYW1lXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX2dlb21ldHJ5X2NvbHVtblxcXCIgXFxcImNvbHVtbl9uYW1lXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzcmlkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gXFxcImdlb21ldHJ5X2NvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICkgQVMgX1xcbiAgICAgICAgICAgICAgICAgICAgICBXSEVSRVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbHVtbl9uYW1lXFxcIiA9ICdcIiArIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0gKyBcIicgQU5EXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShnZW9tZXRyeUNvbHVtblNxbCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zcGF0aWFsRmVhdHVyZVR5cGUgPSByZXN1bHRzWzBdLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnNyaWQgPSByZXN1bHRzWzBdLnNyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZUNvbHVtbi50eXBlID09PSBcImdlb2dyYXBoeVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvZ3JhcGh5Q29sdW1uU3FsID0gXCJTRUxFQ1QgKiBGUk9NIChcXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX3RhYmxlX3NjaGVtYVxcXCIgXFxcInRhYmxlX3NjaGVtYVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiZl90YWJsZV9uYW1lXFxcIiBcXFwidGFibGVfbmFtZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiZl9nZW9ncmFwaHlfY29sdW1uXFxcIiBcXFwiY29sdW1uX25hbWVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNyaWRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBcXFwiZ2VvZ3JhcGh5X2NvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICkgQVMgX1xcbiAgICAgICAgICAgICAgICAgICAgICBXSEVSRVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbHVtbl9uYW1lXFxcIiA9ICdcIiArIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0gKyBcIicgQU5EXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShnZW9ncmFwaHlDb2x1bW5TcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uc3BhdGlhbEZlYXR1cmVUeXBlID0gcmVzdWx0c1swXS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zcmlkID0gcmVzdWx0c1swXS5zcmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb25seSBjb2x1bW5zIHRoYXQgaGF2ZSBsZW5ndGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIud2l0aExlbmd0aENvbHVtblR5cGVzLmluZGV4T2YodGFibGVDb2x1bW4udHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbHVtbi5pc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IC9cXCgoXFxkKylcXCkvLmV4ZWMoZGJDb2x1bW5bXCJmb3JtYXRfdHlwZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfMSA9IG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGJDb2x1bW5bXCJjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGhcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF8xID0gZGJDb2x1bW5bXCJjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGhcIl0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmxlbmd0aCA9ICF0aGlzLmlzRGVmYXVsdENvbHVtbkxlbmd0aCh0YWJsZSwgdGFibGVDb2x1bW4sIGxlbmd0aF8xKSA/IGxlbmd0aF8xIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc051bGxhYmxlID0gZGJDb2x1bW5bXCJpc19udWxsYWJsZVwiXSA9PT0gXCJZRVNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc1ByaW1hcnkgPSAhIWNvbHVtbkNvbnN0cmFpbnRzLmZpbmQoZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHsgcmV0dXJuIGNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiUFJJTUFSWVwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cyA9IGNvbHVtbkNvbnN0cmFpbnRzLmZpbHRlcihmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludFtcImNvbnN0cmFpbnRfdHlwZVwiXSA9PT0gXCJVTklRVUVcIjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zdHJhaW50Q29tcG9zaXRlID0gdW5pcXVlQ29uc3RyYWludHMuZXZlcnkoZnVuY3Rpb24gKHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRiQ29uc3RyYWludHMuc29tZShmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7IHJldHVybiBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiVU5JUVVFXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRiQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gdW5pcXVlQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGJDb25zdHJhaW50W1wiY29sdW1uX25hbWVcIl0gIT09IGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzVW5pcXVlID0gdW5pcXVlQ29uc3RyYWludHMubGVuZ3RoID4gMCAmJiAhaXNDb25zdHJhaW50Q29tcG9zaXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19pZGVudGl0eSA9PT0gXCJZRVNcIikgeyAvLyBQb3N0Z3JlcyAxMCsgSWRlbnRpdHkgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzR2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gXCJpZGVudGl0eVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdICE9PSBudWxsICYmIGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxEZWZhdWx0TmFtZSA9IFwibmV4dHZhbCgnXCIgKyB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKHRhYmxlLCBkYkNvbHVtbltcImNvbHVtbl9uYW1lXCJdKSArIFwiJzo6cmVnY2xhc3MpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbERlZmF1bHRQYXRoID0gXCJuZXh0dmFsKCdcIiArIHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0pICsgXCInOjpyZWdjbGFzcylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFdpdGhvdXRRdW90ZXMgPSBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdLnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFdpdGhvdXRRdW90ZXMgPT09IHNlcmlhbERlZmF1bHROYW1lIHx8IGRlZmF1bHRXaXRob3V0UXVvdGVzID09PSBzZXJpYWxEZWZhdWx0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdID09PSBcImdlbl9yYW5kb21fdXVpZCgpXCIgfHwgL151dWlkX2dlbmVyYXRlX3ZcXGRcXChcXCkvLnRlc3QoZGJDb2x1bW5bXCJjb2x1bW5fZGVmYXVsdFwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzR2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9IFwidXVpZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0gPT09IFwibm93KClcIiB8fCBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdLmluZGV4T2YoXCInbm93Jzo6dGV4dFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmRlZmF1bHQgPSBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZGVmYXVsdCA9IGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0ucmVwbGFjZSgvOjpbXFx3XFxzXFwuXFxbXFxdXFxcIl0rL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZGVmYXVsdCA9IHRhYmxlQ29sdW1uLmRlZmF1bHQucmVwbGFjZSgvXigtP1xcZCspJC8sIFwiJyQxJ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkYkNvbHVtbltcImlzX2dlbmVyYXRlZFwiXSA9PT0gXCJBTFdBWVNcIiAmJiBkYkNvbHVtbltcImdlbmVyYXRpb25fZXhwcmVzc2lvblwiXSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHBvc3RncmVzIHRoZXJlIGlzIG5vIFZJUlRVQUwgZ2VuZXJhdGVkIGNvbHVtbiB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9IFwiU1RPUkVEXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNFeHByZXNzaW9uUXVlcnkgPSBcIlNFTEVDVCAqIEZST00gXFxcInR5cGVvcm1fbWV0YWRhdGFcXFwiIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFwiIFdIRVJFIFxcXCJ0YWJsZVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfbmFtZVwiXSArIFwiJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChcIiBBTkQgXFxcIm5hbWVcXFwiID0gJ1wiICsgdGFibGVDb2x1bW4ubmFtZSArIFwiJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChcIiBBTkQgXFxcInNjaGVtYVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdICsgXCInXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFwiIEFORCBcXFwiZGF0YWJhc2VcXFwiID0gJ1wiICsgdGhpcy5kcml2ZXIuZGF0YWJhc2UgKyBcIidcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoXCIgQU5EIFxcXCJ0eXBlXFxcIiA9ICdcIiArIE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4gKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShhc0V4cHJlc3Npb25RdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0gJiYgcmVzdWx0c1swXS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5hc0V4cHJlc3Npb24gPSByZXN1bHRzWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uYXNFeHByZXNzaW9uID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmNvbW1lbnQgPSBkYkNvbHVtbltcImRlc2NyaXB0aW9uXCJdID8gZGJDb2x1bW5bXCJkZXNjcmlwdGlvblwiXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb2x1bW5bXCJjaGFyYWN0ZXJfc2V0X25hbWVcIl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmNoYXJzZXQgPSBkYkNvbHVtbltcImNoYXJhY3Rlcl9zZXRfbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb2x1bW5bXCJjb2xsYXRpb25fbmFtZVwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uY29sbGF0aW9uID0gZGJDb2x1bW5bXCJjb2xsYXRpb25fbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGFibGVDb2x1bW5dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW5zIGZyb20gdGhlIGxvYWRlZCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmNvbHVtbnMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlVW5pcXVlQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiVU5JUVVFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKGRiQ29uc3RyYWludCkgeyByZXR1cm4gZGJDb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUudW5pcXVlcyA9IHRhYmxlVW5pcXVlQ29uc3RyYWludHMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5pcXVlcyA9IGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkMpIHsgcmV0dXJuIGRiQ1tcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiB1bmlxdWVzLm1hcChmdW5jdGlvbiAodSkgeyByZXR1cm4gdVtcImNvbHVtbl9uYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNoZWNrQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiQ0hFQ0tcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7IHJldHVybiBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jaGVja3MgPSB0YWJsZUNoZWNrQ29uc3RyYWludHMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tzID0gZGJDb25zdHJhaW50cy5maWx0ZXIoZnVuY3Rpb24gKGRiQykgeyByZXR1cm4gZGJDW1wiY29uc3RyYWludF9uYW1lXCJdID09PSBjb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVDaGVjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogY2hlY2tzLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gY1tcImNvbHVtbl9uYW1lXCJdOyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBjb25zdHJhaW50W1wiZXhwcmVzc2lvblwiXS5yZXBsYWNlKC9eXFxzKkNIRUNLXFxzKlxcKCguKilcXClcXHMqJC9pLCBcIiQxXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRXhjbHVzaW9uQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiRVhDTFVERVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHsgcmV0dXJuIGRiQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmV4Y2x1c2lvbnMgPSB0YWJsZUV4Y2x1c2lvbkNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUV4Y2x1c2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBjb25zdHJhaW50W1wiZXhwcmVzc2lvblwiXS5zdWJzdHJpbmcoOCkgLy8gdHJpbSBFWENMVURFIGZyb20gc3RhcnQgb2YgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJGb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYkZvcmVpZ25LZXlbXCJ0YWJsZV9uYW1lXCJdID09PSBkYlRhYmxlW1widGFibGVfbmFtZVwiXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiRm9yZWlnbktleVtcInRhYmxlX3NjaGVtYVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX3NjaGVtYVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXlbXCJjb25zdHJhaW50X25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cyA9IHRhYmxlRm9yZWlnbktleUNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9yZWlnbktleXMgPSBkYkZvcmVpZ25LZXlzLmZpbHRlcihmdW5jdGlvbiAoZGJGaykgeyByZXR1cm4gZGJGa1tcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gZGJGb3JlaWduS2V5W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlZmVyZW5jZWQgdGFibGUgbG9jYXRlZCBpbiBjdXJyZW50bHkgdXNlZCBzY2hlbWEsIHdlIGRvbid0IG5lZWQgdG8gY29uY2F0IHNjaGVtYSBuYW1lIHRvIHRhYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gZ2V0U2NoZW1hRnJvbUtleShkYkZvcmVpZ25LZXksIFwicmVmZXJlbmNlZF90YWJsZV9zY2hlbWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlZFRhYmxlTmFtZSA9IF90aGlzLmRyaXZlci5idWlsZFRhYmxlTmFtZShkYkZvcmVpZ25LZXlbXCJyZWZlcmVuY2VkX3RhYmxlX25hbWVcIl0sIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGJGb3JlaWduS2V5W1wiY29uc3RyYWludF9uYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBmb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24gKGRiRmspIHsgcmV0dXJuIGRiRmtbXCJjb2x1bW5fbmFtZVwiXTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogcmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZXM6IGZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZGJGaykgeyByZXR1cm4gZGJGa1tcInJlZmVyZW5jZWRfY29sdW1uX25hbWVcIl07IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBkYkZvcmVpZ25LZXlbXCJvbl9kZWxldGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IGRiRm9yZWlnbktleVtcIm9uX3VwZGF0ZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJhYmxlOiBkYkZvcmVpZ25LZXlbXCJkZWZlcnJhYmxlXCJdID8gZGJGb3JlaWduS2V5W1wiZGVmZXJyZWRcIl0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlSW5kZXhDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJJbmRpY2VzLmZpbHRlcihmdW5jdGlvbiAoZGJJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYkluZGV4W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkluZGV4W1widGFibGVfc2NoZW1hXCJdID09PSBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5kaWNlcyA9IHRhYmxlSW5kZXhDb25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRpY2VzID0gZGJJbmRpY2VzLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXhbXCJ0YWJsZV9uYW1lXCJdID09PSBjb25zdHJhaW50W1widGFibGVfbmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleFtcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGlbXCJjb2x1bW5fbmFtZVwiXTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWU6IGNvbnN0cmFpbnRbXCJpc191bmlxdWVcIl0gPT09IFwiVFJVRVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiBjb25zdHJhaW50W1wiY29uZGl0aW9uXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3BhdGlhbDogaW5kaWNlcy5ldmVyeShmdW5jdGlvbiAoaSkgeyByZXR1cm4gX3RoaXMuZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGlbXCJ0eXBlX25hbWVcIl0pID49IDA7IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRnVsbHRleHQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0YWJsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgdGFibGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlU3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjcmVhdGVGb3JlaWduS2V5cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1uRGVmaW5pdGlvbnMgPSB0YWJsZS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5idWlsZENyZWF0ZUNvbHVtblNxbCh0YWJsZSwgY29sdW1uKTsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICB2YXIgc3FsID0gXCJDUkVBVEUgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgKFwiICsgY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgICAgIHRhYmxlLmNvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzVW5pcXVlOyB9KVxuICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGlzVW5pcXVlRXhpc3QgPSB0YWJsZS51bmlxdWVzLnNvbWUoZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gdW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiB1bmlxdWUuY29sdW1uTmFtZXNbMF0gPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgIGlmICghaXNVbmlxdWVFeGlzdClcbiAgICAgICAgICAgICAgICB0YWJsZS51bmlxdWVzLnB1c2gobmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW2NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBbY29sdW1uLm5hbWVdXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHVuaXF1ZXNTcWwgPSB0YWJsZS51bmlxdWVzLm1hcChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaXF1ZU5hbWUgPSB1bmlxdWUubmFtZSA/IHVuaXF1ZS5uYW1lIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSB1bmlxdWUuY29sdW1uTmFtZXMubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkNPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlTmFtZSArIFwiXFxcIiBVTklRVUUgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIjtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyB1bmlxdWVzU3FsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWJsZS5jaGVja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGNoZWNrc1NxbCA9IHRhYmxlLmNoZWNrcy5tYXAoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoZWNrTmFtZSA9IGNoZWNrLm5hbWUgPyBjaGVjay5uYW1lIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jaGVja0NvbnN0cmFpbnROYW1lKHRhYmxlLCBjaGVjay5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT05TVFJBSU5UIFxcXCJcIiArIGNoZWNrTmFtZSArIFwiXFxcIiBDSEVDSyAoXCIgKyBjaGVjay5leHByZXNzaW9uICsgXCIpXCI7XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzcWwgKz0gXCIsIFwiICsgY2hlY2tzU3FsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWJsZS5leGNsdXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBleGNsdXNpb25zU3FsID0gdGFibGUuZXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikge1xuICAgICAgICAgICAgICAgIHZhciBleGNsdXNpb25OYW1lID0gZXhjbHVzaW9uLm5hbWUgPyBleGNsdXNpb24ubmFtZSA6IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGFibGUsIGV4Y2x1c2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT05TVFJBSU5UIFxcXCJcIiArIGV4Y2x1c2lvbk5hbWUgKyBcIlxcXCIgRVhDTFVERSBcIiArIGV4Y2x1c2lvbi5leHByZXNzaW9uO1xuICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBcIiArIGV4Y2x1c2lvbnNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmZvcmVpZ25LZXlzLmxlbmd0aCA+IDAgJiYgY3JlYXRlRm9yZWlnbktleXMpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c1NxbCA9IHRhYmxlLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZmspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmay5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmay5uYW1lKVxuICAgICAgICAgICAgICAgICAgICBmay5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZSh0YWJsZSwgZmsuY29sdW1uTmFtZXMsIF90aGlzLmdldFRhYmxlUGF0aChmayksIGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBcIkNPTlNUUkFJTlQgXFxcIlwiICsgZmsubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBSRUZFUkVOQ0VTIFwiICsgX3RoaXMuZXNjYXBlUGF0aChfdGhpcy5nZXRUYWJsZVBhdGgoZmspKSArIFwiIChcIiArIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICAgICAgICAgIGlmIChmay5vbkRlbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludCArPSBcIiBPTiBERUxFVEUgXCIgKyBmay5vbkRlbGV0ZTtcbiAgICAgICAgICAgICAgICBpZiAoZmsub25VcGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgKz0gXCIgT04gVVBEQVRFIFwiICsgZmsub25VcGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGZrLmRlZmVycmFibGUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgKz0gXCIgREVGRVJSQUJMRSBcIiArIGZrLmRlZmVycmFibGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzcWwgKz0gXCIsIFwiICsgZm9yZWlnbktleXNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5zID0gdGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIGlmIChwcmltYXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcHJpbWFyeUtleU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUodGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBDT05TVFJBSU5UIFxcXCJcIiArIHByaW1hcnlLZXlOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCI7XG4gICAgICAgIH1cbiAgICAgICAgc3FsICs9IFwiKVwiO1xuICAgICAgICB0YWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChpdCkgeyByZXR1cm4gaXQuY29tbWVudDsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyByZXR1cm4gc3FsICs9IFwiOyBDT01NRU5UIE9OIENPTFVNTiBcIiArIF90aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIuXFxcIlwiICsgaXQubmFtZSArIFwiXFxcIiBJUyBcIiArIF90aGlzLmVzY2FwZUNvbW1lbnQoaXQuY29tbWVudCk7IH0pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHNxbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBQb3N0Z3JlcyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFZlcnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTSE9XIFNFUlZFUl9WRVJTSU9OXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdFswXVtcInNlcnZlcl92ZXJzaW9uXCJdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCB0YWJsZSBzcWwuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFRhYmxlU3FsID0gZnVuY3Rpb24gKHRhYmxlT3JQYXRoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJEUk9QIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlT3JQYXRoKSk7XG4gICAgfTtcbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVWaWV3U3FsID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgdmFyIG1hdGVyaWFsaXplZENsYXVzZSA9IHZpZXcubWF0ZXJpYWxpemVkID8gXCJNQVRFUklBTElaRUQgXCIgOiBcIlwiO1xuICAgICAgICB2YXIgdmlld05hbWUgPSB0aGlzLmVzY2FwZVBhdGgodmlldyk7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFwiICsgbWF0ZXJpYWxpemVkQ2xhdXNlICsgXCJWSUVXIFwiICsgdmlld05hbWUgKyBcIiBBUyBcIiArIHZpZXcuZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFwiICsgbWF0ZXJpYWxpemVkQ2xhdXNlICsgXCJWSUVXIFwiICsgdmlld05hbWUgKyBcIiBBUyBcIiArIHZpZXcuZXhwcmVzc2lvbih0aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2NoZW1hLCBfYSwgc2NoZW1hLCBuYW1lLCB0eXBlLCBleHByZXNzaW9uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY2hlbWEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHZpZXcpLCBzY2hlbWEgPSBfYS5zY2hlbWEsIG5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGN1cnJlbnRTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdmlldy5tYXRlcmlhbGl6ZWQgPyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyA6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gdHlwZW9mIHZpZXcuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHZpZXcuZXhwcmVzc2lvbi50cmltKCkgOiB2aWV3LmV4cHJlc3Npb24odGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHsgdHlwZTogdHlwZSwgc2NoZW1hOiBzY2hlbWEsIG5hbWU6IG5hbWUsIHZhbHVlOiBleHByZXNzaW9uIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlld1NxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHZhciBtYXRlcmlhbGl6ZWRDbGF1c2UgPSB2aWV3Lm1hdGVyaWFsaXplZCA/IFwiTUFURVJJQUxJWkVEIFwiIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkRST1AgXCIgKyBtYXRlcmlhbGl6ZWRDbGF1c2UgKyBcIlZJRVcgXCIgKyB0aGlzLmVzY2FwZVBhdGgodmlldykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbW92ZSB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kZWxldGVWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2NoZW1hLCBfYSwgc2NoZW1hLCBuYW1lLCB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY2hlbWEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHZpZXcpLCBzY2hlbWEgPSBfYS5zY2hlbWEsIG5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGN1cnJlbnRTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdmlldy5tYXRlcmlhbGl6ZWQgPyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyA6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoeyB0eXBlOiB0eXBlLCBzY2hlbWE6IHNjaGVtYSwgbmFtZTogbmFtZSB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgRU5VTSB0eXBlIGZyb20gZ2l2ZW4gc2NoZW1hcy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRW51bVR5cGVzID0gZnVuY3Rpb24gKHNjaGVtYU5hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3REcm9wc1F1ZXJ5LCBkcm9wUXVlcmllcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3REcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVFlQRSBJRiBFWElTVFMgXFxcIicgfHwgbi5uc3BuYW1lIHx8ICdcXFwiLlxcXCInIHx8IHQudHlwbmFtZSB8fCAnXFxcIiBDQVNDQURFOycgYXMgXFxcInF1ZXJ5XFxcIiBGUk9NIFxcXCJwZ190eXBlXFxcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfZW51bVxcXCIgXFxcImVcXFwiIE9OIFxcXCJlXFxcIi5cXFwiZW51bXR5cGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19uYW1lc3BhY2VcXFwiIFxcXCJuXFxcIiBPTiBcXFwiblxcXCIuXFxcIm9pZFxcXCIgPSBcXFwidFxcXCIuXFxcInR5cG5hbWVzcGFjZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFxcXCJuXFxcIi5cXFwibnNwbmFtZVxcXCIgSU4gKFwiICsgc2NoZW1hTmFtZXMgKyBcIikgR1JPVVAgQlkgXFxcIm5cXFwiLlxcXCJuc3BuYW1lXFxcIiwgXFxcInRcXFwiLlxcXCJ0eXBuYW1lXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0RHJvcHNRdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BRdWVyaWVzLm1hcChmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMucXVlcnkocVtcInF1ZXJ5XCJdKTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnVtIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc0VudW1UeXBlID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYSwgZW51bU5hbWUsIHNxbCwgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFibGUpLnNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXNjaGVtYSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIGNvbHVtbiwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgXFxcIm5cXFwiLlxcXCJuc3BuYW1lXFxcIiwgXFxcInRcXFwiLlxcXCJ0eXBuYW1lXFxcIiBGUk9NIFxcXCJwZ190eXBlXFxcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwiblxcXCIgT04gXFxcIm5cXFwiLlxcXCJvaWRcXFwiID0gXFxcInRcXFwiLlxcXCJ0eXBuYW1lc3BhY2VcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwiblxcXCIuXFxcIm5zcG5hbWVcXFwiID0gJ1wiICsgc2NoZW1hICsgXCInIEFORCBcXFwidFxcXCIuXFxcInR5cG5hbWVcXFwiID0gJ1wiICsgZW51bU5hbWUgKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBFTlVNIHR5cGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUVudW1UeXBlU3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4sIGVudW1OYW1lKSB7XG4gICAgICAgIGlmICghZW51bU5hbWUpXG4gICAgICAgICAgICBlbnVtTmFtZSA9IHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgY29sdW1uKTtcbiAgICAgICAgdmFyIGVudW1WYWx1ZXMgPSBjb2x1bW4uZW51bS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBcIidcIiArIHZhbHVlLnJlcGxhY2UoXCInXCIsIFwiJydcIikgKyBcIidcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFRZUEUgXCIgKyBlbnVtTmFtZSArIFwiIEFTIEVOVU0oXCIgKyBlbnVtVmFsdWVzICsgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBFTlVNIHR5cGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BFbnVtVHlwZVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uLCBlbnVtTmFtZSkge1xuICAgICAgICBpZiAoIWVudW1OYW1lKVxuICAgICAgICAgICAgZW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIGNvbHVtbik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJEUk9QIFRZUEUgXCIgKyBlbnVtTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY3JlYXRlIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSBpbmRleC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgXCIgKyAoaW5kZXguaXNVbmlxdWUgPyBcIlVOSVFVRSBcIiA6IFwiXCIpICsgXCJJTkRFWCBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIE9OIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFwiICsgKGluZGV4LmlzU3BhdGlhbCA/IFwiVVNJTkcgR2lTVCBcIiA6IFwiXCIpICsgXCIoXCIgKyBjb2x1bW5zICsgXCIpIFwiICsgKGluZGV4LndoZXJlID8gXCJXSEVSRSBcIiArIGluZGV4LndoZXJlIDogXCJcIikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGRyb3AgaW5kZXggc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgdmFyIGluZGV4TmFtZSA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lLm5hbWUgOiBpbmRleE9yTmFtZTtcbiAgICAgICAgdmFyIHNjaGVtYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKS5zY2hlbWE7XG4gICAgICAgIHJldHVybiBzY2hlbWEgPyBuZXcgUXVlcnkoXCJEUk9QIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBpbmRleE5hbWUgKyBcIlxcXCJcIikgOiBuZXcgUXVlcnkoXCJEUk9QIElOREVYIFxcXCJcIiArIGluZGV4TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgcHJpbWFyeSBrZXkgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVByaW1hcnlLZXlTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIHZhciBwcmltYXJ5S2V5TmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZSh0YWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICB2YXIgY29sdW1uTmFtZXNTdHJpbmcgPSBjb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwcmltYXJ5S2V5TmFtZSArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lc1N0cmluZyArIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHByaW1hcnkga2V5IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wUHJpbWFyeUtleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSB0YWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICB2YXIgcHJpbWFyeUtleU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUodGFibGUsIGNvbHVtbk5hbWVzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwcmltYXJ5S2V5TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgdW5pcXVlIGNvbnN0cmFpbnQgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gdW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4gKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiIFVOSVFVRSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHVuaXF1ZSBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgdW5pcXVlT3JOYW1lKSB7XG4gICAgICAgIHZhciB1bmlxdWVOYW1lID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUubmFtZSA6IHVuaXF1ZU9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBjaGVjayBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVDaGVja0NvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgY2hlY2tDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgQ0hFQ0sgKFwiICsgY2hlY2tDb25zdHJhaW50LmV4cHJlc3Npb24gKyBcIilcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCBjaGVjayBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ2hlY2tDb25zdHJhaW50U3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjaGVja09yTmFtZSkge1xuICAgICAgICB2YXIgY2hlY2tOYW1lID0gY2hlY2tPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNoZWNrID8gY2hlY2tPck5hbWUubmFtZSA6IGNoZWNrT3JOYW1lO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIGNoZWNrTmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIGV4Y2x1c2lvbkNvbnN0cmFpbnQubmFtZSArIFwiXFxcIiBFWENMVURFIFwiICsgZXhjbHVzaW9uQ29uc3RyYWludC5leHByZXNzaW9uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGV4Y2x1c2lvbiBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZXhjbHVzaW9uT3JOYW1lKSB7XG4gICAgICAgIHZhciBleGNsdXNpb25OYW1lID0gZXhjbHVzaW9uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVFeGNsdXNpb24gPyBleGNsdXNpb25Pck5hbWUubmFtZSA6IGV4Y2x1c2lvbk9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBleGNsdXNpb25OYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBmb3JlaWduIGtleSBzcWwuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRm9yZWlnbktleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZm9yZWlnbktleSkge1xuICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbiArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4gKyBcIlxcXCJcIjsgfSkuam9pbihcIixcIik7XG4gICAgICAgIHZhciBzcWwgPSBcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBcIiArXG4gICAgICAgICAgICAoXCJSRUZFUkVOQ0VTIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpKSArIFwiKFwiICsgcmVmZXJlbmNlZENvbHVtbk5hbWVzICsgXCIpXCIpO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5vbkRlbGV0ZSlcbiAgICAgICAgICAgIHNxbCArPSBcIiBPTiBERUxFVEUgXCIgKyBmb3JlaWduS2V5Lm9uRGVsZXRlO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5vblVwZGF0ZSlcbiAgICAgICAgICAgIHNxbCArPSBcIiBPTiBVUERBVEUgXCIgKyBmb3JlaWduS2V5Lm9uVXBkYXRlO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5kZWZlcnJhYmxlKVxuICAgICAgICAgICAgc3FsICs9IFwiIERFRkVSUkFCTEUgXCIgKyBmb3JlaWduS2V5LmRlZmVycmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoc3FsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGZvcmVpZ24ga2V5IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICB2YXIgZm9yZWlnbktleU5hbWUgPSBmb3JlaWduS2V5T3JOYW1lIGluc3RhbmNlb2YgVGFibGVGb3JlaWduS2V5ID8gZm9yZWlnbktleU9yTmFtZS5uYW1lIDogZm9yZWlnbktleU9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBmb3JlaWduS2V5TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBzZXF1ZW5jZSBuYW1lIGZyb20gZ2l2ZW4gdGFibGUgYW5kIGNvbHVtbi5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5idWlsZFNlcXVlbmNlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHZhciB0YWJsZU5hbWUgPSB0aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZSkudGFibGVOYW1lO1xuICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gY29sdW1uT3JOYW1lLm5hbWUgOiBjb2x1bW5Pck5hbWU7XG4gICAgICAgIHZhciBzZXFOYW1lID0gdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lICsgXCJfc2VxXCI7XG4gICAgICAgIGlmIChzZXFOYW1lLmxlbmd0aCA+IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWF4QWxpYXNMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG5vdGUgZG9lc24ndCB5ZXQgaGFuZGxlIGNvcm5lciBjYXNlcyB3aGVyZSAubGVuZ3RoIGRpZmZlcnMgZnJvbSBudW1iZXIgb2YgVVRGLTggYnl0ZXNcbiAgICAgICAgICAgIHNlcU5hbWUgPSB0YWJsZU5hbWUuc3Vic3RyaW5nKDAsIDI5KSArIFwiX1wiICsgY29sdW1uTmFtZS5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoMjksIDYzIC0gKHRhYmxlLm5hbWUubGVuZ3RoKSAtIDUpKSArIFwiX3NlcVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXFOYW1lO1xuICAgIH07XG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRTZXF1ZW5jZVBhdGggPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbk9yTmFtZSkge1xuICAgICAgICB2YXIgc2NoZW1hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFibGUpLnNjaGVtYTtcbiAgICAgICAgcmV0dXJuIHNjaGVtYSA/IHNjaGVtYSArIFwiLlwiICsgdGhpcy5idWlsZFNlcXVlbmNlTmFtZSh0YWJsZSwgY29sdW1uT3JOYW1lKSA6IHRoaXMuYnVpbGRTZXF1ZW5jZU5hbWUodGFibGUsIGNvbHVtbk9yTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgRU5VTSB0eXBlIG5hbWUgZnJvbSBnaXZlbiB0YWJsZSBhbmQgY29sdW1uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmJ1aWxkRW51bU5hbWUgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgd2l0aFNjaGVtYSwgZGlzYWJsZUVzY2FwZSwgdG9PbGQpIHtcbiAgICAgICAgaWYgKHdpdGhTY2hlbWEgPT09IHZvaWQgMCkgeyB3aXRoU2NoZW1hID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZSksIHNjaGVtYSA9IF9hLnNjaGVtYSwgdGFibGVOYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICB2YXIgZW51bU5hbWUgPSBjb2x1bW4uZW51bU5hbWUgPyBjb2x1bW4uZW51bU5hbWUgOiB0YWJsZU5hbWUgKyBcIl9cIiArIGNvbHVtbi5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIl9lbnVtXCI7XG4gICAgICAgIGlmIChzY2hlbWEgJiYgd2l0aFNjaGVtYSlcbiAgICAgICAgICAgIGVudW1OYW1lID0gc2NoZW1hICsgXCIuXCIgKyBlbnVtTmFtZTtcbiAgICAgICAgaWYgKHRvT2xkKVxuICAgICAgICAgICAgZW51bU5hbWUgPSBlbnVtTmFtZSArIFwiX29sZFwiO1xuICAgICAgICByZXR1cm4gZW51bU5hbWUuc3BsaXQoXCIuXCIpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVFc2NhcGUgPyBpIDogXCJcXFwiXCIgKyBpICsgXCJcXFwiXCI7XG4gICAgICAgIH0pLmpvaW4oXCIuXCIpO1xuICAgIH07XG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgc2NoZW1hLCBuYW1lLCByZXN1bHQsIHVkdE5hbWU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKSwgc2NoZW1hID0gX2Euc2NoZW1hLCBuYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhc2NoZW1hKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q3VycmVudFNjaGVtYSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgXFxcInVkdF9zY2hlbWFcXFwiLCBcXFwidWR0X25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJjb2x1bW5zXFxcIiBXSEVSRSBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIHNjaGVtYSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgbmFtZSArIFwiJyBBTkQgXFxcImNvbHVtbl9uYW1lXFxcIj0nXCIgKyBjb2x1bW4ubmFtZSArIFwiJ1wiKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1ZHROYW1lID0gcmVzdWx0WzBdW1widWR0X25hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWR0TmFtZS5pbmRleE9mKFwiX1wiKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkdE5hbWUgPSB1ZHROYW1lLnN1YnN0cigxLCB1ZHROYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHJlc3VsdFswXVtcInVkdF9zY2hlbWFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHVkdE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIGEgZ2l2ZW4gY29tbWVudCBzbyBpdCdzIHNhZmUgdG8gaW5jbHVkZSBpbiBhIHF1ZXJ5LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmVzY2FwZUNvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCkge1xuICAgICAgICBpZiAoIWNvbW1lbnQgfHwgY29tbWVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5VTExcIjtcbiAgICAgICAgfVxuICAgICAgICBjb21tZW50ID0gY29tbWVudFxuICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCInJ1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgXCJcIik7IC8vIE51bGwgYnl0ZXMgYXJlbid0IGFsbG93ZWQgaW4gY29tbWVudHNcbiAgICAgICAgcmV0dXJuIFwiJ1wiICsgY29tbWVudCArIFwiJ1wiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXNjYXBlcyBnaXZlbiB0YWJsZSBvciB2aWV3IHBhdGguXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZXNjYXBlUGF0aCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFyZ2V0KSwgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZU5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgIGlmIChzY2hlbWEgJiYgc2NoZW1hICE9PSB0aGlzLmRyaXZlci5zZWFyY2hTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyB0YWJsZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcXFwiXCIgKyB0YWJsZU5hbWUgKyBcIlxcXCJcIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGFibGUgbmFtZSB3aXRoIHRhYmxlIHNjaGVtYVxuICAgICAqIE5vdGU6IFdpdGhvdXQgJyBvciBcIlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFRhYmxlTmFtZVdpdGhTY2hlbWEgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZU5hbWUsIHNjaGVtYVJlc3VsdCwgc2NoZW1hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgVGFibGUgPyB0YXJnZXQubmFtZSA6IHRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlTmFtZS5pbmRleE9mKFwiLlwiKSA9PT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgY3VycmVudF9zY2hlbWEoKVwiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVJlc3VsdFswXVtcImN1cnJlbnRfc2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHNjaGVtYSArIFwiLlwiICsgdGFibGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGFibGVOYW1lLnNwbGl0KFwiLlwiKVswXSArIFwiLlwiICsgdGFibGVOYW1lLnNwbGl0KFwiLlwiKVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgcXVlcnkgZm9yIGNyZWF0ZSBjb2x1bW4uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRDcmVhdGVDb2x1bW5TcWwgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbikge1xuICAgICAgICB2YXIgYyA9IFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5pc0dlbmVyYXRlZCA9PT0gdHJ1ZSAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIikge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaWRlbnRpdHlcIikgeyAvLyBQb3N0Z3JlcyAxMCsgSWRlbnRpdHkgZ2VuZXJhdGVkIGNvbHVtblxuICAgICAgICAgICAgICAgIGMgKz0gXCIgXCIgKyBjb2x1bW4udHlwZSArIFwiIEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gY2xhc3NpYyBTRVJJQUwgcHJpbWFyeSBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiaW50ZWdlclwiIHx8IGNvbHVtbi50eXBlID09PSBcImludFwiIHx8IGNvbHVtbi50eXBlID09PSBcImludDRcIilcbiAgICAgICAgICAgICAgICAgICAgYyArPSBcIiBTRVJJQUxcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwic21hbGxpbnRcIiB8fCBjb2x1bW4udHlwZSA9PT0gXCJpbnQyXCIpXG4gICAgICAgICAgICAgICAgICAgIGMgKz0gXCIgU01BTExTRVJJQUxcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiYmlnaW50XCIgfHwgY29sdW1uLnR5cGUgPT09IFwiaW50OFwiKVxuICAgICAgICAgICAgICAgICAgICBjICs9IFwiIEJJR1NFUklBTFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgY29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIikge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNBcnJheSlcbiAgICAgICAgICAgICAgICBjICs9IFwiIGFycmF5XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNvbHVtbi5pc0dlbmVyYXRlZCB8fCBjb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICAgIGMgKz0gXCIgXCIgKyB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZUZ1bGxUeXBlKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ0hBUkFDVEVSIFNFVCwgQ09MTEFURSwgTk9UIE5VTEwgYW5kIERFRkFVTFQgZG8gbm90IGV4aXN0IG9uIGdlbmVyYXRlZCAodmlydHVhbCkgY29sdW1uc1xuICAgICAgICAvLyBBbHNvLCBwb3N0Z3JlcyBvbmx5IHN1cHBvcnRzIHRoZSBzdG9yZWQgZ2VuZXJhdGVkIGNvbHVtbiB0eXBlXG4gICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIiAmJiBjb2x1bW4uYXNFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjICs9IFwiIEdFTkVSQVRFRCBBTFdBWVMgQVMgKFwiICsgY29sdW1uLmFzRXhwcmVzc2lvbiArIFwiKSBTVE9SRURcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY2hhcnNldClcbiAgICAgICAgICAgICAgICBjICs9IFwiIENIQVJBQ1RFUiBTRVQgXFxcIlwiICsgY29sdW1uLmNoYXJzZXQgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sbGF0aW9uKVxuICAgICAgICAgICAgICAgIGMgKz0gXCIgQ09MTEFURSBcXFwiXCIgKyBjb2x1bW4uY29sbGF0aW9uICsgXCJcXFwiXCI7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzTnVsbGFibGUgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgYyArPSBcIiBOT1QgTlVMTFwiO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmRlZmF1bHQgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgYyArPSBcIiBERUZBVUxUIFwiICsgY29sdW1uLmRlZmF1bHQ7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiICYmICFjb2x1bW4uZGVmYXVsdClcbiAgICAgICAgICAgICAgICBjICs9IFwiIERFRkFVTFQgXCIgKyB0aGlzLmRyaXZlci51dWlkR2VuZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBQb3N0Z3JlU1FMIHNlcnZlciBoYXMgc3VwcG9ydCBmb3IgcGFydGl0aW9uZWQgdGFibGVzXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzU3VwcG9ydEZvclBhcnRpdGlvbmVkVGFibGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIFRSVUUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9uYW1lID0gJ3BnX2NsYXNzJyBhbmQgY29sdW1uX25hbWUgPSAncmVsaXNwYXJ0aXRpb24nXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBQb3N0Z3Jlc1F1ZXJ5UnVubmVyO1xufShCYXNlUXVlcnlSdW5uZXIpKTtcbmV4cG9ydCB7IFBvc3RncmVzUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG9zdGdyZXNRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4vUmVhY3ROYXRpdmVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbmltcG9ydCB7IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbnZhciBSZWFjdE5hdGl2ZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVhY3ROYXRpdmVEcml2ZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlYWN0TmF0aXZlRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmxvY2F0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlck9wdGlvbk5vdFNldEVycm9yKFwibG9jYXRpb25cIik7XG4gICAgICAgIC8vIGxvYWQgc3FsaXRlIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlRHJpdmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKG9rLCBmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBSZWFjdE5hdGl2ZURyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBSZWFjdE5hdGl2ZURyaXZlci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5vcHRpb25zLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBfdGhpcy5vcHRpb25zLmxvY2F0aW9uLFxuICAgICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5leHRyYSB8fCB7fSk7XG4gICAgICAgICAgICBfdGhpcy5zcWxpdGUub3BlbkRhdGFiYXNlKG9wdGlvbnMsIGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24gPSBkYjtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OO1wiLCBbXSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBvayhkYXRhYmFzZUNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlRHJpdmVyLnByb3RvdHlwZS5sb2FkRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHNxbGl0ZSA9IHRoaXMub3B0aW9ucy5kcml2ZXIgfHwgcmVxdWlyZShcInJlYWN0LW5hdGl2ZS1zcWxpdGUtc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHRoaXMuc3FsaXRlID0gc3FsaXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yKFwiUmVhY3QtTmF0aXZlXCIsIFwicmVhY3QtbmF0aXZlLXNxbGl0ZS1zdG9yYWdlXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3ROYXRpdmVEcml2ZXI7XG59KEFic3RyYWN0U3FsaXRlRHJpdmVyKSk7XG5leHBvcnQgeyBSZWFjdE5hdGl2ZURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFjdE5hdGl2ZURyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyIH0gZnJvbSBcIi4uLy4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJlc3VsdFwiO1xuLyoqXG4gKiBSdW5zIHF1ZXJpZXMgb24gYSBzaW5nbGUgc3FsaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyKGRyaXZlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBmdW5jdGlvbiAocmF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNsb3cgcXVlcmllcyBpZiBtYXhRdWVyeUV4ZWN1dGlvbiB0aW1lIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhRdWVyeUV4ZWN1dGlvblRpbWUgPSBfdGhpcy5kcml2ZXIub3B0aW9ucy5tYXhRdWVyeUV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5RW5kVGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UXVlcnlFeGVjdXRpb25UaW1lICYmIHF1ZXJ5RXhlY3V0aW9uVGltZSA+IG1heFF1ZXJ5RXhlY3V0aW9uVGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpZCBvZiBpbnNlcnRlZCByb3csIGlmIHF1ZXJ5IHdhcyBpbnNlcnQgc3RhdGVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zdWJzdHIoMCwgMTEpID09PSBcIklOU0VSVCBJTlRPXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdy5pbnNlcnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93c0FmZmVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFmZmVjdGVkID0gcmF3LnJvd3NBZmZlY3RlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93cycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3LnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMucHVzaChyYXcucm93cy5pdGVtKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2socmVzdWx0LnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeUVycm9yKGVyciwgcXVlcnksIHBhcmFtZXRlcnMsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGFyYW1ldHJpemVzIGdpdmVuIG9iamVjdCBvZiB2YWx1ZXMuIFVzZWQgdG8gY3JlYXRlIGNvbHVtbj12YWx1ZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIucHJvdG90eXBlLnBhcmFtZXRyaXplID0gZnVuY3Rpb24gKG9iamVjdExpdGVyYWwsIHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IHZvaWQgMCkgeyBzdGFydEluZGV4ID0gMDsgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0TGl0ZXJhbCkubWFwKGZ1bmN0aW9uIChrZXksIGluZGV4KSB7IHJldHVybiBcIlxcXCJcIiArIGtleSArIFwiXFxcIlwiICsgXCI9P1wiOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWN0TmF0aXZlUXVlcnlSdW5uZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9EYXRlVXRpbHNcIjtcbmltcG9ydCB7IFJkYm1zU2NoZW1hQnVpbGRlciB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci9SZGJtc1NjaGVtYUJ1aWxkZXJcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBBcHBseVZhbHVlVHJhbnNmb3JtZXJzIH0gZnJvbSBcIi4uLy4uL3V0aWwvQXBwbHlWYWx1ZVRyYW5zZm9ybWVyc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vRHJpdmVyVXRpbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdmlldy9WaWV3XCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG4vKipcbiAqIE9yZ2FuaXplcyBjb21tdW5pY2F0aW9uIHdpdGggc3FsaXRlIERCTVMuXG4gKi9cbnZhciBBYnN0cmFjdFNxbGl0ZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQWJzdHJhY3RTcWxpdGVEcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUmVwbGljYXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRyZWUgdGFibGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyZWVTdXBwb3J0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgbGlzdCBvZiBzdXBwb3J0ZWQgY29sdW1uIGRhdGEgdHlwZXMgYnkgYSBkcml2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly93d3cudHV0b3JpYWxzcG9pbnQuY29tL3NxbGl0ZS9zcWxpdGVfZGF0YV90eXBlcy5odG1cbiAgICAgICAgICogQHNlZSBodHRwczovL3NxbGl0ZS5vcmcvZGF0YXR5cGUzLmh0bWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkRGF0YVR5cGVzID0gW1xuICAgICAgICAgICAgXCJpbnRcIixcbiAgICAgICAgICAgIFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgXCJ0aW55aW50XCIsXG4gICAgICAgICAgICBcInNtYWxsaW50XCIsXG4gICAgICAgICAgICBcIm1lZGl1bWludFwiLFxuICAgICAgICAgICAgXCJiaWdpbnRcIixcbiAgICAgICAgICAgIFwidW5zaWduZWQgYmlnIGludFwiLFxuICAgICAgICAgICAgXCJpbnQyXCIsXG4gICAgICAgICAgICBcImludDhcIixcbiAgICAgICAgICAgIFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgXCJjaGFyYWN0ZXJcIixcbiAgICAgICAgICAgIFwidmFyY2hhclwiLFxuICAgICAgICAgICAgXCJ2YXJ5aW5nIGNoYXJhY3RlclwiLFxuICAgICAgICAgICAgXCJuY2hhclwiLFxuICAgICAgICAgICAgXCJuYXRpdmUgY2hhcmFjdGVyXCIsXG4gICAgICAgICAgICBcIm52YXJjaGFyXCIsXG4gICAgICAgICAgICBcInRleHRcIixcbiAgICAgICAgICAgIFwiY2xvYlwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcImJsb2JcIixcbiAgICAgICAgICAgIFwicmVhbFwiLFxuICAgICAgICAgICAgXCJkb3VibGVcIixcbiAgICAgICAgICAgIFwiZG91YmxlIHByZWNpc2lvblwiLFxuICAgICAgICAgICAgXCJmbG9hdFwiLFxuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICAgICAgXCJib29sZWFuXCIsXG4gICAgICAgICAgICBcImRhdGVcIixcbiAgICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgICAgXCJkYXRldGltZVwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHR5cGUgb2YgdXBzZXJ0IHN1cHBvcnRlZCBieSBkcml2ZXIgaWYgYW55XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1cHBvcnRlZFVwc2VydFR5cGUgPSBcIm9uLWNvbmZsaWN0LWRvLXVwZGF0ZVwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBsaXN0IG9mIGNvbHVtbiBkYXRhIHR5cGVzIHRoYXQgc3VwcG9ydCBsZW5ndGggYnkgYSBkcml2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndpdGhMZW5ndGhDb2x1bW5UeXBlcyA9IFtcbiAgICAgICAgICAgIFwiY2hhcmFjdGVyXCIsXG4gICAgICAgICAgICBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIFwidmFyeWluZyBjaGFyYWN0ZXJcIixcbiAgICAgICAgICAgIFwibmNoYXJcIixcbiAgICAgICAgICAgIFwibmF0aXZlIGNoYXJhY3RlclwiLFxuICAgICAgICAgICAgXCJudmFyY2hhclwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcImJsb2JcIixcbiAgICAgICAgICAgIFwiY2xvYlwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2Ygc3BhdGlhbCBjb2x1bW4gZGF0YSB0eXBlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3BhdGlhbFR5cGVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1uIGRhdGEgdHlwZXMgdGhhdCBzdXBwb3J0IHByZWNpc2lvbiBieSBhIGRyaXZlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2l0aFByZWNpc2lvbkNvbHVtblR5cGVzID0gW1xuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcImRvdWJsZVwiLFxuICAgICAgICAgICAgXCJkb3VibGUgcHJlY2lzaW9uXCIsXG4gICAgICAgICAgICBcImZsb2F0XCIsXG4gICAgICAgICAgICBcInJlYWxcIixcbiAgICAgICAgICAgIFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICBcImRhdGVcIixcbiAgICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgICAgXCJkYXRldGltZVwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1uIGRhdGEgdHlwZXMgdGhhdCBzdXBwb3J0IHNjYWxlIGJ5IGEgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aXRoU2NhbGVDb2x1bW5UeXBlcyA9IFtcbiAgICAgICAgICAgIFwicmVhbFwiLFxuICAgICAgICAgICAgXCJkb3VibGVcIixcbiAgICAgICAgICAgIFwiZG91YmxlIHByZWNpc2lvblwiLFxuICAgICAgICAgICAgXCJmbG9hdFwiLFxuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICBdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3JtIGhhcyBzcGVjaWFsIGNvbHVtbnMgYW5kIHdlIG5lZWQgdG8ga25vdyB3aGF0IGRhdGFiYXNlIGNvbHVtbiB0eXBlcyBzaG91bGQgYmUgZm9yIHRob3NlIHR5cGVzLlxuICAgICAgICAgKiBDb2x1bW4gdHlwZXMgYXJlIGRyaXZlciBkZXBlbmRhbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcHBlZERhdGFUeXBlcyA9IHtcbiAgICAgICAgICAgIGNyZWF0ZURhdGU6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgIGNyZWF0ZURhdGVEZWZhdWx0OiBcImRhdGV0aW1lKCdub3cnKVwiLFxuICAgICAgICAgICAgdXBkYXRlRGF0ZTogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgdXBkYXRlRGF0ZURlZmF1bHQ6IFwiZGF0ZXRpbWUoJ25vdycpXCIsXG4gICAgICAgICAgICBkZWxldGVEYXRlOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICBkZWxldGVEYXRlTnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIHRyZWVMZXZlbDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBtaWdyYXRpb25JZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBtaWdyYXRpb25OYW1lOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIG1pZ3JhdGlvblRpbWVzdGFtcDogXCJiaWdpbnRcIixcbiAgICAgICAgICAgIGNhY2hlSWQ6IFwiaW50XCIsXG4gICAgICAgICAgICBjYWNoZUlkZW50aWZpZXI6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgY2FjaGVUaW1lOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgY2FjaGVEdXJhdGlvbjogXCJpbnRcIixcbiAgICAgICAgICAgIGNhY2hlUXVlcnk6IFwidGV4dFwiLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHQ6IFwidGV4dFwiLFxuICAgICAgICAgICAgbWV0YWRhdGFUeXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIG1ldGFkYXRhRGF0YWJhc2U6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFTY2hlbWE6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFUYWJsZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgICBtZXRhZGF0YU5hbWU6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFWYWx1ZTogXCJ0ZXh0XCIsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb24ub3B0aW9ucztcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IERyaXZlclV0aWxzLmJ1aWxkRHJpdmVyT3B0aW9ucyh0aGlzLm9wdGlvbnMpLmRhdGFiYXNlO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5kYXRhYmFzZUNvbm5lY3Rpb24gPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFrZXMgYW55IGFjdGlvbiBhZnRlciBjb25uZWN0aW9uIChlLmcuIGNyZWF0ZSBleHRlbnNpb25zIGluIFBvc3RncmVzIGRyaXZlcikuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmFmdGVyQ29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5jbG9zZShmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBlcnIgPyBmYWlsKGVycikgOiBvaygpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVtYSBidWlsZGVyIHVzZWQgdG8gYnVpbGQgYW5kIHN5bmMgYSBzY2hlbWEuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVNjaGVtYUJ1aWxkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmRibXNTY2hlbWFCdWlsZGVyKHRoaXMuY29ubmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBnaXZlbiB2YWx1ZSB0byBhIHZhbHVlIHRvIGJlIHBlcnNpc3RlZCwgYmFzZWQgb24gaXRzIGNvbHVtbiB0eXBlIGFuZCBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gQm9vbGVhbiB8fCBjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5taXhlZERhdGVUb1RpbWVTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiB8fCBjb2x1bW5NZXRhZGF0YS50eXBlID09PSBEYXRlKSB7XG4gICAgICAgICAgICAvLyB0byBzdHJpbmcgY29udmVyc2F0aW9uIG5lZWRzIGJlY2F1c2UgU1FMaXRlIHN0b3JlcyBkYXRlIGFzIGludGVnZXIgbnVtYmVyLCB3aGVuIGRhdGUgY2FtZSBhcyBPYmplY3RcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGB0b1VUQ2AgY29udmVyc2lvblxuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5taXhlZERhdGVUb1V0Y0RhdGV0aW1lU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1hcnJheVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLnNpbXBsZUFycmF5VG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwic2ltcGxlLWpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5zaW1wbGVFbnVtVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGdpdmVuIHZhbHVlIHRvIGEgdmFsdWUgdG8gYmUgaHlkcmF0ZWQsIGJhc2VkIG9uIGl0cyBjb2x1bW4gdHlwZSBvciBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucHJlcGFyZUh5ZHJhdGVkVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyID8gQXBwbHlWYWx1ZVRyYW5zZm9ybWVycy50cmFuc2Zvcm1Gcm9tKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IEJvb2xlYW4gfHwgY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IERhdGUpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRml4IGRhdGUgY29udmVyc2lvbiBpc3N1ZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIElmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgc3RyaW5nIGlzIFwiMjAxOC0wMy0xNCAwMjozMzozMy45MDZcIiwgU2FmYXJpIChhbmQgaU9TIFdLV2ViVmlldykgd2lsbCBjb252ZXJ0IGl0IHRvIGFuIGludmFsaWQgZGF0ZSBvYmplY3QuXG4gICAgICAgICAgICAgKiBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgZGF0ZSBzdHJpbmcgdG8gXCIyMDE4LTAzLTE0VDAyOjMzOjMzLjkwNlpcIiBhbmQgU2FmYXJpIHdpbGwgY29udmVydCBpdCBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogSVNPIDg2MDFcbiAgICAgICAgICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdmFyaW91cyB2YWxpZCB0aW1lIHN0cmluZyBmb3JtYXRzIGEgc3FsaXRlIHRpbWUgc3RyaW5nIG1pZ2h0IGhhdmU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuc3FsaXRlLm9yZy9sYW5nX2RhdGVmdW5jLmh0bWxcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGZpeGVzIHdlIG1heSBuZWVkIHRvIGRvOlxuICAgICAgICAgICAgICAgIC8vICAgMSkgQWRkICdUJyBzZXBhcmF0b3IgaWYgc3BhY2UgaXMgdXNlZCBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gICAyKSBBZGQgJ1onIFVUQyBzdWZmaXggaWYgbm8gdGltZXpvbmUgb3Igb2Zmc2V0IHNwZWNpZmllZFxuICAgICAgICAgICAgICAgIGlmICgvXlxcZFxcZFxcZFxcZC1cXGRcXGQtXFxkXFxkIFxcZFxcZDpcXGRcXGQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIiBcIiwgXCJUXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoL15cXGRcXGRcXGRcXGQtXFxkXFxkLVxcZFxcZFRcXGRcXGQ6XFxkXFxkKDpcXGRcXGQoXFwuXFxkXFxkXFxkKT8pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IFwiWlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm5vcm1hbGl6ZUh5ZHJhdGVkRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1peGVkRGF0ZVRvRGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJ0aW1lXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1peGVkVGltZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1hcnJheVwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1qc29uXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLnN0cmluZ1RvU2ltcGxlSnNvbih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUVudW0odmFsdWUsIGNvbHVtbk1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICB2YWx1ZSA9IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtRnJvbShjb2x1bW5NZXRhZGF0YS50cmFuc2Zvcm1lciwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBwYXJhbWV0ZXJzIGluIHRoZSBnaXZlbiBzcWwgd2l0aCBzcGVjaWFsIGVzY2FwaW5nIGNoYXJhY3RlclxuICAgICAqIGFuZCBhbiBhcnJheSBvZiBwYXJhbWV0ZXIgbmFtZXMgdG8gYmUgcGFzc2VkIHRvIGEgcXVlcnkuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmVzY2FwZVF1ZXJ5V2l0aFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoc3FsLCBwYXJhbWV0ZXJzLCBuYXRpdmVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlc2NhcGVkUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG5hdGl2ZVBhcmFtZXRlcnMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBNYXBwaW5nIGJvb2xlYW4gdmFsdWVzIHRvIHRoZWlyIG51bWVyaWMgcmVwcmVzZW50YXRpb25cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmF0aXZlUGFyYW1ldGVyc1trZXldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbWV0ZXJzW2tleV0gPT09IHRydWUgPyAxIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbWV0ZXJzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnMgfHwgIU9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBbc3FsLCBlc2NhcGVkUGFyYW1ldGVyc107XG4gICAgICAgIHNxbCA9IHNxbC5yZXBsYWNlKC86KFxcLlxcLlxcLik/KFtBLVphLXowLTlfLl0rKS9nLCBmdW5jdGlvbiAoZnVsbCwgaXNBcnJheSwga2V5KSB7XG4gICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRQYXJhbWV0ZXJzLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcmVhdGVQYXJhbWV0ZXIoa2V5LCBlc2NhcGVkUGFyYW1ldGVycy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjYXBlZFBhcmFtZXRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKGtleSwgZXNjYXBlZFBhcmFtZXRlcnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH0pOyAvLyB0b2RvOiBtYWtlIHJlcGxhY2Ugb25seSBpbiB2YWx1ZSBzdGF0ZW1lbnRzLCBvdGhlcndpc2UgcHJvYmxlbXNcbiAgICAgICAgcmV0dXJuIFtzcWwsIGVzY2FwZWRQYXJhbWV0ZXJzXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgYSBjb2x1bW4gbmFtZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGQgZnVsbCB0YWJsZSBuYW1lIHdpdGggZGF0YWJhc2UgbmFtZSwgc2NoZW1hIG5hbWUgYW5kIHRhYmxlIG5hbWUuXG4gICAgICogRS5nLiBteURCLm15U2NoZW1hLm15VGFibGVcbiAgICAgKlxuICAgICAqIFJldHVybnMgb25seSBzaW1wbGUgdGFibGUgbmFtZSBiZWNhdXNlIGFsbCBpbmhlcml0ZWQgZHJpdmVycyBkb2VzIG5vdCBzdXBwb3J0cyBzY2hlbWEgYW5kIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5idWlsZFRhYmxlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUsIHNjaGVtYSwgZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlTmFtZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgdGFyZ2V0IHRhYmxlIG5hbWUgb3Igb3RoZXIgdHlwZXMgYW5kIHJldHVybiBhIG5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucGFyc2VUYWJsZU5hbWUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBkcml2ZXJEYXRhYmFzZSA9IHRoaXMuZGF0YWJhc2U7XG4gICAgICAgIHZhciBkcml2ZXJTY2hlbWEgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBWaWV3KSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VkID0gdGhpcy5wYXJzZVRhYmxlTmFtZSh0YXJnZXQubmFtZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0YXJnZXQuZGF0YWJhc2UgfHwgcGFyc2VkLmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnNjaGVtYSB8fCBwYXJzZWQuc2NoZW1hIHx8IGRyaXZlclNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IHBhcnNlZC50YWJsZU5hbWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSB0aGlzLnBhcnNlVGFibGVOYW1lKHRhcmdldC5yZWZlcmVuY2VkVGFibGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRhcmdldC5yZWZlcmVuY2VkRGF0YWJhc2UgfHwgcGFyc2VkLmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnJlZmVyZW5jZWRTY2hlbWEgfHwgcGFyc2VkLnNjaGVtYSB8fCBkcml2ZXJTY2hlbWEsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lOiBwYXJzZWQudGFibGVOYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gRW50aXR5TWV0YWRhdGEgdGFibGVOYW1lIGlzIG5ldmVyIGEgcGF0aFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGFyZ2V0LmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnNjaGVtYSB8fCBkcml2ZXJTY2hlbWEsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lOiB0YXJnZXQudGFibGVOYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0cyA9IHRhcmdldC5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2U6IHBhcnRzWzBdIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogcGFydHNbMV0gfHwgZHJpdmVyU2NoZW1hLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZTogcGFydHNbMl1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBkcml2ZXJEYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHBhcnRzWzBdLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZTogcGFydHNbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBkcml2ZXJEYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IGRyaXZlclNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IHRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRhdGFiYXNlIHR5cGUgZnJvbSBhIGdpdmVuIGNvbHVtbiBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUubm9ybWFsaXplVHlwZSA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBOdW1iZXIgfHwgY29sdW1uLnR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJjaGFyXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEJvb2xlYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcInZhcmNoYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtYXJyYXlcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1qc29uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJjaGFyXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLnR5cGUgfHwgXCJcIjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBcImRlZmF1bHRcIiB2YWx1ZSBvZiB0aGUgY29sdW1uLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVEZWZhdWx0ID0gZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBjb2x1bW5NZXRhZGF0YS5kZWZhdWx0O1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlID8gXCIxXCIgOiBcIjBcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIidcIiArIGRlZmF1bHRWYWx1ZSArIFwiJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IG51bGwgfHwgZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIFwiaXNVbmlxdWVcIiB2YWx1ZSBvZiB0aGUgY29sdW1uLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVJc1VuaXF1ZSA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5lbnRpdHlNZXRhZGF0YS51bmlxdWVzLnNvbWUoZnVuY3Rpb24gKHVxKSB7IHJldHVybiB1cS5jb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiB1cS5jb2x1bW5zWzBdID09PSBjb2x1bW47IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBjb2x1bW4gbGVuZ3RoIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGRlZmF1bHQgbGVuZ3RoIHZhbHVlcy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZ2V0Q29sdW1uTGVuZ3RoID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gY29sdW1uLmxlbmd0aCA/IGNvbHVtbi5sZW5ndGgudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIFwiZGVmYXVsdFwiIHZhbHVlIG9mIHRoZSBjb2x1bW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZUZ1bGxUeXBlID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB2YXIgdHlwZSA9IGNvbHVtbi50eXBlO1xuICAgICAgICBpZiAoY29sdW1uLmVudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBcInZhcmNoYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmxlbmd0aCkge1xuICAgICAgICAgICAgdHlwZSArPSBcIihcIiArIGNvbHVtbi5sZW5ndGggKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSBudWxsICYmIGNvbHVtbi5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2NhbGUgIT09IG51bGwgJiYgY29sdW1uLnNjYWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHR5cGUgKz0gXCIoXCIgKyBjb2x1bW4ucHJlY2lzaW9uICsgXCIsXCIgKyBjb2x1bW4uc2NhbGUgKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSBudWxsICYmIGNvbHVtbi5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdHlwZSArPSBcIihcIiArIGNvbHVtbi5wcmVjaXNpb24gKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmlzQXJyYXkpXG4gICAgICAgICAgICB0eXBlICs9IFwiIGFycmF5XCI7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogT2J0YWlucyBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgbWFzdGVyIHNlcnZlci5cbiAgICAgKiBVc2VkIGZvciByZXBsaWNhdGlvbi5cbiAgICAgKiBJZiByZXBsaWNhdGlvbiBpcyBub3Qgc2V0dXAgdGhlbiByZXR1cm5zIGRlZmF1bHQgY29ubmVjdGlvbidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLm9idGFpbk1hc3RlckNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9idGFpbnMgYSBuZXcgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBhIHNsYXZlIHNlcnZlci5cbiAgICAgKiBVc2VkIGZvciByZXBsaWNhdGlvbi5cbiAgICAgKiBJZiByZXBsaWNhdGlvbiBpcyBub3Qgc2V0dXAgdGhlbiByZXR1cm5zIG1hc3RlciAoZGVmYXVsdCkgY29ubmVjdGlvbidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLm9idGFpblNsYXZlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBnZW5lcmF0ZWQgbWFwIG9mIHZhbHVlcyBnZW5lcmF0ZWQgb3IgcmV0dXJuZWQgYnkgZGF0YWJhc2UgYWZ0ZXIgSU5TRVJUIHF1ZXJ5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVHZW5lcmF0ZWRNYXAgPSBmdW5jdGlvbiAobWV0YWRhdGEsIGluc2VydFJlc3VsdCwgZW50aXR5SW5kZXgsIGVudGl0eU51bSkge1xuICAgICAgICB2YXIgZ2VuZXJhdGVkTWFwID0gbWV0YWRhdGEuZ2VuZXJhdGVkQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiAmJiBpbnNlcnRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBXaGVuIElOU0VSVCBzdGF0ZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgdGhlIGxhc3QgaW5zZXJ0ZWQgcm93IElEIGlzIHJldHVybmVkLlxuICAgICAgICAgICAgICAgIC8vIHNlZSBhbHNvOiBTcWxpdGVRdWVyeVJ1bm5lci5xdWVyeSgpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbnNlcnRSZXN1bHQgLSBlbnRpdHlOdW0gKyBlbnRpdHlJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZSA9IGluc2VydFZhbHVlW2dlbmVyYXRlZENvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaWZmZXJlbnRpYXRlIGNvbHVtbnMgb2YgdGhpcyB0YWJsZSBhbmQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBjb2x1bW4gbWV0YWRhdGFzIGNvbHVtbnNcbiAgICAgKiBhbmQgcmV0dXJucyBvbmx5IGNoYW5nZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmZpbmRDaGFuZ2VkQ29sdW1ucyA9IGZ1bmN0aW9uICh0YWJsZUNvbHVtbnMsIGNvbHVtbk1ldGFkYXRhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY29sdW1uTWV0YWRhdGFzLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZUNvbHVtbiA9IHRhYmxlQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgICAgICBpZiAoIXRhYmxlQ29sdW1uKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UgZG9uJ3QgbmVlZCBuZXcgY29sdW1ucywgd2Ugb25seSBuZWVkIGV4aXN0IGFuZCBjaGFuZ2VkXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInRhYmxlOlwiLCBjb2x1bW5NZXRhZGF0YS5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJuYW1lOlwiLCB0YWJsZUNvbHVtbi5uYW1lLCBjb2x1bW5NZXRhZGF0YS5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlOlwiLCB0YWJsZUNvbHVtbi50eXBlLCB0aGlzLm5vcm1hbGl6ZVR5cGUoY29sdW1uTWV0YWRhdGEpKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibGVuZ3RoOlwiLCB0YWJsZUNvbHVtbi5sZW5ndGgsIGNvbHVtbk1ldGFkYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInByZWNpc2lvbjpcIiwgdGFibGVDb2x1bW4ucHJlY2lzaW9uLCBjb2x1bW5NZXRhZGF0YS5wcmVjaXNpb24pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzY2FsZTpcIiwgdGFibGVDb2x1bW4uc2NhbGUsIGNvbHVtbk1ldGFkYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY29tbWVudDpcIiwgdGFibGVDb2x1bW4uY29tbWVudCwgY29sdW1uTWV0YWRhdGEuY29tbWVudCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlZmF1bHQ6XCIsIHRoaXMubm9ybWFsaXplRGVmYXVsdChjb2x1bW5NZXRhZGF0YSksIGNvbHVtbk1ldGFkYXRhLmRlZmF1bHQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc1ByaW1hcnk6XCIsIHRhYmxlQ29sdW1uLmlzUHJpbWFyeSwgY29sdW1uTWV0YWRhdGEuaXNQcmltYXJ5KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNOdWxsYWJsZTpcIiwgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSwgY29sdW1uTWV0YWRhdGEuaXNOdWxsYWJsZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzVW5pcXVlOlwiLCB0YWJsZUNvbHVtbi5pc1VuaXF1ZSwgdGhpcy5ub3JtYWxpemVJc1VuaXF1ZShjb2x1bW5NZXRhZGF0YSkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0dlbmVyYXRlZDpcIiwgdGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQsIGNvbHVtbk1ldGFkYXRhLmlzR2VuZXJhdGVkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1uLm5hbWUgIT09IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZVxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgIT09IF90aGlzLm5vcm1hbGl6ZVR5cGUoY29sdW1uTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4ubGVuZ3RoICE9PSBjb2x1bW5NZXRhZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICB8fCB0YWJsZUNvbHVtbi5wcmVjaXNpb24gIT09IGNvbHVtbk1ldGFkYXRhLnByZWNpc2lvblxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnNjYWxlICE9PSBjb2x1bW5NZXRhZGF0YS5zY2FsZVxuICAgICAgICAgICAgICAgIC8vICB8fCB0YWJsZUNvbHVtbi5jb21tZW50ICE9PSBjb2x1bW5NZXRhZGF0YS5jb21tZW50IHx8IC8vIHRvZG9cbiAgICAgICAgICAgICAgICB8fCBfdGhpcy5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbk1ldGFkYXRhKSAhPT0gdGFibGVDb2x1bW4uZGVmYXVsdFxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLmlzUHJpbWFyeSAhPT0gY29sdW1uTWV0YWRhdGEuaXNQcmltYXJ5XG4gICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSAhPT0gY29sdW1uTWV0YWRhdGEuaXNOdWxsYWJsZVxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLmlzVW5pcXVlICE9PSBfdGhpcy5ub3JtYWxpemVJc1VuaXF1ZShjb2x1bW5NZXRhZGF0YSlcbiAgICAgICAgICAgICAgICB8fCAoY29sdW1uTWV0YWRhdGEuZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIiAmJiB0YWJsZUNvbHVtbi5pc0dlbmVyYXRlZCAhPT0gY29sdW1uTWV0YWRhdGEuaXNHZW5lcmF0ZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkcml2ZXIgc3VwcG9ydHMgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkcml2ZXIgc3VwcG9ydHMgdXVpZCB2YWx1ZXMgZ2VuZXJhdGlvbiBvbiBpdHMgb3duLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5pc1VVSURHZW5lcmF0aW9uU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgZHJpdmVyIHN1cHBvcnRzIGZ1bGx0ZXh0IGluZGljZXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmlzRnVsbFRleHRDb2x1bW5UeXBlU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVzY2FwZWQgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVQYXJhbWV0ZXIgPSBmdW5jdGlvbiAocGFyYW1ldGVyTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgLy8gcmV0dXJuIFwiJFwiICsgKGluZGV4ICsgMSk7XG4gICAgICAgIHJldHVybiBcIj9cIjtcbiAgICAgICAgLy8gcmV0dXJuIFwiJFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNvbm5lY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkRvIG5vdCB1c2UgQWJzdHJhY3RTcWxpdGUgZGlyZWN0bHksIGl0IGhhcyB0byBiZSB1c2VkIHdpdGggb25lIG9mIHRoZSBzcWxpdGUgZHJpdmVyc1wiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIGRyaXZlciBkZXBlbmRlbmN5IGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5LCB0aGVuIHRyeSB0byBsb2FkIGl0IHZpYSBcInJlcXVpcmVcIi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUubG9hZERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHRoZSBzcGVjaWZpYyBkcml2ZXJcbiAgICB9O1xuICAgIHJldHVybiBBYnN0cmFjdFNxbGl0ZURyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdFNxbGl0ZURyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvclwiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZVwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUluZGV4XCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vUXVlcnlcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBCYXNlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL0Jhc2VRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgVGFibGVDaGVjayB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbmltcG9ydCB7IE1ldGFkYXRhVGFibGVUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL01ldGFkYXRhVGFibGVUeXBlXCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBzcWxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqL1xudmFyIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcy91c2VzIGRhdGFiYXNlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbiBwb29sIHRvIHBlcmZvcm0gZnVydGhlciBvcGVyYXRpb25zLlxuICAgICAqIFJldHVybnMgb2J0YWluZWQgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZHJpdmVyLmRhdGFiYXNlQ29ubmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB1c2VkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICogV2UganVzdCBjbGVhciBsb2FkZWQgdGFibGVzIGFuZCBzcWwgaW4gbWVtb3J5LCBiZWNhdXNlIHNxbGl0ZSBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb25uZWN0aW9ucyB0aHVzIHF1ZXJ5IHJ1bm5lcnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRUYWJsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jbGVhclNxbE1lbW9yeSgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0aW9uTGV2ZWwpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsICE9PSBcIlJFQUQgVU5DT01NSVRURURcIiAmJiBpc29sYXRpb25MZXZlbCAhPT0gXCJTRVJJQUxJWkFCTEVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTUUxpdGUgb25seSBzdXBwb3J0cyBTRVJJQUxJWkFCTEUgYW5kIFJFQUQgVU5DT01NSVRURUQgaXNvbGF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXNvbGF0aW9uTGV2ZWwgPT09IFwiUkVBRCBVTkNPTU1JVFRFRFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gZmFsc2VcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiQkVHSU4gVFJBTlNBQ1RJT05cIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblN0YXJ0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiQ09NTUlUXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJvbGxiYWNrcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUucm9sbGJhY2tUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Sb2xsYmFjaycpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlJPTExCQUNLXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByYXcgZGF0YSBzdHJlYW0uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBvbkVuZCwgb25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc3FsaXRlIGRyaXZlci5cIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUgZGF0YWJhc2UgbmFtZXMgaW5jbHVkaW5nIHN5c3RlbSBkYXRhYmFzZXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0RGF0YWJhc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZShbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHNjaGVtYSBuYW1lcyBpbmNsdWRpbmcgc3lzdGVtIHNjaGVtYXMuXG4gICAgICogSWYgZGF0YWJhc2UgcGFyYW1ldGVyIHNwZWNpZmllZCwgcmV0dXJucyBzY2hlbWFzIG9mIHRoYXQgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0U2NoZW1hcyA9IGZ1bmN0aW9uIChkYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZShbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoZmFsc2UpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZVxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldEN1cnJlbnREYXRhYmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGFibGUgc2NoZW1hc1wiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZSBzY2hlbWFcbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRDdXJyZW50U2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0YWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5oYXNUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGVOYW1lLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yTmFtZS5uYW1lIDogdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlNFTEVDVCAqIEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiA9ICdcIiArIHRhYmxlTmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZU5hbWUsIHNxbCwgY29sdW1ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yTmFtZS5uYW1lIDogdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlBSQUdNQSB0YWJsZV9pbmZvKFxcXCJcIiArIHRhYmxlTmFtZSArIFwiXFxcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgISFjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uW1wibmFtZVwiXSA9PT0gY29sdW1uTmFtZTsgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmTm90RXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hUGF0aCwgaWZOb3RFeGlzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYVBhdGgsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBpZk5vdEV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgY3JlYXRlSW5kaWNlcykge1xuICAgICAgICBpZiAoaWZOb3RFeGlzdCA9PT0gdm9pZCAwKSB7IGlmTm90RXhpc3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY3JlYXRlRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBjcmVhdGVGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMgPT09IHZvaWQgMCkgeyBjcmVhdGVJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgaXNUYWJsZUV4aXN0O1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZOb3RFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVUYWJsZVNxbCh0YWJsZSwgY3JlYXRlRm9yZWlnbktleXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgaW5kZXggbWF5IGJlIHBhc3NlZCB3aXRob3V0IG5hbWUuIEluIHRoaXMgY2FzZSB3ZSBnZW5lcmF0ZSBpbmRleCBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluZGV4Lm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUodGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFRhYmxlID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBpZkV4aXN0LCBkcm9wRm9yZWlnbktleXMsIGRyb3BJbmRpY2VzKSB7XG4gICAgICAgIGlmIChkcm9wRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBkcm9wRm9yZWlnbktleXMgPSB0cnVlOyB9XG4gICAgICAgIGlmIChkcm9wSW5kaWNlcyA9PT0gdm9pZCAwKSB7IGRyb3BJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNUYWJsZUV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgdGFibGUsIF9hLCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUYWJsZUV4aXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvcmVpZ25LZXlzID0gZHJvcEZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUsIGlmRXhpc3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVUYWJsZVNxbCh0YWJsZSwgY3JlYXRlRm9yZWlnbktleXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB2aWV3LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVZpZXcgPSBmdW5jdGlvbiAodmlldykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBRdWVyaWVzLCBkb3duUXVlcmllcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmluc2VydFZpZXdEZWZpbml0aW9uU3FsKHZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlldyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZpZXdOYW1lLCB2aWV3LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBWaWV3ID8gdGFyZ2V0Lm5hbWUgOiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFZpZXcodmlld05hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuaW5zZXJ0Vmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVZpZXdTcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIHRoZSBnaXZlbiB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZW5hbWVUYWJsZSA9IGZ1bmN0aW9uIChvbGRUYWJsZU9yTmFtZSwgbmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbGRUYWJsZSwgX2EsIG5ld1RhYmxlLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRUYWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9sZFRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZShvbGRUYWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlID0gb2xkVGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBuZXdUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG5ld1RhYmxlTmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSBuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcXFwiXCIgKyBuZXdUYWJsZU5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBvbGQgdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRUYWJsZS5uYW1lID0gbmV3VGFibGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSB1bmlxdWUgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnVuaXF1ZXMuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKG5ld1RhYmxlLCB1bmlxdWUuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgZm9yZWlnbiBrZXkgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmZvcmVpZ25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKG5ld1RhYmxlLCBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLCBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIGluZGljZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUobmV3VGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3JlYXRlIHRhYmxlIHdpdGggbmV3IGNvbnN0cmFpbnQgbmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVjcmVhdGVUYWJsZShuZXdUYWJsZSwgb2xkVGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGFibGUgd2l0aCBuZXcgY29uc3RyYWludCBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29sdW1uIGZyb20gdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuYWRkQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuYWRkQ29sdW1ucyh0YWJsZSwgW2NvbHVtbl0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbHVtbnMgZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkQ29sdW1uKGNvbHVtbik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgY29sdW1uIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZW5hbWVDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIG9sZFRhYmxlQ29sdW1uT3JOYW1lLCBuZXdUYWJsZUNvbHVtbk9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBvbGRDb2x1bW4sIG5ld0NvbHVtbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uID0gb2xkVGFibGVDb2x1bW5Pck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbiA/IG9sZFRhYmxlQ29sdW1uT3JOYW1lIDogdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IG9sZFRhYmxlQ29sdW1uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2xkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXFxcIlwiICsgb2xkVGFibGVDb2x1bW5Pck5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIiB0YWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VGFibGVDb2x1bW5Pck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbiA9IG5ld1RhYmxlQ29sdW1uT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uID0gb2xkQ29sdW1uLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uLm5hbWUgPSBuZXdUYWJsZUNvbHVtbk9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNoYW5nZUNvbHVtbih0YWJsZSwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jaGFuZ2VDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIG9sZFRhYmxlQ29sdW1uT3JOYW1lLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgb2xkQ29sdW1uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW4gPSBvbGRUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gb2xkVGFibGVDb2x1bW5Pck5hbWUgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gb2xkVGFibGVDb2x1bW5Pck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcXFwiXCIgKyBvbGRUYWJsZUNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiIHRhYmxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2hhbmdlQ29sdW1ucyh0YWJsZSwgW3sgb2xkQ29sdW1uOiBvbGRDb2x1bW4sIG5ld0NvbHVtbjogbmV3Q29sdW1uIH1dKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKiBDaGFuZ2VkIGNvbHVtbiBsb29zZXMgYWxsIGl0cyBrZXlzIGluIHRoZSBkYi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jaGFuZ2VDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGFuZ2VkQ29sdW1ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlZENvbHVtblNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtbi5uYW1lICE9PSBjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uVW5pcXVlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMuc3BsaWNlKHVuaXF1ZS5jb2x1bW5OYW1lcy5pbmRleE9mKGNoYW5nZWRDb2x1bW5TZXQub2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZS5jb2x1bW5OYW1lcy5wdXNoKGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKGNoYW5nZWRUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMoY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4pLmZvckVhY2goZnVuY3Rpb24gKGZrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmay5jb2x1bW5OYW1lcy5zcGxpY2UoZmsuY29sdW1uTmFtZXMuaW5kZXhPZihjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbi5uYW1lKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmay5jb2x1bW5OYW1lcy5wdXNoKGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmsubmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUoY2hhbmdlZFRhYmxlLCBmay5jb2x1bW5OYW1lcywgX3RoaXMuZ2V0VGFibGVQYXRoKGZrKSwgZmsucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uSW5kaWNlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbk5hbWVzLnNwbGljZShpbmRleC5jb2x1bW5OYW1lcy5pbmRleE9mKGNoYW5nZWRDb2x1bW5TZXQub2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbk5hbWVzLnB1c2goY2hhbmdlZENvbHVtblNldC5uZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUoY2hhbmdlZFRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gY2hhbmdlZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUuY29sdW1uc1tjaGFuZ2VkVGFibGUuY29sdW1ucy5pbmRleE9mKG9yaWdpbmFsQ29sdW1uKV0gPSBjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNvbHVtbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW5Pck5hbWUgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbk9yTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BDb2x1bW5zKHRhYmxlLCBbY29sdW1uXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluc3RhbmNlID0gY29sdW1uIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW4gOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5JbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbiArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLnJlbW92ZUNvbHVtbihjb2x1bW5JbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLmZpbmRDb2x1bW5VbmlxdWVzKGNvbHVtbkluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uSW5kaWNlcyhjb2x1bW5JbnN0YW5jZSkuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5yZW1vdmVJbmRleChpbmRleCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMoY29sdW1uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGZrKSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlRm9yZWlnbktleShmayk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwcmltYXJ5IGtleS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVQcmltYXJ5S2V5ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uTmFtZXMuZmluZChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gY29sdW1uTmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIHByaW1hcnkgaW4gb3JpZ2luYWwgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUudXBkYXRlUHJpbWFyeUtleXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhIHByaW1hcnkga2V5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BQcmltYXJ5S2V5ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgcHJpbWFyeSBjb2x1bW5zIGFzIG5vbi1wcmltYXJ5IGluIG9yaWdpbmFsIHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlT3JOYW1lLCBbdW5pcXVlQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdW5pcXVlIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCB1bmlxdWVDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYW4gdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1bmlxdWVDb25zdHJhaW50O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUgOiB0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUubmFtZSA9PT0gdW5pcXVlT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgdW5pcXVlIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIFt1bmlxdWVDb25zdHJhaW50XSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB1bmlxdWUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCB1bmlxdWVDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVDaGVja0NvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyh0YWJsZU9yTmFtZSwgW2NoZWNrQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNoZWNrIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUNoZWNrQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hhbmdlZFRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja0NvbnN0cmFpbnQpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5hZGRDaGVja0NvbnN0cmFpbnQoY2hlY2tDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja09yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGVja0NvbnN0cmFpbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludCA9IGNoZWNrT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDaGVjayA/IGNoZWNrT3JOYW1lIDogdGFibGUuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gY2hlY2tPck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NvbnN0cmFpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGNoZWNrIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wQ2hlY2tDb25zdHJhaW50cyh0YWJsZSwgW2NoZWNrQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNoZWNrIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDaGVja0NvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja0NvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludHMuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2tDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVFeGNsdXNpb25Db25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBleGNsdXNpb24gY29uc3RyYWludHMuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGV4Y2x1c2lvbk9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBleGNsdXNpb24gY29uc3RyYWludHMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleGNsdXNpb25Db25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZvcmVpZ24ga2V5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZUZvcmVpZ25LZXlzKHRhYmxlT3JOYW1lLCBbZm9yZWlnbktleV0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZm9yZWlnbiBrZXlzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkRm9yZWlnbktleShmb3JlaWduS2V5KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleSBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBmb3JlaWduS2V5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlRm9yZWlnbktleSA/IGZvcmVpZ25LZXlPck5hbWUgOiB0YWJsZS5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChmaykgeyByZXR1cm4gZmsubmFtZSA9PT0gZm9yZWlnbktleU9yTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcmVpZ25LZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGZvcmVpZ24ga2V5IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcEZvcmVpZ25LZXlzKHRhYmxlT3JOYW1lLCBbZm9yZWlnbktleV0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGEgZm9yZWlnbiBrZXlzIGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BGb3JlaWduS2V5cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hhbmdlZFRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXMuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gY2hhbmdlZFRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZm9yZWlnbktleSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5kZXguXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kZXggPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgaW5kZXggbWF5IGJlIHBhc3NlZCB3aXRob3V0IG5hbWUuIEluIHRoaXMgY2FzZSB3ZSBnZW5lcmF0ZSBpbmRleCBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKHRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRpY2VzXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUluZGV4KHRhYmxlT3JOYW1lLCBpbmRleCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwocHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGV4IGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgaW5kZXgsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lIDogdGFibGUuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWUgPT09IGluZGV4T3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGluZGV4IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGljZXMgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEluZGljZXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGluZGljZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBfdGhpcy5kcm9wSW5kZXgodGFibGVPck5hbWUsIGluZGV4KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCB0YWJsZSBjb250ZW50cy5cbiAgICAgKiBOb3RlOiB0aGlzIG9wZXJhdGlvbiB1c2VzIFNRTCdzIFRSVU5DQVRFIHF1ZXJ5IHdoaWNoIGNhbm5vdCBiZSByZXZlcnRlZCBpbiB0cmFuc2FjdGlvbnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2xlYXJUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiREVMRVRFIEZST00gXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRhYmxlcyBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RWaWV3RHJvcHNRdWVyeSwgZHJvcFZpZXdRdWVyaWVzLCBzZWxlY3RUYWJsZURyb3BzUXVlcnksIGRyb3BUYWJsZVF1ZXJpZXMsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT0ZGO1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzMsIDksIDE0LCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIFxcXCInIHx8IG5hbWUgfHwgJ1xcXCI7JyBhcyBxdWVyeSBGUk9NIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBXSEVSRSBcXFwidHlwZVxcXCIgPSAndmlldydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0Vmlld0Ryb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFZpZXdRdWVyaWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoZHJvcFZpZXdRdWVyaWVzLm1hcChmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMucXVlcnkocVtcInF1ZXJ5XCJdKTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgXFxcIicgfHwgbmFtZSB8fCAnXFxcIjsnIGFzIHF1ZXJ5IEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiAhPSAnc3FsaXRlX3NlcXVlbmNlJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxMCwgMTIsICwgMTNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTjtcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVmlld3MgPSBmdW5jdGlvbiAodmlld05hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoYXNUYWJsZSwgdmlld05hbWVzU3RyaW5nLCBxdWVyeSwgZGJWaWV3cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5oYXNUYWJsZSh0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYmxlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWVzU3RyaW5nID0gdmlld05hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gXCInXCIgKyBuYW1lICsgXCInXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gXCJTRUxFQ1QgXFxcInRcXFwiLiogRlJPTSBcXFwiXCIgKyB0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpICsgXCJcXFwiIFxcXCJ0XFxcIiBJTk5FUiBKT0lOIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBzIE9OIFxcXCJzXFxcIi5cXFwibmFtZVxcXCIgPSBcXFwidFxcXCIuXFxcIm5hbWVcXFwiIEFORCBcXFwic1xcXCIuXFxcInR5cGVcXFwiID0gJ3ZpZXcnIFdIRVJFIFxcXCJ0XFxcIi5cXFwidHlwZVxcXCIgPSAnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld05hbWVzU3RyaW5nLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgQU5EIFxcXCJ0XFxcIi5cXFwibmFtZVxcXCIgSU4gKFwiICsgdmlld05hbWVzU3RyaW5nICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHF1ZXJ5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiVmlld3MgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGJWaWV3cy5tYXAoZnVuY3Rpb24gKGRiVmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcubmFtZSA9IGRiVmlld1tcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZXhwcmVzc2lvbiA9IGRiVmlld1tcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHRhYmxlcyAod2l0aCBnaXZlbiBuYW1lcykgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIGNyZWF0ZXMgYSBUYWJsZSBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUubG9hZFRhYmxlcyA9IGZ1bmN0aW9uICh0YWJsZU5hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYlRhYmxlcywgdGFibGVzU3FsLCBfYSwgX2IsIF9jLCBfZCwgdGFibGVOYW1lc1N0cmluZ18xLCB0YWJsZXNTcWwsIF9lLCBfZiwgX2csIF9oLCB0YWJsZU5hbWVzU3RyaW5nLCBkYkluZGljZXNEZWY7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfaikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2oubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gdGFibGVzIGdpdmVuIHRoZW4gbm8gbmVlZCB0byBwcm9jZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVOYW1lcyAmJiB0YWJsZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGFibGVOYW1lcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNTcWwgPSBcIlNFTEVDVCAqIEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZSdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gZGJUYWJsZXMucHVzaCkuYXBwbHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYyA9IFtkYlRhYmxlc107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZCA9IFtbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHRhYmxlc1NxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5hcHBseShfYSwgX2MuY29uY2F0KFtfX3NwcmVhZEFycmF5LmFwcGx5KHZvaWQgMCwgX2QuY29uY2F0KFtfX3JlYWQuYXBwbHkodm9pZCAwLCBbX2ouc2VudCgpXSksIGZhbHNlXSkpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZXNTdHJpbmdfMSA9IHRhYmxlTmFtZXMubWFwKGZ1bmN0aW9uICh0YWJsZU5hbWUpIHsgcmV0dXJuIFwiJ1wiICsgdGFibGVOYW1lICsgXCInXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlc1NxbCA9IFwiU0VMRUNUICogRlJPTSBcXFwic3FsaXRlX21hc3RlclxcXCIgV0hFUkUgXFxcInR5cGVcXFwiID0gJ3RhYmxlJyBBTkQgXFxcIm5hbWVcXFwiIElOIChcIiArIHRhYmxlTmFtZXNTdHJpbmdfMSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2YgPSAoX2UgPSBkYlRhYmxlcy5wdXNoKS5hcHBseTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9nID0gW2RiVGFibGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oID0gW1tdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkodGFibGVzU3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mLmFwcGx5KF9lLCBfZy5jb25jYXQoW19fc3ByZWFkQXJyYXkuYXBwbHkodm9pZCAwLCBfaC5jb25jYXQoW19fcmVhZC5hcHBseSh2b2lkIDAsIFtfai5zZW50KCldKSwgZmFsc2VdKSldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfai5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhYmxlcyB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgZGIsIG5vIG5lZWQgdG8gcHJvY2VlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiVGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVzU3RyaW5nID0gZGJUYWJsZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gX2EubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCInXCIgKyBuYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBcXFwic3FsaXRlX21hc3RlclxcXCIgV0hFUkUgXFxcInR5cGVcXFwiID0gJ2luZGV4JyBBTkQgXFxcInRibF9uYW1lXFxcIiBJTiAoXCIgKyB0YWJsZU5hbWVzU3RyaW5nICsgXCIpXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmRpY2VzRGVmID0gX2ouc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlIHNjaGVtYXMgZm9yIGxvYWRlZCB0YWJsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLmFsbChkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKGRiVGFibGUpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBzcWwsIF9hLCBkYkNvbHVtbnMsIGRiSW5kaWNlcywgZGJGb3JlaWduS2V5cywgYXV0b0luY3JlbWVudENvbHVtbk5hbWUsIHRhYmxlU3FsLCBhdXRvSW5jcmVtZW50SW5kZXgsIGNvbW1hLCBicmFja2V0LCB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cywgdW5pcXVlUmVnZXhSZXN1bHQsIHVuaXF1ZU1hcHBpbmdzLCB1bmlxdWVSZWdleCwgdGFibGVVbmlxdWVQcm9taXNlcywgX2IsIHJlc3VsdCwgcmVnZXhwLCBpbmRpY2VzUHJvbWlzZXMsIGluZGljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLm5hbWUgPSBkYlRhYmxlW1wibmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gZGJUYWJsZVtcInNxbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoXCJQUkFHTUEgdGFibGVfaW5mbyhcXFwiXCIgKyBkYlRhYmxlW1wibmFtZVwiXSArIFwiXFxcIilcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeShcIlBSQUdNQSBpbmRleF9saXN0KFxcXCJcIiArIGRiVGFibGVbXCJuYW1lXCJdICsgXCJcXFwiKVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5X2xpc3QoXFxcIlwiICsgZGJUYWJsZVtcIm5hbWVcIl0gKyBcIlxcXCIpXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQuYXBwbHkodm9pZCAwLCBbX2Muc2VudCgpLCAzXSksIGRiQ29sdW1ucyA9IF9hWzBdLCBkYkluZGljZXMgPSBfYVsxXSwgZGJGb3JlaWduS2V5cyA9IF9hWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVTcWwgPSBkYlRhYmxlW1wic3FsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50SW5kZXggPSB0YWJsZVNxbC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJBVVRPSU5DUkVNRU5UXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0luY3JlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUgPSB0YWJsZVNxbC5zdWJzdHIoMCwgYXV0b0luY3JlbWVudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gYXV0b0luY3JlbWVudENvbHVtbk5hbWUubGFzdEluZGV4T2YoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldCA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmxhc3RJbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihjb21tYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUgPSBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoMCwgYXV0b0luY3JlbWVudENvbHVtbk5hbWUubGFzdEluZGV4T2YoXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5pbmRleE9mKFwiXFxcIlwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnJhY2tldCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihicmFja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cigwLCBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5sYXN0SW5kZXhPZihcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID0gYXV0b0luY3JlbWVudENvbHVtbk5hbWUuc3Vic3RyKGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmluZGV4T2YoXCJcXFwiXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGNvbHVtbnMgZnJvbSB0aGUgbG9hZGVkIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY29sdW1ucyA9IGRiQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGRiQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLm5hbWUgPSBkYkNvbHVtbltcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gZGJDb2x1bW5bXCJ0eXBlXCJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5kZWZhdWx0ID0gZGJDb2x1bW5bXCJkZmx0X3ZhbHVlXCJdICE9PSBudWxsICYmIGRiQ29sdW1uW1wiZGZsdF92YWx1ZVwiXSAhPT0gdW5kZWZpbmVkID8gZGJDb2x1bW5bXCJkZmx0X3ZhbHVlXCJdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSA9IGRiQ29sdW1uW1wibm90bnVsbFwiXSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkga2V5cyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgd2l0aCAxLCBjb2x1bW5zIHRoYXQgYXJlbid0IHByaW1hcnkga2V5cyBhcmUgbWFya2VkIHdpdGggMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNQcmltYXJ5ID0gZGJDb2x1bW5bXCJwa1wiXSA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5jb21tZW50ID0gXCJcIjsgLy8gU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgY29sdW1uIGNvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc0dlbmVyYXRlZCA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID09PSBkYkNvbHVtbltcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBlbnVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudW1NYXRjaCA9IHNxbC5tYXRjaChuZXcgUmVnRXhwKFwiXFxcIihcIiArIHRhYmxlQ29sdW1uLm5hbWUgKyBcIilcXFwiIHZhcmNoYXIgQ0hFQ0tcXFxccypcXFxcKFxcXFxzKlxcXFwxXFxcXHMrSU5cXFxccypcXFxcKCgnW14nXSsnKD86XFxcXHMqLFxcXFxzKidbXiddKycpKylcXFxccypcXFxcKVxcXFxzKlxcXFwpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gZW51bVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5lbnVtID0gZW51bU1hdGNoWzJdLnN1YnN0cigxLCBlbnVtTWF0Y2hbMl0ubGVuZ3RoIC0gMikuc3BsaXQoXCInLCdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgZGF0YXR5cGUgYW5kIGF0dGVtcHQgdG8gcmV0cmlldmUgbGVuZ3RoLCBwcmVjaXNpb24gYW5kIHNjYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gdGFibGVDb2x1bW4udHlwZS5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bGxUeXBlID0gdGFibGVDb2x1bW4udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVR5cGVfMSA9IGZ1bGxUeXBlLnN1YnN0cigwLCBwb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV90aGlzLmRyaXZlci53aXRoTGVuZ3RoQ29sdW1uVHlwZXMuZmluZChmdW5jdGlvbiAoY29sKSB7IHJldHVybiBjb2wgPT09IGRhdGFUeXBlXzE7IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBwYXJzZUludChmdWxsVHlwZS5zdWJzdHJpbmcocG9zICsgMSwgZnVsbFR5cGUubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5sZW5ndGggPSBsZW4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSBkYXRhVHlwZV8xOyAvLyByZW1vdmUgdGhlIGxlbmd0aCBwYXJ0IGZyb20gdGhlIGRhdGF0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX3RoaXMuZHJpdmVyLndpdGhQcmVjaXNpb25Db2x1bW5UeXBlcy5maW5kKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbCA9PT0gZGF0YVR5cGVfMTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChcIl5cIiArIGRhdGFUeXBlXzEgKyBcIlxcXFwoKFxcXFxkKyksP1xcXFxzPyhcXFxcZCspP1xcXFwpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGZ1bGxUeXBlLm1hdGNoKHJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ucHJlY2lzaW9uID0gK21hdGNoZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX3RoaXMuZHJpdmVyLndpdGhTY2FsZUNvbHVtblR5cGVzLmZpbmQoZnVuY3Rpb24gKGNvbCkgeyByZXR1cm4gY29sID09PSBkYXRhVHlwZV8xOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1syXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnNjYWxlID0gK21hdGNoZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4udHlwZSA9IGRhdGFUeXBlXzE7IC8vIHJlbW92ZSB0aGUgcHJlY2lzaW9uL3NjYWxlIHBhcnQgZnJvbSB0aGUgZGF0YXR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJGb3JlaWduS2V5cywgZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1wiaWRcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cyA9IHRhYmxlRm9yZWlnbktleUNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG93bkZvcmVpZ25LZXlzID0gZGJGb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1wiaWRcIl0gPT09IGZvcmVpZ25LZXlbXCJpZFwiXSAmJiBkYkZvcmVpZ25LZXlbXCJ0YWJsZVwiXSA9PT0gZm9yZWlnbktleVtcInRhYmxlXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lcyA9IG93bkZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXlbXCJmcm9tXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBvd25Gb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1widG9cIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgZm9yZWlnbiBrZXkgbmFtZSwgYmVjYXVzZSB3ZSBjYW4gbm90IGdldCBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBma05hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKHRhYmxlLCBjb2x1bW5OYW1lcywgZm9yZWlnbktleS5yZWZlcmVuY2VkVGFibGVOYW1lLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmtOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBjb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBmb3JlaWduS2V5W1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWVzOiByZWZlcmVuY2VkQ29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGU6IGZvcmVpZ25LZXlbXCJvbl9kZWxldGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IGZvcmVpZ25LZXlbXCJvbl91cGRhdGVcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlUmVnZXggPSAvQ09OU1RSQUlOVCBcIihbXlwiXSopXCIgVU5JUVVFIFxcKCguKj8pXFwpL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodW5pcXVlUmVnZXhSZXN1bHQgPSB1bmlxdWVSZWdleC5leGVjKHNxbCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB1bmlxdWVSZWdleFJlc3VsdFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB1bmlxdWVSZWdleFJlc3VsdFsyXS5zdWJzdHIoMSwgdW5pcXVlUmVnZXhSZXN1bHRbMl0ubGVuZ3RoIC0gMikuc3BsaXQoXCJcXFwiLCBcXFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVVuaXF1ZVByb21pc2VzID0gZGJJbmRpY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wib3JpZ2luXCJdID09PSBcInVcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXgpIHsgcmV0dXJuIGRiSW5kZXhbXCJuYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXhOYW1lKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGJJbmRleCwgaW5kZXhJbmZvcywgaW5kZXhDb2x1bW5zLCBjb2x1bW4sIGZvdW5kTWFwcGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiSW5kZXggPSBkYkluZGljZXMuZmluZChmdW5jdGlvbiAoZGJJbmRleCkgeyByZXR1cm4gZGJJbmRleFtcIm5hbWVcIl0gPT09IGRiSW5kZXhOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJQUkFHTUEgaW5kZXhfaW5mbyhcXFwiXCIgKyBkYkluZGV4W1wibmFtZVwiXSArIFwiXFxcIilcIildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluZm9zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb2x1bW5zID0gaW5kZXhJbmZvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uIChpbmRleEluZm8xLCBpbmRleEluZm8yKSB7IHJldHVybiBwYXJzZUludChpbmRleEluZm8xW1wic2Vxbm9cIl0pIC0gcGFyc2VJbnQoaW5kZXhJbmZvMltcInNlcW5vXCJdKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpbmRleEluZm8pIHsgcmV0dXJuIGluZGV4SW5mb1tcIm5hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4Q29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFpbmRleENvbHVtbnMuZmluZChmdW5jdGlvbiAoaW5kZXhDb2x1bW4pIHsgcmV0dXJuIGluZGV4Q29sdW1uID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwcGluZyA9IHVuaXF1ZU1hcHBpbmdzLmZpbmQoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZy5jb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4Q29sdW1ucy5pbmRleE9mKGNvbHVtbikgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm91bmRNYXBwaW5nID8gZm91bmRNYXBwaW5nLm5hbWUgOiB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUodGFibGUsIGluZGV4Q29sdW1ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBpbmRleENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSB0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGFibGVVbmlxdWVQcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IudW5pcXVlcyA9IChfYy5zZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHAgPSAvQ09OU1RSQUlOVCBcIihbXlwiXSopXCIgQ0hFQ0sgKFxcKC4qP1xcKSkoWyxdfFspXSQpL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNxbCkpICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hlY2tzLnB1c2gobmV3IFRhYmxlQ2hlY2soeyBuYW1lOiByZXN1bHRbMV0sIGV4cHJlc3Npb246IHJlc3VsdFsyXSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1Byb21pc2VzID0gZGJJbmRpY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wib3JpZ2luXCJdID09PSBcImNcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXgpIHsgcmV0dXJuIGRiSW5kZXhbXCJuYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfSkgLy8gdW5xaXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChkYkluZGV4TmFtZSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4RGVmLCBjb25kaXRpb24sIGRiSW5kZXgsIGluZGV4SW5mb3MsIGluZGV4Q29sdW1ucywgaXNVbmlxdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleERlZiA9IGRiSW5kaWNlc0RlZi5maW5kKGZ1bmN0aW9uIChkYkluZGV4RGVmKSB7IHJldHVybiBkYkluZGV4RGVmW1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gL1dIRVJFICguKikvLmV4ZWMoaW5kZXhEZWZbXCJzcWxcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmRleCA9IGRiSW5kaWNlcy5maW5kKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBpbmRleF9pbmZvKFxcXCJcIiArIGRiSW5kZXhbXCJuYW1lXCJdICsgXCJcXFwiKVwiKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SW5mb3MgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvbHVtbnMgPSBpbmRleEluZm9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24gKGluZGV4SW5mbzEsIGluZGV4SW5mbzIpIHsgcmV0dXJuIHBhcnNlSW50KGluZGV4SW5mbzFbXCJzZXFub1wiXSkgLSBwYXJzZUludChpbmRleEluZm8yW1wic2Vxbm9cIl0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4SW5mbykgeyByZXR1cm4gaW5kZXhJbmZvW1wibmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGRiSW5kZXhbXCJ1bmlxdWVcIl0gPT09IFwiMVwiIHx8IGRiSW5kZXhbXCJ1bmlxdWVcIl0gPT09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFRhYmxlSW5kZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRiSW5kZXhbXCJuYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogaW5kZXhDb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaXF1ZTogaXNVbmlxdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiBjb25kaXRpb24gPyBjb25kaXRpb25bMV0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaW5kaWNlc1Byb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzID0gaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiAhIWluZGV4OyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRhYmxlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSB0YWJsZSBzcWwuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVGFibGVTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwcmltYXJ5Q29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnk7IH0pO1xuICAgICAgICB2YXIgaGFzQXV0b0luY3JlbWVudCA9IHByaW1hcnlDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCI7IH0pO1xuICAgICAgICB2YXIgc2tpcFByaW1hcnkgPSBwcmltYXJ5Q29sdW1ucy5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoc2tpcFByaW1hcnkgJiYgaGFzQXV0b0luY3JlbWVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBBVVRPSU5DUkVNRU5UIG9uIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVwiKTtcbiAgICAgICAgdmFyIGNvbHVtbkRlZmluaXRpb25zID0gdGFibGUuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwoY29sdW1uLCBza2lwUHJpbWFyeSk7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgdmFyIHNxbCA9IFwiQ1JFQVRFIFRBQkxFIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCIgKFwiICsgY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgICAgIC8vIG5lZWQgZm9yIGBhZGRDb2x1bW4oKWAgbWV0aG9kLCBiZWNhdXNlIGl0IHJlY3JlYXRlcyB0YWJsZS5cbiAgICAgICAgdGFibGUuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNVbmlxdWU7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgaXNVbmlxdWVFeGlzdCA9IHRhYmxlLnVuaXF1ZXMuc29tZShmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID09PSAxICYmIHVuaXF1ZS5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgaWYgKCFpc1VuaXF1ZUV4aXN0KVxuICAgICAgICAgICAgICAgIHRhYmxlLnVuaXF1ZXMucHVzaChuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRhYmxlLCBbY29sdW1uLm5hbWVdKSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZXM6IFtjb2x1bW4ubmFtZV1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGFibGUudW5pcXVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgdW5pcXVlc1NxbCA9IHRhYmxlLnVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdW5pcXVlTmFtZSA9IHVuaXF1ZS5uYW1lID8gdW5pcXVlLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRhYmxlLCB1bmlxdWUuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lcyA9IHVuaXF1ZS5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVOYW1lICsgXCJcXFwiIFVOSVFVRSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBcIiArIHVuaXF1ZXNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmNoZWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2tzU3FsID0gdGFibGUuY2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hlY2tOYW1lID0gY2hlY2submFtZSA/IGNoZWNrLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmNoZWNrQ29uc3RyYWludE5hbWUodGFibGUsIGNoZWNrLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkNPTlNUUkFJTlQgXFxcIlwiICsgY2hlY2tOYW1lICsgXCJcXFwiIENIRUNLIChcIiArIGNoZWNrLmV4cHJlc3Npb24gKyBcIilcIjtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyBjaGVja3NTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmZvcmVpZ25LZXlzLmxlbmd0aCA+IDAgJiYgY3JlYXRlRm9yZWlnbktleXMpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c1NxbCA9IHRhYmxlLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZmspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmay5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmay5uYW1lKVxuICAgICAgICAgICAgICAgICAgICBmay5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZSh0YWJsZSwgZmsuY29sdW1uTmFtZXMsIF90aGlzLmdldFRhYmxlUGF0aChmayksIGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBcIkNPTlNUUkFJTlQgXFxcIlwiICsgZmsubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBSRUZFUkVOQ0VTIFxcXCJcIiArIGZrLnJlZmVyZW5jZWRUYWJsZU5hbWUgKyBcIlxcXCIgKFwiICsgcmVmZXJlbmNlZENvbHVtbk5hbWVzICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgaWYgKGZrLm9uRGVsZXRlKVxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50ICs9IFwiIE9OIERFTEVURSBcIiArIGZrLm9uRGVsZXRlO1xuICAgICAgICAgICAgICAgIGlmIChmay5vblVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludCArPSBcIiBPTiBVUERBVEUgXCIgKyBmay5vblVwZGF0ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RyYWludDtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyBmb3JlaWduS2V5c1NxbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIHNxbCArPSBcIilcIjtcbiAgICAgICAgdmFyIHRhYmxlTWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZW50aXR5TWV0YWRhdGFzLmZpbmQoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgaWYgKHRhYmxlTWV0YWRhdGEgJiYgdGFibGVNZXRhZGF0YS53aXRob3V0Um93aWQpIHtcbiAgICAgICAgICAgIHNxbCArPSBcIiBXSVRIT1VUIFJPV0lEXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShzcWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGRyb3AgdGFibGUgc3FsLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BUYWJsZVNxbCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaWZFeGlzdCkge1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSA/IHRhYmxlT3JOYW1lLm5hbWUgOiB0YWJsZU9yTmFtZTtcbiAgICAgICAgdmFyIHF1ZXJ5ID0gaWZFeGlzdCA/IFwiRFJPUCBUQUJMRSBJRiBFWElTVFMgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCIgOiBcIkRST1AgVEFCTEUgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkocXVlcnkpO1xuICAgIH07XG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVmlld1NxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFZJRVcgXFxcIlwiICsgdmlldy5uYW1lICsgXCJcXFwiIEFTIFwiICsgdmlldy5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgVklFVyBcXFwiXCIgKyB2aWV3Lm5hbWUgKyBcIlxcXCIgQVMgXCIgKyB2aWV3LmV4cHJlc3Npb24odGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaW5zZXJ0Vmlld0RlZmluaXRpb25TcWwgPSBmdW5jdGlvbiAodmlldykge1xuICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3LmV4cHJlc3Npb24gPT09IFwic3RyaW5nXCIgPyB2aWV3LmV4cHJlc3Npb24udHJpbSgpIDogdmlldy5leHByZXNzaW9uKHRoaXMuY29ubmVjdGlvbikuZ2V0UXVlcnkoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVcsXG4gICAgICAgICAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHZpZXcgc3FsLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BWaWV3U3FsID0gZnVuY3Rpb24gKHZpZXdPclBhdGgpIHtcbiAgICAgICAgdmFyIHZpZXdOYW1lID0gdmlld09yUGF0aCBpbnN0YW5jZW9mIFZpZXcgPyB2aWV3T3JQYXRoLm5hbWUgOiB2aWV3T3JQYXRoO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiRFJPUCBWSUVXIFxcXCJcIiArIHZpZXdOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbW92ZSB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kZWxldGVWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3T3JQYXRoKSB7XG4gICAgICAgIHZhciB2aWV3TmFtZSA9IHZpZXdPclBhdGggaW5zdGFuY2VvZiBWaWV3ID8gdmlld09yUGF0aC5uYW1lIDogdmlld09yUGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHsgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuVklFVywgbmFtZTogdmlld05hbWUgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY3JlYXRlIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSBpbmRleC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgXCIgKyAoaW5kZXguaXNVbmlxdWUgPyBcIlVOSVFVRSBcIiA6IFwiXCIpICsgXCJJTkRFWCBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIE9OIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCIgKFwiICsgY29sdW1ucyArIFwiKSBcIiArIChpbmRleC53aGVyZSA/IFwiV0hFUkUgXCIgKyBpbmRleC53aGVyZSA6IFwiXCIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wSW5kZXhTcWwgPSBmdW5jdGlvbiAoaW5kZXhPck5hbWUpIHtcbiAgICAgICAgdmFyIGluZGV4TmFtZSA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lLm5hbWUgOiBpbmRleE9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkRST1AgSU5ERVggXFxcIlwiICsgaW5kZXhOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgcXVlcnkgZm9yIGNyZWF0ZSBjb2x1bW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRDcmVhdGVDb2x1bW5TcWwgPSBmdW5jdGlvbiAoY29sdW1uLCBza2lwUHJpbWFyeSkge1xuICAgICAgICB2YXIgYyA9IFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIENvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjICs9IFwiIFwiICsgdGhpcy5kcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuY3JlYXRlRnVsbFR5cGUoY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmVudW0pXG4gICAgICAgICAgICBjICs9IFwiIENIRUNLKCBcIiArIGNvbHVtbi5uYW1lICsgXCIgSU4gKFwiICsgY29sdW1uLmVudW0ubWFwKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiJ1wiICsgdmFsICsgXCInXCI7IH0pLmpvaW4oXCIsXCIpICsgXCIpIClcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5pc1ByaW1hcnkgJiYgIXNraXBQcmltYXJ5KVxuICAgICAgICAgICAgYyArPSBcIiBQUklNQVJZIEtFWVwiO1xuICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkID09PSB0cnVlICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIC8vIGRvbid0IHVzZSBza2lwUHJpbWFyeSBoZXJlIHNpbmNlIHVwZGF0ZXMgY2FuIHVwZGF0ZSBhbHJlYWR5IGV4aXN0IHByaW1hcnkgd2l0aG91dCBhdXRvIGluYy5cbiAgICAgICAgICAgIGMgKz0gXCIgQVVUT0lOQ1JFTUVOVFwiO1xuICAgICAgICBpZiAoY29sdW1uLmNvbGxhdGlvbilcbiAgICAgICAgICAgIGMgKz0gXCIgQ09MTEFURSBcIiArIGNvbHVtbi5jb2xsYXRpb247XG4gICAgICAgIGlmIChjb2x1bW4uaXNOdWxsYWJsZSAhPT0gdHJ1ZSlcbiAgICAgICAgICAgIGMgKz0gXCIgTk9UIE5VTExcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmRlZmF1bHQgIT09IG51bGwpXG4gICAgICAgICAgICBjICs9IFwiIERFRkFVTFQgKFwiICsgY29sdW1uLmRlZmF1bHQgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfTtcbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZWNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKG5ld1RhYmxlLCBvbGRUYWJsZSwgbWlncmF0ZURhdGEpIHtcbiAgICAgICAgaWYgKG1pZ3JhdGVEYXRhID09PSB2b2lkIDApIHsgbWlncmF0ZURhdGEgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBuZXdDb2x1bW5OYW1lcywgb2xkQ29sdW1uTmFtZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBvbGQgdGFibGUgaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwob2xkVGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0YWJsZSBuYW1lIGludG8gJ3RlbXBvcmFyeV90YWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBcInRlbXBvcmFyeV9cIiArIG5ld1RhYmxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlU3FsKG5ld1RhYmxlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKG5ld1RhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWdyYXRlIGFsbCBkYXRhIGZyb20gdGhlIG9sZCB0YWJsZSBpbnRvIG5ldyB0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pZ3JhdGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uTmFtZXMgPSBuZXdUYWJsZS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW5OYW1lcyA9IG9sZFRhYmxlLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRUYWJsZS5jb2x1bW5zLmxlbmd0aCA8IG5ld1RhYmxlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbk5hbWVzID0gbmV3VGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkVGFibGUuY29sdW1ucy5sZW5ndGggPiBuZXdUYWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW5OYW1lcyA9IG9sZFRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIklOU0VSVCBJTlRPIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCIoXCIgKyBuZXdDb2x1bW5OYW1lcyArIFwiKSBTRUxFQ1QgXCIgKyBvbGRDb2x1bW5OYW1lcyArIFwiIEZST00gXFxcIlwiICsgb2xkVGFibGUubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJJTlNFUlQgSU5UTyBcXFwiXCIgKyBvbGRUYWJsZS5uYW1lICsgXCJcXFwiKFwiICsgb2xkQ29sdW1uTmFtZXMgKyBcIikgU0VMRUNUIFwiICsgbmV3Q29sdW1uTmFtZXMgKyBcIiBGUk9NIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBvbGQgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKG9sZFRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwob2xkVGFibGUsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBvbGQgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcXFwiXCIgKyBvbGRUYWJsZS5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdUYWJsZS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBvbGRUYWJsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGFibGUgaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUobmV3VGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwobmV3VGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChfdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKG9sZFRhYmxlLCBuZXdUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXI7XG59KEJhc2VRdWVyeVJ1bm5lcikpO1xuZXhwb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IFNxbGpzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi9TcWxqc1F1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yXCI7XG5pbXBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvclwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbnZhciBTcWxqc0RyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3FsanNEcml2ZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFNxbGpzRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgLy8gSWYgYXV0b1NhdmUgaXMgZW5hYmxlZCBieSB1c2VyLCBsb2NhdGlvbiBvciBhdXRvU2F2ZUNhbGxiYWNrIGhhdmUgdG8gYmUgc2V0XG4gICAgICAgIC8vIGJlY2F1c2UgZWl0aGVyIGF1dG9TYXZlIHNhdmVzIHRvIGxvY2F0aW9uIG9yIGNhbGxzIGF1dG9TYXZlQ2FsbGJhY2suXG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF1dG9TYXZlICYmICFfdGhpcy5vcHRpb25zLmxvY2F0aW9uICYmICFfdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImxvY2F0aW9uIG9yIGF1dG9TYXZlQ2FsbGJhY2tcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9hZCBzcWwuanMgcGFja2FnZVxuICAgICAgICBfdGhpcy5sb2FkRGVwZW5kZW5jaWVzKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EuZGF0YWJhc2VDb25uZWN0aW9uID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsb3NlcyBjb25uZWN0aW9uIHdpdGggZGF0YWJhc2UuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IFNxbGpzUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBkYXRhYmFzZSBmcm9tIGEgZ2l2ZW4gZmlsZSAoTm9kZS5qcyksIGxvY2FsIHN0b3JhZ2Uga2V5IChicm93c2VyKSBvciBhcnJheS5cbiAgICAgKiBUaGlzIHdpbGwgZGVsZXRlIHRoZSBjdXJyZW50IGRhdGFiYXNlIVxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEsIGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMpIHtcbiAgICAgICAgaWYgKGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMgPT09IHZvaWQgMCkgeyBjaGVja0lmRmlsZU9yTG9jYWxTdG9yYWdlRXhpc3RzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2UsIGxvY2FsU3RvcmFnZUNvbnRlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSA9PT0gXCJzdHJpbmdcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoUGxhdGZvcm1Ub29scy50eXBlID09PSBcIm5vZGVcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSBzaG91bGQgYmUgYSBwYXRoIHRvIHRoZSBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGxhdGZvcm1Ub29scy5maWxlRXhpc3QoZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSA9IFBsYXRmb3JtVG9vbHMucmVhZEZpbGVTeW5jKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQoZGF0YWJhc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiRmlsZSBcIiArIGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEgKyBcIiBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBhbmQgY2hlY2tJZkZpbGVPckxvY2FsU3RvcmFnZUV4aXN0cyBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG9wZW4gYSBkYXRhYmFzZSB3aXRob3V0IGltcG9ydGluZyBhbiBleGlzdGluZyBmaWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgd2lsbCBiZSB3cml0dGVuIG9uIGZpcnN0IHdyaXRlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb25XaXRoSW1wb3J0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUNvbnRlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlTG9jYWxGb3JhZ2UpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cubG9jYWxmb3JhZ2UpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2luZG93LmxvY2FsZm9yYWdlLmdldEl0ZW0oZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VDb250ZW50ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2FsZm9yYWdlIGlzIG5vdCBkZWZpbmVkIC0gcGxlYXNlIGltcG9ydCBsb2NhbGZvcmFnZS5qcyBpbnRvIHlvdXIgc2l0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlQ29udGVudCA9IFBsYXRmb3JtVG9vbHMuZ2V0R2xvYmFsVmFyaWFibGUoKS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShmaWxlTmFtZU9yTG9jYWxTdG9yYWdlT3JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsU3RvcmFnZSB2YWx1ZSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uV2l0aEltcG9ydChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZUNvbnRlbnQpKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0lmRmlsZU9yTG9jYWxTdG9yYWdlRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkZpbGUgXCIgKyBmaWxlTmFtZU9yTG9jYWxTdG9yYWdlT3JEYXRhICsgXCIgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgdmFsdWUgZG9lc24ndCBleGlzdCBhbmQgY2hlY2tJZkZpbGVPckxvY2FsU3RvcmFnZUV4aXN0cyBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG9wZW4gYSBkYXRhYmFzZSB3aXRob3V0IGltcG9ydGluZyBhbnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgdmFsdWUgd2lsbCBiZSB3cml0dGVuIG9uIGZpcnN0IHdyaXRlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb25XaXRoSW1wb3J0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQoZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXZlZCB0aGUgY3VycmVudCBkYXRhYmFzZSB0byB0aGUgZ2l2ZW4gZmlsZSAoTm9kZS5qcyksIGxvY2FsIHN0b3JhZ2Uga2V5IChicm93c2VyKSBvclxuICAgICAqIGluZGV4ZWREQiBrZXkgKGJyb3dzZXIgd2l0aCBlbmFibGVkIHVzZUxvY2FsRm9yYWdlIG9wdGlvbikuXG4gICAgICogSWYgbm8gbG9jYXRpb24gcGF0aCBpcyBnaXZlbiwgdGhlIGxvY2F0aW9uIHBhdGggaW4gdGhlIG9wdGlvbnMgKGlmIHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXRoLCBjb250ZW50LCBlXzEsIGRhdGFiYXNlLCBkYXRhYmFzZUFycmF5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhdGlvbiAmJiAhdGhpcy5vcHRpb25zLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vIGxvY2F0aW9uIGlzIHNldCwgc3BlY2lmeSBhIGxvY2F0aW9uIHBhcmFtZXRlciBvciBhZGQgdGhlIGxvY2F0aW9uIG9wdGlvbiB0byB5b3VyIGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0aGlzLm9wdGlvbnMubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShQbGF0Zm9ybVRvb2xzLnR5cGUgPT09IFwibm9kZVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gQnVmZmVyLmZyb20odGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXhwb3J0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUGxhdGZvcm1Ub29scy53cml0ZUZpbGUocGF0aCwgY29udGVudCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvdWxkIG5vdCBzYXZlIGRhdGFiYXNlLCBlcnJvcjogXCIgKyBlXzEpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5leHBvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQXJyYXkgPSBbXS5zbGljZS5jYWxsKGRhdGFiYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZUxvY2FsRm9yYWdlKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmxvY2FsZm9yYWdlKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdpbmRvdy5sb2NhbGZvcmFnZS5zZXRJdGVtKHBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGFiYXNlQXJyYXkpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJsb2NhbGZvcmFnZSBpcyBub3QgZGVmaW5lZCAtIHBsZWFzZSBpbXBvcnQgbG9jYWxmb3JhZ2UuanMgaW50byB5b3VyIHNpdGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmdldEdsb2JhbFZhcmlhYmxlKCkubG9jYWxTdG9yYWdlLnNldEl0ZW0ocGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YWJhc2VBcnJheSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdGhlIFF1ZXJ5UnVubmVyIHdoZW4gYSBjaGFuZ2UgdG8gdGhlIGRhdGFiYXNlIGlzIG1hZGUuXG4gICAgICogSWYgYSBjdXN0b20gYXV0b1NhdmVDYWxsYmFjayBpcyBzcGVjaWZpZWQsIGl0IGdldCdzIGNhbGxlZCB3aXRoIHRoZSBkYXRhYmFzZSBhcyBVaW50OEFycmF5LFxuICAgICAqIG90aGVyd2lzZSB0aGUgc2F2ZSBtZXRob2QgaXMgY2FsbGVkIHdoaWNoIHNhdmVzIGl0IHRvIGZpbGUgKE5vZGUuanMpLCBsb2NhbCBzdG9yYWdlIChicm93c2VyKVxuICAgICAqIG9yIGluZGV4ZWREQiAoYnJvd3NlciB3aXRoIGVuYWJsZWQgdXNlTG9jYWxGb3JhZ2Ugb3B0aW9uKS5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuYXV0b1NhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF1dG9TYXZlKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2spIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2sodGhpcy5leHBvcnQoKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNhdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRhYmFzZSBhcyBVaW50OEFycmF5LlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5leHBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5leHBvcnQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZ2VuZXJhdGVkIG1hcCBvZiB2YWx1ZXMgZ2VuZXJhdGVkIG9yIHJldHVybmVkIGJ5IGRhdGFiYXNlIGFmdGVyIElOU0VSVCBxdWVyeS5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuY3JlYXRlR2VuZXJhdGVkTWFwID0gZnVuY3Rpb24gKG1ldGFkYXRhLCBpbnNlcnRSZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGdlbmVyYXRlZE1hcCA9IG1ldGFkYXRhLmdlbmVyYXRlZENvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGdlbmVyYXRlZENvbHVtbikge1xuICAgICAgICAgICAgLy8gc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgaW5zZXJ0ZWQgaWQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20va3JpcGtlbi9zcWwuanMvaXNzdWVzLzc3XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1uLmlzUHJpbWFyeSAmJiBnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gXCJTRUxFQ1QgbGFzdF9pbnNlcnRfcm93aWQoKVwiO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXhlYyhxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcChyZXN1bHRbMF0udmFsdWVzWzBdWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZSwgcXVlcnksIFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqIElmIHRoZSBsb2NhdGlvbiBvcHRpb24gaXMgc2V0LCB0aGUgZGF0YWJhc2UgaXMgbG9hZGVkIGZpcnN0LlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQodGhpcy5vcHRpb25zLmxvY2F0aW9uLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uV2l0aEltcG9ydCh0aGlzLm9wdGlvbnMuZGF0YWJhc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggYW4gb3B0aW9uYWwgZGF0YWJhc2UuXG4gICAgICogSWYgZGF0YWJhc2UgaXMgc3BlY2lmaWVkIGl0IGlzIGxvYWRlZCwgb3RoZXJ3aXNlIGEgbmV3IGVtcHR5IGRhdGFiYXNlIGlzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlzTGVnYWN5VmVyc2lvbiwgc3FsaXRlLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWN5VmVyc2lvbiA9IHR5cGVvZiB0aGlzLnNxbGl0ZS5EYXRhYmFzZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVZlcnNpb24pIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLnNxbGl0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc3FsaXRlKHRoaXMub3B0aW9ucy5zcWxKc0NvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YWJhc2UgJiYgZGF0YWJhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gbmV3IHNxbGl0ZS5EYXRhYmFzZShkYXRhYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IG5ldyBzcWxpdGUuRGF0YWJhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWMoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiBkcml2ZXIgZGVwZW5kZW5jeSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSwgdGhlbiB0cnkgdG8gbG9hZCBpdCB2aWEgXCJyZXF1aXJlXCIuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChQbGF0Zm9ybVRvb2xzLnR5cGUgPT09IFwiYnJvd3NlclwiKSB7XG4gICAgICAgICAgICB2YXIgc3FsaXRlID0gdGhpcy5vcHRpb25zLmRyaXZlciB8fCB3aW5kb3cuU1FMO1xuICAgICAgICAgICAgdGhpcy5zcWxpdGUgPSBzcWxpdGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBzcWxpdGUgPSB0aGlzLm9wdGlvbnMuZHJpdmVyIHx8IFBsYXRmb3JtVG9vbHMubG9hZChcInNxbC5qc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNxbGl0ZSA9IHNxbGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvcihcInNxbC5qc1wiLCBcInNxbC5qc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFNxbGpzRHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgU3FsanNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3FsanNEcml2ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeUZhaWxlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgU3FsanNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3FsanNRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3FsanNRdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIGEgbW9kaWZpY2F0aW9uIGhhcyBoYXBwZW5lZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgcXVlcnkgcnVubmVyIGhhcyByZXF1ZXN0ZWQgYSBzYXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgbWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBTcWxqc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlydHkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcml2ZXIuYXV0b1NhdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTcWxqc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBfc3VwZXIucHJvdG90eXBlLnJlbGVhc2UuY2FsbCh0aGlzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgU3FsanNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgX3N1cGVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbi5jYWxsKHRoaXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNxbGpzUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzID09PSB2b2lkIDApIHsgcGFyYW1ldGVycyA9IFtdOyB9XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb21tYW5kLCBkYXRhYmFzZUNvbm5lY3Rpb24sIHF1ZXJ5U3RhcnRUaW1lLCBzdGF0ZW1lbnQsIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnlFbmRUaW1lLCBxdWVyeUV4ZWN1dGlvblRpbWUsIHJlY29yZHMsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBxdWVyeS50cmltKCkuc3BsaXQoXCIgXCIsIDEpWzBdO1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IHRoaXMuZHJpdmVyLmRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgcXVlcnlTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBkYXRhYmFzZUNvbm5lY3Rpb24ucHJlcGFyZShxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHR5cGVvZiBwICE9PSAndW5kZWZpbmVkJyA/IHAgOiBudWxsOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeUVuZFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlFeGVjdXRpb25UaW1lID0gcXVlcnlFbmRUaW1lIC0gcXVlcnlTdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlTbG93KHF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzLnB1c2goc3RhdGVtZW50LmdldEFzT2JqZWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSBkYXRhYmFzZUNvbm5lY3Rpb24uZ2V0Um93c01vZGlmaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzID0gcmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJlY29yZHM7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5mcmVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQucmF3XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuZnJlZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihxdWVyeSwgcGFyYW1ldGVycywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBTcWxqc1F1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBTcWxqc1F1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxbGpzUXVlcnlSdW5uZXIuanMubWFwXG4iLCIvKipcbiAqIFNxbCBzZXJ2ZXIgZHJpdmVyIHJlcXVpcmVzIHBhcmFtZXRlciB0eXBlcyB0byBiZSBzcGVjaWZpZWQgZm8gaW5wdXQgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBxdWVyeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXRyaWtzaW1lay9ub2RlLW1zc3FsI2RhdGEtdHlwZXNcbiAqL1xudmFyIE1zc3FsUGFyYW1ldGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1zc3FsUGFyYW1ldGVyKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHBhcmFtc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHVibGljIFByb3BlcnRpZXNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLnBhcmFtcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE1zc3FsUGFyYW1ldGVyO1xufSgpKTtcbmV4cG9ydCB7IE1zc3FsUGFyYW1ldGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1zc3FsUGFyYW1ldGVyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhYmFzZVR5cGUuanMubWFwXG4iLCJleHBvcnQgdmFyIE1ldGFkYXRhVGFibGVUeXBlO1xuKGZ1bmN0aW9uIChNZXRhZGF0YVRhYmxlVHlwZSkge1xuICAgIE1ldGFkYXRhVGFibGVUeXBlW1wiVklFV1wiXSA9IFwiVklFV1wiO1xuICAgIE1ldGFkYXRhVGFibGVUeXBlW1wiTUFURVJJQUxJWkVEX1ZJRVdcIl0gPSBcIk1BVEVSSUFMSVpFRF9WSUVXXCI7XG4gICAgTWV0YWRhdGFUYWJsZVR5cGVbXCJHRU5FUkFURURfQ09MVU1OXCJdID0gXCJHRU5FUkFURURfQ09MVU1OXCI7XG59KShNZXRhZGF0YVRhYmxlVHlwZSB8fCAoTWV0YWRhdGFUYWJsZVR5cGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZXRhZGF0YVRhYmxlVHlwZS5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwbGljYXRpb25Nb2RlLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9FbnRpdHlOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yXCI7XG5pbXBvcnQgeyBUcmVlUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1RyZWVSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRmluZE9wdGlvbnNVdGlscyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNVdGlsc1wiO1xuaW1wb3J0IHsgUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4uL3F1ZXJ5LWJ1aWxkZXIvdHJhbnNmb3JtZXIvUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi9xdWVyeS1idWlsZGVyL3RyYW5zZm9ybWVyL1BsYWluT2JqZWN0VG9EYXRhYmFzZUVudGl0eVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBDdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDdXN0b21SZXBvc2l0b3J5Q2Fubm90SW5oZXJpdFJlcG9zaXRvcnlFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DdXN0b21SZXBvc2l0b3J5Q2Fubm90SW5oZXJpdFJlcG9zaXRvcnlFcnJvclwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JlcG9zaXRvcnlOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5Tm90VHJlZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JlcG9zaXRvcnlOb3RUcmVlRXJyb3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGYWN0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUZhY3RvcnlcIjtcbmltcG9ydCB7IFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgRW50aXR5UGVyc2lzdEV4ZWN1dG9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0VudGl0eVBlcnNpc3RFeGVjdXRvclwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBFbnRpdHkgbWFuYWdlciBzdXBwb3NlZCB0byB3b3JrIHdpdGggYW55IGVudGl0eSwgYXV0b21hdGljYWxseSBmaW5kIGl0cyByZXBvc2l0b3J5IGFuZCBjYWxsIGl0cyBtZXRob2RzLFxuICogd2hhdGV2ZXIgZW50aXR5IHR5cGUgYXJlIHlvdSBwYXNzaW5nLlxuICovXG52YXIgRW50aXR5TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWFuYWdlcihjb25uZWN0aW9uLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFByb3RlY3RlZCBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9uY2UgY3JlYXRlZCBhbmQgdGhlbiByZXVzZWQgYnkgZW4gcmVwb3NpdG9yaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWluIHRvIG9iamVjdCB0cmFuc2Zvcm1lciB1c2VkIGluIGNyZWF0ZSBhbmQgbWVyZ2Ugb3BlcmF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxhaW5PYmplY3RUb0VudGl0eVRyYW5zZm9ybWVyID0gbmV3IFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lcigpO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICBpZiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgIC8vIGR5bmFtaWM6IHRoaXMucXVlcnlSdW5uZXIgPSBtYW5hZ2VyO1xuICAgICAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMucXVlcnlSdW5uZXIsIHsgbWFuYWdlcjogdGhpcyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcmFwcyBnaXZlbiBmdW5jdGlvbiBleGVjdXRpb24gKGFuZCBhbGwgb3BlcmF0aW9ucyBtYWRlIHRoZXJlKSBpbiBhIHRyYW5zYWN0aW9uLlxuICAgICAqIEFsbCBkYXRhYmFzZSBvcGVyYXRpb25zIG11c3QgYmUgZXhlY3V0ZWQgdXNpbmcgcHJvdmlkZWQgZW50aXR5IG1hbmFnZXIuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUudHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlzb2xhdGlvbiwgcnVuSW5UcmFuc2FjdGlvbiwgcXVlcnlSdW5uZXIsIHJlc3VsdCwgZXJyXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGlvbiA9IHR5cGVvZiBpc29sYXRpb25PclJ1bkluVHJhbnNhY3Rpb24gPT09IFwic3RyaW5nXCIgPyBpc29sYXRpb25PclJ1bkluVHJhbnNhY3Rpb24gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JblRyYW5zYWN0aW9uID0gdHlwZW9mIGlzb2xhdGlvbk9yUnVuSW5UcmFuc2FjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uIDogcnVuSW5UcmFuc2FjdGlvblBhcmFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFydW5JblRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRyYW5zYWN0aW9uIG1ldGhvZCByZXF1aXJlcyBjYWxsYmFjayBpbiBzZWNvbmQgcGFyYW10ZXIgaWYgaXNvbGF0aW9uIGxldmVsIGlzIHN1cHBsaWVkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRyYW5zYWN0aW9ucyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IE1vbmdvREIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIgJiYgdGhpcy5xdWVyeVJ1bm5lci5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyICYmIHRoaXMucXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IHN0YXJ0IHRyYW5zYWN0aW9uIGJlY2F1c2UgaXRzIGFscmVhZHkgc3RhcnRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA4LCAxMywgMTZdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0aW9uKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oaXNvbGF0aW9uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzQgLyp5aWVsZCovLCBydW5JblRyYW5zYWN0aW9uKHF1ZXJ5UnVubmVyLm1hbmFnZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs5LCAxMSwgLCAxMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogdGhyb3cgZXJyXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNvbm5lY3Rpb24ucXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgc3FsIHF1ZXJ5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5QnVpbGRlciA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgYWxpYXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChhbGlhcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoZW50aXR5Q2xhc3MsIGFsaWFzLCBxdWVyeVJ1bm5lciB8fCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzIHx8IHF1ZXJ5UnVubmVyIHx8IHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGhhcyBhbiBpZCBieSBpdHMgRnVuY3Rpb24gdHlwZSBvciBzY2hlbWEgbmFtZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgbWF5YmVFbnRpdHkpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyB0YXJnZXRPckVudGl0eSA6IHRhcmdldE9yRW50aXR5LmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgZW50aXR5ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/IG1heWJlRW50aXR5IDogdGFyZ2V0T3JFbnRpdHk7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGEuaGFzSWQoZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXR5IG1peGVkIGlkLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldElkID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBtYXliZUVudGl0eSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/IHRhcmdldE9yRW50aXR5IDogdGFyZ2V0T3JFbnRpdHkuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBlbnRpdHkgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gbWF5YmVFbnRpdHkgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5nZXRFbnRpdHlJZE1peGVkTWFwKGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBpbnN0YW5jZSBvciBpbnN0YW5jZXMuXG4gICAgICogQ2FuIGNvcHkgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgaW50byBuZXcgZW50aXRpZXMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBwbGFpbk9iamVjdE9yT2JqZWN0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICBpZiAoIXBsYWluT2JqZWN0T3JPYmplY3RzKVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmNyZWF0ZSh0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGxhaW5PYmplY3RPck9iamVjdHMpKVxuICAgICAgICAgICAgcmV0dXJuIHBsYWluT2JqZWN0T3JPYmplY3RzLm1hcChmdW5jdGlvbiAocGxhaW5FbnRpdHlMaWtlKSB7IHJldHVybiBfdGhpcy5jcmVhdGUoZW50aXR5Q2xhc3MsIHBsYWluRW50aXR5TGlrZSk7IH0pO1xuICAgICAgICB2YXIgbWVyZ2VJbnRvRW50aXR5ID0gbWV0YWRhdGEuY3JlYXRlKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICB0aGlzLnBsYWluT2JqZWN0VG9FbnRpdHlUcmFuc2Zvcm1lci50cmFuc2Zvcm0obWVyZ2VJbnRvRW50aXR5LCBwbGFpbk9iamVjdE9yT2JqZWN0cywgbWV0YWRhdGEsIHRydWUpO1xuICAgICAgICByZXR1cm4gbWVyZ2VJbnRvRW50aXR5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHR3byBlbnRpdGllcyBpbnRvIG9uZSBuZXcgZW50aXR5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBtZXJnZUludG9FbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVudGl0eUxpa2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBlbnRpdHlMaWtlc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICBlbnRpdHlMaWtlcy5mb3JFYWNoKGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIF90aGlzLnBsYWluT2JqZWN0VG9FbnRpdHlUcmFuc2Zvcm1lci50cmFuc2Zvcm0obWVyZ2VJbnRvRW50aXR5LCBvYmplY3QsIG1ldGFkYXRhKTsgfSk7XG4gICAgICAgIHJldHVybiBtZXJnZUludG9FbnRpdHk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBmcm9tIHRoZSBnaXZlbiBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdC4gSWYgZW50aXR5IGFscmVhZHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCB0aGVuXG4gICAgICogaXQgbG9hZHMgaXQgKGFuZCBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaXQpLCByZXBsYWNlcyBhbGwgdmFsdWVzIHdpdGggdGhlIG5ldyBvbmVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAqIGFuZCByZXR1cm5zIHRoaXMgbmV3IGVudGl0eS4gVGhpcyBuZXcgZW50aXR5IGlzIGFjdHVhbGx5IGEgbG9hZGVkIGZyb20gdGhlIGRiIGVudGl0eSB3aXRoIGFsbCBwcm9wZXJ0aWVzXG4gICAgICogcmVwbGFjZWQgZnJvbSB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBlbnRpdHlMaWtlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIsIHRyYW5zZm9ybWVkRW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIgPSBuZXcgUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIodGhpcy5jb25uZWN0aW9uLm1hbmFnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIudHJhbnNmb3JtKGVudGl0eUxpa2UsIG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRW50aXR5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkRW50aXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLm1lcmdlKGVudGl0eUNsYXNzLCB0cmFuc2Zvcm1lZEVudGl0eSwgZW50aXR5TGlrZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHVuZGVmaW5lZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2F2ZXMgYSBnaXZlbiBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0YXJnZXRPckVudGl0eSBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSlcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5vcHRpb25zLm5hbWU7XG4gICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIGVtcHR5IGFycmF5IG9mIGVudGl0aWVzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpICYmIGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudGl0eSk7XG4gICAgICAgIC8vIGV4ZWN1dGUgc2F2ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlQZXJzaXN0RXhlY3V0b3IodGhpcy5jb25uZWN0aW9uLCB0aGlzLnF1ZXJ5UnVubmVyLCBcInNhdmVcIiwgdGFyZ2V0LCBlbnRpdHksIG9wdGlvbnMpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBlbnRpdHk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGVudGl0eSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgYXJyYXkgb2YgZW50aXRpZXMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudGl0eSkgJiYgZW50aXR5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW50aXR5KTtcbiAgICAgICAgLy8gZXhlY3V0ZSBzYXZlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm4gbmV3IEVudGl0eVBlcnNpc3RFeGVjdXRvcih0aGlzLmNvbm5lY3Rpb24sIHRoaXMucXVlcnlSdW5uZXIsIFwicmVtb3ZlXCIsIHRhcmdldCwgZW50aXR5LCBvcHRpb25zKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gZW50aXR5OyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0YXJnZXRPckVudGl0eSBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSlcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5vcHRpb25zLm5hbWU7XG4gICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIGVtcHR5IGFycmF5IG9mIGVudGl0aWVzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpICYmIGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudGl0eSk7XG4gICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybiBuZXcgRW50aXR5UGVyc2lzdEV4ZWN1dG9yKHRoaXMuY29ubmVjdGlvbiwgdGhpcy5xdWVyeVJ1bm5lciwgXCJzb2Z0LXJlbW92ZVwiLCB0YXJnZXQsIGVudGl0eSwgb3B0aW9ucylcbiAgICAgICAgICAgIC5leGVjdXRlKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudGl0eTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZWNvdmVyID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBtYXliZUVudGl0eU9yT3B0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBtaXhlZCBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0YXJnZXQgPSAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgKHRhcmdldE9yRW50aXR5IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgfHwgdHlwZW9mIHRhcmdldE9yRW50aXR5ID09PSBcInN0cmluZ1wiKSkgPyB0YXJnZXRPckVudGl0eSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGVudGl0eSA9IHRhcmdldCA/IG1heWJlRW50aXR5T3JPcHRpb25zIDogdGFyZ2V0T3JFbnRpdHk7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGFyZ2V0ID8gbWF5YmVPcHRpb25zIDogbWF5YmVFbnRpdHlPck9wdGlvbnM7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICAvLyBpZiB1c2VyIHBhc3NlZCBlbXB0eSBhcnJheSBvZiBlbnRpdGllcyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmdcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50aXR5KSAmJiBlbnRpdHkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnRpdHkpO1xuICAgICAgICAvLyBleGVjdXRlIHJlY292ZXIgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybiBuZXcgRW50aXR5UGVyc2lzdEV4ZWN1dG9yKHRoaXMuY29ubmVjdGlvbiwgdGhpcy5xdWVyeVJ1bm5lciwgXCJyZWNvdmVyXCIsIHRhcmdldCwgZW50aXR5LCBvcHRpb25zKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gZW50aXR5OyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBnaXZlbiBlbnRpdHkgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCBzbyBxdWVyeSB3aWxsIGZhaWwgaWYgZHVwbGljYXRlIGVudGl0eSBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKiBZb3UgY2FuIGV4ZWN1dGUgYnVsayBpbnNlcnRzIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0eSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhlbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnVwc2VydCA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0eU9yRW50aXRpZXMsIGNvbmZsaWN0UGF0aHNPck9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhLCBvcHRpb25zLCB1bmlxdWVDb2x1bW5Db25zdHJhaW50cywgdXNlSW5kZXgsIGVudGl0aWVzLCBjb25mbGljdENvbHVtbnMsIG92ZXJ3cml0ZUNvbHVtbnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25mbGljdFBhdGhzT3JPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RQYXRoczogY29uZmxpY3RQYXRoc09yT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZsaWN0UGF0aHNPck9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbkNvbnN0cmFpbnRzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICBdLCBfX3JlYWQobWV0YWRhdGEuaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGl4KSB7IHJldHVybiBpeC5pc1VuaXF1ZTsgfSkubWFwKGZ1bmN0aW9uIChpeCkgeyByZXR1cm4gaXguY29sdW1uczsgfSkpLCBmYWxzZSksIF9fcmVhZChtZXRhZGF0YS51bmlxdWVzLm1hcChmdW5jdGlvbiAodXEpIHsgcmV0dXJuIHVxLmNvbHVtbnM7IH0pKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHVzZUluZGV4ID0gdW5pcXVlQ29sdW1uQ29uc3RyYWludHMuZmluZChmdW5jdGlvbiAoaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl4Lmxlbmd0aCA9PT0gb3B0aW9ucy5jb25mbGljdFBhdGhzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb25mbGljdFBhdGhzLmV2ZXJ5KGZ1bmN0aW9uIChjb25mbGljdFByb3BlcnR5UGF0aCkgeyByZXR1cm4gaXguc29tZShmdW5jdGlvbiAoY29sKSB7IHJldHVybiBjb2wucHJvcGVydHlQYXRoID09PSBjb25mbGljdFByb3BlcnR5UGF0aDsgfSk7IH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1c2VJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBbiB1cHNlcnQgcmVxdWlyZXMgY29uZGl0aW9ucyB0aGF0IGhhdmUgYSB1bmlxdWUgY29uc3RyYWludCBidXQgbm9uZSB3YXMgZm91bmQgZm9yIGNvbmZsaWN0IHByb3BlcnRpZXM6IFwiICsgb3B0aW9ucy5jb25mbGljdFBhdGhzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyA9IFtlbnRpdHlPckVudGl0aWVzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gZW50aXR5T3JFbnRpdGllcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmxpY3RDb2x1bW5zID0gbWV0YWRhdGEubWFwUHJvcGVydHlQYXRoc1RvQ29sdW1ucyhvcHRpb25zLmNvbmZsaWN0UGF0aHMpO1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUNvbHVtbnMgPSBtZXRhZGF0YS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbCkgeyByZXR1cm4gKCFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSkgJiYgZW50aXRpZXMuc29tZShmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiB0eXBlb2YgY29sLmdldEVudGl0eVZhbHVlKGVudGl0eSkgIT09IFwidW5kZWZpbmVkXCI7IH0pOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50byh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKGVudGl0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9yVXBkYXRlKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGNvbmZsaWN0Q29sdW1ucyksIGZhbHNlKSwgX19yZWFkKG92ZXJ3cml0ZUNvbHVtbnMpLCBmYWxzZSkubWFwKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbC5kYXRhYmFzZU5hbWU7IH0pLCBjb25mbGljdENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbC5kYXRhYmFzZU5hbWU7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGVudGl0eSBwYXJ0aWFsbHkuIEVudGl0eSBjYW4gYmUgZm91bmQgYnkgYSBnaXZlbiBjb25kaXRpb24ocykuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IFVQREFURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIENvbmRpdGlvbihzKSBjYW5ub3QgYmUgZW1wdHkuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHRhcmdldCwgY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHkpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgdXBkYXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAudXBkYXRlKHRhcmdldClcbiAgICAgICAgICAgICAgICAuc2V0KHBhcnRpYWxFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgLnVwZGF0ZSh0YXJnZXQpXG4gICAgICAgICAgICAgICAgLnNldChwYXJ0aWFsRW50aXR5KVxuICAgICAgICAgICAgICAgIC53aGVyZShjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGVudGl0aWVzIGJ5IGEgZ2l2ZW4gY29uZGl0aW9uKHMpLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBERUxFVEUgcXVlcnkuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgZW50aXR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBDb25kaXRpb24ocykgY2Fubm90IGJlIGVtcHR5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgY3JpdGVyaWEpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgZGVsZXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmUoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3JkcyB0aGUgZGVsZXRlIGRhdGUgb2YgZW50aXRpZXMgYnkgYSBnaXZlbiBjb25kaXRpb24ocykuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IERFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIENvbmRpdGlvbihzKSBjYW5ub3QgYmUgZW1wdHkuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuc29mdERlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgY3JpdGVyaWEpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgZGVsZXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuc29mdERlbGV0ZSgpXG4gICAgICAgICAgICAgICAgLmZyb20odGFyZ2V0T3JFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgLnNvZnREZWxldGUoKVxuICAgICAgICAgICAgICAgIC5mcm9tKHRhcmdldE9yRW50aXR5KVxuICAgICAgICAgICAgICAgIC53aGVyZShjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNvbmRpdGlvbihzKS5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgREVMRVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICogQ29uZGl0aW9uKHMpIGNhbm5vdCBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBjcml0ZXJpYSkge1xuICAgICAgICAvLyBpZiB1c2VyIHBhc3NlZCBlbXB0eSBjcml0ZXJpYSBvciBlbXB0eSBsaXN0IG9mIGNyaXRlcmlhcywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpZiAoY3JpdGVyaWEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgPT09IG51bGwgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBcIlwiIHx8XG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheShjcml0ZXJpYSkgJiYgY3JpdGVyaWEubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlT1JNRXJyb3IoXCJFbXB0eSBjcml0ZXJpYShzKSBhcmUgbm90IGFsbG93ZWQgZm9yIHRoZSBkZWxldGUgbWV0aG9kLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGNyaXRlcmlhID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgIC5yZXN0b3JlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAucmVzdG9yZSgpXG4gICAgICAgICAgICAgICAgLmZyb20odGFyZ2V0T3JFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlKGNyaXRlcmlhKVxuICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvdW50cyBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zLlxuICAgICAqIFVzZWZ1bCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zT3JDb25kaXRpb25zKS5nZXRDb3VudCgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5RmluZE1hbnlPcHRpb25zT3JDb25kaXRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBvcHRpb25zT3JDb25kaXRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuam9pbkVhZ2VyUmVsYXRpb25zKHFiLCBxYi5hbGlhcywgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxYi5nZXRNYW55KCldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgYW5kIGNvbmRpdGlvbnMuXG4gICAgICogQWxzbyBjb3VudHMgYWxsIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gY29uZGl0aW9ucyxcbiAgICAgKiBidXQgaWdub3JlcyBwYWdpbmF0aW9uIHNldHRpbmdzIChmcm9tIGFuZCB0YWtlIG9wdGlvbnMpLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5RmluZE1hbnlPcHRpb25zT3JDb25kaXRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBvcHRpb25zT3JDb25kaXRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuam9pbkVhZ2VyUmVsYXRpb25zKHFiLCBxYi5hbGlhcywgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxYi5nZXRNYW55QW5kQ291bnQoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyB3aXRoIGlkcy5cbiAgICAgKiBPcHRpb25hbGx5IGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zIGNhbiBiZSBhcHBsaWVkLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRCeUlkcyA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcWI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm8gaWRzIHBhc3NlZCwgbm8gbmVlZCB0byBleGVjdXRlIGEgcXVlcnkgLSBqdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheSBvZiB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoIWlkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgcWIgPSB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgRmluZE9wdGlvbnNVdGlscy5leHRyYWN0RmluZE1hbnlPcHRpb25zQWxpYXMob3B0aW9uc09yQ29uZGl0aW9ucykgfHwgbWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoIUZpbmRPcHRpb25zVXRpbHMuaXNGaW5kTWFueU9wdGlvbnMob3B0aW9uc09yQ29uZGl0aW9ucykgfHwgb3B0aW9uc09yQ29uZGl0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmpvaW5FYWdlclJlbGF0aW9ucyhxYiwgcWIuYWxpYXMsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcWIuYW5kV2hlcmVJbklkcyhpZHMpLmdldE1hbnkoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBmaXJzdCBlbnRpdHkgdGhhdCBtYXRjaGVzIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZmluZE9uZSA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZmluZE9wdGlvbnMsIG9wdGlvbnMsIG1ldGFkYXRhLCBhbGlhcywgcWIsIHBhc3NlZElkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChGaW5kT3B0aW9uc1V0aWxzLmlzRmluZE9uZU9wdGlvbnMoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0gaWRPck9wdGlvbnNPckNvbmRpdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlT3B0aW9ucyAmJiBGaW5kT3B0aW9uc1V0aWxzLmlzRmluZE9uZU9wdGlvbnMobWF5YmVPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBmaW5kT3B0aW9ucyA9IG1heWJlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QgJiYgIUZpbmRPcHRpb25zVXRpbHMuaXNGaW5kT25lT3B0aW9ucyhpZE9yT3B0aW9uc09yQ29uZGl0aW9ucykpXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBpZE9yT3B0aW9uc09yQ29uZGl0aW9ucztcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgYWxpYXMgPSBtZXRhZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChmaW5kT3B0aW9ucyAmJiBmaW5kT3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzID0gZmluZE9wdGlvbnMuam9pbi5hbGlhcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVPcHRpb25zICYmIEZpbmRPcHRpb25zVXRpbHMuaXNGaW5kT25lT3B0aW9ucyhtYXliZU9wdGlvbnMpICYmIG1heWJlT3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzID0gbWF5YmVPcHRpb25zLmpvaW4uYWxpYXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoZW50aXR5Q2xhc3MsIGFsaWFzKTtcbiAgICAgICAgICAgICAgICBwYXNzZWRJZCA9IHR5cGVvZiBpZE9yT3B0aW9uc09yQ29uZGl0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgPT09IFwibnVtYmVyXCIgfHwgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgaW5zdGFuY2VvZiBEYXRlO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluZE9wdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgKGZpbmRPcHRpb25zIHx8IHt9KSksIHsgdGFrZTogMSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1F1ZXJ5QnVpbGRlcihxYiwgZmluZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghZmluZE9wdGlvbnMgfHwgZmluZE9wdGlvbnMubG9hZEVhZ2VyUmVsYXRpb25zICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmpvaW5FYWdlclJlbGF0aW9ucyhxYiwgcWIuYWxpYXMsIHFiLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmFuZFdoZXJlSW5JZHMobWV0YWRhdGEuZW5zdXJlRW50aXR5SWRNYXAoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHFiLmdldE9uZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucyBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRPbmVPckZhaWwgPSBmdW5jdGlvbiAoZW50aXR5Q2xhc3MsIGlkT3JPcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmZpbmRPbmUoZW50aXR5Q2xhc3MsIGlkT3JPcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRW50aXR5Tm90Rm91bmRFcnJvcihlbnRpdHlDbGFzcywgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlICh0cnVuY2F0ZXMvZHJvcHMgaXQpLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgdXNlcyBUUlVOQ0FURSBhbmQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaW4gdHJhbnNhY3Rpb25zIG9uIHNvbWUgcGxhdGZvcm1zLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU5NzI3MzgvOTI1MTUxXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhLCBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAsIDMsIDZdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNsZWFyVGFibGUobWV0YWRhdGEudGFibGVQYXRoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jcmVtZW50cyBzb21lIGNvbHVtbiBieSBwcm92aWRlZCB2YWx1ZSBvZiB0aGUgZW50aXRpZXMgbWF0Y2hlZCBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmluY3JlbWVudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIGNvbHVtbiwgdmFsdWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gbWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcIiArIHByb3BlcnR5UGF0aCArIFwiIHdhcyBub3QgZm91bmQgaW4gXCIgKyBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIgZW50aXR5LlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJWYWx1ZSBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIiBpcyBub3QgYSBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2VSaWdodChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgKyBcIiArIHZhbHVlOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgXCJlbnRpdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoZW50aXR5Q2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShjb25kaXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWNyZW1lbnRzIHNvbWUgY29sdW1uIGJ5IHByb3ZpZGVkIHZhbHVlIG9mIHRoZSBlbnRpdGllcyBtYXRjaGVkIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZGVjcmVtZW50ID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgY29sdW1uLCB2YWx1ZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFwiICsgcHJvcGVydHlQYXRoICsgXCIgd2FzIG5vdCBmb3VuZCBpbiBcIiArIG1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIodmFsdWUpKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlZhbHVlIFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIGlzIG5vdCBhIG51bWJlci5cIik7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gcHJvcGVydHlQYXRoXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiAtIFwiICsgdmFsdWU7IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBcImVudGl0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShlbnRpdHlDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQodmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIElmIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIG1vZGUgaXMgdXNlZCwgdGhlbiByZXBvc2l0b3J5IGlzIG9idGFpbmVkIGZyb20gdGhlXG4gICAgICogcmVwb3NpdG9yeSBhZ2dyZWdhdG9yLCB3aGVyZSBlYWNoIHJlcG9zaXRvcnkgaXMgaW5kaXZpZHVhbGx5IGNyZWF0ZWQgZm9yIHRoaXMgZW50aXR5IG1hbmFnZXIuXG4gICAgICogV2hlbiBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBub3QgdXNlZCwgcmVwb3NpdG9yeSBpcyBiZWluZyBvYnRhaW5lZCBmcm9tIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldFJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyByZXBvc2l0b3J5IHdpdGggdGhpcyB0YXJnZXQgcmVnaXN0ZXJlZFxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5oYXNNZXRhZGF0YSh0YXJnZXQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKHRoaXMuY29ubmVjdGlvbi5uYW1lLCB0YXJnZXQpO1xuICAgICAgICAvLyBmaW5kIGFscmVhZHkgY3JlYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIGFuZCByZXR1cm4gaXQgaWYgZm91bmRcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhcmdldCk7XG4gICAgICAgIHZhciByZXBvc2l0b3J5ID0gdGhpcy5yZXBvc2l0b3JpZXMuZmluZChmdW5jdGlvbiAocmVwb3NpdG9yeSkgeyByZXR1cm4gcmVwb3NpdG9yeS5tZXRhZGF0YSA9PT0gbWV0YWRhdGE7IH0pO1xuICAgICAgICBpZiAocmVwb3NpdG9yeSlcbiAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5O1xuICAgICAgICAvLyBpZiByZXBvc2l0b3J5IHdhcyBub3QgZm91bmQgdGhlbiBjcmVhdGUgaXQsIHN0b3JlIGl0cyBpbnN0YW5jZSBhbmQgcmV0dXJuIGl0XG4gICAgICAgIHZhciBuZXdSZXBvc2l0b3J5ID0gbmV3IFJlcG9zaXRvcnlGYWN0b3J5KCkuY3JlYXRlKHRoaXMsIG1ldGFkYXRhLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3JpZXMucHVzaChuZXdSZXBvc2l0b3J5KTtcbiAgICAgICAgcmV0dXJuIG5ld1JlcG9zaXRvcnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIElmIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIG1vZGUgaXMgdXNlZCwgdGhlbiByZXBvc2l0b3J5IGlzIG9idGFpbmVkIGZyb20gdGhlXG4gICAgICogcmVwb3NpdG9yeSBhZ2dyZWdhdG9yLCB3aGVyZSBlYWNoIHJlcG9zaXRvcnkgaXMgaW5kaXZpZHVhbGx5IGNyZWF0ZWQgZm9yIHRoaXMgZW50aXR5IG1hbmFnZXIuXG4gICAgICogV2hlbiBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBub3QgdXNlZCwgcmVwb3NpdG9yeSBpcyBiZWluZyBvYnRhaW5lZCBmcm9tIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldFRyZWVSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAvLyB0cmVlIHRhYmxlcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHNvbWUgZHJpdmVycyAobW9uZ29kYilcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIudHJlZVN1cHBvcnQgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IodGhpcy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlcG9zaXRvcnkgaXMgcmVhbCB0cmVlIHJlcG9zaXRvcnlcbiAgICAgICAgdmFyIHJlcG9zaXRvcnkgPSB0aGlzLmdldFJlcG9zaXRvcnkodGFyZ2V0KTtcbiAgICAgICAgaWYgKCEocmVwb3NpdG9yeSBpbnN0YW5jZW9mIFRyZWVSZXBvc2l0b3J5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5Tm90VHJlZUVycm9yKHRhcmdldCk7XG4gICAgICAgIHJldHVybiByZXBvc2l0b3J5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBtb25nb2RiIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZ2V0TW9uZ29SZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmdldE1vbmdvUmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBjdXN0b20gZW50aXR5IHJlcG9zaXRvcnkgbWFya2VkIHdpdGggQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldEN1c3RvbVJlcG9zaXRvcnkgPSBmdW5jdGlvbiAoY3VzdG9tUmVwb3NpdG9yeSkge1xuICAgICAgICB2YXIgZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlSZXBvc2l0b3JpZXMuZmluZChmdW5jdGlvbiAocmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudGFyZ2V0ID09PSAoY3VzdG9tUmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gY3VzdG9tUmVwb3NpdG9yeSA6IGN1c3RvbVJlcG9zaXRvcnkuY29uc3RydWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSBlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzLmVudGl0eSA/IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzLmVudGl0eSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2UgPSBuZXcgZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncy50YXJnZXQodGhpcywgZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAvLyBOT1RFOiBkeW5hbWljIGFjY2VzcyB0byBwcm90ZWN0ZWQgcHJvcGVydGllcy4gV2UgbmVlZCB0aGlzIHRvIHByZXZlbnQgdW53YW50ZWQgcHJvcGVydGllcyBpbiB0aG9zZSBjbGFzc2VzIHRvIGJlIGV4cG9zZWQsXG4gICAgICAgIC8vIGhvd2V2ZXIgd2UgbmVlZCB0aGVzZSBwcm9wZXJ0aWVzIGZvciBpbnRlcm5hbCB3b3JrIG9mIHRoZSBjbGFzc1xuICAgICAgICBpZiAoZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlIGluc3RhbmNlb2YgQWJzdHJhY3RSZXBvc2l0b3J5KSB7XG4gICAgICAgICAgICBpZiAoIWVudGl0eVJlcG9zaXRvcnlJbnN0YW5jZVtcIm1hbmFnZXJcIl0pXG4gICAgICAgICAgICAgICAgZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlW1wibWFuYWdlclwiXSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudGl0eVJlcG9zaXRvcnlJbnN0YW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIGlmICghZW50aXR5TWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yKGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgICAgICAgICAgZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlW1wibWFuYWdlclwiXSA9IHRoaXM7XG4gICAgICAgICAgICBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2VbXCJtZXRhZGF0YVwiXSA9IGVudGl0eU1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgZW50aXR5IG1hbmFnZXIuXG4gICAgICogVGhpcyBpcyB1c2VkIHdoZW4gZW50aXR5IG1hbmFnZXIgaXMgY3JlYXRlZCB3aXRoIGEgc2luZ2xlIHF1ZXJ5IHJ1bm5lcixcbiAgICAgKiBhbmQgdGhpcyBzaW5nbGUgcXVlcnkgcnVubmVyIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGFmdGVyIGpvYiB3aXRoIGVudGl0eSBtYW5hZ2VyIGlzIGRvbmUuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLnF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWFuYWdlcjtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNYW5hZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vRW50aXR5TWFuYWdlclwiO1xuaW1wb3J0IHsgTW9uZ29FbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vTW9uZ29FbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsanNFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vU3FsanNFbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBTcWxqc0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsanMvU3FsanNEcml2ZXJcIjtcbi8qKlxuICogSGVscHMgdG8gY3JlYXRlIGVudGl0eSBtYW5hZ2Vycy5cbiAqL1xudmFyIEVudGl0eU1hbmFnZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVudGl0eU1hbmFnZXJGYWN0b3J5KCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBtYW5hZ2VyIGRlcGVuZCBvbiBhIGdpdmVuIGNvbm5lY3Rpb24ncyBkcml2ZXIuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb25uZWN0aW9uLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcilcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9uZ29FbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxqc0RyaXZlcilcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3FsanNFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyRmFjdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNYW5hZ2VyRmFjdG9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL0VudGl0eU1hbmFnZXJcIjtcbi8qKlxuICogQSBzcGVjaWFsIEVudGl0eU1hbmFnZXIgdGhhdCBpbmNsdWRlcyBpbXBvcnQvZXhwb3J0IGFuZCBsb2FkL3NhdmUgZnVuY3Rpb25cbiAqIHRoYXQgYXJlIHVuaXF1ZSB0byBTcWwuanMuXG4gKi9cbnZhciBTcWxqc0VudGl0eU1hbmFnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNxbGpzRW50aXR5TWFuYWdlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3FsanNFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBjb25uZWN0aW9uLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTG9hZHMgZWl0aGVyIHRoZSBkZWZpbml0aW9uIGZyb20gYSBmaWxlIChOb2RlLmpzKSBvciBsb2NhbHN0b3JhZ2UgKGJyb3dzZXIpXG4gICAgICogb3IgdXNlcyB0aGUgZ2l2ZW4gZGVmaW5pdGlvbiB0byBvcGVuIGEgbmV3IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFNxbGpzRW50aXR5TWFuYWdlci5wcm90b3R5cGUubG9hZERhdGFiYXNlID0gZnVuY3Rpb24gKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyaXZlci5sb2FkKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IGRhdGFiYXNlIHRvIGEgZmlsZSAoTm9kZS5qcykgb3IgbG9jYWxzdG9yYWdlIChicm93c2VyKVxuICAgICAqIGlmIGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2UgaXMgbm90IHNldCBvcHRpb25zLmxvY2F0aW9uIGlzIHVzZWQuXG4gICAgICovXG4gICAgU3FsanNFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5zYXZlRGF0YWJhc2UgPSBmdW5jdGlvbiAoZmlsZU5hbWVPckxvY2FsU3RvcmFnZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLnNhdmUoZmlsZU5hbWVPckxvY2FsU3RvcmFnZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRhYmFzZSBkZWZpbml0aW9uLlxuICAgICAqL1xuICAgIFNxbGpzRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZXhwb3J0RGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlci5leHBvcnQoKTtcbiAgICB9O1xuICAgIHJldHVybiBTcWxqc0VudGl0eU1hbmFnZXI7XG59KEVudGl0eU1hbmFnZXIpKTtcbmV4cG9ydCB7IFNxbGpzRW50aXR5TWFuYWdlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcWxqc0VudGl0eU1hbmFnZXIuanMubWFwXG4iLCIvKipcbiAqIEludGVyZmFjZSBmb3IgZW50aXR5IG1ldGFkYXRhIG1hcHBpbmdzIHN0b3JlZCBpbnNpZGUgXCJzY2hlbWFzXCIgaW5zdGVhZCBvZiBtb2RlbHMgZGVjb3JhdGVkIGJ5IGRlY29yYXRvcnMuXG4gKi9cbnZhciBFbnRpdHlTY2hlbWEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW50aXR5U2NoZW1hKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIEVudGl0eVNjaGVtYTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlTY2hlbWEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW50aXR5U2NoZW1hLmpzLm1hcFxuIiwiaW1wb3J0IHsgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vbWV0YWRhdGEtYXJncy9NZXRhZGF0YUFyZ3NTdG9yYWdlXCI7XG4vKipcbiAqIFRyYW5zZm9ybXMgZW50aXR5IHNjaGVtYSBpbnRvIG1ldGFkYXRhIGFyZ3Mgc3RvcmFnZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBqdXN0IGxpa2UgZW50aXRpZXMgcmVhZCBmcm9tIGRlY29yYXRvcnMuXG4gKi9cbnZhciBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgZW50aXR5IHNjaGVtYSBpbnRvIG5ldyBtZXRhZGF0YSBhcmdzIHN0b3JhZ2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIEVudGl0eVNjaGVtYVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAoc2NoZW1hcykge1xuICAgICAgICB2YXIgbWV0YWRhdGFBcmdzU3RvcmFnZSA9IG5ldyBNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICAgIHNjaGVtYXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5U2NoZW1hKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGVudGl0eVNjaGVtYS5vcHRpb25zO1xuICAgICAgICAgICAgLy8gYWRkIHRhYmxlIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICB2YXIgdGFibGVNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCBcInJlZ3VsYXJcIixcbiAgICAgICAgICAgICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnksXG4gICAgICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMuc3luY2hyb25pemUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogb3B0aW9ucy5leHByZXNzaW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS50YWJsZXMucHVzaCh0YWJsZU1ldGFkYXRhKTtcbiAgICAgICAgICAgIC8vIGFkZCBjb2x1bW5zIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmNvbHVtbnMpLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gb3B0aW9ucy5jb2x1bW5zW2NvbHVtbk5hbWVdO1xuICAgICAgICAgICAgICAgIHZhciBtb2RlID0gXCJyZWd1bGFyXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5jcmVhdGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJjcmVhdGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi51cGRhdGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJ1cGRhdGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5kZWxldGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJkZWxldGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi52ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJ2ZXJzaW9uXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi50cmVlQ2hpbGRyZW5Db3VudClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwidHJlZUNoaWxkcmVuQ291bnRcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRyZWVMZXZlbClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwidHJlZUxldmVsXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5vYmplY3RJZClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwib2JqZWN0SWRcIjtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ub2JqZWN0SWQgPyBcIl9pZFwiIDogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGNvbHVtbi5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGNvbHVtbi5udWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBjb2x1bW4ucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGU6IGNvbHVtbi51cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IGNvbHVtbi5zZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6IGNvbHVtbi5pbnNlcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBjb2x1bW4ucHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogY29sdW1uLnVuaXF1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGNvbHVtbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogY29sdW1uLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZTogY29sdW1uLm9uVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBjb2x1bW4ucHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IGNvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiBjb2x1bW4uemVyb2ZpbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDogY29sdW1uLnVuc2lnbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogY29sdW1uLmNoYXJzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXRpb246IGNvbHVtbi5jb2xsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtOiBjb2x1bW4uZW51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogY29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFR5cGU6IGNvbHVtbi5nZW5lcmF0ZWRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHN0b3JlVHlwZTogY29sdW1uLmhzdG9yZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheTogY29sdW1uLmFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxGZWF0dXJlVHlwZTogY29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyaWQ6IGNvbHVtbi5zcmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UuY29sdW1ucy5wdXNoKGNvbHVtbkFncnMpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0aW9uQXJncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6IHR5cGVvZiBjb2x1bW4uZ2VuZXJhdGVkID09PSBcInN0cmluZ1wiID8gY29sdW1uLmdlbmVyYXRlZCA6IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5nZW5lcmF0aW9ucy5wdXNoKGdlbmVyYXRpb25BcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi51bmlxdWUpXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UudW5pcXVlcy5wdXNoKHsgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsIGNvbHVtbnM6IFtjb2x1bW5OYW1lXSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gYWRkIHJlbGF0aW9uIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLnJlbGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRpb25TY2hlbWEgPSBvcHRpb25zLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25UeXBlOiByZWxhdGlvblNjaGVtYS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXp5OiByZWxhdGlvblNjaGVtYS5sYXp5IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcmVsYXRpb25TY2hlbWEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogcmVsYXRpb25TY2hlbWEuaW52ZXJzZVNpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyZWVQYXJlbnQ6IHJlbGF0aW9uU2NoZW1hLnRyZWVQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyZWVDaGlsZHJlbjogcmVsYXRpb25TY2hlbWEudHJlZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyOiByZWxhdGlvblNjaGVtYS5lYWdlciB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNjYWRlOiByZWxhdGlvblNjaGVtYS5jYXNjYWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlOiByZWxhdGlvblNjaGVtYS5udWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZTogcmVsYXRpb25TY2hlbWEub25EZWxldGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IHJlbGF0aW9uU2NoZW1hLm9uVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmFibGU6IHJlbGF0aW9uU2NoZW1hLmRlZmVycmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogcmVsYXRpb25TY2hlbWEucHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZTogcmVsYXRpb25TY2hlbWEucGVyc2lzdGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JwaGFuZWRSb3dBY3Rpb246IHJlbGF0aW9uU2NoZW1hLm9ycGhhbmVkUm93QWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UucmVsYXRpb25zLnB1c2gocmVsYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgam9pbiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uU2NoZW1hLmpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25TY2hlbWEuam9pbkNvbHVtbiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLmpvaW5Db2x1bW5zLnB1c2goam9pbkNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbnNPcHRpb25zID0gQXJyYXkuaXNBcnJheShyZWxhdGlvblNjaGVtYS5qb2luQ29sdW1uKSA/IHJlbGF0aW9uU2NoZW1hLmpvaW5Db2x1bW4gOiBbcmVsYXRpb25TY2hlbWEuam9pbkNvbHVtbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgam9pbkNvbHVtbnNPcHRpb25zXzEgPSBfX3ZhbHVlcyhqb2luQ29sdW1uc09wdGlvbnMpLCBqb2luQ29sdW1uc09wdGlvbnNfMV8xID0gam9pbkNvbHVtbnNPcHRpb25zXzEubmV4dCgpOyAham9pbkNvbHVtbnNPcHRpb25zXzFfMS5kb25lOyBqb2luQ29sdW1uc09wdGlvbnNfMV8xID0gam9pbkNvbHVtbnNPcHRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbk9wdGlvbiA9IGpvaW5Db2x1bW5zT3B0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHJlbGF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBqb2luQ29sdW1uT3B0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IGpvaW5Db2x1bW5PcHRpb24ucmVmZXJlbmNlZENvbHVtbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLmpvaW5Db2x1bW5zLnB1c2goam9pbkNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2luQ29sdW1uc09wdGlvbnNfMV8xICYmICFqb2luQ29sdW1uc09wdGlvbnNfMV8xLmRvbmUgJiYgKF9hID0gam9pbkNvbHVtbnNPcHRpb25zXzEucmV0dXJuKSkgX2EuY2FsbChqb2luQ29sdW1uc09wdGlvbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgam9pbiB0YWJsZVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2Uuam9pblRhYmxlcy5wdXNoKGpvaW5UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByZWxhdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW5zOiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW4gPyBbcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW5dIDogcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5zOiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uID8gW3JlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbl0gOiByZWxhdGlvblNjaGVtYS5qb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2Uuam9pblRhYmxlcy5wdXNoKGpvaW5UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBpbmRleCBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhBZ3JzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmRleC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiBpbmRleC51bmlxdWUgPT09IHRydWUgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsOiBpbmRleC5zcGF0aWFsID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHRleHQ6IGluZGV4LmZ1bGx0ZXh0ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyOiBpbmRleC5wYXJzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogaW5kZXguc3luY2hyb25pemUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmU6IGluZGV4LndoZXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlOiBpbmRleC5zcGFyc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UuaW5kaWNlcy5wdXNoKGluZGV4QWdycyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdW5pcXVlIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51bmlxdWVzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51bmlxdWVzLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5pcXVlQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdW5pcXVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB1bmlxdWUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLnVuaXF1ZXMucHVzaCh1bmlxdWVBZ3JzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBjaGVjayBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jaGVja3MuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2hlY2submFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGNoZWNrLmV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5jaGVja3MucHVzaChjaGVja0FncnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIGV4Y2x1c2lvbiBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhjbHVzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleGNsdXNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1c2lvbkFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGV4Y2x1c2lvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhjbHVzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5leGNsdXNpb25zLnB1c2goZXhjbHVzaW9uQXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGFBcmdzU3RvcmFnZTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcjtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlTY2hlbWFUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHRyaWVzIHRvIHJlY3JlYXRlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgcHJldmlvdXMgY29ubmVjdGlvbiB3YXMgbm90IGNsb3NlZCB5ZXQuXG4gKi9cbnZhciBBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFscmVhZHlIYXNBY3RpdmVDb25uZWN0aW9uRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIG5hbWVkIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCJcXFwiLCBiZWNhdXNlIGNvbm5lY3Rpb24gd2l0aCBzdWNoIG5hbWUgXCIgK1xuICAgICAgICAgICAgXCJhbHJlYWR5IGV4aXN0IGFuZCBpdCBub3cgaGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHNlc3Npb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEFscmVhZHlIYXNBY3RpdmVDb25uZWN0aW9uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgc2F2ZXMgdHJlZSBjaGlsZHJlbiBlbnRpdHkgYnV0IGl0cyBwYXJlbnQgaXMgbm90IHNhdmVkIHlldC5cbiovXG52YXIgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yKGVudGl0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGF0dGFjaCBlbnRpdHkgXFxcIlwiICsgZW50aXR5TmFtZSArIFwiXFxcIiB0byBpdHMgcGFyZW50LiBQbGVhc2UgbWFrZSBzdXJlIHBhcmVudCBcIiArXG4gICAgICAgICAgICBcImlzIHNhdmVkIGluIHRoZSBkYXRhYmFzZSBiZWZvcmUgc2F2aW5nIGNoaWxkcmVuIG5vZGVzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBjb25uZWN0IHdoZW4gaGUgYWxyZWFkeSBjb25uZWN0ZWQuXG4gKi9cbnZhciBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGNyZWF0ZSBhIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCJcXFwiIGNvbm5lY3Rpb24gYmVjYXVzZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBhbHJlYWR5IGVzdGFibGlzaGVkLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiB1c2VyIHRyaWVzIHRvIGNyZWF0ZSBlbnRpdHkgaWQgbWFwIGZyb20gdGhlIG1peGVkIGlkIHZhbHVlLFxuICogYnV0IGlkIHZhbHVlIGlzIGEgc2luZ2xlIHZhbHVlIHdoZW4gZW50aXR5IHJlcXVpcmVzIG11bHRpcGxlIHZhbHVlcy5cbiAqL1xudmFyIENhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcihtZXRhZGF0YSwgaWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIG9iamVjdEV4YW1wbGUgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG9iamVjdCwgY29sdW1uLCBpbmRleCkge1xuICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKG9iamVjdCwgaW5kZXggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiQ2Fubm90IHVzZSBnaXZlbiBlbnRpdHkgaWQgXFxcIlwiICsgaWQgKyBcIlxcXCIgYmVjYXVzZSBcXFwiXCIgKyBtZXRhZGF0YS50YXJnZXROYW1lICsgXCJcXFwiIGNvbnRhaW5zIG11bHRpcGxlIHByaW1hcnkgY29sdW1ucywgeW91IG11c3QgcHJvdmlkZSBvYmplY3QgaW4gZm9sbG93aW5nIGZvcm06IFwiICsgSlNPTi5zdHJpbmdpZnkob2JqZWN0RXhhbXBsZSkgKyBcIiBhcyBhbiBpZC5cIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiB1c2VyIHRyaWVzIHRvIHNhdmUvcmVtb3ZlL2V0Yy4gY29uc3RydWN0b3ItbGVzcyBvYmplY3QgKG9iamVjdCBsaXRlcmFsKSBpbnN0ZWFkIG9mIGVudGl0eS5cbiAqL1xudmFyIENhbm5vdERldGVybWluZUVudGl0eUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvcihvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IFwiICsgb3BlcmF0aW9uICsgXCIsIGdpdmVuIHZhbHVlIG11c3QgYmUgaW5zdGFuY2Ugb2YgZW50aXR5IGNsYXNzLCBcIiArXG4gICAgICAgICAgICBcImluc3RlYWQgb2JqZWN0IGxpdGVyYWwgaXMgZ2l2ZW4uIE9yIHlvdSBtdXN0IHNwZWNpZnkgYW4gZW50aXR5IHRhcmdldCB0byBtZXRob2QgY2FsbC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENhbm5vdERldGVybWluZUVudGl0eUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENhbm5vdERldGVybWluZUVudGl0eUVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdERldGVybWluZUVudGl0eUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gZXhlY3V0ZSBvcGVyYXRpb24gYWxsb3dlZCBvbmx5IGlmIGNvbm5lY3Rpb24gaXMgb3BlbmVkLlxuICovXG52YXIgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBleGVjdXRlIG9wZXJhdGlvbiBvbiBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uIGJlY2F1c2UgY29ubmVjdGlvbiBpcyBub3QgeWV0IGVzdGFibGlzaGVkLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBhY2Nlc3MgZW50aXR5IG1hbmFnZXIgYmVmb3JlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCBlbnRpdHkgbWFuYWdlciBmb3IgXFxcIlwiICsgY29ubmVjdGlvbk5hbWUgKyBcIlxcXCIgY29ubmVjdGlvbiBiZWNhdXNlIGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2Fubm90R2V0RW50aXR5TWFuYWdlck5vdENvbm5lY3RlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gT1JNIGNhbm5vdCBnZXQgbWV0aG9kIHBhcmFtZXRlcidzIHR5cGUuXG4gKiBCYXNpY2FsbHksIHdoZW4gcmVmbGVjdC1tZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlIG9yIHRzY29uZmlnIGlzIG5vdCBwcm9wZXJseSBzZXR1cC5cbiAqL1xudmFyIENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvcih0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCByZWZsZWN0ZWQgdHlwZSBmb3IgYSBcXFwiXCIgKyBtZXRob2ROYW1lICsgXCJcXFwiIG1ldGhvZCdzIHBhcmFtZXRlciBvZiBcXFwiXCIgKyB0YXJnZXQubmFtZSArIFwiXFxcIiBjbGFzcy4gXCIgK1xuICAgICAgICAgICAgXCJNYWtlIHN1cmUgeW91IGhhdmUgdHVybmVkIG9uIGFuIFxcXCJlbWl0RGVjb3JhdG9yTWV0YWRhdGFcXFwiOiB0cnVlIG9wdGlvbiBpbiB0c2NvbmZpZy5qc29uLiBcIiArXG4gICAgICAgICAgICBcIkFsc28gbWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIFxcXCJyZWZsZWN0LW1ldGFkYXRhXFxcIiBvbiB0b3Agb2YgdGhlIG1haW4gZW50cnkgZmlsZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RSZWZsZWN0TWV0aG9kUGFyYW1ldGVyVHlwZUVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjaXJjdWxhciByZWxhdGlvbnMgZGV0ZWN0ZWQgd2l0aCBudWxsYWJsZSBzZXQgdG8gZmFsc2UuXG4gKi9cbnZhciBDaXJjdWxhclJlbGF0aW9uc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDaXJjdWxhclJlbGF0aW9uc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENpcmN1bGFyUmVsYXRpb25zRXJyb3IocGF0aCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJDaXJjdWxhciByZWxhdGlvbnMgZGV0ZWN0ZWQ6IFwiICsgcGF0aCArIFwiLiBUbyByZXNvbHZlIHRoaXMgaXNzdWUgeW91IG5lZWQgdG8gXCIgK1xuICAgICAgICAgICAgXCJzZXQgbnVsbGFibGU6IHRydWUgc29tZXdoZXJlIGluIHRoaXMgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDaXJjdWxhclJlbGF0aW9uc0Vycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENpcmN1bGFyUmVsYXRpb25zRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2lyY3VsYXJSZWxhdGlvbnNFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIE9STSBjYW5ub3QgZ2V0IGNvbHVtbidzIHR5cGUgYXV0b21hdGljYWxseS5cbiAqIEJhc2ljYWxseSwgd2hlbiByZWZsZWN0LW1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUgb3IgdHNjb25maWcgaXMgbm90IHByb3Blcmx5IHNldHVwLlxuICovXG52YXIgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNvbHVtbiB0eXBlIGZvciBcIiArIG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lICsgXCIjXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIiBpcyBub3QgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGd1ZXNzZWQuIFwiICtcbiAgICAgICAgICAgIFwiTWFrZSBzdXJlIHlvdSBoYXZlIHR1cm5lZCBvbiBhbiBcXFwiZW1pdERlY29yYXRvck1ldGFkYXRhXFxcIjogdHJ1ZSBvcHRpb24gaW4gdHNjb25maWcuanNvbi4gXCIgK1xuICAgICAgICAgICAgXCJBbHNvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBpbXBvcnRlZCBcXFwicmVmbGVjdC1tZXRhZGF0YVxcXCIgb24gdG9wIG9mIHRoZSBtYWluIGVudHJ5IGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiAoYmVmb3JlIGFueSBlbnRpdHkgaW1wb3J0ZWQpLlwiICtcbiAgICAgICAgICAgIFwiSWYgeW91IGFyZSB1c2luZyBKYXZhU2NyaXB0IGluc3RlYWQgb2YgVHlwZVNjcmlwdCB5b3UgbXVzdCBleHBsaWNpdGx5IHByb3ZpZGUgYSBjb2x1bW4gdHlwZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvbHVtblR5cGVVbmRlZmluZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdXNlciB0cmllcyB0byBleGVjdXRlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBDb25uZWN0aW9uSXNOb3RTZXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29ubmVjdGlvbklzTm90U2V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGlvbklzTm90U2V0RXJyb3IoZGJUeXBlKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNvbm5lY3Rpb24gd2l0aCBcIiArIGRiVHlwZSArIFwiIGRhdGFiYXNlIGlzIG5vdCBlc3RhYmxpc2hlZC4gQ2hlY2sgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ29ubmVjdGlvbklzTm90U2V0RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbklzTm90U2V0RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbklzTm90U2V0RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBnZXQgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICovXG52YXIgQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbm5lY3Rpb25Ob3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25Ob3RGb3VuZEVycm9yKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ29ubmVjdGlvbiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb25uZWN0aW9uTm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDb25uZWN0aW9uTm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0aW9uTm90Rm91bmRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biBpZiBjdXN0b20gcmVwb3NpdG9yeSBpbmhlcml0cyBSZXBvc2l0b3J5IGNsYXNzIGhvd2V2ZXIgZW50aXR5IGlzIG5vdCBzZXQgaW4gQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIGVudGl0eSByZXBvc2l0b3J5IFwiICsgKHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHJlcG9zaXRvcnkubmFtZSA6IHJlcG9zaXRvcnkuY29uc3RydWN0b3IubmFtZSkgKyBcIiBcIiArXG4gICAgICAgICAgICBcIiBjYW5ub3QgaW5oZXJpdCBSZXBvc2l0b3J5IGNsYXNzIHdpdGhvdXQgZW50aXR5IGJlaW5nIHNldCBpbiB0aGUgQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gaWYgY3VzdG9tIHJlcG9zaXRvcmllcyB0aGF0IGV4dGVuZCBBYnN0cmFjdFJlcG9zaXRvcnkgY2xhc3NlcyBkb2VzIG5vdCBoYXZlIG1hbmFnZWQgZW50aXR5LlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIHJlcG9zaXRvcnkgXCIgKyAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gcmVwb3NpdG9yeS5uYW1lIDogcmVwb3NpdG9yeS5jb25zdHJ1Y3Rvci5uYW1lKSArIFwiIGRvZXMgbm90IGhhdmUgbWFuYWdlZCBlbnRpdHkuIFwiICtcbiAgICAgICAgICAgIFwiRGlkIHlvdSBmb3JnZXQgdG8gc3BlY2lmeSBlbnRpdHkgZm9yIGl0IEBFbnRpdHlSZXBvc2l0b3J5KE15RW50aXR5KT8gXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biBpZiBjdXN0b20gcmVwb3NpdG9yeSB3YXMgbm90IGZvdW5kLlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIHJlcG9zaXRvcnkgXCIgKyAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gcmVwb3NpdG9yeS5uYW1lIDogcmVwb3NpdG9yeS5jb25zdHJ1Y3Rvci5uYW1lKSArIFwiIHdhcyBub3QgZm91bmQuIFwiICtcbiAgICAgICAgICAgIFwiRGlkIHlvdSBmb3Jnb3QgdG8gcHV0IEBFbnRpdHlSZXBvc2l0b3J5IGRlY29yYXRvciBvbiBpdD9cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBEYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3IoY29sdW1uLCBkYXRhVHlwZSwgZGF0YWJhc2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgPyBkYXRhVHlwZSA6IGRhdGFUeXBlLm5hbWU7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIkRhdGEgdHlwZSBcXFwiXCIgKyB0eXBlICsgXCJcXFwiIGluIFxcXCJcIiArIGNvbHVtbi5lbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlOYW1lICsgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXFxcIlwiICsgZGF0YWJhc2UgKyBcIlxcXCIgZGF0YWJhc2UuXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIERhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIGlmIHNvbWUgcmVxdWlyZWQgZHJpdmVyJ3Mgb3B0aW9uIGlzIG5vdCBzZXQuXG4gKi9cbnZhciBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRHJpdmVyT3B0aW9uTm90U2V0RXJyb3Iob3B0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJEcml2ZXIgb3B0aW9uIChcIiArIG9wdGlvbk5hbWUgKyBcIikgaXMgbm90IHNldC4gXCIgK1xuICAgICAgICAgICAgXCJQbGVhc2Ugc2V0IGl0IHRvIHBlcmZvcm0gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcXVpcmVkIGRyaXZlcidzIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xudmFyIERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvcihkcml2ZXJOYW1lLCBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZHJpdmVyTmFtZSArIFwiIHBhY2thZ2UgaGFzIG5vdCBiZWVuIGZvdW5kIGluc3RhbGxlZC4gXCIgK1xuICAgICAgICAgICAgKFwiVHJ5IHRvIGluc3RhbGwgaXQ6IG5wbSBpbnN0YWxsIFwiICsgcGFja2FnZU5hbWUgKyBcIiAtLXNhdmVcIikpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgRW50aXR5Q29sdW1uTm90Rm91bmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eUNvbHVtbk5vdEZvdW5kLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVudGl0eUNvbHVtbk5vdEZvdW5kKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJObyBlbnRpdHkgY29sdW1uIFxcXCJcIiArIHByb3BlcnR5UGF0aCArIFwiXFxcIiB3YXMgZm91bmQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlDb2x1bW5Ob3RGb3VuZDtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlDb2x1bW5Ob3RGb3VuZC5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IodGFyZ2V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIk5vIG1ldGFkYXRhIGZvciBcXFwiXCIgKyBfdGhpcy5zdHJpbmdpZnlUYXJnZXQodGFyZ2V0KSArIFwiXFxcIiB3YXMgZm91bmQuXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgXCJuYW1lXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG5vIHJlc3VsdCBjb3VsZCBiZSBmb3VuZCBpbiBtZXRob2RzIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byByZXR1cm4gdW5kZWZpbmVkIG9yIGFuIGVtcHR5IHNldC5cbiAqL1xudmFyIEVudGl0eU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eU5vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW50aXR5Tm90Rm91bmRFcnJvcihlbnRpdHlDbGFzcywgY3JpdGVyaWEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiQ291bGQgbm90IGZpbmQgYW55IGVudGl0eSBvZiB0eXBlIFxcXCJcIiArIF90aGlzLnN0cmluZ2lmeVRhcmdldChlbnRpdHlDbGFzcykgKyBcIlxcXCIgXCIgK1xuICAgICAgICAgICAgKFwibWF0Y2hpbmc6IFwiICsgX3RoaXMuc3RyaW5naWZ5Q3JpdGVyaWEoY3JpdGVyaWEpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFbnRpdHlOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgXCJuYW1lXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnRpdHlOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlDcml0ZXJpYSA9IGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNyaXRlcmlhLCBudWxsLCA0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgICAgIHJldHVybiBcIlwiICsgY3JpdGVyaWE7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5Tm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiByZWxhdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBmaW5kIG9wdGlvbnMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGVudGl0aWVzLlxuKi9cbnZhciBGaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3Iobm90Rm91bmRSZWxhdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgaWYgKG5vdEZvdW5kUmVsYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiUmVsYXRpb24gXFxcIlwiICsgbm90Rm91bmRSZWxhdGlvbnNbMF0gKyBcIlxcXCIgd2FzIG5vdCBmb3VuZDsgcGxlYXNlIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3QgYW5kIHJlYWxseSBleGlzdHMgaW4geW91ciBlbnRpdHkuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJSZWxhdGlvbnMgXCIgKyBub3RGb3VuZFJlbGF0aW9ucy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiBcIlxcXCJcIiArIHJlbGF0aW9uICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKSArIFwiIHdlcmUgbm90IGZvdW5kOyBwbGVhc2UgY2hlY2sgaWYgcmVsYXRpb25zIGFyZSBjb3JyZWN0IGFuZCB0aGV5IGV4aXN0IGluIHlvdXIgZW50aXRpZXMuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiByZWxhdGlvbiBoYXMgYXJyYXkgaW5pdGlhbGl6ZWQgd2hpY2ggaXMgZm9yYmlkZGVuIG15IE9STS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlb3JtL3R5cGVvcm0vaXNzdWVzLzEzMTlcbiAqIEBzZWUgaHR0cDovL3R5cGVvcm0uaW8vIy9yZWxhdGlvbnMtZmFxL2F2b2lkLXJlbGF0aW9uLXByb3BlcnR5LWluaXRpYWxpemVyc1xuICovXG52YXIgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbml0aWFsaXplZFJlbGF0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yKHJlbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkFycmF5IGluaXRpYWxpemF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gZW50aXR5IHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgKFwiUGxlYXNlIHJlbW92ZSBhcnJheSBpbml0aWFsaXphdGlvbiAoPSBbXSkgZnJvbSBcXFwiXCIgKyByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIuIFwiKSArXG4gICAgICAgICAgICBcIlRoaXMgaXMgT1JNIHJlcXVpcmVtZW50IHRvIG1ha2UgcmVsYXRpb25zIHRvIHdvcmsgcHJvcGVybHkuIFJlZmVyIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbml0aWFsaXplZFJlbGF0aW9uRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluaXRpYWxpemVkUmVsYXRpb25FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IHVzaW5nIFF1ZXJ5QnVpbGRlciBidXQgZG8gbm90IHNwZWNpZnkgd2hhdCB0byBpbnNlcnQuXG4gKi9cbnZhciBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluc2VydFZhbHVlc01pc3NpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBwZXJmb3JtIGluc2VydCBxdWVyeSBiZWNhdXNlIHZhbHVlcyBhcmUgbm90IGRlZmluZWQuIFwiICtcbiAgICAgICAgICAgIFwiQ2FsbCBcXFwicWIudmFsdWVzKC4uLilcXFwiIG1ldGhvZCB0byBzcGVjaWZ5IGluc2VydGVkIHZhbHVlcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEluc2VydFZhbHVlc01pc3NpbmdFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdXNlciB0cmllcyB0byBidWlsZCBhbiBVUERBVEUgcXVlcnkgd2l0aCBMSU1JVCBidXQgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4qL1xudmFyIExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiWW91ciBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IExJTUlUIG9uIFVQREFURSBzdGF0ZW1lbnRzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBzZWxlY3RlZCBzcWwgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnRzIGxvY2tpbmcuXG4gKi9cbnZhciBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiBnaXZlbiBkcml2ZXIuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yKG1ldGFkYXRhVHlwZSwgY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbWV0YWRhdGFUeXBlICsgXCIgbWV0YWRhdGEgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBcIiArIEpTT04uc3RyaW5naWZ5KGNvbnN0cnVjdG9yKSArXG4gICAgICAgICAgICAocHJvcGVydHlOYW1lID8gXCIgb24gcHJvcGVydHkgXCIgKyBwcm9wZXJ0eU5hbWUgOiBcIi4gSWYgeW91IHByZXZpb3VzbHkgcmVuYW1lZCBvciBtb3ZlZCBlbnRpdHkgY2xhc3MsIG1ha2Ugc3VyZVwiICtcbiAgICAgICAgICAgICAgICBcIiB0aGF0IGNvbXBpbGVkIHZlcnNpb24gb2Ygb2xkIGVudGl0eSBjbGFzcyBzb3VyY2Ugd2Fzbid0IGxlZnQgaW4gdGhlIGNvbXBpbGVyIG91dHB1dCBkaXJlY3RvcnkuXCIpKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1ldGFkYXRhV2l0aFN1Y2hOYW1lQWxyZWFkeUV4aXN0c0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNZXRhZGF0YVdpdGhTdWNoTmFtZUFscmVhZHlFeGlzdHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNZXRhZGF0YVdpdGhTdWNoTmFtZUFscmVhZHlFeGlzdHNFcnJvcihtZXRhZGF0YVR5cGUsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG1ldGFkYXRhVHlwZSArIFwiIG1ldGFkYXRhIHdpdGggc3VjaCBuYW1lIFwiICsgbmFtZSArIFwiIGFscmVhZHkgZXhpc3RzLiBcIiArXG4gICAgICAgICAgICBcIkRvIHlvdSBhcHBseSBkZWNvcmF0b3IgdHdpY2U/IE9yIG1heWJlIHRyeSB0byBjaGFuZ2UgYSBuYW1lP1wiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0RlbGV0ZURhdGVDb2x1bW5FcnJvcihlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJFbnRpdHkgXFxcIlwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiXFxcIiBkb2VzIG5vdCBoYXZlIGRlbGV0ZSBkYXRlIGNvbHVtbnMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ0RlbGV0ZURhdGVDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHNwZWNpZmllcyBkcml2ZXIgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0IG9yIHN1cHBvcnRlZC5cbiAqL1xudmFyIE1pc3NpbmdEcml2ZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0RyaXZlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdEcml2ZXJFcnJvcihkcml2ZXJUeXBlLCBhdmFpbGFibGVEcml2ZXJzKSB7XG4gICAgICAgIGlmIChhdmFpbGFibGVEcml2ZXJzID09PSB2b2lkIDApIHsgYXZhaWxhYmxlRHJpdmVycyA9IFtdOyB9XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIldyb25nIGRyaXZlcjogXFxcIlwiICsgZHJpdmVyVHlwZSArIFwiXFxcIiBnaXZlbi4gU3VwcG9ydGVkIGRyaXZlcnMgYXJlOiBcIiArXG4gICAgICAgICAgICAoYXZhaWxhYmxlRHJpdmVycy5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIFwiXFxcIlwiICsgZCArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIi5cIikpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nRHJpdmVyRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0RyaXZlckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pc3NpbmdEcml2ZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgTWlzc2luZ0pvaW5Db2x1bW5FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0pvaW5Db2x1bW5FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nSm9pbkNvbHVtbkVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uKSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJKb2luQ29sdW1uIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArXG4gICAgICAgICAgICAgICAgKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAuIFwiKSArXG4gICAgICAgICAgICAgICAgXCJZb3UgbmVlZCB0byBwdXQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb24gb25lIG9mIHRoZSBzaWRlcy5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIkpvaW5Db2x1bW4gaXMgbWlzc2luZyBvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIG9uZS10by1vbmUgcmVsYXRpb25zaGlwLiBcIiArXG4gICAgICAgICAgICAgICAgXCJZb3UgbmVlZCB0byBwdXQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb24gaXQuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0pvaW5Db2x1bW5FcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nSm9pbkNvbHVtbkVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pc3NpbmdKb2luQ29sdW1uRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1pc3NpbmdKb2luVGFibGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0pvaW5UYWJsZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdKb2luVGFibGVFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbikge1xuICAgICAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiSm9pblRhYmxlIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArXG4gICAgICAgICAgICAgICAgKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcC4gXCIpICtcbiAgICAgICAgICAgICAgICBcIllvdSBuZWVkIHRvIHB1dCBkZWNvcmF0b3IgZGVjb3JhdG9yIG9uIG9uZSBvZiB0aGUgc2lkZXMuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJKb2luVGFibGUgaXMgbWlzc2luZyBvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdSBuZWVkIHRvIHB1dCBKb2luVGFibGUgZGVjb3JhdG9yIG9uIGl0LlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdKb2luVGFibGVFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nSm9pblRhYmxlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ0pvaW5UYWJsZUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiRW50aXR5IFxcXCJcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkgY29sdW1uLiBQcmltYXJ5IGNvbHVtbiBpcyByZXF1aXJlZCB0byBcIiArXG4gICAgICAgICAgICBcImhhdmUgaW4gYWxsIHlvdXIgZW50aXRpZXMuIFVzZSBAUHJpbWFyeUNvbHVtbiBkZWNvcmF0b3IgdG8gYWRkIGEgcHJpbWFyeSBjb2x1bW4gdG8geW91ciBlbnRpdHkuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ1ByaW1hcnlDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG1ldGhvZCBleHBlY3RzIGVudGl0eSBidXQgaW5zdGVhZCBzb21ldGhpbmcgZWxzZSBpcyBnaXZlbi5cbiAqL1xudmFyIE11c3RCZUVudGl0eUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNdXN0QmVFbnRpdHlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNdXN0QmVFbnRpdHlFcnJvcihvcGVyYXRpb24sIHdyb25nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IFwiICsgb3BlcmF0aW9uICsgXCIsIGdpdmVuIHZhbHVlIG11c3QgYmUgYW4gZW50aXR5LCBpbnN0ZWFkIFxcXCJcIiArIHdyb25nVmFsdWUgKyBcIlxcXCIgaXMgZ2l2ZW4uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNdXN0QmVFbnRpdHlFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNdXN0QmVFbnRpdHlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdXN0QmVFbnRpdHlFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHRyaWVzIHRvIHVzZSBuYW1pbmcgc3RyYXRlZ3kgdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqL1xudmFyIE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmFtaW5nU3RyYXRlZ3lOb3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvcihzdHJhdGVneU5hbWUsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciBuYW1lID0gc3RyYXRlZ3lOYW1lIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBzdHJhdGVneU5hbWUubmFtZSA6IHN0cmF0ZWd5TmFtZTtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiTmFtaW5nIHN0cmF0ZWd5IFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZC4gTG9va3MgbGlrZSB0aGlzIG5hbWluZyBzdHJhdGVneSBkb2VzIG5vdCBcIiArXG4gICAgICAgICAgICAoXCJleGlzdCBvciBpdCB3YXMgbm90IHJlZ2lzdGVyZWQgaW4gY3VycmVudCBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uP1wiKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTmFtaW5nU3RyYXRlZ3lOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYW1pbmdTdHJhdGVneU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiTmVzdGVkIHNldHMgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgcm9vdCBlbnRpdGllcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gYWNjZXNzIHJlcG9zaXRvcnkgYmVmb3JlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBOb0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5vQ29ubmVjdGlvbkZvclJlcG9zaXRvcnlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCBhIFJlcG9zaXRvcnkgZm9yIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCIgY29ubmVjdGlvbiwgYmVjYXVzZSBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlIFwiICtcbiAgICAgICAgICAgIFwiaXMgbm90IGVzdGFibGlzaGVkIHlldC4gQ2FsbCBjb25uZWN0aW9uI2Nvbm5lY3QgbWV0aG9kIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTm9Db25uZWN0aW9uRm9yUmVwb3NpdG9yeUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5vQ29ubmVjdGlvbkZvclJlcG9zaXRvcnlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBzb21lIG9wdGlvbiBpcyBub3Qgc2V0IGluIHRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKi9cbnZhciBOb0Nvbm5lY3Rpb25PcHRpb25FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9Db25uZWN0aW9uT3B0aW9uRXJyb3Iob3B0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJPcHRpb24gXFxcIlwiICsgb3B0aW9uTmFtZSArIFwiXFxcIiBpcyBub3Qgc2V0IGluIHlvdXIgY29ubmVjdGlvbiBvcHRpb25zLCBwbGVhc2UgXCIgK1xuICAgICAgICAgICAgKFwiZGVmaW5lIFxcXCJcIiArIG9wdGlvbk5hbWUgKyBcIlxcXCIgb3B0aW9uIGluIHlvdXIgY29ubmVjdGlvbiBvcHRpb25zIG9yIG9ybWNvbmZpZy5qc29uXCIpKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTm9Db25uZWN0aW9uT3B0aW9uRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9Db25uZWN0aW9uT3B0aW9uRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byByZWxlYXNlIGVudGl0eSBtYW5hZ2VyIHRoYXQgZG9lcyBub3QgdXNlIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJFbnRpdHkgbWFuYWdlciBpcyBub3QgdXNpbmcgc2luZ2xlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNhbm5vdCBiZSByZWxlYXNlZC4gXCIgK1xuICAgICAgICAgICAgXCJPbmx5IGVudGl0eSBtYW5hZ2VycyBjcmVhdGVkIGJ5IGNvbm5lY3Rpb24jY3JlYXRlRW50aXR5TWFuYWdlcldpdGhTaW5nbGVEYXRhYmFzZUNvbm5lY3Rpb24gXCIgK1xuICAgICAgICAgICAgXCJtZXRob2RzIGhhdmUgYSBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgdGhleSBzaG91bGQgYmUgcmVsZWFzZWQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGFuIGVudGl0eSBkb2VzIG5vdCBoYXZlIG5vIHZlcnNpb24gYW5kIG5vIHVwZGF0ZSBkYXRlIGNvbHVtbi5cbiAqL1xudmFyIE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvcihlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiRW50aXR5IFwiICsgZW50aXR5ICsgXCIgZG9lcyBub3QgaGF2ZSB2ZXJzaW9uIG9yIHVwZGF0ZSBkYXRlIGNvbHVtbnMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gYnVpbGQgU0VMRUNUIHF1ZXJ5IHVzaW5nIE9GRlNFVCB3aXRob3V0IExJTUlUIGFwcGxpZWQgYnV0IGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4qL1xudmFyIE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiUkRCTVMgZG9lcyBub3Qgc3VwcG9ydCBPRkZTRVQgd2l0aG91dCBMSU1JVCBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4gWW91IG11c3QgdXNlIGxpbWl0IGluIFwiICtcbiAgICAgICAgICAgIFwiY29uanVuY3Rpb24gd2l0aCBvZmZzZXQgZnVuY3Rpb24gKG9yIHRha2UgaW4gY29uanVuY3Rpb24gd2l0aCBza2lwIGZ1bmN0aW9uIGlmIHlvdSBhcmUgXCIgK1xuICAgICAgICAgICAgXCJ1c2luZyBwYWdpbmF0aW9uKS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gYW4gb3B0aW1pc3RpYyBsb2NrIGNhbm5vdCBiZSB1c2VkIGluIHF1ZXJ5IGJ1aWxkZXIuXG4gKi9cbnZhciBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRoZSBvcHRpbWlzdGljIGxvY2sgY2FuIGJlIHVzZWQgb25seSB3aXRoIGdldE9uZSgpIG1ldGhvZC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gYSB2ZXJzaW9uIGNoZWNrIG9uIGFuIG9iamVjdCB0aGF0IHVzZXMgb3B0aW1pc3RpYyBsb2NraW5nIHRocm91Z2ggYSB2ZXJzaW9uIGZpZWxkIGZhaWxzLlxuICovXG52YXIgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yKGVudGl0eSwgZXhwZWN0ZWRWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRoZSBvcHRpbWlzdGljIGxvY2sgb24gZW50aXR5IFwiICsgZW50aXR5ICsgXCIgZmFpbGVkLCB2ZXJzaW9uIFwiICsgZXhwZWN0ZWRWZXJzaW9uICsgXCIgd2FzIGV4cGVjdGVkLCBidXQgaXMgYWN0dWFsbHkgXCIgKyBhY3R1YWxWZXJzaW9uICsgXCIuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biAuIFRoZW9yZXRpY2FsbHkgY2FuJ3QgYmUgdGhyb3duLlxuICovXG52YXIgUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJJbnRlcm5hbCBlcnJvci4gUGVyc2lzdGVkIGVudGl0eSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIHByZXBhcmVkIG9wZXJhdGVkIGVudGl0aWVzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBQZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBlcnNpc3RlZEVudGl0eU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHRyYW5zYWN0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24sIGJ1dCB0aGVyZSBpcyBub25lIG9wZW4uXG4gKi9cbnZhciBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBlc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkFuIG9wZW4gdHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgZm9yIHBlc3NpbWlzdGljIGxvY2suXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBlc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlByaW1hcnkgY29sdW1uIFwiICsgb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgKyBcIiNcIiArIHByb3BlcnR5TmFtZSArIFwiIGNhbm5vdCBiZSBudWxsYWJsZS4gXCIgK1xuICAgICAgICAgICAgXCJJdHMgbm90IGFsbG93ZWQgZm9yIHByaW1hcnkga2V5cy4gVHJ5IHRvIHJlbW92ZSBudWxsYWJsZSBvcHRpb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMsIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHF1ZXJ5IGV4ZWN1dGlvbiBoYXMgZmFpbGVkLlxuKi9cbnZhciBRdWVyeUZhaWxlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWVyeUZhaWxlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGRyaXZlckVycm9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRyaXZlckVycm9yLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eZXJyb3I6IC8sIFwiXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXkVycm9yOiAvLCBcIlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15SZXF1ZXN0LywgXCJcIikpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIF90aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBfdGhpcy5kcml2ZXJFcnJvciA9IGRyaXZlckVycm9yO1xuICAgICAgICBpZiAoZHJpdmVyRXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBfID0gZHJpdmVyRXJyb3IubmFtZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgb3RoZXJQcm9wZXJ0aWVzID0gX19yZXN0KGRyaXZlckVycm9yLCBbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbihfdGhpcywgX19hc3NpZ24oe30sIG90aGVyUHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5RmFpbGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUZhaWxlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlF1ZXJ5IHJ1bm5lciBhbHJlYWR5IHJlbGVhc2VkLiBDYW5ub3QgcnVuIHF1ZXJpZXMgYW55bW9yZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gdXNlIHF1ZXJ5IHJ1bm5lciBmcm9tIHF1ZXJ5IHJ1bm5lciBwcm92aWRlciBhZnRlciBpdCB3YXMgcmVsZWFzZWQuXG4gKi9cbnZhciBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvdmlkZWQgYnkgYSBxdWVyeSBydW5uZXIgd2FzIGFscmVhZHkgXCIgK1xuICAgICAgICAgICAgXCJyZWxlYXNlZCwgY2Fubm90IGNvbnRpbnVlIHRvIHVzZSBpdHMgcXVlcnlpbmcgbWV0aG9kcyBhbnltb3JlLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBub3QgZm91bmQuXG4gKi9cbnZhciBSZXBvc2l0b3J5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IoY29ubmVjdGlvbk5hbWUsIGVudGl0eUNsYXNzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciB0YXJnZXROYW1lO1xuICAgICAgICBpZiAoZW50aXR5Q2xhc3MgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcy5vcHRpb25zLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVudGl0eUNsYXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbnRpdHlDbGFzcyA9PT0gXCJvYmplY3RcIiAmJiBcIm5hbWVcIiBpbiBlbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXROYW1lID0gZW50aXR5Q2xhc3M7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiTm8gcmVwb3NpdG9yeSBmb3IgXFxcIlwiICsgdGFyZ2V0TmFtZSArIFwiXFxcIiB3YXMgZm91bmQuIExvb2tzIGxpa2UgdGhpcyBlbnRpdHkgaXMgbm90IHJlZ2lzdGVyZWQgaW4gXCIgK1xuICAgICAgICAgICAgKFwiY3VycmVudCBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uP1wiKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBub3QgZm91bmQuXG4gKi9cbnZhciBSZXBvc2l0b3J5Tm90VHJlZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXBvc2l0b3J5Tm90VHJlZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlcG9zaXRvcnlOb3RUcmVlRXJyb3IoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIHRhcmdldE5hbWU7XG4gICAgICAgIGlmIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm9wdGlvbnMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZW50aXR5Q2xhc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVudGl0eUNsYXNzID09PSBcIm9iamVjdFwiICYmIFwibmFtZVwiIGluIGVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICB0YXJnZXROYW1lID0gZW50aXR5Q2xhc3MubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcztcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJSZXBvc2l0b3J5IG9mIHRoZSBcXFwiXCIgKyB0YXJnZXROYW1lICsgXCJcXFwiIGNsYXNzIGlzIG5vdCBhIFRyZWVSZXBvc2l0b3J5LiBUcnkgdG8gYXBwbHkgQFRyZWUgZGVjb3JhdG9yIG9uIHlvdXIgZW50aXR5LlwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZXBvc2l0b3J5Tm90VHJlZUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFJlcG9zaXRvcnlOb3RUcmVlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwb3NpdG9yeU5vdFRyZWVFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gYnVpbGQgYSBxdWVyeSB3aXRoIFJFVFVSTklORyAvIE9VVFBVVCBzdGF0ZW1lbnQsXG4gKiBidXQgdXNlZCBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuICovXG52YXIgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJPVVRQVVQgb3IgUkVUVVJOSU5HIGNsYXVzZSBvbmx5IHN1cHBvcnRlZCBieSBNaWNyb3NvZnQgU1FMIFNlcnZlciBvciBQb3N0Z3JlU1FMIGRhdGFiYXNlcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gc2FtZSBvYmplY3QgaXMgc2NoZWR1bGVkIGZvciByZW1vdmUgYW5kIHVwZGF0aW9uIGF0IHRoZSBzYW1lIHRpbWUuXG4gKi9cbnZhciBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3Ioc3ViamVjdCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJSZW1vdmVkIGVudGl0eSBcXFwiXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgaXMgYWxzbyBzY2hlZHVsZWQgZm9yIHVwZGF0ZSBvcGVyYXRpb24uIFwiICtcbiAgICAgICAgICAgIFwiTWFrZSBzdXJlIHlvdSBhcmUgbm90IHVwZGF0aW5nIGFuZCByZW1vdmluZyBzYW1lIG9iamVjdCAobm90ZSB0aGF0IHVwZGF0ZSBvciByZW1vdmUgbWF5IGJlIGV4ZWN1dGVkIGJ5IGNhc2NhZGUgb3BlcmF0aW9ucykuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG9wZXJhdGlvbiBpcyBnb2luZyB0byBiZSBleGVjdXRlZCBvbiBhIHN1YmplY3Qgd2l0aG91dCBpZGVudGlmaWVyLlxuICogVGhpcyBlcnJvciBzaG91bGQgbmV2ZXIgYmUgdGhyb3duLCBob3dldmVyIGl0IHN0aWxsIHByZXNlbnRzIHRvIHByZXZlbnQgdXNlciBmcm9tIHVwZGF0aW9uIG9yIHJlbW92aW5nIHRoZSB3aG9sZSB0YWJsZS5cbiAqIElmIHRoaXMgZXJyb3Igb2NjdXJzIHN0aWxsLCBpdCBtb3N0IHByb2JhYmx5IGlzIGFuIE9STSBpbnRlcm5hbCBwcm9ibGVtIHdoaWNoIG11c3QgYmUgcmVwb3J0ZWQgYW5kIGZpeGVkLlxuICovXG52YXIgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiSW50ZXJuYWwgZXJyb3IuIFN1YmplY3QgXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiBtdXN0IGhhdmUgYW4gaWRlbnRpZmllciB0byBwZXJmb3JtIG9wZXJhdGlvbi5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBzdGFydGVkIGFuZCB1c2VyIHRyaWVzIHRvIHJ1biBpdCBhZ2Fpbi5cbiAqL1xudmFyIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVHJhbnNhY3Rpb24gYWxyZWFkeSBzdGFydGVkIGZvciB0aGUgZ2l2ZW4gY29ubmVjdGlvbiwgY29tbWl0IGN1cnJlbnQgdHJhbnNhY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQgeWV0IGFuZCB1c2VyIHRyaWVzIHRvIHJ1biBjb21taXQgb3Igcm9sbGJhY2suXG4gKi9cbnZhciBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRyYW5zYWN0aW9uIGlzIG5vdCBzdGFydGVkIHlldCwgc3RhcnQgdHJhbnNhY3Rpb24gYmVmb3JlIGNvbW1pdHRpbmcgb3Igcm9sbGluZyBpdCBiYWNrLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvcihkcml2ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVHJlZSByZXBvc2l0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gXCIgKyBkcml2ZXIub3B0aW9ucy50eXBlICsgXCIgZHJpdmVyLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBUcmVlUmVwb3NpdG9yeU5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbnZhciBUeXBlT1JNRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFR5cGVPUk1FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUeXBlT1JNRXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIC8vIHJlc3RvcmUgcHJvdG90eXBlIGNoYWluIGJlY2F1c2UgdGhlIGJhc2UgYEVycm9yYCB0eXBlXG4gICAgICAgIC8vIHdpbGwgYnJlYWsgdGhlIHByb3RvdHlwZSBjaGFpbiBhIGxpdHRsZVxuICAgICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IF9uZXdUYXJnZXQucHJvdG90eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFR5cGVPUk1FcnJvci5wcm90b3R5cGUsIFwibmFtZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBUeXBlT1JNRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBUeXBlT1JNRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHlwZU9STUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBwZXJmb3JtIHVwZGF0ZSBxdWVyeSBiZWNhdXNlIHVwZGF0ZSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkLiBDYWxsIFxcXCJxYi5zZXQoLi4uKVxcXCIgbWV0aG9kIHRvIHNwZWNpZnkgdXBkYXRlZCB2YWx1ZXMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbikge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJVc2luZyBKb2luQ29sdW1uIG9uIFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgaXMgd3JvbmcuIFwiICtcbiAgICAgICAgICAgIFwiWW91IGNhbiB1c2UgSm9pbkNvbHVtbiBvbmx5IG9uIG9uZS10by1vbmUgYW5kIG1hbnktdG8tb25lIHJlbGF0aW9ucy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlVzaW5nIEpvaW5Db2x1bW4gaXMgYWxsb3dlZCBvbmx5IG9uIG9uZSBzaWRlIG9mIHRoZSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcC4gXCIgK1xuICAgICAgICAgICAgKFwiQm90aCBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgIFwiaGFzIEpvaW5UYWJsZSBkZWNvcmF0b3JzLiBDaG9vc2Ugb25lIG9mIHRoZW0gYW5kIGxlZnQgSm9pblRhYmxlIGRlY29yYXRvciBvbmx5IG9uIGl0LlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVXNpbmdKb2luQ29sdW1uT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVXNpbmcgSm9pblRhYmxlIG9uIFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgaXMgd3JvbmcuIFwiICtcbiAgICAgICAgICAgIChlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIiBoYXMgXCIgKyByZWxhdGlvbi5yZWxhdGlvblR5cGUgKyBcIiByZWxhdGlvbiwgXCIpICtcbiAgICAgICAgICAgIFwiaG93ZXZlciB5b3UgY2FuIHVzZSBKb2luVGFibGUgb25seSBvbiBtYW55LXRvLW1hbnkgcmVsYXRpb25zLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVXNpbmcgSm9pblRhYmxlIGlzIGFsbG93ZWQgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcC4gXCIgK1xuICAgICAgICAgICAgKFwiQm90aCBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgIFwiaGFzIEpvaW5UYWJsZSBkZWNvcmF0b3JzLiBDaG9vc2Ugb25lIG9mIHRoZW0gYW5kIGxlZnQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb25seSBvbiBpdC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5UYWJsZU9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nvbm5lY3Rpb25Jc05vdFNldEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9DYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NZXRhZGF0YUFscmVhZHlFeGlzdHNFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90RGV0ZXJtaW5lRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1VwZGF0ZVZhbHVlc01pc3NpbmdFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0VudGl0eU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0VudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTXVzdEJlRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL09wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1F1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0N1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ob0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0NpcmN1bGFyUmVsYXRpb25zRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Vc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nSm9pbkNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9FbnRpdHlDb2x1bW5Ob3RGb3VuZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTWlzc2luZ0RyaXZlckVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL05vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL01ldGFkYXRhV2l0aFN1Y2hOYW1lQWxyZWFkeUV4aXN0c0Vycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9zaXRvcnlOb3RGb3VuZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9OYW1pbmdTdHJhdGVneU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Blc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmVwb3NpdG9yeU5vdFRyZWVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nSm9pblRhYmxlRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL05vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luQ29sdW1uT25seU9uT25lU2lkZUFsbG93ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0NvbHVtblR5cGVVbmRlZmluZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTm9Db25uZWN0aW9uT3B0aW9uRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZENvbmRpdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbmRNYW55T3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZE9uZU9wdGlvbnMuanMubWFwXG4iLCIvKipcbiAqIEZpbmQgT3BlcmF0b3IgdXNlZCBpbiBGaW5kIENvbmRpdGlvbnMuXG4gKi9cbnZhciBGaW5kT3BlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEZpbmRPcGVyYXRvcih0eXBlLCB2YWx1ZSwgdXNlUGFyYW1ldGVyLCBtdWx0aXBsZVBhcmFtZXRlcnMsIGdldFNxbCwgb2JqZWN0TGl0ZXJhbFBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHVzZVBhcmFtZXRlciA9PT0gdm9pZCAwKSB7IHVzZVBhcmFtZXRlciA9IHRydWU7IH1cbiAgICAgICAgaWYgKG11bHRpcGxlUGFyYW1ldGVycyA9PT0gdm9pZCAwKSB7IG11bHRpcGxlUGFyYW1ldGVycyA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91c2VQYXJhbWV0ZXIgPSB1c2VQYXJhbWV0ZXI7XG4gICAgICAgIHRoaXMuX211bHRpcGxlUGFyYW1ldGVycyA9IG11bHRpcGxlUGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fZ2V0U3FsID0gZ2V0U3FsO1xuICAgICAgICB0aGlzLl9vYmplY3RMaXRlcmFsUGFyYW1ldGVycyA9IG9iamVjdExpdGVyYWxQYXJhbWV0ZXJzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJ1c2VQYXJhbWV0ZXJcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcGFyYW1ldGVyIGlzIHVzZWQgb3Igbm90IGZvciB0aGlzIG9wZXJhdG9yLlxuICAgICAgICAgKiBFeHRyYWN0cyBmaW5hbCB2YWx1ZSBpZiB2YWx1ZSBpcyBhbm90aGVyIGZpbmQgb3BlcmF0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudXNlUGFyYW1ldGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVBhcmFtZXRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kT3BlcmF0b3IucHJvdG90eXBlLCBcIm11bHRpcGxlUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgcGFyYW1ldGVycyBtdXN0IGJlIHVzZWQgZm9yIHRoaXMgb3BlcmF0b3IuXG4gICAgICAgICAqIEV4dHJhY3RzIGZpbmFsIHZhbHVlIGlmIHZhbHVlIGlzIGFub3RoZXIgZmluZCBvcGVyYXRvci5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5tdWx0aXBsZVBhcmFtZXRlcnM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGVQYXJhbWV0ZXJzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRPcGVyYXRvci5wcm90b3R5cGUsIFwidHlwZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBUeXBlIG9mIHRoaXMgRmluZE9wZXJhdG9yXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRPcGVyYXRvci5wcm90b3R5cGUsIFwidmFsdWVcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgZmluYWwgdmFsdWUgbmVlZHMgdG8gYmUgdXNlZCBhcyBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJvYmplY3RMaXRlcmFsUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIE9iamVjdExpdGVyYWwgcGFyYW1ldGVycy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5vYmplY3RMaXRlcmFsUGFyYW1ldGVycztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RMaXRlcmFsUGFyYW1ldGVycztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kT3BlcmF0b3IucHJvdG90eXBlLCBcImNoaWxkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGNoaWxkIEZpbmRPcGVyYXRvciBpZiBpdCBleGlzdHNcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJnZXRTcWxcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgU1FMIGdlbmVyYXRvclxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBGaW5kT3BlcmF0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmdldFNxbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTcWw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gRmluZE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCB7IEZpbmRPcGVyYXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5kT3BlcmF0b3IuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbmRPcGVyYXRvclR5cGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXksIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9GaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vZHJpdmVyL0RyaXZlclV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogVXRpbGl0aWVzIHRvIHdvcmsgd2l0aCBGaW5kT3B0aW9ucy5cbiAqL1xudmFyIEZpbmRPcHRpb25zVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmluZE9wdGlvbnNVdGlscygpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gb2JqZWN0IGlzIHJlYWxseSBpbnN0YW5jZSBvZiBGaW5kT25lT3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRPbmVPcHRpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgcG9zc2libGVPcHRpb25zID0gb2JqO1xuICAgICAgICByZXR1cm4gcG9zc2libGVPcHRpb25zICYmXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheShwb3NzaWJsZU9wdGlvbnMuc2VsZWN0KSB8fFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3B0aW9ucy53aGVyZSBpbnN0YW5jZW9mIE9iamVjdCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMud2hlcmUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBvc3NpYmxlT3B0aW9ucy5yZWxhdGlvbnMpIHx8XG4gICAgICAgICAgICAgICAgcG9zc2libGVPcHRpb25zLmpvaW4gaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMub3JkZXIgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMuY2FjaGUgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmNhY2hlID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMuY2FjaGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMubG9jayBpbnN0YW5jZW9mIE9iamVjdCB8fFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmxvYWRSZWxhdGlvbklkcyA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLndpdGhEZWxldGVkID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMudHJhbnNhY3Rpb24gPT09IFwiYm9vbGVhblwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiBvYmplY3QgaXMgcmVhbGx5IGluc3RhbmNlIG9mIEZpbmRNYW55T3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgdmFyIHBvc3NpYmxlT3B0aW9ucyA9IG9iajtcbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlT3B0aW9ucyAmJiAodGhpcy5pc0ZpbmRPbmVPcHRpb25zKHBvc3NpYmxlT3B0aW9ucykgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMuc2tpcCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlT3B0aW9ucy50YWtlID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLnNraXAgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMudGFrZSA9PT0gXCJzdHJpbmdcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gb2JqZWN0IGlzIHJlYWxseSBpbnN0YW5jZSBvZiBGaW5kT3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5leHRyYWN0RmluZE1hbnlPcHRpb25zQWxpYXMgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9iamVjdCkgJiYgb2JqZWN0LmpvaW4pXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0LmpvaW4uYWxpYXM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGdpdmUgZmluZCBtYW55IG9wdGlvbnMgdG8gdGhlIGdpdmVuIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKHFiLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlPcHRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucylcbiAgICAgICAgICAgIHJldHVybiBxYi53aGVyZShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBnaXZlIGZpbmQgb3B0aW9ucyB0byB0aGUgZ2l2ZW4gcXVlcnkgYnVpbGRlci5cbiAgICAgKi9cbiAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5T3B0aW9uc1RvUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKHFiLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIGlmIG9wdGlvbnMgYXJlIG5vdCBzZXQgdGhlbiBzaW1wbHkgcmV0dXJuIHF1ZXJ5IGJ1aWxkZXIuIFRoaXMgaXMgbWFkZSBmb3Igc2ltcGxpY2l0eSBvZiB1c2FnZS5cbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICghdGhpcy5pc0ZpbmRPbmVPcHRpb25zKG9wdGlvbnMpICYmICF0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9wdGlvbnMpKSlcbiAgICAgICAgICAgIHJldHVybiBxYjtcbiAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHFiLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMgfHwgIXFiLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHFiO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgLy8gYXBwbHkgYWxsIG9wdGlvbnMgZnJvbSBGaW5kT3B0aW9uc1xuICAgICAgICBpZiAob3B0aW9ucy53aXRoRGVsZXRlZCkge1xuICAgICAgICAgICAgcWIud2l0aERlbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgICAgIHFiLnNlbGVjdChbXSk7XG4gICAgICAgICAgICBvcHRpb25zLnNlbGVjdC5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmhhc0NvbHVtbldpdGhQcm9wZXJ0eVBhdGgoXCJcIiArIHNlbGVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3Ioc2VsZWN0ICsgXCIgY29sdW1uIHdhcyBub3QgZm91bmQgaW4gdGhlIFwiICsgbWV0YWRhdGEubmFtZSArIFwiIGVudGl0eS5cIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSBtZXRhZGF0YS5maW5kQ29sdW1uc1dpdGhQcm9wZXJ0eVBhdGgoXCJcIiArIHNlbGVjdCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY29sdW1uc18xID0gX192YWx1ZXMoY29sdW1ucyksIGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKTsgIWNvbHVtbnNfMV8xLmRvbmU7IGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkU2VsZWN0KHFiLmFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnNfMV8xICYmICFjb2x1bW5zXzFfMS5kb25lICYmIChfYSA9IGNvbHVtbnNfMS5yZXR1cm4pKSBfYS5jYWxsKGNvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJlbGF0aW9ucykge1xuICAgICAgICAgICAgLy8gQ29weSBiZWNhdXNlIGBhcHBseVJlbGF0aW9uc1JlY3Vyc2l2ZWx5YCBtb2RpZmllcyBpdFxuICAgICAgICAgICAgdmFyIGFsbFJlbGF0aW9ucyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChvcHRpb25zLnJlbGF0aW9ucyksIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSZWxhdGlvbnNSZWN1cnNpdmVseShxYiwgYWxsUmVsYXRpb25zLCBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgXCJcIik7XG4gICAgICAgICAgICAvLyByZWN1cnNpdmUgcmVtb3ZlcyBmb3VuZCByZWxhdGlvbnMgZnJvbSBhbGxSZWxhdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSByZWxhdGlvbnMgbGVmdCBpbiB0aGlzIGFycmF5IGl0IG1lYW5zIHRob3NlIHJlbGF0aW9ucyB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgZW50aXR5IHN0cnVjdHVyZVxuICAgICAgICAgICAgLy8gc28sIHdlIGdpdmUgYW4gZXhjZXB0aW9uIGFib3V0IG5vdCBmb3VuZCByZWxhdGlvbnNcbiAgICAgICAgICAgIGlmIChhbGxSZWxhdGlvbnMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IoYWxsUmVsYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5qb2luLmxlZnRKb2luKVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbltrZXldLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuam9pbi5pbm5lckpvaW4pXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5qb2luLmlubmVySm9pbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmlubmVySm9pbihvcHRpb25zLmpvaW4uaW5uZXJKb2luW2tleV0sIGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5qb2luLmxlZnRKb2luQW5kU2VsZWN0KVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbkFuZFNlbGVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luQW5kU2VsZWN0KG9wdGlvbnMuam9pbi5sZWZ0Sm9pbkFuZFNlbGVjdFtrZXldLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuam9pbi5pbm5lckpvaW5BbmRTZWxlY3QpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5qb2luLmlubmVySm9pbkFuZFNlbGVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmlubmVySm9pbkFuZFNlbGVjdChvcHRpb25zLmpvaW4uaW5uZXJKb2luQW5kU2VsZWN0W2tleV0sIGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNhY2hlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhY2hlID0gb3B0aW9ucy5jYWNoZTtcbiAgICAgICAgICAgICAgICBxYi5jYWNoZShjYWNoZS5pZCwgY2FjaGUubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHFiLmNhY2hlKG9wdGlvbnMuY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmxvY2spIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxvY2subW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpIHtcbiAgICAgICAgICAgICAgICBxYi5zZXRMb2NrKG9wdGlvbnMubG9jay5tb2RlLCBvcHRpb25zLmxvY2sudmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY19yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZGlydHlfcmVhZFwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVfb3JfZmFpbFwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZm9yX25vX2tleV91cGRhdGVcIikge1xuICAgICAgICAgICAgICAgIHZhciB0YWJsZU5hbWVzID0gb3B0aW9ucy5sb2NrLnRhYmxlcyA/IG9wdGlvbnMubG9jay50YWJsZXMubWFwKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVBbGlhcyA9IHFiLmV4cHJlc3Npb25NYXAuYWxpYXNlcy5maW5kKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLm1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPT09IHRhYmxlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZUFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiXFxcIlwiICsgdGFibGUgKyBcIlxcXCIgaXMgbm90IHBhcnQgb2YgdGhpcyBxdWVyeVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWIuZXNjYXBlKHRhYmxlQWxpYXMubmFtZSk7XG4gICAgICAgICAgICAgICAgfSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcWIuc2V0TG9jayhvcHRpb25zLmxvY2subW9kZSwgdW5kZWZpbmVkLCB0YWJsZU5hbWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHFiLmxvYWRBbGxSZWxhdGlvbklkcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMubG9hZFJlbGF0aW9uSWRzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICBxYi5sb2FkQWxsUmVsYXRpb25JZHMob3B0aW9ucy5sb2FkUmVsYXRpb25JZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLndoZXJlKVxuICAgICAgICAgICAgcWIud2hlcmUob3B0aW9ucy53aGVyZSk7XG4gICAgICAgIGlmIChvcHRpb25zLnNraXApXG4gICAgICAgICAgICBxYi5za2lwKG9wdGlvbnMuc2tpcCk7XG4gICAgICAgIGlmIChvcHRpb25zLnRha2UpXG4gICAgICAgICAgICBxYi50YWtlKG9wdGlvbnMudGFrZSk7XG4gICAgICAgIGlmIChvcHRpb25zLm9yZGVyKVxuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5vcmRlcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gb3B0aW9ucy5vcmRlcltrZXldO1xuICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGtleSArIFwiIGNvbHVtbiB3YXMgbm90IGZvdW5kIGluIHRoZSBcIiArIG1ldGFkYXRhLm5hbWUgKyBcIiBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkFTQ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkRFU0NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFTQ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkFTQ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiREVTQ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkRFU0NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAocWIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWxhdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIENvcHkgYmVjYXVzZSBgYXBwbHlSZWxhdGlvbnNSZWN1cnNpdmVseWAgbW9kaWZpZXMgaXRcbiAgICAgICAgICAgIHZhciBhbGxSZWxhdGlvbnMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQob3B0aW9ucy5yZWxhdGlvbnMpLCBmYWxzZSk7XG4gICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5UmVsYXRpb25zUmVjdXJzaXZlbHkocWIsIGFsbFJlbGF0aW9ucywgcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSwgcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIFwiXCIpO1xuICAgICAgICAgICAgLy8gcmVjdXJzaXZlIHJlbW92ZXMgZm91bmQgcmVsYXRpb25zIGZyb20gYWxsUmVsYXRpb25zIGFycmF5XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcmVsYXRpb25zIGxlZnQgaW4gdGhpcyBhcnJheSBpdCBtZWFucyB0aG9zZSByZWxhdGlvbnMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGVudGl0eSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgIC8vIHNvLCB3ZSBnaXZlIGFuIGV4Y2VwdGlvbiBhYm91dCBub3QgZm91bmQgcmVsYXRpb25zXG4gICAgICAgICAgICBpZiAoYWxsUmVsYXRpb25zLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbmRSZWxhdGlvbnNOb3RGb3VuZEVycm9yKGFsbFJlbGF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBBZGRzIGpvaW5zIGZvciBhbGwgcmVsYXRpb25zIGFuZCBzdWItcmVsYXRpb25zIG9mIHRoZSBnaXZlbiByZWxhdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGZpbmQgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5UmVsYXRpb25zUmVjdXJzaXZlbHkgPSBmdW5jdGlvbiAocWIsIGFsbFJlbGF0aW9ucywgYWxpYXMsIG1ldGFkYXRhLCBwcmVmaXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gZmluZCBhbGwgcmVsYXRpb25zIHRoYXQgbWF0Y2ggZ2l2ZW4gcHJlZml4XG4gICAgICAgIHZhciBtYXRjaGVkQmFzZVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhwXzEgPSBuZXcgUmVnRXhwKFwiXlwiICsgcHJlZml4LnJlcGxhY2UoXCIuXCIsIFwiXFxcXC5cIikgKyBcIlxcXFwuXCIpO1xuICAgICAgICAgICAgbWF0Y2hlZEJhc2VSZWxhdGlvbnMgPSBhbGxSZWxhdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ubWF0Y2gocmVnZXhwXzEpOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5yZXBsYWNlKHJlZ2V4cF8xLCBcIlwiKTsgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2hlZEJhc2VSZWxhdGlvbnMgPSBhbGxSZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIG1hdGNoZWQgcmVsYXRpb25zIGFuZCBhZGQgam9pbiBmb3IgdGhlbVxuICAgICAgICBtYXRjaGVkQmFzZVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYSByZWxhdGlvbiBhbGlhc1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uQWxpYXMgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKHFiLmNvbm5lY3Rpb24uZHJpdmVyLCB7IHNob3J0ZW46IHRydWUsIGpvaW5lcjogXCJfX1wiIH0sIGFsaWFzLCByZWxhdGlvbik7XG4gICAgICAgICAgICAvLyBhZGQgYSBqb2luIGZvciB0aGUgZm91bmQgcmVsYXRpb25cbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBhbGlhcyArIFwiLlwiICsgcmVsYXRpb247XG4gICAgICAgICAgICBxYi5sZWZ0Sm9pbkFuZFNlbGVjdChzZWxlY3Rpb24sIHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGFkZGVkIHJlbGF0aW9ucyBmcm9tIHRoZSBhbGxSZWxhdGlvbnMgYXJyYXksIHRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgYWxsIG5vdCBmb3VuZCByZWxhdGlvbnMgYXQgdGhlIGVuZFxuICAgICAgICAgICAgYWxsUmVsYXRpb25zLnNwbGljZShhbGxSZWxhdGlvbnMuaW5kZXhPZihwcmVmaXggPyBwcmVmaXggKyBcIi5cIiArIHJlbGF0aW9uIDogcmVsYXRpb24pLCAxKTtcbiAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIHN1Yi1yZWxhdGlvbnNcbiAgICAgICAgICAgIHZhciBqb2luID0gcWIuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5maW5kKGZ1bmN0aW9uIChqb2luKSB7IHJldHVybiBqb2luLmVudGl0eU9yUHJvcGVydHkgPT09IHNlbGVjdGlvbjsgfSk7XG4gICAgICAgICAgICBfdGhpcy5hcHBseVJlbGF0aW9uc1JlY3Vyc2l2ZWx5KHFiLCBhbGxSZWxhdGlvbnMsIGpvaW4uYWxpYXMubmFtZSwgam9pbi5tZXRhZGF0YSwgcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyByZWxhdGlvbiA6IHJlbGF0aW9uKTtcbiAgICAgICAgICAgIC8vIGpvaW4gdGhlIGVhZ2VyIHJlbGF0aW9ucyBvZiB0aGUgZm91bmQgcmVsYXRpb25cbiAgICAgICAgICAgIHZhciByZWxNZXRhZGF0YSA9IG1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEucHJvcGVydHlOYW1lID09PSByZWxhdGlvbjsgfSk7XG4gICAgICAgICAgICBpZiAocmVsTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5qb2luRWFnZXJSZWxhdGlvbnMocWIsIHJlbGF0aW9uQWxpYXMsIHJlbE1ldGFkYXRhLmludmVyc2VFbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRmluZE9wdGlvbnNVdGlscy5qb2luRWFnZXJSZWxhdGlvbnMgPSBmdW5jdGlvbiAocWIsIGFsaWFzLCBtZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBtZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIGVfMiwgX2EsIGVfMywgX2I7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIHJlbGF0aW9uIGFsaWFzXG4gICAgICAgICAgICB2YXIgcmVsYXRpb25BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMocWIuY29ubmVjdGlvbi5kcml2ZXIsIHsgc2hvcnRlbjogdHJ1ZSB9LCBxYi5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmVhZ2VySm9pblJlbGF0aW9uQWxpYXMoYWxpYXMsIHJlbGF0aW9uLnByb3BlcnR5UGF0aCkpO1xuICAgICAgICAgICAgLy8gYWRkIGEgam9pbiBmb3IgdGhlIHJlbGF0aW9uXG4gICAgICAgICAgICAvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGlvbiB3YXNuJ3Qgam9pbmVkIHlldC5cbiAgICAgICAgICAgIHZhciBhZGRKb2luID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyhxYi5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9pbiA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoam9pbi5jb25kaXRpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5tYXBUb1Byb3BlcnR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uaXNNYXBwaW5nTWFueSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luLmRpcmVjdGlvbiAhPT0gXCJMRUZUXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uZW50aXR5T3JQcm9wZXJ0eSAhPT0gYWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWRkSm9pbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkFsaWFzID0gam9pbi5hbGlhcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkSm9pbikge1xuICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luKGFsaWFzICsgXCIuXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsIHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRpb24gd2Fzbid0IHNlbGVjdGVkIHlldC5cbiAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgc2hhbGwgYmUgYWZ0ZXIgdGhlIGpvaW4gY2hlY2sgdG8gZGV0ZWN0IHJlbGF0aW9uQWxpYXMuXG4gICAgICAgICAgICB2YXIgYWRkU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2UgPSBfX3ZhbHVlcyhxYi5leHByZXNzaW9uTWFwLnNlbGVjdHMpLCBfZiA9IF9lLm5leHQoKTsgIV9mLmRvbmU7IF9mID0gX2UubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3QgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdC5hbGlhc05hbWUgIT09IHVuZGVmaW5lZCB8fCBzZWxlY3QudmlydHVhbCAhPT0gdW5kZWZpbmVkIHx8IHNlbGVjdC5zZWxlY3Rpb24gIT09IHJlbGF0aW9uQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlbGVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8zXzEpIHsgZV8zID0geyBlcnJvcjogZV8zXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9mICYmICFfZi5kb25lICYmIChfYiA9IF9lLnJldHVybikpIF9iLmNhbGwoX2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkU2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgcWIuYWRkU2VsZWN0KHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gKHJlY3Vyc2l2ZSkgam9pbiB0aGUgZWFnZXIgcmVsYXRpb25zXG4gICAgICAgICAgICBfdGhpcy5qb2luRWFnZXJSZWxhdGlvbnMocWIsIHJlbGF0aW9uQWxpYXMsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbmRPcHRpb25zVXRpbHM7XG59KCkpO1xuZXhwb3J0IHsgRmluZE9wdGlvbnNVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5kT3B0aW9uc1V0aWxzLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3JkZXJCeUNvbmRpdGlvbi5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IEFueShbLi4uXSkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55KHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJhbnlcIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBCZXR3ZWVuKHgsIHkpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcImJldHdlZW5cIiwgW2Zyb20sIHRvXSwgdHJ1ZSwgdHJ1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJldHdlZW4uanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBFcXVhbChcInZhbHVlXCIpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVxdWFsKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJlcXVhbFwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVxdWFsLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSUxpa2UoXCIlU09NRSBzdHJpbmclXCIpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJpbGlrZVwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlMaWtlLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSW4oWy4uLl0pIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJpblwiLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSXNOdWxsKCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsKCkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwiaXNOdWxsXCIsIHVuZGVmaW5lZCwgZmFsc2UpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc051bGwuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBMZXNzVGhhbigxMCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gTGVzc1RoYW4odmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcImxlc3NUaGFuXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc1RoYW4uanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBMZXNzVGhhbk9yRXF1YWwoMTApIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExlc3NUaGFuT3JFcXVhbCh2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwibGVzc1RoYW5PckVxdWFsXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc1RoYW5PckVxdWFsLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogTGlrZShcIiVzb21lIHN0aW5nJVwiKSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJsaWtlXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGlrZS5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IE1vcmVUaGFuKDEwKSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb3JlVGhhbih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwibW9yZVRoYW5cIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3JlVGhhbi5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IE1vcmVUaGFuT3JFcXVhbCgxMCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gTW9yZVRoYW5PckVxdWFsKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJtb3JlVGhhbk9yRXF1YWxcIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3JlVGhhbk9yRXF1YWwuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIFVzZWQgdG8gbmVnb3RpYXRlIGV4cHJlc3Npb24uXG4gKiBFeGFtcGxlOiB7IHRpdGxlOiBub3QoXCJoZWxsb1wiKSB9IHdpbGwgcmV0dXJuIGVudGl0aWVzIHdoZXJlIHRpdGxlIG5vdCBlcXVhbCB0byBcImhlbGxvXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOb3QodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcIm5vdFwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdC5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbmV4cG9ydCBmdW5jdGlvbiBSYXcodmFsdWVPclNxbEdlbmVyYXRvciwgc3FsR2VuZXJhdG9yUGFyYW1ldGVycykge1xuICAgIGlmICh0eXBlb2YgdmFsdWVPclNxbEdlbmVyYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcInJhd1wiLCB2YWx1ZU9yU3FsR2VuZXJhdG9yLCBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwicmF3XCIsIFtdLCB0cnVlLCB0cnVlLCB2YWx1ZU9yU3FsR2VuZXJhdG9yLCBzcWxHZW5lcmF0b3JQYXJhbWV0ZXJzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmF3LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuL21ldGFkYXRhLWFyZ3MvTWV0YWRhdGFBcmdzU3RvcmFnZVwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuL3BsYXRmb3JtL1BsYXRmb3JtVG9vbHNcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25PcHRpb25zUmVhZGVyIH0gZnJvbSBcIi4vY29ubmVjdGlvbi9Db25uZWN0aW9uT3B0aW9uc1JlYWRlclwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi9jb25uZWN0aW9uL0Nvbm5lY3Rpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRGcm9tQ29udGFpbmVyIH0gZnJvbSBcIi4vY29udGFpbmVyXCI7XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgYXJncyBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpIHtcbiAgICAvLyB3ZSBzaG91bGQgc3RvcmUgbWV0YWRhdGEgc3RvcmFnZSBpbiBhIGdsb2JhbCB2YXJpYWJsZSBvdGhlcndpc2UgaXQgYnJpbmdzIHRvbyBtdWNoIHByb2JsZW1zXG4gICAgLy8gb25lIG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgYW55IGVudGl0eSAob3IgYW55IG90aGVyKSB3aWxsIGJlIGltcG9ydGVkIGJlZm9yZSBjb25zdW1lciB3aWxsIGNhbGxcbiAgICAvLyB1c2VDb250YWluZXIgbWV0aG9kIHdpdGggaGlzIG93biBjb250YWluZXIgaW1wbGVtZW50YXRpb24sIHRoYXQgZW50aXR5IHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGVcbiAgICAvLyBvbGQgb2xkIGNvbnRhaW5lciAoZGVmYXVsdCBvbmUgcG9zdCBwcm9iYWJseSkgYW5kIGNvbnN1bWVyIHdpbGwgaGlzIGVudGl0eS5cbiAgICAvLyBjYWxsaW5nIHVzZUNvbnRhaW5lciBiZWZvcmUgaGUgaW1wb3J0cyBhbnkgZW50aXR5IChvciBhbnkgb3RoZXIpIGlzIG5vdCBhbHdheXMgY29udmVuaWVudC5cbiAgICAvLyBhbm90aGVyIHJlYXNvbiBpcyB0aGF0IHdoZW4gd2UgcnVuIG1pZ3JhdGlvbnMgdHlwZW9ybSBpcyBiZWluZyBjYWxsZWQgZnJvbSBhIGdsb2JhbCBwYWNrYWdlXG4gICAgLy8gYW5kIGl0IG1heSBsb2FkIGVudGl0aWVzIHdoaWNoIHJlZ2lzdGVyIGRlY29yYXRvcnMgaW4gdHlwZW9ybSBvZiBsb2NhbCBwYWNrYWdlXG4gICAgLy8gdGhpcyBsZWFkcyB0byBpbXBvc3NpYmlsaXR5IG9mIHVzYWdlIG9mIGVudGl0aWVzIGluIG1pZ3JhdGlvbnMgYW5kIGNsaSByZWxhdGVkIG9wZXJhdGlvbnNcbiAgICB2YXIgZ2xvYmFsU2NvcGUgPSBQbGF0Zm9ybVRvb2xzLmdldEdsb2JhbFZhcmlhYmxlKCk7XG4gICAgaWYgKCFnbG9iYWxTY29wZS50eXBlb3JtTWV0YWRhdGFBcmdzU3RvcmFnZSlcbiAgICAgICAgZ2xvYmFsU2NvcGUudHlwZW9ybU1ldGFkYXRhQXJnc1N0b3JhZ2UgPSBuZXcgTWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIHJldHVybiBnbG9iYWxTY29wZS50eXBlb3JtTWV0YWRhdGFBcmdzU3RvcmFnZTtcbn1cbi8qKlxuICogUmVhZHMgY29ubmVjdGlvbiBvcHRpb25zIHN0b3JlZCBpbiBvcm1jb25maWcgY29uZmlndXJhdGlvbiBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbk9wdGlvbnMoY29ubmVjdGlvbk5hbWUpIHtcbiAgICBpZiAoY29ubmVjdGlvbk5hbWUgPT09IHZvaWQgMCkgeyBjb25uZWN0aW9uTmFtZSA9IFwiZGVmYXVsdFwiOyB9XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IENvbm5lY3Rpb25PcHRpb25zUmVhZGVyKCkuZ2V0KGNvbm5lY3Rpb25OYW1lKV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXRzIGEgQ29ubmVjdGlvbk1hbmFnZXIgd2hpY2ggY3JlYXRlcyBjb25uZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkge1xuICAgIHJldHVybiBnZXRGcm9tQ29udGFpbmVyKENvbm5lY3Rpb25NYW5hZ2VyKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1hbmFnZXIuXG4gKlxuICogSWYgY29ubmVjdGlvbiBvcHRpb25zIHdlcmUgbm90IHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIHRyeSB0byBjcmVhdGUgY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5LFxuICogYmFzZWQgb24gY29udGVudCBvZiBvcm1jb25maWcgKGpzb24vanMveW1sL3htbC9lbnYpIGZpbGUgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogT25seSBvbmUgY29ubmVjdGlvbiBmcm9tIG9ybWNvbmZpZyB3aWxsIGJlIGNyZWF0ZWQgKG5hbWUgXCJkZWZhdWx0XCIgb3IgY29ubmVjdGlvbiB3aXRob3V0IG5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zT3JOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbk5hbWUsIG9wdGlvbnMsIF9hO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSA9IHR5cGVvZiBvcHRpb25zT3JOYW1lID09PSBcInN0cmluZ1wiID8gb3B0aW9uc09yTmFtZSA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShvcHRpb25zT3JOYW1lIGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9uc09yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRDb25uZWN0aW9uT3B0aW9ucyhjb25uZWN0aW9uTmFtZSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkuY3JlYXRlKG9wdGlvbnMpLmNvbm5lY3QoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9ucyBhbmQgcmVnaXN0ZXJzIHRoZW0gaW4gdGhlIG1hbmFnZXIuXG4gKlxuICogSWYgY29ubmVjdGlvbiBvcHRpb25zIHdlcmUgbm90IHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIHRyeSB0byBjcmVhdGUgY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5LFxuICogYmFzZWQgb24gY29udGVudCBvZiBvcm1jb25maWcgKGpzb24vanMveW1sL3htbC9lbnYpIGZpbGUgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogQWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIG9ybWNvbmZpZyB3aWxsIGJlIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbnM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIoKS5hbGwoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb25zKSB7IHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmNyZWF0ZShvcHRpb25zKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLmFsbChjb25uZWN0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHsgcmV0dXJuIGNvbm5lY3Rpb24uY29ubmVjdCgpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0cyBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gbWFuYWdlci5cbiAqIElmIGNvbm5lY3Rpb24gbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSk7XG59XG4vKipcbiAqIEdldHMgZW50aXR5IG1hbmFnZXIgZnJvbSB0aGUgY29ubmVjdGlvbi5cbiAqIElmIGNvbm5lY3Rpb24gbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYW5hZ2VyKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkubWFuYWdlcjtcbn1cbi8qKlxuICogR2V0cyBNb25nb0RCIGVudGl0eSBtYW5hZ2VyIGZyb20gdGhlIGNvbm5lY3Rpb24uXG4gKiBJZiBjb25uZWN0aW9uIG5hbWUgd2Fzbid0IHNwZWNpZmllZCwgdGhlbiBcImRlZmF1bHRcIiBjb25uZWN0aW9uIHdpbGwgYmUgcmV0cmlldmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9uZ29NYW5hZ2VyKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkubWFuYWdlcjtcbn1cbi8qKlxuICogR2V0cyBTcWxqcyBlbnRpdHkgbWFuYWdlciBmcm9tIGNvbm5lY3Rpb24gbmFtZS5cbiAqIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gaXMgdXNlZCwgd2hlbiBubyBuYW1lIGlzIHNwZWNpZmllZC5cbiAqIE9ubHkgd29ya3Mgd2hlbiBTcWxqcyBkcml2ZXIgaXMgdXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNxbGpzTWFuYWdlcihjb25uZWN0aW9uTmFtZSkge1xuICAgIGlmIChjb25uZWN0aW9uTmFtZSA9PT0gdm9pZCAwKSB7IGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICByZXR1cm4gZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXQoY29ubmVjdGlvbk5hbWUpLm1hbmFnZXI7XG59XG4vKipcbiAqIEdldHMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcG9zaXRvcnkoZW50aXR5Q2xhc3MsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkuZ2V0UmVwb3NpdG9yeShlbnRpdHlDbGFzcyk7XG59XG4vKipcbiAqIEdldHMgdHJlZSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5Q2xhc3MsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkuZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5Q2xhc3MpO1xufVxuLyoqXG4gKiBHZXRzIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1c3RvbVJlcG9zaXRvcnkoY3VzdG9tUmVwb3NpdG9yeSwgY29ubmVjdGlvbk5hbWUpIHtcbiAgICBpZiAoY29ubmVjdGlvbk5hbWUgPT09IHZvaWQgMCkgeyBjb25uZWN0aW9uTmFtZSA9IFwiZGVmYXVsdFwiOyB9XG4gICAgcmV0dXJuIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0KGNvbm5lY3Rpb25OYW1lKS5nZXRDdXN0b21SZXBvc2l0b3J5KGN1c3RvbVJlcG9zaXRvcnkpO1xufVxuLyoqXG4gKiBHZXRzIG1vbmdvZGIgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9uZ29SZXBvc2l0b3J5KGVudGl0eUNsYXNzLCBjb25uZWN0aW9uTmFtZSkge1xuICAgIGlmIChjb25uZWN0aW9uTmFtZSA9PT0gdm9pZCAwKSB7IGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICByZXR1cm4gZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXQoY29ubmVjdGlvbk5hbWUpLmdldE1vbmdvUmVwb3NpdG9yeShlbnRpdHlDbGFzcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgYWxpYXMsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIGlmIChlbnRpdHlDbGFzcykge1xuICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeShlbnRpdHlDbGFzcywgY29ubmVjdGlvbk5hbWUpLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXBcbiIsIi8qIVxuICovXG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb21tb25seSBVc2VkIGV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCAqIGZyb20gXCIuL2dsb2JhbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uL0VudGl0eVRhcmdldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uL09iamVjdFR5cGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbW1vbi9PYmplY3RMaXRlcmFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tb24vRGVlcFBhcnRpYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvY29sdW1ucy9Db2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL0RlbGV0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1VwZGF0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ZlcnNpb25Db2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ZpZXdDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL09iamVjdElkQ29sdW1uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVySW5zZXJ0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyTG9hZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9BZnRlclJlbW92ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9BZnRlclVwZGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9CZWZvcmVJbnNlcnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9saXN0ZW5lcnMvQmVmb3JlUmVtb3ZlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0JlZm9yZVVwZGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9FdmVudFN1YnNjcmliZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0luZGV4T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvSm9pbkNvbHVtbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0pvaW5UYWJsZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL1JlbGF0aW9uT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvRW50aXR5T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvVmFsdWVUcmFuc2Zvcm1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9Kb2luQ29sdW1uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5UYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9NYW55VG9NYW55XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvcmVsYXRpb25zL01hbnlUb09uZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9PbmVUb01hbnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9yZWxhdGlvbnMvT25lVG9PbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9yZWxhdGlvbnMvUmVsYXRpb25Db3VudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbklkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvZW50aXR5L0VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2VudGl0eS9DaGlsZEVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2VudGl0eS9UYWJsZUluaGVyaXRhbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvZW50aXR5LXZpZXcvVmlld0VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25NYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJlZS9UcmVlTGV2ZWxDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci90cmVlL1RyZWVQYXJlbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci90cmVlL1RyZWVDaGlsZHJlblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3RyZWUvVHJlZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL0luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvVW5pcXVlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvQ2hlY2tcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9FeGNsdXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9HZW5lcmF0ZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9FbnRpdHlSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQW55XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQmV0d2VlblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0VxdWFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9Jc051bGxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9MZXNzVGhhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuT3JFcXVhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0lMaWtlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTGlrZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTW9yZVRoYW5PckVxdWFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTm90XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvUmF3XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvRmluZENvbmRpdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kTWFueU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kT25lT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclR5cGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9Kb2luT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnZXIvTG9nZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnZXIvTG9nZ2VyT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2VyL0FkdmFuY2VkQ29uc29sZUxvZ2dlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2VyL1NpbXBsZUNvbnNvbGVMb2dnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dlci9GaWxlTG9nZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LW1hbmFnZXIvRW50aXR5TWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9CYXNlRW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L1RyZWVSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L01vbmdvUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9SZW1vdmVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L1NhdmVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNvbHVtblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVFeGNsdXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRm9yZWlnbktleVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVJbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVVbmlxdWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ2hlY2tPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ29sdW1uT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUV4Y2x1c2lvbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVGb3JlaWduS2V5T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUluZGV4T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVVbmlxdWVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1ZpZXdPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvbW9uZ29kYi90eXBpbmdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvdHlwZXMvRGF0YWJhc2VUeXBlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvdHlwZXMvUmVwbGljYXRpb25Nb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvc3Fsc2VydmVyL01zc3FsUGFyYW1ldGVyXCI7XG5leHBvcnQgeyBDb25uZWN0aW9uT3B0aW9uc1JlYWRlciB9IGZyb20gXCIuL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXJcIjtcbmV4cG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9jb25uZWN0aW9uL0Nvbm5lY3Rpb25cIjtcbmV4cG9ydCB7IENvbm5lY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4vY29ubmVjdGlvbi9Db25uZWN0aW9uTWFuYWdlclwiO1xuZXhwb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9RdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvU2VsZWN0UXVlcnlCdWlsZGVyXCI7XG5leHBvcnQgeyBEZWxldGVRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyL0RlbGV0ZVF1ZXJ5QnVpbGRlclwiO1xuZXhwb3J0IHsgSW5zZXJ0UXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9JbnNlcnRRdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvVXBkYXRlUXVlcnlCdWlsZGVyXCI7XG5leHBvcnQgeyBSZWxhdGlvblF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25RdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IEJyYWNrZXRzIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9CcmFja2V0c1wiO1xuZXhwb3J0IHsgSW5zZXJ0UmVzdWx0IH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9yZXN1bHQvSW5zZXJ0UmVzdWx0XCI7XG5leHBvcnQgeyBVcGRhdGVSZXN1bHQgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyL3Jlc3VsdC9VcGRhdGVSZXN1bHRcIjtcbmV4cG9ydCB7IERlbGV0ZVJlc3VsdCB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvcmVzdWx0L0RlbGV0ZVJlc3VsdFwiO1xuZXhwb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbmV4cG9ydCB7IE1vbmdvRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyL01vbmdvRW50aXR5TWFuYWdlclwiO1xuZXhwb3J0IHsgTWlncmF0aW9uIH0gZnJvbSBcIi4vbWlncmF0aW9uL01pZ3JhdGlvblwiO1xuZXhwb3J0IHsgTWlncmF0aW9uRXhlY3V0b3IgfSBmcm9tIFwiLi9taWdyYXRpb24vTWlncmF0aW9uRXhlY3V0b3JcIjtcbmV4cG9ydCB7IERlZmF1bHROYW1pbmdTdHJhdGVneSB9IGZyb20gXCIuL25hbWluZy1zdHJhdGVneS9EZWZhdWx0TmFtaW5nU3RyYXRlZ3lcIjtcbmV4cG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG4vKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciB1c2VzIGNvbnNvbGUgdG8gbG9nIGV2ZW50cyBhbmQgdXNlIHN5bnRheCBoaWdobGlnaHRpbmcuXG4gKi9cbnZhciBBZHZhbmNlZENvbnNvbGVMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEFkdmFuY2VkQ29uc29sZUxvZ2dlcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gaXQuXG4gICAgICovXG4gICAgQWR2YW5jZWRDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcInF1ZXJ5XCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dJbmZvKFwicXVlcnk6XCIsIFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHNxbCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IHRoYXQgaXMgZmFpbGVkLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgcXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IFwiYWxsXCIgfHwgdGhpcy5vcHRpb25zID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJlcnJvclwiKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgICAgIFBsYXRmb3JtVG9vbHMubG9nRXJyb3IoXCJxdWVyeSBmYWlsZWQ6XCIsIFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHNxbCkpO1xuICAgICAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dFcnJvcihcImVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlTbG93ID0gZnVuY3Rpb24gKHRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dXYXJuKFwicXVlcnkgaXMgc2xvdzpcIiwgUGxhdGZvcm1Ub29scy5oaWdobGlnaHRTcWwoc3FsKSk7XG4gICAgICAgIFBsYXRmb3JtVG9vbHMubG9nV2FybihcImV4ZWN1dGlvbiB0aW1lOlwiLCB0aW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIHNjaGVtYSBidWlsZCBwcm9jZXNzLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nU2NoZW1hQnVpbGQgPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwic2NoZW1hXCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIFBsYXRmb3JtVG9vbHMubG9nKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBtaWdyYXRpb24gcnVuIHByb2Nlc3MuXG4gICAgICovXG4gICAgQWR2YW5jZWRDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dNaWdyYXRpb24gPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgUGxhdGZvcm1Ub29scy5sb2cobWVzc2FnZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGxvZ2dpbmcgdXNpbmcgZ2l2ZW4gbG9nZ2VyLCBvciBieSBkZWZhdWx0IHRvIHRoZSBjb25zb2xlLlxuICAgICAqIExvZyBoYXMgaXRzIG93biBsZXZlbCBhbmQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBBZHZhbmNlZENvbnNvbGVMb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChsZXZlbCwgbWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICAgICAgY2FzZSBcImxvZ1wiOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IFwiYWxsXCIgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcImxvZ1wiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwiaW5mb1wiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmxvZ0luZm8oXCJJTkZPOlwiLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwid2FyblwiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oUGxhdGZvcm1Ub29scy53YXJuKG1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHBhcmFtZXRlcnMgdG8gYSBzdHJpbmcuXG4gICAgICogU29tZXRpbWVzIHBhcmFtZXRlcnMgY2FuIGhhdmUgY2lyY3VsYXIgb2JqZWN0cyBhbmQgdGhlcmVmb3Igd2UgYXJlIGhhbmRsZSB0aGlzIGNhc2UgdG9vLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUuc3RyaW5naWZ5UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgLy8gbW9zdCBwcm9iYWJseSBjaXJjdWxhciBvYmplY3RzIGluIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQWR2YW5jZWRDb25zb2xlTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IEFkdmFuY2VkQ29uc29sZUxvZ2dlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZHZhbmNlZENvbnNvbGVMb2dnZXIuanMubWFwXG4iLCJpbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBQbGF0Zm9ybVRvb2xzIH0gZnJvbSBcIi4uL3BsYXRmb3JtL1BsYXRmb3JtVG9vbHNcIjtcbi8qKlxuICogUGVyZm9ybXMgbG9nZ2luZyBvZiB0aGUgZXZlbnRzIGluIFR5cGVPUk0gdmlhIGRlYnVnIGxpYnJhcnkuXG4gKi9cbnZhciBEZWJ1Z0xvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWJ1Z0xvZ2dlcigpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5TG9nID0gZGVidWcoXCJ0eXBlb3JtOnF1ZXJ5OmxvZ1wiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5RXJyb3IgPSBkZWJ1ZyhcInR5cGVvcm06cXVlcnk6ZXJyb3JcIik7XG4gICAgICAgIHRoaXMuZGVidWdRdWVyeVNsb3cgPSBkZWJ1ZyhcInR5cGVvcm06cXVlcnk6c2xvd1wiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z1NjaGVtYUJ1aWxkID0gZGVidWcoXCJ0eXBlb3JtOnNjaGVtYVwiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z01pZ3JhdGlvbiA9IGRlYnVnKFwidHlwZW9ybTptaWdyYXRpb25cIik7XG4gICAgICAgIHRoaXMuZGVidWdMb2cgPSBkZWJ1ZyhcInR5cGVvcm06bG9nXCIpO1xuICAgICAgICB0aGlzLmRlYnVnSW5mbyA9IGRlYnVnKFwidHlwZW9ybTppbmZvXCIpO1xuICAgICAgICB0aGlzLmRlYnVnV2FybiA9IGRlYnVnKFwidHlwZW9ybTp3YXJuXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gaXQuXG4gICAgICovXG4gICAgRGVidWdMb2dnZXIucHJvdG90eXBlLmxvZ1F1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z1F1ZXJ5TG9nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUxvZyhQbGF0Zm9ybVRvb2xzLmhpZ2hsaWdodFNxbChxdWVyeSkgKyBcIjtcIik7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUxvZyhcInBhcmFtZXRlcnM6XCIsIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IHRoYXQgZmFpbGVkLlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdRdWVyeUVycm9yLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUVycm9yKFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHF1ZXJ5KSArIFwiO1wiKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5RXJyb3IoXCJwYXJhbWV0ZXJzOlwiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUVycm9yKFwiZXJyb3I6IFwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeVNsb3cgPSBmdW5jdGlvbiAodGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnUXVlcnlTbG93LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeVNsb3coUGxhdGZvcm1Ub29scy5oaWdobGlnaHRTcWwocXVlcnkpICsgXCI7XCIpO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgJiYgcGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnUXVlcnlTbG93KFwicGFyYW1ldGVyczpcIiwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlYnVnUXVlcnlTbG93KFwiZXhlY3V0aW9uIHRpbWU6XCIsIHRpbWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBzY2hlbWEgYnVpbGQgcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEZWJ1Z0xvZ2dlci5wcm90b3R5cGUubG9nU2NoZW1hQnVpbGQgPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdTY2hlbWFCdWlsZC5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnU2NoZW1hQnVpbGQobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIG1pZ3JhdGlvbiBydW4gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEZWJ1Z0xvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnTWlncmF0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdNaWdyYXRpb24obWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gbG9nZ2luZyB1c2luZyBnaXZlbiBsb2dnZXIuXG4gICAgICogTG9nIGhhcyBpdHMgb3duIGxldmVsIGFuZCBtZXNzYWdlLlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAobGV2ZWwsIG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgIGNhc2UgXCJsb2dcIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0xvZy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2cobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0luZm8uZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnSW5mbyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwid2FyblwiOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnV2Fybi5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWdXYXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERlYnVnTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IERlYnVnTG9nZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlYnVnTG9nZ2VyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBTaW1wbGVDb25zb2xlTG9nZ2VyIH0gZnJvbSBcIi4vU2ltcGxlQ29uc29sZUxvZ2dlclwiO1xuaW1wb3J0IHsgQWR2YW5jZWRDb25zb2xlTG9nZ2VyIH0gZnJvbSBcIi4vQWR2YW5jZWRDb25zb2xlTG9nZ2VyXCI7XG5pbXBvcnQgeyBGaWxlTG9nZ2VyIH0gZnJvbSBcIi4vRmlsZUxvZ2dlclwiO1xuaW1wb3J0IHsgRGVidWdMb2dnZXIgfSBmcm9tIFwiLi9EZWJ1Z0xvZ2dlclwiO1xuLyoqXG4gKiBIZWxwcyB0byBjcmVhdGUgbG9nZ2VyIGluc3RhbmNlcy5cbiAqL1xudmFyIExvZ2dlckZhY3RvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9nZ2VyRmFjdG9yeSgpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2dnZXIgZGVwZW5kIG9uIGEgZ2l2ZW4gY29ubmVjdGlvbidzIGRyaXZlci5cbiAgICAgKi9cbiAgICBMb2dnZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAobG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsb2dnZXIgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGxvZ2dlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzaW1wbGUtY29uc29sZVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnNvbGVMb2dnZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhZHZhbmNlZC1jb25zb2xlXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWR2YW5jZWRDb25zb2xlTG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWJ1Z1wiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnTG9nZ2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZHZhbmNlZENvbnNvbGVMb2dnZXIob3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gTG9nZ2VyRmFjdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBMb2dnZXJGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2dlckZhY3RvcnkuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2dlck9wdGlvbnMuanMubWFwXG4iLCIvKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciB1c2VzIGNvbnNvbGUgdG8gbG9nIGV2ZW50cyBhbmQgZG9lcyBub3QgdXNlIHN5bnRheCBoaWdobGlnaHRpbmcuXG4gKi9cbnZhciBTaW1wbGVDb25zb2xlTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBTaW1wbGVDb25zb2xlTG9nZ2VyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcInF1ZXJ5XCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeVwiICsgXCI6IFwiICsgc3FsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBxdWVyeSB0aGF0IGlzIGZhaWxlZC5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcImVycm9yXCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeSBmYWlsZWQ6IFwiICsgc3FsKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBxdWVyeSB0aGF0IGlzIHNsb3cuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlTbG93ID0gZnVuY3Rpb24gKHRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeSBpcyBzbG93OiBcIiArIHNxbCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXhlY3V0aW9uIHRpbWU6IFwiICsgdGltZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBzY2hlbWEgYnVpbGQgcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dTY2hlbWFCdWlsZCA9IGZ1bmN0aW9uIChtZXNzYWdlLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zID09PSBcImFsbFwiIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJzY2hlbWFcIikgIT09IC0xKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIG1pZ3JhdGlvbnMgcnVuIHByb2Nlc3MuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBsb2dnaW5nIHVzaW5nIGdpdmVuIGxvZ2dlciwgb3IgYnkgZGVmYXVsdCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBMb2cgaGFzIGl0cyBvd24gbGV2ZWwgYW5kIG1lc3NhZ2UuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGxldmVsLCBtZXNzYWdlLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlIFwibG9nXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwibG9nXCIpICE9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zID09PSBcImFsbFwiIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJpbmZvXCIpICE9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwid2FyblwiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBwYXJhbWV0ZXJzIHRvIGEgc3RyaW5nLlxuICAgICAqIFNvbWV0aW1lcyBwYXJhbWV0ZXJzIGNhbiBoYXZlIGNpcmN1bGFyIG9iamVjdHMgYW5kIHRoZXJlZm9yIHdlIGFyZSBoYW5kbGUgdGhpcyBjYXNlIHRvby5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5zdHJpbmdpZnlQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyAvLyBtb3N0IHByb2JhYmx5IGNpcmN1bGFyIG9iamVjdHMgaW4gcGFyYW1ldGVyc1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTaW1wbGVDb25zb2xlTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IFNpbXBsZUNvbnNvbGVMb2dnZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2ltcGxlQ29uc29sZUxvZ2dlci5qcy5tYXBcbiIsImltcG9ydCB7IE1ldGFkYXRhVXRpbHMgfSBmcm9tIFwiLi4vbWV0YWRhdGEtYnVpbGRlci9NZXRhZGF0YVV0aWxzXCI7XG4vKipcbiAqIFN0b3JhZ2UgYWxsIG1ldGFkYXRhcyBhcmdzIG9mIGFsbCBhdmFpbGFibGUgdHlwZXM6IHRhYmxlcywgY29sdW1ucywgc3Vic2NyaWJlcnMsIHJlbGF0aW9ucywgZXRjLlxuICogRWFjaCBtZXRhZGF0YSBhcmdzIHJlcHJlc2VudHMgc29tZSBzcGVjaWZpY2F0aW9ucyBvZiB3aGF0IGl0IHJlcHJlc2VudHMuXG4gKiBNZXRhZGF0YUFyZ3MgdXNlZCB0byBjcmVhdGUgYSByZWFsIE1ldGFkYXRhIG9iamVjdHMuXG4gKi9cbnZhciBNZXRhZGF0YUFyZ3NTdG9yYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1ldGFkYXRhQXJnc1N0b3JhZ2UoKSB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMudGFibGVzID0gW107XG4gICAgICAgIHRoaXMudHJlZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlSZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzID0gW107XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25SZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1pbmdTdHJhdGVnaWVzID0gW107XG4gICAgICAgIHRoaXMuZW50aXR5U3Vic2NyaWJlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRpY2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoZWNrcyA9IFtdO1xuICAgICAgICB0aGlzLmV4Y2x1c2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmpvaW5UYWJsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICB0aGlzLnJlbGF0aW9uSWRzID0gW107XG4gICAgICAgIHRoaXMuZW1iZWRkZWRzID0gW107XG4gICAgICAgIHRoaXMuaW5oZXJpdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuZGlzY3JpbWluYXRvclZhbHVlcyA9IFtdO1xuICAgIH1cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUYWJsZXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0KHRoaXMudGFibGVzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQ29sdW1ucyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyh0aGlzLmNvbHVtbnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kR2VuZXJhdGVkID0gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRpb25zLmZpbmQoZnVuY3Rpb24gKGdlbmVyYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihnZW5lcmF0ZWQudGFyZ2V0KSAhPT0gLTEgOiBnZW5lcmF0ZWQudGFyZ2V0ID09PSB0YXJnZXQpICYmIGdlbmVyYXRlZC5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kVHJlZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZXMuZmluZChmdW5jdGlvbiAodHJlZSkge1xuICAgICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZih0cmVlLnRhcmdldCkgIT09IC0xIDogdHJlZS50YXJnZXQgPT09IHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyUmVsYXRpb25zID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVSZWxhdGlvblByb3BlcnRpZXModGhpcy5yZWxhdGlvbnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJSZWxhdGlvbklkcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyh0aGlzLnJlbGF0aW9uSWRzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyUmVsYXRpb25Db3VudHMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0QW5kV2l0aG91dER1cGxpY2F0ZVByb3BlcnRpZXModGhpcy5yZWxhdGlvbkNvdW50cywgdGFyZ2V0KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckluZGljZXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIC8vIHRvZG86IGltcGxlbWVudCBwYXJlbnQtZW50aXR5IG92ZXJyaWRlcz9cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0LmluZGV4T2YoaW5kZXgudGFyZ2V0KSAhPT0gLTEgOiBpbmRleC50YXJnZXQgPT09IHRhcmdldDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJVbmlxdWVzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0LmluZGV4T2YodW5pcXVlLnRhcmdldCkgIT09IC0xIDogdW5pcXVlLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckNoZWNrcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tzLmZpbHRlcihmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihjaGVjay50YXJnZXQpICE9PSAtMSA6IGNoZWNrLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckV4Y2x1c2lvbnMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1c2lvbnMuZmlsdGVyKGZ1bmN0aW9uIChleGNsdXNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihleGNsdXNpb24udGFyZ2V0KSAhPT0gLTEgOiBleGNsdXNpb24udGFyZ2V0ID09PSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyTGlzdGVuZXJzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldCh0aGlzLmVudGl0eUxpc3RlbmVycywgdGFyZ2V0KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckVtYmVkZGVkcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlRW1iZWRkZWRQcm9wZXJ0aWVzKHRoaXMuZW1iZWRkZWRzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmluZEpvaW5UYWJsZSA9IGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luVGFibGVzLmZpbmQoZnVuY3Rpb24gKGpvaW5UYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGpvaW5UYWJsZS50YXJnZXQgPT09IHRhcmdldCAmJiBqb2luVGFibGUucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVySm9pbkNvbHVtbnMgPSBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gdG9kbzogaW1wbGVtZW50IHBhcmVudC1lbnRpdHkgb3ZlcnJpZGVzP1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQ29sdW1uLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGpvaW5Db2x1bW4ucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyU3Vic2NyaWJlcnMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0KHRoaXMuZW50aXR5U3Vic2NyaWJlcnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJOYW1pbmdTdHJhdGVnaWVzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldCh0aGlzLm5hbWluZ1N0cmF0ZWdpZXMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUcmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzID0gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRW50aXR5TWFuYWdlcnMuZmlsdGVyKGZ1bmN0aW9uICh0cmFuc2FjdGlvbkVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRyYW5zYWN0aW9uRW0udGFyZ2V0KSAhPT0gLTEgOiB0cmFuc2FjdGlvbkVtLnRhcmdldCA9PT0gdGFyZ2V0KSAmJiB0cmFuc2FjdGlvbkVtLm1ldGhvZE5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUcmFuc2FjdGlvblJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25SZXBvc2l0b3JpZXMuZmlsdGVyKGZ1bmN0aW9uICh0cmFuc2FjdGlvbkVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRyYW5zYWN0aW9uRW0udGFyZ2V0KSAhPT0gLTEgOiB0cmFuc2FjdGlvbkVtLnRhcmdldCA9PT0gdGFyZ2V0KSAmJiB0cmFuc2FjdGlvbkVtLm1ldGhvZE5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJTaW5nbGVUYWJsZUNoaWxkcmVuID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZXMuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgJiYgdGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAmJiBNZXRhZGF0YVV0aWxzLmlzSW5oZXJpdGVkKHRhYmxlLnRhcmdldCwgdGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIHRhYmxlLnR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmluZEluaGVyaXRhbmNlVHlwZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VzLmZpbmQoZnVuY3Rpb24gKGluaGVyaXRhbmNlKSB7IHJldHVybiBpbmhlcml0YW5jZS50YXJnZXQgPT09IHRhcmdldDsgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kRGlzY3JpbWluYXRvclZhbHVlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVzLmZpbmQoZnVuY3Rpb24gKGRpc2NyaW1pbmF0b3JWYWx1ZSkgeyByZXR1cm4gZGlzY3JpbWluYXRvclZhbHVlLnRhcmdldCA9PT0gdGFyZ2V0OyB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMuXG4gICAgICovXG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQnlUYXJnZXQgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRhYmxlLnRhcmdldCkgIT09IC0xIDogdGFibGUudGFyZ2V0ID09PSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmlsdGVycyBnaXZlbiBhcnJheSBieSBhIGdpdmVuIHRhcmdldCBvciB0YXJnZXRzIGFuZCBwcmV2ZW50cyBkdXBsaWNhdGUgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChhcnJheSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBuZXdBcnJheSA9IFtdO1xuICAgICAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgc2FtZVRhcmdldCA9IEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKGl0ZW0udGFyZ2V0KSAhPT0gLTEgOiBpdGVtLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKHNhbWVUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5ld0FycmF5LmZpbmQoZnVuY3Rpb24gKG5ld0l0ZW0pIHsgcmV0dXJuIG5ld0l0ZW0ucHJvcGVydHlOYW1lID09PSBpdGVtLnByb3BlcnR5TmFtZTsgfSkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMgYW5kIHByZXZlbnRzIGR1cGxpY2F0ZSByZWxhdGlvbiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVSZWxhdGlvblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICB2YXIgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgdmFyIHNhbWVUYXJnZXQgPSB0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSA/IHRhcmdldC5pbmRleE9mKGl0ZW0udGFyZ2V0KSAhPT0gLTEgOiBpdGVtLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKHNhbWVUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IG5ld0FycmF5LmZpbmRJbmRleChmdW5jdGlvbiAobmV3SXRlbSkgeyByZXR1cm4gbmV3SXRlbS5wcm9wZXJ0eU5hbWUgPT09IGl0ZW0ucHJvcGVydHlOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXJyYXkgJiYgZXhpc3RpbmdJbmRleCAhPT0gLTEgJiYgdGFyZ2V0LmluZGV4T2YoaXRlbS50YXJnZXQpIDwgdGFyZ2V0LmluZGV4T2YobmV3QXJyYXlbZXhpc3RpbmdJbmRleF0udGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKG5ld0FycmF5W2V4aXN0aW5nSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUudHlwZSA9IGl0ZW0udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXlbZXhpc3RpbmdJbmRleF0gPSBjbG9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhpc3RpbmdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMgYW5kIHByZXZlbnRzIGR1cGxpY2F0ZSBlbWJlZGRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVFbWJlZGRlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICB2YXIgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgdmFyIHNhbWVUYXJnZXQgPSBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihpdGVtLnRhcmdldCkgIT09IC0xIDogaXRlbS50YXJnZXQgPT09IHRhcmdldDtcbiAgICAgICAgICAgIGlmIChzYW1lVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRHVwbGljYXRlRW1iZWRkZWRQcm9wZXJ0eSA9IG5ld0FycmF5LmZpbmQoZnVuY3Rpb24gKG5ld0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW0ucHJlZml4ID09PSBpdGVtLnByZWZpeCAmJiBuZXdJdGVtLnByb3BlcnR5TmFtZSA9PT0gaXRlbS5wcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZUVtYmVkZGVkUHJvcGVydHkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICByZXR1cm4gTWV0YWRhdGFBcmdzU3RvcmFnZTtcbn0oKSk7XG5leHBvcnQgeyBNZXRhZGF0YUFyZ3NTdG9yYWdlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1ldGFkYXRhQXJnc1N0b3JhZ2UuanMubWFwXG4iLCJpbXBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9Gb3JlaWduS2V5TWV0YWRhdGFcIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvSW5kZXhNZXRhZGF0YVwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG4vKipcbiAqIENyZWF0ZXMgRW50aXR5TWV0YWRhdGEgZm9yIGp1bmN0aW9uIHRhYmxlcyBvZiB0aGUgY2xvc3VyZSBlbnRpdGllcy5cbiAqIENsb3N1cmUganVuY3Rpb24gdGFibGVzIGFyZSB0YWJsZXMgZ2VuZXJhdGVkIGJ5IGNsb3N1cmUgZW50aXRpZXMuXG4gKi9cbnZhciBDbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgRW50aXR5TWV0YWRhdGEgZm9yIHRoZSBjbG9zdXJlIGp1bmN0aW9uIG9mIHRoZSBnaXZlbiBjbG9zdXJlIGVudGl0eS5cbiAgICAgKi9cbiAgICBDbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBjcmVhdGUgZW50aXR5IG1ldGFkYXRhIGl0c2VsZlxuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSBuZXcgRW50aXR5TWV0YWRhdGEoe1xuICAgICAgICAgICAgcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucyAmJiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEudHJlZU9wdGlvbnMuY2xvc3VyZVRhYmxlTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5jbG9zdXJlVGFibGVOYW1lIDogcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJjbG9zdXJlLWp1bmN0aW9uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhbmNlc3RvciBhbmQgZGVzY2VuZGFudCBjb2x1bW5zIGZvciBuZXcgY2xvc3VyZSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY2xvc3VyZVR5cGU6IFwiYW5jZXN0b3JcIixcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uOiBwcmltYXJ5Q29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEudHJlZU9wdGlvbnMgJiYgcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRyZWVPcHRpb25zLmFuY2VzdG9yQ29sdW1uTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5hbmNlc3RvckNvbHVtbk5hbWUocHJpbWFyeUNvbHVtbikgOiBwcmltYXJ5Q29sdW1uLnByb3BlcnR5TmFtZSArIFwiX2FuY2VzdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHByaW1hcnlDb2x1bW4ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcHJpbWFyeUNvbHVtbi50eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLnB1c2gobmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjbG9zdXJlVHlwZTogXCJkZXNjZW5kYW50XCIsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbjogcHJpbWFyeUNvbHVtbixcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRyZWVPcHRpb25zICYmIHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5kZXNjZW5kYW50Q29sdW1uTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5kZXNjZW5kYW50Q29sdW1uTmFtZShwcmltYXJ5Q29sdW1uKSA6IHByaW1hcnlDb2x1bW4ucHJvcGVydHlOYW1lICsgXCJfZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBwcmltYXJ5Q29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHByaW1hcnlDb2x1bW4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSBbXG4gICAgICAgICAgICBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zWzBdXSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEluZGV4TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEub3duQ29sdW1uc1sxXV0sXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eU1ldGFkYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgICAgICAvLyBpZiB0cmVlIGxldmVsIGNvbHVtbiB3YXMgZGVmaW5lZCBieSBhIGNsb3N1cmUgZW50aXR5IHRoZW4gYWRkIGl0IHRvIHRoZSBqdW5jdGlvbiBjb2x1bW5zIGFzIHdlbGxcbiAgICAgICAgaWYgKHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlTGV2ZWxDb2x1bW4pIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IFwidmlydHVhbFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IFwibGV2ZWxcIixcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudHJlZUxldmVsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiB0YWJsZSBmb3JlaWduIGtleXNcbiAgICAgICAgLy8gTm90ZTogQ0FTQ0FERSBpcyBub3QgYXBwbGllZCB0byBtc3NxbCBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGkgY2FzY2FkZSBwYXRoc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyA9IFtcbiAgICAgICAgICAgIG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRW50aXR5TWV0YWRhdGE6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEub3duQ29sdW1uc1swXV0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbnM6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucyxcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciA/IFwiTk8gQUNUSU9OXCIgOiBcIkNBU0NBREVcIlxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9yZWlnbktleU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczogW2VudGl0eU1ldGFkYXRhLm93bkNvbHVtbnNbMV1dLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5zOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIgPyBcIk5PIEFDVElPTlwiIDogXCJDQVNDQURFXCJcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBTYXBEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NhcC9TYXBEcml2ZXJcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9Db2x1bW5NZXRhZGF0YVwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9JbmRleE1ldGFkYXRhXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEVtYmVkZGVkTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRW1iZWRkZWRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uSWRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uQ291bnRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGFVdGlscyB9IGZyb20gXCIuL01ldGFkYXRhVXRpbHNcIjtcbmltcG9ydCB7IEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyIH0gZnJvbSBcIi4vSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXJcIjtcbmltcG9ydCB7IENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuL0Nsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlclwiO1xuaW1wb3J0IHsgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL1JlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXJcIjtcbmltcG9ydCB7IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRW50aXR5TGlzdGVuZXJNZXRhZGF0YVwiO1xuaW1wb3J0IHsgVW5pcXVlTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvVW5pcXVlTWV0YWRhdGFcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgQ2hlY2tNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9DaGVja01ldGFkYXRhXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgRXhjbHVzaW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRXhjbHVzaW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQnVpbGRzIEVudGl0eU1ldGFkYXRhIG9iamVjdHMgYW5kIGFsbCBpdHMgc3ViLW1ldGFkYXRhcy5cbiAqL1xudmFyIEVudGl0eU1ldGFkYXRhQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24sIG1ldGFkYXRhQXJnc1N0b3JhZ2UpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlID0gbWV0YWRhdGFBcmdzU3RvcmFnZTtcbiAgICAgICAgdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciA9IG5ldyBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcihjb25uZWN0aW9uKTtcbiAgICAgICAgdGhpcy5jbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIgPSBuZXcgQ2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24pO1xuICAgICAgICB0aGlzLnJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgPSBuZXcgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlcihjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIGNvbXBsZXRlIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3Nlcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgZW50aXR5IGNsYXNzZXMgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IGFyZSBnaXZlbiB0aGVuIGRvIGZpbHRlcmluZywgb3RoZXJ3aXNlIHVzZSBhbGxcbiAgICAgICAgdmFyIGFsbFRhYmxlcyA9IGVudGl0eUNsYXNzZXMgPyB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyVGFibGVzKGVudGl0eUNsYXNzZXMpIDogdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLnRhYmxlcztcbiAgICAgICAgLy8gZmlsdGVyIG91dCB0YWJsZSBtZXRhZGF0YSBhcmdzIGZvciB0aG9zZSB3ZSByZWFsbHkgY3JlYXRlIGVudGl0eSBtZXRhZGF0YXMgYW5kIHRhYmxlcyBpbiB0aGUgZGJcbiAgICAgICAgdmFyIHJlYWxUYWJsZXMgPSBhbGxUYWJsZXMuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gdGFibGUudHlwZSA9PT0gXCJyZWd1bGFyXCIgfHwgdGFibGUudHlwZSA9PT0gXCJjbG9zdXJlXCIgfHwgdGFibGUudHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIiB8fCB0YWJsZS50eXBlID09PSBcInZpZXdcIjsgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBlbnRpdHkgbWV0YWRhdGFzIGZvciBhIHVzZXIgZGVmaW5lZCBlbnRpdGllcyAobWFya2VkIHdpdGggQEVudGl0eSBkZWNvcmF0b3Igb3IgbG9hZGVkIGZyb20gZW50aXR5IHNjaGVtYXMpXG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YXMgPSByZWFsVGFibGVzLm1hcChmdW5jdGlvbiAodGFibGVBcmdzKSB7IHJldHVybiBfdGhpcy5jcmVhdGVFbnRpdHlNZXRhZGF0YSh0YWJsZUFyZ3MpOyB9KTtcbiAgICAgICAgLy8gY29tcHV0ZSBwYXJlbnQgZW50aXR5IG1ldGFkYXRhcyBmb3IgdGFibGUgaW5oZXJpdGFuY2VcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5jb21wdXRlUGFyZW50RW50aXR5TWV0YWRhdGEoZW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyBhZnRlciBhbGwgbWV0YWRhdGFzIGNyZWF0ZWQgd2Ugc2V0IGNoaWxkIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRhYmxlIGluaGVyaXRhbmNlXG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuY2hpbGRFbnRpdHlNZXRhZGF0YXMgPSBlbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICYmIGNoaWxkTWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgJiYgTWV0YWRhdGFVdGlscy5pc0luaGVyaXRlZChjaGlsZE1ldGFkYXRhLnRhcmdldCwgbWV0YWRhdGEudGFyZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYnVpbGQgZW50aXR5IG1ldGFkYXRhIChzdGVwMCksIGZpcnN0IGZvciBub24tc2luZ2xlLXRhYmxlLWluaGVyaXRlZCBlbnRpdHkgbWV0YWRhdGFzIChkZXBlbmRhbnQpXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJlbnRpdHktY2hpbGRcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gZW50aXR5TWV0YWRhdGEuYnVpbGQoKTsgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGVudGl0eSBtZXRhZGF0YSAoc3RlcDApLCBub3cgZm9yIHNpbmdsZS10YWJsZS1pbmhlcml0ZWQgZW50aXR5IG1ldGFkYXRhcyAoZGVwZW5kYW50KVxuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7IH0pO1xuICAgICAgICAvLyBjb21wdXRlIGVudGl0eSBtZXRhZGF0YSBjb2x1bW5zLCByZWxhdGlvbnMsIGV0Yy4gZmlyc3QgZm9yIHRoZSByZWd1bGFyLCBub24tc2luZ2xlLXRhYmxlLWluaGVyaXRlZCBlbnRpdHkgbWV0YWRhdGFzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJlbnRpdHktY2hpbGRcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMuY29tcHV0ZUVudGl0eU1ldGFkYXRhU3RlcDEoZW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyB0aGVuIGRvIGl0IGZvciBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UgY2hpbGRyZW4gKHNpbmNlIHRoZXkgYXJlIGRlcGVuZCBvbiB0aGVpciBwYXJlbnRzIHRvIGJlIGJ1aWx0KVxuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAxKGVudGl0eU1ldGFkYXRhcywgZW50aXR5TWV0YWRhdGEpOyB9KTtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGVudGl0eSBtZXRhZGF0YSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCBhbGwgaXRzIHN1Yi1tZXRhZGF0YXNcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyBjYWxjdWxhdGUgZW50aXR5IG1ldGFkYXRhJ3MgaW52ZXJzZSBwcm9wZXJ0aWVzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMuY29tcHV0ZUludmVyc2VQcm9wZXJ0aWVzKGVudGl0eU1ldGFkYXRhLCBlbnRpdHlNZXRhZGF0YXMpOyB9KTtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgZW50aXR5IG1ldGFkYXRhcyBhbmQgY3JlYXRlIGZvcmVpZ24ga2V5cyAvIGp1bmN0aW9uIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZWlyIHJlbGF0aW9uc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgIT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBlbnRpdHkncyByZWxhdGlvbnMgam9pbiBjb2x1bW5zIChmb3IgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgb3duZXIpXG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb09uZSB8fCByZWxhdGlvbi5pc01hbnlUb09uZTsgfSkuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbnMgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckpvaW5Db2x1bW5zKHJlbGF0aW9uLnRhcmdldCwgcmVsYXRpb24ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5yZWxhdGlvbkpvaW5Db2x1bW5CdWlsZGVyLmJ1aWxkKGpvaW5Db2x1bW5zLCByZWxhdGlvbiksIGZvcmVpZ25LZXkgPSBfYS5mb3JlaWduS2V5LCBjb2x1bW5zID0gX2EuY29sdW1ucywgdW5pcXVlQ29uc3RyYWludCA9IF9hLnVuaXF1ZUNvbnN0cmFpbnQ7IC8vIGNyZWF0ZSBhIGZvcmVpZ24ga2V5IGJhc2VkIG9uIGl0cyBtZXRhZGF0YSBhcmdzXG4gICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucmVnaXN0ZXJGb3JlaWduS2V5cyhmb3JlaWduS2V5KTsgLy8gcHVzaCBpdCB0byB0aGUgcmVsYXRpb24gYW5kIHRodXMgcmVnaXN0ZXIgdGhlcmUgYSBqb2luIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cy5wdXNoKGZvcmVpZ25LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5yZWdpc3RlckpvaW5Db2x1bW5zKGNvbHVtbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHVuaXF1ZUNvbnN0cmFpbnQuZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogdW5pcXVlQ29uc3RyYWludC5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB1bmlxdWVDb25zdHJhaW50LnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdW5pcXVlQ29uc3RyYWludC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC53aGVyZSA9IGluZGV4LmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiIElTIE5PVCBOVUxMXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLmluZGljZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29tcHV0ZUVudGl0eU1ldGFkYXRhU3RlcDIoZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLnVuaXF1ZXMucHVzaCh1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLm93blVuaXF1ZXMucHVzaCh1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm9yZWlnbktleSAmJiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogcmVsYXRpb24uZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBmb3JlaWduS2V5LmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLmluZGljZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiBlbnRpdHkgbWV0YWRhdGFzIGZvciBlbnRpdHkgbWFueS10by1tYW55IHJlbGF0aW9uc1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueTsgfSkuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0gX3RoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSm9pblRhYmxlKHJlbGF0aW9uLnRhcmdldCwgcmVsYXRpb24ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBqb2luIHRhYmxlIHNldCAtIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKGl0IG1lYW5zIHRoaXMgaXMgbWFueS10by1tYW55IGludmVyc2Ugc2lkZSlcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGNyZWF0ZSBhIGp1bmN0aW9uIGVudGl0eSBtZXRhZGF0YSBmb3IgYSBuZXcganVuY3Rpb24gdGFibGUgb2YgbWFueS10by1tYW55IHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgdmFyIGp1bmN0aW9uRW50aXR5TWV0YWRhdGEgPSBfdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5idWlsZChyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgICAgICAgICByZWxhdGlvbi5yZWdpc3RlckZvcmVpZ25LZXlzLmFwcGx5KHJlbGF0aW9uLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoanVuY3Rpb25FbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgcmVsYXRpb24ucmVnaXN0ZXJKb2luQ29sdW1ucyhqdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bkluZGljZXNbMF0uY29sdW1ucywganVuY3Rpb25FbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzWzFdLmNvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uLnJlZ2lzdGVySnVuY3Rpb25FbnRpdHlNZXRhZGF0YShqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIG5ldyBlbnRpdHkgbWV0YWRhdGEgcHJvcGVydGllcyBhbmQgcHVzaCBpdCB0byBlbnRpdHkgbWV0YWRhdGFzIHBvb2xcbiAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlSW52ZXJzZVByb3BlcnRpZXMoanVuY3Rpb25FbnRpdHlNZXRhZGF0YSwgZW50aXR5TWV0YWRhdGFzKTtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YXMucHVzaChqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXBkYXRlIGVudGl0eSBtZXRhZGF0YSBkZXBlbmQgcHJvcGVydGllc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zV2l0aEpvaW5Db2x1bW5zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzV2l0aEpvaW5Db2x1bW47IH0pO1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuaGFzTm9uTnVsbGFibGVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuc29tZShmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuICFyZWxhdGlvbi5pc051bGxhYmxlIHx8IHJlbGF0aW9uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlcyBmb3IgYWxsIGNsb3N1cmUgdGFibGVzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobWV0YWRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIGNsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhID0gX3RoaXMuY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLmJ1aWxkKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlID0gY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihjbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICBfdGhpcy5jb21wdXRlSW52ZXJzZVByb3BlcnRpZXMoY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGEsIGVudGl0eU1ldGFkYXRhcyk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YXMucHVzaChjbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBrZXlzIGZvciB0YWJsZXMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2VcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEuaW5oZXJpdGFuY2VQYXR0ZXJuID09PSBcIlNUSVwiICYmIG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW47IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUtleXNGb3JUYWJsZUluaGVyaXRhbmNlKGVudGl0eU1ldGFkYXRhKTsgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGFsbCBpbmRpY2VzIChuZWVkIHRvIGRvIGl0IGFmdGVyIHJlbGF0aW9ucyBhbmQgdGhlaXIgam9pbiBjb2x1bW5zIGFyZSBidWlsdClcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBpbmRleC5idWlsZChfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5KTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBidWlsZCBhbGwgdW5pcXVlIGNvbnN0cmFpbnRzIChuZWVkIHRvIGRvIGl0IGFmdGVyIHJlbGF0aW9ucyBhbmQgdGhlaXIgam9pbiBjb2x1bW5zIGFyZSBidWlsdClcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS51bmlxdWVzLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gdW5pcXVlLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGFsbCBjaGVjayBjb25zdHJhaW50c1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNoZWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gY2hlY2suYnVpbGQoX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYnVpbGQgYWxsIGV4Y2x1c2lvbiBjb25zdHJhaW50c1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmV4Y2x1c2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXhjbHVzaW9uKSB7IHJldHVybiBleGNsdXNpb24uYnVpbGQoX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYWRkIGxhenkgaW5pdGlhbGl6ZXIgZm9yIGVudGl0eSByZWxhdGlvbnNcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb247IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5pc0xhenk7IH0pXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5yZWxhdGlvbkxvYWRlci5lbmFibGVMYXp5TG9hZChyZWxhdGlvbiwgZW50aXR5TWV0YWRhdGEudGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCB0YXJnZXQgPSBjb2x1bW4uZW1iZWRkZWRNZXRhZGF0YSA/IGNvbHVtbi5lbWJlZGRlZE1ldGFkYXRhLnR5cGUgOiBjb2x1bW4udGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0ZWQgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbmRHZW5lcmF0ZWQoY29sdW1uLnRhcmdldCwgY29sdW1uLnByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNHZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gZ2VuZXJhdGVkLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVkLnN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBcInV1aWRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZW5lcmF0ZWQuc3RyYXRlZ3kgPT09IFwicm93aWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBcImludFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBjb2x1bW4udHlwZSB8fCBOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihlbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW50aXR5TWV0YWRhdGFzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZW50aXR5IG1ldGFkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlIGFyZ3MuXG4gICAgICogQ3JlYXRlcyBjb2x1bW4sIHJlbGF0aW9uLCBldGMuIG1ldGFkYXRhcyBmb3IgZXZlcnl0aGluZyB0aGlzIGVudGl0eSBtZXRhZGF0YSBvd25zLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlRW50aXR5TWV0YWRhdGEgPSBmdW5jdGlvbiAodGFibGVBcmdzKSB7XG4gICAgICAgIC8vIHdlIHRha2UgYWxsIFwiaW5oZXJpdGFuY2UgdHJlZVwiIGZyb20gYSB0YXJnZXQgZW50aXR5IHRvIGNvbGxlY3QgYWxsIHN0b3JlZCBtZXRhZGF0YSBhcmdzXG4gICAgICAgIC8vIChieSBkZWNvcmF0b3JzIG9yIGluc2lkZSBlbnRpdHkgc2NoZW1hcykuIEZvciBleGFtcGxlIGZvciB0YXJnZXQgUG9zdCA8IENvbnRlbnRNb2RlbCA8IFVuaXRcbiAgICAgICAgLy8gaXQgd2lsbCBiZSBhbiBhcnJheSBvZiBbUG9zdCwgQ29udGVudE1vZGVsLCBVbml0XSBhbmQgd2UgY2FuIHRoZW4gZ2V0IGFsbCBtZXRhZGF0YSBhcmdzIG9mIHRob3NlIGNsYXNzZXNcbiAgICAgICAgdmFyIGluaGVyaXRhbmNlVHJlZSA9IHRhYmxlQXJncy50YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvblxuICAgICAgICAgICAgPyBNZXRhZGF0YVV0aWxzLmdldEluaGVyaXRhbmNlVHJlZSh0YWJsZUFyZ3MudGFyZ2V0KVxuICAgICAgICAgICAgOiBbdGFibGVBcmdzLnRhcmdldF07IC8vIHRvZG86IGltcGxlbWVudCBsYXRlciBoZXJlIGluaGVyaXRhbmNlIGZvciBzdHJpbmctdGFyZ2V0c1xuICAgICAgICB2YXIgdGFibGVJbmhlcml0YW5jZSA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSW5oZXJpdGFuY2VUeXBlKHRhYmxlQXJncy50YXJnZXQpO1xuICAgICAgICB2YXIgdGFibGVUcmVlID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbmRUcmVlKHRhYmxlQXJncy50YXJnZXQpO1xuICAgICAgICAvLyBpZiBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UgdXNlZCwgd2UgbmVlZCB0byBjb3B5IGFsbCBjaGlsZHJlbiBjb2x1bW5zIGluIHRvIHBhcmVudCB0YWJsZVxuICAgICAgICB2YXIgc2luZ2xlVGFibGVDaGlsZHJlblRhcmdldHM7XG4gICAgICAgIGlmICgodGFibGVJbmhlcml0YW5jZSAmJiB0YWJsZUluaGVyaXRhbmNlLnBhdHRlcm4gPT09IFwiU1RJXCIpIHx8IHRhYmxlQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiKSB7XG4gICAgICAgICAgICBzaW5nbGVUYWJsZUNoaWxkcmVuVGFyZ2V0cyA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZVxuICAgICAgICAgICAgICAgIC5maWx0ZXJTaW5nbGVUYWJsZUNoaWxkcmVuKHRhYmxlQXJncy50YXJnZXQpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gYXJncy50YXJnZXQ7IH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbjsgfSk7XG4gICAgICAgICAgICBpbmhlcml0YW5jZVRyZWUucHVzaC5hcHBseShpbmhlcml0YW5jZVRyZWUsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzaW5nbGVUYWJsZUNoaWxkcmVuVGFyZ2V0cyksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNZXRhZGF0YSh7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB0YWJsZUFyZ3MsXG4gICAgICAgICAgICBpbmhlcml0YW5jZVRyZWU6IGluaGVyaXRhbmNlVHJlZSxcbiAgICAgICAgICAgIHRhYmxlVHJlZTogdGFibGVUcmVlLFxuICAgICAgICAgICAgaW5oZXJpdGFuY2VQYXR0ZXJuOiB0YWJsZUluaGVyaXRhbmNlID8gdGFibGVJbmhlcml0YW5jZS5wYXR0ZXJuIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb21wdXRlUGFyZW50RW50aXR5TWV0YWRhdGEgPSBmdW5jdGlvbiAoYWxsRW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAvLyBhZnRlciBhbGwgbWV0YWRhdGFzIGNyZWF0ZWQgd2Ugc2V0IHBhcmVudCBlbnRpdHkgbWV0YWRhdGEgZm9yIHRhYmxlIGluaGVyaXRhbmNlXG4gICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhID0gYWxsRW50aXR5TWV0YWRhdGFzLmZpbmQoZnVuY3Rpb24gKGFsbEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbEVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5pbmRleE9mKGVudGl0eU1ldGFkYXRhLnRhcmdldCkgIT09IC0xICYmIGFsbEVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAxID0gZnVuY3Rpb24gKGFsbEVudGl0eU1ldGFkYXRhcywgZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlbnRpdHlJbmhlcml0YW5jZSA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSW5oZXJpdGFuY2VUeXBlKGVudGl0eU1ldGFkYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBkaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmluZERpc2NyaW1pbmF0b3JWYWx1ZShlbnRpdHlNZXRhZGF0YS50YXJnZXQpO1xuICAgICAgICBpZiAodHlwZW9mIGRpc2NyaW1pbmF0b3JWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlID0gZGlzY3JpbWluYXRvclZhbHVlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlID0gZW50aXR5TWV0YWRhdGEudGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIGlzIHVzZWQsIHdlIG5lZWQgdG8gbWFyayBhbGwgZW1iZWRkZWQgY29sdW1ucyBhcyBudWxsYWJsZVxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMgPSB0aGlzLmNyZWF0ZUVtYmVkZGVkc1JlY3Vyc2l2ZWx5KGVudGl0eU1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyRW1iZWRkZWRzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChlbWJlZGRlZCkge1xuICAgICAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIikge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkLmNvbHVtbnMgPSBlbWJlZGRlZC5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc051bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2VcbiAgICAgICAgICAgIC5maWx0ZXJDb2x1bW5zKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgY29sdW1ucyBjcmVhdGVkIGZvciB0aGVpciBwYXJlbnRzXG4gICAgICAgICAgICBpZiAoZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YSh7IGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIC8vIGlmIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSB1c2VkLCB3ZSBuZWVkIHRvIG1hcmsgYWxsIGluaGVyaXQgdGFibGUgY29sdW1ucyBhcyBudWxsYWJsZVxuICAgICAgICAgICAgdmFyIGNvbHVtbkluU2luZ2xlVGFibGVJbmhlcml0ZWRDaGlsZCA9IGFsbEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChvdGhlckVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBvdGhlckVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIiAmJiBvdGhlckVudGl0eU1ldGFkYXRhLnRhcmdldCA9PT0gYXJncy50YXJnZXQ7IH0pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluU2luZ2xlVGFibGVJbmhlcml0ZWRDaGlsZClcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNOdWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZm9yIHRhYmxlIGluaGVyaXRhbmNlIHdlIG5lZWQgdG8gYWRkIGEgZGlzY3JpbWluYXRvciBjb2x1bW5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGVudGl0eUluaGVyaXRhbmNlICYmIGVudGl0eUluaGVyaXRhbmNlLmNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEgPSBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4gJiYgZW50aXR5SW5oZXJpdGFuY2UuY29sdW1uLm5hbWUgPyBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4ubmFtZSA6IFwidHlwZVwiO1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gZGlzY3JpbWluYXRvckNvbHVtbk5hbWVfMTsgfSk7XG4gICAgICAgICAgICBpZiAoIWRpc2NyaW1pbmF0b3JDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yQ29sdW1uID0gbmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yQ29sdW1uLmlzVmlydHVhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGlzY3JpbWluYXRvckNvbHVtbi5pc0Rpc2NyaW1pbmF0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChkaXNjcmltaW5hdG9yQ29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3JDb2x1bW4uaXNEaXNjcmltaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgZGlzY3JpbWluYXRvciBjb2x1bW4gdG8gdGhlIGNoaWxkIGVudGl0eSBtZXRhZGF0YXNcbiAgICAgICAgLy8gZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBub3QgYmUgdGhlcmUgYXV0b21hdGljYWxseSBzaW5jZSB3ZSBhcmUgY3JlYXRpbmcgaXQgaW4gdGhlIGNvZGUgYWJvdmVcbiAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIikge1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW5fMSA9IGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEaXNjcmltaW5hdG9yOyB9KTtcbiAgICAgICAgICAgIGlmIChkaXNjcmltaW5hdG9yQ29sdW1uXzEgJiYgIWVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4gPT09IGRpc2NyaW1pbmF0b3JDb2x1bW5fMTsgfSkpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLnB1c2goZGlzY3JpbWluYXRvckNvbHVtbl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtaW5nU3RyYXRlZ3kgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3k7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRyZWUgaXMgdXNlZCB0aGVuIHdlIG5lZWQgdG8gYWRkIGV4dHJhIGNvbHVtbnMgZm9yIHNwZWNpZmljIHRyZWUgdHlwZXNcbiAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm1hdGVyaWFsaXplZC1wYXRoXCIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkUGF0aDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1wYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IC8qdHJlZS5jb2x1bW4gfHwgKi8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtaW5nU3RyYXRlZ3kubWF0ZXJpYWxpemVkUGF0aENvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudGl0eU1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm5lc3RlZC1zZXRcIikge1xuICAgICAgICAgICAgdmFyIF9kID0gbmFtaW5nU3RyYXRlZ3kubmVzdGVkU2V0Q29sdW1uTmFtZXMsIGxlZnQgPSBfZC5sZWZ0LCByaWdodCA9IF9kLnJpZ2h0O1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuZXN0ZWRTZXRMZWZ0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IFwidmlydHVhbFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGxlZnQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IC8qdHJlZS5jb2x1bW4gfHwgKi8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuZXN0ZWRTZXRSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByaWdodCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogLyp0cmVlLmNvbHVtbiB8fCAqLyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93blJlbGF0aW9ucyA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maWx0ZXJSZWxhdGlvbnMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgcmVsYXRpb25zIGNyZWF0ZWQgZm9yIHRoZWlyIHBhcmVudHNcbiAgICAgICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UmVsYXRpb24gPSBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5vd25SZWxhdGlvbnMuZmluZChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gYXJncy50eXBlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcmdzLnR5cGUoKSA6IGFyZ3MudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UmVsYXRpb24udHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHBhcmVudFJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFJlbGF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25JZHMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25JZHMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgcmVsYXRpb24gaWRzIGNyZWF0ZWQgZm9yIHRoZWlyIHBhcmVudHNcbiAgICAgICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhLnJlbGF0aW9uSWRzLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIHJlbGF0aW9uSWQucHJvcGVydHlOYW1lID09PSBhcmdzLnByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9uQ291bnRzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclJlbGF0aW9uQ291bnRzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2luZ2xlIHRhYmxlIGNoaWxkcmVuIHdlIHJldXNlIHJlbGF0aW9uIGNvdW50cyBjcmVhdGVkIGZvciB0aGVpciBwYXJlbnRzXG4gICAgICAgICAgICBpZiAoZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7IHJldHVybiByZWxhdGlvbkNvdW50LnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25MaXN0ZW5lcnMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyTGlzdGVuZXJzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5jaGVja3MgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyQ2hlY2tzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IFBvc3RncmVTUUwgc3VwcG9ydHMgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5leGNsdXNpb25zID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckV4Y2x1c2lvbnMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2x1c2lvbk1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBDb2Nrcm9hY2hEcml2ZXIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyhlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVRyZWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gIWFyZ3MudW5pcXVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciB1bmlxdWVzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckluZGljZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGFyZ3MpIHsgcmV0dXJuIGFyZ3MudW5pcXVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGFyZ3MudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXJncy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogYXJncy5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIChfYSA9IGVudGl0eU1ldGFkYXRhLm93blVuaXF1ZXMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh1bmlxdWVzKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyhlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVRyZWUpLm1hcChmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE15c3FsIGFuZCBTQVAgSEFOQSBzdG9yZXMgdW5pcXVlIGNvbnN0cmFpbnRzIGFzIHVuaXF1ZSBpbmRpY2VzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgIHZhciBpbmRpY2VzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclVuaXF1ZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogYXJncy50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhcmdzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBhcmdzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIChfYiA9IGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMpLnB1c2guYXBwbHkoX2IsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChpbmRpY2VzKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclVuaXF1ZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAoX2MgPSBlbnRpdHlNZXRhZGF0YS5vd25VbmlxdWVzKS5wdXNoLmFwcGx5KF9jLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodW5pcXVlcyksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZnJvbSB0aGUgZ2l2ZW4gZW1iZWRkZWQgbWV0YWRhdGEgYXJncyByZWFsIGVtYmVkZGVkIG1ldGFkYXRhcyB3aXRoIGl0cyBjb2x1bW5zIGFuZCByZWxhdGlvbnMsXG4gICAgICogYW5kIGRvZXMgdGhlIHNhbWUgZm9yIGFsbCBpdHMgc3ViLWVtYmVkZGVkcyAoZ29lcyByZWN1cnNpdmVseSkuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZHNSZWN1cnNpdmVseSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZW1iZWRkZWRBcmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBlbWJlZGRlZEFyZ3MubWFwKGZ1bmN0aW9uIChlbWJlZGRlZEFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gbmV3IEVtYmVkZGVkTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGVtYmVkZGVkQXJncyB9KTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRzID0gTWV0YWRhdGFVdGlscy5nZXRJbmhlcml0YW5jZVRyZWUoZW1iZWRkZWRNZXRhZGF0YS50eXBlKTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuY29sdW1ucyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyQ29sdW1ucyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHsgY29ubmVjdGlvbjogX3RoaXMuY29ubmVjdGlvbiwgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBlbWJlZGRlZE1ldGFkYXRhOiBlbWJlZGRlZE1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZE1ldGFkYXRhLnJlbGF0aW9ucyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25zKHRhcmdldHMpLm1hcChmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25NZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgZW1iZWRkZWRNZXRhZGF0YTogZW1iZWRkZWRNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZW1iZWRkZWRNZXRhZGF0YS5saXN0ZW5lcnMgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckxpc3RlbmVycyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGVtYmVkZGVkTWV0YWRhdGE6IGVtYmVkZGVkTWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuaW5kaWNlcyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGVtYmVkZGVkTWV0YWRhdGE6IGVtYmVkZGVkTWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEudW5pcXVlcyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyVW5pcXVlcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBlbWJlZGRlZE1ldGFkYXRhOiBlbWJlZGRlZE1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZE1ldGFkYXRhLnJlbGF0aW9uSWRzID0gX3RoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maWx0ZXJSZWxhdGlvbklkcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZW1iZWRkZWRNZXRhZGF0YS5yZWxhdGlvbkNvdW50cyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25Db3VudHModGFyZ2V0cykubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuZW1iZWRkZWRzID0gX3RoaXMuY3JlYXRlRW1iZWRkZWRzUmVjdXJzaXZlbHkoZW50aXR5TWV0YWRhdGEsIF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyRW1iZWRkZWRzKHRhcmdldHMpKTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuZW1iZWRkZWRzLmZvckVhY2goZnVuY3Rpb24gKHN1YkVtYmVkZGVkKSB7IHJldHVybiBzdWJFbWJlZGRlZC5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YTsgfSk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5hbGxFbWJlZGRlZHMucHVzaChlbWJlZGRlZE1ldGFkYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGFsbCBlbnRpdHkgbWV0YWRhdGEncyBjb21wdXRlZCBwcm9wZXJ0aWVzLCBhbmQgYWxsIGl0cyBzdWItbWV0YWRhdGFzIChyZWxhdGlvbnMsIGNvbHVtbnMsIGVtYmVkcywgZXRjKS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5mb3JFYWNoKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWQuYnVpbGQoX3RoaXMuY29ubmVjdGlvbik7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMuZm9yRWFjaChmdW5jdGlvbiAoZW1iZWRkZWQpIHtcbiAgICAgICAgICAgIGVtYmVkZGVkLmNvbHVtbnNGcm9tVHJlZS5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5idWlsZChfdGhpcy5jb25uZWN0aW9uKTsgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbnNGcm9tVHJlZS5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uYnVpbGQoKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24pOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duUmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5yZWxhdGlvbnNGcm9tVHJlZSk7IH0sIGVudGl0eU1ldGFkYXRhLm93blJlbGF0aW9ucyk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmVhZ2VyUmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzRWFnZXI7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5sYXp5UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTGF6eTsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm9uZVRvT25lUmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzT25lVG9PbmU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vbmVUb01hbnlSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb01hbnk7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5tYW55VG9PbmVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNNYW55VG9PbmU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5tYW55VG9NYW55UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueTsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bmVyT25lVG9PbmVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb09uZU93bmVyOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duZXJNYW55VG9NYW55UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueU93bmVyOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5pc1RyZWVQYXJlbnQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbiA9IGVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNUcmVlQ2hpbGRyZW47IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zID0gZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAoY29sdW1ucywgZW1iZWRkZWQpIHsgcmV0dXJuIGNvbHVtbnMuY29uY2F0KGVtYmVkZGVkLmNvbHVtbnNGcm9tVHJlZSk7IH0sIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMpO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5saXN0ZW5lcnMgPSBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChsaXN0ZW5lcnMsIGVtYmVkZGVkKSB7IHJldHVybiBsaXN0ZW5lcnMuY29uY2F0KGVtYmVkZGVkLmxpc3RlbmVyc0Zyb21UcmVlKTsgfSwgZW50aXR5TWV0YWRhdGEub3duTGlzdGVuZXJzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYWZ0ZXJMb2FkTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9MT0FEOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYWZ0ZXJJbnNlcnRMaXN0ZW5lcnMgPSBlbnRpdHlNZXRhZGF0YS5saXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIudHlwZSA9PT0gRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX0lOU0VSVDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmFmdGVyVXBkYXRlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9VUERBVEU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5hZnRlclJlbW92ZUxpc3RlbmVycyA9IGVudGl0eU1ldGFkYXRhLmxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lci50eXBlID09PSBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfUkVNT1ZFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlSW5zZXJ0TGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfSU5TRVJUOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlVXBkYXRlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfVVBEQVRFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfUkVNT1ZFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuaW5kaWNlcyA9IGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKGluZGljZXMsIGVtYmVkZGVkKSB7IHJldHVybiBpbmRpY2VzLmNvbmNhdChlbWJlZGRlZC5pbmRpY2VzRnJvbVRyZWUpOyB9LCBlbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudW5pcXVlcyA9IGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHVuaXF1ZXMsIGVtYmVkZGVkKSB7IHJldHVybiB1bmlxdWVzLmNvbmNhdChlbWJlZGRlZC51bmlxdWVzRnJvbVRyZWUpOyB9LCBlbnRpdHlNZXRhZGF0YS5vd25VbmlxdWVzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEubm9uVmlydHVhbENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiAhY29sdW1uLmlzVmlydHVhbDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmFuY2VzdG9yQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5jbG9zdXJlVHlwZSA9PT0gXCJhbmNlc3RvclwiOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGVzY2VuZGFudENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uY2xvc3VyZVR5cGUgPT09IFwiZGVzY2VuZGFudFwiOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cyA9IGVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDE7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNHZW5lcmF0ZWQgfHwgY29sdW1uLmlzT2JqZWN0SWQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5oYXNVVUlER2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc0dlbmVyYXRlZCB8fCBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIjsgfSkubGVuZ3RoID4gMDtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNDcmVhdGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNVcGRhdGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEZWxldGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudmVyc2lvbkNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNWZXJzaW9uOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEaXNjcmltaW5hdG9yOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudHJlZUxldmVsQ29sdW1uID0gZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1RyZWVMZXZlbDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm5lc3RlZFNldExlZnRDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzTmVzdGVkU2V0TGVmdDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uID0gZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc05lc3RlZFNldFJpZ2h0OyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNNYXRlcmlhbGl6ZWRQYXRoOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub2JqZWN0SWRDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzT2JqZWN0SWQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5LmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucHJvcGVydGllc01hcCA9IGVudGl0eU1ldGFkYXRhLmNyZWF0ZVByb3BlcnRpZXNNYXAoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25JZHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25JZCkgeyByZXR1cm4gcmVsYXRpb25JZC5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25Db3VudHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25Db3VudCkgeyByZXR1cm4gcmVsYXRpb25Db3VudC5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLmZvckVhY2goZnVuY3Rpb24gKGVtYmVkZGVkKSB7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbklkc0Zyb21UcmVlLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIHJlbGF0aW9uSWQuYnVpbGQoKTsgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbkNvdW50c0Zyb21UcmVlLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uQ291bnQpIHsgcmV0dXJuIHJlbGF0aW9uQ291bnQuYnVpbGQoKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgZW50aXR5IG1ldGFkYXRhJ3MgcmVsYXRpb25zIGludmVyc2Ugc2lkZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuY29tcHV0ZUludmVyc2VQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhLCBlbnRpdHlNZXRhZGF0YXMpIHtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBjb21wdXRlIGludmVyc2Ugc2lkZSAocmVsYXRlZCkgZW50aXR5IG1ldGFkYXRhcyBmb3IgYWxsIHJlbGF0aW9uIG1ldGFkYXRhc1xuICAgICAgICAgICAgdmFyIGludmVyc2VFbnRpdHlNZXRhZGF0YSA9IGVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnRhcmdldCA9PT0gcmVsYXRpb24udHlwZSB8fCAodHlwZW9mIHJlbGF0aW9uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgKG0udGFyZ2V0TmFtZSA9PT0gcmVsYXRpb24udHlwZSB8fCBtLmdpdmVuVGFibGVOYW1lID09PSByZWxhdGlvbi50eXBlKSk7IH0pO1xuICAgICAgICAgICAgaWYgKCFpbnZlcnNlRW50aXR5TWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBtZXRhZGF0YSBmb3IgXCIgKyBlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIiB3YXMgbm90IGZvdW5kLiBDaGVjayBpZiB5b3Ugc3BlY2lmaWVkIGEgY29ycmVjdCBlbnRpdHkgb2JqZWN0IGFuZCBpZiBpdCdzIGNvbm5lY3RlZCBpbiB0aGUgY29ubmVjdGlvbiBvcHRpb25zLlwiKTtcbiAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSA9IGludmVyc2VFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VTaWRlUHJvcGVydHlQYXRoID0gcmVsYXRpb24uYnVpbGRJbnZlcnNlU2lkZVByb3BlcnR5UGF0aCgpO1xuICAgICAgICAgICAgLy8gYW5kIGNvbXB1dGUgaW52ZXJzZSByZWxhdGlvbiBhbmQgbWFyayBpZiBpdCBoYXMgc3VjaFxuICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uID0gaW52ZXJzZUVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChmb3VuZFJlbGF0aW9uKSB7IHJldHVybiBmb3VuZFJlbGF0aW9uLnByb3BlcnR5UGF0aCA9PT0gcmVsYXRpb24uaW52ZXJzZVNpZGVQcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaW5kaWNlcyBmb3IgdGhlIHRhYmxlIG9mIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUtleXNGb3JUYWJsZUluaGVyaXRhbmNlID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmluZGljZXMucHVzaChuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbl0sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgdW5pcXVlOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL01pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3JcIjtcbmltcG9ydCB7IENpcmN1bGFyUmVsYXRpb25zRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ2lyY3VsYXJSZWxhdGlvbnNFcnJvclwiO1xuaW1wb3J0IHsgRGVwR3JhcGggfSBmcm9tIFwiLi4vdXRpbC9EZXBHcmFwaFwiO1xuaW1wb3J0IHsgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9EYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IE5vQ29ubmVjdGlvbk9wdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL05vQ29ubmVjdGlvbk9wdGlvbkVycm9yXCI7XG5pbXBvcnQgeyBJbml0aWFsaXplZFJlbGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yXCI7XG5pbXBvcnQgeyBBdXJvcmFEYXRhQXBpRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vLy8gdG9kbzogYWRkIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0YWJsZXMgd2l0aCB0aGUgc2FtZSBuYW1lXG4vLy8gdG9kbzogYWRkIGNoZWNrcyB3aGVuIGdlbmVyYXRlZCBjb2x1bW4gLyB0YWJsZSBuYW1lcyBhcmUgdG9vIGxvbmcgZm9yIHRoZSBzcGVjaWZpYyBkcml2ZXJcbi8vIHRvZG86IHR5cGUgaW4gZnVuY3Rpb24gdmFsaWRhdGlvbiwgaW52ZXJzZSBzaWRlIGZ1bmN0aW9uIHZhbGlkYXRpb25cbi8vIHRvZG86IGNoZWNrIG9uIGJ1aWxkIGZvciBkdXBsaWNhdGUgbmFtZXMsIHNpbmNlIG5hbWluZyBjaGVja2luZyB3YXMgcmVtb3ZlZCBmcm9tIE1ldGFkYXRhU3RvcmFnZVxuLy8gdG9kbzogZHVwbGljYXRlIG5hbWUgY2hlY2tpbmcgZm9yOiB0YWJsZSwgcmVsYXRpb24sIGNvbHVtbiwgaW5kZXgsIG5hbWluZyBzdHJhdGVneSwgam9pbiB0YWJsZXMvY29sdW1ucz9cbi8vIHRvZG86IGNoZWNrIGlmIG11bHRpcGxlIHRyZWUgcGFyZW50IG1ldGFkYXRhcyBpbiB2YWxpZGF0b3Jcbi8vIHRvZG86IHRyZWUgZGVjb3JhdG9ycyBjYW4gYmUgdXNlZCBvbmx5IG9uIGNsb3N1cmUgdGFibGUgKHZhbGlkYXRpb24pXG4vLyB0b2RvOiB0aHJvdyBlcnJvciBpZiBwYXJlbnQgdHJlZSBtZXRhZGF0YSB3YXMgbm90IHNwZWNpZmllZCBpbiBhIGNsb3N1cmUgdGFibGVcbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IHR5cGUgaW4gZnVuY3Rpb24gdmFsaWRhdGlvbiwgaW52ZXJzZSBzaWRlIGZ1bmN0aW9uIHZhbGlkYXRpb25cbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IGNoZWNrIG9uIGJ1aWxkIGZvciBkdXBsaWNhdGUgbmFtZXMsIHNpbmNlIG5hbWluZyBjaGVja2luZyB3YXMgcmVtb3ZlZCBmcm9tIE1ldGFkYXRhU3RvcmFnZVxuLy8gdG9kbzogTWV0YWRhdGFBcmdzU3RvcmFnZTogZHVwbGljYXRlIG5hbWUgY2hlY2tpbmcgZm9yOiB0YWJsZSwgcmVsYXRpb24sIGNvbHVtbiwgaW5kZXgsIG5hbWluZyBzdHJhdGVneSwgam9pbiB0YWJsZXMvY29sdW1ucz9cbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IGNoZWNrIGZvciBkdXBsaWNhdGUgdGFyZ2V0cyB0b28gc2luY2UgdGhpcyBjaGVjayBoYXMgYmVlbiByZW1vdmVkIHRvb1xuLy8gdG9kbzogY2hlY2sgaWYgcmVsYXRpb24gZGVjb3JhdG9yIGNvbnRhaW5zIHByaW1hcnk6IHRydWUgYW5kIG51bGxhYmxlOiB0cnVlXG4vLyB0b2RvOiBjaGVjayBjb2x1bW4gbGVuZ3RoLCBwcmVjaXNpb24uIHNjYWxlXG4vLyB0b2RvOiBNeVNRTCBpbmRleCBjYW4gYmUgdW5pcXVlIG9yIHNwYXRpYWwgb3IgZnVsbHRleHRcbi8qKlxuICogVmFsaWRhdGVzIGJ1aWx0IGVudGl0eSBtZXRhZGF0YXMuXG4gKi9cbnZhciBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBhbGwgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGVNYW55ID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhcywgZHJpdmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMudmFsaWRhdGUoZW50aXR5TWV0YWRhdGEsIGVudGl0eU1ldGFkYXRhcywgZHJpdmVyKTsgfSk7XG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXBlbmRlbmNpZXMoZW50aXR5TWV0YWRhdGFzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUVhZ2VyUmVsYXRpb25zKGVudGl0eU1ldGFkYXRhcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgYWxsRW50aXR5TWV0YWRhdGFzLCBkcml2ZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGFibGUgbWV0YWRhdGEgaGFzIGFuIGlkXG4gICAgICAgIGlmICghZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMubGVuZ3RoICYmICFlbnRpdHlNZXRhZGF0YS5pc0p1bmN0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IoZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAvLyB2YWxpZGF0ZSBpZiB0YWJsZSBpcyB1c2luZyBpbmhlcml0YW5jZSBpdCBoYXMgYSBkaXNjcmltaW5hdG9yXG4gICAgICAgIC8vIGFsc28gdmFsaWRhdGUgaWYgZGlzY3JpbWluYXRvciB2YWx1ZXMgYXJlIG5vdCBlbXB0eSBhbmQgbm90IHJlcGVhdGVkXG4gICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVBhdHRlcm4gPT09IFwiU1RJXCIgfHwgZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKSB7XG4gICAgICAgICAgICBpZiAoIWVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiB1c2luZyBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIGl0IHNob3VsZCBhbHNvIGhhdmUgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gRGlkIHlvdSBmb3JnZXQgdG8gcHV0IGRpc2NyaW1pbmF0b3IgY29sdW1uIG9wdGlvbnM/XCIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBoYXMgYW4gdW5kZWZpbmVkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIERpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgdmFyIHNhbWVEaXNjcmltaW5hdG9yVmFsdWVFbnRpdHlNZXRhZGF0YSA9IGFsbEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YSAhPT0gZW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgJiYgKG1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIiB8fCBtZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSA9PT0gZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlXG4gICAgICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5zb21lKGZ1bmN0aW9uIChwYXJlbnQpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5pbmRleE9mKHBhcmVudCkgIT09IC0xOyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNhbWVEaXNjcmltaW5hdG9yVmFsdWVFbnRpdHlNZXRhZGF0YSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiRW50aXRpZXMgXCIgKyBlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIgYW5kIFwiICsgc2FtZURpc2NyaW1pbmF0b3JWYWx1ZUVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBoYXZlIHRoZSBzYW1lIGRpc2NyaW1pbmF0b3IgdmFsdWVzLiBNYWtlIHN1cmUgdGhleSBhcmUgZGlmZmVyZW50IHdoaWxlIHVzaW5nIHRoZSBAQ2hpbGRFbnRpdHkgZGVjb3JhdG9yLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudC5yZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbkNvdW50LnJlbGF0aW9uLmlzT25lVG9PbmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlbGF0aW9uIGNvdW50IGNhbiBub3QgYmUgaW1wbGVtZW50ZWQgb24gTWFueVRvT25lIG9yIE9uZVRvT25lIHJlbGF0aW9ucy5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIShkcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRDb2x1bW4gPSBkcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIuc3VwcG9ydGVkRGF0YVR5cGVzLmluZGV4T2Yobm9ybWFsaXplZENvbHVtbikgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvcihjb2x1bW4sIG5vcm1hbGl6ZWRDb2x1bW4sIGRyaXZlci5vcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ubGVuZ3RoICYmIGRyaXZlci53aXRoTGVuZ3RoQ29sdW1uVHlwZXMuaW5kZXhPZihub3JtYWxpemVkQ29sdW1uKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXCIgKyBjb2x1bW4ucHJvcGVydHlOYW1lICsgXCIgb2YgRW50aXR5IFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiIGRvZXMgbm90IHN1cHBvcnQgbGVuZ3RoIHByb3BlcnR5LlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiICYmICFjb2x1bW4uZW51bSAmJiAhY29sdW1uLmVudW1OYW1lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIlxcXCIgb2YgRW50aXR5IFxcXCJcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgaXMgZGVmaW5lZCBhcyBlbnVtLCBidXQgbWlzc2luZyBcXFwiZW51bVxcXCIgb3IgXFxcImVudW1OYW1lXFxcIiBwcm9wZXJ0aWVzLlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICB2YXIgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc0dlbmVyYXRlZCAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIjsgfSk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFcnJvciBpbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBlbnRpdHkuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhdXRvLWluY3JlbWVudCBjb2x1bW4gaW4gTXlTcWwgdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvciBteXNxbCB3ZSBhcmUgYWJsZSB0byBub3QgZGVmaW5lIGEgZGVmYXVsdCBzZWxlY3RlZCBkYXRhYmFzZSwgaW5zdGVhZCBhbGwgZW50aXRpZXMgY2FuIGhhdmUgdGhlaXIgZGF0YWJhc2VcbiAgICAgICAgLy8gZGVmaW5lZCBpbiB0aGVpciBkZWNvcmF0b3JzLiBUbyBtYWtlIGV2ZXJ5dGhpbmcgd29yayBlaXRoZXIgYWxsIGVudGl0aWVzIG11c3QgaGF2ZSBkYXRhYmFzZSBkZWZpbmUgYW5kIHdlXG4gICAgICAgIC8vIGNhbiBsaXZlIHdpdGhvdXQgZGF0YWJhc2Ugc2V0IGluIHRoZSBjb25uZWN0aW9uIG9wdGlvbnMsIGVpdGhlciBkYXRhYmFzZSBpbiB0aGUgY29ubmVjdGlvbiBvcHRpb25zIG11c3QgYmUgc2V0XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhc1dpdGhEYXRhYmFzZSA9IGFsbEVudGl0eU1ldGFkYXRhcy5maWx0ZXIoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBtZXRhZGF0YS5kYXRhYmFzZTsgfSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFzV2l0aERhdGFiYXNlLmxlbmd0aCA9PT0gMCAmJiAhZHJpdmVyLmRhdGFiYXNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb0Nvbm5lY3Rpb25PcHRpb25FcnJvcihcImRhdGFiYXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgIHZhciBjaGFyc2V0Q29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5jaGFyc2V0OyB9KTtcbiAgICAgICAgICAgIGlmIChjaGFyc2V0Q29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDaGFyYWN0ZXIgc2V0IHNwZWNpZnlpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiBTcWwgU2VydmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlbGF0aW9ucyBhcmUgYWxsIHdpdGhvdXQgaW5pdGlhbGl6ZWQgcHJvcGVydGllc1xuICAgICAgICB2YXIgZW50aXR5SW5zdGFuY2UgPSBlbnRpdHlNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNNYW55VG9NYW55IHx8IHJlbGF0aW9uLmlzT25lVG9NYW55KSB7XG4gICAgICAgICAgICAgICAgLy8gd2Ugc2tpcCByZWxhdGlvbnMgZm9yIHdoaWNoIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkIHNpbmNlIGluaXRpYWxpemF0aW9uIGluIHRoZW0gY2Fubm90IGhhcm0gc29tZWhvd1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGVudGl0eSByZWxhdGlvbiB2YWx1ZSBhbmQgY2hlY2sgaWYgaXRzIGFuIGFycmF5XG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uSW5pdGlhbGl6ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eUluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbkluaXRpYWxpemVkVmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yKHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHZhbGlkYXRlIHJlbGF0aW9uc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGpvaW4gdGFibGVzOlxuICAgICAgICAgICAgLy8gdXNpbmcgSm9pblRhYmxlIGlzIHBvc3NpYmxlIG9ubHkgb24gb25lIHNpZGUgb2YgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvblxuICAgICAgICAgICAgLy8gdG9kbyhkaW1hKTogZml4XG4gICAgICAgICAgICAvLyBpZiAocmVsYXRpb24uam9pblRhYmxlKSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKCFyZWxhdGlvbi5pc01hbnlUb01hbnkpXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBVc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7XG4gICAgICAgICAgICAvLyAgICAgLy8gaWYgdGhlcmUgaXMgaW52ZXJzZSBzaWRlIG9mIHRoZSByZWxhdGlvbiwgdGhlbiBjaGVjayBpZiBpdCBkb2VzIG5vdCBoYXZlIGpvaW4gdGFibGUgdG9vXG4gICAgICAgICAgICAvLyAgICAgaWYgKHJlbGF0aW9uLmhhc0ludmVyc2VTaWRlICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luVGFibGUpXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBVc2luZ0pvaW5UYWJsZU9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGpvaW4gY29sdW1uczpcbiAgICAgICAgICAgIC8vIHVzaW5nIEpvaW5Db2x1bW4gaXMgcG9zc2libGUgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgcmVsYXRpb24gYW5kIG9uIG9uZS10by1vbmUsIG1hbnktdG8tb25lIHJlbGF0aW9uIHR5cGVzXG4gICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiByZWxhdGlvbiBpcyBvbmUtdG8tb25lIG9yIG1hbnktdG8tb25lXG4gICAgICAgICAgICAvLyB0b2RvKGRpbWEpOiBmaXhcbiAgICAgICAgICAgIC8qaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW4pIHtcblxuICAgICAgICAgICAgICAgIC8vIGpvaW4gY29sdW1uIGNhbiBiZSBhcHBsaWVkIG9ubHkgb24gb25lLXRvLW9uZSBhbmQgbWFueS10by1vbmUgcmVsYXRpb25zXG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5pc09uZVRvT25lICYmICFyZWxhdGlvbi5pc01hbnlUb09uZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBpbnZlcnNlIHNpZGUgb2YgdGhlIHJlbGF0aW9uLCB0aGVuIGNoZWNrIGlmIGl0IGRvZXMgbm90IGhhdmUgam9pbiB0YWJsZSB0b29cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSW52ZXJzZVNpZGUgJiYgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW4gJiYgcmVsYXRpb24uaXNPbmVUb09uZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKTtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGpvaW4gY29sdW1uIHJlYWxseSBoYXMgcmVmZXJlbmNlZCBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uam9pbkNvbHVtbiAmJiAhcmVsYXRpb24uam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKGBKb2luIGNvbHVtbiBkb2VzIG5vdCBoYXZlIHJlZmVyZW5jZWQgY29sdW1uIHNldGApO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGl0cyBhIG9uZS10by1vbmUgcmVsYXRpb24gYW5kIEpvaW5Db2x1bW4gaXMgbWlzc2luZyBvbiBib3RoIHNpZGVzIG9mIHRoZSByZWxhdGlvblxuICAgICAgICAgICAgLy8gb3IgaXRzIG9uZS1zaWRlIHJlbGF0aW9uIHdpdGhvdXQgSm9pbkNvbHVtbiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5qb2luQ29sdW1uICYmIHJlbGF0aW9uLmlzT25lVG9PbmUgJiYgKCFyZWxhdGlvbi5oYXNJbnZlcnNlU2lkZSB8fCAhcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW4pKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nSm9pbkNvbHVtbkVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7Ki9cbiAgICAgICAgICAgIC8vIGlmIGl0cyBhIG1hbnktdG8tbWFueSByZWxhdGlvbiBhbmQgSm9pblRhYmxlIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiB0aGUgcmVsYXRpb25cbiAgICAgICAgICAgIC8vIG9yIGl0cyBvbmUtc2lkZSByZWxhdGlvbiB3aXRob3V0IEpvaW5UYWJsZSB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvclxuICAgICAgICAgICAgLy8gdG9kbyhkaW1hKTogZml4IGl0XG4gICAgICAgICAgICAvLyBpZiAoIXJlbGF0aW9uLmpvaW5UYWJsZSAmJiByZWxhdGlvbi5pc01hbnlUb01hbnkgJiYgKCFyZWxhdGlvbi5oYXNJbnZlcnNlU2lkZSB8fCAhcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5UYWJsZSkpXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IE1pc3NpbmdKb2luVGFibGVFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pO1xuICAgICAgICAgICAgLy8gdG9kbzogdmFsaWRhdGUgaWYgaXRzIG9uZS10by1vbmUgYW5kIHNpZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBqb2luIGNvbHVtbiBNVVNUIGhhdmUgaW52ZXJzZSBzaWRlXG4gICAgICAgICAgICAvLyB0b2RvOiB2YWxpZGF0ZSBpZiBpdHMgbWFueS10by1tYW55IGFuZCBzaWRlIHdoaWNoIGRvZXMgbm90IGhhdmUgam9pbiB0YWJsZSBNVVNUIGhhdmUgaW52ZXJzZSBzaWRlXG4gICAgICAgICAgICAvLyB0b2RvOiBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uLCBhbmQgaW52ZXJzZSBzaWRlIGlzIHNwZWNpZmllZCBvbmx5IG9uIG9uZSBzaWRlLCBzaGFsbCB3ZSBnaXZlIGVycm9yXG4gICAgICAgICAgICAvLyB0b2RvOiB3aXRoIG1lc3NhZ2UgbGlrZTogXCJJbnZlcnNlIHNpZGUgaXMgc3BlY2lmaWVkIG9ubHkgb24gb25lIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gU3BlY2lmeSBvbiBvdGhlciBzaWRlIHRvbyB0byBwcmV2ZW50IGNvbmZ1c2lvblwiLlxuICAgICAgICAgICAgLy8gdG9kbzogYWRkIHZhbGlkYXRpb24gaWYgdGhlcmUgdHdvIGVudGl0aWVzIHdpdGggdGhlIHNhbWUgdGFyZ2V0LCBhbmQgc2hvdyBlcnJvciBtZXNzYWdlIHdpdGggZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gKG1heWJlIGZpbGUgd2FzIHJlbmFtZWQvbW92ZWQgYnV0IGxlZnQgaW4gb3V0cHV0IGRpcmVjdG9yeSlcbiAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2x1bW5zIG9uIHRoZSBzYW1lIGNvbHVtbiBhcHBsaWVkLlxuICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgY29sdW1uIHR5cGUgaWYgaXMgbWlzc2luZyBpbiByZWxhdGlvbmFsIGRhdGFiYXNlcyAodGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgQ29sdW1uIHR5cGUgb2YgJHt0eXBlfSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5gKTspXG4gICAgICAgICAgICAvLyB0b2RvOiBpbmNsdWRlIGRyaXZlci1zcGVjaWZpYyBjaGVja3MuIGZvciBleGFtcGxlIGluIG1vbmdvZGIgZW1wdHkgcHJlZml4ZXMgYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgICAvLyB0b2RvOiBpZiBtdWx0aXBsZSBjb2x1bW5zIHdpdGggc2FtZSBuYW1lIC0gdGhyb3cgZXhjZXB0aW9uLCBpbmNsdWRpbmcgY2FzZXMgd2hlbiBjb2x1bW5zIGFyZSBpbiBlbWJlZHMgd2l0aCBzYW1lIHByZWZpeGVzIG9yIHdpdGhvdXQgcHJlZml4IGF0IGFsbFxuICAgICAgICAgICAgLy8gdG9kbzogaWYgbXVsdGlwbGUgcHJpbWFyeSBrZXkgdXNlZCwgYXQgbGVhc3Qgb25lIG9mIHRoZW0gbXVzdCBiZSB1bmlxdWUgb3IgQEluZGV4IGRlY29yYXRvciBtdXN0IGJlIHNldCBvbiBlbnRpdHlcbiAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGlmIGVudGl0eSB3aXRoIGR1cGxpY2F0ZSBuYW1lcywgc29tZSBkZWNvcmF0b3JzIGV4aXN0XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtYWtlIHN1cmUgY2FzY2FkZSByZW1vdmUgaXMgbm90IHNldCBmb3IgYm90aCBzaWRlcyBvZiByZWxhdGlvbnNoaXBzIChjYW4gYmUgc2V0IGluIE9uZVRvT25lIGRlY29yYXRvcnMpXG4gICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIGlzQ2lyY3VsYXJDYXNjYWRlUmVtb3ZlID0gcmVsYXRpb24uaXNDYXNjYWRlUmVtb3ZlICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiAmJiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaXNDYXNjYWRlUmVtb3ZlO1xuICAgICAgICAgICAgaWYgKGlzQ2lyY3VsYXJDYXNjYWRlUmVtb3ZlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgYm90aCBoYXMgY2FzY2FkZSByZW1vdmUgc2V0LiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiVGhpcyBtYXkgbGVhZCB0byB1bmV4cGVjdGVkIGNpcmN1bGFyIHJlbW92YWxzLiBQbGVhc2Ugc2V0IGNhc2NhZGUgcmVtb3ZlIG9ubHkgZnJvbSBvbmUgc2lkZSBvZiByZWxhdGlvbnNoaXAuXCIpO1xuICAgICAgICB9KTsgLy8gdG9kbzogbWF5YmUgYmV0dGVyIGp1c3QgZGVueSByZW1vdmFsIGZyb20gb25lIHRvIG9uZSByZWxhdGlvbiB3aXRob3V0IGpvaW4gY29sdW1uP1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBkZXBlbmRlbmNpZXMgb2YgdGhlIGVudGl0eSBtZXRhZGF0YXMuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhcykge1xuICAgICAgICB2YXIgZ3JhcGggPSBuZXcgRGVwR3JhcGgoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBncmFwaC5hZGROb2RlKGVudGl0eU1ldGFkYXRhLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gIXJlbGF0aW9uLmlzTnVsbGFibGU7IH0pXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGguYWRkRGVwZW5kZW5jeShlbnRpdHlNZXRhZGF0YS5uYW1lLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBncmFwaC5vdmVyYWxsT3JkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2lyY3VsYXJSZWxhdGlvbnNFcnJvcihlcnIudG9TdHJpbmcoKS5yZXBsYWNlKFwiRXJyb3I6IERlcGVuZGVuY3kgQ3ljbGUgRm91bmQ6IFwiLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBlYWdlciByZWxhdGlvbnMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGluIHRoZW0uXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlRWFnZXJSZWxhdGlvbnMgPSBmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGFzKSB7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZWFnZXJSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pc0VhZ2VyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2lyY3VsYXIgZWFnZXIgcmVsYXRpb25zIGFyZSBkaXNhbGxvd2VkLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAoZW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCIgY29udGFpbnMgXFxcImVhZ2VyOiB0cnVlXFxcIiwgYW5kIGl0cyBpbnZlcnNlIHNpZGUgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiI1wiICsgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLnByb3BlcnR5UGF0aCArIFwiIGNvbnRhaW5zIFxcXCJlYWdlcjogdHJ1ZVxcXCIgYXMgd2VsbC5cIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgUmVtb3ZlIFxcXCJlYWdlcjogdHJ1ZVxcXCIgZnJvbSBvbmUgc2lkZSBvZiB0aGUgcmVsYXRpb24uXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yO1xufSgpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU1ldGFkYXRhVmFsaWRhdG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgRm9yZWlnbktleU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0ZvcmVpZ25LZXlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9JbmRleE1ldGFkYXRhXCI7XG5pbXBvcnQgeyBBdXJvcmFEYXRhQXBpRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9vcmFjbGUvT3JhY2xlRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBFbnRpdHlNZXRhZGF0YSBmb3IganVuY3Rpb24gdGFibGVzLlxuICogSnVuY3Rpb24gdGFibGVzIGFyZSB0YWJsZXMgZ2VuZXJhdGVkIGJ5IG1hbnktdG8tbWFueSByZWxhdGlvbnMuXG4gKi9cbnZhciBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIEVudGl0eU1ldGFkYXRhIGZvciB0aGUganVuY3Rpb24gb2YgdGhlIGdpdmVuIG1hbnktdG8tbWFueSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAocmVsYXRpb24sIGpvaW5UYWJsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSB0aGlzLmNvbGxlY3RSZWZlcmVuY2VkQ29sdW1ucyhyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgdmFyIGludmVyc2VSZWZlcmVuY2VkQ29sdW1ucyA9IHRoaXMuY29sbGVjdEludmVyc2VSZWZlcmVuY2VkQ29sdW1ucyhyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgdmFyIGpvaW5UYWJsZU5hbWUgPSBqb2luVGFibGUubmFtZSB8fCB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlTmFtZShyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWVXaXRob3V0UHJlZml4LCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lV2l0aG91dFByZWZpeCwgcmVsYXRpb24ucHJvcGVydHlQYXRoLCByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gPyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lIDogXCJcIik7XG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YSA9IG5ldyBFbnRpdHlNZXRhZGF0YSh7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5UYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJqdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBqb2luVGFibGUuZGF0YWJhc2UgfHwgcmVsYXRpb24uZW50aXR5TWV0YWRhdGEuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBqb2luVGFibGUuc2NoZW1hIHx8IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnNjaGVtYSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBvcmlnaW5hbCBzaWRlIGp1bmN0aW9uIGNvbHVtbnNcbiAgICAgICAgdmFyIGp1bmN0aW9uQ29sdW1ucyA9IHJlZmVyZW5jZWRDb2x1bW5zLm1hcChmdW5jdGlvbiAocmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuam9pbkNvbHVtbnMgPyBqb2luVGFibGUuam9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbkFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9PT0gcmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICEham9pbkNvbHVtbkFyZ3MubmFtZTtcbiAgICAgICAgICAgIH0pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBqb2luQ29sdW1uICYmIGpvaW5Db2x1bW4ubmFtZSA/IGpvaW5Db2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luVGFibGVDb2x1bW5OYW1lKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsIHJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lLCByZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uOiByZWZlcmVuY2VkQ29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAhcmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJlZmVyZW5jZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIiB8fCByZWZlcmVuY2VkQ29sdW1uLnR5cGUgPT09IFwidXVpZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZlcmVuY2VkQ29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByZWZlcmVuY2VkQ29sdW1uLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcmVmZXJlbmNlZENvbHVtbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiByZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiByZWZlcmVuY2VkQ29sdW1uLnNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogcmVmZXJlbmNlZENvbHVtbi5jaGFyc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGF0aW9uOiByZWZlcmVuY2VkQ29sdW1uLmNvbGxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiByZWZlcmVuY2VkQ29sdW1uLnplcm9maWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQ6IHJlZmVyZW5jZWRDb2x1bW4uemVyb2ZpbGwgPyB0cnVlIDogcmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW06IHJlZmVyZW5jZWRDb2x1bW4uZW51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lOiByZWZlcmVuY2VkQ29sdW1uLmVudW1OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY3JlYXRlIGludmVyc2Ugc2lkZSBqdW5jdGlvbiBjb2x1bW5zXG4gICAgICAgIHZhciBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zID0gaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zLm1hcChmdW5jdGlvbiAoaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciBqb2luQ29sdW1uID0gam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucyA/IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbkFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9PT0gaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAhIWpvaW5Db2x1bW5BcmdzLm5hbWU7XG4gICAgICAgICAgICB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lID0gam9pbkNvbHVtbiAmJiBqb2luQ29sdW1uLm5hbWUgPyBqb2luQ29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICA6IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlSW52ZXJzZUNvbHVtbk5hbWUocmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsIGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZSwgaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW46IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6ICFpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJ1dWlkXCIgfHwgaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIjM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmNoYXJzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXRpb246IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmNvbGxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCA/IHRydWUgOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW06IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmVudW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZTogaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4uZW51bU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEdXBsaWNhdGVkQ29sdW1uTmFtZXMoanVuY3Rpb25Db2x1bW5zLCBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKTtcbiAgICAgICAgLy8gc2V0IGp1bmN0aW9uIHRhYmxlIGNvbHVtbnNcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duZXJDb2x1bW5zID0ganVuY3Rpb25Db2x1bW5zO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5pbnZlcnNlQ29sdW1ucyA9IGludmVyc2VKdW5jdGlvbkNvbHVtbnM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChqdW5jdGlvbkNvbHVtbnMpLCBmYWxzZSksIF9fcmVhZChpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKSwgZmFsc2UpO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEgPSByZWxhdGlvbjsgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiB0YWJsZSBmb3JlaWduIGtleXNcbiAgICAgICAgLy8gTm90ZTogVVBEQVRFIENBU0NBREUgY2xhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gT3JhY2xlLlxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyA9IHJlbGF0aW9uLmNyZWF0ZUZvcmVpZ25LZXlDb25zdHJhaW50cyA/IFtcbiAgICAgICAgICAgIG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGp1bmN0aW9uQ29sdW1ucyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uczogcmVmZXJlbmNlZENvbHVtbnMsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IHJlbGF0aW9uLm9uRGVsZXRlIHx8IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyID8gXCJOTyBBQ1RJT05cIiA6IHJlbGF0aW9uLm9uVXBkYXRlIHx8IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9yZWlnbktleU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczogaW52ZXJzZUp1bmN0aW9uQ29sdW1ucyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uczogaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zLFxuICAgICAgICAgICAgICAgIG9uRGVsZXRlOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gPyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ub25EZWxldGUgOiBcIkNBU0NBREVcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlclxuICAgICAgICAgICAgICAgICAgICA/IFwiTk8gQUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLm9uVXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF0gOiBbXTtcbiAgICAgICAgLy8gY3JlYXRlIGp1bmN0aW9uIHRhYmxlIGluZGljZXNcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duSW5kaWNlcyA9IFtcbiAgICAgICAgICAgIG5ldyBJbmRleE1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczoganVuY3Rpb25Db2x1bW5zLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGludmVyc2VKdW5jdGlvbkNvbHVtbnMsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eU1ldGFkYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgICAgICAvLyBmaW5hbGx5IHJldHVybiBlbnRpdHkgbWV0YWRhdGFcbiAgICAgICAgcmV0dXJuIGVudGl0eU1ldGFkYXRhO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIHJlZmVyZW5jZWQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBqb2luIGNvbHVtbiBhcmdzLlxuICAgICAqL1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb2xsZWN0UmVmZXJlbmNlZENvbHVtbnMgPSBmdW5jdGlvbiAocmVsYXRpb24sIGpvaW5UYWJsZSkge1xuICAgICAgICB2YXIgaGFzQW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luVGFibGUuam9pbkNvbHVtbnMgPyBqb2luVGFibGUuam9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gISFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWpvaW5UYWJsZS5qb2luQ29sdW1ucyB8fCAoam9pblRhYmxlLmpvaW5Db2x1bW5zICYmICFoYXNBbnlSZWZlcmVuY2VkQ29sdW1uTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luVGFibGUuam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW4gPSByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2VkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVmZXJlbmNlZCBjb2x1bW4gXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lICsgXCIgd2FzIG5vdCBmb3VuZCBpbiBlbnRpdHkgXCIgKyByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBpbnZlcnNlIHJlZmVyZW5jZWQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBqb2luIGNvbHVtbiBhcmdzLlxuICAgICAqL1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb2xsZWN0SW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBqb2luVGFibGUpIHtcbiAgICAgICAgdmFyIGhhc0ludmVyc2VKb2luQ29sdW1ucyA9ICEham9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucztcbiAgICAgICAgdmFyIGhhc0FueUludmVyc2VSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGhhc0ludmVyc2VKb2luQ29sdW1ucyA/IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gISFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWhhc0ludmVyc2VKb2luQ29sdW1ucyB8fCAoaGFzSW52ZXJzZUpvaW5Db2x1bW5zICYmICFoYXNBbnlJbnZlcnNlUmVmZXJlbmNlZENvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW4gPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eU5hbWUgPT09IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVmZXJlbmNlZENvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlZmVyZW5jZWQgY29sdW1uIFwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uTmFtZSArIFwiIHdhcyBub3QgZm91bmQgaW4gZW50aXR5IFwiICsgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkQ29sdW1uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jaGFuZ2VEdXBsaWNhdGVkQ29sdW1uTmFtZXMgPSBmdW5jdGlvbiAoanVuY3Rpb25Db2x1bW5zLCBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGp1bmN0aW9uQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChqdW5jdGlvbkNvbHVtbikge1xuICAgICAgICAgICAgaW52ZXJzZUp1bmN0aW9uQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnZlcnNlSnVuY3Rpb25Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoanVuY3Rpb25Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgPT09IGludmVyc2VKdW5jdGlvbkNvbHVtbi5naXZlbkRhdGFiYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIganVuY3Rpb25Db2x1bW5OYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luVGFibGVDb2x1bW5EdXBsaWNhdGlvblByZWZpeChqdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUsIDEpO1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUgPSBqdW5jdGlvbkNvbHVtbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQ29sdW1uLmdpdmVuRGF0YWJhc2VOYW1lID0ganVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW52ZXJzZUp1bmN0aW9uQ29sdW1uTmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlQ29sdW1uRHVwbGljYXRpb25QcmVmaXgoaW52ZXJzZUp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGludmVyc2VKdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUgPSBpbnZlcnNlSnVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSnVuY3Rpb25Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgPSBpbnZlcnNlSnVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1KdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogTWV0YWRhdGEgYXJncyB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqL1xudmFyIE1ldGFkYXRhVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWV0YWRhdGFVdGlscygpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBnaXZlbidzIGVudGl0eSBhbGwgaW5oZXJpdGVkIGNsYXNzZXMuXG4gICAgICogR2l2ZXMgaW4gb3JkZXIgZnJvbSBwYXJlbnRzIHRvIGNoaWxkcmVuLlxuICAgICAqIEZvciBleGFtcGxlIFBvc3QgZXh0ZW5kcyBDb250ZW50TW9kZWwgd2hpY2ggZXh0ZW5kcyBVbml0IGl0IHdpbGwgZ2l2ZVxuICAgICAqIFtVbml0LCBDb250ZW50TW9kZWwsIFBvc3RdXG4gICAgICovXG4gICAgTWV0YWRhdGFVdGlscy5nZXRJbmhlcml0YW5jZVRyZWUgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHZhciB0cmVlID0gW2VudGl0eV07XG4gICAgICAgIHZhciBnZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgICAgICAgICAgaWYgKHByb3RvICYmIHByb3RvLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0cmVlLnB1c2gocHJvdG8pO1xuICAgICAgICAgICAgICAgIGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YoZW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyB0YWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBhbm90aGVyIHRhYmxlLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVXRpbHMuaXNJbmhlcml0ZWQgPSBmdW5jdGlvbiAodGFyZ2V0MSwgdGFyZ2V0Mikge1xuICAgICAgICByZXR1cm4gdGFyZ2V0MS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0YXJnZXQyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmlsdGVycyBnaXZlbiBhcnJheSBvZiB0YXJnZXRzIGJ5IGEgZ2l2ZW4gY2xhc3Nlcy5cbiAgICAgKiBJZiBjbGFzc2VzIGFyZSBub3QgZ2l2ZW4sIHRoZW4gaXQgcmV0dXJucyBhcnJheSBpdHNlbGYuXG4gICAgICovXG4gICAgTWV0YWRhdGFVdGlscy5maWx0ZXJCeVRhcmdldCA9IGZ1bmN0aW9uIChhcnJheSwgY2xhc3Nlcykge1xuICAgICAgICBpZiAoIWNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0udGFyZ2V0ICYmIGNsYXNzZXMuaW5kZXhPZihpdGVtLnRhcmdldCkgIT09IC0xOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBNZXRhZGF0YVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IE1ldGFkYXRhVXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFVdGlscy5qcy5tYXBcbiIsImltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGFcIjtcbmltcG9ydCB7IFVuaXF1ZU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1VuaXF1ZU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5TWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRm9yZWlnbktleU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQnVpbGRzIGpvaW4gY29sdW1uIGZvciB0aGUgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgb3duZXIgcmVsYXRpb25zLlxuICpcbiAqIENhc2VzIGl0IHNob3VsZCBjb3ZlcjpcbiAqIDEuIHdoZW4gam9pbiBjb2x1bW4gaXMgc2V0IHdpdGggY3VzdG9tIG5hbWUgYW5kIHdpdGhvdXQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZVxuICogd2UgbmVlZCBhdXRvbWF0aWNhbGx5IHNldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIC0gcHJpbWFyeSBpZHMgYnkgZGVmYXVsdFxuICogQEpvaW5Db2x1bW4oeyBuYW1lOiBcImN1c3RvbV9uYW1lXCIgfSlcbiAqXG4gKiAyLiB3aGVuIGpvaW4gY29sdW1uIGlzIHNldCB3aXRoIG9ubHkgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZVxuICogd2UgbmVlZCBhdXRvbWF0aWNhbGx5IHNldCBqb2luIGNvbHVtbiBuYW1lIC0gcmVsYXRpb24gbmFtZSArIHJlZmVyZW5jZWQgY29sdW1uIG5hbWVcbiAqIEBKb2luQ29sdW1uKHsgcmVmZXJlbmNlZENvbHVtbk5hbWU6IFwidGl0bGVcIiB9KVxuICpcbiAqIDMuIHdoZW4gam9pbiBjb2x1bW4gaXMgc2V0IHdpdGhvdXQgYm90aCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFuZCBqb2luIGNvbHVtbiBuYW1lXG4gKiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0IGJvdGggb2YgdGhlbVxuICogQEpvaW5Db2x1bW4oKVxuICpcbiAqIDQuIHdoZW4gam9pbiBjb2x1bW4gaXMgbm90IHNldCBhdCBhbGwgKGFzIGluIGNhc2Ugb2YgQE1hbnlUb09uZSByZWxhdGlvbilcbiAqIHdlIG5lZWQgdG8gY3JlYXRlIGpvaW4gY29sdW1uIGZvciBpdCB3aXRoIHByb3BlciByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFuZCBqb2luIGNvbHVtbiBuYW1lXG4gKlxuICogNS4gd2hlbiBtdWx0aXBsZSBqb2luIGNvbHVtbnMgc2V0IG5vbmUgb2YgcmVmZXJlbmNlZENvbHVtbk5hbWUgYW5kIG5hbWUgY2FuIGJlIG9wdGlvbmFsXG4gKiBib3RoIG9wdGlvbnMgYXJlIHJlcXVpcmVkXG4gKiBASm9pbkNvbHVtbihbXG4gKiAgICAgIHsgbmFtZTogXCJjYXRlZ29yeV90aXRsZVwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZTogXCJ0eXBlXCIgfSxcbiAqICAgICAgeyBuYW1lOiBcImNhdGVnb3J5X3RpdGxlXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBcIm5hbWVcIiB9LFxuICogXSlcbiAqXG4gKiBTaW5jZSBmb3IgbWFueS10by1vbmUgcmVsYXRpb25zIGhhdmluZyBKb2luQ29sdW1uIGRlY29yYXRvciBpcyBub3QgcmVxdWlyZWQsXG4gKiB3ZSBuZWVkIHRvIGdvIHRob3VnaHQgZWFjaCBtYW55LXRvLW9uZSByZWxhdGlvbiB3aXRob3V0IGpvaW4gY29sdW1uIGRlY29yYXRvciBzZXRcbiAqIGFuZCBjcmVhdGUgam9pbiBjb2x1bW4gbWV0YWRhdGEgYXJncyBmb3IgdGhlbS5cbiAqL1xudmFyIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgZm9yZWlnbiBrZXkgb2YgdGhlIG1hbnktdG8tb25lIG9yIG9uZS10by1vbmUgb3duZXIgcmVsYXRpb25zLlxuICAgICAqL1xuICAgIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSB0aGlzLmNvbGxlY3RSZWZlcmVuY2VkQ29sdW1ucyhqb2luQ29sdW1ucywgcmVsYXRpb24pO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sbGVjdENvbHVtbnMoam9pbkNvbHVtbnMsIHJlbGF0aW9uLCByZWZlcmVuY2VkQ29sdW1ucyk7XG4gICAgICAgIGlmICghcmVmZXJlbmNlZENvbHVtbnMubGVuZ3RoIHx8ICFyZWxhdGlvbi5jcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMpXG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiB1bmRlZmluZWQsIGNvbHVtbnM6IGNvbHVtbnMsIHVuaXF1ZUNvbnN0cmFpbnQ6IHVuZGVmaW5lZCB9OyAvLyB0aGlzIGNhc2UgaXMgcG9zc2libGUgZm9yIG9uZS10by1vbmUgbm9uIG93bmluZyBzaWRlIGFuZCByZWxhdGlvbnMgd2l0aCBjcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMgPSBmYWxzZVxuICAgICAgICB2YXIgZm9yZWlnbktleSA9IG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBuYW1pbmdTdHJhdGVneTogdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LFxuICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5zOiByZWZlcmVuY2VkQ29sdW1ucyxcbiAgICAgICAgICAgIG9uRGVsZXRlOiByZWxhdGlvbi5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiByZWxhdGlvbi5vblVwZGF0ZSxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IHJlbGF0aW9uLmRlZmVycmFibGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPcmFjbGUgZG9lcyBub3QgYWxsb3cgYm90aCBwcmltYXJ5IGFuZCB1bmlxdWUgY29uc3RyYWludHMgb24gdGhlIHNhbWUgY29sdW1uXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyICYmIGNvbHVtbnMuZXZlcnkoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSkpXG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiBmb3JlaWduS2V5LCBjb2x1bW5zOiBjb2x1bW5zLCB1bmlxdWVDb25zdHJhaW50OiB1bmRlZmluZWQgfTtcbiAgICAgICAgLy8gQ29ja3JvYWNoREIgcmVxdWlyZXMgVU5JUVVFIGNvbnN0cmFpbnRzIG9uIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgICAgICBpZiAocmVmZXJlbmNlZENvbHVtbnMubGVuZ3RoID4gMCAmJiByZWxhdGlvbi5pc09uZVRvT25lKSB7XG4gICAgICAgICAgICB2YXIgdW5pcXVlQ29uc3RyYWludCA9IG5ldyBVbmlxdWVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGZvcmVpZ25LZXkuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5yZWxhdGlvbkNvbnN0cmFpbnROYW1lKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgZm9yZWlnbktleS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5kYXRhYmFzZU5hbWU7IH0pKSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50LmJ1aWxkKHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7XG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiBmb3JlaWduS2V5LCBjb2x1bW5zOiBjb2x1bW5zLCB1bmlxdWVDb25zdHJhaW50OiB1bmlxdWVDb25zdHJhaW50IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9yZWlnbktleTogZm9yZWlnbktleSwgY29sdW1uczogY29sdW1ucywgdW5pcXVlQ29uc3RyYWludDogdW5kZWZpbmVkIH07XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ29sbGVjdHMgcmVmZXJlbmNlZCBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGpvaW4gY29sdW1uIGFyZ3MuXG4gICAgICovXG4gICAgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5wcm90b3R5cGUuY29sbGVjdFJlZmVyZW5jZWRDb2x1bW5zID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgaGFzQW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChqb2luQ29sdW1uQXJncykgeyByZXR1cm4gISFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsgfSk7XG4gICAgICAgIHZhciBtYW55VG9PbmVXaXRob3V0Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmxlbmd0aCA9PT0gMCAmJiByZWxhdGlvbi5pc01hbnlUb09uZTtcbiAgICAgICAgdmFyIGhhc0pvaW5Db2x1bW5XaXRob3V0QW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1ucy5sZW5ndGggPiAwICYmICFoYXNBbnlSZWZlcmVuY2VkQ29sdW1uTmFtZTtcbiAgICAgICAgaWYgKG1hbnlUb09uZVdpdGhvdXRKb2luQ29sdW1uIHx8IGhhc0pvaW5Db2x1bW5XaXRob3V0QW55UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsgLy8gY292ZXJzIGNhc2UzIGFuZCBjYXNlMVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gY2FzZXMgd2l0aCByZWZlcmVuY2VkIGNvbHVtbnMgZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ucHJvcGVydHlOYW1lID09PSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KTsgLy8gdG9kbzogY2FuIHdlIGFsc28gc2VhcmNoIGluIHJlbGF0aW9ucz9cbiAgICAgICAgICAgICAgICBpZiAoIXJlZmVyZW5jZWRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWZlcmVuY2VkIGNvbHVtbiBcIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWUgKyBcIiB3YXMgbm90IGZvdW5kIGluIGVudGl0eSBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGpvaW4gY29sdW1uIGFyZ3MuXG4gICAgICovXG4gICAgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5wcm90b3R5cGUuY29sbGVjdENvbHVtbnMgPSBmdW5jdGlvbiAoam9pbkNvbHVtbnMsIHJlbGF0aW9uLCByZWZlcmVuY2VkQ29sdW1ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbnMubWFwKGZ1bmN0aW9uIChyZWZlcmVuY2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiByZWxhdGlvbiBoYXMgam9pbiBjb2x1bW4gd2l0aCBvbmx5IG5hbWUgc2V0IHdlIG5lZWQgdGhpcyBjaGVja1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW5NZXRhZGF0YUFyZyA9IGpvaW5Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lIHx8IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWUgPT09IHJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAhIWpvaW5Db2x1bW4ubmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW5OYW1lID0gam9pbkNvbHVtbk1ldGFkYXRhQXJnID8gam9pbkNvbHVtbk1ldGFkYXRhQXJnLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5OYW1lKHJlbGF0aW9uLnByb3BlcnR5TmFtZSwgcmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uYWxDb2x1bW4gPSByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZSA9PT0gam9pbkNvbHVtbk5hbWU7IH0pO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbmFsQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHJlbGF0aW9uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBqb2luQ29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByZWZlcmVuY2VkQ29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAhcmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVmZXJlbmNlZENvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiIHx8IHJlZmVyZW5jZWRDb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmZXJlbmNlZENvbHVtbi5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlZmVyZW5jZWRDb2x1bW4ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogcmVmZXJlbmNlZENvbHVtbi5jaGFyc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogcmVmZXJlbmNlZENvbHVtbi5jb2xsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiByZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogcmVmZXJlbmNlZENvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvZmlsbDogcmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDogcmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiByZWZlcmVuY2VkQ29sdW1uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bTogcmVmZXJlbmNlZENvbHVtbi5lbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lOiByZWZlcmVuY2VkQ29sdW1uLmVudW1OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IHJlbGF0aW9uLmlzUHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZTogcmVsYXRpb24uaXNOdWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnJlZ2lzdGVyQ29sdW1uKHJlbGF0aW9uYWxDb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbi5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsgLy8gaXRzIGltcG9ydGFudCB0byBzZXQgaXQgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gc2V0IHJlZmVyZW5jZWQgY29sdW1uIGZvciB1c2VyIGRlZmluZWQgam9pbiBjb2x1bW5cbiAgICAgICAgICAgIHJlbGF0aW9uYWxDb2x1bW4udHlwZSA9IHJlZmVyZW5jZWRDb2x1bW4udHlwZTsgLy8gYWxzbyBzaW5jZSB0eXBlcyBvZiByZWxhdGlvbmFsIGNvbHVtbiBhbmQgam9pbiBjb2x1bW4gbXVzdCBiZSBlcXVhbCB3ZSBvdmVycmlkZSB1c2VyIGRlZmluZWQgY29sdW1uIHR5cGVcbiAgICAgICAgICAgIHJlbGF0aW9uYWxDb2x1bW4ucmVsYXRpb25NZXRhZGF0YSA9IHJlbGF0aW9uO1xuICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbi5idWlsZChfdGhpcy5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbmFsQ29sdW1uO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbkpvaW5Db2x1bW5CdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogQ2hlY2sgbWV0YWRhdGEgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRhYmxlJ3MgY2hlY2sgY29uc3RyYWludHMuXG4gKi9cbnZhciBDaGVja01ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQ2hlY2tNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBvcHRpb25zLmFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5OYW1lID0gb3B0aW9ucy5hcmdzLm5hbWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgY2hlY2sgY29uc3RyYWludCBwcm9wZXJ0aWVzLlxuICAgICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBlbnRpdHkgbWV0YWRhdGEncyBwcm9wZXJ0aWVzIG1hcCwgY29sdW1ucyBhbmQgcmVsYXRpb25zIGFyZSBidWlsdC5cbiAgICAgKi9cbiAgICBDaGVja01ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChuYW1pbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdpdmVuTmFtZSA/IHRoaXMuZ2l2ZW5OYW1lIDogbmFtaW5nU3RyYXRlZ3kuY2hlY2tDb25zdHJhaW50TmFtZSh0aGlzLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gQ2hlY2tNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBDaGVja01ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoZWNrTWV0YWRhdGEuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9tb25nb2RiL01vbmdvRHJpdmVyXCI7XG5pbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclwiO1xuaW1wb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9IGZyb20gXCIuLi91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnNcIjtcbi8qKlxuICogVGhpcyBtZXRhZGF0YSBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgY29sdW1uLlxuICovXG52YXIgQ29sdW1uTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb2x1bW5NZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBlJ3MgbGVuZ3RoIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBhIHByaW1hcnkga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBnZW5lcmF0ZWQgKGF1dG8gaW5jcmVtZW50IG9yIGdlbmVyYXRlZCBvdGhlciB3YXkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0dlbmVyYXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBjYW4gY29udGFpbiBudWxscyBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgc2VsZWN0ZWQgYnkgcXVlcnkgYnVpbGRlciBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgaW5zZXJ0ZWQgYnkgZGVmYXVsdCBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5zZXJ0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gYWxsb3dzIHVwZGF0ZXMgb3Igbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFpFUk9GSUxMIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqIElmIHlvdSBzcGVjaWZ5IFpFUk9GSUxMIGZvciBhIG51bWVyaWMgY29sdW1uLCBNeVNRTCBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIFVOU0lHTkVEIGF0dHJpYnV0ZSB0byB0aGUgY29sdW1uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnplcm9maWxsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFVOU0lHTkVEIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuc2lnbmVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBjb2x1bW4gaXMgYW4gYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgdmlydHVhbC4gVmlydHVhbCBjb2x1bW5zIGFyZSBub3QgbWFwcGVkIHRvIHRoZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVmlydHVhbCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBpcyBkaXNjcmltaW5hdG9yLiBEaXNjcmltaW5hdG9yIGNvbHVtbnMgYXJlIG5vdCBtYXBwZWQgdG8gdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNEaXNjcmltaW5hdG9yID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29sdW1uIGlzIHRyZWUtbGV2ZWwgY29sdW1uLiBUcmVlLWxldmVsIGNvbHVtbnMgYXJlIHVzZWQgaW4gY2xvc3VyZSBlbnRpdGllcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmVlTGV2ZWwgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBlbnRpdHkgY3JlYXRpb24gZGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDcmVhdGVEYXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBjb2x1bW4gY29udGFpbnMgYW4gZW50aXR5IHVwZGF0ZSBkYXRlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZURhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBlbnRpdHkgZGVsZXRlIGRhdGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzRGVsZXRlRGF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29sdW1uIGNvbnRhaW5zIGFuIGVudGl0eSB2ZXJzaW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1ZlcnNpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBvYmplY3QgaWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzT2JqZWN0SWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBuZXN0ZWQgc2V0J3MgbGVmdCBjb2x1bW4uXG4gICAgICAgICAqIFVzZWQgb25seSBpbiB0cmVlIGVudGl0aWVzIHdpdGggbmVzdGVkLXNldCB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc05lc3RlZFNldExlZnQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBuZXN0ZWQgc2V0J3MgcmlnaHQgY29sdW1uLlxuICAgICAgICAgKiBVc2VkIG9ubHkgaW4gdHJlZSBlbnRpdGllcyB3aXRoIG5lc3RlZC1zZXQgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNOZXN0ZWRTZXRSaWdodCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29sdW1uIGlzIG1hdGVyaWFsaXplZCBwYXRoJ3MgcGF0aCBjb2x1bW4uXG4gICAgICAgICAqIFVzZWQgb25seSBpbiB0cmVlIGVudGl0aWVzIHdpdGggbWF0ZXJpYWxpemVkIHBhdGggdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNNYXRlcmlhbGl6ZWRQYXRoID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVtYmVkZGVkTWV0YWRhdGEgPSBvcHRpb25zLmVtYmVkZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZENvbHVtbiA9IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy50YXJnZXQpXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMubmFtZSlcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5EYXRhYmFzZU5hbWUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5uYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMudHlwZSlcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnR5cGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmxlbmd0aCA/IG9wdGlvbnMuYXJncy5vcHRpb25zLmxlbmd0aC50b1N0cmluZygpIDogXCJcIjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLndpZHRoKVxuICAgICAgICAgICAgdGhpcy53aWR0aCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLndpZHRoO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuY2hhcnNldClcbiAgICAgICAgICAgIHRoaXMuY2hhcnNldCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNoYXJzZXQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5jb2xsYXRpb24pXG4gICAgICAgICAgICB0aGlzLmNvbGxhdGlvbiA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNvbGxhdGlvbjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnByaW1hcnkpXG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnByaW1hcnk7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0ID09PSBudWxsKSAvLyB0byBtYWtlIHN1cmUgZGVmYXVsdDogbnVsbCBpcyB0aGUgc2FtZSBhcyBudWxsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLm51bGxhYmxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5udWxsYWJsZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnNlbGVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc1NlbGVjdCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnNlbGVjdDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmluc2VydCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc0luc2VydCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmluc2VydDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnVwZGF0ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnVwZGF0ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmlzVXBkYXRlID0gIW9wdGlvbnMuYXJncy5vcHRpb25zLnJlYWRvbmx5O1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuY29tbWVudClcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNvbW1lbnQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMub25VcGRhdGUpXG4gICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMub25VcGRhdGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5zY2FsZSAhPT0gbnVsbCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnNjYWxlO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuemVyb2ZpbGwpIHtcbiAgICAgICAgICAgIHRoaXMuemVyb2ZpbGwgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy56ZXJvZmlsbDtcbiAgICAgICAgICAgIHRoaXMudW5zaWduZWQgPSB0cnVlOyAvLyBpZiB5b3Ugc3BlY2lmeSBaRVJPRklMTCBmb3IgYSBudW1lcmljIGNvbHVtbiwgTXlTUUwgYXV0b21hdGljYWxseSBhZGRzIHRoZSBVTlNJR05FRCBhdHRyaWJ1dGUgdG8gdGhlIGNvbHVtblxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy51bnNpZ25lZClcbiAgICAgICAgICAgIHRoaXMudW5zaWduZWQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy51bnNpZ25lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnByZWNpc2lvbiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMucHJlY2lzaW9uO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudW0gPSBPYmplY3Qua2V5cyhvcHRpb25zLmFyZ3Mub3B0aW9ucy5lbnVtKVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbnVtZXJpYyBrZXlzIC0gdHlwZXNjcmlwdCBudW1lcmljIGVudW0gdHlwZXMgZ2VuZXJhdGUgdGhlbVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIHRoZSBkb2N1bWVudGF0aW9uOiDigJxkZWNsYXJhdGlvbiBtZXJnaW5n4oCdIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIG1lcmdlcyB0d28gc2VwYXJhdGUgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHdpdGggdGhlIHNhbWUgbmFtZSBpbnRvIGEgc2luZ2xlIGRlZmluaXRpb24uIFRoaXMgY29uY2VwdCBpcyBvZnRlbiB1c2VkIHRvIG1lcmdlIGVudW0gd2l0aCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgaW4gbmFtZXNwYWNlIHdlIGRlZmluZSBlLmcuIHV0aWxpdHkgbWV0aG9kcyBmb3IgY3JlYXRpbmcgZW51bS4gVGhpcyBpcyB3ZWxsIGtub3duIGluIG90aGVyIGxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIEphdmEgKGVudW0gbWV0aG9kcykuIEhlcmUgaW4gY2FzZSBpZiBlbnVtIGhhdmUgZnVuY3Rpb24sIHdlIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gbWV0YWRhdGEsIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZWQgU1FMIHN0YXRlbWVudHMgY29udGFpbnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gd2hpY2ggbGVhZHMgaW50byBzeW50YXggZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYXQgZGF0YWJhc2Ugc2lkZS5cbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBpc05hTigra2V5KSAmJiB0eXBlb2Ygb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bVtrZXldICE9PSBcImZ1bmN0aW9uXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bVtrZXldOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW51bSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW1OYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudW1OYW1lID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmFzRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5hc0V4cHJlc3Npb24gPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5hc0V4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFR5cGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5nZW5lcmF0ZWRUeXBlID8gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZ2VuZXJhdGVkVHlwZSA6IFwiVklSVFVBTFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgICAgICAgdGhpcy5oc3RvcmVUeXBlID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuaHN0b3JlVHlwZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmFycmF5KVxuICAgICAgICAgICAgdGhpcy5pc0FycmF5ID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuYXJyYXk7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3MubW9kZSkge1xuICAgICAgICAgICAgdGhpcy5pc1ZpcnR1YWwgPSBvcHRpb25zLmFyZ3MubW9kZSA9PT0gXCJ2aXJ0dWFsXCI7XG4gICAgICAgICAgICB0aGlzLmlzVHJlZUxldmVsID0gb3B0aW9ucy5hcmdzLm1vZGUgPT09IFwidHJlZUxldmVsXCI7XG4gICAgICAgICAgICB0aGlzLmlzQ3JlYXRlRGF0ZSA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcImNyZWF0ZURhdGVcIjtcbiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVEYXRlID0gb3B0aW9ucy5hcmdzLm1vZGUgPT09IFwidXBkYXRlRGF0ZVwiO1xuICAgICAgICAgICAgdGhpcy5pc0RlbGV0ZURhdGUgPSBvcHRpb25zLmFyZ3MubW9kZSA9PT0gXCJkZWxldGVEYXRlXCI7XG4gICAgICAgICAgICB0aGlzLmlzVmVyc2lvbiA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcInZlcnNpb25cIjtcbiAgICAgICAgICAgIHRoaXMuaXNPYmplY3RJZCA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcIm9iamVjdElkXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnRyYW5zZm9ybWVyO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuc3BhdGlhbEZlYXR1cmVUeXBlKVxuICAgICAgICAgICAgdGhpcy5zcGF0aWFsRmVhdHVyZVR5cGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcGF0aWFsRmVhdHVyZVR5cGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcmlkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLnNyaWQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcmlkO1xuICAgICAgICBpZiAodGhpcy5pc1RyZWVMZXZlbClcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLnRyZWVMZXZlbDtcbiAgICAgICAgaWYgKHRoaXMuaXNDcmVhdGVEYXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudHlwZSlcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jcmVhdGVEYXRlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuY3JlYXRlRGF0ZURlZmF1bHQ7IH07XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jcmVhdGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuY3JlYXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZURhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLnVwZGF0ZURhdGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdClcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy51cGRhdGVEYXRlRGVmYXVsdDsgfTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vblVwZGF0ZSlcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudXBkYXRlRGF0ZURlZmF1bHQ7XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy51cGRhdGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudXBkYXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RlbGV0ZURhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLmRlbGV0ZURhdGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNOdWxsYWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5kZWxldGVEYXRlTnVsbGFibGU7XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5kZWxldGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuZGVsZXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1ZlcnNpb24pXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy52ZXJzaW9uO1xuICAgICAgICBpZiAob3B0aW9ucy5jbG9zdXJlVHlwZSlcbiAgICAgICAgICAgIHRoaXMuY2xvc3VyZVR5cGUgPSBvcHRpb25zLmNsb3N1cmVUeXBlO1xuICAgICAgICBpZiAob3B0aW9ucy5uZXN0ZWRTZXRMZWZ0KVxuICAgICAgICAgICAgdGhpcy5pc05lc3RlZFNldExlZnQgPSBvcHRpb25zLm5lc3RlZFNldExlZnQ7XG4gICAgICAgIGlmIChvcHRpb25zLm5lc3RlZFNldFJpZ2h0KVxuICAgICAgICAgICAgdGhpcy5pc05lc3RlZFNldFJpZ2h0ID0gb3B0aW9ucy5uZXN0ZWRTZXRSaWdodDtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF0ZXJpYWxpemVkUGF0aClcbiAgICAgICAgICAgIHRoaXMuaXNNYXRlcmlhbGl6ZWRQYXRoID0gb3B0aW9ucy5tYXRlcmlhbGl6ZWRQYXRoO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZW50aXR5IGlkIG1hcCBmcm9tIHRoZSBnaXZlbiBlbnRpdHkgaWRzIGFycmF5LlxuICAgICAqL1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGVWYWx1ZU1hcCA9IGZ1bmN0aW9uICh2YWx1ZSwgdXNlRGF0YWJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHVzZURhdGFiYXNlTmFtZSA9PT0gdm9pZCAwKSB7IHVzZURhdGFiYXNlTmFtZSA9IGZhbHNlOyB9XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZXhhbXBsZTogcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdLmlkIHdoZXJlIFwiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIgYW5kIFwiY291bnRlcnNcIiBhcmUgZW1iZWRkZWRzXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCB2YWx1ZSBvZiBcImlkXCIgY29sdW1uIGZyb20gdGhlIHBvc3QgcmVhbCBlbnRpdHkgb2JqZWN0IGFuZCByZXR1cm4gaXQgaW4gYVxuICAgICAgICAgICAgLy8geyBkYXRhOiB7IGluZm9ybWF0aW9uOiB7IGNvdW50ZXJzOiB7IGlkOiAuLi4gfSB9IH0gfSBmb3JtYXRcbiAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXAgLSB3ZSBleHRyYWN0IGFsbCBwYXJlbnQgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoaXMgY29sdW1uLCBlLmcuIFtkYXRhLCBpbmZvcm1hdGlvbiwgY291bnRlcnNdXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcyksIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIG5vdyBuZWVkIHRvIGFjY2VzcyBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10gdG8gZ2V0IGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBjb3VudGVyc1xuICAgICAgICAgICAgLy8gYW5kIG9uIGVhY2ggc3RlcCB3ZSBuZWVkIHRvIGNyZWF0ZSBjb21wbGV4IGxpdGVyYWwgb2JqZWN0LCBlLmcuIGZpcnN0IHsgZGF0YSB9LFxuICAgICAgICAgICAgLy8gdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb24gfSB9LCB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVycyB9IH0gfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uOiB7IGNvdW50ZXJzOiBbdGhpcy5wcm9wZXJ0eU5hbWVdOiBlbnRpdHlbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXVt0aGlzLnByb3BlcnR5TmFtZV0gfSB9IH1cbiAgICAgICAgICAgIC8vIHRoaXMgcmVjdXJzaXZlIGZ1bmN0aW9uIGhlbHBzIGRvaW5nIHRoYXRcbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZXMsIG1hcCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBbcHJvcGVydHlOYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xKHByb3BlcnR5TmFtZXMsIG1hcFtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBidWdmaXggZm9yICM3MjAgd2hlbiBpbmNyZW1lbnQgbnVtYmVyIGlzIGJpZ2ludCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdHMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAoKF90aGlzLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBfdGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwicm93aWRcIikgJiYgX3RoaXMudHlwZSA9PT0gXCJiaWdpbnRcIiAmJiB2YWx1ZSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgIG1hcFt1c2VEYXRhYmFzZU5hbWUgPyBfdGhpcy5kYXRhYmFzZU5hbWUgOiBfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMShwcm9wZXJ0eU5hbWVzLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgLy8gdGhpcyBpcyBidWdmaXggZm9yICM3MjAgd2hlbiBpbmNyZW1lbnQgbnVtYmVyIGlzIGJpZ2ludCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdHMgYSBzdHJpbmdcbiAgICAgICAgICAgIGlmICgodGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIgfHwgdGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwicm93aWRcIikgJiYgdGhpcy50eXBlID09PSBcImJpZ2ludFwiICYmIHZhbHVlICE9PSBudWxsKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBfYSA9IHt9LCBfYVt1c2VEYXRhYmFzZU5hbWUgPyB0aGlzLmRhdGFiYXNlTmFtZSA6IHRoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlLCBfYTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29sdW1uIHZhbHVlIGFuZCByZXR1cm5zIGl0cyBjb2x1bW4gbmFtZSB3aXRoIHRoaXMgdmFsdWUgaW4gYSBsaXRlcmFsIG9iamVjdC5cbiAgICAgKiBJZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWQgKG9yIHJlY3Vyc2l2ZSBlbWJlZGRlZCkgaXQgcmV0dXJucyBjb21wbGV4IGxpdGVyYWwgb2JqZWN0LlxuICAgICAqXG4gICAgICogRXhhbXBsZXMgd2hhdCB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIGRlcGVuZCBpZiB0aGlzIGNvbHVtbiBpcyBpbiBlbWJlZHMuXG4gICAgICogeyBpZDogMSB9IG9yIHsgdGl0bGU6IFwiaGVsbG9cIiB9LCB7IGNvdW50ZXJzOiB7IGNvZGU6IDEgfSB9LCB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnM6IHsgY29kZTogMSB9IH0gfSB9XG4gICAgICovXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmdldEVudGl0eVZhbHVlTWFwID0gZnVuY3Rpb24gKGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmV0dXJuTnVsbHMgPSBmYWxzZTsgLy8gb3B0aW9ucyAmJiBvcHRpb25zLnNraXBOdWxscyA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7IC8vIHRvZG86IHJlbW92ZSBpZiBjdXJyZW50IHdpbGwgbm90IGJyaW5nIHByb2JsZW1zLCB1bmNvbW1lbnQgaWYgaXQgd2lsbC5cbiAgICAgICAgLy8gZXh0cmFjdCBjb2x1bW4gdmFsdWUgZnJvbSBlbWJlZHMgb2YgZW50aXR5IGlmIGNvbHVtbiBpcyBpbiBlbWJlZGRlZFxuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAvLyBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZGRlZHNcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHZhbHVlIG9mIFwiaWRcIiBjb2x1bW4gZnJvbSB0aGUgcG9zdCByZWFsIGVudGl0eSBvYmplY3QgYW5kIHJldHVybiBpdCBpbiBhXG4gICAgICAgICAgICAvLyB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnM6IHsgaWQ6IC4uLiB9IH0gfSB9IGZvcm1hdFxuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWVzID0gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGlzRW1iZWRkZWRBcnJheV8xID0gdGhpcy5lbWJlZGRlZE1ldGFkYXRhLmlzQXJyYXk7XG4gICAgICAgICAgICAvLyBub3cgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdIHRvIGdldCBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgY291bnRlcnNcbiAgICAgICAgICAgIC8vIGFuZCBvbiBlYWNoIHN0ZXAgd2UgbmVlZCB0byBjcmVhdGUgY29tcGxleCBsaXRlcmFsIG9iamVjdCwgZS5nLiBmaXJzdCB7IGRhdGEgfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uIH0gfSwgdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnMgfSB9IH0sXG4gICAgICAgICAgICAvLyB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogW3RoaXMucHJvcGVydHlOYW1lXTogZW50aXR5W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdIH0gfSB9XG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiBoZWxwcyBkb2luZyB0aGF0XG4gICAgICAgICAgICB2YXIgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMiA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWVzLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1hcCA9IGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzIocHJvcGVydHlOYW1lcywgdmFsdWVbcHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzdWJtYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYSA9IHt9LCBfYVtwcm9wZXJ0eU5hbWVdID0gc3VibWFwLCBfYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0VtYmVkZGVkQXJyYXlfMSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9hID0ge30sIF9hW190aGlzLnByb3BlcnR5TmFtZV0gPSB2W190aGlzLnByb3BlcnR5TmFtZV0sIF9hKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtfdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgJiYgKHJldHVybk51bGxzID09PSBmYWxzZSB8fCB2YWx1ZVtfdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2IgPSB7fSwgX2JbX3RoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlW190aGlzLnByb3BlcnR5TmFtZV0sIF9iO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG1hcCA9IGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzIocHJvcGVydHlOYW1lcywgZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA+IDAgPyBtYXAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb25NZXRhZGF0YSAmJiBlbnRpdHlbdGhpcy5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5TmFtZV0gJiYgZW50aXR5W3RoaXMucmVsYXRpb25NZXRhZGF0YS5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5qb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWVNYXAoZW50aXR5W190aGlzLnJlbGF0aW9uTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sIF9hW3RoaXMucHJvcGVydHlOYW1lXSA9IG1hcCwgX2E7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgJiYgKHJldHVybk51bGxzID09PSBmYWxzZSB8fCBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSBudWxsKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9iID0ge30sIF9iW3RoaXMucHJvcGVydHlOYW1lXSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV0sIF9iO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICogSWYgY29sdW1uIGlzIGluIGVtYmVkZGVkIChvciByZWN1cnNpdmUgZW1iZWRkZWQpIGl0IGV4dHJhY3RzIGl0cyB2YWx1ZSBmcm9tIHRoZXJlLlxuICAgICAqL1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHksIHRyYW5zZm9ybSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSB2b2lkIDApIHsgdHJhbnNmb3JtID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRkZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgdmFyIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAvLyBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZGRlZHNcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHZhbHVlIG9mIFwiaWRcIiBjb2x1bW4gZnJvbSB0aGUgcG9zdCByZWFsIGVudGl0eSBvYmplY3RcbiAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXAgLSB3ZSBleHRyYWN0IGFsbCBwYXJlbnQgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoaXMgY29sdW1uLCBlLmcuIFtkYXRhLCBpbmZvcm1hdGlvbiwgY291bnRlcnNdXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcyksIGZhbHNlKTtcbiAgICAgICAgICAgIHZhciBpc0VtYmVkZGVkQXJyYXkgPSB0aGlzLmVtYmVkZGVkTWV0YWRhdGEuaXNBcnJheTtcbiAgICAgICAgICAgIC8vIG5leHQgd2UgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdW3RoaXMucHJvcGVydHlOYW1lXSB0byBnZXQgY29sdW1uIHZhbHVlIGZyb20gdGhlIGNvdW50ZXJzXG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0YWtlcyBhcnJheSBvZiBnZW5lcmF0ZWQgcHJvcGVydHkgbmFtZXMgYW5kIGdldHMgdGhlIHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXSBlbWJlZFxuICAgICAgICAgICAgdmFyIGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzMgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lcywgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgJiYgdmFsdWUgPyBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8zKHByb3BlcnR5TmFtZXMsIHZhbHVlW3Byb3BlcnR5TmFtZV0pIDogdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBnZXQgbmVzdGVkIGVtYmVkIG9iamVjdCB3ZSBnZXQgaXRzIGNvbHVtbiwgZS5nLiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRPYmplY3QgPSBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8zKHByb3BlcnR5TmFtZXMsIGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoZW1iZWRkZWRPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGlvbk1ldGFkYXRhICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5nZXRFbnRpdHlWYWx1ZShlbWJlZGRlZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZWxhdGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gJiYgZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0ICYmICEoZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKGVtYmVkZGVkT2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgIShlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VtYmVkZGVkQXJyYXkgJiYgQXJyYXkuaXNBcnJheShlbWJlZGRlZE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbWJlZGRlZE9iamVjdC5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG9bX3RoaXMucHJvcGVydHlOYW1lXTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtYmVkZGVkT2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBuYW1lIGJ5IHByb3BlcnR5IG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb25NZXRhZGF0YSAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbikgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZWxhdGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSAmJiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0ICYmICEoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcikgJiYgIShlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgIShlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0aGlzLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKHRoaXMudHJhbnNmb3JtZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBnaXZlbiBlbnRpdHkncyBjb2x1bW4gdmFsdWUuXG4gICAgICogVXNpbmcgb2YgdGhpcyBtZXRob2QgaGVscHMgdG8gc2V0IGVudGl0eSByZWxhdGlvbidzIHZhbHVlIG9mIHRoZSBsYXp5IGFuZCBub24tbGF6eSByZWxhdGlvbnMuXG4gICAgICovXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLnNldEVudGl0eVZhbHVlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV80ID0gZnVuY3Rpb24gKGVtYmVkZGVkTWV0YWRhdGFzLCBtYXApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIW9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgLy8gICAgIG9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0gPSBlbWJlZGRlZE1ldGFkYXRhLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBbZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eU5hbWVdID0gZW1iZWRkZWRNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfNChlbWJlZGRlZE1ldGFkYXRhcywgbWFwW2VtYmVkZGVkTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfNChfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLmVtYmVkZGVkTWV0YWRhdGFUcmVlKSwgZmFsc2UpLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gd2Ugd3JpdGUgYSBkZWVwIG9iamVjdCBpbiB0aGlzIGVudGl0eSBvbmx5IGlmIHRoZSBjb2x1bW4gaXMgdmlydHVhbFxuICAgICAgICAgICAgLy8gYmVjYXVzZSBpZiBpdHMgbm90IHZpcnR1YWwgaXQgbWVhbnMgdGhlIHVzZXIgZGVmaW5lZCBhIHJlYWwgY29sdW1uIGZvciB0aGlzIHJlbGF0aW9uXG4gICAgICAgICAgICAvLyBhbHNvIHdlIGRvbid0IGRvIGl0IGlmIGNvbHVtbiBpcyBpbnNpZGUgYSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmVudGl0eU1ldGFkYXRhLmlzSnVuY3Rpb24gJiYgdGhpcy5pc1ZpcnR1YWwgJiYgdGhpcy5yZWZlcmVuY2VkQ29sdW1uICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUgIT09IHRoaXMucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5wcm9wZXJ0eU5hbWUgaW4gZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV1bdGhpcy5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVBhdGggPSB0aGlzLmJ1aWxkUHJvcGVydHlQYXRoKCk7XG4gICAgICAgIHRoaXMucHJvcGVydHlBbGlhc05hbWUgPSB0aGlzLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gdGhpcy5idWlsZERhdGFiYXNlTmFtZShjb25uZWN0aW9uKTtcbiAgICAgICAgdGhpcy5kYXRhYmFzZVBhdGggPSB0aGlzLmJ1aWxkRGF0YWJhc2VQYXRoKCk7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lV2l0aG91dFByZWZpeGVzID0gY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jb2x1bW5OYW1lKHRoaXMucHJvcGVydHlOYW1lLCB0aGlzLmdpdmVuRGF0YWJhc2VOYW1lLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGF0aCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVkTWV0YWRhdGEgJiYgdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMubGVuZ3RoKVxuICAgICAgICAgICAgcGF0aCA9IHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmpvaW4oXCIuXCIpICsgXCIuXCI7XG4gICAgICAgIHBhdGggKz0gdGhpcy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIC8vIHdlIGFkZCByZWZlcmVuY2UgY29sdW1uIHRvIHByb3BlcnR5IHBhdGggb25seSBpZiB0aGlzIGNvbHVtbiBpcyB2aXJ0dWFsXG4gICAgICAgIC8vIGJlY2F1c2UgaWYgaXRzIG5vdCB2aXJ0dWFsIGl0IG1lYW5zIHVzZXIgZGVmaW5lZCBhIHJlYWwgY29sdW1uIGZvciB0aGlzIHJlbGF0aW9uXG4gICAgICAgIC8vIGFsc28gd2UgZG9uJ3QgZG8gaXQgaWYgY29sdW1uIGlzIGluc2lkZSBhIGp1bmN0aW9uIHRhYmxlXG4gICAgICAgIGlmICghdGhpcy5lbnRpdHlNZXRhZGF0YS5pc0p1bmN0aW9uICYmIHRoaXMuaXNWaXJ0dWFsICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbiAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lICE9PSB0aGlzLnByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgIHBhdGggKz0gXCIuXCIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZERhdGFiYXNlUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhICYmIHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcy5qb2luKFwiLlwiKSArIFwiLlwiO1xuICAgICAgICBwYXRoICs9IHRoaXMuZGF0YWJhc2VOYW1lO1xuICAgICAgICAvLyB3ZSBhZGQgcmVmZXJlbmNlIGNvbHVtbiB0byBwcm9wZXJ0eSBwYXRoIG9ubHkgaWYgdGhpcyBjb2x1bW4gaXMgdmlydHVhbFxuICAgICAgICAvLyBiZWNhdXNlIGlmIGl0cyBub3QgdmlydHVhbCBpdCBtZWFucyB1c2VyIGRlZmluZWQgYSByZWFsIGNvbHVtbiBmb3IgdGhpcyByZWxhdGlvblxuICAgICAgICAvLyBhbHNvIHdlIGRvbid0IGRvIGl0IGlmIGNvbHVtbiBpcyBpbnNpZGUgYSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICBpZiAoIXRoaXMuZW50aXR5TWV0YWRhdGEuaXNKdW5jdGlvbiAmJiB0aGlzLmlzVmlydHVhbCAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4gJiYgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSAhPT0gdGhpcy5kYXRhYmFzZU5hbWUpXG4gICAgICAgICAgICBwYXRoICs9IFwiLlwiICsgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfTtcbiAgICBDb2x1bW5NZXRhZGF0YS5wcm90b3R5cGUuYnVpbGREYXRhYmFzZU5hbWUgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IHRoaXMuZW1iZWRkZWRNZXRhZGF0YSA/IHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcmVmaXhlcyA6IFtdO1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikgLy8gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIGVtYmVkZGVkIG5hbWUgZm9yIHRoZSBtb25nb2RiIGNvbHVtbiBuYW1lc1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lcyA9IFtdO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jb2x1bW5OYW1lKHRoaXMucHJvcGVydHlOYW1lLCB0aGlzLmdpdmVuRGF0YWJhc2VOYW1lLCBwcm9wZXJ0eU5hbWVzKTtcbiAgICB9O1xuICAgIHJldHVybiBDb2x1bW5NZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db2x1bW5NZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgZW1iZWRkZWQgcHJvcGVydHkuXG4gKi9cbnZhciBFbWJlZGRlZE1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW1iZWRkZWRNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb2x1bW5zIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgaW5zaWRlIHRoaXMgZW1iZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5IGxpc3RlbmVycyBpbnNpZGUgdGhpcyBlbWJlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIGFwcGxpZWQgdG8gdGhlIGVtYmVkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXF1ZXMgYXBwbGllZCB0byB0aGUgZW1iZWQgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gaWRzIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gY291bnRzIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTmVzdGVkIGVtYmVkZGFibGUgaW4gdGhpcyBlbWJlZGRhYmxlICh3aGljaCBoYXMgY3VycmVudCBlbWJlZGRlZCBhcyBwYXJlbnQgZW1iZWRkZWQpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWJlZGRlZHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZW50aXR5IHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIGNvbnN0cnVjdG9yXG4gICAgICAgICAqIG9yIHZpYSBhbGxvY2F0aW5nIGEgbmV3IG9iamVjdCB2aWEgYE9iamVjdC5jcmVhdGUoKWAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3RvciA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBlbWJlZGRlZCBpcyBpbiBhcnJheSBtb2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG9wdGlvbiB3b3JrcyBvbmx5IGluIG1vbmdvZGIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb2YgY3VycmVudCBlbWJlZCBhbmQgYWxsIGl0cyBwYXJlbnQgZW1iZWRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogd2UgbmVlZCB0byBnZXQgdmFsdWUgb2YgXCJpZFwiIGNvbHVtbiBmcm9tIHRoZSBwb3N0IHJlYWwgZW50aXR5IG9iamVjdC5cbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW1wiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIsIFwiY291bnRlcnNcIl1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyZW50UHJvcGVydHlOYW1lcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhcnJheSBvZiBwcmVmaXhlcyBvZiBjdXJyZW50IGVtYmVkIGFuZCBhbGwgaXRzIHBhcmVudCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBhcmVudFByZWZpeGVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGVtYmVkIG1ldGFkYXRhcyBmcm9tIGFsbCBsZXZlbHMgb2YgdGhlIHBhcmVudCB0cmVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW2VtYmVkIG1ldGFkYXRhIG9mIGRhdGEsIGVtYmVkIG1ldGFkYXRhIG9mIGluZm9ybWF0aW9uLCBlbWJlZCBtZXRhZGF0YSBvZiBjb3VudGVyc11cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YVRyZWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVtYmVkIG1ldGFkYXRhcyBmcm9tIGFsbCBsZXZlbHMgb2YgdGhlIHBhcmVudCB0cmVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW2VtYmVkIG1ldGFkYXRhIG9mIGRhdGEsIGVtYmVkIG1ldGFkYXRhIG9mIGluZm9ybWF0aW9uLCBlbWJlZCBtZXRhZGF0YSBvZiBjb3VudGVyc11cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9ucyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9ucyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3RlbmVyc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIG9mIHRoaXMgZW1iZWQgYW5kIGFsbCBpbmRpY2VzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kaWNlc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWVzIG9mIHRoaXMgZW1iZWQgYW5kIGFsbCB1bmlxdWVzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBpZHMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9uIGlkcyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uSWRzRnJvbVRyZWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIGNvdW50cyBvZiB0aGlzIGVtYmVkIGFuZCBhbGwgcmVsYXRpb24gY291bnRzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IFtdO1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy5hcmdzLnR5cGUoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLmN1c3RvbVByZWZpeCA9IG9wdGlvbnMuYXJncy5wcmVmaXg7XG4gICAgICAgIHRoaXMuaXNBcnJheSA9IG9wdGlvbnMuYXJncy5pc0FycmF5O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW1iZWRkZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmICghKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mcm9tRGVzZXJpYWxpemVyKSB8fCB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLnR5cGUucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmVtYmVkZGVkcy5mb3JFYWNoKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWQuYnVpbGQoY29ubmVjdGlvbik7IH0pO1xuICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMuYnVpbGRQcmVmaXgoY29ubmVjdGlvbik7XG4gICAgICAgIHRoaXMucGFyZW50UHJvcGVydHlOYW1lcyA9IHRoaXMuYnVpbGRQYXJlbnRQcm9wZXJ0eU5hbWVzKCk7XG4gICAgICAgIHRoaXMucGFyZW50UHJlZml4ZXMgPSB0aGlzLmJ1aWxkUGFyZW50UHJlZml4ZXMoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVBhdGggPSB0aGlzLnBhcmVudFByb3BlcnR5TmFtZXMuam9pbihcIi5cIik7XG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YVRyZWUgPSB0aGlzLmJ1aWxkRW1iZWRkZWRNZXRhZGF0YVRyZWUoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zRnJvbVRyZWUgPSB0aGlzLmJ1aWxkQ29sdW1uc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25zRnJvbVRyZWUgPSB0aGlzLmJ1aWxkUmVsYXRpb25zRnJvbVRyZWUoKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNGcm9tVHJlZSA9IHRoaXMuYnVpbGRMaXN0ZW5lcnNGcm9tVHJlZSgpO1xuICAgICAgICB0aGlzLmluZGljZXNGcm9tVHJlZSA9IHRoaXMuYnVpbGRJbmRpY2VzRnJvbVRyZWUoKTtcbiAgICAgICAgdGhpcy51bmlxdWVzRnJvbVRyZWUgPSB0aGlzLmJ1aWxkVW5pcXVlc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25JZHNGcm9tVHJlZSA9IHRoaXMuYnVpbGRSZWxhdGlvbklkc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IHRoaXMuYnVpbGRSZWxhdGlvbkNvdW50c0Zyb21UcmVlKCk7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLm9wdGlvbnMuZW50aXR5U2tpcENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3RvciA9ICFjb25uZWN0aW9uLm9wdGlvbnMuZW50aXR5U2tpcENvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFBhcnRpYWxQcmVmaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGlmIHByZWZpeCBvcHRpb24gd2FzIG5vdCBzZXQgb3IgZXhwbGljaXRseSBzZXQgdG8gdHJ1ZSAtIGRlZmF1bHQgcHJlZml4XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY3VzdG9tUHJlZml4ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBwcmVmaXggb3B0aW9uIHdhcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9yIGV4cGxpY2l0eSBzZXQgdG8gZmFsc2UgLSBkaXNhYmxlIHByZWZpeFxuICAgICAgICBpZiAodGhpcy5jdXN0b21QcmVmaXggPT09IFwiXCIgfHwgdGhpcy5jdXN0b21QcmVmaXggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIGN1c3RvbSBwcmVmaXhcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1c3RvbVByZWZpeCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmN1c3RvbVByZWZpeF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkludmFsaWQgcHJlZml4IG9wdGlvbiBnaXZlbiBmb3IgXCIgKyB0aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiNcIiArIHRoaXMucHJvcGVydHlOYW1lKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUHJlZml4ID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHZhciBwcmVmaXhlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhKVxuICAgICAgICAgICAgcHJlZml4ZXMucHVzaCh0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEuYnVpbGRQcmVmaXgoY29ubmVjdGlvbikpO1xuICAgICAgICBwcmVmaXhlcy5wdXNoLmFwcGx5KHByZWZpeGVzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5idWlsZFBhcnRpYWxQcmVmaXgoKSksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiBwcmVmaXhlcy5qb2luKFwiX1wiKTsgLy8gdG9kbzogdXNlIG5hbWluZyBzdHJhdGVneSBpbnN0ZWFkIG9mIFwiX1wiICAhISFcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUGFyZW50UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50RW1iZWRkZWRNZXRhZGF0YSA/IHRoaXMucGFyZW50RW1iZWRkZWRNZXRhZGF0YS5idWlsZFBhcmVudFByb3BlcnR5TmFtZXMoKS5jb25jYXQodGhpcy5wcm9wZXJ0eU5hbWUpIDogW3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUGFyZW50UHJlZml4ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEgPyB0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEuYnVpbGRQYXJlbnRQcmVmaXhlcygpLmNvbmNhdCh0aGlzLmJ1aWxkUGFydGlhbFByZWZpeCgpKSA6IHRoaXMuYnVpbGRQYXJ0aWFsUHJlZml4KCk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZEVtYmVkZGVkTWV0YWRhdGFUcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhID8gdGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhLmJ1aWxkRW1iZWRkZWRNZXRhZGF0YVRyZWUoKS5jb25jYXQodGhpcykgOiBbdGhpc107XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZENvbHVtbnNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAoY29sdW1ucywgZW1iZWRkZWQpIHsgcmV0dXJuIGNvbHVtbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkQ29sdW1uc0Zyb21UcmVlKCkpOyB9LCB0aGlzLmNvbHVtbnMpO1xuICAgIH07XG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGRSZWxhdGlvbnNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5idWlsZFJlbGF0aW9uc0Zyb21UcmVlKCkpOyB9LCB0aGlzLnJlbGF0aW9ucyk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZExpc3RlbmVyc0Zyb21UcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChyZWxhdGlvbnMsIGVtYmVkZGVkKSB7IHJldHVybiByZWxhdGlvbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkTGlzdGVuZXJzRnJvbVRyZWUoKSk7IH0sIHRoaXMubGlzdGVuZXJzKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkSW5kaWNlc0Zyb21UcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChyZWxhdGlvbnMsIGVtYmVkZGVkKSB7IHJldHVybiByZWxhdGlvbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkSW5kaWNlc0Zyb21UcmVlKCkpOyB9LCB0aGlzLmluZGljZXMpO1xuICAgIH07XG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGRVbmlxdWVzRnJvbVRyZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHJlbGF0aW9ucywgZW1iZWRkZWQpIHsgcmV0dXJuIHJlbGF0aW9ucy5jb25jYXQoZW1iZWRkZWQuYnVpbGRVbmlxdWVzRnJvbVRyZWUoKSk7IH0sIHRoaXMudW5pcXVlcyk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFJlbGF0aW9uSWRzRnJvbVRyZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHJlbGF0aW9ucywgZW1iZWRkZWQpIHsgcmV0dXJuIHJlbGF0aW9ucy5jb25jYXQoZW1iZWRkZWQuYnVpbGRSZWxhdGlvbklkc0Zyb21UcmVlKCkpOyB9LCB0aGlzLnJlbGF0aW9uSWRzKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5idWlsZFJlbGF0aW9uQ291bnRzRnJvbVRyZWUoKSk7IH0sIHRoaXMucmVsYXRpb25Db3VudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIEVtYmVkZGVkTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgRW1iZWRkZWRNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbWJlZGRlZE1ldGFkYXRhLmpzLm1hcFxuIiwiLyoqXG4gKiBUaGlzIG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBlbnRpdHkncyBsaXN0ZW5lcnMuXG4gKi9cbnZhciBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TGlzdGVuZXJNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVtYmVkZGVkTWV0YWRhdGEgPSBvcHRpb25zLmVtYmVkZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy5hcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmFyZ3MudHlwZTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGxpc3RlbmVyIGlzIGFsbG93ZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhLnByb3RvdHlwZS5pc0FsbG93ZWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldCA9PT0gZW50aXR5LmNvbnN0cnVjdG9yIHx8IC8vIHRvZG86IC5jb25zdHJ1Y3RvciB3b24ndCB3b3JrIGZvciBlbnRpdHkgc2NoZW1hcywgYnV0IHRoZXJlIGFyZSBubyBlbnRpdHkgbGlzdGVuZXJzIGluIHNjaGVtYXMgc2luY2UgdGhlcmUgYXJlIG5vIG9iamVjdHMsIHJpZ2h0P1xuICAgICAgICAgICAgKHRoaXMuZW50aXR5TWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgZW50aXR5LmNvbnN0cnVjdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXMuZW50aXR5TWV0YWRhdGEudGFyZ2V0KTsgLy8gdG9kbzogYWxzbyBuZWVkIHRvIGltcGxlbWVudCBlbnRpdHkgc2NoZW1hIGluaGVyaXRhbmNlXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBsaXN0ZW5lciBtZXRob2Qgb2YgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICBpZiAoIXRoaXMuZW1iZWRkZWRNZXRhZGF0YSlcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdKCk7XG4gICAgICAgIHRoaXMuY2FsbEVudGl0eUVtYmVkZGVkTWV0aG9kKGVudGl0eSwgdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5UGF0aC5zcGxpdChcIi5cIikpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDYWxscyBlbWJlZGRlZCBlbnRpdHkgbGlzdGVuZXIgbWV0aG9kIG5vIG1hdHRlciBob3cgbmVzdGVkIGl0IGlzLlxuICAgICAqL1xuICAgIEVudGl0eUxpc3RlbmVyTWV0YWRhdGEucHJvdG90eXBlLmNhbGxFbnRpdHlFbWJlZGRlZE1ldGhvZCA9IGZ1bmN0aW9uIChlbnRpdHksIHByb3BlcnR5UGF0aHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eVBhdGggfHwgIWVudGl0eVtwcm9wZXJ0eVBhdGhdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocHJvcGVydHlQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHlbcHJvcGVydHlQYXRoXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgZW50aXR5W3Byb3BlcnR5UGF0aF0ubWFwKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWRbX3RoaXMucHJvcGVydHlOYW1lXSgpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudGl0eVtwcm9wZXJ0eVBhdGhdW3RoaXMucHJvcGVydHlOYW1lXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVudGl0eVtwcm9wZXJ0eVBhdGhdKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbEVudGl0eUVtYmVkZGVkTWV0aG9kKGVudGl0eVtwcm9wZXJ0eVBhdGhdLCBwcm9wZXJ0eVBhdGhzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVudGl0eUxpc3RlbmVyTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgRW50aXR5TGlzdGVuZXJNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlMaXN0ZW5lck1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBzaG9ydGVuIH0gZnJvbSBcIi4uL3V0aWwvU3RyaW5nVXRpbHNcIjtcbi8qKlxuICogQ29udGFpbnMgYWxsIGVudGl0eSBtZXRhZGF0YS5cbiAqL1xudmFyIEVudGl0eU1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hpbGRyZW4gZW50aXR5IG1ldGFkYXRhcy4gVXNlZCBpbiBpbmhlcml0YW5jZSBwYXR0ZXJucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hpbGRFbnRpdHlNZXRhZGF0YXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBcImluaGVyaXRhbmNlIHRyZWVcIiBmcm9tIGEgdGFyZ2V0IGVudGl0eS5cbiAgICAgICAgICogRm9yIGV4YW1wbGUgZm9yIHRhcmdldCBQb3N0IDwgQ29udGVudE1vZGVsIDwgVW5pdCBpdCB3aWxsIGJlIGFuIGFycmF5IG9mIFtQb3N0LCBDb250ZW50TW9kZWwsIFVuaXRdLlxuICAgICAgICAgKiBJdCBhbHNvIGNvbnRhaW5zIGNoaWxkIGVudGl0aWVzIGZvciBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluaGVyaXRhbmNlVHJlZSA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgdHlwZS4gVGFibGVzIGNhbiBiZSBjbG9zdXJlLCBqdW5jdGlvbiwgZXRjLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWJsZVR5cGUgPSBcInJlZ3VsYXJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgU3FsaXRlIFwiV0lUSE9VVCBST1dJRFwiIG1vZGlmaWVyIGZvciB0aGUgXCJDUkVBVEUgVEFCTEVcIiBzdGF0ZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2l0aG91dFJvd2lkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgc2NoZW1hIHdpbGwgYmUgc3luY2hyb25pemVkIGZvciB0aGlzIGVudGl0eSBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGVyZSBhbnkgbm9uLW51bGxhYmxlIGNvbHVtbiBleGlzdCBpbiB0aGlzIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaGFzTm9uTnVsbGFibGVSZWxhdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGVudGl0eSBtZXRhZGF0YSBvZiBhIGp1bmN0aW9uIHRhYmxlLCBvciBub3QuXG4gICAgICAgICAqIEp1bmN0aW9uIHRhYmxlIGlzIGEgdGFibGUgY3JlYXRlZCBieSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJdHMgYWxzbyBwb3NzaWJsZSB0byB1bmRlcnN0YW5kIGlmIGVudGl0eSBpcyBqdW5jdGlvbiB2aWEgdGFibGVUeXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0p1bmN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGVudGl0eSBzaG91bGQgYmUgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBvciB2aWEgYWxsb2NhdGluZyBhIG5ldyBvYmplY3QgdmlhIGBPYmplY3QuY3JlYXRlKClgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgdGFibGUgaXMgYSBqdW5jdGlvbiB0YWJsZSBvZiB0aGUgY2xvc3VyZSB0YWJsZS5cbiAgICAgICAgICogVGhpcyB0eXBlIGlzIGZvciB0YWJsZXMgdGhhdCBjb250YWluIGp1bmN0aW9uIG1ldGFkYXRhIG9mIHRoZSBjbG9zdXJlIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDbG9zdXJlSnVuY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBlbnRpdHkncyB0YWJsZSBoYXMgbXVsdGlwbGUgcHJpbWFyeSBjb2x1bW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNNdWx0aXBsZVByaW1hcnlLZXlzID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBlbnRpdHkgbWV0YWRhdGEgaGFzIHV1aWQgZ2VuZXJhdGVkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhc1VVSURHZW5lcmF0ZWRDb2x1bW5zID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBjb2x1bW4gbWV0YWRhdGFzIGRlZmluZWQgYnkgdXNlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3duQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1ucyBvZiB0aGUgZW50aXR5LCBpbmNsdWRpbmcgY29sdW1ucyB0aGF0IGFyZSBjb21pbmcgZnJvbSB0aGUgZW1iZWRkZWRzIG9mIHRoaXMgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmNlc3RvciBjb2x1bW5zIHVzZWQgb25seSBpbiBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYW5jZXN0b3JDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXNjZW5kYW50IGNvbHVtbnMgdXNlZCBvbmx5IGluIGNsb3N1cmUganVuY3Rpb24gdGFibGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjZW5kYW50Q29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsIGNvbHVtbnMgZXhjZXB0IGZvciB2aXJ0dWFsIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vblZpcnR1YWxDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiB0aGUgY2FzZSBpZiB0aGlzIGVudGl0eSBtZXRhZGF0YSBpcyBqdW5jdGlvbiB0YWJsZSdzIGVudGl0eSBtZXRhZGF0YSxcbiAgICAgICAgICogdGhpcyB3aWxsIGNvbnRhaW4gYWxsIHJlZmVyZW5jZWQgY29sdW1ucyBvZiBvd25lciBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93bmVyQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW4gdGhlIGNhc2UgaWYgdGhpcyBlbnRpdHkgbWV0YWRhdGEgaXMganVuY3Rpb24gdGFibGUncyBlbnRpdHkgbWV0YWRhdGEsXG4gICAgICAgICAqIHRoaXMgd2lsbCBjb250YWluIGFsbCByZWZlcmVuY2VkIGNvbHVtbnMgb2YgaW52ZXJzZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmludmVyc2VDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBjb2x1bW4gd2l0aCBnZW5lcmF0ZWQgZmxhZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgcHJpbWFyeSBjb2x1bW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcmltYXJ5Q29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25SZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LCBpbmNsdWRpbmcgcmVsYXRpb25zIHRoYXQgYXJlIGNvbWluZyBmcm9tIHRoZSBlbWJlZGRlZHMgb2YgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiBlYWdlciByZWxhdGlvbnMgdGhpcyBtZXRhZGF0YSBoYXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVhZ2VyUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGVhZ2VyIHJlbGF0aW9ucyB0aGlzIG1ldGFkYXRhIGhhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGF6eVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvbmx5IG9uZS10by1vbmUgcmVsYXRpb25zIG9mIHRoZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uZVRvT25lUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgb3duZXIgb25lLXRvLW9uZSByZWxhdGlvbnMgb2YgdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3duZXJPbmVUb09uZVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvbmx5IG9uZS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbmVUb01hbnlSZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgb25seSBtYW55LXRvLW9uZSByZWxhdGlvbnMgb2YgdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFueVRvT25lUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYW55VG9NYW55UmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgb3duZXIgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25lck1hbnlUb01hbnlSZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgb25seSBvd25lciBvbmUtdG8tb25lIGFuZCBtYW55LXRvLW9uZSByZWxhdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uc1dpdGhKb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gaWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gaWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgZm9yZWlnbiBrZXkgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgZW1iZWRkZWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWJlZGRlZHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBlbWJlZGRlZHMgLSBlbWJlZGRlZHMgZnJvbSB0aGlzIGVudGl0eSBtZXRhZGF0YSBhbmQgZnJvbSBhbGwgY2hpbGQgZW1iZWRkZWRzLCBldGMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFsbEVtYmVkZGVkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3Mgb3duIGluZGljZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93bkluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSdzIGluZGV4IG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgdW5pcXVlIG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3Mgb3duIHVuaXF1ZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93blVuaXF1ZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSdzIGNoZWNrIG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hlY2tzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBleGNsdXNpb24gbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGNsdXNpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBvd24gbGlzdGVuZXIgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25MaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSBsaXN0ZW5lciBtZXRhZGF0YXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBMT0FEXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWZ0ZXJMb2FkTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW5lciBtZXRhZGF0YXMgd2l0aCBcIkFGVEVSIElOU0VSVFwiIHR5cGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJlZm9yZUluc2VydExpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBJTlNFUlRcIiB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZnRlckluc2VydExpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBVUERBVEVcIiB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iZWZvcmVVcGRhdGVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbmVyIG1ldGFkYXRhcyB3aXRoIFwiQUZURVIgVVBEQVRFXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWZ0ZXJVcGRhdGVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbmVyIG1ldGFkYXRhcyB3aXRoIFwiQUZURVIgUkVNT1ZFXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW5lciBtZXRhZGF0YXMgd2l0aCBcIkFGVEVSIFJFTU9WRVwiIHR5cGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFmdGVyUmVtb3ZlTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5pbmhlcml0YW5jZVRyZWUgPSBvcHRpb25zLmluaGVyaXRhbmNlVHJlZSB8fCBbXTtcbiAgICAgICAgdGhpcy5pbmhlcml0YW5jZVBhdHRlcm4gPSBvcHRpb25zLmluaGVyaXRhbmNlUGF0dGVybjtcbiAgICAgICAgdGhpcy50cmVlVHlwZSA9IG9wdGlvbnMudGFibGVUcmVlID8gb3B0aW9ucy50YWJsZVRyZWUudHlwZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50cmVlT3B0aW9ucyA9IG9wdGlvbnMudGFibGVUcmVlID8gb3B0aW9ucy50YWJsZVRyZWUub3B0aW9ucyA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLnBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy50YWJsZU1ldGFkYXRhQXJncyA9IG9wdGlvbnMuYXJncztcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy50YWJsZVR5cGUgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy53aXRob3V0Um93aWQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLndpdGhvdXRSb3dpZDtcbiAgICAgICAgdGhpcy5kZXBlbmRzT24gPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLmRlcGVuZHNPbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5LlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIHNldCB0byBhIGZ1bmN0aW9uIChlLmcuIGNsYXNzKSB0aGF0IGNhbiBiZSBjcmVhdGVkIHRoZW4gY3JlYXRlIGl0XG4gICAgICAgIHZhciByZXQ7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZnJvbURlc2VyaWFsaXplcikgfHwgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICByZXQgPSBuZXcgdGhpcy50YXJnZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldCA9IE9iamVjdC5jcmVhdGUodGhpcy50YXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGF6eVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5yZWxhdGlvbkxvYWRlci5lbmFibGVMYXp5TG9hZChyZWxhdGlvbiwgcmV0LCBxdWVyeVJ1bm5lcik7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiBhIG5ldyBlbXB0eSBvYmplY3RcbiAgICAgICAgdmFyIG5ld09iamVjdCA9IHt9O1xuICAgICAgICB0aGlzLmxhenlSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIF90aGlzLmNvbm5lY3Rpb24ucmVsYXRpb25Mb2FkZXIuZW5hYmxlTGF6eUxvYWQocmVsYXRpb24sIG5ld09iamVjdCwgcXVlcnlSdW5uZXIpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiBlbnRpdHkgaGFzIGFuIGlkLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgaWYgKCFlbnRpdHkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwcmltYXJ5Q29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gZW50aXR5IC8gb2JqZWN0IGNvbnRhaW5zIEFMTCBwcmltYXJ5IGtleXMgZW50aXR5IG11c3QgaGF2ZS5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgY29udGFpbnMgYWxsIG9mIHRoZW0sIGZhbHNlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIG5vdCBkZWZpbmVkLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNBbGxQcmltYXJ5S2V5cyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeUNvbHVtbnMuZXZlcnkoZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByaW1hcnlDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCBnaXZlbiBvYmplY3QgaXMgYW4gZW50aXR5IGlkIG1hcC5cbiAgICAgKiBJZiBnaXZlbiBpZCBpcyBhbiBvYmplY3QgdGhlbiBpdCBtZWFucyBpdHMgYWxyZWFkeSBpZCBtYXAuXG4gICAgICogSWYgZ2l2ZW4gaWQgaXNuJ3QgYW4gb2JqZWN0IHRoZW4gaXQgbWVhbnMgaXRzIGEgdmFsdWUgb2YgdGhlIGlkIGNvbHVtblxuICAgICAqIGFuZCBpdCBjcmVhdGVzIGEgbmV3IGlkIG1hcCB3aXRoIHRoaXMgdmFsdWUgYW5kIG5hbWUgb2YgdGhlIHByaW1hcnkgY29sdW1uLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5lbnN1cmVFbnRpdHlJZE1hcCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlUHJpbWFyeUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcih0aGlzLCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zWzBdLmNyZWF0ZVZhbHVlTWFwKGlkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcHJpbWFyeSBrZXlzIG9mIHRoZSBlbnRpdHkgYW5kIHJldHVybnMgdGhlbSBpbiBhIGxpdGVyYWwgb2JqZWN0LlxuICAgICAqIEZvciBleGFtcGxlLCBmb3IgUG9zdHsgaWQ6IDEsIHRpdGxlOiBcImhlbGxvXCIgfSB3aGVyZSBpZCBpcyBwcmltYXJ5IGl0IHdpbGwgcmV0dXJuIHsgaWQ6IDEgfVxuICAgICAqIEZvciBtdWx0aXBsZSBwcmltYXJ5IGtleXMgaXQgcmV0dXJucyBtdWx0aXBsZSBrZXlzIGluIG9iamVjdC5cbiAgICAgKiBGb3IgcHJpbWFyeSBrZXlzIGluc2lkZSBlbWJlZHMgaXQgcmV0dXJucyBjb21wbGV4IG9iamVjdCBsaXRlcmFsIHdpdGgga2V5cyBpbiB0aGVtLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlJZE1hcCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgaWYgKCFlbnRpdHkpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gRW50aXR5TWV0YWRhdGEuZ2V0VmFsdWVNYXAoZW50aXR5LCB0aGlzLnByaW1hcnlDb2x1bW5zLCB7IHNraXBOdWxsczogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBcIm1peGVkIGlkIG1hcFwiLlxuICAgICAqIElmIGVudGl0eSBoYXMgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIChpZHMpIHRoZW4gaXQgd2lsbCByZXR1cm4ganVzdCByZWd1bGFyIGlkIG1hcCwgbGlrZSB3aGF0IGdldEVudGl0eUlkTWFwIHJldHVybnMuXG4gICAgICogQnV0IGlmIGVudGl0eSBoYXMgYSBzaW5nbGUgcHJpbWFyeSBrZXkgdGhlbiBpdCB3aWxsIHJldHVybiBqdXN0IHZhbHVlIG9mIHRoZSBpZCBjb2x1bW4gb2YgdGhlIGVudGl0eSwganVzdCB2YWx1ZS5cbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBtaXhlZCBpZCBtYXAuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmdldEVudGl0eUlkTWl4ZWRNYXAgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIGlmICghZW50aXR5KVxuICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgdmFyIGlkTWFwID0gdGhpcy5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVByaW1hcnlLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaWRNYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaWRNYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGlkTWFwKTsgLy8gdG9kbzogd2hhdCBhYm91dCBwYXJlbnQgcHJpbWFyeSBjb2x1bW4/XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkTWFwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIGRpZmZlcmVudCBlbnRpdGllcyBieSB0aGVpciBpZHMuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXkgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuY29tcGFyZUVudGl0aWVzID0gZnVuY3Rpb24gKGZpcnN0RW50aXR5LCBzZWNvbmRFbnRpdHkpIHtcbiAgICAgICAgdmFyIGZpcnN0RW50aXR5SWRNYXAgPSB0aGlzLmdldEVudGl0eUlkTWFwKGZpcnN0RW50aXR5KTtcbiAgICAgICAgaWYgKCFmaXJzdEVudGl0eUlkTWFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgc2Vjb25kRW50aXR5SWRNYXAgPSB0aGlzLmdldEVudGl0eUlkTWFwKHNlY29uZEVudGl0eSk7XG4gICAgICAgIGlmICghc2Vjb25kRW50aXR5SWRNYXApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKGZpcnN0RW50aXR5SWRNYXAsIHNlY29uZEVudGl0eUlkTWFwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGNvbHVtbiB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZmluZENvbHVtbldpdGhQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1uIHdpdGggYSBnaXZlbiBkYXRhYmFzZSBuYW1lLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kQ29sdW1uV2l0aERhdGFiYXNlTmFtZSA9IGZ1bmN0aW9uIChkYXRhYmFzZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWUgPT09IGRhdGFiYXNlTmFtZTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjb2x1bW4gb3IgcmVsYXRpb25zaGlwIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNDb2x1bW5XaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICB2YXIgaGFzQ29sdW1uID0gdGhpcy5jb2x1bW5zLnNvbWUoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0NvbHVtbiB8fCB0aGlzLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1uIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiBjb2x1bW4gd2l0aCBwcm9wZXJ0eSBwYXRoIHdhcyBub3QgZm91bmQsIHRyeSB0byBmaW5kIGEgcmVsYXRpb24gd2l0aCBzdWNoIHByb3BlcnR5IHBhdGhcbiAgICAgICAgLy8gaWYgd2UgZmluZCByZWxhdGlvbiBhbmQgaXQgaGFzIGEgc2luZ2xlIGpvaW4gY29sdW1uIHRoZW4gaXRzIHRoZSBjb2x1bW4gdXNlciB3YXMgc2Vla2luZ1xuICAgICAgICB2YXIgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ucHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICBpZiAocmVsYXRpb24gJiYgcmVsYXRpb24uam9pbkNvbHVtbnMubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1ucyB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgcGF0aC5cbiAgICAgKiBQcm9wZXJ0eSBwYXRoIGNhbiBtYXRjaCBhIHJlbGF0aW9uLCBhbmQgcmVsYXRpb25zIGNhbiBjb250YWluIG11bHRpcGxlIGNvbHVtbnMuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICByZXR1cm4gW2NvbHVtbl07XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIGlmIGNvbHVtbiB3aXRoIHByb3BlcnR5IHBhdGggd2FzIG5vdCBmb3VuZCwgdHJ5IHRvIGZpbmQgYSByZWxhdGlvbiB3aXRoIHN1Y2ggcHJvcGVydHkgcGF0aFxuICAgICAgICAvLyBpZiB3ZSBmaW5kIHJlbGF0aW9uIGFuZCBpdCBoYXMgYSBzaW5nbGUgam9pbiBjb2x1bW4gdGhlbiBpdHMgdGhlIGNvbHVtbiB1c2VyIHdhcyBzZWVraW5nXG4gICAgICAgIHZhciByZWxhdGlvbiA9IHRoaXMuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICBpZiAocmVsYXRpb24gJiYgcmVsYXRpb24uam9pbkNvbHVtbnMpXG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IHBhdGguXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zLnNvbWUoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyByZWxhdGlvbiB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnMuZmluZChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbiBlbWJlZGRlZCB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgcGF0aC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuaGFzRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxFbWJlZGRlZHMuc29tZShmdW5jdGlvbiAoZW1iZWRkZWQpIHsgcmV0dXJuIGVtYmVkZGVkLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVtYmVkZGVkIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxFbWJlZGRlZHMuZmluZChmdW5jdGlvbiAoZW1iZWRkZWQpIHsgcmV0dXJuIGVtYmVkZGVkLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YWJhc2VOYW1lcyBtYXBwZWQgZnJvbSBwcm92aWRlZCBwcm9wZXJ0eVBhdGhzXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLm1hcFByb3BlcnR5UGF0aHNUb0NvbHVtbnMgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRocykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF90aGlzLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICBpZiAoY29sdW1uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29sdW1uTm90Rm91bmQocHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgdGhyb3VnaCBlbnRpdHkgYW5kIGZpbmRzIGFuZCBleHRyYWN0cyBhbGwgdmFsdWVzIGZyb20gcmVsYXRpb25zIGluIHRoZSBlbnRpdHkuXG4gICAgICogSWYgcmVsYXRpb24gdmFsdWUgaXMgYW4gYXJyYXkgaXRzIGJlaW5nIGZsYXR0ZW5lZC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZXh0cmFjdFJlbGF0aW9uVmFsdWVzRnJvbUVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHksIHJlbGF0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVsYXRpb25zQW5kVmFsdWVzID0gW107XG4gICAgICAgIHJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHN1YlZhbHVlKSB7IHJldHVybiByZWxhdGlvbnNBbmRWYWx1ZXMucHVzaChbcmVsYXRpb24sIHN1YlZhbHVlLCBfdGhpcy5nZXRJbnZlcnNlRW50aXR5TWV0YWRhdGEoc3ViVmFsdWUsIHJlbGF0aW9uKV0pOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRpb25zQW5kVmFsdWVzLnB1c2goW3JlbGF0aW9uLCB2YWx1ZSwgX3RoaXMuZ2V0SW52ZXJzZUVudGl0eU1ldGFkYXRhKHZhbHVlLCByZWxhdGlvbildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZWxhdGlvbnNBbmRWYWx1ZXM7XG4gICAgfTtcbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZ2V0SW52ZXJzZUVudGl0eU1ldGFkYXRhID0gZnVuY3Rpb24gKHZhbHVlLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgY2hpbGRFbnRpdHlNZXRhZGF0YSA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhcmdldCA9PT0gdmFsdWUuY29uc3RydWN0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2hpbGRFbnRpdHlNZXRhZGF0YSA/IGNoaWxkRW50aXR5TWV0YWRhdGEgOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBwYXRocyBmb3IgYSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLmNyZWF0ZVByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgZW50aXR5LCBwcmVmaXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdm9pZCAwKSB7IHByZWZpeCA9IFwiXCI7IH1cbiAgICAgICAgdmFyIHBhdGhzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKGVudGl0eSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgZnVuY3Rpb24gaXMgbmVlZGVkIGluIHRoZSBjYXNlcyB3aGVuIGNyZWF0ZVByb3BlcnR5UGF0aCB1c2VkIG9uIHZhbHVlcyBjb250YWluZyBhIGZ1bmN0aW9uIGFzIGEgdmFsdWVcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IC51cGRhdGUoKS5zZXQoeyBuYW1lOiAoKSA9PiBgU1VCU1RSKCcnLCAxLCAyKWAgfSlcbiAgICAgICAgICAgIHZhciBwYXJlbnRQYXRoID0gcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuaGFzRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoKHBhcmVudFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YlBhdGhzID0gX3RoaXMuY3JlYXRlUHJvcGVydHlQYXRoKG1ldGFkYXRhLCBlbnRpdHlba2V5XSwgcGFyZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaC5hcHBseShwYXRocywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHN1YlBhdGhzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXRocztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZW50aXR5IGlkIG1hcHMuXG4gICAgICogUmV0dXJucyBpdGVtcyB0aGF0IGV4aXN0IGluIHRoZSBmaXJzdCBhcnJheSBhbmQgYWJzZW50IGluIHRoZSBzZWNvbmQgYXJyYXkuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChmaXJzdElkTWFwcywgc2Vjb25kSWRNYXBzKSB7XG4gICAgICAgIHJldHVybiBmaXJzdElkTWFwcy5maWx0ZXIoZnVuY3Rpb24gKGZpcnN0SWRNYXApIHtcbiAgICAgICAgICAgIHJldHVybiAhc2Vjb25kSWRNYXBzLmZpbmQoZnVuY3Rpb24gKHNlY29uZElkTWFwKSB7IHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKGZpcnN0SWRNYXAsIHNlY29uZElkTWFwKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB2YWx1ZSBtYXAgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIGFuZCBjb2x1bW5zLlxuICAgICAqIEV4YW1wbGVzIG9mIHVzYWdlcyBhcmUgcHJpbWFyeSBjb2x1bW5zIG1hcCBhbmQgam9pbiBjb2x1bW5zIG1hcC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5nZXRWYWx1ZU1hcCA9IGZ1bmN0aW9uIChlbnRpdHksIGNvbHVtbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlTWFwKGVudGl0eSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBub25lIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbnMgYXJlIG5vdCBtaXNzaW5nXG4gICAgICAgICAgICBpZiAobWFwID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHZhbHVlKTtcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkZXIgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbmFtaW5nU3RyYXRlZ3kgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3k7XG4gICAgICAgIHZhciBlbnRpdHlQcmVmaXggPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5lbnRpdHlQcmVmaXg7XG4gICAgICAgIHZhciBlbnRpdHlTa2lwQ29uc3RydWN0b3IgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5lbnRpdHlTa2lwQ29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuZW5naW5lID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5lbmdpbmU7XG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIgJiYgdGhpcy5wYXJlbnRFbnRpdHlNZXRhZGF0YSA/IHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEuZGF0YWJhc2UgOiB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLmRhdGFiYXNlO1xuICAgICAgICBpZiAodGhpcy50YWJsZU1ldGFkYXRhQXJncy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5zY2hlbWE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIikgJiYgdGhpcy5wYXJlbnRFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLnNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoX2EgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhc093blByb3BlcnR5KFwic2NoZW1hXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLnNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdpdmVuVGFibGVOYW1lID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEgPyB0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLmdpdmVuVGFibGVOYW1lIDogdGhpcy50YWJsZU1ldGFkYXRhQXJncy5uYW1lO1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5zeW5jaHJvbml6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnRhcmdldC5uYW1lIDogdGhpcy50YWJsZU1ldGFkYXRhQXJncy50YXJnZXQ7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiY2xvc3VyZS1qdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPSBuYW1pbmdTdHJhdGVneS5jbG9zdXJlSnVuY3Rpb25UYWJsZU5hbWUodGhpcy5naXZlblRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVOYW1lV2l0aG91dFByZWZpeCA9IG5hbWluZ1N0cmF0ZWd5LnRhYmxlTmFtZSh0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWUsIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEuZ2l2ZW5UYWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4ID0gbmFtaW5nU3RyYXRlZ3kudGFibGVOYW1lKHRoaXMudGFyZ2V0TmFtZSwgdGhpcy5naXZlblRhYmxlTmFtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXhBbGlhc0xlbmd0aCAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1heEFsaWFzTGVuZ3RoID4gMCAmJiB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgubGVuZ3RoID4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXhBbGlhc0xlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVOYW1lV2l0aG91dFByZWZpeCA9IHNob3J0ZW4odGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4LCB7IHNlcGFyYXRvcjogXCJfXCIsIHNlZ21lbnRMZW5ndGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZU5hbWUgPSBlbnRpdHlQcmVmaXggPyBuYW1pbmdTdHJhdGVneS5wcmVmaXhUYWJsZU5hbWUoZW50aXR5UHJlZml4LCB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgpIDogdGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMudGFyZ2V0ID8gdGhpcy50YXJnZXQgOiB0aGlzLnRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy50YXJnZXROYW1lID8gdGhpcy50YXJnZXROYW1lIDogdGhpcy50YWJsZU5hbWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy53aXRob3V0Um93aWQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLndpdGhvdXRSb3dpZCA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy50YWJsZVBhdGggPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKHRoaXMudGFibGVOYW1lLCB0aGlzLnNjaGVtYSwgdGhpcy5kYXRhYmFzZSk7XG4gICAgICAgIHRoaXMub3JkZXJCeSA9ICh0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLm9yZGVyQnkgaW5zdGFuY2VvZiBGdW5jdGlvbikgPyB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLm9yZGVyQnkodGhpcy5wcm9wZXJ0aWVzTWFwKSA6IHRoaXMudGFibGVNZXRhZGF0YUFyZ3Mub3JkZXJCeTsgLy8gdG9kbzogaXMgcHJvcGVydGllc01hcCBhdmFpbGFibGUgaGVyZT8gTG9va3MgbGlrZSBpdHMgbm90XG4gICAgICAgIGlmIChlbnRpdHlTa2lwQ29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IgPSAhZW50aXR5U2tpcENvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNKdW5jdGlvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudHlwZSA9PT0gXCJjbG9zdXJlLWp1bmN0aW9uXCIgfHwgdGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImp1bmN0aW9uXCI7XG4gICAgICAgIHRoaXMuaXNDbG9zdXJlSnVuY3Rpb24gPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiY2xvc3VyZS1qdW5jdGlvblwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IGNvbHVtbiBpbiB0aGUgZW50aXR5IGFuZCByZWNvbXB1dGVzIGFsbCBkZXBlbmQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUucmVnaXN0ZXJDb2x1bW4gPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIGlmICh0aGlzLm93bkNvbHVtbnMuaW5kZXhPZihjb2x1bW4pICE9PSAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vd25Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChjb2x1bW5zLCBlbWJlZGRlZCkgeyByZXR1cm4gY29sdW1ucy5jb25jYXQoZW1iZWRkZWQuY29sdW1uc0Zyb21UcmVlKTsgfSwgdGhpcy5vd25Db2x1bW5zKTtcbiAgICAgICAgdGhpcy5wcmltYXJ5Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIHRoaXMuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cyA9IHRoaXMucHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMTtcbiAgICAgICAgdGhpcy5oYXNVVUlER2VuZXJhdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzR2VuZXJhdGVkIHx8IGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiOyB9KS5sZW5ndGggPiAwO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXNNYXAgPSB0aGlzLmNyZWF0ZVByb3BlcnRpZXNNYXAoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRFbnRpdHlNZXRhZGF0YXMpXG4gICAgICAgICAgICB0aGlzLmNoaWxkRW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS5yZWdpc3RlckNvbHVtbihjb2x1bW4pOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzcGVjaWFsIG9iamVjdCAtIGFsbCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgb2YgdGhlIG9iamVjdCAocGx1cyBjb2x1bW5zIGFuZCByZWxhdGlvbnMgZnJvbSBlbWJlZHMpXG4gICAgICogaW4gYSBzcGVjaWFsIGZvcm1hdCAtIHsgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUgfS5cbiAgICAgKlxuICAgICAqIGV4YW1wbGU6IFBvc3R7IGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY291bnRlckVtYmVkOiB7IGNvdW50OiBudW1iZXIgfSwgY2F0ZWdvcnk6IENhdGVnb3J5IH0uXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgZm9sbG93aW5nIG9iamVjdDpcbiAgICAgKiB7IGlkOiBcImlkXCIsIGNvdW50ZXJFbWJlZDogeyBjb3VudDogXCJjb3VudGVyRW1iZWQuY291bnRcIiB9LCBjYXRlZ29yeTogXCJjYXRlZ29yeVwiIH1cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlUHJvcGVydGllc01hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHt9O1xuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBPcm1VdGlscy5tZXJnZURlZXAobWFwLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAoY29sdW1uLnByb3BlcnR5UGF0aCkpOyB9KTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHJlbGF0aW9uLmNyZWF0ZVZhbHVlTWFwKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YS5qcy5tYXBcbiIsIi8qKlxuICogRXhjbHVzaW9uIG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0YWJsZSdzIGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAqL1xudmFyIEV4Y2x1c2lvbk1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRXhjbHVzaW9uTWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncykge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLmFyZ3MudGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gb3B0aW9ucy5hcmdzLmV4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdpdmVuTmFtZSA9IG9wdGlvbnMuYXJncy5uYW1lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGV4Y2x1c2lvbiBjb25zdHJhaW50IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YSdzIHByb3BlcnRpZXMgbWFwLCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEV4Y2x1c2lvbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChuYW1pbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdpdmVuTmFtZSA/IHRoaXMuZ2l2ZW5OYW1lIDogbmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGhpcy5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUsIHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEV4Y2x1c2lvbk1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IEV4Y2x1c2lvbk1ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4Y2x1c2lvbk1ldGFkYXRhLmpzLm1hcFxuIiwiLyoqXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgZm9yZWlnbiBrZXkuXG4gKi9cbnZhciBGb3JlaWduS2V5TWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBGb3JlaWduS2V5TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgY29sdW1ucyBvZiB0aGlzIGZvcmVpZ24ga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcnJheSBvZiByZWZlcmVuY2VkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYXJyYXkgb2YgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VkRW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLnJlZmVyZW5jZWRFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5zID0gb3B0aW9ucy5yZWZlcmVuY2VkQ29sdW1ucztcbiAgICAgICAgdGhpcy5vbkRlbGV0ZSA9IG9wdGlvbnMub25EZWxldGUgfHwgXCJOTyBBQ1RJT05cIjtcbiAgICAgICAgdGhpcy5vblVwZGF0ZSA9IG9wdGlvbnMub25VcGRhdGUgfHwgXCJOTyBBQ1RJT05cIjtcbiAgICAgICAgdGhpcy5kZWZlcnJhYmxlID0gb3B0aW9ucy5kZWZlcnJhYmxlO1xuICAgICAgICBpZiAob3B0aW9ucy5uYW1pbmdTdHJhdGVneSlcbiAgICAgICAgICAgIHRoaXMuYnVpbGQob3B0aW9ucy5uYW1pbmdTdHJhdGVneSk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGZvcmVpZ24ga2V5IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YXMgYW5kIHRoZWlyIGNvbHVtbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEZvcmVpZ25LZXlNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAobmFtaW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVzID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlUGF0aCA9IHRoaXMucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnRhYmxlUGF0aDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUodGhpcy5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIHRoaXMucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEZvcmVpZ25LZXlNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBGb3JlaWduS2V5TWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9yZWlnbktleU1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEluZGV4IG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0YWJsZSdzIGluZGV4LlxuICovXG52YXIgSW5kZXhNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEluZGV4TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaW5kZXggbXVzdCBiZSB1bmlxdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVW5pcXVlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgU1BBVElBTCBtb2RpZmllciBpbmRleGVzIHRoZSBlbnRpcmUgY29sdW1uIGFuZCBkb2VzIG5vdCBhbGxvdyBpbmRleGVkIGNvbHVtbnMgdG8gY29udGFpbiBOVUxMIHZhbHVlcy5cbiAgICAgICAgICogV29ya3Mgb25seSBpbiBNeVNRTC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTcGF0aWFsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgRlVMTFRFWFQgbW9kaWZpZXIgaW5kZXhlcyB0aGUgZW50aXJlIGNvbHVtbiBhbmQgZG9lcyBub3QgYWxsb3cgcHJlZml4aW5nLlxuICAgICAgICAgKiBXb3JrcyBvbmx5IGluIE15U1FMLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpbmRleCBtdXN0IHN5bmNocm9uaXplIHdpdGggZGF0YWJhc2UgaW5kZXguXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGV4ZWQgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTWFwIG9mIGNvbHVtbiBuYW1lcyB3aXRoIG9yZGVyIHNldC5cbiAgICAgICAgICogVXNlZCBvbmx5IGJ5IE1vbmdvREIgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IHt9O1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZE1ldGFkYXRhID0gb3B0aW9ucy5lbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hcmdzLnN5bmNocm9uaXplICE9PSBudWxsICYmIG9wdGlvbnMuYXJncy5zeW5jaHJvbml6ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luY2hyb25pemUgPSBvcHRpb25zLmFyZ3Muc3luY2hyb25pemU7XG4gICAgICAgICAgICB0aGlzLmlzVW5pcXVlID0gISFvcHRpb25zLmFyZ3MudW5pcXVlO1xuICAgICAgICAgICAgdGhpcy5pc1NwYXRpYWwgPSAhIW9wdGlvbnMuYXJncy5zcGF0aWFsO1xuICAgICAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gISFvcHRpb25zLmFyZ3MuZnVsbHRleHQ7XG4gICAgICAgICAgICB0aGlzLnBhcnNlciA9IG9wdGlvbnMuYXJncy5wYXJzZXI7XG4gICAgICAgICAgICB0aGlzLndoZXJlID0gb3B0aW9ucy5hcmdzLndoZXJlO1xuICAgICAgICAgICAgdGhpcy5pc1NwYXJzZSA9IG9wdGlvbnMuYXJncy5zcGFyc2U7XG4gICAgICAgICAgICB0aGlzLmlzQmFja2dyb3VuZCA9IG9wdGlvbnMuYXJncy5iYWNrZ3JvdW5kO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlclNlY29uZHMgPSBvcHRpb25zLmFyZ3MuZXhwaXJlQWZ0ZXJTZWNvbmRzO1xuICAgICAgICAgICAgdGhpcy5naXZlbk5hbWUgPSBvcHRpb25zLmFyZ3MubmFtZTtcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcyA9IG9wdGlvbnMuYXJncy5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YSdzIHByb3BlcnRpZXMgbWFwLCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEluZGV4TWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKG5hbWluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnN5bmNocm9uaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFwID0ge307XG4gICAgICAgIC8vIGlmIGNvbHVtbnMgYWxyZWFkeSBhbiBhcnJheSBvZiBzdHJpbmcgdGhlbiBzaW1wbHkgcmV0dXJuIGl0XG4gICAgICAgIGlmICh0aGlzLmdpdmVuQ29sdW1uTmFtZXMpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5Qcm9wZXJ0eVBhdGhzID0gW107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmdpdmVuQ29sdW1uTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmVtYmVkZGVkTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eVBhdGggKyBcIi5cIiArIGNvbHVtbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5OYW1lLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Qcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkgeyByZXR1cm4gbWFwW3Byb3BlcnR5UGF0aF0gPSAxOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0b2RvOiBpbmRpY2VzIGluIGVtYmVkcyBhcmUgbm90IGltcGxlbWVudGVkIGluIHRoaXMgc3ludGF4LiBkZXByZWNhdGUgdGhpcyBzeW50YXg/XG4gICAgICAgICAgICAgICAgLy8gaWYgY29sdW1ucyBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGVuIGV4ZWN1dGUgaXQgYW5kIGdldCBjb2x1bW5zIG5hbWVzIGZyb20gaXRcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0ZuUmVzdWx0XzEgPSB0aGlzLmdpdmVuQ29sdW1uTmFtZXModGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5zRm5SZXN1bHRfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IGNvbHVtbnNGblJlc3VsdF8xLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gU3RyaW5nKGkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXBbbmFtZV0gPSAxOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gbWFwW2NvbHVtbk5hbWVdID0gY29sdW1uc0ZuUmVzdWx0XzFbY29sdW1uTmFtZV07IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtblByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uV2l0aFNhbWVOYW1lID0gX3RoaXMuZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbldpdGhTYW1lTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2NvbHVtbldpdGhTYW1lTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbldpdGhTYW1lTmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNXaXRoSm9pbkNvbHVtbiAmJiByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uV2l0aFNhbWVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbldpdGhTYW1lTmFtZS5qb2luQ29sdW1ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4TmFtZSA9IF90aGlzLmdpdmVuTmFtZSA/IFwiXFxcIlwiICsgX3RoaXMuZ2l2ZW5OYW1lICsgXCJcXFwiIFwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5TmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkluZGV4IFwiICsgaW5kZXhOYW1lICsgXCJjb250YWlucyBjb2x1bW4gdGhhdCBpcyBtaXNzaW5nIGluIHRoZSBlbnRpdHkgKFwiICsgZW50aXR5TmFtZSArIFwiKTogXCIgKyBwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKGZ1bmN0aW9uICh1cGRhdGVkTWFwLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdGhpcy5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtjb2x1bW4uZGF0YWJhc2VQYXRoXSA9IG1hcFtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWUgPyB0aGlzLmdpdmVuTmFtZSA6IG5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZSh0aGlzLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KSwgdGhpcy53aGVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEluZGV4TWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgSW5kZXhNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmRleE1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBlbnRpdHkncyByZWxhdGlvbiBjb3VudC5cbiAqL1xudmFyIFJlbGF0aW9uQ291bnRNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uQ291bnRNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gb3B0aW9ucy5hcmdzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkgPSBvcHRpb25zLmFyZ3MucmVsYXRpb247XG4gICAgICAgIHRoaXMuYWxpYXMgPSBvcHRpb25zLmFyZ3MuYWxpYXM7XG4gICAgICAgIHRoaXMucXVlcnlCdWlsZGVyRmFjdG9yeSA9IG9wdGlvbnMuYXJncy5xdWVyeUJ1aWxkZXJGYWN0b3J5O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIHJlbGF0aW9uIGNvdW50IG1ldGFkYXRhIHByb3BlcnRpZXMuXG4gICAgICogVGhpcyBidWlsZGVyIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGFmdGVyIGVudGl0eSBtZXRhZGF0YSwgaXRzIHByb3BlcnRpZXMgbWFwIGFuZCBhbGwgcmVsYXRpb25zIGFyZSBidWlsZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvbkNvdW50TWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRoID0gdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVsYXRpb25OYW1lT3JGYWN0b3J5KHRoaXMuZW50aXR5TWV0YWRhdGEucHJvcGVydGllc01hcCkgOiB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeTtcbiAgICAgICAgdmFyIHJlbGF0aW9uID0gdGhpcy5lbnRpdHlNZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghcmVsYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGZpbmQgcmVsYXRpb24gXCIgKyBwcm9wZXJ0eVBhdGggKyBcIi4gV3JvbmcgcmVsYXRpb24gc3BlY2lmaWVkIGZvciBAUmVsYXRpb25Db3VudCBkZWNvcmF0b3IuXCIpO1xuICAgICAgICB0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudE1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uQ291bnRNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkNvdW50TWV0YWRhdGEuanMubWFwXG4iLCJpbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGVudGl0eSdzIHJlbGF0aW9uIGNvdW50LlxuICovXG52YXIgUmVsYXRpb25JZE1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25JZE1ldGFkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YSA9IG9wdGlvbnMuZW50aXR5TWV0YWRhdGE7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy5hcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeSA9IG9wdGlvbnMuYXJncy5yZWxhdGlvbjtcbiAgICAgICAgdGhpcy5hbGlhcyA9IG9wdGlvbnMuYXJncy5hbGlhcztcbiAgICAgICAgdGhpcy5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gb3B0aW9ucy5hcmdzLnF1ZXJ5QnVpbGRlckZhY3Rvcnk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyByZWxhdGlvbiBpZCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiB0b2RvOiBtYWtlIGl0IHRvIHdvcmsgaW4gZW1iZWRzIGFzIHdlbGwuXG4gICAgICovXG4gICAgUmVsYXRpb25JZE1ldGFkYXRhLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGludmVyc2VFbnRpdHkgPSB0aGlzLnJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGludmVyc2VFbnRpdHkpKSB7XG4gICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0gaW52ZXJzZUVudGl0eS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoaXRlbSk7XG4gICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoaW52ZXJzZUVudGl0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZGVyIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgcmVsYXRpb24gaWQgcHJvcGVydGllcy5cbiAgICAgKiBUaGlzIGJ1aWxkZXIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIgZW50aXR5IG1ldGFkYXRhLCBpdHMgcHJvcGVydGllcyBtYXAgYW5kIGFsbCByZWxhdGlvbnMgYXJlIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uSWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkodGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKSA6IHRoaXMucmVsYXRpb25OYW1lT3JGYWN0b3J5O1xuICAgICAgICB2YXIgcmVsYXRpb24gPSB0aGlzLmVudGl0eU1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKTtcbiAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgZmluZCByZWxhdGlvbiBcIiArIHByb3BlcnR5UGF0aCArIFwiLiBXcm9uZyByZWxhdGlvbiBzcGVjaWZpZWQgZm9yIEBSZWxhdGlvbklkIGRlY29yYXRvci5cIik7XG4gICAgICAgIHRoaXMucmVsYXRpb24gPSByZWxhdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbklkTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRNZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGEgfSBmcm9tIFwiLi9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBzb21lIGVudGl0eSdzIHJlbGF0aW9uLlxuICovXG52YXIgUmVsYXRpb25NZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uTWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBwYXJlbnQgKGNhbiBiZSBvbmx5IG1hbnktdG8tb25lIHJlbGF0aW9uKSByZWxhdGlvbiBpbiB0aGUgdHJlZSB0YWJsZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVHJlZVBhcmVudCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBjaGlsZHJlbiAoY2FuIGJlIG9ubHkgb25lLXRvLW1hbnkgcmVsYXRpb24pIHJlbGF0aW9uIGluIHRoZSB0cmVlIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmVlQ2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHJlbGF0aW9uJ3MgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gICAgICAgICAqIENhbiBiZSB1c2VkIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvd25lciBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyByZWxhdGlvbiBpcyBsYXppbHkgbG9hZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0xhenkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHJlbGF0aW9uIGlzIGVhZ2VybHkgbG9hZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0VhZ2VyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCBmb3IgdGhlIHJlbGF0aW9uLlxuICAgICAgICAgKiBCeSBkZWZhdWx0IGl0cyBlbmFibGVkLCBidXQgaWYgeW91IHdhbnQgdG8gYXZvaWQgYW55IGNoYW5nZXMgaW4gdGhlIHJlbGF0aW9uIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgZGF0YWJhc2UgeW91IGNhbiBkaXNhYmxlIGl0LlxuICAgICAgICAgKiBJZiBpdHMgZGlzYWJsZWQgeW91IGNhbiBvbmx5IGNoYW5nZSBhIHJlbGF0aW9uIGZyb20gaW52ZXJzZSBzaWRlIG9mIGEgcmVsYXRpb24gb3IgdXNpbmcgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBmdW5jdGlvbmFsaXR5LlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHNpbmNlIGl0cyBkaXNhYmxpbmcgYXZvaWQgbXVsdGlwbGUgZXh0cmEgcXVlcmllcyBkdXJpbmcgZW50aXR5IHNhdmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGVuIHJlbGF0ZWQgb2JqZWN0cyBhcmUgYWxsb3dlZCB0byBiZSBpbnNlcnRlZCB0byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZUluc2VydCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgcmVtb3ZlIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byB0cnVlIHRoZW4gcmVsYXRlZCBvYmplY3RzIGFyZSBhbGxvd2VkIHRvIGJlIHNvZnQtcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDYXNjYWRlU29mdFJlbW92ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZWNvdmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcmVsYXRpb24gY29sdW1uIHZhbHVlIGNhbiBiZSBudWxsYWJsZSBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgd2lsbCBiZSBjcmVhdGVkIGZvciBqb2luIGNvbHVtbnMuXG4gICAgICAgICAqIENhbiBiZSB1c2VkIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvd25lciBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3JlYXRlRm9yZWlnbktleUNvbnN0cmFpbnRzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHNpZGUgaXMgYW4gb3duZXIgb2YgdGhpcyByZWxhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPd25pbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHJlbGF0aW9uJ3MgdHlwZSBpcyBcIm9uZS10by1vbmVcIi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPbmVUb09uZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24gaXMgb3duZXIgc2lkZSBvZiB0aGUgXCJvbmUtdG8tb25lXCIgcmVsYXRpb24uXG4gICAgICAgICAqIE93bmVyIHNpZGUgbWVhbnMgdGhpcyBzaWRlIG9mIHJlbGF0aW9uIGhhcyBhIGpvaW4gY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU93bmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbiBoYXMgYSBqb2luIGNvbHVtbiAoZS5nLiBpcyBpdCBtYW55LXRvLW9uZSBvciBvbmUtdG8tb25lIG93bmVyIHNpZGUpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1dpdGhKb2luQ29sdW1uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbiBpcyBOT1Qgb3duZXIgc2lkZSBvZiB0aGUgXCJvbmUtdG8tb25lXCIgcmVsYXRpb24uXG4gICAgICAgICAqIE5PVCBvd25lciBzaWRlIG1lYW5zIHRoaXMgc2lkZSBvZiByZWxhdGlvbiBkb2VzIG5vdCBoYXZlIGEgam9pbiBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc09uZVRvT25lTm90T3duZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHJlbGF0aW9uJ3MgdHlwZSBpcyBcIm9uZS10by1tYW55XCIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzT25lVG9NYW55ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbidzIHR5cGUgaXMgXCJtYW55LXRvLW9uZVwiLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc01hbnlUb09uZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24ncyB0eXBlIGlzIFwibWFueS10by1tYW55XCIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24ncyB0eXBlIGlzIFwibWFueS10by1tYW55XCIsIGFuZCBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gICAgICAgICAqIE93bmVyIHNpZGUgbWVhbnMgdGhpcyBzaWRlIG9mIHJlbGF0aW9uIGhhcyBhIGpvaW4gdGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueU93bmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbidzIHR5cGUgaXMgXCJtYW55LXRvLW1hbnlcIiwgYW5kIGlzIE5PVCBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gICAgICAgICAqIE5vdCBvd25lciBzaWRlIG1lYW5zIHRoaXMgc2lkZSBvZiByZWxhdGlvbiBkb2VzIG5vdCBoYXZlIGEgam9pbiB0YWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNNYW55VG9NYW55Tm90T3duZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvcmVpZ24ga2V5cyBjcmVhdGVkIGZvciB0aGlzIHJlbGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSm9pbiB0YWJsZSBjb2x1bW5zLlxuICAgICAgICAgKiBKb2luIGNvbHVtbnMgY2FuIGJlIG9idGFpbmVkIG9ubHkgZnJvbSBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAgICAgICAgICogRnJvbSBub24tb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb24gam9pbiBjb2x1bW5zIHdpbGwgYmUgZW1wdHkuXG4gICAgICAgICAqIElmIHRoaXMgcmVsYXRpb24gaXMgYSBtYW55LXRvLW9uZS9vbmUtdG8tb25lIHRoZW4gaXQgdGFrZXMgam9pbiBjb2x1bW5zIGZyb20gdGhlIGN1cnJlbnQgZW50aXR5LlxuICAgICAgICAgKiBJZiB0aGlzIHJlbGF0aW9uIGlzIG1hbnktdG8tbWFueSB0aGVuIGl0IHRha2VzIGFsbCBvd25lciBqb2luIGNvbHVtbnMgZnJvbSB0aGUganVuY3Rpb24gZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW52ZXJzZSBqb2luIHRhYmxlIGNvbHVtbnMuXG4gICAgICAgICAqIEludmVyc2Ugam9pbiBjb2x1bW5zIGFyZSBzdXBwb3J0ZWQgb25seSBmb3IgbWFueS10by1tYW55IHJlbGF0aW9uc1xuICAgICAgICAgKiBhbmQgY2FuIGJlIG9idGFpbmVkIG9ubHkgZnJvbSBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAgICAgICAgICogRnJvbSBub24tb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb24gam9pbiBjb2x1bW5zIHdpbGwgYmUgdW5kZWZpbmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YSA9IG9wdGlvbnMuZW50aXR5TWV0YWRhdGE7XG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YSA9IG9wdGlvbnMuZW1iZWRkZWRNZXRhZGF0YTtcbiAgICAgICAgdmFyIGFyZ3MgPSBvcHRpb25zLmFyZ3M7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gYXJncy50YXJnZXQ7XG4gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gYXJncy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHRoaXMucmVsYXRpb25UeXBlID0gYXJncy5yZWxhdGlvblR5cGU7XG4gICAgICAgIGlmIChhcmdzLmludmVyc2VTaWRlUHJvcGVydHkpXG4gICAgICAgICAgICB0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkgPSBhcmdzLmludmVyc2VTaWRlUHJvcGVydHk7XG4gICAgICAgIHRoaXMuaXNMYXp5ID0gYXJncy5pc0xhenkgfHwgZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuaXNDYXNjYWRlSW5zZXJ0ID0gYXJncy5vcHRpb25zLmNhc2NhZGUgPT09IHRydWUgfHwgKGFyZ3Mub3B0aW9ucy5jYXNjYWRlIGluc3RhbmNlb2YgQXJyYXkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcImluc2VydFwiKSAhPT0gLTEpO1xuICAgICAgICAvLyB0aGlzLmlzQ2FzY2FkZVVwZGF0ZSA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChhcmdzLm9wdGlvbnMuY2FzY2FkZSBpbnN0YW5jZW9mIEFycmF5ICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJ1cGRhdGVcIikgIT09IC0xKTtcbiAgICAgICAgLy8gdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoYXJncy5vcHRpb25zLmNhc2NhZGUgaW5zdGFuY2VvZiBBcnJheSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVtb3ZlXCIpICE9PSAtMSk7XG4gICAgICAgIC8vIHRoaXMuaXNDYXNjYWRlU29mdFJlbW92ZSA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChhcmdzLm9wdGlvbnMuY2FzY2FkZSBpbnN0YW5jZW9mIEFycmF5ICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJzb2Z0LXJlbW92ZVwiKSAhPT0gLTEpO1xuICAgICAgICAvLyB0aGlzLmlzQ2FzY2FkZVJlY292ZXIgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoYXJncy5vcHRpb25zLmNhc2NhZGUgaW5zdGFuY2VvZiBBcnJheSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVjb3ZlclwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZUluc2VydCA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KGFyZ3Mub3B0aW9ucy5jYXNjYWRlKSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwiaW5zZXJ0XCIpICE9PSAtMSk7XG4gICAgICAgIHRoaXMuaXNDYXNjYWRlVXBkYXRlID0gYXJncy5vcHRpb25zLmNhc2NhZGUgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkoYXJncy5vcHRpb25zLmNhc2NhZGUpICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJ1cGRhdGVcIikgIT09IC0xKTtcbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShhcmdzLm9wdGlvbnMuY2FzY2FkZSkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcInJlbW92ZVwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZVNvZnRSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShhcmdzLm9wdGlvbnMuY2FzY2FkZSkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcInNvZnQtcmVtb3ZlXCIpICE9PSAtMSk7XG4gICAgICAgIHRoaXMuaXNDYXNjYWRlUmVjb3ZlciA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KGFyZ3Mub3B0aW9ucy5jYXNjYWRlKSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVjb3ZlclwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGFyZ3Mub3B0aW9ucy5wcmltYXJ5IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBhcmdzLm9wdGlvbnMubnVsbGFibGUgPT09IGZhbHNlIHx8IHRoaXMuaXNQcmltYXJ5ID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLm9uRGVsZXRlID0gYXJncy5vcHRpb25zLm9uRGVsZXRlO1xuICAgICAgICB0aGlzLm9uVXBkYXRlID0gYXJncy5vcHRpb25zLm9uVXBkYXRlO1xuICAgICAgICB0aGlzLmRlZmVycmFibGUgPSBhcmdzLm9wdGlvbnMuZGVmZXJyYWJsZTtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMgPSBhcmdzLm9wdGlvbnMuY3JlYXRlRm9yZWlnbktleUNvbnN0cmFpbnRzID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0VhZ2VyID0gYXJncy5vcHRpb25zLmVhZ2VyIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlRW5hYmxlZCA9IGFyZ3Mub3B0aW9ucy5wZXJzaXN0ZW5jZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMub3JwaGFuZWRSb3dBY3Rpb24gPSBhcmdzLm9wdGlvbnMub3JwaGFuZWRSb3dBY3Rpb24gfHwgXCJudWxsaWZ5XCI7XG4gICAgICAgIHRoaXMuaXNUcmVlUGFyZW50ID0gYXJncy5pc1RyZWVQYXJlbnQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaXNUcmVlQ2hpbGRyZW4gPSBhcmdzLmlzVHJlZUNoaWxkcmVuIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnR5cGUgPSBhcmdzLnR5cGUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGFyZ3MudHlwZSgpIDogYXJncy50eXBlO1xuICAgICAgICB0aGlzLmlzT25lVG9PbmUgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJvbmUtdG8tb25lXCI7XG4gICAgICAgIHRoaXMuaXNPbmVUb01hbnkgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJvbmUtdG8tbWFueVwiO1xuICAgICAgICB0aGlzLmlzTWFueVRvT25lID0gdGhpcy5yZWxhdGlvblR5cGUgPT09IFwibWFueS10by1vbmVcIjtcbiAgICAgICAgdGhpcy5pc01hbnlUb01hbnkgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJtYW55LXRvLW1hbnlcIjtcbiAgICAgICAgdGhpcy5pc09uZVRvT25lTm90T3duZXIgPSB0aGlzLmlzT25lVG9PbmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMuaXNNYW55VG9NYW55Tm90T3duZXIgPSB0aGlzLmlzTWFueVRvTWFueSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGpvaW4gY29sdW1uIGlkcyBtYXAgZnJvbSB0aGUgZ2l2ZW4gcmVsYXRlZCBlbnRpdHkgaWRzIGFycmF5LlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmdldFJlbGF0aW9uSWRNYXAgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHRoaXMuaXNPd25pbmcgPyB0aGlzLmpvaW5Db2x1bW5zIDogdGhpcy5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1ucyA9IGpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uOyB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbnRpdHlcIiwgZW50aXR5KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWZlcmVuY2VkQ29sdW1uc1wiLCByZWZlcmVuY2VkQ29sdW1ucyk7XG4gICAgICAgIHJldHVybiBFbnRpdHlNZXRhZGF0YS5nZXRWYWx1ZU1hcChlbnRpdHksIHJlZmVyZW5jZWRDb2x1bW5zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCBnaXZlbiBvYmplY3QgaXMgYW4gZW50aXR5IGlkIG1hcC5cbiAgICAgKiBJZiBnaXZlbiBpZCBpcyBhbiBvYmplY3QgdGhlbiBpdCBtZWFucyBpdHMgYWxyZWFkeSBpZCBtYXAuXG4gICAgICogSWYgZ2l2ZW4gaWQgaXNuJ3QgYW4gb2JqZWN0IHRoZW4gaXQgbWVhbnMgaXRzIGEgdmFsdWUgb2YgdGhlIGlkIGNvbHVtblxuICAgICAqIGFuZCBpdCBjcmVhdGVzIGEgbmV3IGlkIG1hcCB3aXRoIHRoaXMgdmFsdWUgYW5kIG5hbWUgb2YgdGhlIHByaW1hcnkgY29sdW1uLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmVuc3VyZVJlbGF0aW9uSWRNYXAgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB2YXIgam9pbkNvbHVtbnMgPSB0aGlzLmlzT3duaW5nID8gdGhpcy5qb2luQ29sdW1ucyA6IHRoaXMuaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zO1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSBqb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHsgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbjsgfSk7XG4gICAgICAgIGlmIChyZWZlcmVuY2VkQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBjcmVhdGUgcmVsYXRpb24gaWQgbWFwIGZvciBhIHNpbmdsZSB2YWx1ZSBiZWNhdXNlIHJlbGF0aW9uIGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZWQgY29sdW1ucy5cIik7XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkQ29sdW1uc1swXS5jcmVhdGVWYWx1ZU1hcChpZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqIElmIGNvbHVtbiBpcyBpbiBlbWJlZGRlZCAob3IgcmVjdXJzaXZlIGVtYmVkZGVkKSBpdCBleHRyYWN0cyBpdHMgdmFsdWUgZnJvbSB0aGVyZS5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHksIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGVudGl0eSA9PT0gbnVsbCB8fCBlbnRpdHkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRkZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZXhhbXBsZTogcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdLmlkIHdoZXJlIFwiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIgYW5kIFwiY291bnRlcnNcIiBhcmUgZW1iZWRkZWRzXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCB2YWx1ZSBvZiBcImlkXCIgY29sdW1uIGZyb20gdGhlIHBvc3QgcmVhbCBlbnRpdHkgb2JqZWN0XG4gICAgICAgICAgICAvLyBmaXJzdCBzdGVwIC0gd2UgZXh0cmFjdCBhbGwgcGFyZW50IHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSByZWxhdGl2ZSB0byB0aGlzIGNvbHVtbiwgZS5nLiBbZGF0YSwgaW5mb3JtYXRpb24sIGNvdW50ZXJzXVxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBuZXh0IHdlIG5lZWQgdG8gYWNjZXNzIHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXVt0aGlzLnByb3BlcnR5TmFtZV0gdG8gZ2V0IGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBjb3VudGVyc1xuICAgICAgICAgICAgLy8gdGhpcyByZWN1cnNpdmUgZnVuY3Rpb24gdGFrZXMgYXJyYXkgb2YgZ2VuZXJhdGVkIHByb3BlcnR5IG5hbWVzIGFuZCBnZXRzIHRoZSBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10gZW1iZWRcbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZXMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMShwcm9wZXJ0eU5hbWVzLCB2YWx1ZVtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBnZXQgbmVzdGVkIGVtYmVkIG9iamVjdCB3ZSBnZXQgaXRzIGNvbHVtbiwgZS5nLiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRPYmplY3QgPSBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xKHByb3BlcnR5TmFtZXMsIGVudGl0eSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRPYmplY3RbXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCJdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdFtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl07XG4gICAgICAgICAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdCA/IGVtYmVkZGVkT2JqZWN0W3RoaXMuaXNMYXp5ID8gXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCIgOiB0aGlzLnByb3BlcnR5TmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBuYW1lIGJ5IHByb3BlcnR5IG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudGl0eVtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eVtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl07XG4gICAgICAgICAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBnaXZlbiBlbnRpdHkncyByZWxhdGlvbidzIHZhbHVlLlxuICAgICAqIFVzaW5nIG9mIHRoaXMgbWV0aG9kIGhlbHBzIHRvIHNldCBlbnRpdHkgcmVsYXRpb24ncyB2YWx1ZSBvZiB0aGUgbGF6eSBhbmQgbm9uLWxhenkgcmVsYXRpb25zLlxuICAgICAqXG4gICAgICogSWYgbWVyZ2UgaXMgc2V0IHRvIHRydWUsIGl0IG1lcmdlcyBnaXZlbiB2YWx1ZSBpbnRvIGN1cnJlbnRseVxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLnNldEVudGl0eVZhbHVlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHRoaXMuaXNMYXp5ID8gXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCIgOiB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8yID0gZnVuY3Rpb24gKGVtYmVkZGVkTWV0YWRhdGFzLCBtYXApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIW9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgLy8gICAgIG9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0gPSBlbWJlZGRlZE1ldGFkYXRhLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBbZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eU5hbWVdID0gZW1iZWRkZWRNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMihlbWJlZGRlZE1ldGFkYXRhcywgbWFwW2VtYmVkZGVkTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMihfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLmVtYmVkZGVkTWV0YWRhdGFUcmVlKSwgZmFsc2UpLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50aXR5W3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBlbnRpdHkgaWQgbWFwIGZyb20gdGhlIGdpdmVuIGVudGl0eSBpZHMgYXJyYXkuXG4gICAgICovXG4gICAgUmVsYXRpb25NZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlVmFsdWVNYXAgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBleHRyYWN0IGNvbHVtbiB2YWx1ZSBmcm9tIGVtYmVkcyBvZiBlbnRpdHkgaWYgY29sdW1uIGlzIGluIGVtYmVkZGVkXG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXS5pZCB3aGVyZSBcImRhdGFcIiwgXCJpbmZvcm1hdGlvblwiIGFuZCBcImNvdW50ZXJzXCIgYXJlIGVtYmVkZGVkc1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdmFsdWUgb2YgXCJpZFwiIGNvbHVtbiBmcm9tIHRoZSBwb3N0IHJlYWwgZW50aXR5IG9iamVjdCBhbmQgcmV0dXJuIGl0IGluIGFcbiAgICAgICAgICAgIC8vIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogeyBpZDogLi4uIH0gfSB9IH0gZm9ybWF0XG4gICAgICAgICAgICAvLyBmaXJzdCBzdGVwIC0gd2UgZXh0cmFjdCBhbGwgcGFyZW50IHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSByZWxhdGl2ZSB0byB0aGlzIGNvbHVtbiwgZS5nLiBbZGF0YSwgaW5mb3JtYXRpb24sIGNvdW50ZXJzXVxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBub3cgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdIHRvIGdldCBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgY291bnRlcnNcbiAgICAgICAgICAgIC8vIGFuZCBvbiBlYWNoIHN0ZXAgd2UgbmVlZCB0byBjcmVhdGUgY29tcGxleCBsaXRlcmFsIG9iamVjdCwgZS5nLiBmaXJzdCB7IGRhdGEgfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uIH0gfSwgdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnMgfSB9IH0sXG4gICAgICAgICAgICAvLyB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogW3RoaXMucHJvcGVydHlOYW1lXTogZW50aXR5W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdIH0gfSB9XG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiBoZWxwcyBkb2luZyB0aGF0XG4gICAgICAgICAgICB2YXIgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWVzLCBtYXApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW3Byb3BlcnR5TmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyhwcm9wZXJ0eU5hbWVzLCBtYXBbcHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyhwcm9wZXJ0eU5hbWVzLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sIF9hW3RoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlLCBfYTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIHJlbGF0aW9uIG1ldGFkYXRhIHByb3BlcnRpZXMuXG4gICAgICogVGhpcyBidWlsZGVyIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGFmdGVyIGVtYmVkZGVkIG1ldGFkYXRhIHRyZWUgd2FzIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHRoaXMuYnVpbGRQcm9wZXJ0eVBhdGgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBnaXZlbiBmb3JlaWduIGtleXMgaW4gdGhlIHJlbGF0aW9uLlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9yZWlnbiBrZXkgaW4gdGhlIHJlbGF0aW9uLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLnJlZ2lzdGVyRm9yZWlnbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGZvcmVpZ25LZXlzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBmb3JlaWduS2V5c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuZm9yZWlnbktleXMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChmb3JlaWduS2V5cyksIGZhbHNlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgZ2l2ZW4gam9pbiBjb2x1bW5zIGluIHRoZSByZWxhdGlvbi5cbiAgICAgKiBUaGlzIGJ1aWxkZXIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGpvaW4gY29sdW1uIGluIHRoZSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5yZWdpc3RlckpvaW5Db2x1bW5zID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCBpbnZlcnNlSm9pbkNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGpvaW5Db2x1bW5zID09PSB2b2lkIDApIHsgam9pbkNvbHVtbnMgPSBbXTsgfVxuICAgICAgICBpZiAoaW52ZXJzZUpvaW5Db2x1bW5zID09PSB2b2lkIDApIHsgaW52ZXJzZUpvaW5Db2x1bW5zID0gW107IH1cbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zO1xuICAgICAgICB0aGlzLmludmVyc2VKb2luQ29sdW1ucyA9IGludmVyc2VKb2luQ29sdW1ucztcbiAgICAgICAgdGhpcy5pc093bmluZyA9IHRoaXMuaXNNYW55VG9PbmUgfHwgKCh0aGlzLmlzTWFueVRvTWFueSB8fCB0aGlzLmlzT25lVG9PbmUpICYmIHRoaXMuam9pbkNvbHVtbnMubGVuZ3RoID4gMCk7XG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU93bmVyID0gdGhpcy5pc09uZVRvT25lICYmIHRoaXMuaXNPd25pbmc7XG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU5vdE93bmVyID0gdGhpcy5pc09uZVRvT25lICYmICF0aGlzLmlzT3duaW5nO1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueU93bmVyID0gdGhpcy5pc01hbnlUb01hbnkgJiYgdGhpcy5pc093bmluZztcbiAgICAgICAgdGhpcy5pc01hbnlUb01hbnlOb3RPd25lciA9IHRoaXMuaXNNYW55VG9NYW55ICYmICF0aGlzLmlzT3duaW5nO1xuICAgICAgICB0aGlzLmlzV2l0aEpvaW5Db2x1bW4gPSB0aGlzLmlzTWFueVRvT25lIHx8IHRoaXMuaXNPbmVUb09uZU93bmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgZ2l2ZW4ganVuY3Rpb24gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2QgY2FuIGJlIGNhbGxlZCBhZnRlciBqdW5jdGlvbiBlbnRpdHkgbWV0YWRhdGEgZm9yIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgUmVsYXRpb25NZXRhZGF0YS5wcm90b3R5cGUucmVnaXN0ZXJKdW5jdGlvbkVudGl0eU1ldGFkYXRhID0gZnVuY3Rpb24gKGp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhID0ganVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5qb2luVGFibGVOYW1lID0ganVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgIGlmICh0aGlzLmludmVyc2VSZWxhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbnZlcnNlUmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSA9IGp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICB0aGlzLmpvaW5UYWJsZU5hbWUgPSBqdW5jdGlvbkVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGludmVyc2Ugc2lkZSBwcm9wZXJ0eSBwYXRoIGJhc2VkIG9uIGdpdmVuIGludmVyc2Ugc2lkZSBwcm9wZXJ0eSBmYWN0b3J5LlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlciBwcm9wZXJ0aWVzIG1hcCBvZiB0aGUgaW52ZXJzZSBlbnRpdHkgbWV0YWRhdGEgd2FzIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkSW52ZXJzZVNpZGVQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkpIHtcbiAgICAgICAgICAgIHZhciBvd25lckVudGl0eVByb3BlcnRpZXNNYXAgPSB0aGlzLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5naXZlbkludmVyc2VTaWRlUHJvcGVydHlGYWN0b3J5KG93bmVyRW50aXR5UHJvcGVydGllc01hcCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2l2ZW5JbnZlcnNlU2lkZVByb3BlcnR5RmFjdG9yeSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5naXZlbkludmVyc2VTaWRlUHJvcGVydHlGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNUcmVlUGFyZW50ICYmIHRoaXMuZW50aXR5TWV0YWRhdGEudHJlZUNoaWxkcmVuUmVsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudGl0eU1ldGFkYXRhLnRyZWVDaGlsZHJlblJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVHJlZUNoaWxkcmVuICYmIHRoaXMuZW50aXR5TWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlNZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbGF0aW9uJ3MgcHJvcGVydHkgcGF0aCBiYXNlZCBvbiBpdHMgZW1iZWRkZWQgdHJlZS5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVtYmVkZGVkTWV0YWRhdGEgfHwgIXRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmpvaW4oXCIuXCIpICsgXCIuXCIgKyB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbk1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uTWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25NZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBVbmlxdWUgbWV0YWRhdGEgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRhYmxlJ3MgdW5pcXVlIGNvbnN0cmFpbnRzLlxuICovXG52YXIgVW5pcXVlTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBVbmlxdWVNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWUgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTWFwIG9mIGNvbHVtbiBuYW1lcyB3aXRoIG9yZGVyIHNldC5cbiAgICAgICAgICogVXNlZCBvbmx5IGJ5IE1vbmdvREIgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IHt9O1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZE1ldGFkYXRhID0gb3B0aW9ucy5lbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmdpdmVuTmFtZSA9IG9wdGlvbnMuYXJncy5uYW1lO1xuICAgICAgICAgICAgdGhpcy5naXZlbkNvbHVtbk5hbWVzID0gb3B0aW9ucy5hcmdzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgdW5pcXVlIGNvbnN0cmFpbnQgcHJvcGVydGllcy5cbiAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgZW50aXR5IG1ldGFkYXRhJ3MgcHJvcGVydGllcyBtYXAsIGNvbHVtbnMgYW5kIHJlbGF0aW9ucyBhcmUgYnVpbHQuXG4gICAgICovXG4gICAgVW5pcXVlTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKG5hbWluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtYXAgPSB7fTtcbiAgICAgICAgLy8gaWYgY29sdW1ucyBhbHJlYWR5IGFuIGFycmF5IG9mIHN0cmluZyB0aGVuIHNpbXBseSByZXR1cm4gaXRcbiAgICAgICAgaWYgKHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcykge1xuICAgICAgICAgICAgdmFyIGNvbHVtblByb3BlcnR5UGF0aHMgPSBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcykpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Qcm9wZXJ0eVBhdGhzID0gdGhpcy5naXZlbkNvbHVtbk5hbWVzLm1hcChmdW5jdGlvbiAoY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZW1iZWRkZWRNZXRhZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5UGF0aCArIFwiLlwiICsgY29sdW1uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7IHJldHVybiBtYXBbcHJvcGVydHlQYXRoXSA9IDE7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgY29sdW1ucyBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGVuIGV4ZWN1dGUgaXQgYW5kIGdldCBjb2x1bW5zIG5hbWVzIGZyb20gaXRcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0ZuUmVzdWx0XzEgPSB0aGlzLmdpdmVuQ29sdW1uTmFtZXModGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5zRm5SZXN1bHRfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IGNvbHVtbnNGblJlc3VsdF8xLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gU3RyaW5nKGkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXBbbmFtZV0gPSAxOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gbWFwW2NvbHVtbk5hbWVdID0gY29sdW1uc0ZuUmVzdWx0XzFbY29sdW1uTmFtZV07IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtblByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uV2l0aFNhbWVOYW1lID0gX3RoaXMuZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbldpdGhTYW1lTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2NvbHVtbldpdGhTYW1lTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbldpdGhTYW1lTmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNXaXRoSm9pbkNvbHVtbiAmJiByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uV2l0aFNhbWVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbldpdGhTYW1lTmFtZS5qb2luQ29sdW1ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4TmFtZSA9IF90aGlzLmdpdmVuTmFtZSA/IFwiXFxcIlwiICsgX3RoaXMuZ2l2ZW5OYW1lICsgXCJcXFwiIFwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5TmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlVuaXF1ZSBjb25zdHJhaW50IFwiICsgaW5kZXhOYW1lICsgXCJjb250YWlucyBjb2x1bW4gdGhhdCBpcyBtaXNzaW5nIGluIHRoZSBlbnRpdHkgKFwiICsgZW50aXR5TmFtZSArIFwiKTogXCIgKyBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKGZ1bmN0aW9uICh1cGRhdGVkTWFwLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdGhpcy5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtjb2x1bW4uZGF0YWJhc2VQYXRoXSA9IG1hcFtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWUgPyB0aGlzLmdpdmVuTmFtZSA6IG5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRoaXMuZW50aXR5TWV0YWRhdGEudGFibGVOYW1lLCB0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWU7IH0pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gVW5pcXVlTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgVW5pcXVlTWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlTWV0YWRhdGEuanMubWFwXG4iLCIvKipcbiAqIFByb3ZpZGVzIGEgY29uc3RhbnRzIGZvciBlYWNoIGVudGl0eSBsaXN0ZW5lciB0eXBlLlxuICovXG52YXIgRXZlbnRMaXN0ZW5lclR5cGVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50TGlzdGVuZXJUeXBlcygpIHtcbiAgICB9XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX0xPQUQgPSBcImFmdGVyLWxvYWRcIjtcbiAgICBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX0lOU0VSVCA9IFwiYmVmb3JlLWluc2VydFwiO1xuICAgIEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9JTlNFUlQgPSBcImFmdGVyLWluc2VydFwiO1xuICAgIEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfVVBEQVRFID0gXCJiZWZvcmUtdXBkYXRlXCI7XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX1VQREFURSA9IFwiYWZ0ZXItdXBkYXRlXCI7XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkJFRk9SRV9SRU1PVkUgPSBcImJlZm9yZS1yZW1vdmVcIjtcbiAgICBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfUkVNT1ZFID0gXCJhZnRlci1yZW1vdmVcIjtcbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lclR5cGVzO1xufSgpKTtcbmV4cG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudExpc3RlbmVyVHlwZXMuanMubWFwXG4iLCIvKipcbiAqIFJlcHJlc2VudHMgZW50aXR5IG9mIHRoZSBtaWdyYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICovXG52YXIgTWlncmF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBNaWdyYXRpb24oaWQsIHRpbWVzdGFtcCwgbmFtZSwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gTWlncmF0aW9uO1xufSgpKTtcbmV4cG9ydCB7IE1pZ3JhdGlvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaWdyYXRpb24uanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IE1pZ3JhdGlvbiB9IGZyb20gXCIuL01pZ3JhdGlvblwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNc3NxbFBhcmFtZXRlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL01zc3FsUGFyYW1ldGVyXCI7XG5pbXBvcnQgeyBSZGJtc1NjaGVtYUJ1aWxkZXIgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvUmRibXNTY2hlbWFCdWlsZGVyXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEV4ZWN1dGVzIG1pZ3JhdGlvbnM6IHJ1bnMgcGVuZGluZyBhbmQgcmV2ZXJ0cyBwcmV2aW91c2x5IGV4ZWN1dGVkIG1pZ3JhdGlvbnMuXG4gKi9cbnZhciBNaWdyYXRpb25FeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gTWlncmF0aW9uRXhlY3V0b3IoY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBob3cgbWlncmF0aW9ucyBzaG91bGQgYmUgcnVuIGluIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogICBhbGw6IGFsbCBtaWdyYXRpb25zIGFyZSBydW4gaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICogICBub25lOiBhbGwgbWlncmF0aW9ucyBhcmUgcnVuIHdpdGhvdXQgYSB0cmFuc2FjdGlvblxuICAgICAgICAgKiAgIGVhY2g6IGVhY2ggbWlncmF0aW9uIGlzIHJ1biBpbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gXCJhbGxcIjtcbiAgICAgICAgdmFyIHNjaGVtYSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2U7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc0RhdGFiYXNlID0gZGF0YWJhc2U7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc1NjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5taWdyYXRpb25zVGFibGVOYW1lID0gY29ubmVjdGlvbi5vcHRpb25zLm1pZ3JhdGlvbnNUYWJsZU5hbWUgfHwgXCJtaWdyYXRpb25zXCI7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc1RhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZSh0aGlzLm1pZ3JhdGlvbnNUYWJsZU5hbWUsIHNjaGVtYSwgZGF0YWJhc2UpO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gZXhlY3V0ZSBhIHNpbmdsZSBtaWdyYXRpb24gZ2l2ZW4uXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMud2l0aFF1ZXJ5UnVubmVyKGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWlncmF0aW9uLmluc3RhbmNlLnVwKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbWlncmF0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1pZ3JhdGlvbnMuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldEFsbE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0TWlncmF0aW9ucygpKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBleGVjdXRlZCBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5nZXRFeGVjdXRlZE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMud2l0aFF1ZXJ5UnVubmVyKGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkRXhlY3V0ZWRNaWdyYXRpb25zKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBwZW5kaW5nIG1pZ3JhdGlvbnMuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldFBlbmRpbmdNaWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYWxsTWlncmF0aW9ucywgZXhlY3V0ZWRNaWdyYXRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEFsbE1pZ3JhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1pZ3JhdGlvbnMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEV4ZWN1dGVkTWlncmF0aW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbE1pZ3JhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFleGVjdXRlZE1pZ3JhdGlvbnMuZmluZChmdW5jdGlvbiAoZXhlY3V0ZWRNaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZE1pZ3JhdGlvbi5uYW1lID09PSBtaWdyYXRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gZXhlY3V0ZWQgbWlncmF0aW9uLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5pbnNlcnRNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhRdWVyeVJ1bm5lcihmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocSwgbWlncmF0aW9uKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGFuIGV4ZWN1dGVkIG1pZ3JhdGlvbi5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUuZGVsZXRlTWlncmF0aW9uID0gZnVuY3Rpb24gKG1pZ3JhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoUXVlcnlSdW5uZXIoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLmRlbGV0ZUV4ZWN1dGVkTWlncmF0aW9uKHEsIG1pZ3JhdGlvbik7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTGlzdHMgYWxsIG1pZ3JhdGlvbnMgYW5kIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQgb3Igbm90XG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSB1bmFwcGxpZWQgbWlncmF0aW9uc1xuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5zaG93TWlncmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGhhc1VuYXBwbGllZE1pZ3JhdGlvbnMsIHF1ZXJ5UnVubmVyLCBleGVjdXRlZE1pZ3JhdGlvbnMsIGFsbE1pZ3JhdGlvbnMsIF9sb29wXzEsIHRoaXNfMSwgYWxsTWlncmF0aW9uc18xLCBhbGxNaWdyYXRpb25zXzFfMSwgbWlncmF0aW9uO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmFwcGxpZWRNaWdyYXRpb25zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9ucyB0YWJsZSBpZiBpdHMgbm90IGNyZWF0ZWQgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG1pZ3JhdGlvbnMgdGFibGUgaWYgaXRzIG5vdCBjcmVhdGVkIHlldFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkRXhlY3V0ZWRNaWdyYXRpb25zKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkTWlncmF0aW9ucyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1pZ3JhdGlvbnMgPSB0aGlzLmdldE1pZ3JhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEgPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGVkTWlncmF0aW9uID0gZXhlY3V0ZWRNaWdyYXRpb25zLmZpbmQoZnVuY3Rpb24gKGV4ZWN1dGVkTWlncmF0aW9uKSB7IHJldHVybiBleGVjdXRlZE1pZ3JhdGlvbi5uYW1lID09PSBtaWdyYXRpb24ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGVkTWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcIiBbWF0gXCIgKyBtaWdyYXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmFwcGxpZWRNaWdyYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiIFsgXSBcIiArIG1pZ3JhdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhbGxNaWdyYXRpb25zXzEgPSBfX3ZhbHVlcyhhbGxNaWdyYXRpb25zKSwgYWxsTWlncmF0aW9uc18xXzEgPSBhbGxNaWdyYXRpb25zXzEubmV4dCgpOyAhYWxsTWlncmF0aW9uc18xXzEuZG9uZTsgYWxsTWlncmF0aW9uc18xXzEgPSBhbGxNaWdyYXRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZ3JhdGlvbiA9IGFsbE1pZ3JhdGlvbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKG1pZ3JhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxNaWdyYXRpb25zXzFfMSAmJiAhYWxsTWlncmF0aW9uc18xXzEuZG9uZSAmJiAoX2EgPSBhbGxNaWdyYXRpb25zXzEucmV0dXJuKSkgX2EuY2FsbChhbGxNaWdyYXRpb25zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgaGFzVW5hcHBsaWVkTWlncmF0aW9uc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYWxsIHBlbmRpbmcgbWlncmF0aW9ucy4gUGVuZGluZyBtaWdyYXRpb25zIGFyZSBtaWdyYXRpb25zIHRoYXQgYXJlIG5vdCB5ZXQgZXhlY3V0ZWQsXG4gICAgICogdGh1cyBub3Qgc2F2ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5leGVjdXRlUGVuZGluZ01pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgc2NoZW1hQnVpbGRlciwgZXhlY3V0ZWRNaWdyYXRpb25zLCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLCBhbGxNaWdyYXRpb25zLCBzdWNjZXNzTWlncmF0aW9ucywgcGVuZGluZ01pZ3JhdGlvbnMsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIF9sb29wXzIsIHRoaXNfMiwgcGVuZGluZ01pZ3JhdGlvbnNfMSwgcGVuZGluZ01pZ3JhdGlvbnNfMV8xLCBtaWdyYXRpb24sIGVfMl8xLCBlcnJfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG1pZ3JhdGlvbnMgdGFibGUgaWYgaXRzIG5vdCBjcmVhdGVkIHlldFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVNaWdyYXRpb25zVGFibGVJZk5vdEV4aXN0KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtaWdyYXRpb25zIHRhYmxlIGlmIGl0cyBub3QgY3JlYXRlZCB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUJ1aWxkZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZVNjaGVtYUJ1aWxkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjaGVtYUJ1aWxkZXIgaW5zdGFuY2VvZiBSZGJtc1NjaGVtYUJ1aWxkZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHNjaGVtYUJ1aWxkZXIuY3JlYXRlTWV0YWRhdGFUYWJsZUlmTmVjZXNzYXJ5KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRFeGVjdXRlZE1pZ3JhdGlvbnMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbiA9IHRoaXMuZ2V0TGF0ZXN0VGltZXN0YW1wTWlncmF0aW9uKGV4ZWN1dGVkTWlncmF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxNaWdyYXRpb25zID0gdGhpcy5nZXRNaWdyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzTWlncmF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pZ3JhdGlvbnMgPSBhbGxNaWdyYXRpb25zLmZpbHRlcihmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGV4ZWN1dGVkIG1pZ3JhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRlZE1pZ3JhdGlvbiA9IGV4ZWN1dGVkTWlncmF0aW9ucy5maW5kKGZ1bmN0aW9uIChleGVjdXRlZE1pZ3JhdGlvbikgeyByZXR1cm4gZXhlY3V0ZWRNaWdyYXRpb24ubmFtZSA9PT0gbWlncmF0aW9uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZE1pZ3JhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiBpcyBuZXcgYW5kIG5vdCBleGVjdXRlZC4gbm93IGNoZWNrIGlmIGl0cyB0aW1lc3RhbXAgaXMgY29ycmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uICYmIG1pZ3JhdGlvbi50aW1lc3RhbXAgPCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLnRpbWVzdGFtcClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgTmV3IG1pZ3JhdGlvbiBmb3VuZDogJHttaWdyYXRpb24ubmFtZX0sIGhvd2V2ZXIgdGhpcyBtaWdyYXRpb24ncyB0aW1lc3RhbXAgaXMgbm90IHZhbGlkLiBNaWdyYXRpb24ncyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSBvbGRlciB0aGVuIG1pZ3JhdGlvbnMgYWxyZWFkeSBleGVjdXRlZCBpbiB0aGUgZGF0YWJhc2UuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgY2hlY2sgaXMgcGFzc2VkIG1lYW5zIHRoYXQgbWlncmF0aW9uIHdhcyBub3QgcnVuIHlldCBhbmQgd2UgbmVlZCB0byBydW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcGVuZGluZ01pZ3JhdGlvbnMubGVuZ3RoKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJObyBtaWdyYXRpb25zIGFyZSBwZW5kaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGluZm9ybWF0aW9uIGFib3V0IG1pZ3JhdGlvbiBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoZXhlY3V0ZWRNaWdyYXRpb25zLmxlbmd0aCArIFwiIG1pZ3JhdGlvbnMgYXJlIGFscmVhZHkgbG9hZGVkIGluIHRoZSBkYXRhYmFzZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKGFsbE1pZ3JhdGlvbnMubGVuZ3RoICsgXCIgbWlncmF0aW9ucyB3ZXJlIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKGxhc3RUaW1lRXhlY3V0ZWRNaWdyYXRpb24ubmFtZSArIFwiIGlzIHRoZSBsYXN0IGV4ZWN1dGVkIG1pZ3JhdGlvbi4gSXQgd2FzIGV4ZWN1dGVkIG9uIFwiICsgbmV3IERhdGUobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi50aW1lc3RhbXApLnRvU3RyaW5nKCkgKyBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKHBlbmRpbmdNaWdyYXRpb25zLmxlbmd0aCArIFwiIG1pZ3JhdGlvbnMgYXJlIG5ldyBtaWdyYXRpb25zIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy50cmFuc2FjdGlvbiA9PT0gXCJhbGxcIiAmJiAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbOSwgMjAsIDI1LCAyOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMiA9IGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzXzIudHJhbnNhY3Rpb24gPT09IFwiZWFjaFwiICYmICFxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb24uaW5zdGFuY2UudXAocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nTWlncmF0aW9uKFwiTWlncmF0aW9uIFxcXCJcIiArIG1pZ3JhdGlvbi5uYW1lICsgXCJcXFwiIGhhcyBiZWVuIGZhaWxlZCwgZXJyb3I6IFwiICsgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gbm93IHdoZW4gbWlncmF0aW9uIGlzIGV4ZWN1dGVkIHdlIG5lZWQgdG8gaW5zZXJ0IHJlY29yZCBhYm91dCBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnRyYW5zYWN0aW9uID09PSBcImVhY2hcIiAmJiB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NNaWdyYXRpb25zLnB1c2gobWlncmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJNaWdyYXRpb24gXCIgKyBtaWdyYXRpb24ubmFtZSArIFwiIGhhcyBiZWVuIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzIgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMTAsIDE1LCAxNiwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWdyYXRpb25zXzEgPSBfX3ZhbHVlcyhwZW5kaW5nTWlncmF0aW9ucyksIHBlbmRpbmdNaWdyYXRpb25zXzFfMSA9IHBlbmRpbmdNaWdyYXRpb25zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBlbmRpbmdNaWdyYXRpb25zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb24gPSBwZW5kaW5nTWlncmF0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMihtaWdyYXRpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTWlncmF0aW9uc18xXzEgPSBwZW5kaW5nTWlncmF0aW9uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ01pZ3JhdGlvbnNfMV8xICYmICFwZW5kaW5nTWlncmF0aW9uc18xXzEuZG9uZSAmJiAoX2EgPSBwZW5kaW5nTWlncmF0aW9uc18xLnJldHVybikpIF9hLmNhbGwocGVuZGluZ01pZ3JhdGlvbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy50cmFuc2FjdGlvbiA9PT0gXCJhbGxcIiAmJiB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE5O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OiByZXR1cm4gWzMgLypicmVhayovLCAyOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMjEsIDIzLCAsIDI0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OiB0aHJvdyBlcnJfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMucXVlcnlSdW5uZXIpIHJldHVybiBbMyAvKmJyZWFrKi8sIDI3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OiByZXR1cm4gWzIgLypyZXR1cm4qLywgc3VjY2Vzc01pZ3JhdGlvbnNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldmVydHMgbGFzdCBtaWdyYXRpb24gdGhhdCB3ZXJlIHJ1bi5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUudW5kb0xhc3RNaWdyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgZXhlY3V0ZWRNaWdyYXRpb25zLCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLCBhbGxNaWdyYXRpb25zLCBtaWdyYXRpb25Ub1JldmVydCwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgZXJyXzIsIHJvbGxiYWNrRXJyb3JfMjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtaWdyYXRpb25zIHRhYmxlIGlmIGl0cyBub3QgY3JlYXRlZCB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTWlncmF0aW9uc1RhYmxlSWZOb3RFeGlzdChxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9ucyB0YWJsZSBpZiBpdHMgbm90IGNyZWF0ZWQgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRFeGVjdXRlZE1pZ3JhdGlvbnMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbiA9IHRoaXMuZ2V0TGF0ZXN0RXhlY3V0ZWRNaWdyYXRpb24oZXhlY3V0ZWRNaWdyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1pZ3JhdGlvbnMgZm91bmQgaW4gdGhlIGRhdGFiYXNlIHRoZW4gbm90aGluZyB0byByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJObyBtaWdyYXRpb25zIHdhcyBmb3VuZCBpbiB0aGUgZGF0YWJhc2UuIE5vdGhpbmcgdG8gcmV2ZXJ0IVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxNaWdyYXRpb25zID0gdGhpcy5nZXRNaWdyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25Ub1JldmVydCA9IGFsbE1pZ3JhdGlvbnMuZmluZChmdW5jdGlvbiAobWlncmF0aW9uKSB7IHJldHVybiBtaWdyYXRpb24ubmFtZSA9PT0gbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1pZ3JhdGlvbnMgZm91bmQgaW4gdGhlIGRhdGFiYXNlIHRoZW4gbm90aGluZyB0byByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWlncmF0aW9uVG9SZXZlcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vIG1pZ3JhdGlvbiBcIiArIGxhc3RUaW1lRXhlY3V0ZWRNaWdyYXRpb24ubmFtZSArIFwiIHdhcyBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuIE1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGlzIG1pZ3JhdGlvbiBpbiB5b3VyIGNvZGViYXNlIGFuZCBpdHMgaW5jbHVkZWQgaW4gdGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgaW5mb3JtYXRpb24gYWJvdXQgbWlncmF0aW9uIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChleGVjdXRlZE1pZ3JhdGlvbnMubGVuZ3RoICsgXCIgbWlncmF0aW9ucyBhcmUgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIGRhdGFiYXNlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi5uYW1lICsgXCIgaXMgdGhlIGxhc3QgZXhlY3V0ZWQgbWlncmF0aW9uLiBJdCB3YXMgZXhlY3V0ZWQgb24gXCIgKyBuZXcgRGF0ZShsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLnRpbWVzdGFtcCkudG9TdHJpbmcoKSArIFwiLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJOb3cgcmV2ZXJ0aW5nIGl0Li4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHRoaXMudHJhbnNhY3Rpb24gIT09IFwibm9uZVwiKSAmJiAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbNCwgOSwgMTQsIDE3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25Ub1JldmVydC5pbnN0YW5jZS5kb3duKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlRXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvblRvUmV2ZXJ0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJNaWdyYXRpb24gXCIgKyBtaWdyYXRpb25Ub1JldmVydC5uYW1lICsgXCIgaGFzIGJlZW4gcmV2ZXJ0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEwLCAxMiwgLCAxM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogdGhyb3cgZXJyXzI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYmxlIFwibWlncmF0aW9uc1wiIHRoYXQgd2lsbCBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBleGVjdXRlZCBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5jcmVhdGVNaWdyYXRpb25zVGFibGVJZk5vdEV4aXN0ID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZUV4aXN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZHJpdmVyIGlzIG1vbmdvIG5vIG5lZWQgdG8gY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuaGFzVGFibGUodGhpcy5taWdyYXRpb25zVGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFeGlzdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRhYmxlRXhpc3QpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUobmV3IFRhYmxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMubWlncmF0aW9uc0RhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHRoaXMubWlncmF0aW9uc1NjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5taWdyYXRpb25zVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWlncmF0aW9uSWQgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblN0cmF0ZWd5OiBcImluY3JlbWVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvblRpbWVzdGFtcCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvbk5hbWUgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdWxsYWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGFsbCBtaWdyYXRpb25zIHRoYXQgd2VyZSBleGVjdXRlZCBhbmQgc2F2ZWQgaW50byB0aGUgZGF0YWJhc2UgKHNvcnRzIGJ5IGlkKS5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUubG9hZEV4ZWN1dGVkTWlncmF0aW9ucyA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbW9uZ29SdW5uZXIsIG1pZ3JhdGlvbnNSYXc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbmdvUnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtb25nb1J1bm5lci5kYXRhYmFzZUNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRiKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0aW9uKHRoaXMubWlncmF0aW9uc1RhYmxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCh7IFwiX2lkXCI6IC0xIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3JkZXJCeSh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShcImlkXCIpLCBcIkRFU0NcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbSh0aGlzLm1pZ3JhdGlvbnNUYWJsZSwgdGhpcy5taWdyYXRpb25zVGFibGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSYXdNYW55KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25zUmF3ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG1pZ3JhdGlvbnNSYXcubWFwKGZ1bmN0aW9uIChtaWdyYXRpb25SYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaWdyYXRpb24ocGFyc2VJbnQobWlncmF0aW9uUmF3W1wiaWRcIl0pLCBwYXJzZUludChtaWdyYXRpb25SYXdbXCJ0aW1lc3RhbXBcIl0pLCBtaWdyYXRpb25SYXdbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgbWlncmF0aW9ucyB0aGF0IHNldHVwIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtaWdyYXRpb25zID0gdGhpcy5jb25uZWN0aW9uLm1pZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25DbGFzc05hbWUgPSBtaWdyYXRpb24ubmFtZSB8fCBtaWdyYXRpb24uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25UaW1lc3RhbXAgPSBwYXJzZUludChtaWdyYXRpb25DbGFzc05hbWUuc3Vic3RyKC0xMyksIDEwKTtcbiAgICAgICAgICAgIGlmICghbWlncmF0aW9uVGltZXN0YW1wIHx8IGlzTmFOKG1pZ3JhdGlvblRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKG1pZ3JhdGlvbkNsYXNzTmFtZSArIFwiIG1pZ3JhdGlvbiBuYW1lIGlzIHdyb25nLiBNaWdyYXRpb24gY2xhc3MgbmFtZSBzaG91bGQgaGF2ZSBhIEphdmFTY3JpcHQgdGltZXN0YW1wIGFwcGVuZGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgTWlncmF0aW9uKHVuZGVmaW5lZCwgbWlncmF0aW9uVGltZXN0YW1wLCBtaWdyYXRpb25DbGFzc05hbWUsIG1pZ3JhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlTWlncmF0aW9ucyhtaWdyYXRpb25zKTtcbiAgICAgICAgLy8gc29ydCB0aGVtIGJ5IHRpbWVzdGFtcFxuICAgICAgICByZXR1cm4gbWlncmF0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLnRpbWVzdGFtcCAtIGIudGltZXN0YW1wOyB9KTtcbiAgICB9O1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5jaGVja0ZvckR1cGxpY2F0ZU1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgbWlncmF0aW9uTmFtZXMgPSBtaWdyYXRpb25zLm1hcChmdW5jdGlvbiAobWlncmF0aW9uKSB7IHJldHVybiBtaWdyYXRpb24ubmFtZTsgfSk7XG4gICAgICAgIHZhciBkdXBsaWNhdGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1pZ3JhdGlvbk5hbWVzLmZpbHRlcihmdW5jdGlvbiAobWlncmF0aW9uTmFtZSwgaW5kZXgpIHsgcmV0dXJuIG1pZ3JhdGlvbk5hbWVzLmluZGV4T2YobWlncmF0aW9uTmFtZSkgPCBpbmRleDsgfSkpKTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJEdXBsaWNhdGUgbWlncmF0aW9uczogXCIgKyBkdXBsaWNhdGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBsYXRlc3QgbWlncmF0aW9uIChzb3J0cyBieSB0aW1lc3RhbXApIGluIHRoZSBnaXZlbiBhcnJheSBvZiBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5nZXRMYXRlc3RUaW1lc3RhbXBNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgc29ydGVkTWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChtaWdyYXRpb24pIHsgcmV0dXJuIG1pZ3JhdGlvbjsgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXApICogLTE7IH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkTWlncmF0aW9ucy5sZW5ndGggPiAwID8gc29ydGVkTWlncmF0aW9uc1swXSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBsYXRlc3QgbWlncmF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBtaWdyYXRpb25zLlxuICAgICAqIFBSRTogTWlncmF0aW9uIGFycmF5IG11c3QgYmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgaWQuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldExhdGVzdEV4ZWN1dGVkTWlncmF0aW9uID0gZnVuY3Rpb24gKHNvcnRlZE1pZ3JhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRlZE1pZ3JhdGlvbnMubGVuZ3RoID4gMCA/IHNvcnRlZE1pZ3JhdGlvbnNbMF0gOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG5ldyBleGVjdXRlZCBtaWdyYXRpb24ncyBkYXRhIGludG8gbWlncmF0aW9ucyB0YWJsZS5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24gPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzLCBtb25nb1J1bm5lciwgcWI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW1widGltZXN0YW1wXCJdID0gbmV3IE1zc3FsUGFyYW1ldGVyKG1pZ3JhdGlvbi50aW1lc3RhbXAsIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvblRpbWVzdGFtcCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW1wibmFtZVwiXSA9IG5ldyBNc3NxbFBhcmFtZXRlcihtaWdyYXRpb24ubmFtZSwgdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWlncmF0aW9uTmFtZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbXCJ0aW1lc3RhbXBcIl0gPSBtaWdyYXRpb24udGltZXN0YW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tcIm5hbWVcIl0gPSBtaWdyYXRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9uZ29SdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1vbmdvUnVubmVyLmRhdGFiYXNlQ29ubmVjdGlvbi5kYih0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFiYXNlKS5jb2xsZWN0aW9uKHRoaXMubWlncmF0aW9uc1RhYmxlTmFtZSkuaW5zZXJ0T25lKHZhbHVlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGhpcy5taWdyYXRpb25zVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGUgcHJldmlvdXNseSBleGVjdXRlZCBtaWdyYXRpb24ncyBkYXRhIGZyb20gdGhlIG1pZ3JhdGlvbnMgdGFibGUuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmRlbGV0ZUV4ZWN1dGVkTWlncmF0aW9uID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyLCBtaWdyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMsIG1vbmdvUnVubmVyLCBxYjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc1tcInRpbWVzdGFtcFwiXSA9IG5ldyBNc3NxbFBhcmFtZXRlcihtaWdyYXRpb24udGltZXN0YW1wLCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5taWdyYXRpb25UaW1lc3RhbXAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJuYW1lXCJdID0gbmV3IE1zc3FsUGFyYW1ldGVyKG1pZ3JhdGlvbi5uYW1lLCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5taWdyYXRpb25OYW1lIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJ0aW1lc3RhbXBcIl0gPSBtaWdyYXRpb24udGltZXN0YW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJuYW1lXCJdID0gbWlncmF0aW9uLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbmdvUnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtb25nb1J1bm5lci5kYXRhYmFzZUNvbm5lY3Rpb24uZGIodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhYmFzZSkuY29sbGVjdGlvbih0aGlzLm1pZ3JhdGlvbnNUYWJsZU5hbWUpLmRlbGV0ZU9uZShjb25kaXRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxYi5kZWxldGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbSh0aGlzLm1pZ3JhdGlvbnNUYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcInRpbWVzdGFtcFwiKSArIFwiID0gOnRpbWVzdGFtcFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYW5kV2hlcmUocWIuZXNjYXBlKFwibmFtZVwiKSArIFwiID0gOm5hbWVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMoY29uZGl0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLndpdGhRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgLCAyLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY2FsbGJhY2socXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE1pZ3JhdGlvbkV4ZWN1dG9yO1xufSgpKTtcbmV4cG9ydCB7IE1pZ3JhdGlvbkV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pZ3JhdGlvbkV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBSYW5kb21HZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9SYW5kb21HZW5lcmF0b3JcIjtcbmltcG9ydCB7IGNhbWVsQ2FzZSwgc25ha2VDYXNlLCB0aXRsZUNhc2UgfSBmcm9tIFwiLi4vdXRpbC9TdHJpbmdVdGlsc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbi8qKlxuICogTmFtaW5nIHN0cmF0ZWd5IHRoYXQgaXMgdXNlZCBieSBkZWZhdWx0LlxuICovXG52YXIgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHROYW1pbmdTdHJhdGVneSgpIHtcbiAgICAgICAgdGhpcy5uZXN0ZWRTZXRDb2x1bW5OYW1lcyA9IHsgbGVmdDogXCJuc2xlZnRcIiwgcmlnaHQ6IFwibnNyaWdodFwiIH07XG4gICAgICAgIHRoaXMubWF0ZXJpYWxpemVkUGF0aENvbHVtbk5hbWUgPSBcIm1wYXRoXCI7XG4gICAgfVxuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuZ2V0VGFibGVOYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIGlmICh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSB7XG4gICAgICAgICAgICB0YWJsZU9yTmFtZSA9IHRhYmxlT3JOYW1lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlT3JOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgdGFibGUgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBlbnRpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHRhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtIHVzZXJTcGVjaWZpZWROYW1lIEZvciBleGFtcGxlIGlmIHVzZXIgc3BlY2lmaWVkIGEgdGFibGUgbmFtZSBpbiBhIGRlY29yYXRvciwgZS5nLiBARW50aXR5KFwibmFtZVwiKVxuICAgICAqL1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUudGFibGVOYW1lID0gZnVuY3Rpb24gKHRhcmdldE5hbWUsIHVzZXJTcGVjaWZpZWROYW1lKSB7XG4gICAgICAgIHJldHVybiB1c2VyU3BlY2lmaWVkTmFtZSA/IHVzZXJTcGVjaWZpZWROYW1lIDogc25ha2VDYXNlKHRhcmdldE5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRhYmxlIG5hbWUgZm9yIGEganVuY3Rpb24gdGFibGUgb2YgYSBjbG9zdXJlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9yaWdpbmFsQ2xvc3VyZVRhYmxlTmFtZSBOYW1lIG9mIHRoZSBjbG9zdXJlIHRhYmxlIHdoaWNoIG93bnMgdGhpcyBqdW5jdGlvbiB0YWJsZS5cbiAgICAgKi9cbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmNsb3N1cmVKdW5jdGlvblRhYmxlTmFtZSA9IGZ1bmN0aW9uIChvcmlnaW5hbENsb3N1cmVUYWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ2xvc3VyZVRhYmxlTmFtZSArIFwiX2Nsb3N1cmVcIjtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuY29sdW1uTmFtZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUsIGN1c3RvbU5hbWUsIGVtYmVkZGVkUHJlZml4ZXMpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBjdXN0b21OYW1lIHx8IHByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKGVtYmVkZGVkUHJlZml4ZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShlbWJlZGRlZFByZWZpeGVzLmpvaW4oXCJfXCIpKSArIHRpdGxlQ2FzZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLnJlbGF0aW9uTmFtZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUucHJpbWFyeUtleU5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICByZXR1cm4gXCJQS19cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUudW5pcXVlQ29uc3RyYWludE5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICByZXR1cm4gXCJVUV9cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUucmVsYXRpb25Db25zdHJhaW50TmFtZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMsIHdoZXJlKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICBpZiAod2hlcmUpXG4gICAgICAgICAgICBrZXkgKz0gXCJfXCIgKyB3aGVyZTtcbiAgICAgICAgcmV0dXJuIFwiUkVMX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5kZWZhdWx0Q29uc3RyYWludE5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lO1xuICAgICAgICByZXR1cm4gXCJERl9cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuZm9yZWlnbktleU5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzLCBfcmVmZXJlbmNlZFRhYmxlUGF0aCwgX3JlZmVyZW5jZWRDb2x1bW5OYW1lcykge1xuICAgICAgICAvLyBzb3J0IGluY29taW5nIGNvbHVtbiBuYW1lcyB0byBhdm9pZCBpc3N1ZSB3aGVuIFtcImlkXCIsIFwibmFtZVwiXSBhbmQgW1wibmFtZVwiLCBcImlkXCJdIGFycmF5c1xuICAgICAgICB2YXIgY2xvbmVkQ29sdW1uTmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29sdW1uTmFtZXMpLCBmYWxzZSk7XG4gICAgICAgIGNsb25lZENvbHVtbk5hbWVzLnNvcnQoKTtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBjbG9uZWRDb2x1bW5OYW1lcy5qb2luKFwiX1wiKTtcbiAgICAgICAgcmV0dXJuIFwiRktfXCIgKyBSYW5kb21HZW5lcmF0b3Iuc2hhMShrZXkpLnN1YnN0cigwLCAyNyk7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmluZGV4TmFtZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMsIHdoZXJlKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICBpZiAod2hlcmUpXG4gICAgICAgICAgICBrZXkgKz0gXCJfXCIgKyB3aGVyZTtcbiAgICAgICAgcmV0dXJuIFwiSURYX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5jaGVja0NvbnN0cmFpbnROYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleHByZXNzaW9uLCBpc0VudW0pIHtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBleHByZXNzaW9uO1xuICAgICAgICB2YXIgbmFtZSA9IFwiQ0hLX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgICAgICByZXR1cm4gaXNFbnVtID8gbmFtZSArIFwiX0VOVU1cIiA6IG5hbWU7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmV4Y2x1c2lvbkNvbnN0cmFpbnROYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHZhciB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZSh0YWJsZU9yTmFtZSk7XG4gICAgICAgIHZhciByZXBsYWNlZFRhYmxlTmFtZSA9IHRhYmxlTmFtZS5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgIHZhciBrZXkgPSByZXBsYWNlZFRhYmxlTmFtZSArIFwiX1wiICsgZXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIFwiWENMX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5qb2luQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChyZWxhdGlvbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2UocmVsYXRpb25OYW1lICsgXCJfXCIgKyByZWZlcmVuY2VkQ29sdW1uTmFtZSk7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmpvaW5UYWJsZU5hbWUgPSBmdW5jdGlvbiAoZmlyc3RUYWJsZU5hbWUsIHNlY29uZFRhYmxlTmFtZSwgZmlyc3RQcm9wZXJ0eU5hbWUsIHNlY29uZFByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gc25ha2VDYXNlKGZpcnN0VGFibGVOYW1lICsgXCJfXCIgKyBmaXJzdFByb3BlcnR5TmFtZS5yZXBsYWNlKC9cXC4vZ2ksIFwiX1wiKSArIFwiX1wiICsgc2Vjb25kVGFibGVOYW1lKTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuam9pblRhYmxlQ29sdW1uRHVwbGljYXRpb25QcmVmaXggPSBmdW5jdGlvbiAoY29sdW1uTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUgKyBcIl9cIiArIGluZGV4O1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5qb2luVGFibGVDb2x1bW5OYW1lID0gZnVuY3Rpb24gKHRhYmxlTmFtZSwgcHJvcGVydHlOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2UodGFibGVOYW1lICsgXCJfXCIgKyAoY29sdW1uTmFtZSA/IGNvbHVtbk5hbWUgOiBwcm9wZXJ0eU5hbWUpKTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuam9pblRhYmxlSW52ZXJzZUNvbHVtbk5hbWUgPSBmdW5jdGlvbiAodGFibGVOYW1lLCBwcm9wZXJ0eU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9pblRhYmxlQ29sdW1uTmFtZSh0YWJsZU5hbWUsIHByb3BlcnR5TmFtZSwgY29sdW1uTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGdsb2JhbGx5IHNldCBwcmVmaXggdG8gdGhlIHRhYmxlIG5hbWUuXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgbm8gbWF0dGVyIGlmIHByZWZpeCB3YXMgc2V0IG9yIG5vdC5cbiAgICAgKiBUYWJsZSBuYW1lIGlzIGVpdGhlciB1c2VyJ3MgZ2l2ZW4gdGFibGUgbmFtZSwgZWl0aGVyIG5hbWUgZ2VuZXJhdGVkIGZyb20gZW50aXR5IHRhcmdldC5cbiAgICAgKiBOb3RlIHRoYXQgdGFibGUgbmFtZSBjb21lcyBoZXJlIGFscmVhZHkgbm9ybWFsaXplZCBieSAjdGFibGVOYW1lIG1ldGhvZC5cbiAgICAgKi9cbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLnByZWZpeFRhYmxlTmFtZSA9IGZ1bmN0aW9uIChwcmVmaXgsIHRhYmxlTmFtZSkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgdGFibGVOYW1lO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5lYWdlckpvaW5SZWxhdGlvbkFsaWFzID0gZnVuY3Rpb24gKGFsaWFzLCBwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzICsgXCJfXCIgKyBwcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmF1bHROYW1pbmdTdHJhdGVneTtcbn0oKSk7XG5leHBvcnQgeyBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVmYXVsdE5hbWluZ1N0cmF0ZWd5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE11c3RCZUVudGl0eUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL011c3RCZUVudGl0eUVycm9yXCI7XG5pbXBvcnQgeyBTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi9TdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IENhbm5vdERldGVybWluZUVudGl0eUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0Nhbm5vdERldGVybWluZUVudGl0eUVycm9yXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcIi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT25lVG9NYW55U3ViamVjdEJ1aWxkZXIgfSBmcm9tIFwiLi9zdWJqZWN0LWJ1aWxkZXIvT25lVG9NYW55U3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IE9uZVRvT25lSW52ZXJzZVNpZGVTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9PbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9NYW55VG9NYW55U3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlciB9IGZyb20gXCIuL1N1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlclwiO1xuaW1wb3J0IHsgQ2FzY2FkZXNTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9DYXNjYWRlc1N1YmplY3RCdWlsZGVyXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG4vKipcbiAqIFBlcnNpc3RzIGEgc2luZ2xlIGVudGl0eSBvciBtdWx0aXBsZSBlbnRpdGllcyAtIHNhdmVzIG9yIHJlbW92ZXMgdGhlbS5cbiAqL1xudmFyIEVudGl0eVBlcnNpc3RFeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5UGVyc2lzdEV4ZWN1dG9yKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyLCBtb2RlLCB0YXJnZXQsIGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHBlcnNpc3RlbmNlIG9wZXJhdGlvbiBvYiBnaXZlbiBlbnRpdHkgb3IgZW50aXRpZXMuXG4gICAgICovXG4gICAgRW50aXR5UGVyc2lzdEV4ZWN1dG9yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIG9sZFF1ZXJ5UnVubmVyRGF0YSwgZW50aXRpZXMsIGVudGl0aWVzSW5DaHVua3MsIGV4ZWN1dG9ycywgZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zLCBpc1RyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLCBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnNfMV8xLCBleGVjdXRvciwgZV8xXzEsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVudGl0eSB3ZSBhcmUgZ29pbmcgdG8gc2F2ZSBpcyB2YWxpZCBhbmQgaXMgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50aXR5IHx8IHR5cGVvZiB0aGlzLmVudGl0eSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IE11c3RCZUVudGl0eUVycm9yKHRoaXMubW9kZSwgdGhpcy5lbnRpdHkpKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBNVVNUIGNhbGwgXCJmYWtlXCIgcmVzb2x2ZSBoZXJlIHRvIG1ha2Ugc3VyZSBhbGwgcHJvcGVydGllcyBvZiBsYXppbHkgbG9hZGVkIHJlbGF0aW9ucyBhcmUgcmVzb2x2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgTVVTVCBjYWxsIFwiZmFrZVwiIHJlc29sdmUgaGVyZSB0byBtYWtlIHN1cmUgYWxsIHByb3BlcnRpZXMgb2YgbGF6aWx5IGxvYWRlZCByZWxhdGlvbnMgYXJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRRdWVyeVJ1bm5lckRhdGEgPSBxdWVyeVJ1bm5lci5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsyLCAsIDIyLCAyNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuZW50aXR5KSA/IHRoaXMuZW50aXR5IDogW3RoaXMuZW50aXR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzSW5DaHVua3MgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNodW5rICYmIHRoaXMub3B0aW9ucy5jaHVuayA+IDAgPyBPcm1VdGlscy5jaHVuayhlbnRpdGllcywgdGhpcy5vcHRpb25zLmNodW5rKSA6IFtlbnRpdGllc107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChlbnRpdGllc0luQ2h1bmtzLm1hcChmdW5jdGlvbiAoZW50aXRpZXMpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YmplY3RzLCBjYXNjYWRlc1N1YmplY3RCdWlsZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgc3ViamVjdHMgZm9yIGFsbCBlbnRpdGllcyB3ZSByZWNlaXZlZCBmb3IgdGhlIHBlcnNpc3RlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eVRhcmdldCA9IF90aGlzLnRhcmdldCA/IF90aGlzLnRhcmdldCA6IGVudGl0eS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlUYXJnZXQgPT09IE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90RGV0ZXJtaW5lRW50aXR5RXJyb3IoX3RoaXMubW9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5wdXNoKG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogX3RoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlUYXJnZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlSW5zZXJ0ZWQ6IF90aGlzLm1vZGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogX3RoaXMubW9kZSA9PT0gXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlUmVtb3ZlZDogX3RoaXMubW9kZSA9PT0gXCJyZW1vdmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZVNvZnRSZW1vdmVkOiBfdGhpcy5tb2RlID09PSBcInNvZnQtcmVtb3ZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVSZWNvdmVyZWQ6IF90aGlzLm1vZGUgPT09IFwicmVjb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNjYWRlc1N1YmplY3RCdWlsZGVyID0gbmV3IENhc2NhZGVzU3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHN0ZXAgd2UgYnVpbGQgbGlzdCBvZiBzdWJqZWN0cyB3ZSB3aWxsIG9wZXJhdGUgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3ViamVjdHMgYXJlIHN1YmplY3RzIHRoYXQgd2UgbmVlZCB0byBpbnNlcnQgb3IgdXBkYXRlIGFsb25nc2lkZSB3aXRoIG1haW4gcGVyc2lzdGVkIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZXNTdWJqZWN0QnVpbGRlci5idWlsZChzdWJqZWN0LCBfdGhpcy5tb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcImJ1aWxkaW5nIGNhc2NhZGVzLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGRhdGFiYXNlIGVudGl0aWVzIGZvciBhbGwgc3ViamVjdHMgd2UgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHN0ZXAgaXMgdG8gbG9hZCBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIG9wZXJhdGUgc3ViamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwibG9hZGluZy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlcihxdWVyeVJ1bm5lciwgc3ViamVjdHMpLmxvYWQodGhpcy5tb2RlKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCJidWlsZGluZyBjYXNjYWRlcy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIHN1YmplY3RzIHdlIGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBzdGVwIGlzIHRvIGxvYWQgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFsbCBvcGVyYXRlIHN1YmplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcImxvYWRpbmcuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwibG9hZGluZy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwib3RoZXIgc3ViamVjdHMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGFsbCByZWxhdGVkIHN1YmplY3RzIGFuZCBjaGFuZ2UgbWFwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcInNhdmVcIiB8fCB0aGlzLm1vZGUgPT09IFwic29mdC1yZW1vdmVcIiB8fCB0aGlzLm1vZGUgPT09IFwicmVjb3ZlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25lVG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpLmJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyKHN1YmplY3RzKS5idWlsZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlcihzdWJqZWN0cykuYnVpbGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tdXN0QmVSZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpLmJ1aWxkRm9yQWxsUmVtb3ZhbChzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCJvdGhlciBzdWJqZWN0cy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiYnVpbGRpbmcgc3ViamVjdHMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3ViamVjdHNcIiwgc3ViamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzdWJqZWN0IGV4ZWN1dG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgU3ViamVjdEV4ZWN1dG9yKHF1ZXJ5UnVubmVyLCBzdWJqZWN0cywgdGhpcy5vcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvcnMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnMgPSBleGVjdXRvcnMuZmlsdGVyKGZ1bmN0aW9uIChleGVjdXRvcikgeyByZXR1cm4gZXhlY3V0b3IuaGFzRXhlY3V0YWJsZU9wZXJhdGlvbnM7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbNCwgMTYsICwgMjFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb24gIT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzYsIDExLCAxMiwgMTNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xID0gX192YWx1ZXMoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zKSwgZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMSA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvciA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBleGVjdXRvci5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xXzEgPSBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMSAmJiAhZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMS5kb25lICYmIChfYSA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLnJldHVybikpIF9hLmNhbGwoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlzVHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9PT0gdHJ1ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFszIC8qYnJlYWsqLywgMjFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUcmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxNywgMTksICwgMjBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6IHJldHVybiBbMyAvKmJyZWFrKi8sIDI1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmRhdGEgPSBvbGRRdWVyeVJ1bm5lckRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAyNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlQZXJzaXN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgRW50aXR5UGVyc2lzdEV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eVBlcnNpc3RFeGVjdXRvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBTdWJqZWN0IGlzIGEgc3ViamVjdCBvZiBwZXJzaXN0ZW5jZS5cbiAqIEl0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZW50aXR5IHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGVkOlxuICogLSB3aGF0IGVudGl0eSBzaG91bGQgYmUgcGVyc2lzdGVkXG4gKiAtIHdoYXQgaXMgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAqIC0gd2hhdCBlbnRpdHkgbWV0YWRhdGEgb2YgdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAqIC0gd2hhdCBpcyBhbGxvd2VkIHRvIHdpdGggcGVyc2lzdGVkIGVudGl0eSAoaW5zZXJ0L3VwZGF0ZS9yZW1vdmUpXG4gKlxuICogSGF2aW5nIHRoaXMgY29sbGVjdGlvbiBvZiBzdWJqZWN0cyB3ZSBjYW4gcGVyZm9ybSBkYXRhYmFzZSBxdWVyaWVzLlxuICovXG52YXIgU3ViamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YmplY3QgaWRlbnRpZmllci5cbiAgICAgICAgICogVGhpcyBpZGVudGlmaWVyIGlzIG5vdCBsaW1pdGVkIHRvIHRhYmxlIGVudGl0eSBwcmltYXJ5IGNvbHVtbnMuXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGVudGl0eSBpZCBvciBpZHMgYXMgd2VsbCBhcyBzb21lIHVuaXF1ZSBlbnRpdHkgcHJvcGVydGllcywgbGlrZSBuYW1lIG9yIHRpdGxlLlxuICAgICAgICAgKiBJbnNlcnQgLyBVcGRhdGUgLyBSZW1vdmUgb3BlcmF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBnaXZlbiBpZGVudGlmaWVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weSBvZiBlbnRpdHkgYnV0IHdpdGggcmVsYXRpb25hbCBpZHMgZnVsZmlsbGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGRhdGFiYXNlIGVudGl0eSB3YXMgbG9hZGVkLlxuICAgICAgICAgKiBObyBtYXR0ZXIgaWYgaXQgd2FzIGZvdW5kIG9yIG5vdCwgaXQgaW5kaWNhdGVzIHRoZSBmYWN0IG9mIGxvYWRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGFuZ2VzIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGRhdGFiYXNlIGZvciB0aGUgZ2l2ZW4gc3ViamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbmdlTWFwcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGlzIHN1YmplY3QgZWl0aGVyIGlzIG5ld2x5IHBlcnNpc3RlZCwgZWl0aGVyIGNhbiBiZSBpbnNlcnRlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVJbnNlcnRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGlzIHN1YmplY3QgZWl0aGVyIHdhcyBwZXJzaXN0ZWQsIGVpdGhlciBjYW4gYmUgdXBkYXRlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzdWJqZWN0IE1VU1QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICogVGhpcyBtZWFucyB0aGF0IHRoaXMgc3ViamVjdCBlaXRoZXIgd2FzIHJlbW92ZWQsIGVpdGhlciB3YXMgcmVtb3ZlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubXVzdEJlUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgc29mdC1yZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhpcyBzdWJqZWN0IGVpdGhlciB3YXMgc29mdC1yZW1vdmVkLCBlaXRoZXIgd2FzIHNvZnQtcmVtb3ZlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVTb2Z0UmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhpcyBzdWJqZWN0IGVpdGhlciB3YXMgcmVjb3ZlcmVkLCBlaXRoZXIgd2FzIHJlY292ZXJlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVSZWNvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9ucyB1cGRhdGVkIGJ5IHRoZSBjaGFuZ2UgbWFwcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlZFJlbGF0aW9uTWFwcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiB1cGRhdGVkIGNvbHVtbnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlmZkNvbHVtbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgdXBkYXRlZCByZWxhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlmZlJlbGF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBvcHRpb25zLmVudGl0eTtcbiAgICAgICAgdGhpcy5wYXJlbnRTdWJqZWN0ID0gb3B0aW9ucy5wYXJlbnRTdWJqZWN0O1xuICAgICAgICBpZiAob3B0aW9ucy5jYW5CZUluc2VydGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlSW5zZXJ0ZWQgPSBvcHRpb25zLmNhbkJlSW5zZXJ0ZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLmNhbkJlVXBkYXRlZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5jYW5CZVVwZGF0ZWQgPSBvcHRpb25zLmNhbkJlVXBkYXRlZDtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVzdEJlUmVtb3ZlZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5tdXN0QmVSZW1vdmVkID0gb3B0aW9ucy5tdXN0QmVSZW1vdmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5jYW5CZVNvZnRSZW1vdmVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlU29mdFJlbW92ZWQgPSBvcHRpb25zLmNhbkJlU29mdFJlbW92ZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLmNhbkJlUmVjb3ZlcmVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlUmVjb3ZlcmVkID0gb3B0aW9ucy5jYW5CZVJlY292ZXJlZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gb3B0aW9ucy5pZGVudGlmaWVyO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFuZ2VNYXBzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoX2EgPSB0aGlzLmNoYW5nZU1hcHMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChvcHRpb25zLmNoYW5nZU1hcHMpLCBmYWxzZSkpO1xuICAgICAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdC5wcm90b3R5cGUsIFwibXVzdEJlSW5zZXJ0ZWRcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBzdWJqZWN0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgaW5zZXJ0ZWQgKGV4cGxpY2l0bHkgcGVyc2lzdGVkIG9yIGJ5IGNhc2NhZGVzKVxuICAgICAgICAgKiBhbmQgaWYgaXQgZG9lcyBub3QgaGF2ZSBkYXRhYmFzZSBlbnRpdHkgc2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW5CZUluc2VydGVkICYmICF0aGlzLmRhdGFiYXNlRW50aXR5O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN1YmplY3QucHJvdG90eXBlLCBcIm11c3RCZVVwZGF0ZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgc3ViamVjdCBtdXN0IGJlIHVwZGF0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgdXBkYXRlZCAoZXhwbGljaXRseSBwZXJzaXN0ZWQgb3IgYnkgY2FzY2FkZXMpXG4gICAgICAgICAqIGFuZCBpZiBpdCBkb2VzIGhhdmUgZGlmZmVyZW50aWF0ZWQgY29sdW1ucyBvciByZWxhdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbkJlVXBkYXRlZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID09PSBmYWxzZSB8fCAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCAmJiB0aGlzLmRhdGFiYXNlRW50aXR5KSkgJiZcbiAgICAgICAgICAgICAgICAvLyAoKHRoaXMuZW50aXR5ICYmIHRoaXMuZGF0YWJhc2VFbnRpdHkpIHx8ICghdGhpcy5lbnRpdHkgJiYgIXRoaXMuZGF0YWJhc2VFbnRpdHkpKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTWFwcy5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN1YmplY3QucHJvdG90eXBlLCBcIm11c3RCZVNvZnRSZW1vdmVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHN1YmplY3QgbXVzdCBiZSBzb2Z0LXJlbW92ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgc29mdC1yZW1vdmVkIChleHBsaWNpdGx5IHBlcnNpc3RlZCBvciBieSBjYXNjYWRlcylcbiAgICAgICAgICogYW5kIGlmIGl0IGRvZXMgaGF2ZSBkaWZmZXJlbnRpYXRlZCBjb2x1bW5zIG9yIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuQmVTb2Z0UmVtb3ZlZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID09PSBmYWxzZSB8fCAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCAmJiB0aGlzLmRhdGFiYXNlRW50aXR5KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdC5wcm90b3R5cGUsIFwibXVzdEJlUmVjb3ZlcmVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHN1YmplY3QgbXVzdCBiZSByZWNvdmVyZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgcmVjb3ZlcmVkIChleHBsaWNpdGx5IHBlcnNpc3RlZCBvciBieSBjYXNjYWRlcylcbiAgICAgICAgICogYW5kIGlmIGl0IGRvZXMgaGF2ZSBkaWZmZXJlbnRpYXRlZCBjb2x1bW5zIG9yIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuQmVSZWNvdmVyZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCA9PT0gZmFsc2UgfHwgKHRoaXMuZGF0YWJhc2VFbnRpdHlMb2FkZWQgJiYgdGhpcy5kYXRhYmFzZUVudGl0eSkpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB2YWx1ZSBzZXQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgLyB1cGRhdGVkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBWYWx1ZSBzZXQgaXMgYmFzZWQgb24gdGhlIGVudGl0eSBhbmQgY2hhbmdlIG1hcHMgb2YgdGhlIHN1YmplY3QuXG4gICAgICogSW1wb3J0YW50IG5vdGU6IHRoaXMgbWV0aG9kIHBvcHMgZGF0YSBmcm9tIHRoaXMgc3ViamVjdCdzIGNoYW5nZSBtYXBzLlxuICAgICAqL1xuICAgIFN1YmplY3QucHJvdG90eXBlLmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgdmFyIGNoYW5nZVNldCA9IHRoaXMuY2hhbmdlTWFwcy5yZWR1Y2UoZnVuY3Rpb24gKHVwZGF0ZU1hcCwgY2hhbmdlTWFwKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjaGFuZ2VNYXAudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlZCBjb2x1bW5zIGNhbiByZWZlciBvbiB2YWx1ZXMgYm90aCB3aGljaCB3ZXJlIGp1c3QgaW5zZXJ0ZWQgYW5kIHdoaWNoIHdlcmUgcHJlc2VudCBpbiB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICAvLyBpZiBlbnRpdHkgd2FzIGp1c3QgaW5zZXJ0ZWQgdmFsdWVTZXRzIG11c3QgY29udGFpbiBhbGwgdmFsdWVzIGZyb20gdGhlIGVudGl0eSBhbmQgdmFsdWVzIGp1c3QgaW5zZXJ0ZWQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAgICAgLy8gc28sIGhlcmUgd2UgY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbHVlIHNldCB0aGVuIHdlIHNpbXBseSB1c2UgaXQgYXMgdmFsdWUgdG8gZ2V0IG91ciByZWZlcmVuY2UgY29sdW1uIHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaW1wbHkgdXNlIGFuIGVudGl0eSB3aGljaCBjYW5ub3QgYmUganVzdCBpbnNlcnRlZCBhdCB0aGUgbW9tZW50IGFuZCBoYXZlIGFsbCBuZWNlc3NhcnkgZGF0YVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuaW5zZXJ0ZWRWYWx1ZVNldCA/IHZhbHVlLmluc2VydGVkVmFsdWVTZXQgOiB2YWx1ZS5lbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSA9IGNoYW5nZU1hcC52YWx1ZUZhY3RvcnkgPyBjaGFuZ2VNYXAudmFsdWVGYWN0b3J5KHZhbHVlKSA6IGNoYW5nZU1hcC5jb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpO1xuICAgICAgICAgICAgdmFyIHZhbHVlTWFwO1xuICAgICAgICAgICAgaWYgKF90aGlzLm1ldGFkYXRhLmlzSnVuY3Rpb24gJiYgY2hhbmdlTWFwLmNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhbHVlTWFwID0gY2hhbmdlTWFwLmNvbHVtbi5jcmVhdGVWYWx1ZU1hcChjaGFuZ2VNYXAuY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5nZU1hcC5jb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZU1hcCA9IGNoYW5nZU1hcC5jb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhbmdlTWFwLnJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gdmFsdWUgY2FuIGJlIGEgcmVsYXRlZCBvYmplY3QsIGZvciBleGFtcGxlOiBwb3N0LnF1ZXN0aW9uID0geyBpZDogMSB9XG4gICAgICAgICAgICAgICAgLy8gb3IgdmFsdWUgY2FuIGJlIGEgbnVsbCBvciBkaXJlY3QgcmVsYXRpb24gaWQsIGUuZy4gcG9zdC5xdWVzdGlvbiA9IDFcbiAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYSBkaXJlY3Rpb24gcmVsYXRpb24gaWQgdGhlbiB3ZSBqdXN0IHNldCBpdCB0byB0aGUgdmFsdWVNYXAsXG4gICAgICAgICAgICAgICAgLy8gaG93ZXZlciBpZiBpdHMgYW4gb2JqZWN0IHRoZW4gd2UgbmVlZCB0byBleHRyYWN0IGl0cyByZWxhdGlvbiBpZCBtYXAgYW5kIHNldCBpdCB0byB0aGUgdmFsdWVNYXBcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlbGF0aW9uIGlkLCBlLmcuIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYW5kIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGU6IHsgaWQ6IDEgfSB3aGljaCB0aGVuIHdpbGwgYmUgc2V0IHRvIHJlbGF0aW9uLCBlLmcuIHBvc3QuY2F0ZWdvcnkgPSB7IGlkOiAxIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uSWQgPSBjaGFuZ2VNYXAucmVsYXRpb24uZ2V0UmVsYXRpb25JZE1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCByZWxhdGlvbiBpZCBjYW4gYmUgZW1wdHksIGZvciBleGFtcGxlIGluIHRoZSBjYXNlIHdoZW4geW91IGluc2VydCBhIG5ldyBwb3N0IHdpdGggY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJvdGggcG9zdCBhbmQgY2F0ZWdvcnkgYXJlIG5ld2x5IGluc2VydGVkIG9iamVjdHMgKGJ5IGNhc2NhZGVzKSBhbmQgaW4gdGhpcyBjYXNlIGNhdGVnb3J5IHdpbGwgbm90IGhhdmUgaWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBuZWVkIHRvIGluc2VydCBwb3N0IHdpdGhvdXQgcXVlc3Rpb24gaWQgYW5kIHVwZGF0ZSBwb3N0J3MgcXVlc3Rpb25JZCBvbmNlIHF1ZXN0aW9uIGJlIGluc2VydGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQncyB3aHkgd2UgY3JlYXRlIGEgbmV3IGNoYW5nZU1hcCBvcGVyYXRpb24gZm9yIGZ1dHVyZSB1cGRhdGlvbiBvZiB0aGUgcG9zdCBlbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXMucHVzaChjaGFuZ2VNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2FuQmVVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVNYXA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXAgPSBjaGFuZ2VNYXAucmVsYXRpb24uY3JlYXRlVmFsdWVNYXAocmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRSZWxhdGlvbk1hcHMucHVzaCh7IHJlbGF0aW9uOiBjaGFuZ2VNYXAucmVsYXRpb24sIHZhbHVlOiByZWxhdGlvbklkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gdmFsdWUgY2FuIGJlIFwibnVsbFwiIG9yIGRpcmVjdCByZWxhdGlvbiBpZCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlTWFwID0gY2hhbmdlTWFwLnJlbGF0aW9uLmNyZWF0ZVZhbHVlTWFwKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlZFJlbGF0aW9uTWFwcy5wdXNoKHsgcmVsYXRpb246IGNoYW5nZU1hcC5yZWxhdGlvbiwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlRGVlcCh1cGRhdGVNYXAsIHZhbHVlTWFwKTtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VNYXBzID0gY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VTZXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvbXB1dGVzIGVudGl0eVdpdGhGdWxmaWxsZWRJZHMgYW5kIGlkZW50aWZpZXIgd2hlbiBlbnRpdHkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBTdWJqZWN0LnByb3RvdHlwZS5yZWNvbXB1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLmVudGl0eSkge1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5lbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50U3ViamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbi5yZWxhdGlvbk1ldGFkYXRhICYmIHByaW1hcnlDb2x1bW4ucmVsYXRpb25NZXRhZGF0YS5pbnZlcnNlRW50aXR5TWV0YWRhdGEgPT09IF90aGlzLnBhcmVudFN1YmplY3QubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByaW1hcnlDb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShfdGhpcy5wYXJlbnRTdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLnNldEVudGl0eVZhbHVlKF90aGlzLmVudGl0eVdpdGhGdWxmaWxsZWRJZHMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdGhpcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcCh0aGlzLmVudGl0eVdpdGhGdWxmaWxsZWRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YWJhc2VFbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHRoaXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAodGhpcy5kYXRhYmFzZUVudGl0eSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTdWJqZWN0O1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3QgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViamVjdC5qcy5tYXBcbiIsImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gXCIuLi91dGlsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9IGZyb20gXCIuLi91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnNcIjtcbi8qKlxuICogRmluZHMgd2hhdCBjb2x1bW5zIGFyZSBjaGFuZ2VkIGluIHRoZSBzdWJqZWN0IGVudGl0aWVzLlxuICovXG52YXIgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB3aGF0IGNvbHVtbnMgYXJlIGNoYW5nZWQgaW4gdGhlIHN1YmplY3QgZW50aXRpZXMuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGUgPSBmdW5jdGlvbiAoc3ViamVjdHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuY29tcHV0ZURpZmZDb2x1bW5zKHN1YmplY3QpO1xuICAgICAgICAgICAgX3RoaXMuY29tcHV0ZURpZmZSZWxhdGlvbmFsQ29sdW1ucyhzdWJqZWN0cywgc3ViamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIERpZmZlcmVudGlhdGUgY29sdW1ucyBmcm9tIHRoZSB1cGRhdGVkIGVudGl0eSBhbmQgZW50aXR5IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGVEaWZmQ29sdW1ucyA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHBlcnNpc3RlZCBlbnRpdHkgdGhlbiBub3RoaW5nIHRvIGNvbXB1dGUgY2hhbmdlZCBpbiBpdFxuICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgc3BlY2lhbCBjb2x1bW5zXG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbCB8fFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pc0Rpc2NyaW1pbmF0b3IgLy8gfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc1VwZGF0ZURhdGUgfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc1ZlcnNpb24gfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc0NyZWF0ZURhdGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgY2hhbmdlTWFwID0gc3ViamVjdC5jaGFuZ2VNYXBzLmZpbmQoZnVuY3Rpb24gKGNoYW5nZU1hcCkgeyByZXR1cm4gY2hhbmdlTWFwLmNvbHVtbiA9PT0gY29sdW1uOyB9KTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VNYXApIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0LmNoYW5nZU1hcHMuc3BsaWNlKHN1YmplY3QuY2hhbmdlTWFwcy5pbmRleE9mKGNoYW5nZU1hcCksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZ2V0IHVzZXIgcHJvdmlkZWQgdmFsdWUgLSBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgdXNlciBwcm92aWRlZCBwZXJzaXN0ZWQgZW50aXR5XG4gICAgICAgICAgICB2YXIgZW50aXR5VmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcGVyZm9ybSBvcGVyYXRpb24gb3ZlciB1bmRlZmluZWQgcHJvcGVydGllcyAoYnV0IHdlIERPIG5lZWQgbnVsbCBwcm9wZXJ0aWVzISlcbiAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRhdGFiYXNlIGVudGl0eSB0aGVuIGFsbCBjb2x1bW5zIGFyZSB0cmVhdGVkIGFzIG5ldywgZS5nLiBjaGFuZ2VkXG4gICAgICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgdHJhbnNmb3JtIGRhdGFiYXNlIHZhbHVlIGZvciBqc29uIC8ganNvbmIgZm9yIGNvbXBhcmlzb24gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICB2YXIgc2hvdWxkVHJhbnNmb3JtRGF0YWJhc2VFbnRpdHkgPSBjb2x1bW4udHlwZSAhPT0gXCJqc29uXCIgJiYgY29sdW1uLnR5cGUgIT09IFwianNvbmJcIjtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGF0YWJhc2UgdmFsdWUgb2YgdGhlIGNvbHVtblxuICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZVZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHNob3VsZFRyYW5zZm9ybURhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IFwicmVsYXRpb25hbCBjb2x1bW5zXCIgb25seSBpbiB0aGUgY2FzZSBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uIG9iamVjdCBpbiBlbnRpdHlcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEuZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWYWx1ZSA9IGVudGl0eVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBzcGVjaWFsIHZhbHVlcyB0byBtYWtlIHByb3BlciBjb21wYXJpc2lvblxuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb0RhdGVTdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aW1lIHdpdGggdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZSB3aXRob3V0IHRpbWUgem9uZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRpbWV0elwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb1RpbWVTdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZXRpbWUyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGggdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGggbG9jYWwgdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wdHpcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBEYXRlVXRpbHMubWl4ZWREYXRlVG9VdGNEYXRldGltZVN0cmluZyhlbnRpdHlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb1V0Y0RhdGV0aW1lU3RyaW5nKGRhdGFiYXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJqc29uYlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGRvZXNuJ3Qgd29yayBiZWNhdXNlIHBvc3RncmVzcWwgc29ydHMganNvbmIgYmVmb3JlIHNhdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IHRyeSB0byBzYXZlIGpzb24gJ1t7XCJtZXNzYWdlc1wiOiBcIlwiLCBcImF0dHJpYnV0ZSBLZXlcIjogXCJcIiwgXCJsZXZlbFwiOlwiXCJ9XSAnIGFzIGpzb25iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcG9zdGdyZXNxbCB3aWxsIHNhdmUgaXQgYXMgJ1t7XCJsZXZlbFwiOiBcIlwiLCBcIm1lc3NhZ2VcIjpcIlwiLCBcImF0dHJpYnV0ZUtleVwiOiBcIlwifV0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmRlZXBDb21wYXJlKGVudGl0eVZhbHVlLCBkYXRhYmFzZVZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNpbXBsZS1hcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5zaW1wbGVBcnJheVRvU3RyaW5nKGVudGl0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZVZhbHVlID0gRGF0ZVV0aWxzLnNpbXBsZUFycmF5VG9TdHJpbmcoZGF0YWJhc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2ltcGxlLWVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBEYXRlVXRpbHMuc2ltcGxlRW51bVRvU3RyaW5nKGVudGl0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZVZhbHVlID0gRGF0ZVV0aWxzLnNpbXBsZUVudW1Ub1N0cmluZyhkYXRhYmFzZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaW1wbGUtanNvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlVmFsdWUgPSBEYXRlVXRpbHMuc2ltcGxlSnNvblRvU3RyaW5nKGRhdGFiYXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtVG8oY29sdW1uLnRyYW5zZm9ybWVyLCBlbnRpdHlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGNoYW5nZWQgLSB0aGVuIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZhbHVlIGluc3RhbmNlb2YgQnVmZmVyICYmIGRhdGFiYXNlVmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZS5lcXVhbHMoZGF0YWJhc2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gZGF0YWJhc2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJqZWN0LmRpZmZDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIHN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZW50aXR5VmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpZmZlcmVuY2UgY29sdW1ucyBvZiB0aGUgb3duaW5nIG9uZS10by1vbmUgYW5kIG1hbnktdG8tb25lIGNvbHVtbnMuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGVEaWZmUmVsYXRpb25hbENvbHVtbnMgPSBmdW5jdGlvbiAoYWxsU3ViamVjdHMsIHN1YmplY3QpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVkIGVudGl0eSB0aGVuIG5vdGhpbmcgdG8gY29tcHV0ZSBjaGFuZ2VkIGluIGl0XG4gICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zV2l0aEpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIHJlbGF0ZWQgZW50aXR5IGZyb20gdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5ID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcGVyZm9ybSBvcGVyYXRpb24gb3ZlciB1bmRlZmluZWQgcHJvcGVydGllcyAoYnV0IHdlIERPIG5lZWQgbnVsbCBwcm9wZXJ0aWVzISlcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGF0YWJhc2UgZW50aXR5IHRoZW4gYWxsIHJlbGF0aW9uYWwgY29sdW1ucyBhcmUgdHJlYXRlZCBhcyBuZXcsIGUuZy4gY2hhbmdlZFxuICAgICAgICAgICAgaWYgKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGNvdmVyIHR3byBzY2VuYXJpb3M6XG4gICAgICAgICAgICAgICAgLy8gMS4gcmVsYXRlZCBlbnRpdHkgY2FuIGJlIGFub3RoZXIgZW50aXR5IHdoaWNoIGlzIG5hdHVyYWwgd2F5XG4gICAgICAgICAgICAgICAgLy8gMi4gcmVsYXRlZCBlbnRpdHkgY2FuIGJlIGp1c3QgYW4gZW50aXR5IGlkXG4gICAgICAgICAgICAgICAgLy8gaWYgcmVsYXRpb24gZW50aXR5IGlzIGp1c3QgYSByZWxhdGlvbiBpZCBzZXQgKGZvciBleGFtcGxlIHBvc3QudGFnID0gMSlcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNyZWF0ZSBhbiBpZCBtYXAgZnJvbSBpdCB0byBtYWtlIGEgcHJvcGVyIGNvbXBhcmlzaW9uXG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgIT09IG51bGwgJiYgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRpb24uZ2V0UmVsYXRpb25JZE1hcChyZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGRhdGFiYXNlIHJlbGF0ZWQgZW50aXR5LiBTaW5jZSBsb2FkUmVsYXRpb25JZHMgYXJlIHVzZWQgb24gZGF0YWJhc2VFbnRpdHlcbiAgICAgICAgICAgICAgICAvLyByZWxhdGVkIGVudGl0eSB3aWxsIGNvbnRhaW4gb25seSBpdHMgcmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlUmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgICAgICAvLyBpZiByZWxhdGlvbiBpZHMgYXJlIGVxdWFsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgYW55dGhpbmdcbiAgICAgICAgICAgICAgICB2YXIgYXJlUmVsYXRlZElkc0VxdWFsID0gT3JtVXRpbHMuY29tcGFyZUlkcyhyZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCwgZGF0YWJhc2VSZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZVJlbGF0ZWRJZHNFcXVhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmRpZmZSZWxhdGlvbnMucHVzaChyZWxhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gaW5zZXJ0ZWQgc3ViamVjdCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9mIHRoZSBwZXJzaXN0ZWQgZW50aXR5IHRoZW4gdXNlIGl0IGFzIHJlbGF0ZWQgZW50aXR5XG4gICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgdXNlZCBmb3IgcmVsYXRlZCBlbnRpdGllcyB3aXRob3V0IGlkcyB0byBiZSBwcm9wZXJseSBpbnNlcnRlZCAoYW5kIHRoZW4gdXBkYXRlZCBpZiBuZWVkZWQpXG4gICAgICAgICAgICB2YXIgdmFsdWVTdWJqZWN0ID0gYWxsU3ViamVjdHMuZmluZChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVJbnNlcnRlZCAmJiBzdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTsgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVTdWJqZWN0KVxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHkgPSB2YWx1ZVN1YmplY3Q7XG4gICAgICAgICAgICAvLyBmaW5kIGlmIHRoZXJlIGlzIGFscmVhZHkgYSByZWxhdGlvbiB0byBiZSBjaGFuZ2VkXG4gICAgICAgICAgICB2YXIgY2hhbmdlTWFwID0gc3ViamVjdC5jaGFuZ2VNYXBzLmZpbmQoZnVuY3Rpb24gKGNoYW5nZU1hcCkgeyByZXR1cm4gY2hhbmdlTWFwLnJlbGF0aW9uID09PSByZWxhdGlvbjsgfSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlTWFwKSB7IC8vIGFuZCB1cGRhdGUgaXRzIHZhbHVlIGlmIGl0IHdhcyBmb3VuZFxuICAgICAgICAgICAgICAgIGNoYW5nZU1hcC52YWx1ZSA9IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gaWYgaXQgd2Fzbid0IGZvdW5kIGFkZCBhIG5ldyByZWxhdGlvbiBmb3IgY2hhbmdlXG4gICAgICAgICAgICAgICAgc3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWxhdGVkRW50aXR5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBMb2FkcyBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIG9wZXJhdGUgc3ViamVjdHMgd2hpY2ggZG8gbm90IGhhdmUgZGF0YWJhc2UgZW50aXR5IHNldC5cbiAqIEFsbCBlbnRpdGllcyB0aGF0IHdlIGxvYWQgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFyZSBtYXJrZWQgYXMgdXBkYXRlZCBvciBpbnNlcnRlZC5cbiAqIFRvIHVuZGVyc3RhbmQgd2hpY2ggb2YgdGhlbSByZWFsbHkgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCB3ZSBuZWVkIHRvIGxvYWRcbiAqIHRoZWlyIG9yaWdpbmFsIHJlcHJlc2VudGF0aW9ucyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqL1xudmFyIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlcihxdWVyeVJ1bm5lciwgc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICB0aGlzLnN1YmplY3RzID0gc3ViamVjdHM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFsbCBzdWJqZWN0cy5cbiAgICAgKlxuICAgICAqIGxvYWRBbGxSZWxhdGlvbnMgZmxhZyBpcyB1c2VkIHRvIGxvYWQgYWxsIHJlbGF0aW9uIGlkcyBvZiB0aGUgb2JqZWN0LCBubyBtYXR0ZXIgaWYgdGhleSBwcmVzZW50IGluIHN1YmplY3QgZW50aXR5IG9yIG5vdC5cbiAgICAgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIGZvciBkZWxldGlvbi5cbiAgICAgKi9cbiAgICBTdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAob3BlcmF0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSB0aGlzLmdyb3VwQnlFbnRpdHlUYXJnZXRzKCkubWFwKGZ1bmN0aW9uIChzdWJqZWN0R3JvdXApIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxsSWRzLCBhbGxTdWJqZWN0cywgbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocywgZmluZE9wdGlvbnMsIGVudGl0aWVzLCBhbGxTdWJqZWN0c18xLCBhbGxTdWJqZWN0c18xXzEsIHN1YmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxJZHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RHcm91cC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGxvYWQgaWYgc3ViamVjdCBhbHJlYWR5IGhhcyBhIGRhdGFiYXNlIGVudGl0eSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgfHwgIXN1YmplY3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsSWRzLnB1c2goc3ViamVjdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsU3ViamVjdHMucHVzaChzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBubyBpZHMgZm91bmQgKG1lYW5zIGFsbCBlbnRpdGllcyBhcmUgbmV3IGFuZCBoYXZlIGdlbmVyYXRlZCBpZHMpIC0gdGhlbiBub3RoaW5nIHRvIGxvYWQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbElkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBzYXZlLCBzb2Z0LXJlbW92ZSBhbmQgcmVjb3ZlciBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGFsbCBwcm9wZXJ0eSBwYXRocyBvZiB0aGUgcmVsYXRpb25zIHdlIG5lZWQgdG8gbG9hZCByZWxhdGlvbiBpZHMgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2UgLSB0aGlzIHdheSB3ZSBkb24ndCBsb2FkIHJlbGF0aW9uIGlkcyBmb3IgZW50aXRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSByZWxhdGlvbnMgYXJlIHVuZGVmaW5lZCwgYW5kIHNpbmNlIHRoZXkgYXJlIHVuZGVmaW5lZCBpdHMgcmVhbGx5IHBvaW50bGVzcyB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgc29tZXRoaW5nIGZvciB0aGVtLCBzaW5jZSB1bmRlZmluZWQgcHJvcGVydGllcyBhcmUgc2tpcHBlZCBieSB0aGUgb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiIHx8IG9wZXJhdGlvblR5cGUgPT09IFwic29mdC1yZW1vdmVcIiB8fCBvcGVyYXRpb25UeXBlID09PSBcInJlY292ZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0R3JvdXAuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0cyBhbGwgcmVsYXRpb24gcHJvcGVydHkgcGF0aHMgdGhhdCBleGlzdCBpbiB0aGUgcGVyc2lzdGVkIGVudGl0eS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2YocmVsYXRpb24ucHJvcGVydHlQYXRoKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZWxhdGlvblByb3BlcnR5UGF0aHMucHVzaChyZWxhdGlvbi5wcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gcmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciByZW1vdmUgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBsb2FkIGp1bmN0aW9uIHJlbGF0aW9uIGlkcyBzaW5jZSBvbmx5IHRoZXkgYXJlIHJlbW92ZWQgYnkgY2FzY2FkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocy5wdXNoLmFwcGx5KC8vIHJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViamVjdEdyb3VwLnN1YmplY3RzWzBdLm1ldGFkYXRhLm1hbnlUb01hbnlSZWxhdGlvbnMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ucHJvcGVydHlQYXRoOyB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRWFnZXJSZWxhdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uczogbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVNaXhlZE1hcDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc29mdC1kZWxldGVkIGVudGl0aWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbG9hZGVkIGVudGl0aWVzIGZvciByZWNvdmVyIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoRGVsZXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVwb3NpdG9yeShzdWJqZWN0R3JvdXAudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRCeUlkcyhhbGxJZHMsIGZpbmRPcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdoZW4gd2UgaGF2ZSBlbnRpdGllcyB3ZSBuZWVkIHRvIGZpbmQgc3ViamVjdCBvZiBlYWNoIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbnNlcnQgdGhhdCBlbnRpdHkgaW50byBkYXRhYmFzZSBlbnRpdHkgb2YgdGhlIGZvdW5kIHN1YmplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJqZWN0cyA9IF90aGlzLmZpbmRCeVBlcnNpc3RFbnRpdHlMaWtlKHN1YmplY3RHcm91cC50YXJnZXQsIGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YmplY3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmlkZW50aWZpZXIgPSBzdWJqZWN0Lm1ldGFkYXRhLmhhc0FsbFByaW1hcnlLZXlzKGVudGl0eSkgPyBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2F5IHdlIHRlbGwgd2hhdCBzdWJqZWN0cyB3ZSB0cmllZCB0byBsb2FkIGRhdGFiYXNlIGVudGl0aWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYWxsU3ViamVjdHNfMSA9IF9fdmFsdWVzKGFsbFN1YmplY3RzKSwgYWxsU3ViamVjdHNfMV8xID0gYWxsU3ViamVjdHNfMS5uZXh0KCk7ICFhbGxTdWJqZWN0c18xXzEuZG9uZTsgYWxsU3ViamVjdHNfMV8xID0gYWxsU3ViamVjdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QgPSBhbGxTdWJqZWN0c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmRhdGFiYXNlRW50aXR5TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFN1YmplY3RzXzFfMSAmJiAhYWxsU3ViamVjdHNfMV8xLmRvbmUgJiYgKF9hID0gYWxsU3ViamVjdHNfMS5yZXR1cm4pKSBfYS5jYWxsKGFsbFN1YmplY3RzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaW5kcyBzdWJqZWN0cyB3aGVyZSBlbnRpdHkgbGlrZSBnaXZlbiBzdWJqZWN0J3MgZW50aXR5LlxuICAgICAqIENvbXBhcmlzaW9uIG1hZGUgYnkgZW50aXR5IGlkLlxuICAgICAqIE11bHRpcGxlIHN1YmplY3RzIG1heSBiZSByZXR1cm5lZCBpZiBkdXBsaWNhdGVzIGFyZSBwcmVzZW50IGluIHRoZSBzdWJqZWN0IGFycmF5LlxuICAgICAqIFRoaXMgd2lsbCBsaWtlbHkgcmVzdWx0IGluIHRoZSBzYW1lIHJvdyBiZWluZyB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5wcm90b3R5cGUuZmluZEJ5UGVyc2lzdEVudGl0eUxpa2UgPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSA9PT0gZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QubWV0YWRhdGEudGFyZ2V0ID09PSBlbnRpdHlUYXJnZXQgJiYgc3ViamVjdC5tZXRhZGF0YS5jb21wYXJlRW50aXRpZXMoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzLCBlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdyb3VwcyBnaXZlbiBTdWJqZWN0IG9iamVjdHMgaW50byBncm91cHMgc2VwYXJhdGVkIGJ5IGVudGl0eSB0YXJnZXRzLlxuICAgICAqL1xuICAgIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5wcm90b3R5cGUuZ3JvdXBCeUVudGl0eVRhcmdldHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmplY3RzLnJlZHVjZShmdW5jdGlvbiAoZ3JvdXBzLCBvcGVyYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzLmZpbmQoZnVuY3Rpb24gKGdyb3VwKSB7IHJldHVybiBncm91cC50YXJnZXQgPT09IG9wZXJhdGVkRW50aXR5Lm1ldGFkYXRhLnRhcmdldDsgfSk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB7IHRhcmdldDogb3BlcmF0ZWRFbnRpdHkubWV0YWRhdGEudGFyZ2V0LCBzdWJqZWN0czogW10gfTtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cC5zdWJqZWN0cy5wdXNoKG9wZXJhdGVkRW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiBncm91cHM7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIHJldHVybiBTdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXI7XG59KCkpO1xuZXhwb3J0IHsgU3ViamVjdERhdGFiYXNlRW50aXR5TG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyIH0gZnJvbSBcIi4vU3ViamVjdFRvcG9saWdpY2FsU29ydGVyXCI7XG5pbXBvcnQgeyBTdWJqZWN0Q2hhbmdlZENvbHVtbnNDb21wdXRlciB9IGZyb20gXCIuL1N1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyXCI7XG5pbXBvcnQgeyBTdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvciB9IGZyb20gXCIuLi9lcnJvci9TdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvclwiO1xuaW1wb3J0IHsgU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3JcIjtcbmltcG9ydCB7IE1vbmdvUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29RdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyUmVzdWx0IH0gZnJvbSBcIi4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJSZXN1bHRcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yIH0gZnJvbSBcIi4vdHJlZS9OZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi90cmVlL0Nsb3N1cmVTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi90cmVlL01hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbi8qKlxuICogRXhlY3V0ZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgKGluc2VydHMsIHVwZGF0ZWQsIGRlbGV0ZXMpIHRoYXQgbXVzdCBiZSBleGVjdXRlZFxuICogd2l0aCBnaXZlbiBwZXJzaXN0ZW5jZSBzdWJqZWN0cy5cbiAqL1xudmFyIFN1YmplY3RFeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdEV4ZWN1dG9yKHF1ZXJ5UnVubmVyLCBzdWJqZWN0cywgb3B0aW9ucykge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBleGVjdXRvciBoYXMgYW55IG9wZXJhdGlvbnMgdG8gZXhlY3V0ZSAoZS5nLiBoYXMgaW5zZXJ0IC8gdXBkYXRlIC8gZGVsZXRlIG9wZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNFeGVjdXRhYmxlT3BlcmF0aW9ucyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIGluc2VydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdWJqZWN0cyB0aGF0IG11c3QgYmUgcmVtb3ZlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YmplY3RzIHRoYXQgbXVzdCBiZSBzb2Z0LXJlbW92ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIHJlY292ZXJlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjb3ZlclN1YmplY3RzID0gW107XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgdGhpcy5hbGxTdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMucmVjb21wdXRlKCk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhbGwgb3BlcmF0aW9ucyBvdmVyIGdpdmVuIGFycmF5IG9mIHN1YmplY3RzLlxuICAgICAqIEV4ZWN1dGVzIHF1ZXJpZXMgdXNpbmcgZ2l2ZW4gcXVlcnkgcnVubmVyLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJyb2FkY2FzdGVyUmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXJSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgIT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIuYnJvYWRjYXN0QmVmb3JlRXZlbnRzRm9yQWxsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXJSZXN1bHQgPSB0aGlzLmJyb2FkY2FzdEJlZm9yZUV2ZW50c0ZvckFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBldmVudCBsaXN0ZW5lcnMgYW5kIHN1YnNjcmliZXJzIGNhbiBjYWxsIHNhdmUgbWV0aG9kcyBhbmQvb3IgdHJpZ2dlciBlbnRpdHkgY2hhbmdlcyB3ZSBuZWVkIHRvIHJlY29tcHV0ZSBvcGVyYXRpb25hbCBzdWJqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIG9ubHkgaW4gdGhlIGNhc2UgaWYgYW55IGxpc3RlbmVyIG9yIHN1YnNjcmliZXIgd2FzIHJlYWxseSBleGVjdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyb2FkY2FzdGVyUmVzdWx0ICYmIGJyb2FkY2FzdGVyUmVzdWx0LmNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi5yZWNvbXB1dGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0LnJlY29tcHV0ZSgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QucmVjb21wdXRlKCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbXB1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIucmVjb21wdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG91ciBpbnNlcnQgc3ViamVjdHMgYXJlIHNvcnRlZCAodXNpbmcgdG9wb2xvZ2ljYWwgc29ydGluZykgdG8gbWFrZSBjYXNjYWRlIGluc2VydHMgd29yayBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwicHJlcGFyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYWxsIGluc2VydCBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIuaW5zZXJ0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cyA9IG5ldyBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIodGhpcy5pbnNlcnRTdWJqZWN0cykuc29ydChcImluc2VydFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUluc2VydE9wZXJhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcIi5pbnNlcnRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbXB1dGUgdXBkYXRlIG9wZXJhdGlvbnMgc2luY2UgaW5zZXJ0aW9uIGNhbiBjcmVhdGUgdXBkYXRpb24gb3BlcmF0aW9ucyBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGl0IHdhc24ndCBhYmxlIHRvIGhhbmRsZSBvbiBpdHMgb3duIChyZWZlcmVuY2VkIGNvbHVtbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzID0gdGhpcy5hbGxTdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QubXVzdEJlVXBkYXRlZDsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVVcGRhdGVPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgb3VyIHJlbW92ZSBzdWJqZWN0cyBhcmUgc29ydGVkICh1c2luZyB0b3BvbG9naWNhbCBzb3J0aW5nKSB3aGVuIG11bHRpcGxlIGVudGl0aWVzIGFyZSBwYXNzZWQgZm9yIHRoZSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIucmVtb3ZhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMgPSBuZXcgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyKHRoaXMucmVtb3ZlU3ViamVjdHMpLnNvcnQoXCJkZWxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVSZW1vdmVPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIucmVtb3ZhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29tcHV0ZSBzb2Z0LXJlbW92ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVNvZnRSZW1vdmVkOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlU29mdFJlbW92ZU9wZXJhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHJlY292ZXIgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVSZWNvdmVyZWQ7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSByZWNvdmVyIG9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVJlY292ZXJPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHJlY292ZXIgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGFsbCBzcGVjaWFsIGNvbHVtbnMgaW4gcGVyc2lzdGVkIGVudGl0aWVzLCBsaWtlIGluc2VydGVkIGlkIG9yIHJlbW92ZSBpZHMgZnJvbSB0aGUgcmVtb3ZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwiLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5QZXJzaXN0ZWRFbnRpdGllc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlU3BlY2lhbENvbHVtbnNJblBlcnNpc3RlZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYWxsIHNwZWNpYWwgY29sdW1ucyBpbiBwZXJzaXN0ZWQgZW50aXRpZXMsIGxpa2UgaW5zZXJ0ZWQgaWQgb3IgcmVtb3ZlIGlkcyBmcm9tIHRoZSByZW1vdmVkIGVudGl0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRlU3BlY2lhbENvbHVtbnNJblBlcnNpc3RlZEVudGl0aWVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGlzdGVuZXJzICE9PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyUmVzdWx0ID0gdGhpcy5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGJyb2FkY2FzdGVyUmVzdWx0LnByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGFsbCBnaXZlbiBzdWJqZWN0cy5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFsbFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0Lm11c3RCZVVwZGF0ZWQgJiYgc3ViamVjdC5tdXN0QmVSZW1vdmVkKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvcihzdWJqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBlbnRpdHkgcmUtY29tcHV0YXRpb25zIC0gZmluZHMgY2hhbmdlZCBjb2x1bW5zLCByZS1idWlsZHMgaW5zZXJ0L3VwZGF0ZS9yZW1vdmUgc3ViamVjdHMuXG4gICAgICovXG4gICAgU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5yZWNvbXB1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBTdWJqZWN0Q2hhbmdlZENvbHVtbnNDb21wdXRlcigpLmNvbXB1dGUodGhpcy5hbGxTdWJqZWN0cyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0U3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVJbnNlcnRlZDsgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVVcGRhdGVkOyB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVJlbW92ZWQ7IH0pO1xuICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVNvZnRSZW1vdmVkOyB9KTtcbiAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVSZWNvdmVyZWQ7IH0pO1xuICAgICAgICB0aGlzLmhhc0V4ZWN1dGFibGVPcGVyYXRpb25zID0gdGhpcy5pbnNlcnRTdWJqZWN0cy5sZW5ndGggPiAwIHx8IHRoaXMudXBkYXRlU3ViamVjdHMubGVuZ3RoID4gMCB8fCB0aGlzLnJlbW92ZVN1YmplY3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubGVuZ3RoID4gMCB8fCB0aGlzLnJlY292ZXJTdWJqZWN0cy5sZW5ndGggPiAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9JTlNFUlRcIiwgXCJCRUZPUkVfVVBEQVRFXCIsIFwiQkVGT1JFX1JFTU9WRVwiIGV2ZW50cyBmb3IgYWxsIGdpdmVuIHN1YmplY3RzLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuYnJvYWRjYXN0QmVmb3JlRXZlbnRzRm9yQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEJyb2FkY2FzdGVyUmVzdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmluc2VydFN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0U3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QmVmb3JlSW5zZXJ0RXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSk7IH0pO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZW1vdmVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVJlbW92ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpOyB9KTtcbiAgICAgICAgaWYgKHRoaXMuc29mdFJlbW92ZVN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuc29mdFJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZWNvdmVyU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QmVmb3JlVXBkYXRlRXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5kYXRhYmFzZUVudGl0eSwgc3ViamVjdC5kaWZmQ29sdW1ucywgc3ViamVjdC5kaWZmUmVsYXRpb25zKTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQUZURVJfSU5TRVJUXCIsIFwiQUZURVJfVVBEQVRFXCIsIFwiQUZURVJfUkVNT1ZFXCIgZXZlbnRzIGZvciBhbGwgZ2l2ZW4gc3ViamVjdHMuXG4gICAgICogUmV0dXJucyB2b2lkIGlmIHRoZXJlIHdhc24ndCBhbnkgbGlzdGVuZXIgb3Igc3Vic2NyaWJlciBleGVjdXRlZC5cbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24uXG4gICAgICovXG4gICAgU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBCcm9hZGNhc3RlclJlc3VsdCgpO1xuICAgICAgICBpZiAodGhpcy5pbnNlcnRTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmluc2VydFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEFmdGVySW5zZXJ0RXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSk7IH0pO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEFmdGVyVXBkYXRlRXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5kYXRhYmFzZUVudGl0eSwgc3ViamVjdC5kaWZmQ29sdW1ucywgc3ViamVjdC5kaWZmUmVsYXRpb25zKTsgfSk7XG4gICAgICAgIGlmICh0aGlzLnJlbW92ZVN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJSZW1vdmVFdmVudChyZXN1bHQsIHN1YmplY3QubWV0YWRhdGEsIHN1YmplY3QuZW50aXR5LCBzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTsgfSk7XG4gICAgICAgIGlmICh0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3RBZnRlclVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZWNvdmVyU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJVcGRhdGVFdmVudChyZXN1bHQsIHN1YmplY3QubWV0YWRhdGEsIHN1YmplY3QuZW50aXR5LCBzdWJqZWN0LmRhdGFiYXNlRW50aXR5LCBzdWJqZWN0LmRpZmZDb2x1bW5zLCBzdWJqZWN0LmRpZmZSZWxhdGlvbnMpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGluc2VydCBvcGVyYXRpb25zLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZUluc2VydE9wZXJhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZ3JvdXBlZEluc2VydFN1YmplY3RzLCBncm91cGVkSW5zZXJ0U3ViamVjdEtleXMsIF9sb29wXzEsIHRoaXNfMSwgZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEsIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEsIGdyb3VwTmFtZSwgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdyb3VwQnVsa1N1YmplY3RzKHRoaXMuaW5zZXJ0U3ViamVjdHMsIFwiaW5zZXJ0XCIpLCAyKSwgZ3JvdXBlZEluc2VydFN1YmplY3RzID0gX2FbMF0sIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5cyA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMSA9IGZ1bmN0aW9uIChncm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViamVjdHMsIGJ1bGtJbnNlcnRNYXBzLCBidWxrSW5zZXJ0U3ViamVjdHMsIHNpbmdsZUluc2VydFN1YmplY3RzLCBtYW5hZ2VyLCBpbnNlcnRSZXN1bHRfMSwgaW5zZXJ0UmVzdWx0XzIsIF9sb29wXzIsIHNpbmdsZUluc2VydFN1YmplY3RzXzEsIHNpbmdsZUluc2VydFN1YmplY3RzXzFfMSwgc3ViamVjdCwgZV8yXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMiwgX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBncm91cGVkSW5zZXJ0U3ViamVjdHNbZ3JvdXBOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0TWFwcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bGtJbnNlcnRTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUluc2VydFN1YmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfMS5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4uZGF0YWJhc2VOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uICYmIHN1YmplY3QuZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5lbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jcmVhdGVWYWx1ZVNldEFuZFBvcENoYW5nZU1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0TWFwcy5wdXNoKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNfMS5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBpbnNlcnQgaW4gYnVsayBpbiBmb2xsb3dpbmcgY2FzZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWVzIGluIGluc2VydCAob25seSBkZWZhdWx0cyBhcmUgaW5zZXJ0ZWQpLCBzaW5jZSB3ZSBjYW5ub3QgdXNlIERFRkFVTFQgVkFMVUVTIGV4cHJlc3Npb24gZm9yIG11bHRpcGxlIGluc2VydGVkIHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gd2hlbiBlbnRpdHkgaXMgYSB0cmVlIHRhYmxlLCBzaW5jZSB0cmVlIHRhYmxlcyByZXF1aXJlIGV4dHJhIG9wZXJhdGlvbiBwZXIgZWFjaCBpbnNlcnRlZCByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gd2hlbiBvcmFjbGUgaXMgdXNlZCwgc2luY2Ugb3JhY2xlJ3MgYnVsayBpbnNlcnRpb24gaXMgdmVyeSBiYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmNoYW5nZU1hcHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydE1hcHMucHVzaChzdWJqZWN0LmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpc18xLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzXzEucXVlcnlSdW5uZXIubWFuYWdlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtYW5hZ2VyLmluc2VydChzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQsIGJ1bGtJbnNlcnRNYXBzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0XzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pZGVudGlmaWVyID0gaW5zZXJ0UmVzdWx0XzEuaWRlbnRpZmllcnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IGluc2VydFJlc3VsdF8xLmdlbmVyYXRlZE1hcHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPSBidWxrSW5zZXJ0TWFwc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGJ1bGtJbnNlcnRNYXBzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oc3ViamVjdHNbMF0ubWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhidWxrSW5zZXJ0TWFwcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkodGhpc18xLm9wdGlvbnMgJiYgdGhpc18xLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0XzIgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuaWRlbnRpZmllciA9IGluc2VydFJlc3VsdF8yLmlkZW50aWZpZXJzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5nZW5lcmF0ZWRNYXAgPSBpbnNlcnRSZXN1bHRfMi5nZW5lcmF0ZWRNYXBzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0ID0gYnVsa0luc2VydE1hcHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzaW5nbGVJbnNlcnRTdWJqZWN0cy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzIgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9mLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPSBzdWJqZWN0LmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwKCk7IC8vIGltcG9ydGFudCB0byBoYXZlIGJlY2F1c2UgcXVlcnkgYnVpbGRlciBzZXRzIGluc2VydGVkIHZhbHVlcyBpbnRvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN1YmplY3QubWV0YWRhdGEudHJlZVR5cGUgPT09IFwibmVzdGVkLXNldFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IodGhpc18xLnF1ZXJ5UnVubmVyKS5pbnNlcnQoc3ViamVjdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkodGhpc18xLm9wdGlvbnMgJiYgdGhpc18xLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGluc2VydFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pZGVudGlmaWVyID0gaW5zZXJ0UmVzdWx0LmlkZW50aWZpZXJzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5nZW5lcmF0ZWRNYXAgPSBpbnNlcnRSZXN1bHQuZ2VuZXJhdGVkTWFwc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdWJqZWN0Lm1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgQ2xvc3VyZVN1YmplY3RFeGVjdXRvcih0aGlzXzEucXVlcnlSdW5uZXIpLmluc2VydChzdWJqZWN0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJtYXRlcmlhbGl6ZWQtcGF0aFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBNYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yKHRoaXNfMS5xdWVyeVJ1bm5lcikuaW5zZXJ0KHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2YubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWzUsIDEwLCAxMSwgMTJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0c18xID0gKGVfMiA9IHZvaWQgMCwgX192YWx1ZXMoc2luZ2xlSW5zZXJ0U3ViamVjdHMpKSwgc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xID0gc2luZ2xlSW5zZXJ0U3ViamVjdHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXNpbmdsZUluc2VydFN1YmplY3RzXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0ID0gc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8yKHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUluc2VydFN1YmplY3RzXzFfMSA9IHNpbmdsZUluc2VydFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xICYmICFzaW5nbGVJbnNlcnRTdWJqZWN0c18xXzEuZG9uZSAmJiAoX2QgPSBzaW5nbGVJbnNlcnRTdWJqZWN0c18xLnJldHVybikpIF9kLmNhbGwoc2luZ2xlSW5zZXJ0U3ViamVjdHNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXBhcmVkVmFsdWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHN1YmplY3QuZ2VuZXJhdGVkTWFwLCBwcmVwYXJlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEgPSBfX3ZhbHVlcyhncm91cGVkSW5zZXJ0U3ViamVjdEtleXMpLCBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMV8xID0gZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lID0gZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xKGdyb3VwTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEgPSBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xXzEgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEgJiYgIWdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEuZG9uZSAmJiAoX2IgPSBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMS5yZXR1cm4pKSBfYi5jYWxsKGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVVcGRhdGVPcGVyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBkYXRlU3ViamVjdCwgbmVzdGVkU2V0U3ViamVjdHMsIHJlbWFpbmluZ1N1YmplY3RzLCBfYSwgX2IsIHN1YmplY3QsIG5lc3RlZFNldFByb21pc2U7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdWJqZWN0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgdXBkYXRlTWFwLCBfYSwgdXBkYXRlUXVlcnlCdWlsZGVyLCB1cGRhdGVSZXN1bHQsIHVwZGF0ZUdlbmVyYXRlZE1hcF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJqZWN0LmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvcihzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHkgPSB0aGlzLmNsb25lTW9uZ29TdWJqZWN0RW50aXR5KHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJ0aWFsRW50aXR5W3N1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJ0aWFsRW50aXR5W3N1YmplY3QubWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFwID0gc3ViamVjdC5jcmVhdGVWYWx1ZVNldEFuZFBvcENoYW5nZU1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJuZXN0ZWQtc2V0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2xvc3VyZS10YWJsZVwiOiByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1hdGVyaWFsaXplZC1wYXRoXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcih0aGlzLnF1ZXJ5UnVubmVyKS51cGRhdGUoc3ViamVjdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IodGhpcy5xdWVyeVJ1bm5lcikudXBkYXRlKHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBNYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yKHRoaXMucXVlcnlSdW5uZXIpLnVwZGF0ZShzdWJqZWN0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXJ5QnVpbGRlciA9IHRoaXMucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQodXBkYXRlTWFwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlRW50aXR5KHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxMaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVRdWVyeUJ1aWxkZXIud2hlcmVFbnRpdHkoc3ViamVjdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIGluIHRoaXMgY2FzZSBpZGVudGlmaWVyIGlzIGp1c3QgY29uZGl0aW9ucyBvYmplY3QgdG8gdXBkYXRlIGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB1cGRhdGVRdWVyeUJ1aWxkZXIuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYXRlZE1hcF8xID0gdXBkYXRlUmVzdWx0LmdlbmVyYXRlZE1hcHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUdlbmVyYXRlZE1hcF8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZSh1cGRhdGVHZW5lcmF0ZWRNYXBfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVwYXJlZFZhbHVlID0gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHVwZGF0ZUdlbmVyYXRlZE1hcF8xLCBwcmVwYXJlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5nZW5lcmF0ZWRNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZ2VuZXJhdGVkTWFwID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdWJqZWN0LmdlbmVyYXRlZE1hcCwgdXBkYXRlR2VuZXJhdGVkTWFwXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKF9hID0gX192YWx1ZXModGhpcy51cGRhdGVTdWJqZWN0cyksIF9iID0gX2EubmV4dCgpOyAhX2IuZG9uZTsgX2IgPSBfYS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJuZXN0ZWQtc2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkU2V0UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRTZXRTdWJqZWN0c18xLCBuZXN0ZWRTZXRTdWJqZWN0c18xXzEsIHN1YmplY3QsIGVycm9yXzEsIGVfNF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNywgOCwgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzXzEgPSBfX3ZhbHVlcyhuZXN0ZWRTZXRTdWJqZWN0cyksIG5lc3RlZFNldFN1YmplY3RzXzFfMSA9IG5lc3RlZFNldFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFuZXN0ZWRTZXRTdWJqZWN0c18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IG5lc3RlZFNldFN1YmplY3RzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB1cGRhdGVTdWJqZWN0KHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzXzFfMSA9IG5lc3RlZFNldFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzRfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRTZXRTdWJqZWN0c18xXzEgJiYgIW5lc3RlZFNldFN1YmplY3RzXzFfMS5kb25lICYmIChfYSA9IG5lc3RlZFNldFN1YmplY3RzXzEucmV0dXJuKSkgX2EuY2FsbChuZXN0ZWRTZXRTdWJqZWN0c18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biBhbGwgcmVtYW5pbmcgc3ViamVjdHMgaW4gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlbWFpbmluZ1N1YmplY3RzLm1hcCh1cGRhdGVTdWJqZWN0KSksIGZhbHNlKSwgW25lc3RlZFNldFByb21pc2VdLCBmYWxzZSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGFsbCByZW1hbmluZyBzdWJqZWN0cyBpbiBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogdG9kbzogd2UgbmVlZCB0byBhcHBseSB0b3BvbG9naWNhbCBzb3J0IGhlcmUgYXMgd2VsbFxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZVJlbW92ZU9wZXJhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZ3JvdXBlZFJlbW92ZVN1YmplY3RzLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXMsIGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xLCBncm91cE5hbWUsIHN1YmplY3RzLCBkZWxldGVNYXBzLCBtYW5hZ2VyLCBfYiwgZV81XzE7XG4gICAgICAgICAgICB2YXIgZV81LCBfYztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX19yZWFkKHRoaXMuZ3JvdXBCdWxrU3ViamVjdHModGhpcy5yZW1vdmVTdWJqZWN0cywgXCJkZWxldGVcIiksIDIpLCBncm91cGVkUmVtb3ZlU3ViamVjdHMgPSBfYVswXSwgZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgMTMsIDE0LCAxNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEgPSBfX3ZhbHVlcyhncm91cGVkUmVtb3ZlU3ViamVjdEtleXMpLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xID0gZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTmFtZSA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cyA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0c1tncm91cE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTWFwcyA9IHN1YmplY3RzLm1hcChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QuaWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtYW5hZ2VyLmRlbGV0ZShzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQsIGRlbGV0ZU1hcHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHN1YmplY3RzWzBdLm1ldGFkYXRhLnRyZWVUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJuZXN0ZWQtc2V0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjbG9zdXJlLXRhYmxlXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcih0aGlzLnF1ZXJ5UnVubmVyKS5yZW1vdmUoc3ViamVjdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IodGhpcy5xdWVyeVJ1bm5lcikucmVtb3ZlKHN1YmplY3RzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IFxuICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGV4ZWN1dGUgb3VyIGRlbGV0aW9uIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lmeSBlbnRpdGllcyBhbmQgc2V0IHVwZGF0ZSBlbnRpdHkgdG8gdHJ1ZSBzaW5jZSB0aGUgb25seSB0aGluZyBxdWVyeSBidWlsZGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZG8gZm9yIHVzZSBpcyBhIHByaW1hcnkga2V5cyBkZWxldGlvbiB3aGljaCBpcyBoYW5kbGVkIGJ5IHVzIGxhdGVyIG9uY2UgcGVyc2lzdGVuY2UgaXMgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbywgd2UgZGlzYWJsZSBsaXN0ZW5lcnMgYmVjYXVzZSB3ZSBjYWxsIHRoZW0gb24gb3VyIG93biBpbiBwZXJzaXN0ZW5jZSBsYXllclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGRlbGV0ZU1hcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxMaXN0ZW5lcnMoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGV4ZWN1dGUgb3VyIGRlbGV0aW9uIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgZW50aXRpZXMgYW5kIHNldCB1cGRhdGUgZW50aXR5IHRvIHRydWUgc2luY2UgdGhlIG9ubHkgdGhpbmcgcXVlcnkgYnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBkbyBmb3IgdXNlIGlzIGEgcHJpbWFyeSBrZXlzIGRlbGV0aW9uIHdoaWNoIGlzIGhhbmRsZWQgYnkgdXMgbGF0ZXIgb25jZSBwZXJzaXN0ZW5jZSBpcyBmaW5pc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbywgd2UgZGlzYWJsZSBsaXN0ZW5lcnMgYmVjYXVzZSB3ZSBjYWxsIHRoZW0gb24gb3VyIG93biBpbiBwZXJzaXN0ZW5jZSBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xXzEgPSBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzFfMSAmJiAhZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzFfMS5kb25lICYmIChfYyA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xLnJldHVybikpIF9jLmNhbGwoZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuY2xvbmVNb25nb1N1YmplY3RFbnRpdHkgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICB2YXIgZV82LCBfYTtcbiAgICAgICAgdmFyIHRhcmdldCA9IHt9O1xuICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHRhcmdldCwgY29sdW1uLmdldEVudGl0eVZhbHVlTWFwKHN1YmplY3QuZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNl8xKSB7IGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzYpIHRocm93IGVfNi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTb2Z0LXJlbW92ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVTb2Z0UmVtb3ZlT3BlcmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubWFwKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVJlc3VsdCwgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsRW50aXR5ID0gdGhpcy5jbG9uZU1vbmdvU3ViamVjdEVudGl0eShzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5tZXRhZGF0YS5jcmVhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyID0gdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvZnREZWxldGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVudGl0eSh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlbG9hZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZUVudGl0eShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gaW4gdGhpcyBjYXNlIGlkZW50aWZpZXIgaXMganVzdCBjb25kaXRpb25zIG9iamVjdCB0byB1cGRhdGUgYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlcGFyZWRWYWx1ZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCwgcHJlcGFyZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVSZWNvdmVyT3BlcmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGhpcy5yZWNvdmVyU3ViamVjdHMubWFwKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVJlc3VsdCwgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsRW50aXR5ID0gdGhpcy5jbG9uZU1vbmdvU3ViamVjdEVudGl0eShzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5tZXRhZGF0YS5jcmVhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyID0gdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3RvcmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVudGl0eSh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlbG9hZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZUVudGl0eShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gaW4gdGhpcyBjYXNlIGlkZW50aWZpZXIgaXMganVzdCBjb25kaXRpb25zIG9iamVjdCB0byB1cGRhdGUgYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlcGFyZWRWYWx1ZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCwgcHJlcGFyZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhbGwgc3BlY2lhbCBjb2x1bW5zIG9mIHRoZSBzYXZpbmcgZW50aXRpZXMgKGNyZWF0ZSBkYXRlLCB1cGRhdGUgZGF0ZSwgdmVyc2lvbiwgZXRjLikuXG4gICAgICogQWxzbyB1cGRhdGVzIG51bGxhYmxlIGNvbHVtbnMgYW5kIGNvbHVtbnMgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5QZXJzaXN0ZWRFbnRpdGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gdXBkYXRlIGluc2VydGVkIGVudGl0eSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0aGlzLmluc2VydFN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3BlY2lhbENvbHVtbnNJbkluc2VydGVkQW5kVXBkYXRlZEVudGl0aWVzKHRoaXMuaW5zZXJ0U3ViamVjdHMpO1xuICAgICAgICAvLyB1cGRhdGUgdXBkYXRlZCBlbnRpdHkgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5JbnNlcnRlZEFuZFVwZGF0ZWRFbnRpdGllcyh0aGlzLnVwZGF0ZVN1YmplY3RzKTtcbiAgICAgICAgLy8gdXBkYXRlIHNvZnQtcmVtb3ZlZCBlbnRpdHkgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsQ29sdW1uc0luSW5zZXJ0ZWRBbmRVcGRhdGVkRW50aXRpZXModGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMpO1xuICAgICAgICAvLyB1cGRhdGUgcmVjb3ZlcmVkIGVudGl0eSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0aGlzLnJlY292ZXJTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5JbnNlcnRlZEFuZFVwZGF0ZWRFbnRpdGllcyh0aGlzLnJlY292ZXJTdWJqZWN0cyk7XG4gICAgICAgIC8vIHJlbW92ZSBpZHMgZnJvbSB0aGUgZW50aXRpZXMgdGhhdCB3ZXJlIHJlbW92ZWRcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlU3ViamVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW4uc2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHksIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlciBwb3N0LXBlcnNpc3QgdXBkYXRpb25zXG4gICAgICAgIHRoaXMuYWxsU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgaWYgKCFzdWJqZWN0LmVudGl0eSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLnJlbGF0aW9uSWRzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbklkLnNldFZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW9uZ28gX2lkIHJlbW92ZVxuICAgICAgICAgICAgaWYgKF90aGlzLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikge1xuICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4uZGF0YWJhc2VOYW1lXG4gICAgICAgICAgICAgICAgICAgICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4uZGF0YWJhc2VOYW1lICE9PSBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc3ViamVjdC5lbnRpdHlbc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGFsbCBzcGVjaWFsIGNvbHVtbnMgb2YgdGhlIHNhdmluZyBlbnRpdGllcyAoY3JlYXRlIGRhdGUsIHVwZGF0ZSBkYXRlLCB2ZXJzaW9uLCBldGMuKS5cbiAgICAgKiBBbHNvIHVwZGF0ZXMgbnVsbGFibGUgY29sdW1ucyBhbmQgY29sdW1ucyB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUudXBkYXRlU3BlY2lhbENvbHVtbnNJbkluc2VydGVkQW5kVXBkYXRlZEVudGl0aWVzID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gc2V0IHZhbHVlcyB0byBcIm51bGxcIiBmb3IgbnVsbGFibGUgY29sdW1ucyB0aGF0IGRpZCBub3QgaGF2ZSB2YWx1ZXNcbiAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0YWJsZSBpbmhlcml0YW5jZSBpcyB1c2VkIG1ha2Ugc3VyZSB0aGlzIGNvbHVtbiBpcyBub3QgY2hpbGQncyBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5sZW5ndGggPiAwICYmIHN1YmplY3QubWV0YWRhdGEuY2hpbGRFbnRpdHlNZXRhZGF0YXMubWFwKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0OyB9KS5pbmRleE9mKGNvbHVtbi50YXJnZXQpICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIGVudGl0aWVzIGRvZXMgbm90IGhhdmUgdmlydHVhbCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5pc1ZpcnR1YWwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbnVsbGFibGUgY29sdW1uc1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNOdWxsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uVmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSByZWxhdGlvbmFsIGNvbHVtbnNcbiAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC51cGRhdGVkUmVsYXRpb25NYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdC51cGRhdGVkUmVsYXRpb25NYXBzLmZvckVhY2goZnVuY3Rpb24gKHVwZGF0ZWRSZWxhdGlvbk1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFJlbGF0aW9uTWFwLnJlbGF0aW9uLmpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5LCB1cGRhdGVkUmVsYXRpb25NYXAudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh1cGRhdGVkUmVsYXRpb25NYXAudmFsdWUpIDogdXBkYXRlZFJlbGF0aW9uTWFwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG1lcmdlIGludG8gZW50aXR5IGFsbCBnZW5lcmF0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IGEgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcClcbiAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKHN1YmplY3QubWV0YWRhdGEudGFyZ2V0LCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdyb3VwcyBzdWJqZWN0cyBieSBtZXRhZGF0YSBuYW1lcyAoYnkgdGFibGVzKSB0byBtYWtlIGJ1bGsgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIHBvc3NpYmxlLlxuICAgICAqIEhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMgd2l0aCBidWxrIGluc2VydGlvbnMgb2YgZGF0YSBpbnRvIHRhYmxlcyB3aXRoIGdlbmVyYXRlZCAoaW5jcmVtZW50KSBjb2x1bW5zXG4gICAgICogaW4gc29tZSBkcml2ZXJzLiBTb21lIGRyaXZlcnMgbGlrZSBteXNxbCBhbmQgc3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgcmV0dXJuaW5nIG11bHRpcGxlIGdlbmVyYXRlZCBjb2x1bW5zXG4gICAgICogYWZ0ZXIgaW5zZXJ0aW9uIGFuZCBjYW4gb25seSByZXR1cm4gYSBzaW5nbGUgZ2VuZXJhdGVkIGNvbHVtbiB2YWx1ZSwgdGhhdCdzIHdoeSBpdHMgbm90IHBvc3NpYmxlIHRvIGRvIGJ1bGsgaW5zZXJ0aW9uLFxuICAgICAqIGJlY2F1c2UgaXQgYnJlYWtzIGluc2VydGlvbiByZXN1bHQncyBnZW5lcmF0ZWRNYXAgYW5kIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhpcyBzdWJqZWN0IGlzIHVzZWQgaW4gb3RoZXIgc3ViamVjdHMgc2F2ZXMuXG4gICAgICogVGhhdCdzIHdoeSB3ZSBvbmx5IHN1cHBvcnQgYnVsa2luZyBpbiBqdW5jdGlvbiB0YWJsZXMgZm9yIHRob3NlIGRyaXZlcnMuXG4gICAgICpcbiAgICAgKiBPdGhlciBkcml2ZXJzIGxpa2UgcG9zdGdyZXMgYW5kIHNxbCBzZXJ2ZXIgc3VwcG9ydCBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IHdoaWNoIGFsbG93cyB0byByZXR1cm4gZ2VuZXJhdGVkXG4gICAgICogaWQgZm9yIGVhY2ggaW5zZXJ0ZWQgcm93LCB0aGF0J3Mgd2h5IGJ1bGsgaW5zZXJ0aW9uIGlzIG5vdCBsaW1pdGVkIHRvIGp1bmN0aW9uIHRhYmxlcyBpbiB0aGVyZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdyb3VwQnVsa1N1YmplY3RzID0gZnVuY3Rpb24gKHN1YmplY3RzLCB0eXBlKSB7XG4gICAgICAgIHZhciBncm91cCA9IHt9O1xuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICB2YXIgZ3JvdXBpbmdBbGxvd2VkID0gdHlwZSA9PT0gXCJkZWxldGVcIiB8fCB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCk7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QsIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBpbmdBbGxvd2VkIHx8IHN1YmplY3QubWV0YWRhdGEuaXNKdW5jdGlvbiA/IHN1YmplY3QubWV0YWRhdGEubmFtZSA6IHN1YmplY3QubWV0YWRhdGEubmFtZSArIFwiX1wiICsgaW5kZXg7XG4gICAgICAgICAgICBpZiAoIWdyb3VwW2tleV0pIHtcbiAgICAgICAgICAgICAgICBncm91cFtrZXldID0gW3N1YmplY3RdO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBba2V5XS5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtncm91cCwga2V5c107XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdEV4ZWN1dG9yO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0RXhlY3V0b3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBPcmRlcnMgaW5zZXJ0IG9yIHJlbW92ZSBzdWJqZWN0cyBpbiBwcm9wZXIgb3JkZXIgKHVzaW5nIHRvcG9sb2dpY2FsIHNvcnRpbmcpXG4gKiB0byBtYWtlIHN1cmUgaW5zZXJ0IG9yIHJlbW92ZSBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBhIHByb3BlciBvcmRlci5cbiAqL1xudmFyIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdFRvcG9saWdpY2FsU29ydGVyKHN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdHMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViamVjdHMpLCBmYWxzZSk7IC8vIGNvcHkgc3ViamVjdHMgdG8gcHJldmVudCBjaGFuZ2luZyBvZiBzZW50IGFycmF5XG4gICAgICAgIHRoaXMubWV0YWRhdGFzID0gdGhpcy5nZXRVbmlxdWVNZXRhZGF0YXModGhpcy5zdWJqZWN0cyk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTb3J0cyAob3JkZXJzKSBzdWJqZWN0cyBpbiB0aGVpciB0b3BvbG9naWNhbCBvcmRlci5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtZXRhZGF0YXMgaXQgcHJvYmFibHkgbWVhbiB0aGVyZSBpcyBubyBzdWJqZWN0cy4uLiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmVcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0cztcbiAgICAgICAgdmFyIHNvcnRlZFN1YmplY3RzID0gW107XG4gICAgICAgIC8vIGZpcnN0IGlmIHdlIHNvcnQgZm9yIGRlbGV0aW9uIGFsbCBqdW5jdGlvbiBzdWJqZWN0c1xuICAgICAgICAvLyBqdW5jdGlvbiBzdWJqZWN0cyBhcmUgc3ViamVjdHMgd2l0aG91dCBlbnRpdHkgYW5kIGRhdGFiYXNlIGVudGl0eSBzZXRcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJkZWxldGVcIikge1xuICAgICAgICAgICAgdmFyIGp1bmN0aW9uU3ViamVjdHMgPSB0aGlzLnN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gIXN1YmplY3QuZW50aXR5ICYmICFzdWJqZWN0LmRhdGFiYXNlRW50aXR5OyB9KTtcbiAgICAgICAgICAgIHNvcnRlZFN1YmplY3RzLnB1c2guYXBwbHkoc29ydGVkU3ViamVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChqdW5jdGlvblN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxyZWFkeVNvcnRlZChqdW5jdGlvblN1YmplY3RzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXh0IHdlIGFsd2F5cyBpbnNlcnQgZW50aXRpZXMgd2l0aCBub24tbnVsbGFibGUgcmVsYXRpb25zLCBzb3J0IHRoZW0gZmlyc3RcbiAgICAgICAgdmFyIG5vbk51bGxhYmxlRGVwZW5kZW5jaWVzID0gdGhpcy5nZXROb25OdWxsYWJsZURlcGVuZGVuY2llcygpO1xuICAgICAgICB2YXIgc29ydGVkTm9uTnVsbGFibGVFbnRpdHlUYXJnZXRzID0gdGhpcy50b3Bvc29ydChub25OdWxsYWJsZURlcGVuZGVuY2llcyk7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiaW5zZXJ0XCIpXG4gICAgICAgICAgICBzb3J0ZWROb25OdWxsYWJsZUVudGl0eVRhcmdldHMgPSBzb3J0ZWROb25OdWxsYWJsZUVudGl0eVRhcmdldHMucmV2ZXJzZSgpO1xuICAgICAgICAvLyBzbyB3ZSBoYXZlIGEgc29ydGVkIGVudGl0eSB0YXJnZXRzXG4gICAgICAgIC8vIGdvIHRob3VnaHQgZWFjaCBvZiB0aGVtIGFuZCBmaW5kIGFsbCBzdWJqZWN0cyB3aXRoIHNvcnRlZCBlbnRpdHkgdGFyZ2V0XG4gICAgICAgIC8vIGFkZCB0aG9zZSBzb3J0ZWQgdGFyZ2V0cyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBvcmlnaW5hbCBhcnJheSBvZiB0YXJnZXRzXG4gICAgICAgIHNvcnRlZE5vbk51bGxhYmxlRW50aXR5VGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChzb3J0ZWRFbnRpdHlUYXJnZXQpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlUYXJnZXRTdWJqZWN0cyA9IF90aGlzLnN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lID09PSBzb3J0ZWRFbnRpdHlUYXJnZXQ7IH0pO1xuICAgICAgICAgICAgc29ydGVkU3ViamVjdHMucHVzaC5hcHBseShzb3J0ZWRTdWJqZWN0cywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVudGl0eVRhcmdldFN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIF90aGlzLnJlbW92ZUFscmVhZHlTb3J0ZWQoZW50aXR5VGFyZ2V0U3ViamVjdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gbmV4dCBzb3J0IGFsbCBvdGhlciBlbnRpdGllc1xuICAgICAgICAvLyBzYW1lIHByb2Nlc3MgYXMgaW4gYWJvdmUgYnV0IHdpdGggb3RoZXIgZW50aXRpZXNcbiAgICAgICAgdmFyIG90aGVyRGVwZW5kZW5jaWVzID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgdmFyIHNvcnRlZE90aGVyRW50aXR5VGFyZ2V0cyA9IHRoaXMudG9wb3NvcnQob3RoZXJEZXBlbmRlbmNpZXMpO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBcImluc2VydFwiKVxuICAgICAgICAgICAgc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzID0gc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzLnJldmVyc2UoKTtcbiAgICAgICAgc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHNvcnRlZEVudGl0eVRhcmdldCkge1xuICAgICAgICAgICAgdmFyIGVudGl0eVRhcmdldFN1YmplY3RzID0gX3RoaXMuc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldE5hbWUgPT09IHNvcnRlZEVudGl0eVRhcmdldDsgfSk7XG4gICAgICAgICAgICBzb3J0ZWRTdWJqZWN0cy5wdXNoLmFwcGx5KHNvcnRlZFN1YmplY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZW50aXR5VGFyZ2V0U3ViamVjdHMpLCBmYWxzZSkpO1xuICAgICAgICAgICAgX3RoaXMucmVtb3ZlQWxyZWFkeVNvcnRlZChlbnRpdHlUYXJnZXRTdWJqZWN0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIHNvbWV0aGluZyBsZWZ0IGluIHRoZSBzdWJqZWN0cyBhZGQgdGhlbSBhcyB3ZWxsXG4gICAgICAgIHNvcnRlZFN1YmplY3RzLnB1c2guYXBwbHkoc29ydGVkU3ViamVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLnN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZFN1YmplY3RzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxyZWFkeSBzb3J0ZWQgc3ViamVjdHMgZnJvbSB0aGlzLnN1YmplY3RzIGxpc3Qgb2Ygc3ViamVjdHMuXG4gICAgICovXG4gICAgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyLnByb3RvdHlwZS5yZW1vdmVBbHJlYWR5U29ydGVkID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnNwbGljZShfdGhpcy5zdWJqZWN0cy5pbmRleE9mKHN1YmplY3QpLCAxKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhbGwgdW5pcXVlIG1ldGFkYXRhcyBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0cy5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLmdldFVuaXF1ZU1ldGFkYXRhcyA9IGZ1bmN0aW9uIChzdWJqZWN0cykge1xuICAgICAgICB2YXIgbWV0YWRhdGFzID0gW107XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YXMuaW5kZXhPZihzdWJqZWN0Lm1ldGFkYXRhKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFzLnB1c2goc3ViamVjdC5tZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGFzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBkZXBlbmRlbmN5IHRyZWUgZm9yIGFsbCBlbnRpdHkgbWV0YWRhdGFzIHdpdGggbm9uLW51bGxhYmxlIHJlbGF0aW9ucy5cbiAgICAgKiBXZSBuZWVkIHRvIGV4ZWN1dGUgaW5zZXJ0aW9ucyBmaXJzdCBmb3IgZW50aXRpZXMgd2hpY2ggbm9uLW51bGxhYmxlIHJlbGF0aW9ucy5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLmdldE5vbk51bGxhYmxlRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YXMucmVkdWNlKGZ1bmN0aW9uIChkZXBlbmRlbmNpZXMsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNOdWxsYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFttZXRhZGF0YS50YXJnZXROYW1lLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGRlcGVuZGVuY3kgdHJlZSBmb3IgYWxsIGVudGl0eSBtZXRhZGF0YXMgd2l0aCBub24tbnVsbGFibGUgcmVsYXRpb25zLlxuICAgICAqIFdlIG5lZWQgdG8gZXhlY3V0ZSBpbnNlcnRpb25zIGZpcnN0IGZvciBlbnRpdGllcyB3aGljaCBub24tbnVsbGFibGUgcmVsYXRpb25zLlxuICAgICAqL1xuICAgIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlci5wcm90b3R5cGUuZ2V0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YXMucmVkdWNlKGZ1bmN0aW9uIChkZXBlbmRlbmNpZXMsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBpZiByZWxhdGlvbiBpcyBzZWxmLXJlZmVyZW5jZWQgd2Ugc2tpcCBpdFxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEgPT09IG1ldGFkYXRhKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goW21ldGFkYXRhLnRhcmdldE5hbWUsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNvcnRzIGdpdmVuIGdyYXBoIHVzaW5nIHRvcG9sb2dpY2FsIHNvcnRpbmcgYWxnb3JpdGhtLlxuICAgICAqXG4gICAgICogQWxnb3JpdGhtIGlzIGtpbmRseSB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjZWxrbGVoci90b3Bvc29ydCByZXBvc2l0b3J5LlxuICAgICAqL1xuICAgIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlci5wcm90b3R5cGUudG9wb3NvcnQgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgICAgICAgZnVuY3Rpb24gdW5pcXVlTm9kZXMoYXJyKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpXzEgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpXzEgPCBsZW47IGlfMSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVkZ2UgPSBhcnJbaV8xXTtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmluZGV4T2YoZWRnZVswXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlZGdlWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmluZGV4T2YoZWRnZVsxXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlZGdlWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVzID0gdW5pcXVlTm9kZXMoZWRnZXMpO1xuICAgICAgICB2YXIgY3Vyc29yID0gbm9kZXMubGVuZ3RoLCBzb3J0ZWQgPSBuZXcgQXJyYXkoY3Vyc29yKSwgdmlzaXRlZCA9IHt9LCBpID0gY3Vyc29yO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWRbaV0pXG4gICAgICAgICAgICAgICAgdmlzaXQobm9kZXNbaV0sIGksIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB2aXNpdChub2RlLCBpLCBwcmVkZWNlc3NvcnMpIHtcbiAgICAgICAgICAgIGlmIChwcmVkZWNlc3NvcnMuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkN5Y2xpYyBkZXBlbmRlbmN5OiBcIiArIEpTT04uc3RyaW5naWZ5KG5vZGUpKTsgLy8gdG9kbzogYmV0dGVyIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkZvdW5kIHVua25vd24gbm9kZS4gTWFrZSBzdXJlIHRvIHByb3ZpZGVkIGFsbCBpbnZvbHZlZCBub2Rlcy4gVW5rbm93biBub2RlOiBcIiArIEpTT04uc3RyaW5naWZ5KG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aXNpdGVkW2ldKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZpc2l0ZWRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gb3V0Z29pbmcgZWRnZXNcbiAgICAgICAgICAgIHZhciBvdXRnb2luZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlWzBdID09PSBub2RlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaSA9IG91dGdvaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBwcmVkcyA9IHByZWRlY2Vzc29ycy5jb25jYXQobm9kZSk7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBvdXRnb2luZ1stLWldWzFdO1xuICAgICAgICAgICAgICAgICAgICB2aXNpdChjaGlsZCwgbm9kZXMuaW5kZXhPZihjaGlsZCksIHByZWRzKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnRlZFstLWN1cnNvcl0gPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdFRvcG9saWdpY2FsU29ydGVyO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuLyoqXG4gKiBGaW5kcyBhbGwgY2FzY2FkZSBvcGVyYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0IGFuZCBjYXNjYWRlIG9wZXJhdGlvbnMgb2YgdGhlIGZvdW5kIGNhc2NhZGVkIHN1YmplY3RzLFxuICogZS5nLiBidWlsZHMgYSBjYXNjYWRlIHRyZWUgYW5kIGNyZWF0ZXMgYSBzdWJqZWN0cyBmb3IgdGhlbS5cbiAqL1xudmFyIENhc2NhZGVzU3ViamVjdEJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDYXNjYWRlc1N1YmplY3RCdWlsZGVyKGFsbFN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuYWxsU3ViamVjdHMgPSBhbGxTdWJqZWN0cztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBjYXNjYWRlIHN1YmplY3RzIHRyZWUgYW5kIHB1c2hlcyB0aGVtIGluIGludG8gdGhlIGdpdmVuIGFycmF5IG9mIHN1YmplY3RzLlxuICAgICAqL1xuICAgIENhc2NhZGVzU3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKHN1YmplY3QsIG9wZXJhdGlvblR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3ViamVjdC5tZXRhZGF0YVxuICAgICAgICAgICAgLmV4dHJhY3RSZWxhdGlvblZhbHVlc0Zyb21FbnRpdHkoc3ViamVjdC5lbnRpdHksIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zKSAvLyB0b2RvOiB3ZSBjYW4gY3JlYXRlIEVudGl0eU1ldGFkYXRhLmNhc2NhZGVSZWxhdGlvbnNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAzKSwgcmVsYXRpb24gPSBfYlswXSwgcmVsYXRpb25FbnRpdHkgPSBfYlsxXSwgcmVsYXRpb25FbnRpdHlNZXRhZGF0YSA9IF9iWzJdO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCBvbmx5IGRlZmluZWQgdmFsdWVzIGFuZCBpbnNlcnQsIHVwZGF0ZSwgc29mdC1yZW1vdmUgb3IgcmVjb3ZlciBjYXNjYWRlcyBvZiB0aGUgcmVsYXRpb24gc2hvdWxkIGJlIHNldFxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uRW50aXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICByZWxhdGlvbkVudGl0eSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICghcmVsYXRpb24uaXNDYXNjYWRlSW5zZXJ0ICYmICFyZWxhdGlvbi5pc0Nhc2NhZGVVcGRhdGUgJiYgIXJlbGF0aW9uLmlzQ2FzY2FkZVNvZnRSZW1vdmUgJiYgIXJlbGF0aW9uLmlzQ2FzY2FkZVJlY292ZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIHJlbGF0aW9uIGVudGl0eSBpcyBqdXN0IGEgcmVsYXRpb24gaWQgc2V0IChmb3IgZXhhbXBsZSBwb3N0LnRhZyA9IDEpXG4gICAgICAgICAgICAvLyB0aGVuIHdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGNoZWNrIGNhc2NhZGVzIHNpbmNlIHRoZXJlIGlzIG5vIG9iamVjdCB0byBpbnNlcnQgb3IgdXBkYXRlXG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbkVudGl0eSBpbnN0YW5jZW9mIE9iamVjdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXMgdGhpcyBlbnRpdHkgaW4gbGlzdCBvZiBvcGVyYXRlZCBzdWJqZWN0cyB0aGVuIHNraXAgaXQgdG8gYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICB2YXIgYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0ID0gX3RoaXMuZmluZEJ5UGVyc2lzdEVudGl0eUxpa2UocmVsYXRpb25FbnRpdHlNZXRhZGF0YS50YXJnZXQsIHJlbGF0aW9uRW50aXR5KTtcbiAgICAgICAgICAgIGlmIChhbHJlYWR5RXhpc3RSZWxhdGlvbkVudGl0eVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlSW5zZXJ0ZWQgPT09IGZhbHNlKSAvLyBpZiBpdHMgbm90IG1hcmtlZCBmb3IgaW5zZXJ0aW9uIHlldFxuICAgICAgICAgICAgICAgICAgICBhbHJlYWR5RXhpc3RSZWxhdGlvbkVudGl0eVN1YmplY3QuY2FuQmVJbnNlcnRlZCA9IHJlbGF0aW9uLmlzQ2FzY2FkZUluc2VydCA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInNhdmVcIjtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlVXBkYXRlZCA9PT0gZmFsc2UpIC8vIGlmIGl0cyBub3QgbWFya2VkIGZvciB1cGRhdGUgeWV0XG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVVwZGF0ZWQgPSByZWxhdGlvbi5pc0Nhc2NhZGVVcGRhdGUgPT09IHRydWUgJiYgb3BlcmF0aW9uVHlwZSA9PT0gXCJzYXZlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVNvZnRSZW1vdmVkID09PSBmYWxzZSkgLy8gaWYgaXRzIG5vdCBtYXJrZWQgZm9yIHJlbW92YWwgeWV0XG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVNvZnRSZW1vdmVkID0gcmVsYXRpb24uaXNDYXNjYWRlU29mdFJlbW92ZSA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInNvZnQtcmVtb3ZlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVJlY292ZXJlZCA9PT0gZmFsc2UpIC8vIGlmIGl0cyBub3QgbWFya2VkIGZvciByZWNvdmVyeSB5ZXRcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlUmVjb3ZlcmVkID0gcmVsYXRpb24uaXNDYXNjYWRlUmVjb3ZlciA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInJlY292ZXJcIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYXJrIHN1YmplY3Qgd2l0aCB3aGF0IHdlIGNhbiBkbyB3aXRoIGl0XG4gICAgICAgICAgICAvLyBhbmQgYWRkIHRvIHRoZSBhcnJheSBvZiBzdWJqZWN0cyB0byBsb2FkIG9ubHkgaWYgdGhlcmUgaXMgbm8gc2FtZSBlbnRpdHkgdGhlcmUgYWxyZWFkeVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uRW50aXR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25FbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJlbnRTdWJqZWN0OiBzdWJqZWN0LFxuICAgICAgICAgICAgICAgIGVudGl0eTogcmVsYXRpb25FbnRpdHksXG4gICAgICAgICAgICAgICAgY2FuQmVJbnNlcnRlZDogcmVsYXRpb24uaXNDYXNjYWRlSW5zZXJ0ID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogcmVsYXRpb24uaXNDYXNjYWRlVXBkYXRlID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlU29mdFJlbW92ZWQ6IHJlbGF0aW9uLmlzQ2FzY2FkZVNvZnRSZW1vdmUgPT09IHRydWUgJiYgb3BlcmF0aW9uVHlwZSA9PT0gXCJzb2Z0LXJlbW92ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlUmVjb3ZlcmVkOiByZWxhdGlvbi5pc0Nhc2NhZGVSZWNvdmVyID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwicmVjb3ZlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF90aGlzLmFsbFN1YmplY3RzLnB1c2gocmVsYXRpb25FbnRpdHlTdWJqZWN0KTtcbiAgICAgICAgICAgIC8vIGdvIHJlY3Vyc2l2ZWx5IGFuZCBmaW5kIG90aGVyIGVudGl0aWVzIHdlIG5lZWQgdG8gaW5zZXJ0L3VwZGF0ZVxuICAgICAgICAgICAgX3RoaXMuYnVpbGQocmVsYXRpb25FbnRpdHlTdWJqZWN0LCBvcGVyYXRpb25UeXBlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHN1YmplY3Qgd2hlcmUgZW50aXR5IGxpa2UgZ2l2ZW4gc3ViamVjdCdzIGVudGl0eS5cbiAgICAgKiBDb21wYXJpc2lvbiBtYWRlIGJ5IGVudGl0eSBpZC5cbiAgICAgKi9cbiAgICBDYXNjYWRlc1N1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5maW5kQnlQZXJzaXN0RW50aXR5TGlrZSA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxTdWJqZWN0cy5maW5kKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSA9PT0gZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QubWV0YWRhdGEudGFyZ2V0ID09PSBlbnRpdHlUYXJnZXQgJiYgc3ViamVjdC5tZXRhZGF0YS5jb21wYXJlRW50aXRpZXMoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzLCBlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDYXNjYWRlc1N1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENhc2NhZGVzU3ViamVjdEJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FzY2FkZXNTdWJqZWN0QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBCdWlsZHMgb3BlcmF0aW9ucyBuZWVkcyB0byBiZSBleGVjdXRlZCBmb3IgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZ2l2ZW4gc3ViamVjdHMuXG4gKlxuICogYnkgZXhhbXBsZTogcG9zdCBjb250YWlucyBvd25lciBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2l0aCBjYXRlZ29yaWVzIGluIHRoZSBwcm9wZXJ0eSBjYWxsZWQgXCJjYXRlZ29yaWVzXCIsIGUuZy5cbiAqICAgICAgICAgICAgIEBNYW55VG9NYW55KHR5cGUgPT4gQ2F0ZWdvcnksIGNhdGVnb3J5ID0+IGNhdGVnb3J5LnBvc3RzKSBjYXRlZ29yaWVzOiBDYXRlZ29yeVtdXG4gKiAgICAgICAgICAgICBJZiB1c2VyIGFkZHMgY2F0ZWdvcmllcyBpbnRvIHRoZSBwb3N0IGFuZCBzYXZlcyBwb3N0IHdlIG5lZWQgdG8gYmluZCB0aGVtLlxuICogICAgICAgICAgICAgVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdXBkYXRpb24gb2YganVuY3Rpb24gdGFibGUuXG4gKi9cbnZhciBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5zdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBvcGVyYXRpb25zIGZvciBhbnkgY2hhbmdlcyBpbiB0aGUgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgc3ViamVjdHMuXG4gICAgICovXG4gICAgTWFueVRvTWFueVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAvLyBpZiBzdWJqZWN0IGRvZXNuJ3QgaGF2ZSBlbnRpdHkgdGhlbiBubyBuZWVkIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGluc2VydGVkIG9yIHJlbW92ZWRcbiAgICAgICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgcGVyc2lzdGVuY2UgZW5hYmxlZCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIGFuZCBidWlsZCBzdWJqZWN0IG9wZXJhdGlvbnMgZm9yIHRoZW1cbiAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEubWFueVRvTWFueVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgcmVsYXRpb25zIGZvciB3aGljaCBwZXJzaXN0ZW5jZSBpcyBkaXNhYmxlZFxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRGb3JTdWJqZWN0UmVsYXRpb24oc3ViamVjdCwgcmVsYXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIHJlbW92YWwgb2YgYWxsIG1hbnktdG8tbWFueSByZWNvcmRzIG9mIGFsbCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0LlxuICAgICAqL1xuICAgIE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGRGb3JBbGxSZW1vdmFsID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgc3ViamVjdCBkb2VzIG5vdCBoYXZlIGEgZGF0YWJhc2UgZW50aXR5IHRoZW4gaXQgbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0aGVuIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgZm9yIGRlbGV0aW9uXG4gICAgICAgIGlmICghc3ViamVjdC5kYXRhYmFzZUVudGl0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgcGVyc2lzdGVuY2UgZW5hYmxlZCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIGFuZCBidWlsZCBzdWJqZWN0IG9wZXJhdGlvbnMgZm9yIHRoZW1cbiAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5tYW55VG9NYW55UmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGdldCBhbGwgcmVsYXRlZCBlbnRpdGllcyAoYWN0dWFsbHkgcmVsYXRlZCBlbnRpdHkgcmVsYXRpb24gaWRzKSBiaW5kIHRvIHRoaXMgc3ViamVjdCBlbnRpdHlcbiAgICAgICAgICAgIC8vIGJ5IGV4YW1wbGU6IHJldHVybnMgY2F0ZWdvcnkgaWRzIG9mIHRoZSBwb3N0IHdlIGFyZSBjdXJyZW50bHkgd29ya2luZyB3aXRoIChzdWJqZWN0LmVudGl0eSBpcyBwb3N0KVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkc0luRGF0YWJhc2UgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHJlbGF0ZWQgZW50aXRpZXMgYW5kIGNyZWF0ZSBhIG5ldyBqdW5jdGlvbiBzdWJqZWN0IGZvciBlYWNoIHJvdyBpbiBqdW5jdGlvbiB0YWJsZVxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRzSW5EYXRhYmFzZS5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGp1bmN0aW9uU3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgIG11c3RCZVJlbW92ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IF90aGlzLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyKHN1YmplY3QsIHJlbGF0aW9uLCByZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB1bnNoaWZ0IGJlY2F1c2Ugd2UgbmVlZCB0byBwZXJmb3JtIHRob3NlIG9wZXJhdGlvbnMgYmVmb3JlIHBvc3QgZGVsZXRpb24gaXMgcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgLy8gYnV0IHBvc3QgZGVsZXRpb24gd2FzIGFscmVhZHkgYWRkZWQgYXMgYW4gc3ViamVjdFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGVtcG9yYXJ5IHNvbHV0aW9uLCBsYXRlciB3ZSBuZWVkIHRvIGltcGxlbWVudCBwcm9wZXIgc29ydGluZyBvZiBzdWJqZWN0cyBiZWZvcmUgdGhlaXIgcmVtb3ZhbFxuICAgICAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnB1c2goanVuY3Rpb25TdWJqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcmllc1wiIGluc2lkZSBpdCBoZXJlLlxuICAgICAqL1xuICAgIE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGRGb3JTdWJqZWN0UmVsYXRpb24gPSBmdW5jdGlvbiAoc3ViamVjdCwgcmVsYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gbG9hZCBmcm9tIGRiIGFsbCByZWxhdGlvbiBpZHMgb2YgaW52ZXJzZSBlbnRpdGllcyB0aGF0IGFyZSBcImJpbmRcIiB0byB0aGUgc3ViamVjdCdzIGVudGl0eVxuICAgICAgICAvLyB0aGlzIHdheSB3ZSBnb25uYSBjaGVjayB3aGljaCByZWxhdGlvbiBpZHMgYXJlIG1pc3NpbmcgYW5kIHdoaWNoIGFyZSBuZXcgKGUuZy4gaW5zZXJ0ZWQgb3IgcmVtb3ZlZClcbiAgICAgICAgdmFyIGRhdGFiYXNlUmVsYXRlZEVudGl0eUlkcyA9IFtdO1xuICAgICAgICAvLyBpZiBzdWJqZWN0IGRvbid0IGhhdmUgZGF0YWJhc2UgZW50aXR5IGl0IG1lYW5zIGFsbCByZWxhdGVkIGVudGl0aWVzIGluIHBlcnNpc3RlZCBzdWJqZWN0IGFyZSBuZXcgYW5kIG11c3QgYmUgYmluZFxuICAgICAgICAvLyBhbmQgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgc29tZXRoaW5nIHRoYXQgaXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChzdWJqZWN0LmRhdGFiYXNlRW50aXR5KVxuICAgICAgICAgICAgZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5kYXRhYmFzZUVudGl0eSk7XG4gICAgICAgIC8vIGV4dHJhY3QgZW50aXR5J3MgcmVsYXRpb24gdmFsdWVcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogY2F0ZWdvcmllcyBpbnNpZGUgb3VyIHBvc3QgKHN1YmplY3QuZW50aXR5IGlzIHBvc3QpXG4gICAgICAgIHZhciByZWxhdGVkRW50aXRpZXMgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgIGlmIChyZWxhdGVkRW50aXRpZXMgPT09IG51bGwpIC8vIGlmIHZhbHVlIHNldCB0byBudWxsIGl0cyBlcXVhbCBpZiB3ZSBzZXQgaXQgdG8gZW1wdHkgYXJyYXkgLSBhbGwgaXRlbXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICByZWxhdGVkRW50aXRpZXMgPSBbXTtcbiAgICAgICAgaWYgKCEoQXJyYXkuaXNBcnJheShyZWxhdGVkRW50aXRpZXMpKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gZnJvbSBhbGwgcmVsYXRlZCBlbnRpdGllcyBmaW5kIG9ubHkgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kIGluIHRoZSBkYiAtIGZvciB0aGVtIHdlIHdpbGwgY3JlYXRlIG9wZXJhdGlvbiBzdWJqZWN0c1xuICAgICAgICByZWxhdGVkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgaG93IGl0IHdpbGwgd29yayBmb3IgZW50aXRpZXMgd2hpY2ggYXJlIHNhdmVkIGJ5IGNhc2NhZGVzLCBidXQgYXJlbid0IHNhdmVkIGluIHRoZSBkYXRhYmFzZSB5ZXRcbiAgICAgICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZCBmcm9tIHRoZSByZWxhdGVkIGVudGl0aWVzLCBzaW5jZSB3ZSBvbmx5IG5lZWQgaXQgZm9yIGNvbXBhcmlzaW9uXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBleHRyYWN0IGZyb20gY2F0ZWdvcnkgb25seSByZWxhdGlvbiBpZCAoY2F0ZWdvcnkgaWQsIG9yIGxldCdzIHNheSBjYXRlZ29yeSB0aXRsZSwgZGVwZW5kIG9uIGpvaW4gY29sdW1uIG9wdGlvbnMpXG4gICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocmVsYXRlZEVudGl0eSk7XG4gICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBhIHN1YmplY3Qgb2YgdGhpcyByZWxhdGVkIGVudGl0eSwgbWF5YmUgaXQgd2FzIGxvYWRlZCBvciB3YXMgbWFya2VkIGZvciBwZXJzaXN0ZW5jZVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlTdWJqZWN0ID0gX3RoaXMuc3ViamVjdHMuZmluZChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gaWYgc3ViamVjdCB3aXRoIGVudGl0eSB3YXMgZm91bmQgdGFrZSBzdWJqZWN0IGlkZW50aWZpZXIgYXMgcmVsYXRpb24gaWQgbWFwIHNpbmNlIGl0IG1heSBjb250YWluIGV4dHJhIHByb3BlcnRpZXMgcmVzb2x2ZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCA9IHJlbGF0ZWRFbnRpdHlTdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGVkIGVudGl0eSByZWxhdGlvbiBpZCBtYXAgaXMgZW1wdHkgaXQgbWVhbnMgcmVsYXRlZCBlbnRpdHkgaXMgbmV3bHkgcGVyc2lzdGVkXG4gICAgICAgICAgICBpZiAoIXJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZGVjaWRlZCB0byByZW1vdmUgdGhpcyBlcnJvciBiZWNhdXNlIGl0IGJyaW5ncyBjb21wbGljYXRpb25zIHdoZW4gc2F2aW5nIG9iamVjdCB3aXRoIG5vbi1zYXZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBzdWJqZWN0IHRoZW4gaXQgbWVhbnMgdXNlciB0cmllcyB0byBiaW5kIGVudGl0eSB3aGljaCB3YXNuJ3Qgc2F2ZWRcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHBlcnNpc3RlbmNlIGJlY2F1c2UgaGUgZGlkbid0IHBhc3MgdGhpcyBlbnRpdHkgZm9yIHNhdmUgb3IgaGUgZGlkIG5vdCBzZXQgY2FzY2FkZXNcbiAgICAgICAgICAgICAgICAvLyBidXQgd2l0aG91dCBlbnRpdHkgYmVpbmcgaW5zZXJ0ZWQgd2UgY2Fubm90IGJpbmQgaXQgaW4gdGhlIHJlbGF0aW9uIG9wZXJhdGlvbiwgc28gd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmVcbiAgICAgICAgICAgICAgICAvLyB3ZSBkZWNpZGVkIHRvIHJlbW92ZSB0aGlzIGVycm9yIGJlY2F1c2UgaXQgYnJpbmdzIGNvbXBsaWNhdGlvbnMgd2hlbiBzYXZpbmcgb2JqZWN0IHdpdGggbm9uLXNhdmVkIGVudGl0aWVzXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgTWFueS10by1tYW55IHJlbGF0aW9uIFwiJHtyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lfS4ke3JlbGF0aW9uLnByb3BlcnR5UGF0aH1cIiBjb250YWlucyBgICtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdGllcyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyB0aGV5IGNhbm5vdCBiZSBiaW5kIGluIHRoZSBkYXRhYmFzZS4gYCArXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXRpZXMgYmVmb3JlIGJpbmRpbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgcmVsYXRlZCBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIHBvc3QncyBjYXRlZ29yeSBpbiB0aGUgZGF0YWJhc2UgcG9zdCdzIGNhdGVnb3JpZXNcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5RXhpc3RJbkRhdGFiYXNlID0gZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzLmZpbmQoZnVuY3Rpb24gKGRhdGFiYXNlUmVsYXRlZEVudGl0eVJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMuY29tcGFyZUlkcyhkYXRhYmFzZVJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkLCByZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIGVudGl0eSBpcyBmb3VuZCB0aGVuIGRvbid0IGRvIGFueXRoaW5nIC0gaXQgbWVhbnMgYmluZGluZyBpbiBqdW5jdGlvbiB0YWJsZSBhbHJlYWR5IGV4aXN0LCB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlFeGlzdEluRGF0YWJhc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIG93bmVyVmFsdWUgPSByZWxhdGlvbi5pc093bmluZyA/IHN1YmplY3QgOiAocmVsYXRlZEVudGl0eVN1YmplY3QgfHwgcmVsYXRlZEVudGl0eSk7IC8vIGJ5IGV4YW1wbGU6IG93bmVyRW50aXR5TWFwIGlzIHBvc3QgZnJvbSBzdWJqZWN0IGhlcmVcbiAgICAgICAgICAgIHZhciBpbnZlcnNlVmFsdWUgPSByZWxhdGlvbi5pc093bmluZyA/IChyZWxhdGVkRW50aXR5U3ViamVjdCB8fCByZWxhdGVkRW50aXR5KSA6IHN1YmplY3Q7IC8vIGJ5IGV4YW1wbGU6IGludmVyc2VFbnRpdHlNYXAgaXMgY2F0ZWdvcnkgZnJvbSBjYXRlZ29yaWVzIGFycmF5IGhlcmVcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGZvciBpbnNlcnQgb3BlcmF0aW9uIG9mIGp1bmN0aW9uIHJvd3NcbiAgICAgICAgICAgIHZhciBqdW5jdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICBjYW5CZUluc2VydGVkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5zdWJqZWN0cy5wdXNoKGp1bmN0aW9uU3ViamVjdCk7XG4gICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bmVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBqdW5jdGlvblN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvd25lclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZUZhY3Rvcnk6ICh2YWx1ZSkgPT4gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLmdldEVudGl0eVZhbHVlKHZhbHVlKSAvLyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiEuZ2V0RW50aXR5VmFsdWUob3duZXJFbnRpdHlNYXApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmludmVyc2VDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIGp1bmN0aW9uU3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGludmVyc2VWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVGYWN0b3J5OiAodmFsdWUpID0+IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSkgLy8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLmdldEVudGl0eVZhbHVlKGludmVyc2VFbnRpdHlNYXApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZXQgYWxsIGludmVyc2UgZW50aXRpZXMgcmVsYXRpb24gaWRzIHRoYXQgYXJlIFwiYmluZFwiIHRvIHRoZSBjdXJyZW50bHkgcGVyc2lzdGVkIGVudGl0eVxuICAgICAgICB2YXIgY2hhbmdlZEludmVyc2VFbnRpdHlSZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICByZWxhdGVkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgLy8gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhIS5nZXRFbnRpdHlJZE1hcChyZWxhdGVkRW50aXR5KVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHJlbGF0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5U3ViamVjdCA9IF90aGlzLnN1YmplY3RzLmZpbmQoZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViamVjdC5lbnRpdHkgPT09IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGVkRW50aXR5U3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwICE9PSB1bmRlZmluZWQgJiYgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgY2hhbmdlZEludmVyc2VFbnRpdHlSZWxhdGlvbklkcy5wdXNoKHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG5vdyBmcm9tIGFsbCBlbnRpdGllcyBpbiB0aGUgcGVyc2lzdGVkIGVudGl0eSBmaW5kIG9ubHkgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kIGluIHRoZSBkYlxuICAgICAgICB2YXIgcmVtb3ZlZEp1bmN0aW9uRW50aXR5SWRzID0gZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzLmZpbHRlcihmdW5jdGlvbiAoZXhpc3RSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gIWNoYW5nZWRJbnZlcnNlRW50aXR5UmVsYXRpb25JZHMuZmluZChmdW5jdGlvbiAoY2hhbmdlZFJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMuY29tcGFyZUlkcyhjaGFuZ2VkUmVsYXRpb25JZCwgZXhpc3RSZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmluYWxseSBjcmVhdGUgYSBuZXcganVuY3Rpb24gcmVtb3ZlIG9wZXJhdGlvbnMgZm9yIG1pc3NpbmcgcmVsYXRlZCBlbnRpdGllc1xuICAgICAgICByZW1vdmVkSnVuY3Rpb25FbnRpdHlJZHMuZm9yRWFjaChmdW5jdGlvbiAocmVtb3ZlZEVudGl0eVJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgIHZhciBqdW5jdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICBtdXN0QmVSZW1vdmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IF90aGlzLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyKHN1YmplY3QsIHJlbGF0aW9uLCByZW1vdmVkRW50aXR5UmVsYXRpb25JZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMuc3ViamVjdHMucHVzaChqdW5jdGlvblN1YmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaWRlbnRpZmllcnMgZm9yIGp1bmN0aW9uIHRhYmxlLlxuICAgICAqIEV4YW1wbGU6IHsgcG9zdElkOiAxLCBjYXRlZ29yeUlkOiAyIH1cbiAgICAgKi9cbiAgICBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyID0gZnVuY3Rpb24gKHN1YmplY3QsIHJlbGF0aW9uLCByZWxhdGlvbklkKSB7XG4gICAgICAgIHZhciBvd25lckVudGl0eU1hcCA9IHJlbGF0aW9uLmlzT3duaW5nID8gc3ViamVjdC5lbnRpdHkgOiByZWxhdGlvbklkO1xuICAgICAgICB2YXIgaW52ZXJzZUVudGl0eU1hcCA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb25JZCA6IHN1YmplY3QuZW50aXR5O1xuICAgICAgICB2YXIgaWRlbnRpZmllciA9IHt9O1xuICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bmVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlRGVlcChpZGVudGlmaWVyLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUob3duZXJFbnRpdHlNYXApKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmludmVyc2VDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKGlkZW50aWZpZXIsIGNvbHVtbi5jcmVhdGVWYWx1ZU1hcChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShpbnZlcnNlRW50aXR5TWFwKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfTtcbiAgICByZXR1cm4gTWFueVRvTWFueVN1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYW55VG9NYW55U3ViamVjdEJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcIi4uL1N1YmplY3RcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG4vKipcbiAqIEJ1aWxkcyBvcGVyYXRpb25zIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGZvciBvbmUtdG8tbWFueSByZWxhdGlvbnMgb2YgdGhlIGdpdmVuIHN1YmplY3RzLlxuICpcbiAqIGJ5IGV4YW1wbGU6IHBvc3QgY29udGFpbnMgb25lLXRvLW1hbnkgcmVsYXRpb24gd2l0aCBjYXRlZ29yeSBpbiB0aGUgcHJvcGVydHkgY2FsbGVkIFwiY2F0ZWdvcmllc1wiLCBlLmcuXG4gKiAgICAgICAgICAgICBAT25lVG9NYW55KHR5cGUgPT4gQ2F0ZWdvcnksIGNhdGVnb3J5ID0+IGNhdGVnb3J5LnBvc3QpIGNhdGVnb3JpZXM6IENhdGVnb3J5W11cbiAqICAgICAgICAgICAgIElmIHVzZXIgYWRkcyBjYXRlZ29yaWVzIGludG8gdGhlIHBvc3QgYW5kIHNhdmVzIHBvc3Qgd2UgbmVlZCB0byBiaW5kIHRoZW0uXG4gKiAgICAgICAgICAgICBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB1cGRhdGlvbiBvZiBjYXRlZ29yeSB0YWJsZSBzaW5jZSBpdHMgb3duZXIgb2YgdGhlIHJlbGF0aW9uIGFuZCBjb250YWlucyBhIGpvaW4gY29sdW1uLlxuICpcbiAqIG5vdGU6IHRoaXMgY2xhc3Mgc2hhcmVzIGxvdCBvZiB0aGluZ3Mgd2l0aCBPbmVUb09uZUludmVyc2VTaWRlT3BlcmF0aW9uQnVpbGRlciwgc28gd2hlbiB5b3UgY2hhbmdlIHRoaXMgY2xhc3NcbiAqICAgICAgIG1ha2Ugc3VyZSB0byByZWZsZWN0IGNoYW5nZXMgdGhlcmUgYXMgd2VsbC5cbiAqL1xudmFyIE9uZVRvTWFueVN1YmplY3RCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gT25lVG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5zdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhbGwgcmVxdWlyZWQgb3BlcmF0aW9ucy5cbiAgICAgKi9cbiAgICBPbmVUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5vbmVUb01hbnlSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24ucGVyc2lzdGVuY2VFbmFibGVkID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uKHN1YmplY3QsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcmllc1wiIGluc2lkZSBpdCBoZXJlLlxuICAgICAqL1xuICAgIE9uZVRvTWFueVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZEZvclN1YmplY3RSZWxhdGlvbiA9IGZ1bmN0aW9uIChzdWJqZWN0LCByZWxhdGlvbikge1xuICAgICAgICAvLyBwcmVwYXJlIG9iamVjdHMgKHJlbGF0aW9uIGlkIG1hcHMpIGZvciB0aGUgZGF0YWJhc2UgZW50aXR5XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IHNpbmNlIHN1YmplY3QgaXMgYSBwb3N0LCB3ZSBhcmUgZXhwZWN0aW5nIHRvIGdldCBhbGwgcG9zdCdzIGNhdGVnb3JpZXMgc2F2ZWQgaW4gdGhlIGRhdGFiYXNlIGhlcmUsXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcnRpY3VsYXJseSB0aGVpciByZWxhdGlvbiBpZHMsIGUuZy4gY2F0ZWdvcnkgaWRzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaW4gbW9zdCBjYXNlcyByZWxhdGVkRW50aXR5RGF0YWJhc2VWYWx1ZXMgd2lsbCBjb250YWluIG9ubHkgdGhlIGVudGl0eSBrZXkgcHJvcGVydGllcy5cbiAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgY29udGFpbnMgcmVsYXRpb25zIHdpdGggbG9hZGVkIHJlbGF0aW9uIGlkcyBvbmx5LlxuICAgICAgICAvLyBob3dldmVyIGlmIHRoZSBlbnRpdHkgdXNlcyB0aGUgYWZ0ZXJMb2FkIGhvb2sgdG8gY2FsY3VsYXRlIGFueSBwcm9wZXJ0aWVzLCB0aGUgZmV0Y2hlZCBcImtleSBvYmplY3RcIiBtaWdodCBpbmNsdWRlIEFERElUSU9OQUwgcHJvcGVydGllcy5cbiAgICAgICAgLy8gdG8gaGFuZGxlIHN1Y2ggc2l0dWF0aW9ucywgd2UgcGFzcyB0aGUgZGF0YSB0byByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAgdG8gZXh0cmFjdCB0aGUga2V5IHdpdGhvdXQgYW55IG90aGVyIHByb3BlcnRpZXMuXG4gICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkgeyAvLyByZWxhdGVkIGVudGl0aWVzIGluIHRoZSBkYXRhYmFzZSBjYW4gZXhpc3Qgb25seSBpZiB0aGlzIGVudGl0eSAocG9zdCkgaXMgc2F2ZWRcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbiA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZHMgPSByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbi5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGdldCByZWxhdGVkIGVudGl0aWVzIG9mIHBlcnNpc3RlZCBlbnRpdHlcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogZ2V0IGNhdGVnb3JpZXMgZnJvbSB0aGUgcGFzc2VkIHRvIHBlcnNpc3QgcG9zdCBlbnRpdHlcbiAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdGllcyA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdGllcyA9PT0gbnVsbCkgLy8gd2UgdHJlYXQgcmVsYXRpb25zIHNldCB0byBudWxsIGFzIHJlbW92ZWQsIHNvIHdlIGRvbid0IHNraXAgaXRcbiAgICAgICAgICAgIHJlbGF0ZWRFbnRpdGllcyA9IFtdO1xuICAgICAgICBpZiAocmVsYXRlZEVudGl0aWVzID09PSB1bmRlZmluZWQpIC8vIGlmIHJlbGF0aW9uIGlzIHVuZGVmaW5lZCB0aGVuIG5vdGhpbmcgdG8gdXBkYXRlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZHMgZnJvbSB0aGUgcmVsYXRlZCBlbnRpdGllcywgc2luY2Ugd2Ugb25seSBuZWVkIHRoZW0gZm9yIGNvbXBhcmlzb25cbiAgICAgICAgLy8gYnkgZXhhbXBsZTogZXh0cmFjdCBmcm9tIGNhdGVnb3JpZXMgb25seSByZWxhdGlvbiBpZHMgKGNhdGVnb3J5IGlkLCBvciBsZXQncyBzYXkgY2F0ZWdvcnkgdGl0bGUsIGRlcGVuZCBvbiBqb2luIGNvbHVtbiBvcHRpb25zKVxuICAgICAgICB2YXIgcmVsYXRlZFBlcnNpc3RlZEVudGl0eVJlbGF0aW9uSWRzID0gW107XG4gICAgICAgIHJlbGF0ZWRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGVkRW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb25JZE1hcCA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChyZWxhdGVkRW50aXR5KTsgLy8gYnkgZXhhbXBsZTogcmVsYXRpb25JZE1hcCBpcyBjYXRlZ29yeS5pZCBtYXAgaGVyZSwgZS5nLiB7IGlkOiAuLi4gfVxuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5U3ViamVjdCA9IF90aGlzLnN1YmplY3RzLmZpbmQoZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViamVjdC5lbnRpdHkgPT09IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgcmVsYXRpb25JZE1hcCA9IHJlbGF0ZWRFbnRpdHlTdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIGlzIHVuZGVmaW5lZCB0aGVuIGl0IG1lYW5zIHVzZXIgYmluZHMgb2JqZWN0IHdoaWNoIGlzIG5vdCBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgeWV0XG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBpZiBwb3N0IGNvbnRhaW5zIGNhdGVnb3JpZXMgd2hpY2ggZG9lcyBub3QgaGF2ZSBpZHMgeWV0IChiZWNhdXNlIHRoZXkgYXJlIG5ldylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGl0IG1lYW5zIHRoZXkgYXJlIGFsd2F5cyBuZXdseSBpbnNlcnRlZCBhbmQgcmVsYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBhbHdheXMgbXVzdCBiZSBjcmVhdGVkIGZvciB0aGVtXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHBlcmZvcm0gZGlmZmVyZW5jZSBvcGVyYXRpb24gZm9yIHRoZW0gZm9yIGJvdGggYWRkIGFuZCByZW1vdmUgYWN0aW9uc1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbklkTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZGVjaWRlZCB0byByZW1vdmUgdGhpcyBlcnJvciBiZWNhdXNlIGl0IGJyaW5ncyBjb21wbGljYXRpb25zIHdoZW4gc2F2aW5nIG9iamVjdCB3aXRoIG5vbi1zYXZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgIC8vIGlmICghcmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoYE9uZS10by1tYW55IHJlbGF0aW9uIFwiJHtyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lfS4ke3JlbGF0aW9uLnByb3BlcnR5UGF0aH1cIiBjb250YWlucyBgICtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdGllcyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyB0aGV5IGNhbm5vdCBiZSBiaW5kIGluIHRoZSBkYXRhYmFzZS4gYCArXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXRpZXMgYmVmb3JlIGJpbmRpbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIG9rYXksIHNvIHJlbGF0ZWQgc3ViamVjdCBleGlzdCBhbmQgaXRzIG1hcmtlZCBmb3IgaW5zZXJ0aW9uLCB0aGVuIGFkZCBhIG5ldyBjaGFuZ2UgbWFwXG4gICAgICAgICAgICAgICAgLy8gYnkgZXhhbXBsZTogdGhpcyB3aWxsIHRlbGwgY2F0ZWdvcnkgdG8gaW5zZXJ0IGludG8gaXRzIHBvc3QgcmVsYXRpb24gb3VyIHBvc3Qgd2UgYXJlIHdvcmtpbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IGlzIG5ld2x5IGluc2VydGVkIENhdGVnb3J5U3ViamVjdFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiBpcyBNYW55VG9PbmUgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc3ViamVjdCBpcyBQb3N0IG5lZWRzIHRvIGJlIGluc2VydGVkIGludG8gQ2F0ZWdvcnlcbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3ViamVjdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgYmluZGluZyByZWFsbHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIG91ciBjYXRlZ29yeSBpZiBpdHMgYWxyZWFkeSBiaW5kIGluIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uSWRJbkRhdGFiYXNlU3ViamVjdFJlbGF0aW9uID0gcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZHMuZmluZChmdW5jdGlvbiAocmVsYXRlZERhdGFiYXNlRW50aXR5UmVsYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKHJlbGF0aW9uSWRNYXAsIHJlbGF0ZWREYXRhYmFzZUVudGl0eVJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIERPRVMgTk9UIGV4aXN0IGluIHRoZSBzdWJqZWN0J3MgcmVsYXRpb24gaW4gdGhlIGRhdGFiYXNlIGl0IG1lYW5zIGl0cyBhIG5ldyByZWxhdGlvbiBhbmQgd2UgbmVlZCB0byBcImJpbmRcIiB0aGVtXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiB0aGlzIHdpbGwgdGVsbCBjYXRlZ29yeSB0byBpbnNlcnQgaW50byBpdHMgcG9zdCByZWxhdGlvbiBvdXIgcG9zdCB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdCBpcyBuZXdseSBpbnNlcnRlZCBDYXRlZ29yeVN1YmplY3RcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiBpcyBNYW55VG9PbmUgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbklkSW5EYXRhYmFzZVN1YmplY3RSZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IHRoZW4gaXQgbWVhbnMgXCJjYXRlZ29yeVwiIHdhc24ndCBwZXJzaXN0ZWQsXG4gICAgICAgICAgICAgICAgLy8gYnV0IHNpbmNlIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgXCJjYXRlZ29yeVwiIHRhYmxlIChzaW5jZSBpdHMgYW4gb3duaW5nIHNpZGUgb2YgcmVsYXRpb24gd2l0aCBqb2luIGNvbHVtbilcbiAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgYSBuZXcgc3ViamVjdCBoZXJlOlxuICAgICAgICAgICAgICAgIGlmICghcmVsYXRlZEVudGl0eVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IHJlbGF0aW9uSWRNYXBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnB1c2gocmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3ViamVjdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgcmVsYXRlZCBlbnRpdHkgaGFzIHJlbGF0aW9uIGlkIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHJlbGF0aW9uIGlkc1xuICAgICAgICAgICAgLy8gdGhpcyBsaXN0IHdpbGwgYmUgdXNlZCBsYXRlciB0byBjb21wYXJlIHdpdGggZGF0YWJhc2UgcmVsYXRpb24gaWRzIHRvIGZpbmQgYSBkaWZmZXJlbmNlXG4gICAgICAgICAgICAvLyB3aGF0IGV4aXN0IGluIHRoaXMgYXJyYXkgYW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSBhcmUgbmV3bHkgaW5zZXJ0ZWQgcmVsYXRpb25zXG4gICAgICAgICAgICAvLyB3aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYXJyYXksIGJ1dCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgYXJlIHJlbW92ZWQgcmVsYXRpb25zXG4gICAgICAgICAgICAvLyByZW1vdmVkIHJlbGF0aW9ucyBhcmUgc2V0IHRvIG51bGwgZnJvbSBpbnZlcnNlIHNpZGUgb2YgcmVsYXRpb25cbiAgICAgICAgICAgIHJlbGF0ZWRQZXJzaXN0ZWRFbnRpdHlSZWxhdGlvbklkcy5wdXNoKHJlbGF0aW9uSWRNYXApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmluZCB3aGF0IHJlbGF0ZWQgZW50aXRpZXMgd2VyZSBhZGRlZCBhbmQgd2hhdCB3ZXJlIHJlbW92ZWQgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgd2Ugc2F2ZSBhbmQgd2hhdCBkYXRhYmFzZSBoYXNcbiAgICAgICAgRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgIC5kaWZmZXJlbmNlKHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uSWRzLCByZWxhdGVkUGVyc2lzdGVkRW50aXR5UmVsYXRpb25JZHMpXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmVtb3ZlZFJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAvLyB0b2RvOiBwcm9iYWJseSB3ZSBjYW4gaW1wcm92ZSB0aGlzIGluIHRoZSBmdXR1cmUgYnkgZmluZGluZyBlbnRpdHkgd2l0aCBjb2x1bW4gdGhvc2UgdmFsdWVzLFxuICAgICAgICAgICAgLy8gdG9kbzogbWF5YmUgaXQgd2FzIGFscmVhZHkgaW4gcGVyc2lzdGVuY2UgcHJvY2Vzcy4gVGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gdW5pcXVlIHJlcXVpcmVtZW50cyBvZiBqb2luIGNvbHVtbnNcbiAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IHdoaWNoIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiBzdWJqZWN0IG9wZXJhdGlvbiBleGVjdXRvclxuICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWxhdGVkRW50aXR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVtb3ZlZFJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiB8fCByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ub3JwaGFuZWRSb3dBY3Rpb24gPT09IFwibnVsbGlmeVwiKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0LmNhbkJlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0LmNoYW5nZU1hcHMgPSBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLm9ycGhhbmVkUm93QWN0aW9uID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0Lm11c3RCZVJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuc3ViamVjdHMucHVzaChyZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBPbmVUb01hbnlTdWJqZWN0QnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBPbmVUb01hbnlTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVUb01hbnlTdWJqZWN0QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBCdWlsZHMgb3BlcmF0aW9ucyBuZWVkcyB0byBiZSBleGVjdXRlZCBmb3Igb25lLXRvLW9uZSBub24tb3duZXIgcmVsYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0cy5cbiAqXG4gKiBieSBleGFtcGxlOiBwb3N0IGNvbnRhaW5zIG9uZS10by1vbmUgbm9uLW93bmVyIHJlbGF0aW9uIHdpdGggY2F0ZWdvcnkgaW4gdGhlIHByb3BlcnR5IGNhbGxlZCBcImNhdGVnb3J5XCIsIGUuZy5cbiAqICAgICAgICAgICAgIEBPbmVUb09uZSh0eXBlID0+IENhdGVnb3J5LCBjYXRlZ29yeSA9PiBjYXRlZ29yeS5wb3N0KSBjYXRlZ29yeTogQ2F0ZWdvcnlcbiAqICAgICAgICAgICAgIElmIHVzZXIgc2V0cyBhIGNhdGVnb3J5IGludG8gdGhlIHBvc3QgYW5kIHNhdmVzIHBvc3Qgd2UgbmVlZCB0byBiaW5kIHRoZW0uXG4gKiAgICAgICAgICAgICBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB1cGRhdGlvbiBvZiBjYXRlZ29yeSB0YWJsZSBzaW5jZSBpdHMgb3duZXIgb2YgdGhlIHJlbGF0aW9uIGFuZCBjb250YWlucyBhIGpvaW4gY29sdW1uLlxuICpcbiAqIG5vdGU6IHRoaXMgY2xhc3Mgc2hhcmVzIGxvdCBvZiB0aGluZ3Mgd2l0aCBPbmVUb01hbnlVcGRhdGVCdWlsZGVyLCBzbyB3aGVuIHlvdSBjaGFuZ2UgdGhpcyBjbGFzc1xuICogICAgICAgbWFrZSBzdXJlIHRvIHJlZmxlY3QgY2hhbmdlcyB0aGVyZSBhcyB3ZWxsLlxuICovXG52YXIgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyKHN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdHMgPSBzdWJqZWN0cztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYWxsIHJlcXVpcmVkIG9wZXJhdGlvbnMuXG4gICAgICovXG4gICAgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLm9uZVRvT25lUmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCBvd25pbmcgcmVsYXRpb25zLCB0aGlzIG9wZXJhdGlvbiBpcyBvbmx5IGZvciBpbnZlcnNlIHNpZGUgb2Ygb25lLXRvLW9uZSByZWxhdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcgfHwgcmVsYXRpb24ucGVyc2lzdGVuY2VFbmFibGVkID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uKHN1YmplY3QsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcnlcIiBpbnNpZGUgaXQgaGVyZS5cbiAgICAgKi9cbiAgICBPbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uID0gZnVuY3Rpb24gKHN1YmplY3QsIHJlbGF0aW9uKSB7XG4gICAgICAgIC8vIHByZXBhcmUgb2JqZWN0cyAocmVsYXRpb24gaWQgbWFwKSBmb3IgdGhlIGRhdGFiYXNlIGVudGl0eVxuICAgICAgICAvLyBub3RlOiBzdWJqZWN0LmRhdGFiYXNlRW50aXR5IGNvbnRhaW5zIHJlbGF0aW9uIHdpdGggbG9hZGVkIHJlbGF0aW9uIGlkIG9ubHkgKGlkIG1hcClcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogc2luY2Ugc3ViamVjdCBpcyBhIHBvc3QsIHdlIGFyZSBleHBlY3RpbmcgdG8gZ2V0IHBvc3QncyBjYXRlZ29yeSBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgaGVyZSxcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFydGljdWxhcmx5IGl0cyByZWxhdGlvbiBpZCwgZS5nLiBjYXRlZ29yeSBpZCBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkgLy8gcmVsYXRlZCBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlIGNhbiBleGlzdCBvbmx5IGlmIHRoaXMgZW50aXR5IChwb3N0KSBpcyBzYXZlZFxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpO1xuICAgICAgICAvLyBnZXQgcmVsYXRlZCBlbnRpdGllcyBvZiBwZXJzaXN0ZWQgZW50aXR5XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGdldCBjYXRlZ29yeSBmcm9tIHRoZSBwYXNzZWQgdG8gcGVyc2lzdCBwb3N0IGVudGl0eVxuICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTsgLy8gYnkgZXhhbXBsZTogcmVsYXRlZEVudGl0eSBpcyBhIGNhdGVnb3J5IGhlcmVcbiAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHkgPT09IHVuZGVmaW5lZCkgLy8gaWYgcmVsYXRpb24gaXMgdW5kZWZpbmVkIHRoZW4gbm90aGluZyB0byB1cGRhdGVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gaWYgcmVsYXRlZCBlbnRpdHkgaXMgbnVsbCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYSBiaW5kIGluIHRoZSBkYXRhYmFzZSBhbmQgdW5zZXQgaXRcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYmluZCBpbiB0aGUgZW50aXR5IHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICAvLyBieSBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5ID0gbnVsbCBhbmQgY2F0ZWdvcnkgaGFzIHRoaXMgcG9zdCBpbiB0aGUgZGF0YWJhc2UgdGhlbiB3ZSB1bnNldCBpdFxuICAgICAgICBpZiAocmVsYXRlZEVudGl0eSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaXQgbWFrZXMgc2Vuc2UgdG8gdXBkYXRlIGRhdGFiYXNlIG9ubHkgdGhlcmUgaXMgYSBwcmV2aW91c2x5IHNldCB2YWx1ZSBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogcHJvYmFibHkgd2UgY2FuIGltcHJvdmUgdGhpcyBpbiB0aGUgZnV0dXJlIGJ5IGZpbmRpbmcgZW50aXR5IHdpdGggY29sdW1uIHRob3NlIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAvLyB0b2RvOiBtYXliZSBpdCB3YXMgYWxyZWFkeSBpbiBwZXJzaXN0ZW5jZSBwcm9jZXNzLiBUaGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB1bmlxdWUgcmVxdWlyZW1lbnRzIG9mIGpvaW4gY29sdW1uc1xuICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IHdoaWNoIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiBzdWJqZWN0IG9wZXJhdGlvbiBleGVjdXRvclxuICAgICAgICAgICAgICAgIHZhciByZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlTWFwczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdHMucHVzaChyZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIGVsc2UgbWVhbnMgZW50aXR5IGlzIGJpbmQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZCBmcm9tIHRoZSByZWxhdGVkIGVudGl0aWVzLCBzaW5jZSB3ZSBvbmx5IG5lZWQgaXQgZm9yIGNvbXBhcmlzaW9uXG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGV4dHJhY3QgZnJvbSBjYXRlZ29yeSBvbmx5IHJlbGF0aW9uIGlkIChjYXRlZ29yeSBpZCwgb3IgbGV0J3Mgc2F5IGNhdGVnb3J5IHRpdGxlLCBkZXBlbmQgb24gam9pbiBjb2x1bW4gb3B0aW9ucylcbiAgICAgICAgdmFyIHJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocmVsYXRlZEVudGl0eSk7IC8vIGJ5IGV4YW1wbGU6IHJlbGF0aW9uSWRNYXAgaXMgY2F0ZWdvcnkuaWQgbWFwIGhlcmUsIGUuZy4geyBpZDogLi4uIH1cbiAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlTdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5maW5kKGZ1bmN0aW9uIChvcGVyYXRlU3ViamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuICEhb3BlcmF0ZVN1YmplY3QuZW50aXR5ICYmIG9wZXJhdGVTdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgIGlmIChyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgIHJlbGF0aW9uSWRNYXAgPSByZWxhdGVkRW50aXR5U3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIGlzIHVuZGVmaW5lZCB0aGVuIGl0IG1lYW5zIHVzZXIgYmluZHMgb2JqZWN0IHdoaWNoIGlzIG5vdCBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgeWV0XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGlmIHBvc3QgY29udGFpbnMgY2F0ZWdvcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSBpZChzKSB5ZXQgKGJlY2F1c2UgaXRzIGEgbmV3IGNhdGVnb3J5KVxuICAgICAgICAvLyAgICAgICAgICAgICBpdCBtZWFucyBpdHMgYWx3YXlzIG5ld2x5IGluc2VydGVkIGFuZCByZWxhdGlvbiB1cGRhdGUgb3BlcmF0aW9uIGFsd2F5cyBtdXN0IGJlIGNyZWF0ZWQgZm9yIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gcGVyZm9ybSBkaWZmZXJlbmNlIG9wZXJhdGlvbiBmb3IgaXQgZm9yIGJvdGggYWRkIGFuZCByZW1vdmUgYWN0aW9uc1xuICAgICAgICBpZiAoIXJlbGF0aW9uSWRNYXApIHtcbiAgICAgICAgICAgIC8vIHdlIGRlY2lkZWQgdG8gcmVtb3ZlIHRoaXMgZXJyb3IgYmVjYXVzZSBpdCBicmluZ3MgY29tcGxpY2F0aW9ucyB3aGVuIHNhdmluZyBvYmplY3Qgd2l0aCBub24tc2F2ZWQgZW50aXRpZXNcbiAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBzdWJqZWN0IHRoZW4gaXQgbWVhbnMgdXNlciB0cmllcyB0byBiaW5kIGVudGl0eSB3aGljaCB3YXNuJ3Qgc2F2ZWRcbiAgICAgICAgICAgIC8vIGluIHRoaXMgcGVyc2lzdGVuY2UgYmVjYXVzZSBoZSBkaWRuJ3QgcGFzcyB0aGlzIGVudGl0eSBmb3Igc2F2ZSBvciBoZSBkaWQgbm90IHNldCBjYXNjYWRlc1xuICAgICAgICAgICAgLy8gYnV0IHdpdGhvdXQgZW50aXR5IGJlaW5nIGluc2VydGVkIHdlIGNhbm5vdCBiaW5kIGl0IGluIHRoZSByZWxhdGlvbiBvcGVyYXRpb24sIHNvIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlXG4gICAgICAgICAgICAvLyBpZiAoIXJlbGF0ZWRFbnRpdHlTdWJqZWN0KVxuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoYE9uZS10by1vbmUgaW52ZXJzZSByZWxhdGlvbiBcIiR7cmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZX0uJHtyZWxhdGlvbi5wcm9wZXJ0eVBhdGh9XCIgY29udGFpbnMgYCArXG4gICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdHkgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyBjYW5ub3QgYmUgYmluZCBpbiB0aGUgZGF0YWJhc2UuIGAgK1xuICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXR5IGJlZm9yZSBiaW5kaW5nIGl0LmApO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBva2F5LCBzbyByZWxhdGVkIHN1YmplY3QgZXhpc3QgYW5kIGl0cyBtYXJrZWQgZm9yIGluc2VydGlvbiwgdGhlbiBhZGQgYSBuZXcgY2hhbmdlIG1hcFxuICAgICAgICAgICAgLy8gYnkgZXhhbXBsZTogdGhpcyB3aWxsIHRlbGwgY2F0ZWdvcnkgdG8gaW5zZXJ0IGludG8gaXRzIHBvc3QgcmVsYXRpb24gb3VyIHBvc3Qgd2UgYXJlIHdvcmtpbmcgd2l0aFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgaXMgbmV3bHkgaW5zZXJ0ZWQgQ2F0ZWdvcnlTdWJqZWN0XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gaXMgT25lVG9PbmUgb3duZXIgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdWJqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGJpbmRpbmcgcmVhbGx5IGV4aXN0IGluIHRoZSBkYXRhYmFzZVxuICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIG91ciBwb3N0IGlmIGl0cyBhbHJlYWR5IGJpbmQgdG8gY2F0ZWdvcnkgaW4gdGhlIGRhdGFiYXNlIGFuZCBpdHMgbm90IGVxdWFsIHRvIHdoYXQgdXNlciB0cmllcyB0byBzZXRcbiAgICAgICAgdmFyIGFyZVJlbGF0ZWRJZEVxdWFsV2l0aERhdGFiYXNlID0gcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCAmJiBPcm1VdGlscy5jb21wYXJlSWRzKHJlbGF0aW9uSWRNYXAsIHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uSWQpO1xuICAgICAgICAvLyBpZiB0aGV5IGFyZW4ndCBlcXVhbCBpdCBtZWFucyBpdHMgYSBuZXcgcmVsYXRpb24gYW5kIHdlIG5lZWQgdG8gXCJiaW5kXCIgdGhlbVxuICAgICAgICAvLyBieSBleGFtcGxlOiB0aGlzIHdpbGwgdGVsbCBjYXRlZ29yeSB0byBpbnNlcnQgaW50byBpdHMgcG9zdCByZWxhdGlvbiBvdXIgcG9zdCB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IGlzIG5ld2x5IGluc2VydGVkIENhdGVnb3J5U3ViamVjdFxuICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gaXMgTWFueVRvT25lIHJlbGF0aW9uIGluc2lkZSBDYXRlZ29yeVxuICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICBpZiAoIWFyZVJlbGF0ZWRJZEVxdWFsV2l0aERhdGFiYXNlKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyByZWxhdGVkRW50aXR5U3ViamVjdCB0aGVuIGl0IG1lYW5zIFwiY2F0ZWdvcnlcIiB3YXNuJ3QgcGVyc2lzdGVkLFxuICAgICAgICAgICAgLy8gYnV0IHNpbmNlIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgXCJjYXRlZ29yeVwiIHRhYmxlIChzaW5jZSBpdHMgYW4gb3duaW5nIHNpZGUgb2YgcmVsYXRpb24gd2l0aCBqb2luIGNvbHVtbilcbiAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGhlcmU6XG4gICAgICAgICAgICBpZiAoIXJlbGF0ZWRFbnRpdHlTdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVsYXRpb25JZE1hcFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdHMucHVzaChyZWxhdGVkRW50aXR5U3ViamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN1YmplY3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IE9uZVRvT25lSW52ZXJzZVNpZGVTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXksIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBDYW5ub3RBdHRhY2hUcmVlQ2hpbGRyZW5FbnRpdHlFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9DYW5ub3RBdHRhY2hUcmVlQ2hpbGRyZW5FbnRpdHlFcnJvclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uLy4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG4vKipcbiAqIEV4ZWN1dGVzIHN1YmplY3Qgb3BlcmF0aW9ucyBmb3IgY2xvc3VyZSBlbnRpdGllcy5cbiAqL1xudmFyIENsb3N1cmVTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENsb3N1cmVTdWJqZWN0RXhlY3V0b3IocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNsb3N1cmVKdW5jdGlvbkluc2VydE1hcCwgcGFyZW50LCBlc2NhcGVfMSwgdGFibGVOYW1lLCBxdWVyeVBhcmFtc18xLCBhbmNlc3RvckNvbHVtbk5hbWVzLCBkZXNjZW5kYW50Q29sdW1uTmFtZXMsIGNoaWxkRW50aXR5SWRzMSwgd2hlcmVDb25kaXRpb247XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUp1bmN0aW9uSW5zZXJ0TWFwID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmFuY2VzdG9yQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlSnVuY3Rpb25JbnNlcnRNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBzdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuZGVzY2VuZGFudENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUp1bmN0aW9uSW5zZXJ0TWFwW2NvbHVtbi5kYXRhYmFzZU5hbWVdID0gc3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgdmFsdWVzIGludG8gdGhlIGNsb3N1cmUganVuY3Rpb24gdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50byhzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLnRhYmxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhjbG9zdXJlSnVuY3Rpb25JbnNlcnRNYXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHZhbHVlcyBpbnRvIHRoZSBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eSkgLy8gaWYgZW50aXR5IHdhcyBhdHRhY2hlZCB2aWEgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0LnBhcmVudFN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCA/IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0IDogc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV8xID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoYWxpYXMpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUoc3ViamVjdC5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS50YWJsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JDb2x1bW5OYW1lcyA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50Q29sdW1uTmFtZXMgPSBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVudGl0eUlkczEgPSBzdWJqZWN0Lm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMS5wdXNoKGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPyBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgOiBzdWJqZWN0LmVudGl0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJjaGlsZF9lbnRpdHlfXCIgKyBjb2x1bW4uZGF0YWJhc2VOYW1lLCBxdWVyeVBhcmFtc18xLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbiA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuZGVzY2VuZGFudENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yKHN1YmplY3QubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMS5wdXNoKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyTmFtZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZVBhcmFtZXRlcihcInBhcmVudF9lbnRpdHlfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUsIHF1ZXJ5UGFyYW1zXzEubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUgKyBcIiA9IFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIklOU0VSVCBJTlRPIFwiICsgdGFibGVOYW1lICsgXCIgKFwiICsgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYW5jZXN0b3JDb2x1bW5OYW1lcyksIGZhbHNlKSwgX19yZWFkKGRlc2NlbmRhbnRDb2x1bW5OYW1lcyksIGZhbHNlKS5qb2luKFwiLCBcIikgKyBcIikgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJTRUxFQ1QgXCIgKyBhbmNlc3RvckNvbHVtbk5hbWVzLmpvaW4oXCIsIFwiKSArIFwiLCBcIiArIGNoaWxkRW50aXR5SWRzMS5qb2luKFwiLCBcIikgKyBcIiBGUk9NIFwiICsgdGFibGVOYW1lICsgXCIgV0hFUkUgXCIgKyB3aGVyZUNvbmRpdGlvbi5qb2luKFwiIEFORCBcIikpLCBxdWVyeVBhcmFtc18xKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBDbG9zdXJlU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50LCBlbnRpdHksIG9sZFBhcmVudCwgb2xkUGFyZW50SWQsIHBhcmVudElkLCBlc2NhcGUsIGNsb3N1cmVUYWJsZSwgYW5jZXN0b3JDb2x1bW5OYW1lcywgZGVzY2VuZGFudENvbHVtbk5hbWVzLCBjcmVhdGVTdWJRdWVyeSwgcGFyYW1ldGVycywgX2EsIF9iLCBjb2x1bW4sIHF1ZXJ5UGFyYW1zXzIsIHRhYmxlTmFtZSwgc3VwZXJBbGlhc18xLCBzdWJBbGlhc18xLCBzZWxlY3QsIGVudGl0eVdoZXJlQ29uZGl0aW9uLCBwYXJlbnRXaGVyZUNvbmRpdGlvbjtcbiAgICAgICAgICAgIHZhciBlXzEsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50ICYmIHN1YmplY3QucGFyZW50U3ViamVjdCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSBzdWJqZWN0LmRhdGFiYXNlRW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkgJiYgcGFyZW50KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QubWV0YWRhdGEudHJlZUNoaWxkcmVuUmVsYXRpb24uZ2V0RW50aXR5VmFsdWUocGFyZW50KS5maW5kKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc3ViamVjdC5pZGVudGlmaWVyKS5ldmVyeShmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGtleSA9IF9iWzBdLCB2YWx1ZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkW2tleV0gPT09IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgaWYgdGhlIHBhcmVudCBvciB0aGUgZW50aXR5IHdoZXJlIG5ldmVyIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChvbGRQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IGlmIHRoZSBuZXcgYW5kIG9sZCBwYXJlbnRzIGFyZSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmNvbXBhcmVJZHMob2xkUGFyZW50SWQsIHBhcmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVUYWJsZSA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvckNvbHVtbk5hbWVzID0gY2xvc3VyZVRhYmxlLmFuY2VzdG9yQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRDb2x1bW5OYW1lcyA9IGNsb3N1cmVUYWJsZS5kZXNjZW5kYW50Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN1YlF1ZXJ5ID0gZnVuY3Rpb24gKHFiLCBhbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJBbGlhcyA9IFwic3ViXCIgKyBhbGlhcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViU2VsZWN0ID0gcWIuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChkZXNjZW5kYW50Q29sdW1uTmFtZXMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShjbG9zdXJlVGFibGUudGFibGVQYXRoLCBzdWJBbGlhcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHdoZXJlIGNvbmRpdGlvbnMgZS5nLiAoV0hFUkUgXCJzdWJkZXNjZW5kYW50XCIuXCJpZF9hbmNlc3RvclwiID0gOnZhbHVlX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKGNsb3N1cmVUYWJsZS5hbmNlc3RvckNvbHVtbnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3QuYW5kV2hlcmUoZXNjYXBlKHN1YkFsaWFzKSArIFwiLlwiICsgZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSA6dmFsdWVfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWIuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChkZXNjZW5kYW50Q29sdW1uTmFtZXMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShcIihcIiArIHN1YlNlbGVjdC5nZXRRdWVyeSgpICsgXCIpXCIsIGFsaWFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhzdWJTZWxlY3QuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyhzdWJqZWN0Lm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcInZhbHVlX1wiICsgY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBlbnRpdHlbY29sdW1uLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKGNsb3N1cmVUYWJsZS50YWJsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShmdW5jdGlvbiAocWIpIHsgcmV0dXJuIFwiKFwiICsgZGVzY2VuZGFudENvbHVtbk5hbWVzLmpvaW4oXCIsIFwiKSArIFwiKSBJTiAoXCIgKyBjcmVhdGVTdWJRdWVyeShxYiwgXCJkZXNjZW5kYW50XCIpICsgXCIpXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbmRXaGVyZShmdW5jdGlvbiAocWIpIHsgcmV0dXJuIFwiKFwiICsgYW5jZXN0b3JDb2x1bW5OYW1lcy5qb2luKFwiLCBcIikgKyBcIikgTk9UIElOIChcIiArIGNyZWF0ZVN1YlF1ZXJ5KHFiLCBcImFuY2VzdG9yXCIpICsgXCIpXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc18yID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShjbG9zdXJlVGFibGUudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQWxpYXNfMSA9IGVzY2FwZShcInN1cGVydHJlZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YkFsaWFzXzEgPSBlc2NhcGUoXCJzdWJ0cmVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYW5jZXN0b3JDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIHN1cGVyQWxpYXNfMSArIFwiLlwiICsgY29sdW1uTmFtZTsgfSkpLCBmYWxzZSksIF9fcmVhZChkZXNjZW5kYW50Q29sdW1uTmFtZXMubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBzdWJBbGlhc18xICsgXCIuXCIgKyBjb2x1bW5OYW1lOyB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVdoZXJlQ29uZGl0aW9uID0gc3ViamVjdC5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS5hbmNlc3RvckNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5SWQgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zXzIucHVzaChlbnRpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJlbnRpdHlfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUsIHF1ZXJ5UGFyYW1zXzIubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YkFsaWFzXzEgKyBcIi5cIiArIGNvbHVtbk5hbWUgKyBcIiA9IFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50V2hlcmVDb25kaXRpb24gPSBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3Ioc3ViamVjdC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc18yLnB1c2gocGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuY3JlYXRlUGFyYW1ldGVyKFwicGFyZW50X2VudGl0eV9cIiArIGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSwgcXVlcnlQYXJhbXNfMi5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXJBbGlhc18xICsgXCIuXCIgKyBjb2x1bW5OYW1lICsgXCIgPSBcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucXVlcnkoXCJJTlNFUlQgSU5UTyBcIiArIHRhYmxlTmFtZSArIFwiIChcIiArIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFuY2VzdG9yQ29sdW1uTmFtZXMpLCBmYWxzZSksIF9fcmVhZChkZXNjZW5kYW50Q29sdW1uTmFtZXMpLCBmYWxzZSkuam9pbihcIiwgXCIpICsgXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiU0VMRUNUIFwiICsgc2VsZWN0LmpvaW4oXCIsIFwiKSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBBUyBcIiArIHN1cGVyQWxpYXNfMSArIFwiLCBcIiArIHRhYmxlTmFtZSArIFwiIEFTIFwiICsgc3ViQWxpYXNfMSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFwiICsgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZW50aXR5V2hlcmVDb25kaXRpb24pLCBmYWxzZSksIF9fcmVhZChwYXJlbnRXaGVyZUNvbmRpdGlvbiksIGZhbHNlKS5qb2luKFwiIEFORCBcIikpLCBxdWVyeVBhcmFtc18yKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBFeGVjdXRlcyBvcGVyYXRpb25zIHdoZW4gc3ViamVjdCBpcyBiZWluZyByZW1vdmVkLlxuICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIGlkZW50aWZpZXJzLCBjbG9zdXJlVGFibGUsIGdlbmVyYXRlV2hlcmVzLCBhbmNlc3RvcldoZXJlLCBkZXNjZW5kYW50V2hlcmU7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtc3NxbCBuZWVkIHRvIGV4ZWN1dGUgZGVsZXRlcyBmb3IgdGhlIGp1bnRpb24gdGFibGUgYXMgaXQgZG9lc24ndCBzdXBwb3J0IG11bHRpIGNhc2NhZGUgcGF0aHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJqZWN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBbc3ViamVjdHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoYWxpYXMpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMgPSBzdWJqZWN0cy5tYXAoZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QuaWRlbnRpZmllcjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlVGFibGUgPSBzdWJqZWN0c1swXS5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlV2hlcmVzID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGlkZW50aWZpZXJzLm1hcChmdW5jdGlvbiAoaWRlbnRpZmllcikgeyByZXR1cm4gaWRlbnRpZmllcltjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWVdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiIElOIChcIiArIGRhdGEuam9pbihcIiwgXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yV2hlcmUgPSBnZW5lcmF0ZVdoZXJlcyhjbG9zdXJlVGFibGUuYW5jZXN0b3JDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRXaGVyZSA9IGdlbmVyYXRlV2hlcmVzKGNsb3N1cmVUYWJsZS5kZXNjZW5kYW50Q29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oY2xvc3VyZVRhYmxlLnRhYmxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGFuY2VzdG9yV2hlcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcldoZXJlKGRlc2NlbmRhbnRXaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVzY2FwZWQgdGFibGUgbmFtZSB3aXRoIHNjaGVtYSBuYW1lIGlmIFNxbFNlcnZlciBvciBQb3N0Z3JlcyBkcml2ZXIgdXNlZCB3aXRoIGN1c3RvbVxuICAgICAqIHNjaGVtYSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyBlc2NhcGVkIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZ2V0VGFibGVOYW1lID0gZnVuY3Rpb24gKHRhYmxlUGF0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGFibGVQYXRoLnNwbGl0KFwiLlwiKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgLy8gdGhpcyBjb25kaXRpb24gbmVlZCBiZWNhdXNlIGluIFNRTCBTZXJ2ZXIgZHJpdmVyIHdoZW4gY3VzdG9tIGRhdGFiYXNlIG5hbWUgd2FzIHNwZWNpZmllZCBhbmQgc2NoZW1hIG5hbWUgd2FzIG5vdCwgd2UgZ290IGBkYk5hbWUuLnRhYmxlTmFtZWAgc3RyaW5nLCBhbmQgZG9lc24ndCBuZWVkIHRvIGVzY2FwZSBtaWRkbGUgZW1wdHkgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gaSA9PT0gXCJcIiA/IGkgOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoaSk7XG4gICAgICAgIH0pLmpvaW4oXCIuXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIENsb3N1cmVTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgQ2xvc3VyZVN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbG9zdXJlU3ViamVjdEV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG4vKipcbiAqIEV4ZWN1dGVzIHN1YmplY3Qgb3BlcmF0aW9ucyBmb3IgbWF0ZXJpYWxpemVkLXBhdGggdHJlZSBlbnRpdGllcy5cbiAqL1xudmFyIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudCwgcGFyZW50SWQsIHBhcmVudFBhdGgsIGluc2VydGVkRW50aXR5SWQ7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eSkgLy8gaWYgZW50aXR5IHdhcyBhdHRhY2hlZCB2aWEgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0LnBhcmVudFN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCA/IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0IDogc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0RW50aXR5UGF0aChzdWJqZWN0LCBwYXJlbnRJZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZEVudGl0eUlkID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIl9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoKF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hW3N1YmplY3QubWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbi5wcm9wZXJ0eVBhdGhdID0gcGFyZW50UGF0aCArIGluc2VydGVkRW50aXR5SWQgKyBcIi5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIG9wZXJhdGlvbnMgd2hlbiBzdWJqZWN0IGlzIGJlaW5nIHVwZGF0ZWQuXG4gICAgICovXG4gICAgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5ld1BhcmVudCwgZW50aXR5LCBvbGRQYXJlbnQsIG9sZFBhcmVudElkLCBuZXdQYXJlbnRJZCwgbmV3UGFyZW50UGF0aCwgb2xkUGFyZW50UGF0aCwgZW50aXR5UGF0aCwgcHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQYXJlbnQgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0ICYmIHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHkpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50ID0gc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QuZGF0YWJhc2VFbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eSAmJiBuZXdQYXJlbnQpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShuZXdQYXJlbnQpLmZpbmQoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmlkZW50aWZpZXIpLmV2ZXJ5KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRba2V5XSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChvbGRQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKG5ld1BhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IGlmIHRoZSBuZXcgYW5kIG9sZCBwYXJlbnRzIGFyZSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmNvbXBhcmVJZHMob2xkUGFyZW50SWQsIG5ld1BhcmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFBhdGggPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQYXJlbnRJZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEVudGl0eVBhdGgoc3ViamVjdCwgbmV3UGFyZW50SWQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50UGF0aCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50UGF0aCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9sZFBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0RW50aXR5UGF0aChzdWJqZWN0LCBvbGRQYXJlbnRJZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnRQYXRoID0gKF9iLnNlbnQoKSkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5UGF0aCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCJfXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoID0gc3ViamVjdC5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgoX2EgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FbcHJvcGVydHlQYXRoXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiUkVQTEFDRShcIiArIHByb3BlcnR5UGF0aCArIFwiLCAnXCIgKyBvbGRQYXJlbnRQYXRoICsgZW50aXR5UGF0aCArIFwiLicsICdcIiArIG5ld1BhcmVudFBhdGggKyBlbnRpdHlQYXRoICsgXCIuJylcIjsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUocHJvcGVydHlQYXRoICsgXCIgTElLRSA6cGF0aFwiLCB7IHBhdGg6IFwiXCIgKyBvbGRQYXJlbnRQYXRoICsgZW50aXR5UGF0aCArIFwiLiVcIiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldEVudGl0eVBhdGggPSBmdW5jdGlvbiAoc3ViamVjdCwgaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAuc2VsZWN0KHN1YmplY3QubWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiLlwiICsgc3ViamVjdC5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCwgXCJwYXRoXCIpXG4gICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldCwgc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgLndoZXJlSW5JZHMoaWQpXG4gICAgICAgICAgICAuZ2V0UmF3T25lKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdFtcInBhdGhcIl0gOiB1bmRlZmluZWQ7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgTmVzdGVkU2V0TXVsdGlwbGVSb290RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvTmVzdGVkU2V0TXVsdGlwbGVSb290RXJyb3JcIjtcbnZhciBOZXN0ZWRTZXRJZHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVzdGVkU2V0SWRzKCkge1xuICAgIH1cbiAgICByZXR1cm4gTmVzdGVkU2V0SWRzO1xufSgpKTtcbi8qKlxuICogRXhlY3V0ZXMgc3ViamVjdCBvcGVyYXRpb25zIGZvciBuZXN0ZWQgc2V0IHRyZWUgZW50aXRpZXMuXG4gKi9cbnZhciBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcihxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBvcGVyYXRpb25zIHdoZW4gc3ViamVjdCBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIHRhYmxlTmFtZSwgbGVmdENvbHVtbk5hbWUsIHJpZ2h0Q29sdW1uTmFtZSwgcGFyZW50LCBwYXJlbnRJZCwgcGFyZW50TnNSaWdodCwgaXNVbmlxdWVSb290O1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHN1YmplY3QubWV0YWRhdGEudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5OYW1lID0gZXNjYXBlKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRDb2x1bW5OYW1lID0gZXNjYXBlKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50ICYmIHN1YmplY3QucGFyZW50U3ViamVjdCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0ID8gc3ViamVjdC5wYXJlbnRTdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgOiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROc1JpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3Qoc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLnByb3BlcnR5UGF0aCwgXCJyaWdodFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldCwgc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhwYXJlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJhd09uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0ID8gcmVzdWx0W1wicmlnaHRcIl0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvY2tyb2FjaERCIHJldHVybnMgbnVtZXJpYyB0eXBlcyBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TnNSaWdodCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocGFyZW50TnNSaWdodCAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgU0VUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlZnRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFdIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiID4gXCIgKyBwYXJlbnROc1JpZ2h0ICsgXCIgVEhFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgKyAyIEVMU0UgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIEVORCxcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiICsgMiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiID49IFwiICsgcGFyZW50TnNSaWdodCkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCwgc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKHBhcmVudE5zUmlnaHQpLCBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKHBhcmVudE5zUmlnaHQgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmlzVW5pcXVlUm9vdEVudGl0eShzdWJqZWN0LCBwYXJlbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWVSb290ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgYSByb290IGVudGl0eSBhbHJlYWR5IGV4aXRzIGFuZCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbmlxdWVSb290KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCwgc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKDEpLCBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQsIGVudGl0eSwgb2xkUGFyZW50LCBvbGRQYXJlbnRJZCwgcGFyZW50SWQsIGVzY2FwZV8xLCB0YWJsZU5hbWUsIGxlZnRDb2x1bW5OYW1lLCByaWdodENvbHVtbk5hbWUsIGVudGl0eUlkLCBlbnRpdHlOcywgcGFyZW50TnMsIGlzTW92aW5nVXAsIHRyZWVTaXplLCBlbnRpdHlTaXplLCB1cGRhdGVMZWZ0U2lkZSwgdXBkYXRlUmlnaHRTaWRlLCBpc1VuaXF1ZVJvb3Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0ICYmIHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHkpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QuZGF0YWJhc2VFbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eSAmJiBwYXJlbnQpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShwYXJlbnQpLmZpbmQoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmlkZW50aWZpZXIpLmV2ZXJ5KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRba2V5XSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhpdCBpZiB0aGUgcGFyZW50IG9yIHRoZSBlbnRpdHkgd2hlcmUgbmV2ZXIgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKG9sZFBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IHN1YmplY3QubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgaWYgdGhlIG5ldyBhbmQgb2xkIHBhcmVudHMgYXJlIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JtVXRpbHMuY29tcGFyZUlkcyhvbGRQYXJlbnRJZCwgcGFyZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlXzEgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShzdWJqZWN0Lm1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uTmFtZSA9IGVzY2FwZV8xKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRDb2x1bW5OYW1lID0gZXNjYXBlXzEoc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlOcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXROZXN0ZWRTZXRJZHMoc3ViamVjdC5tZXRhZGF0YSwgZW50aXR5SWQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5TnMgPSAoX2Euc2VudCgpKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0TmVzdGVkU2V0SWRzKHN1YmplY3QubWV0YWRhdGEsIHBhcmVudElkKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5zID0gKF9hLnNlbnQoKSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGVudGl0eU5zICE9PSB1bmRlZmluZWQgJiYgcGFyZW50TnMgIT09IHVuZGVmaW5lZCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3ZpbmdVcCA9IHBhcmVudE5zLmxlZnQgPiBlbnRpdHlOcy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVNpemUgPSBlbnRpdHlOcy5yaWdodCAtIGVudGl0eU5zLmxlZnQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U2l6ZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vdmluZ1VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U2l6ZSA9IHBhcmVudE5zLmxlZnQgLSBlbnRpdHlOcy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVNpemUgPSBwYXJlbnROcy5yaWdodCAtIGVudGl0eU5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMZWZ0U2lkZSA9IFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPj0gXCIgKyBlbnRpdHlOcy5sZWZ0ICsgXCIgQU5EIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVmdENvbHVtbk5hbWUgKyBcIiA8IFwiICsgZW50aXR5TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiICsgXCIgKyBlbnRpdHlTaXplICsgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmlnaHRTaWRlID0gXCJXSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLmxlZnQgKyBcIiBBTkQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodENvbHVtbk5hbWUgKyBcIiA8PSBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJUSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgKyBcIiArIGVudGl0eVNpemUgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTW92aW5nVXApIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIlVQREFURSBcIiArIHRhYmxlTmFtZSArIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiU0VUIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiA9IENBU0UgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZWZ0Q29sdW1uTmFtZSArIFwiIDw9IFwiICsgcGFyZW50TnMubGVmdCArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIC0gXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxlZnRTaWRlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiRUxTRSBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkQsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0Q29sdW1uTmFtZSArIFwiID0gQ0FTRSBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodENvbHVtbk5hbWUgKyBcIiA8IFwiICsgcGFyZW50TnMubGVmdCArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiAtIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSaWdodFNpZGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJFTFNFIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlNFVCBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPCBcIiArIGVudGl0eU5zLmxlZnQgKyBcIiBBTkQgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVmdENvbHVtbk5hbWUgKyBcIiA+IFwiICsgcGFyZW50TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiICsgXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGVmdFNpZGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkVMU0UgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkQsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIDwgXCIgKyBlbnRpdHlOcy5sZWZ0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0Q29sdW1uTmFtZSArIFwiID49IFwiICsgcGFyZW50TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiArIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJpZ2h0U2lkZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiRUxTRSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaXNVbmlxdWVSb290RW50aXR5KHN1YmplY3QsIHBhcmVudCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWVSb290ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgYSByb290IGVudGl0eSBhbHJlYWR5IGV4aXRzIGFuZCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbmlxdWVSb290KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgcmVtb3ZlZC5cbiAgICAqL1xuICAgIE5lc3RlZFNldFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgZXNjYXBlLCB0YWJsZU5hbWUsIGxlZnRDb2x1bW5OYW1lLCByaWdodENvbHVtbk5hbWUsIGVudGl0aWVzSWRzLCBzdWJqZWN0c18xLCBzdWJqZWN0c18xXzEsIHN1YmplY3QsIGVudGl0eUlkLCBlbnRpdGllc05zLCBlbnRpdGllc05zXzEsIGVudGl0aWVzTnNfMV8xLCBlbnRpdHksIHRyZWVTaXplLCBlXzFfMTtcbiAgICAgICAgICAgIHZhciBlXzIsIF9hLCBlXzEsIF9iO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJqZWN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBbc3ViamVjdHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBzdWJqZWN0c1swXS5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKG1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uTmFtZSA9IGVzY2FwZShtZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodENvbHVtbk5hbWUgPSBlc2NhcGUobWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzSWRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc3ViamVjdHNfMSA9IF9fdmFsdWVzKHN1YmplY3RzKSwgc3ViamVjdHNfMV8xID0gc3ViamVjdHNfMS5uZXh0KCk7ICFzdWJqZWN0c18xXzEuZG9uZTsgc3ViamVjdHNfMV8xID0gc3ViamVjdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IHN1YmplY3RzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSBtZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNJZHMucHVzaChlbnRpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3RzXzFfMSAmJiAhc3ViamVjdHNfMV8xLmRvbmUgJiYgKF9hID0gc3ViamVjdHNfMS5yZXR1cm4pKSBfYS5jYWxsKHN1YmplY3RzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldE5lc3RlZFNldElkcyhtZXRhZGF0YSwgZW50aXRpZXNJZHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNOcyA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsyLCA3LCA4LCA5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllc05zXzEgPSBfX3ZhbHVlcyhlbnRpdGllc05zKSwgZW50aXRpZXNOc18xXzEgPSBlbnRpdGllc05zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnRpdGllc05zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IGVudGl0aWVzTnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVNpemUgPSBlbnRpdHkucmlnaHQgLSBlbnRpdHkubGVmdCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJTRVQgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiID0gQ0FTRSBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVOIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiA+IFwiICsgZW50aXR5LmxlZnQgKyBcIiBUSEVOIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiAtIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJFTFNFIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVORCwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiA+IFwiICsgZW50aXR5LnJpZ2h0ICsgXCIgVEhFTiBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIC0gXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkVMU0UgXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVORFwiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNOc18xXzEgPSBlbnRpdGllc05zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMV8xID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc05zXzFfMSAmJiAhZW50aXRpZXNOc18xXzEuZG9uZSAmJiAoX2IgPSBlbnRpdGllc05zXzEucmV0dXJuKSkgX2IuY2FsbChlbnRpdGllc05zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXN0ZWQgc2V0IGlkcyBmb3IgYSBnaXZlbiBlbnRpdHlcbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldE5lc3RlZFNldElkcyA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgaWRzKSB7XG4gICAgICAgIHZhciBzZWxlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBtZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIHJpZ2h0OiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBtZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5wcm9wZXJ0eVBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHF1ZXJ5QnVpbGRlciA9IHRoaXMucXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc2VsZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXIuYWRkU2VsZWN0KHZhbHVlLCBrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgLmZyb20obWV0YWRhdGEudGFyZ2V0LCBtZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgLndoZXJlSW5JZHMoaWRzKVxuICAgICAgICAgICAgLm9yZGVyQnkoc2VsZWN0LnJpZ2h0LCBcIkRFU0NcIilcbiAgICAgICAgICAgIC5nZXRSYXdNYW55KClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYSwgZV80LCBfYjtcbiAgICAgICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHJlc3VsdHNfMSA9IF9fdmFsdWVzKHJlc3VsdHMpLCByZXN1bHRzXzFfMSA9IHJlc3VsdHNfMS5uZXh0KCk7ICFyZXN1bHRzXzFfMS5kb25lOyByZXN1bHRzXzFfMSA9IHJlc3VsdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9jID0gKGVfNCA9IHZvaWQgMCwgX192YWx1ZXMoT2JqZWN0LmtleXMoc2VsZWN0KSkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdCA/IHJlc3VsdFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvY2tyb2FjaERCIHJldHVybnMgbnVtZXJpYyB0eXBlcyBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVtrZXldID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gcGFyc2VJbnQodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfNF8xKSB7IGVfNCA9IHsgZXJyb3I6IGVfNF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0c18xXzEgJiYgIXJlc3VsdHNfMV8xLmRvbmUgJiYgKF9hID0gcmVzdWx0c18xLnJldHVybikpIF9hLmNhbGwocmVzdWx0c18xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5pc1VuaXF1ZVJvb3RFbnRpdHkgPSBmdW5jdGlvbiAoc3ViamVjdCwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIHRhYmxlTmFtZSwgcGFyYW1ldGVycywgd2hlcmVDb25kaXRpb24sIGNvdW50QWxpYXMsIHJlc3VsdDtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShzdWJqZWN0Lm1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbiA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlciA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uTmFtZSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJlbnRpdHlfXCIgKyBjb2x1bW4uZGF0YWJhc2VOYW1lLCBwYXJhbWV0ZXJzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5OYW1lICsgXCIgPSBcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFsaWFzID0gXCJjb3VudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIlNFTEVDVCBDT1VOVCgxKSBBUyBcIiArIGVzY2FwZShjb3VudEFsaWFzKSArIFwiIEZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBXSEVSRSBcIiArIHdoZXJlQ29uZGl0aW9uLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwYXJzZUludChyZXN1bHQucmVjb3Jkc1swXVtjb3VudEFsaWFzXSkgPT09IDBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZXNjYXBlZCB0YWJsZSBuYW1lIHdpdGggc2NoZW1hIG5hbWUgaWYgU3FsU2VydmVyIG9yIFBvc3RncmVzIGRyaXZlciB1c2VkIHdpdGggY3VzdG9tXG4gICAgICogc2NoZW1hIG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIGVzY2FwZWQgdGFibGUgbmFtZS5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldFRhYmxlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZVBhdGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRhYmxlUGF0aC5zcGxpdChcIi5cIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgY29uZGl0aW9uIG5lZWQgYmVjYXVzZSBpbiBTUUwgU2VydmVyIGRyaXZlciB3aGVuIGN1c3RvbSBkYXRhYmFzZSBuYW1lIHdhcyBzcGVjaWZpZWQgYW5kIHNjaGVtYSBuYW1lIHdhcyBub3QsIHdlIGdvdCBgZGJOYW1lLi50YWJsZU5hbWVgIHN0cmluZywgYW5kIGRvZXNuJ3QgbmVlZCB0byBlc2NhcGUgbWlkZGxlIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgcmV0dXJuIGkgPT09IFwiXCIgPyBpIDogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGkpO1xuICAgICAgICB9KS5qb2luKFwiLlwiKTtcbiAgICB9O1xuICAgIHJldHVybiBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZFNldFN1YmplY3RFeGVjdXRvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogRHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqXG4gKiBJZiB3ZSBkb24ndCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucyB0eXBlb3JtIHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gcnVudGltZVxuICogYXMgd2VsbCBhcyBkdXJpbmcgd2VicGFjayBidWlsZHMuXG4gKi9cbnZhciBDb25uZWN0aW9uT3B0aW9uc0VudlJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uT3B0aW9uc0VudlJlYWRlcigpIHtcbiAgICB9XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNFbnZSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBjb25uZWN0aW9uIG9wdGlvbnMgaW4gYSBicm93c2VyIGNvbnRleHQuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIENvbm5lY3Rpb25PcHRpb25zRW52UmVhZGVyO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb25PcHRpb25zRW52UmVhZGVyIH07XG4vKipcbiAqIER1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHMuXG4gKlxuICogSWYgd2UgZG9uJ3QgaW5jbHVkZSB0aGVzZSBmdW5jdGlvbnMgdHlwZW9ybSB3aWxsIHRocm93IGFuIGVycm9yIG9uIHJ1bnRpbWVcbiAqIGFzIHdlbGwgYXMgZHVyaW5nIHdlYnBhY2sgYnVpbGRzLlxuICovXG52YXIgQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIoKSB7XG4gICAgfVxuICAgIENvbm5lY3Rpb25PcHRpb25zWG1sUmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIGNvbm5lY3Rpb24gb3B0aW9ucyBpbiBhIGJyb3dzZXIgY29udGV4dC5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIgfTtcbi8qKlxuICogRHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqXG4gKiBJZiB3ZSBkb24ndCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucyB0eXBlb3JtIHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gcnVudGltZVxuICogYXMgd2VsbCBhcyBkdXJpbmcgd2VicGFjayBidWlsZHMuXG4gKi9cbnZhciBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlcigpIHtcbiAgICB9XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNZbWxSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgY29ubmVjdGlvbiBvcHRpb25zIGluIGEgYnJvd3NlciBjb250ZXh0LlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlciB9O1xuLyoqXG4gKiBEdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzLlxuICpcbiAqIElmIHdlIGRvbid0IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lXG4gKiBhcyB3ZWxsIGFzIGR1cmluZyB3ZWJwYWNrIGJ1aWxkcy5cbiAqL1xudmFyIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyKCkge1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9uc1JlYWRlci5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgY29ubmVjdGlvbiBvcHRpb25zIGluIGEgYnJvd3NlciBjb250ZXh0LlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBjb25uZWN0aW9uIG9wdGlvbnMgaW4gYSBicm93c2VyIGNvbnRleHQuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIGNvbm5lY3Rpb24gb3B0aW9ucyBpbiBhIGJyb3dzZXIgY29udGV4dC5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rpb25PcHRpb25zUmVhZGVyRHVtbXkuanMubWFwXG4iLCIvKipcbiAqIER1bW15IGZ1bmN0aW9ucyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzLlxuICpcbiAqIElmIHdlIGRvbid0IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lXG4gKiBhcyB3ZWxsIGFzIGR1cmluZyB3ZWJwYWNrIGJ1aWxkcy5cbiAqL1xuLyoqXG4gKiBMb2FkcyBhbGwgZXhwb3J0ZWQgY2xhc3NlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRDbGFzc2VzRnJvbURpcmVjdG9yaWVzKGxvZ2dlciwgZGlyZWN0b3JpZXMsIGZvcm1hdHMpIHtcbiAgICBpZiAoZm9ybWF0cyA9PT0gdm9pZCAwKSB7IGZvcm1hdHMgPSBbXCIuanNcIiwgXCIuY2pzXCIsIFwiLnRzXCJdOyB9XG4gICAgcmV0dXJuIFtdO1xufVxuLyoqXG4gKiBMb2FkcyBhbGwganNvbiBmaWxlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRKc29uc0Zyb21EaXJlY3RvcmllcyhkaXJlY3RvcmllcywgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7IGZvcm1hdCA9IFwiLmpzb25cIjsgfVxuICAgIHJldHVybiBbXTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckRpcmVjdG9yeUV4cG9ydGVkQ2xhc3Nlc0xvYWRlci5qcy5tYXBcbiIsIi8qKlxuICogRHVtbXkgZHJpdmVyIGNsYXNzZXMgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqIFVzaW5nIHRob3NlIGNsYXNzZXMgcmVkdWNlcyB0aGUgYnVpbGQgc2l6ZSBieSBvbmUgdGhpcmQuXG4gKlxuICogSWYgd2UgZG9uJ3QgaW5jbHVkZSB0aG9zZSBkdW1teSBjbGFzc2VzIChhbmQganVzdCBkaXNhYmxlIHRoZSBkcml2ZXIgaW1wb3J0XG4gKiB3aXRoIGBmYWxzZWAgaW4gYHBhY2thZ2UuanNvbmApIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lIGFuZFxuICogZHVyaW5nIHdlYnBhY2sgYnVpbGRzIGV2ZW4gaWYgdGhvc2UgZHJpdmVyIGFyZSBub3QgdXNlZC5cbiAqL1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE1vbmdvRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vbmdvRHJpdmVyKCkge1xuICAgIH1cbiAgICByZXR1cm4gTW9uZ29Ecml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgTW9uZ29Ecml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBNb25nb1F1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vbmdvUXVlcnlSdW5uZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBNb25nb1F1ZXJ5UnVubmVyO1xufSgpKTtcbmV4cG9ydCB7IE1vbmdvUXVlcnlSdW5uZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBNb25nb0VudGl0eU1hbmFnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9uZ29FbnRpdHlNYW5hZ2VyKCkge1xuICAgIH1cbiAgICByZXR1cm4gTW9uZ29FbnRpdHlNYW5hZ2VyO1xufSgpKTtcbmV4cG9ydCB7IE1vbmdvRW50aXR5TWFuYWdlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE1vbmdvUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb25nb1JlcG9zaXRvcnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBNb25nb1JlcG9zaXRvcnk7XG59KCkpO1xuZXhwb3J0IHsgTW9uZ29SZXBvc2l0b3J5IH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgUG9zdGdyZXNEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUG9zdGdyZXNEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBQb3N0Z3Jlc0RyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBQb3N0Z3Jlc0RyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIEF1cm9yYURhdGFBcGlEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXVyb3JhRGF0YUFwaURyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIENvY2tyb2FjaERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2Nrcm9hY2hEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBDb2Nrcm9hY2hEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBTcWxTZXJ2ZXJEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3FsU2VydmVyRHJpdmVyKCkge1xuICAgIH1cbiAgICByZXR1cm4gU3FsU2VydmVyRHJpdmVyO1xufSgpKTtcbmV4cG9ydCB7IFNxbFNlcnZlckRyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIFNhcERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTYXBEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBTYXBEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgU2FwRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgTXlzcWxEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTXlzcWxEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBNeXNxbERyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBNeXNxbERyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE9yYWNsZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPcmFjbGVEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBPcmFjbGVEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgT3JhY2xlRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgU3FsaXRlRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNxbGl0ZURyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIFNxbGl0ZURyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBTcWxpdGVEcml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBCZXR0ZXJTcWxpdGUzRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJldHRlclNxbGl0ZTNEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBCZXR0ZXJTcWxpdGUzRHJpdmVyO1xufSgpKTtcbmV4cG9ydCB7IEJldHRlclNxbGl0ZTNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckRpc2FibGVkRHJpdmVyc0R1bW15LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciBsb2dzIGV2ZXJ5dGhpbmcgaW50byBvcm1sb2dzLmxvZyBmaWxlLlxuICovXG52YXIgRHVtbXlMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHVtbXlMb2dnZXIoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBmYWlsZWQuXG4gICAgICovXG4gICAgRHVtbXlMb2dnZXIucHJvdG90eXBlLmxvZ1F1ZXJ5RXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIER1bW15TG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeVNsb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIHNjaGVtYSBidWlsZCBwcm9jZXNzLlxuICAgICAqL1xuICAgIER1bW15TG9nZ2VyLnByb3RvdHlwZS5sb2dTY2hlbWFCdWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGxvZ2dlciBpcyBub3QgYXBwbGljYWJsZSBpbiBhIGJyb3dzZXIgY29udGV4dCcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBldmVudHMgZnJvbSB0aGUgbWlncmF0aW9ucyBydW4gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbG9nZ2VyIGlzIG5vdCBhcHBsaWNhYmxlIGluIGEgYnJvd3NlciBjb250ZXh0Jyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGxvZ2dpbmcgdXNpbmcgZ2l2ZW4gbG9nZ2VyLCBvciBieSBkZWZhdWx0IHRvIHRoZSBjb25zb2xlLlxuICAgICAqIExvZyBoYXMgaXRzIG93biBsZXZlbCBhbmQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbG9nZ2VyIGlzIG5vdCBhcHBsaWNhYmxlIGluIGEgYnJvd3NlciBjb250ZXh0Jyk7XG4gICAgfTtcbiAgICByZXR1cm4gRHVtbXlMb2dnZXI7XG59KCkpO1xuZXhwb3J0IHsgRHVtbXlMb2dnZXIgfTtcbnZhciBGaWxlTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWxlTG9nZ2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbGVMb2dnZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZpbGVMb2dnZXI7XG59KER1bW15TG9nZ2VyKSk7XG5leHBvcnQgeyBGaWxlTG9nZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJGaWxlTG9nZ2VyRHVtbXkuanMubWFwXG4iLCIvKipcbiAqIEJyb3dzZXIncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdG9vbHMuXG4gKlxuICogVGhpcyBmaWxlIGdvbm5hIHJlcGxhY2UgUGxhdGZvcm1Ub29scyBmb3IgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqIEZvciBub2RlLmpzIGVudmlyb25tZW50IHRoaXMgY2xhc3MgaXMgbm90IGdldHRpbmcgcGFja2FnZWQuXG4gKiBEb24ndCB1c2UgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluIHRoZSBjb2RlLCB1c2UgUGxhdGZvcm1Ub29scyBtZXRob2RzIGluc3RlYWQuXG4gKi9cbnZhciBQbGF0Zm9ybVRvb2xzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYXRmb3JtVG9vbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIGdsb2JhbCBzdHVmZiBjYW4gYmUgc3RvcmVkLlxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMuZ2V0R2xvYmFsVmFyaWFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmF0aXZlU2NyaXB0IHVzZXMgZ2xvYmFsLCBub3Qgd2luZG93XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyAoXCJyZXF1aXJlXCItcykgZ2l2ZW4gZmlsZSBvciBwYWNrYWdlLlxuICAgICAqIFRoaXMgb3BlcmF0aW9uIG9ubHkgc3VwcG9ydHMgb24gbm9kZSBwbGF0Zm9ybVxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMubG9hZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcmVxdWlyZShcXFwiXCIgKyBuYW1lICsgXCJcXFwiKS5cIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBnaXZlbiBwYXRoLiBEb2VzIFwicGF0aC5ub3JtYWxpemVcIi5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLnBhdGhOb3JtYWxpemUgPSBmdW5jdGlvbiAocGF0aFN0cikge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IHBhdGgubm9ybWFsaXplKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGZpbGUgZXh0ZW5zaW9uLiBEb2VzIFwicGF0aC5leHRuYW1lXCIuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5wYXRoRXh0bmFtZSA9IGZ1bmN0aW9uIChwYXRoU3RyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcGF0aC5leHRuYW1lKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlZCBnaXZlbiBwYXRoLiBEb2VzIFwicGF0aC5yZXNvbHZlXCIuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5wYXRoUmVzb2x2ZSA9IGZ1bmN0aW9uIChwYXRoU3RyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcGF0aC5yZXNvbHZlKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiBmaWxlIGV4aXN0LiBEb2VzIFwiZnMuZXhpc3RzU3luY1wiLlxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMuZmlsZUV4aXN0ID0gZnVuY3Rpb24gKHBhdGhTdHIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gXCJicm93c2VyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBmcy5leGlzdHNTeW5jKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy5kb3RlbnYgPSBmdW5jdGlvbiAocGF0aFN0cikge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGRvdGVudi5jb25maWcoeyBwYXRoOiBcXFwiXCIgKyBwYXRoU3RyICsgXCJcXFwiIH0pLlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5nZXRFbnZWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBwcm9jZXNzLmVudltcIiR7bmFtZX1cIl0uYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLnJlYWRGaWxlU3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGZzLnJlYWRGaWxlU3luYyhcXFwiXCIgKyBmaWxlbmFtZSArIFwiXFxcIikuXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFBsYXRmb3JtVG9vbHMuYXBwZW5kRmlsZVN5bmMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gXCJicm93c2VyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBmcy5hcHBlbmRGaWxlU3luYyhcXFwiXCIgKyBmaWxlbmFtZSArIFwiXFxcIikuXCIpO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy53cml0ZUZpbGUgPSBmdW5jdGlvbiAocGF0aCwgZGF0YSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGZzLndyaXRlRmlsZShcXFwiXCIgKyBwYXRoICsgXCJcXFwiKS5cIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChudWxsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhpZ2hsaWdodHMgc3FsIHN0cmluZyB0byBiZSBwcmludCBpbiB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLmhpZ2hsaWdodFNxbCA9IGZ1bmN0aW9uIChzcWwpIHtcbiAgICAgICAgcmV0dXJuIHNxbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhpZ2hsaWdodHMganNvbiBzdHJpbmcgdG8gYmUgcHJpbnQgaW4gdGhlIGNvbnNvbGUuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5oaWdobGlnaHRKc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIGZ1bmN0aW9ucyBuZWVkZWQgYnkgQWR2YW5jZWRDb25zb2xlTG9nZ2VyIChidXQgaGVyZSB3aXRob3V0IGNoYWxrKVxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMubG9nSW5mbyA9IGZ1bmN0aW9uIChwcmVmaXgsIGluZm8pIHtcbiAgICAgICAgY29uc29sZS5pbmZvKHByZWZpeCArIFwiIFwiLCBpbmZvKTtcbiAgICB9O1xuICAgIFBsYXRmb3JtVG9vbHMubG9nRXJyb3IgPSBmdW5jdGlvbiAocHJlZml4LCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHByZWZpeCArIFwiIFwiLCBlcnJvcik7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLmxvZ1dhcm4gPSBmdW5jdGlvbiAocHJlZml4LCB3YXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihwcmVmaXggKyBcIiBcIiwgd2FybmluZyk7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLmxvZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy53YXJuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBwbGF0Zm9ybS5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLnR5cGUgPSBcImJyb3dzZXJcIjtcbiAgICByZXR1cm4gUGxhdGZvcm1Ub29scztcbn0oKSk7XG5leHBvcnQgeyBQbGF0Zm9ybVRvb2xzIH07XG4vKipcbiAqIFRoZXNlIGNsYXNzZXMgYXJlIG5lZWRlZCBmb3Igc3RyZWFtIG9wZXJhdGlvbnMgb3JcbiAqIGluIHRoZSBtb25nb2RiIGRyaXZlci4gQm90aCBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLlxuICovXG52YXIgRXZlbnRFbWl0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlcjtcbn0oKSk7XG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfTtcbnZhciBSZWFkYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWFkYWJsZSgpIHtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWRhYmxlO1xufSgpKTtcbmV4cG9ydCB7IFJlYWRhYmxlIH07XG52YXIgV3JpdGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gV3JpdGFibGUoKSB7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZTtcbn0oKSk7XG5leHBvcnQgeyBXcml0YWJsZSB9O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlci9cIikuQnVmZmVyO1xufVxuLy8gTmF0aXZlU2NyaXB0IHVzZXMgZ2xvYmFsLCBub3Qgd2luZG93XG5pZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGdsb2JhbC5CdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyL1wiKS5CdWZmZXI7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJQbGF0Zm9ybVRvb2xzLmpzLm1hcFxuIiwiaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqL1xudmFyIEFsaWFzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsaWFzKGFsaWFzKSB7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBhbGlhcyB8fCB7fSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbGlhcy5wcm90b3R5cGUsIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS50YXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWxpYXMucHJvdG90eXBlLCBcImhhc01ldGFkYXRhXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLl9tZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbGlhcy5wcm90b3R5cGUsIFwibWV0YWRhdGFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBnZXQgZW50aXR5IG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gYWxpYXMgXFxcIlwiICsgdGhpcy5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBBbGlhcztcbn0oKSk7XG5leHBvcnQgeyBBbGlhcyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbGlhcy5qcy5tYXBcbiIsIi8qKlxuICogU3ludGF4IHN1Z2FyLlxuICogQWxsb3dzIHRvIHVzZSBicmFja2V0cyBpbiBXSEVSRSBleHByZXNzaW9ucyBmb3IgYmV0dGVyIHN5bnRheC5cbiAqL1xudmFyIEJyYWNrZXRzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEdpdmVuIFdIRVJFIHF1ZXJ5IGJ1aWxkZXIgdGhhdCB3aWxsIGJ1aWxkIGEgV0hFUkUgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgdGFrZW4gaW50byBicmFja2V0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCcmFja2V0cyh3aGVyZUZhY3RvcnkpIHtcbiAgICAgICAgdGhpcy53aGVyZUZhY3RvcnkgPSB3aGVyZUZhY3Rvcnk7XG4gICAgfVxuICAgIHJldHVybiBCcmFja2V0cztcbn0oKSk7XG5leHBvcnQgeyBCcmFja2V0cyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CcmFja2V0cy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2NvY2tyb2FjaGRiL0NvY2tyb2FjaERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgRGVsZXRlUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0L0RlbGV0ZVJlc3VsdFwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBEZWxldGVRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlbGV0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRGVsZXRlUXVlcnlCdWlsZGVyKGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyLCBxdWVyeVJ1bm5lcikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVEZWxldGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHJldHVybiBzcWwudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIHJhdyBkYXRhYmFzZSByZXN1bHRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzcWwsIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCBxdWVyeVJlc3VsdCwgZGVsZXRlUmVzdWx0LCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsIDExLCAxNiwgMTldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VUcmFuc2FjdGlvbiA9PT0gdHJ1ZSAmJiBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkJlZm9yZVJlbW92ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5xdWVyeShzcWwsIHBhcmFtZXRlcnMsIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVSZXN1bHQgPSBEZWxldGVSZXN1bHQuZnJvbShxdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJBZnRlclJlbW92ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRlbGV0ZVJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxMiwgMTQsICwgMTVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZnJvbSA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSkge1xuICAgICAgICBlbnRpdHlUYXJnZXQgPSBlbnRpdHlUYXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgPyBlbnRpdHlUYXJnZXQub3B0aW9ucy5uYW1lIDogZW50aXR5VGFyZ2V0O1xuICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKG1haW5BbGlhcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IFdIRVJFIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBXSEVSRSBjb25kaXRpb25zLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBEZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hbmRXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcImFuZFwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSkgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5kV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcldoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmV0dXJuaW5nID0gZnVuY3Rpb24gKHJldHVybmluZykge1xuICAgICAgICAvLyBub3QgYWxsIGRhdGFiYXNlcyBzdXBwb3J0IHJldHVybmluZy9vdXRwdXQgY2F1c2VcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyA9IHJldHVybmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBERUxFVEUgZXhwcmVzcyB1c2VkIHRvIHBlcmZvcm0gcXVlcnkuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVEZWxldGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpO1xuICAgICAgICB2YXIgd2hlcmVFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVXaGVyZUV4cHJlc3Npb24oKTtcbiAgICAgICAgdmFyIHJldHVybmluZ0V4cHJlc3Npb24gPSB0aGlzLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gIT09IFwiXCIgJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBPVVRQVVQgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uICsgd2hlcmVFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZWxldGVRdWVyeUJ1aWxkZXI7XG59KFF1ZXJ5QnVpbGRlcikpO1xuZXhwb3J0IHsgRGVsZXRlUXVlcnlCdWlsZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZVF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBSYW5kb21HZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9SYW5kb21HZW5lcmF0b3JcIjtcbmltcG9ydCB7IEluc2VydFJlc3VsdCB9IGZyb20gXCIuL3Jlc3VsdC9JbnNlcnRSZXN1bHRcIjtcbmltcG9ydCB7IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yXCI7XG5pbXBvcnQgeyBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciB9IGZyb20gXCIuL1JldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBCcm9hZGNhc3RlclJlc3VsdCB9IGZyb20gXCIuLi9zdWJzY3JpYmVyL0Jyb2FkY2FzdGVyUmVzdWx0XCI7XG5pbXBvcnQgeyBFbnRpdHlTY2hlbWEgfSBmcm9tIFwiLi4vZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWFcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBJbnNlcnRRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluc2VydFF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnNlcnRRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVJbnNlcnRFeHByZXNzaW9uKCk7XG4gICAgICAgIHJldHVybiBzcWwudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIHJhdyBkYXRhYmFzZSByZXN1bHRzLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlU2V0cywgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGJyb2FkY2FzdFJlc3VsdF8xLCBkZWNsYXJlU3FsLCBzZWxlY3RPdXRwdXRTcWwsIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLCByZXR1cm5pbmdDb2x1bW5zXzEsIF9hLCBfYiwgY29sdW1uUGF0aCwgX2MsIGluc2VydFNxbCwgcGFyYW1ldGVycywgc3RhdGVtZW50cywgc3FsLCBxdWVyeVJlc3VsdCwgaW5zZXJ0UmVzdWx0LCBicm9hZGNhc3RSZXN1bHRfMiwgZXJyb3JfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXRzID0gdGhpcy5nZXRWYWx1ZVNldHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcIi52YWx1ZSBzZXRzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNlciBwYXNzZWQgZW1wdHkgYXJyYXkgb2YgZW50aXRpZXMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlcyBHaXRIdWIgaXNzdWVzICMzMTExIGFuZCAjNTczNC4gSWYgd2Ugd2VyZSB0byBsZXQgdGhpcyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3b3VsZCBydW4gaW50byBwcm9ibGVtcyBkb3duc3RyZWFtLCBsaWtlIHN1YnNjcmliZXJzIGdldHRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9rZWQgd2l0aCB0aGUgZW1wdHkgYXJyYXkgd2hlcmUgdGhleSBleHBlY3QgYW4gZW50aXR5LCBhbmQgU1FMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWVyaWVzIHdpdGggYW4gZW1wdHkgVkFMVUVTIGNsYXVzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVNldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgSW5zZXJ0UmVzdWx0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMSwgMTMsIDE4LCAyMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0UmVzdWx0XzEgPSBuZXcgQnJvYWRjYXN0ZXJSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZVNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZUluc2VydEV2ZW50KGJyb2FkY2FzdFJlc3VsdF8xLCBfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgdmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBicm9hZGNhc3RSZXN1bHRfMS53YWl0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVTcWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0U3FsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gbmV3IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yKHF1ZXJ5UnVubmVyLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfYSA9IF9fdmFsdWVzKHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcpLCBfYiA9IF9hLm5leHQoKTsgIV9iLmRvbmU7IF9iID0gX2EubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5QYXRoID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmdDb2x1bW5zXzEucHVzaC5hcHBseShyZXR1cm5pbmdDb2x1bW5zXzEsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChjb2x1bW5QYXRoKSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2QgPSBfYS5yZXR1cm4pKSBfZC5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlU2V0cy5sZW5ndGggPiAxICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMgPSByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5nZXRJbnNlcnRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnNfMS5wdXNoLmFwcGx5KHJldHVybmluZ0NvbHVtbnNfMSwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiAhcmV0dXJuaW5nQ29sdW1uc18xLmluY2x1ZGVzKGMpOyB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuaW5nQ29sdW1uc18xLmxlbmd0aCA+IDAgJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVTcWwgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVWYXJpYWJsZURlY2xhcmF0aW9uKFwiQE91dHB1dFRhYmxlXCIsIHJldHVybmluZ0NvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0U3FsID0gXCJTRUxFQ1QgKiBGUk9NIEBPdXRwdXRUYWJsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2MgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIGluc2VydFNxbCA9IF9jWzBdLCBwYXJhbWV0ZXJzID0gX2NbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzID0gW2RlY2xhcmVTcWwsIGluc2VydFNxbCwgc2VsZWN0T3V0cHV0U3FsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNxbCA9IHN0YXRlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzICE9IG51bGw7IH0pLmpvaW4oXCI7XFxuXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0ID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0ID0gSW5zZXJ0UmVzdWx0LmZyb20ocXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVwZGF0ZUVudGl0eSA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpbmcgZW50aXR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuaW5zZXJ0KGluc2VydFJlc3VsdCwgdmFsdWVTZXRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi51cGRhdGluZyBlbnRpdHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RSZXN1bHRfMiA9IG5ldyBCcm9hZGNhc3RlclJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJJbnNlcnRFdmVudChicm9hZGNhc3RSZXN1bHRfMiwgX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIHZhbHVlU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYnJvYWRjYXN0UmVzdWx0XzIud2FpdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiBcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiLmNvbW1pdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGluc2VydFJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDIwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBJTlRPIHdoaWNoIGVudGl0eSdzIHRhYmxlIGluc2VydGlvbiB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW50byA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGNvbHVtbnMpIHtcbiAgICAgICAgZW50aXR5VGFyZ2V0ID0gZW50aXR5VGFyZ2V0IGluc3RhbmNlb2YgRW50aXR5U2NoZW1hID8gZW50aXR5VGFyZ2V0Lm9wdGlvbnMubmFtZSA6IGVudGl0eVRhcmdldDtcbiAgICAgICAgdmFyIG1haW5BbGlhcyA9IHRoaXMuY3JlYXRlRnJvbUFsaWFzKGVudGl0eVRhcmdldCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMgPSBjb2x1bW5zIHx8IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRhYmxlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmV0dXJuaW5nID0gZnVuY3Rpb24gKHJldHVybmluZykge1xuICAgICAgICAvLyBub3QgYWxsIGRhdGFiYXNlcyBzdXBwb3J0IHJldHVybmluZy9vdXRwdXQgY2F1c2VcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyA9IHJldHVybmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciBpbnNlcnRpb24gb3BlcmF0aW9ucy5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnVwZGF0ZUVudGl0eSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYWRkaXRpb25hbCBPTiBDT05GTElDVCBzdGF0ZW1lbnQgc3VwcG9ydGVkIGluIHBvc3RncmVzIGFuZCBjb2Nrcm9hY2guXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYG9ySWdub3JlYCBvciBgb3JVcGRhdGVgXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vbkNvbmZsaWN0ID0gZnVuY3Rpb24gKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub25Db25mbGljdCA9IHN0YXRlbWVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFkZGl0aW9uYWwgaWdub3JlIHN0YXRlbWVudCBzdXBwb3J0ZWQgaW4gZGF0YWJhc2VzLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JJZ25vcmUgPSBmdW5jdGlvbiAoc3RhdGVtZW50KSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQgPT09IHZvaWQgMCkgeyBzdGF0ZW1lbnQgPSB0cnVlOyB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vbklnbm9yZSA9ICEhc3RhdGVtZW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYWRkaXRpb25hbCB1cGRhdGUgc3RhdGVtZW50IHN1cHBvcnRlZCBpbiBkYXRhYmFzZXMuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vclVwZGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZW1lbnRPck92ZXJ3cml0ZSwgY29uZmxpY3RUYXJnZXQpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXRlbWVudE9yT3ZlcndyaXRlKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlID0ge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0OiBzdGF0ZW1lbnRPck92ZXJ3cml0ZSA9PT0gbnVsbCB8fCBzdGF0ZW1lbnRPck92ZXJ3cml0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdGVtZW50T3JPdmVyd3JpdGUuY29uZmxpY3RfdGFyZ2V0LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHN0YXRlbWVudE9yT3ZlcndyaXRlID09PSBudWxsIHx8IHN0YXRlbWVudE9yT3ZlcndyaXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGF0ZW1lbnRPck92ZXJ3cml0ZS5jb2x1bW5zLFxuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogc3RhdGVtZW50T3JPdmVyd3JpdGUgPT09IG51bGwgfHwgc3RhdGVtZW50T3JPdmVyd3JpdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXRlbWVudE9yT3ZlcndyaXRlLm92ZXJ3cml0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub25VcGRhdGUgPSB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IHN0YXRlbWVudE9yT3ZlcndyaXRlLFxuICAgICAgICAgICAgY29uZmxpY3Q6IGNvbmZsaWN0VGFyZ2V0LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIElOU0VSVCBleHByZXNzIHVzZWQgdG8gcGVyZm9ybSBpbnNlcnQgcXVlcnkuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVJbnNlcnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpO1xuICAgICAgICB2YXIgdmFsdWVzRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlVmFsdWVzRXhwcmVzc2lvbigpOyAvLyBpdHMgaW1wb3J0YW50IHRvIGdldCB2YWx1ZXMgYmVmb3JlIHJldHVybmluZyBleHByZXNzaW9uIGJlY2F1c2Ugb3JhY2xlIHJlbHkgb24gbmF0aXZlIHBhcmFtZXRlcnMgYW5kIG9yZGVyaW5nIG9mIHRoZW0gaXMgaW1wb3J0YW50XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5sZW5ndGggPiAxKSA/IG51bGwgOiB0aGlzLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24oKTsgLy8gb3JhY2xlIGRvZXNudCBzdXBwb3J0IHJldHVybmluZyB3aXRoIG11bHRpLXJvdyBpbnNlcnRcbiAgICAgICAgdmFyIGNvbHVtbnNFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVDb2x1bW5OYW1lc0V4cHJlc3Npb24oKTtcbiAgICAgICAgdmFyIHF1ZXJ5ID0gXCJJTlNFUlQgXCI7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9IFwiXCIgKyAodGhpcy5leHByZXNzaW9uTWFwLm9uSWdub3JlID8gXCIgSUdOT1JFIFwiIDogXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgKz0gXCJJTlRPIFwiICsgdGFibGVOYW1lO1xuICAgICAgICAvLyBhZGQgY29sdW1ucyBleHByZXNzaW9uXG4gICAgICAgIGlmIChjb2x1bW5zRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcXVlcnkgKz0gXCIoXCIgKyBjb2x1bW5zRXhwcmVzc2lvbiArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXNFeHByZXNzaW9uICYmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpKSAvLyBzcGVjaWFsIHN5bnRheCBmb3IgbXlzcWwgREVGQVVMVCBWQUxVRVMgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIoKVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBPVVRQVVQgZXhwcmVzc2lvblxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICBxdWVyeSArPSBcIiBPVVRQVVQgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBWQUxVRVMgZXhwcmVzc2lvblxuICAgICAgICBpZiAodmFsdWVzRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgXCIgKyB2YWx1ZXNFeHByZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgVkFMVUVTIFwiICsgdmFsdWVzRXhwcmVzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpIHsgLy8gc3BlY2lhbCBzeW50YXggZm9yIG15c3FsIERFRkFVTFQgVkFMVUVTIGluc2VydGlvblxuICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFZBTFVFUyAoKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgREVGQVVMVCBWQUxVRVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5zdXBwb3J0ZWRVcHNlcnRUeXBlID09PSBcIm9uLWNvbmZsaWN0LWRvLXVwZGF0ZVwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgT04gQ09ORkxJQ1QgRE8gTk9USElORyBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5vbkNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgT04gQ09ORkxJQ1QgXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAub25Db25mbGljdCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlLCBvdmVyd3JpdGUgPSBfYS5vdmVyd3JpdGUsIGNvbHVtbnMgPSBfYS5jb2x1bW5zLCBjb25mbGljdCA9IF9hLmNvbmZsaWN0O1xuICAgICAgICAgICAgICAgIHZhciBjb25mbGljdFRhcmdldCA9IFwiT04gQ09ORkxJQ1RcIjtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25mbGljdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RUYXJnZXQgKz0gXCIgKCBcIiArIGNvbmZsaWN0Lm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKTsgfSkuam9pbihcIiwgXCIpICsgXCIgKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdFRhcmdldCArPSBcIiBPTiBDT05TVFJBSU5UIFwiICsgdGhpcy5lc2NhcGUoY29uZmxpY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVyd3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiICsgY29uZmxpY3RUYXJnZXQgKyBcIiBETyBVUERBVEUgU0VUIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBvdmVyd3JpdGUgPT09IG51bGwgfHwgb3ZlcndyaXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVyd3JpdGUubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW4pICsgXCIgPSBFWENMVURFRC5cIiArIF90aGlzLmVzY2FwZShjb2x1bW4pOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiICsgY29uZmxpY3RUYXJnZXQgKyBcIiBETyBVUERBVEUgU0VUIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiID0gOlwiICsgY29sdW1uOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnN1cHBvcnRlZFVwc2VydFR5cGUgPT09IFwib24tZHVwbGljYXRlLWtleS11cGRhdGVcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5vblVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vblVwZGF0ZSwgb3ZlcndyaXRlID0gX2Iub3ZlcndyaXRlLCBjb2x1bW5zID0gX2IuY29sdW1ucztcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVyd3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBvdmVyd3JpdGUubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW4pICsgXCIgPSBWQUxVRVMoXCIgKyBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiKVwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiID0gOlwiICsgY29sdW1uOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAub25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwib25VcGRhdGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBkYXRhYmFzZSBkcml2ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIFJFVFVSTklORyBleHByZXNzaW9uXG4gICAgICAgIGlmIChyZXR1cm5pbmdFeHByZXNzaW9uICYmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgcXVlcnkgKz0gXCIgUkVUVVJOSU5HIFwiICsgcmV0dXJuaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnNlcnRpbmcgYSBzcGVjaWZpYyB2YWx1ZSBmb3IgYW4gYXV0by1pbmNyZW1lbnQgcHJpbWFyeSBrZXkgaW4gbXNzcWwgcmVxdWlyZXMgZW5hYmxpbmcgSURFTlRJVFlfSU5TRVJUXG4gICAgICAgIC8vIElERU5USVRZX0lOU0VSVCBjYW4gb25seSBiZSBlbmFibGVkIGZvciB0YWJsZXMgd2hlcmUgdGhlcmUgaXMgYW4gSURFTlRJVFkgY29sdW1uIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgKGkuZS4gc3VwcGx5aW5nIERFRkFVTFQgaXMgcHJvaGliaXRlZCBpZiBJREVOVElUWV9JTlNFUlQgaXMgZW5hYmxlZClcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXJcbiAgICAgICAgICAgICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGFcbiAgICAgICAgICAgICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuY29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuZXhwcmVzc2lvbk1hcC5pbnNlcnRDb2x1bW5zLmxlbmd0aCA+IDAgPyBfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMuaW5kZXhPZihjb2x1bW4ucHJvcGVydHlQYXRoKSAhPT0gLTEgOiBjb2x1bW4uaXNJbnNlcnQ7IH0pXG4gICAgICAgICAgICAgICAgLnNvbWUoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuaXNPdmVycmlkaW5nQXV0b0luY3JlbWVudEJlaGF2aW9yKGNvbHVtbik7IH0pKSB7XG4gICAgICAgICAgICBxdWVyeSA9IFwiU0VUIElERU5USVRZX0lOU0VSVCBcIiArIHRhYmxlTmFtZSArIFwiIE9OOyBcIiArIHF1ZXJ5ICsgXCI7IFNFVCBJREVOVElUWV9JTlNFUlQgXCIgKyB0YWJsZU5hbWUgKyBcIiBPRkZcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1ucyB3aGVyZSB2YWx1ZXMgbXVzdCBiZSBpbnNlcnRlZCB0by5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldEluc2VydGVkQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZiB1c2VyIHNwZWNpZmllZCBsaXN0IG9mIGNvbHVtbnMgaGUgd2FudHMgdG8gaW5zZXJ0IHRvLCB0aGVuIHdlIGZpbHRlciBvbmx5IHRoZW1cbiAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMuaW5kZXhPZihjb2x1bW4ucHJvcGVydHlQYXRoKSAhPT0gLTE7XG4gICAgICAgICAgICAvLyBza2lwIGNvbHVtbnMgdGhlIHVzZXIgZG9lc24ndCB3YW50IGluY2x1ZGVkIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGlmICghY29sdW1uLmlzSW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgdXNlciBkaWQgbm90IHNwZWNpZmllZCBzdWNoIGxpc3QgdGhlbiByZXR1cm4gYWxsIGNvbHVtbnMgZXhjZXB0IGF1dG8taW5jcmVtZW50IG9uZVxuICAgICAgICAgICAgLy8gZm9yIE9yYWNsZSB3ZSByZXR1cm4gYXV0by1pbmNyZW1lbnQgY29sdW1uIGFzIHdlbGwgYmVjYXVzZSBPcmFjbGUgZG9lcyBub3Qgc3VwcG9ydCBERUZBVUxUIFZBTFVFUyBleHByZXNzaW9uXG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICAmJiAhKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKVxuICAgICAgICAgICAgICAgICYmICEoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcilcbiAgICAgICAgICAgICAgICAmJiAhKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIpXG4gICAgICAgICAgICAgICAgJiYgIShfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgJiYgIShfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciAmJiBfdGhpcy5pc092ZXJyaWRpbmdBdXRvSW5jcmVtZW50QmVoYXZpb3IoY29sdW1uKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbHVtbnMgc3RyaW5nIHdoZXJlIHZhbHVlcyBtdXN0IGJlIGluc2VydGVkIHRvIGZvciBJTlNFUlQgSU5UTyBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlQ29sdW1uTmFtZXNFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuZ2V0SW5zZXJ0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIGlmIHRoZXJlIGFyZSBubyBpbnNlcnQgY29sdW1ucyBzcGVjaWZpZWQgYW5kIHRhYmxlIHdpdGhvdXQgbWV0YWRhdGEgdXNlZFxuICAgICAgICAvLyB3ZSBnZXQgY29sdW1ucyBmcm9tIHRoZSBpbnNlcnRlZCB2YWx1ZSBtYXAsIGluIHRoZSBjYXNlIGlmIG9ubHkgb25lIGluc2VydGVkIG1hcCBpcyBzcGVjaWZpZWRcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmICF0aGlzLmV4cHJlc3Npb25NYXAuaW5zZXJ0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZVNldHMgPSB0aGlzLmdldFZhbHVlU2V0cygpO1xuICAgICAgICAgICAgaWYgKHZhbHVlU2V0cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlU2V0c1swXSkubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uTmFtZSk7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgYSB0YWJsZSBuYW1lIGFuZCBhbGwgY29sdW1uIGRhdGFiYXNlIG5hbWVzXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAuaW5zZXJ0Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW5OYW1lKTsgfSkuam9pbihcIiwgXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBsaXN0IG9mIHZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbiB0aGUgVkFMVUVTIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVWYWx1ZXNFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdmFsdWVTZXRzID0gdGhpcy5nZXRWYWx1ZVNldHMoKTtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmdldEluc2VydGVkQ29sdW1ucygpO1xuICAgICAgICAvLyBpZiBjb2x1bW4gbWV0YWRhdGFzIGFyZSBnaXZlbiB0aGVuIGFwcGx5IGFsbCBuZWNlc3Nhcnkgb3BlcmF0aW9ucyB3aXRoIHZhbHVlc1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbl8xID0gXCJcIjtcbiAgICAgICAgICAgIHZhbHVlU2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZVNldCwgdmFsdWVTZXRJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciAmJiB2YWx1ZVNldHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIiBTRUxFQ1QgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIoXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCByZWFsIHZhbHVlIGZyb20gdGhlIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb2x1bW4gaXMgcmVsYXRpb25hbCBhbmQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoZW4gZ2V0IHJlYWwgcmVmZXJlbmNlZCBjb2x1bW4gdmFsdWUgZnJvbSB0aGlzIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSBjb2x1bW4gdmFsdWUgaXMgeyBxdWVzdGlvbjogeyBpZDogMSB9IH0sIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8geyBpZDogMSB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBleHRyYWN0IFwiMVwiIGZyb20gdGhpcyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLyppZiAoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4gJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkgeyAvLyB0b2RvOiBjaGVjayBpZiB3ZSBzdGlsbCBuZWVkIGl0IHNpbmNlIGdldEVudGl0eVZhbHVlIGFscmVhZHkgaGFzIHNpbWlsYXIgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0qL1xuICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG91ciB2YWx1ZSBpcyBub3JtYWxpemVkIGJ5IGEgZHJpdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVQZXJzaXN0ZW50VmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3bHkgaW5zZXJ0ZWQgZW50aXRpZXMgYWx3YXlzIGhhdmUgYSB2ZXJzaW9uIGVxdWFsIHRvIDEgKGZpcnN0IHZlcnNpb24pXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsc28sIHVzZXItc3BlY2lmaWVkIHZlcnNpb24gbXVzdCBiZSBlbXB0eVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmVyc2lvbiAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGNvbHVtbi5pc05lc3RlZFNldExlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZW50aXR5TWV0YWRhdGEudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCByaWdodENvbHVtbk5hbWUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZW50aXR5TWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4hLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc3Qgc3ViUXVlcnkgPSBgKFNFTEVDVCBjLm1heCArIDEgRlJPTSAoU0VMRUNUIE1BWCgke3JpZ2h0Q29sdW1uTmFtZX0pIGFzIG1heCBmcm9tICR7dGFibGVOYW1lfSkgYylgO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4cHJlc3Npb24gKz0gc3ViUXVlcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChjb2x1bW4uaXNOZXN0ZWRTZXRSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5lbnRpdHlNZXRhZGF0YS50YWJsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IHJpZ2h0Q29sdW1uTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5lbnRpdHlNZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbiEuZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCBzdWJRdWVyeSA9IGAoU0VMRUNUIGMubWF4ICsgMiBGUk9NIChTRUxFQ1QgTUFYKCR7cmlnaHRDb2x1bW5OYW1lfSkgYXMgbWF4IGZyb20gJHt0YWJsZU5hbWV9KSBjKWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhwcmVzc2lvbiArPSBzdWJRdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4uaXNEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY3JlYXRlIGFuZCB1cGRhdGUgZGF0ZXMgd2UgaW5zZXJ0IGN1cnJlbnQgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8sIHdlIGRvbid0IGRvIGl0IGJlY2F1c2UgdGhpcyBjb25zdGFudCBpcyBhbHJlYWR5IGluIFwiZGVmYXVsdFwiIHZhbHVlIG9mIHRoZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggZXh0ZW5kZWQgdGltZXN0YW1wIGZ1bmN0aW9uYWxpdHksIGxpa2UgQ1VSUkVOVF9USU1FU1RBTVAoNikgZm9yIGV4YW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoY29sdW1uLmlzQ3JlYXRlRGF0ZSB8fCBjb2x1bW4uaXNVcGRhdGVEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIFwiQ1VSUkVOVF9USU1FU1RBTVBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbHVtbiBpcyBnZW5lcmF0ZWQgdXVpZCBhbmQgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBpdHMgZ2VuZXJhdGlvbiBhbmQgY3VzdG9tIGdlbmVyYXRlZCB2YWx1ZSB3YXMgbm90IHByb3ZpZGVkIGJ5IGEgdXNlciAtIHdlIGdlbmVyYXRlIGEgbmV3IHV1aWQgdmFsdWUgZm9yIGluc2VydGlvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5pc0dlbmVyYXRlZCAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIiAmJiAhX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNVVUlER2VuZXJhdGlvblN1cHBvcnRlZCgpICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUmFuZG9tR2VuZXJhdG9yLnV1aWQ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlU2V0SW5kZXggaW4gX3RoaXMuZXhwcmVzc2lvbk1hcC5sb2NhbGx5R2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZFt2YWx1ZVNldEluZGV4XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZFt2YWx1ZVNldEluZGV4XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgZm9yIHRoaXMgY29sdW1uIHdhcyBub3QgcHJvdmlkZWQgdGhlbiBpbnNlcnQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfHwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHsgLy8gdW5mb3J0dW5hdGVseSBzcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBERUZBVUxUIGV4cHJlc3Npb24gaW4gSU5TRVJUIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZGVmYXVsdCAhPT0gbnVsbCkgeyAvLyB0cnkgdG8gdXNlIGRlZmF1bHQgZGVmaW5lZCBpbiB0aGUgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCJOVUxMXCI7IC8vIG90aGVyd2lzZSBzaW1wbHkgdXNlIE5VTEwgYW5kIHByYXkgaWYgY29sdW1uIGlzIG51bGxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiREVGQVVMVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gdmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYW55IG90aGVyIHJlZ3VsYXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcmFtZXRyaXplVmFsdWUoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0b3JlIGFycmF5IHZhbHVlcyBpbiBhIHNwZWNpYWwgY2xhc3MgdG8gbWFrZSBzdXJlIHBhcmFtZXRlciByZXBsYWNlbWVudCB3aWxsIHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZSA9IG5ldyBBcnJheVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvbUZyb21UZXh0ID0gdXNlTGVnYWN5ID8gXCJHZW9tRnJvbVRleHRcIiA6IFwiU1RfR2VvbUZyb21UZXh0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zcmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IGdlb21Gcm9tVGV4dCArIFwiKFwiICsgcGFyYW1OYW1lICsgXCIsIFwiICsgY29sdW1uLnNyaWQgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBnZW9tRnJvbVRleHQgKyBcIihcIiArIHBhcmFtTmFtZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc3JpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIlNUX1NldFNSSUQoU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpLCBcIiArIGNvbHVtbi5zcmlkICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gY29sdW1uLnR5cGUgKyBcIjo6U1RHZW9tRnJvbVRleHQoXCIgKyBwYXJhbU5hbWUgKyBcIiwgXCIgKyAoY29sdW1uLnNyaWQgfHwgXCIwXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA9PT0gY29sdW1ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVTZXRJbmRleCA9PT0gdmFsdWVTZXRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiIEZST00gRFVBTCBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiIEZST00gRFVBTCBVTklPTiBBTEwgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIpLCBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uXzEgPT09IFwiKClcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uXzE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGZvciB0YWJsZXMgd2l0aG91dCBtZXRhZGF0YVxuICAgICAgICAgICAgLy8gZ2V0IHZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZFxuICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25fMiA9IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZVNldHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVTZXQsIGluc2VydGlvbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSBPYmplY3Qua2V5cyh2YWx1ZVNldCk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW5OYW1lLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIihcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZVNldFtjb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSB2YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgZm9yIHRoaXMgY29sdW1uIHdhcyBub3QgcHJvdmlkZWQgdGhlbiBpbnNlcnQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEFic3RyYWN0U3FsaXRlRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiTlVMTFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiREVGQVVMVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhbnkgb3RoZXIgcmVndWxhciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IF90aGlzLmNyZWF0ZVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSBPYmplY3Qua2V5cyh2YWx1ZVNldCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvbkluZGV4ID09PSB2YWx1ZVNldHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIiksIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbl8yID09PSBcIigpXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbl8yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFycmF5IG9mIHZhbHVlcyBuZWVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFZhbHVlU2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldDtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXQgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXRdO1xuICAgICAgICB0aHJvdyBuZXcgSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgY29sdW1uIGlzIGFuIGF1dG8tZ2VuZXJhdGVkIHByaW1hcnkga2V5LCBidXQgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHNwZWNpZmllcyBhIHZhbHVlIGZvciBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2x1bW5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmlzT3ZlcnJpZGluZ0F1dG9JbmNyZW1lbnRCZWhhdmlvciA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnlcbiAgICAgICAgICAgICYmIGNvbHVtbi5pc0dlbmVyYXRlZFxuICAgICAgICAgICAgJiYgY29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIlxuICAgICAgICAgICAgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5zb21lKGZ1bmN0aW9uICh2YWx1ZVNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWVTZXQpICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlU2V0KSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEluc2VydFF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBJbnNlcnRRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlclV0aWxzIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyVXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBTdG9yZXMgYWxsIGpvaW4gYXR0cmlidXRlcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgYSBKT0lOIHF1ZXJ5LlxuICovXG52YXIgSm9pbkF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gSm9pbkF0dHJpYnV0ZShjb25uZWN0aW9uLCBxdWVyeUV4cHJlc3Npb25NYXAsIGpvaW5BdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAgPSBxdWVyeUV4cHJlc3Npb25NYXA7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZEV2YWx1YXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbGF0aW9uRXZhbHVhdGVkID0gZmFsc2U7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBqb2luQXR0cmlidXRlIHx8IHt9KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcImlzTWFueVwiLCB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTWFwcGluZ01hbnkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc01hcHBpbmdNYW55O1xuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uaXNNYW55VG9NYW55IHx8IHRoaXMucmVsYXRpb24uaXNPbmVUb01hbnk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwiaXNTZWxlY3RlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBqb2luIGlzIHNlbGVjdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRFdmFsdWF0ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Quc2VsZWN0aW9uID09PSBfdGhpcy5hbGlhcy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEgJiYgISFfdGhpcy5tZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gX3RoaXMuYWxpYXMubmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoX3RoaXMucXVlcnlFeHByZXNzaW9uTWFwLnNlbGVjdHMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShzZWxlY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGVfMSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0ZWRDYWNoZSA9IGdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkRXZhbHVhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRDYWNoZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJ0YWJsZVBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgdGFibGUgd2hpY2ggd2Ugc2hvdWxkIGpvaW4uXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YS50YWJsZVBhdGggOiB0aGlzLmVudGl0eU9yUHJvcGVydHk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicGFyZW50QWxpYXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxpYXMgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGpvaW4uXG4gICAgICAgICAqIEZvciBleGFtcGxlLCBpZiB3ZSBqb2luIChcInBvc3QuY2F0ZWdvcnlcIiwgXCJjYXRlZ29yeUFsaWFzXCIpIHRoZW4gXCJwb3N0XCIgaXMgYSBwYXJlbnQgYWxpYXMuXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gZW50aXR5T3JQcm9wZXJ0eSB2YWx1ZS5cbiAgICAgICAgICogVGhpcyBpcyBhdmFpbGFibGUgd2hlbiBqb2luIHdhcyBtYWRlIHVzaW5nIFwicG9zdC5jYXRlZ29yeVwiIHN5bnRheC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5lbnRpdHlPclByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgdGhpcy5lbnRpdHlPclByb3BlcnR5LmluZGV4T2YoXCIuXCIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJyZWxhdGlvblByb3BlcnR5UGF0aFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwiY2F0ZWdvcnlcIiBpcyBhIHJlbGF0aW9uIHByb3BlcnR5LlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMuZW50aXR5T3JQcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudGl0eU9yUHJvcGVydHkuc3Vic3RyKHRoaXMuZW50aXR5T3JQcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSArIDEpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcInJlbGF0aW9uXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKiBSZWxhdGlvbiBjYW4gYmUgdW5kZWZpbmVkIGlmIGVudGl0eU9yUHJvcGVydHkgaXMgcmVndWxhciBlbnRpdHkgb3IgY3VzdG9tIHRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlbGF0aW9uRXZhbHVhdGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eShfdGhpcy5lbnRpdHlPclByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbk93bmVyU2VsZWN0aW9uID0gX3RoaXMucXVlcnlFeHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShfdGhpcy5wYXJlbnRBbGlhcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChfdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbk93bmVyU2VsZWN0aW9uLm1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEucGFyZW50RW50aXR5TWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChfdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlbGF0aW9uIHdpdGggcHJvcGVydHkgcGF0aCBcIiArIF90aGlzLnJlbGF0aW9uUHJvcGVydHlQYXRoICsgXCIgaW4gZW50aXR5IHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbkNhY2hlID0gZ2V0VmFsdWUuYmluZCh0aGlzKSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25FdmFsdWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25DYWNoZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJtZXRhZGF0YVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNZXRhZGF0YSBvZiB0aGUgam9pbmVkIGVudGl0eS5cbiAgICAgICAgICogSWYgdGFibGUgd2l0aG91dCBlbnRpdHkgd2FzIGpvaW5lZCwgdGhlbiBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGVudGl0eU9yUHJvcGVydHkgaXMgcmVsYXRpb24sIGUuZy4gXCJwb3N0LmNhdGVnb3J5XCJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgIC8vIGVudGl0eU9yUHJvcGVydHkgaXMgRW50aXR5IGNsYXNzXG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmhhc01ldGFkYXRhKHRoaXMuZW50aXR5T3JQcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8qaWYgKHR5cGVvZiB0aGlzLmVudGl0eU9yUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHsgLy8gZW50aXR5T3JQcm9wZXJ0eSBpcyBhIGN1c3RvbSB0YWJsZVxuICAgIFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB0byBmaW5kIGVudGl0eSB3aXRoIHN1Y2ggbmFtZSwgdGhpcyBpcyBuZWVkZWQgd2hlbiBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCBjbGFzcyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIHRhcmdldCBpcyBhIHN0cmluZyBuYW1lIChzY2VuYXJpbyB3aGVuIHBsYWluIG9sZCBqYXZhc2NyaXB0IGlzIHVzZWQgb3IgZW50aXR5IHNjaGVtYSBpcyBsb2FkZWQgZnJvbSBmaWxlcylcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmluZChtZXRhZGF0YSA9PiBtZXRhZGF0YS5uYW1lID09PSB0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgZW50aXR5IHdpdGggc3VjaCB0YWJsZSBuYW1lLCBhbmQgdXNlIGl0cyBtZXRhZGF0YSBpZiBmb3VuZFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZW50aXR5TWV0YWRhdGFzLmZpbmQobWV0YWRhdGEgPT4gbWV0YWRhdGEudGFibGVOYW1lID09PSB0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgfSovXG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwianVuY3Rpb25BbGlhc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZXMgYWxpYXMgb2YganVuY3Rpb24gdGFibGUsIHdob3NlIGlkcyB3ZSBnZXQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGdldCBqdW5jdGlvbiB0YWJsZSBmb3Igam9pbiB3aXRob3V0IHJlbGF0aW9uLlwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uLmlzT3duaW5nID8gdGhpcy5wYXJlbnRBbGlhcyArIFwiX1wiICsgdGhpcy5hbGlhcy5uYW1lIDogdGhpcy5hbGlhcy5uYW1lICsgXCJfXCIgKyB0aGlzLnBhcmVudEFsaWFzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1hcFRvUHJvcGVydHlQYXJlbnRBbGlhc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcFRvUHJvcGVydHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcFRvUHJvcGVydHkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1hcFRvUHJvcGVydHlQcm9wZXJ0eU5hbWVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXBUb1Byb3BlcnR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBUb1Byb3BlcnR5LnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBKb2luQXR0cmlidXRlO1xufSgpKTtcbmV4cG9ydCB7IEpvaW5BdHRyaWJ1dGUgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Sm9pbkF0dHJpYnV0ZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5RXhwcmVzc2lvbk1hcCB9IGZyb20gXCIuL1F1ZXJ5RXhwcmVzc2lvbk1hcFwiO1xuaW1wb3J0IHsgQnJhY2tldHMgfSBmcm9tIFwiLi9CcmFja2V0c1wiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzRHJpdmVyXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2NvY2tyb2FjaGRiL0NvY2tyb2FjaERyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3BlcmF0b3JcIjtcbmltcG9ydCB7IEluIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9JblwiO1xuaW1wb3J0IHsgRW50aXR5Q29sdW1uTm90Rm91bmQgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5Q29sdW1uTm90Rm91bmRcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLy8gdG9kbzogY29tcGxldGVseSBjb3ZlciBxdWVyeSBidWlsZGVyIHdpdGggdGVzdHNcbi8vIHRvZG86IGVudGl0eU9yUHJvcGVydHkgY2FuIGJlIHRhcmdldCBuYW1lLiBpbXBsZW1lbnQgcHJvcGVyIGJlaGF2aW91ciBpZiBpdCBpcy5cbi8vIHRvZG86IGNoZWNrIGluIHBlcnNpc3RtZW50IGlmIGlkIGV4aXN0IG9uIG9iamVjdCBhbmQgdGhyb3cgZXhjZXB0aW9uIChjYW4gYmUgaW4gcGFydGlhbCBzZWxlY3Rpb24/KVxuLy8gdG9kbzogZml4IHByb2JsZW0gd2l0aCBsb25nIGFsaWFzZXMgZWcgZ2V0TWF4SWRlbnRpZmllckxlbmd0aFxuLy8gdG9kbzogZml4IHJlcGxhY2luZyBpbiAuc2VsZWN0KFwiQ09VTlQocG9zdC5pZCkgQVMgY250XCIpIHN0YXRlbWVudFxuLy8gdG9kbzogaW1wbGVtZW50IGpvaW5BbHdheXMgaW4gcmVsYXRpb25zIGFuZCByZWxhdGlvbklkXG4vLyB0b2RvOiBmaW5pc2ggcGFydGlhbCBzZWxlY3Rpb25cbi8vIHRvZG86IHN1Z2FyIG1ldGhvZHMgbGlrZTogLmFkZENvdW50IGFuZCAuc2VsZWN0Q291bnQsIHNlbGVjdENvdW50QW5kTWFwLCBzZWxlY3RTdW0sIHNlbGVjdFN1bUFuZE1hcCwgLi4uXG4vLyB0b2RvOiBpbXBsZW1lbnQgQFNlbGVjdCBkZWNvcmF0b3Jcbi8vIHRvZG86IGFkZCBzZWxlY3QgYW5kIG1hcCBmdW5jdGlvbnNcbi8vIHRvZG86IGltcGxlbWVudCByZWxhdGlvbi9lbnRpdHkgbG9hZGluZyBhbmQgc2V0dGluZyB0aGVtIGludG8gcHJvcGVydGllcyB3aXRoaW4gYSBzZXBhcmF0ZSBxdWVyeVxuLy8gLmxvYWRBbmRNYXAoXCJwb3N0LmNhdGVnb3JpZXNcIiwgXCJwb3N0LmNhdGVnb3JpZXNcIiwgcWIgPT4gLi4uKVxuLy8gLmxvYWRBbmRNYXAoXCJwb3N0LmNhdGVnb3JpZXNcIiwgQ2F0ZWdvcnksIHFiID0+IC4uLilcbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG52YXIgUXVlcnlCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5QnVpbGRlciBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSBnaXZlbiBDb25uZWN0aW9uIGFuZCBRdWVyeVJ1bm5lciBvYmplY3RzIG9yIGZyb20gZ2l2ZW4gb3RoZXIgUXVlcnlCdWlsZGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFF1ZXJ5QnVpbGRlcihjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNZW1vIHRvIGhlbHAga2VlcCBwbGFjZSBvZiBjdXJyZW50IHBhcmFtZXRlciBpbmRleCBmb3IgYGNyZWF0ZVBhcmFtZXRlcmBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyYW1ldGVySW5kZXggPSAwO1xuICAgICAgICBpZiAoY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyIGluc3RhbmNlb2YgUXVlcnlCdWlsZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIuY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIucXVlcnlSdW5uZXI7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbk1hcCh0aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUJ1aWxkZXIucHJvdG90eXBlLCBcImFsaWFzXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWFpbiBhbGlhcyBzdHJpbmcgdXNlZCBpbiB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTWFpbiBhbGlhcyBpcyBub3Qgc2V0XCIpOyAvLyB0b2RvOiBiZXR0ZXIgZXhjZXB0aW9uXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgc2VsZWN0aW9uQWxpYXNOYW1lKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInNlbGVjdFwiO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cyA9IHNlbGVjdGlvbi5tYXAoZnVuY3Rpb24gKHNlbGVjdGlvbikgeyByZXR1cm4gKHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24gfSk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSBbeyBzZWxlY3Rpb246IHNlbGVjdGlvbiwgYWxpYXNOYW1lOiBzZWxlY3Rpb25BbGlhc05hbWUgfV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBTZWxlY3RRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9TZWxlY3RRdWVyeUJ1aWxkZXJcIikuU2VsZWN0UXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgSU5TRVJUIHF1ZXJ5LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID0gXCJpbnNlcnRcIjtcbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBJbnNlcnRRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9JbnNlcnRRdWVyeUJ1aWxkZXJcIikuSW5zZXJ0UXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEluc2VydFF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgVVBEQVRFIHF1ZXJ5IGFuZCBhcHBsaWVzIGdpdmVuIHVwZGF0ZSB2YWx1ZXMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQsIG1heWJlVXBkYXRlU2V0KSB7XG4gICAgICAgIHZhciB1cGRhdGVTZXQgPSBtYXliZVVwZGF0ZVNldCA/IG1heWJlVXBkYXRlU2V0IDogZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQ7XG4gICAgICAgIGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0ID0gZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgPyBlbnRpdHlPclRhYmxlTmFtZVVwZGF0ZVNldC5vcHRpb25zLm5hbWUgOiBlbnRpdHlPclRhYmxlTmFtZVVwZGF0ZVNldDtcbiAgICAgICAgaWYgKGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHlwZW9mIGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQpO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNldE1haW5BbGlhcyhtYWluQWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInVwZGF0ZVwiO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdXBkYXRlU2V0O1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFVwZGF0ZVF1ZXJ5QnVpbGRlckNscyA9IHJlcXVpcmUoXCIuL1VwZGF0ZVF1ZXJ5QnVpbGRlclwiKS5VcGRhdGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVXBkYXRlUXVlcnlCdWlsZGVyQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBERUxFVEUgcXVlcnkuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcImRlbGV0ZVwiO1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIERlbGV0ZVF1ZXJ5QnVpbGRlckNscyA9IHJlcXVpcmUoXCIuL0RlbGV0ZVF1ZXJ5QnVpbGRlclwiKS5EZWxldGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGVsZXRlUXVlcnlCdWlsZGVyQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zb2Z0RGVsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID0gXCJzb2Z0LWRlbGV0ZVwiO1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9Tb2Z0RGVsZXRlUXVlcnlCdWlsZGVyXCIpLlNvZnREZWxldGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHModGhpcyk7XG4gICAgfTtcbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInJlc3RvcmVcIjtcbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyQ2xzID0gcmVxdWlyZShcIi4vU29mdERlbGV0ZVF1ZXJ5QnVpbGRlclwiKS5Tb2Z0RGVsZXRlUXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBlbnRpdHkncyByZWxhdGlvbiB3aXRoIHdoaWNoIHRoaXMgcXVlcnkgYnVpbGRlciBnb25uYSB3b3JrLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmVsYXRpb24gPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0T3JQcm9wZXJ0eVBhdGgsIG1heWJlUHJvcGVydHlQYXRoKSB7XG4gICAgICAgIHZhciBlbnRpdHlUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gZW50aXR5VGFyZ2V0T3JQcm9wZXJ0eVBhdGggOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gbWF5YmVQcm9wZXJ0eVBhdGggOiBlbnRpdHlUYXJnZXRPclByb3BlcnR5UGF0aDtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9IFwicmVsYXRpb25cIjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoO1xuICAgICAgICBpZiAoZW50aXR5VGFyZ2V0KSB7XG4gICAgICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFJlbGF0aW9uUXVlcnlCdWlsZGVyQ2xzID0gcmVxdWlyZShcIi4vUmVsYXRpb25RdWVyeUJ1aWxkZXJcIikuUmVsYXRpb25RdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVsYXRpb25RdWVyeUJ1aWxkZXJDbHMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvblF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiByZWxhdGlvbiBvciByZWxhdGlvbnMgZXhpc3QgaW4gdGhlIGVudGl0eS5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVsYXRpb24gZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiB0b2RvOiBtb3ZlIHRoaXMgbWV0aG9kIHRvIG1hbmFnZXI/IG9yIGNyZWF0ZSBhIHNob3J0Y3V0P1xuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaGFzUmVsYXRpb24gPSBmdW5jdGlvbiAodGFyZ2V0LCByZWxhdGlvbikge1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgdmFyIHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocmVsYXRpb24pID8gcmVsYXRpb24gOiBbcmVsYXRpb25dO1xuICAgICAgICByZXR1cm4gcmVsYXRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICEhZW50aXR5TWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIHBhcmFtZXRlciBmb3IgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaGFzUGFyYW1ldGVyID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNQYXJhbWV0ZXIoa2V5KSkgfHwga2V5IGluIHRoaXMuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBwYXJhbWV0ZXIgbmFtZSBhbmQgaXRzIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhlIGtleSBmb3IgdGhpcyBwYXJhbWV0ZXJlIG1heSBjb250YWluIG51bWJlcnMsIGxldHRlcnMsIHVuZGVyc2NvcmVzLCBvciBwZXJpb2RzLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0UGFyYW1ldGVyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJGdW5jdGlvbiBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGluIHRoZSBwYXJhbWV0ZXJzLiBQbGVhc2UgY2hlY2sgXFxcIlwiICsga2V5ICsgXCJcXFwiIHBhcmFtZXRlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFrZXkubWF0Y2goL14oW0EtWmEtejAtOV8uXSspJC8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUXVlcnlCdWlsZGVyIHBhcmFtZXRlciBrZXlzIG1heSBvbmx5IGNvbnRhaW4gbnVtYmVycywgbGV0dGVycywgdW5kZXJzY29yZXMsIG9yIHBlcmlvZHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudFF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIuc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkKF9jLnZhbHVlLCAyKSwga2V5ID0gX2RbMF0sIHZhbHVlID0gX2RbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlUGFyYW1ldGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gXCJvcm1fcGFyYW1fXCIgKyB0aGlzLnBhcmFtZXRlckluZGV4Kys7XG4gICAgICAgIH0gd2hpbGUgKHRoaXMuaGFzUGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gXCI6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuYXRpdmUgcGFyYW1ldGVycyBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYHNldFBhcmFtZXRlcnNgIGluc3RlYWRcbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldE5hdGl2ZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBzZXQgcGFyZW50IHF1ZXJ5IGJ1aWxkZXIgcGFyYW1ldGVycyBhcyB3ZWxsIGluIHN1Yi1xdWVyeSBtb2RlXG4gICAgICAgIGlmICh0aGlzLnBhcmVudFF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIuc2V0TmF0aXZlUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVyc1trZXldID0gcGFyYW1ldGVyc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmV4cHJlc3Npb25NYXAucGFyYW1ldGVycyk7XG4gICAgICAgIC8vIGFkZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBwYXJhbWV0ZXIgaWYgaXQgZXhpc3RcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uICYmIG1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG1ldGFkYXRhLmNoaWxkRW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkTWV0YWRhdGEpIHsgcmV0dXJuIGNoaWxkTWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbjsgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY2hpbGRNZXRhZGF0YSkgeyByZXR1cm4gY2hpbGRNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWU7IH0pO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcImRpc2NyaW1pbmF0b3JDb2x1bW5WYWx1ZXNcIl0gPSB2YWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmludHMgc3FsIHRvIHN0ZG91dCB1c2luZyBjb25zb2xlLmxvZy5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnByaW50U3FsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHF1ZXJ5ID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBnZW5lcmF0ZWQgc3FsIHRoYXQgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBQYXJhbWV0ZXJzIGluIHRoZSBxdWVyeSBhcmUgZXNjYXBlZCBmb3IgdGhlIGN1cnJlbnRseSB1c2VkIGRyaXZlci5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFNxbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKClbMF07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHF1ZXJ5IHRvIGJlIGV4ZWN1dGVkIHdpdGggYWxsIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFF1ZXJ5QW5kUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcyBleGVjdXRpb24gb3JkZXIgaXMgaW1wb3J0YW50IGJlY2F1c2UgZ2V0UXVlcnkgbWV0aG9kIGdlbmVyYXRlcyB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycyB2YWx1ZXNcbiAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5nZXRRdWVyeSgpO1xuICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGVRdWVyeVdpdGhQYXJhbWV0ZXJzKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBzcWwgZ2VuZXJhdGVkIGJ5IHF1ZXJ5IGJ1aWxkZXIgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNxbCwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsICwgMywgNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9iLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29tcGxldGVseSBuZXcgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBVc2VzIHNhbWUgcXVlcnkgcnVubmVyIGFzIGN1cnJlbnQgUXVlcnlCdWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jb25uZWN0aW9uLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsb25lcyBxdWVyeSBidWlsZGVyIGFzIGl0IGlzLlxuICAgICAqIE5vdGU6IGl0IHVzZXMgbmV3IHF1ZXJ5IHJ1bm5lciwgaWYgeW91IHdhbnQgcXVlcnkgYnVpbGRlciB0aGF0IHVzZXMgZXhhY3RseSBzYW1lIHF1ZXJ5IHJ1bm5lcixcbiAgICAgKiB5b3UgY2FuIGNyZWF0ZSBxdWVyeSBidWlsZGVyIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciwgZm9yIGV4YW1wbGUgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcihxdWVyeUJ1aWxkZXIpXG4gICAgICogd2hlcmUgcXVlcnlCdWlsZGVyIGlzIGNsb25lZCBRdWVyeUJ1aWxkZXIuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jbHVkZXMgYSBRdWVyeSBjb21tZW50IGluIHRoZSBxdWVyeSBidWlsZGVyLiAgVGhpcyBpcyBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsXG4gICAgICogc3VjaCBhcyBmaW5kaW5nIGEgc3BlY2lmaWMgcXVlcnkgaW4gdGhlIGRhdGFiYXNlIHNlcnZlcidzIGxvZ3MsIG9yIGZvciBjYXRlZ29yaXphdGlvbiB1c2luZ1xuICAgICAqIGFuIEFQTSBwcm9kdWN0LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBlc2NhcGluZy5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmRpc2FibGVFc2NhcGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmRpc2FibGVFc2NhcGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGFibGUgbmFtZSwgY29sdW1uIG5hbWUgb3IgYWxpYXMgbmFtZSB1c2luZyBjdXJyZW50IGRhdGFiYXNlJ3MgZXNjYXBpbmcgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAuZGlzYWJsZUVzY2FwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgb3Igb3ZlcnJpZGVzIHF1ZXJ5IGJ1aWxkZXIncyBRdWVyeVJ1bm5lci5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldFF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgbGlzdGVuZXJzIGFuZCBzdWJzY3JpYmVycyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW5kIGFmdGVyIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICAgKiBFbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jYWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlIHRoZSBxdWVyeSB3aWxsIGJlIHdyYXBwZWQgaW50byBhIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUudXNlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGVzY2FwZWQgdGFibGUgbmFtZSB3aXRoIHNjaGVtYSBuYW1lIGlmIFNxbFNlcnZlciBkcml2ZXIgdXNlZCB3aXRoIGN1c3RvbVxuICAgICAqIHNjaGVtYSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyBlc2NhcGVkIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRUYWJsZU5hbWUgPSBmdW5jdGlvbiAodGFibGVQYXRoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0YWJsZVBhdGguc3BsaXQoXCIuXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGNvbmRpdGlvbiBuZWVkIGJlY2F1c2UgaW4gU1FMIFNlcnZlciBkcml2ZXIgd2hlbiBjdXN0b20gZGF0YWJhc2UgbmFtZSB3YXMgc3BlY2lmaWVkIGFuZCBzY2hlbWEgbmFtZSB3YXMgbm90LCB3ZSBnb3QgYGRiTmFtZS4udGFibGVOYW1lYCBzdHJpbmcsIGFuZCBkb2Vzbid0IG5lZWQgdG8gZXNjYXBlIG1pZGRsZSBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgIGlmIChpID09PSBcIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShpKTtcbiAgICAgICAgfSkuam9pbihcIi5cIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIGluc2VydCBzaG91bGQgYmUgcGVyZm9ybWVkLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0TWFpblRhYmxlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aGVyZSB2YWx1ZXMgc2hvdWxkIGJlIGluc2VydGVkIGlzIG5vdCBzcGVjaWZpZWQuIENhbGwgXFxcInFiLmludG8oZW50aXR5KVxcXCIgbWV0aG9kIHRvIHNwZWNpZnkgaXQuXCIpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLnRhYmxlUGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMudGFibGVQYXRoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEZST00gd2hpY2ggZW50aXR5J3MgdGFibGUgc2VsZWN0L3VwZGF0ZS9kZWxldGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBBbHNvIHNldHMgYSBtYWluIHN0cmluZyBhbGlhcyBvZiB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVGcm9tQWxpYXMgPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpIHtcbiAgICAgICAgLy8gaWYgdGFibGUgaGFzIGEgbWV0YWRhdGEgdGhlbiBmaW5kIGl0IHRvIHByb3Blcmx5IGVzY2FwZSBpdHMgcHJvcGVydGllc1xuICAgICAgICAvLyBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmluZChtZXRhZGF0YSA9PiBtZXRhZGF0YS50YWJsZU5hbWUgPT09IHRhYmxlTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEoZW50aXR5VGFyZ2V0KSkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eVRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZyb21cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlUYXJnZXQpLFxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aDogbWV0YWRhdGEudGFibGVQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50aXR5VGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzU3VicXVlcnkgPSBlbnRpdHlUYXJnZXQuc3Vic3RyKDAsIDEpID09PSBcIihcIiAmJiBlbnRpdHlUYXJnZXQuc3Vic3RyKC0xKSA9PT0gXCIpXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZnJvbVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aDogIWlzU3VicXVlcnkgPyBlbnRpdHlUYXJnZXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHN1YlF1ZXJ5OiBpc1N1YnF1ZXJ5ID8gZW50aXR5VGFyZ2V0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5QnVpbGRlciA9IGVudGl0eVRhcmdldCh0aGlzLnN1YlF1ZXJ5KCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgICAgICAgdmFyIHN1YnF1ZXJ5ID0gc3ViUXVlcnlCdWlsZGVyLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZyb21cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IHN1YnF1ZXJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYWxsIGVudGl0eSdzIHByb3BlcnR5TmFtZSB0byBuYW1lIGluIHRoZSBnaXZlbiBzdGF0ZW1lbnQuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5yZXBsYWNlUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9HdWlkZS9SZWd1bGFyX0V4cHJlc3Npb25zI0VzY2FwaW5nXG4gICAgICAgIHZhciBlc2NhcGVSZWdFeHAgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gcy5yZXBsYWNlKC9bLiorXFwtP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7IH07XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgICAgICB2YXIgZV8zLCBfZCwgZV80LCBfZSwgZV81LCBfZiwgZV82LCBfZywgZV83LCBfaCwgZV84LCBfajtcbiAgICAgICAgICAgIGlmICghYWxpYXMuaGFzTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIHZhciByZXBsYWNlQWxpYXNOYW1lUHJlZml4ID0gdGhpc18xLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA/IGFsaWFzLm5hbWUgKyBcIi5cIiA6IFwiXCI7XG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnRBbGlhc05hbWVQcmVmaXggPSB0aGlzXzEuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID8gdGhpc18xLmVzY2FwZShhbGlhcy5uYW1lKSArIFwiLlwiIDogXCJcIjtcbiAgICAgICAgICAgIHZhciByZXBsYWNlbWVudHMgPSB7fTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0ICYgb3ZlcndyaXRlIHRoZSByZXBsYWNlbWVudHMgZnJvbSBsZWFzdCB0byBtb3N0IHJlbGV2YW50IGluIG91ciByZXBsYWNlbWVudHMgb2JqZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRvIGRvIHRoaXMgd2UgaXRlcmF0ZSBhbmQgb3ZlcndyaXRlIGluIHRoZSBvcmRlciBvZiByZWxldmFuY2UuXG4gICAgICAgICAgICAgICAgLy8gTGVhc3QgdG8gTW9zdCBSZWxldmFudDpcbiAgICAgICAgICAgICAgICAvLyAqIFJlbGF0aW9uIFByb3BlcnR5IFBhdGggdG8gZmlyc3Qgam9pbiBjb2x1bW4ga2V5XG4gICAgICAgICAgICAgICAgLy8gKiBSZWxhdGlvbiBQcm9wZXJ0eSBQYXRoICsgQ29sdW1uIFBhdGhcbiAgICAgICAgICAgICAgICAvLyAqIENvbHVtbiBEYXRhYmFzZSBOYW1lXG4gICAgICAgICAgICAgICAgLy8gKiBDb2x1bW4gUHJvcGV0eSBOYW1lXG4gICAgICAgICAgICAgICAgLy8gKiBDb2x1bW4gUHJvcGVydHkgUGF0aFxuICAgICAgICAgICAgICAgIGZvciAodmFyIF9rID0gKGVfMyA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEucmVsYXRpb25zKSksIF9sID0gX2submV4dCgpOyAhX2wuZG9uZTsgX2wgPSBfay5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gX2wudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW3JlbGF0aW9uLnByb3BlcnR5UGF0aF0gPSByZWxhdGlvbi5qb2luQ29sdW1uc1swXS5kYXRhYmFzZU5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfbCAmJiAhX2wuZG9uZSAmJiAoX2QgPSBfay5yZXR1cm4pKSBfZC5jYWxsKF9rKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfbSA9IChlXzQgPSB2b2lkIDAsIF9fdmFsdWVzKGFsaWFzLm1ldGFkYXRhLnJlbGF0aW9ucykpLCBfbyA9IF9tLm5leHQoKTsgIV9vLmRvbmU7IF9vID0gX20ubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IF9vLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3AgPSAoZV81ID0gdm9pZCAwLCBfX3ZhbHVlcyhfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChyZWxhdGlvbi5qb2luQ29sdW1ucyksIGZhbHNlKSwgX19yZWFkKHJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucyksIGZhbHNlKSkpLCBfcSA9IF9wLm5leHQoKTsgIV9xLmRvbmU7IF9xID0gX3AubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW4gPSBfcS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlLZXkgPSByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW3Byb3BlcnR5S2V5XSA9IGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzVfMSkgeyBlXzUgPSB7IGVycm9yOiBlXzVfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3EgJiYgIV9xLmRvbmUgJiYgKF9mID0gX3AucmV0dXJuKSkgX2YuY2FsbChfcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNSkgdGhyb3cgZV81LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9vICYmICFfby5kb25lICYmIChfZSA9IF9tLnJldHVybikpIF9lLmNhbGwoX20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9yID0gKGVfNiA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfcyA9IF9yLm5leHQoKTsgIV9zLmRvbmU7IF9zID0gX3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5kYXRhYmFzZU5hbWVdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV82XzEpIHsgZV82ID0geyBlcnJvcjogZV82XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9zICYmICFfcy5kb25lICYmIChfZyA9IF9yLnJldHVybikpIF9nLmNhbGwoX3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNikgdGhyb3cgZV82LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF90ID0gKGVfNyA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfdSA9IF90Lm5leHQoKTsgIV91LmRvbmU7IF91ID0gX3QubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5wcm9wZXJ0eU5hbWVdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV83XzEpIHsgZV83ID0geyBlcnJvcjogZV83XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF91ICYmICFfdS5kb25lICYmIChfaCA9IF90LnJldHVybikpIF9oLmNhbGwoX3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF92ID0gKGVfOCA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfdyA9IF92Lm5leHQoKTsgIV93LmRvbmU7IF93ID0gX3YubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5wcm9wZXJ0eVBhdGhdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84XzEpIHsgZV84ID0geyBlcnJvcjogZV84XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF93ICYmICFfdy5kb25lICYmIChfaiA9IF92LnJldHVybikpIF9qLmNhbGwoX3YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfOCkgdGhyb3cgZV84LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnRLZXlzID0gT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKTtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UobmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBhIGxvb2tiZWhpbmQgaGVyZSBzaW5jZSBpdCdzIG5vdCB3ZWxsIHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIFwiKFsgPShdfF4uezB9KVwiICtcbiAgICAgICAgICAgICAgICAgICAgKGVzY2FwZVJlZ0V4cChyZXBsYWNlQWxpYXNOYW1lUHJlZml4KSArIFwiKFwiICsgcmVwbGFjZW1lbnRLZXlzLm1hcChlc2NhcGVSZWdFeHApLmpvaW4oXCJ8XCIpICsgXCIpXCIpICtcbiAgICAgICAgICAgICAgICAgICAgXCIoPz1bID0pLF18LnswfSQpXCIsIFwiZ21cIiksIGZ1bmN0aW9uIChfLCBwcmUsIHApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBwcmUgKyByZXBsYWNlbWVudEFsaWFzTmFtZVByZWZpeCArIF90aGlzLmVzY2FwZShyZXBsYWNlbWVudHNbcF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGhpc18xID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5leHByZXNzaW9uTWFwLmFsaWFzZXMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsaWFzID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgX2xvb3BfMShhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBTlNJIFNRTCAyMDAzIHN1cHBvcnQgQyBzdHlsZSBjb21tZW50cyAtIGNvbW1lbnRzIHRoYXQgc3RhcnQgd2l0aCBgLypgIGFuZCBlbmQgd2l0aCBgKi9gXG4gICAgICAgIC8vIEluIHNvbWUgZGlhbGVjdHMgcXVlcnkgbmVzdGluZyBpcyBhdmFpbGFibGUgLSBidXQgbm90IGFsbC4gIEJlY2F1c2Ugb2YgdGhpcywgd2UnbGwgbmVlZFxuICAgICAgICAvLyB0byBzY3J1YiBcImVuZGluZ1wiIGNoYXJhY3RlcnMgZnJvbSB0aGUgU1FMIGJ1dCBvdGhlcndpc2Ugd2UgY2FuIGxlYXZlIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAvLyBhcy1pcyBhbmQgaXQgc2hvdWxkIGJlIHZhbGlkLlxuICAgICAgICByZXR1cm4gXCIvKiBcIiArIHRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50LnJlcGxhY2UoXCIqL1wiLCBcIlwiKSArIFwiICovIFwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIldIRVJFXCIgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVdoZXJlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbnNBcnJheSA9IFtdO1xuICAgICAgICB2YXIgd2hlcmVFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVXaGVyZUNsYXVzZXNFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMpO1xuICAgICAgICBpZiAod2hlcmVFeHByZXNzaW9uLmxlbmd0aCA+IDAgJiYgd2hlcmVFeHByZXNzaW9uICE9PSBcIjE9MVwiKSB7XG4gICAgICAgICAgICBjb25kaXRpb25zQXJyYXkucHVzaCh0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKHdoZXJlRXhwcmVzc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgLy8gQWRkcyB0aGUgZ2xvYmFsIGNvbmRpdGlvbiBvZiBcIm5vbi1kZWxldGVkXCIgZm9yIHRoZSBlbnRpdHkgd2l0aCBkZWxldGUgZGF0ZSBjb2x1bW5zIGluIHNlbGVjdCBxdWVyeS5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcInNlbGVjdFwiICYmICF0aGlzLmV4cHJlc3Npb25NYXAud2l0aERlbGV0ZWQgJiYgbWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgbWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW4pICsgXCIgSVMgTlVMTFwiO1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNBcnJheS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbiAmJiBtZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgbWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbi5kYXRhYmFzZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW4pICsgXCIgSU4gKDouLi5kaXNjcmltaW5hdG9yQ29sdW1uVmFsdWVzKVwiO1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNBcnJheS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb24pO1xuICAgICAgICAgICAgY29uZGl0aW9uc0FycmF5LnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmRpdGlvbnNBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbmRpdGlvbnNBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIiBXSEVSRSBcIiArIGNvbmRpdGlvbnNBcnJheVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIiBXSEVSRSAoIFwiICsgY29uZGl0aW9uc0FycmF5LmpvaW4oXCIgKSBBTkQgKCBcIikgKyBcIiApXCI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJSRVRVUk5JTkdcIiAvIFwiT1VUUFVUXCIgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5nZXRSZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgIHZhciBkcml2ZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyO1xuICAgICAgICAvLyBhbHNvIGFkZCBjb2x1bW5zIHdlIG11c3QgYXV0by1yZXR1cm4gdG8gcGVyZm9ybSBlbnRpdHkgdXBkYXRpb25cbiAgICAgICAgLy8gaWYgdXNlciBnYXZlIGhpcyBvd24gcmV0dXJuaW5nXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBkcml2ZXIuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoLmFwcGx5KGNvbHVtbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnMuaW5kZXhPZihjb2x1bW4pID09PSAtMTtcbiAgICAgICAgICAgIH0pKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zRXhwcmVzc2lvbiA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IF90aGlzLmVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJpbnNlcnRcIiB8fCBfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJ1cGRhdGVcIiB8fCBfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJzb2Z0LWRlbGV0ZVwiIHx8IF90aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcInJlc3RvcmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiSU5TRVJURUQuXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShfdGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIuXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uc0V4cHJlc3Npb24gKz0gXCIgSU5UTyBcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyZWF0ZVBhcmFtZXRlcih7IHR5cGU6IGRyaXZlci5jb2x1bW5UeXBlVG9OYXRpdmVQYXJhbWV0ZXIoY29sdW1uLnR5cGUpLCBkaXI6IGRyaXZlci5vcmFjbGUuQklORF9PVVQgfSk7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcImluc2VydFwiIHx8IHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uc0V4cHJlc3Npb24gKz0gXCIgSU5UTyBAT3V0cHV0VGFibGVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uc0V4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgcmV0dXJuaW5nIC8gb3V0cHV0IGNhdXNlIGlzIHNldCB0byBhcnJheSBvZiBjb2x1bW4gbmFtZXMsXG4gICAgICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgY29sdW1uIG1ldGFkYXRhcyBvZiB0aG9zZSBjb2x1bW4gbmFtZXMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRSZXR1cm5pbmdDb2x1bW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucyA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaC5hcHBseShjb2x1bW5zLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuZmluZENvbHVtbnNXaXRoUHJvcGVydHlQYXRoKGNvbHVtbk5hbWUpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlV2hlcmVDbGF1c2VzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChjbGF1c2VzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjbGF1c2VzLm1hcChmdW5jdGlvbiAoY2xhdXNlLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfdGhpcy5jcmVhdGVXaGVyZUNvbmRpdGlvbkV4cHJlc3Npb24oY2xhdXNlLmNvbmRpdGlvbik7XG4gICAgICAgICAgICBzd2l0Y2ggKGNsYXVzZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImFuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID4gMCA/IFwiQU5EIFwiIDogXCJcIikgKyBleHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvclwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID4gMCA/IFwiT1IgXCIgOiBcIlwiKSArIGV4cHJlc3Npb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgICAgfSkuam9pbihcIiBcIikudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgZ2l2ZW4gd2hlcmUgYXJndW1lbnQgLSB0cmFuc2Zvcm1zIHRvIGEgd2hlcmUgc3RyaW5nIGFsbCBmb3JtcyBpdCBjYW4gdGFrZS5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGFsd2F5c1dyYXApIHtcbiAgICAgICAgaWYgKGFsd2F5c1dyYXAgPT09IHZvaWQgMCkgeyBhbHdheXNXcmFwID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb24pKSB7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjE9MVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgcHJvYmFibHkgcmVtb3ZlIHRoaXMgZW50aXJlIGNvbmRpdGlvblxuICAgICAgICAgICAgLy8gYnV0IGZvciBub3cgdG8gcHJldmVudCBhbnkgYnJlYWtpbmcgY2hhbmdlcyBpdCBleGlzdHMuXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmxlbmd0aCA9PT0gMSAmJiAhYWx3YXlzV3JhcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdoZXJlQ2xhdXNlc0V4cHJlc3Npb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIihcIiArIHRoaXMuY3JlYXRlV2hlcmVDbGF1c2VzRXhwcmVzc2lvbihjb25kaXRpb24pICsgXCIpXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXI7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIFwibGVzc1RoYW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiA8IFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV07XG4gICAgICAgICAgICBjYXNlIFwibGVzc1RoYW5PckVxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgPD0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJtb3JlVGhhblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiID4gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJtb3JlVGhhbk9yRXF1YWxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiA+PSBcIiArIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICAgICAgY2FzZSBcIm5vdEVxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgIT0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJlcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiID0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJpbGlrZVwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBDb2Nrcm9hY2hEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgSUxJS0UgXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVVBQRVIoXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiKSBMSUtFIFVQUEVSKFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV0gKyBcIilcIjtcbiAgICAgICAgICAgIGNhc2UgXCJsaWtlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgTElLRSBcIiArIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICAgICAgY2FzZSBcImJldHdlZW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiBCRVRXRUVOIFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV0gKyBcIiBBTkQgXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1syXTtcbiAgICAgICAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24ucGFyYW1ldGVycy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIwPTFcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgSU4gKFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnMuc2xpY2UoMSkuam9pbihcIiwgXCIpICsgXCIpXCI7XG4gICAgICAgICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgPSBBTlkoXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXSArIFwiKVwiO1xuICAgICAgICAgICAgY2FzZSBcImlzTnVsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgIGNhc2UgXCJub3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJOT1QoXCIgKyB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb24uY29uZGl0aW9uKSArIFwiKVwiO1xuICAgICAgICAgICAgY2FzZSBcImJyYWNrZXRzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb24uY29uZGl0aW9uLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5zdXBwb3J0ZWQgRmluZE9wZXJhdG9yIFwiICsgRmluZE9wZXJhdG9yLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIldIRVJFXCIgY29uZGl0aW9uIGZvciBhbiBpbi1pZHMgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbiA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICB2YXIgbm9ybWFsaXplZCA9IChBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXSkubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gbWV0YWRhdGEuZW5zdXJlRW50aXR5SWRNYXAoaWQpOyB9KTtcbiAgICAgICAgLy8gdXNpbmcgaW4oLi4uaWRzKSBmb3Igc2luZ2xlIHByaW1hcnkga2V5IGVudGl0aWVzXG4gICAgICAgIGlmICghbWV0YWRhdGEuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cykge1xuICAgICAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5fMSA9IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdO1xuICAgICAgICAgICAgLy8gZ2V0RW50aXR5VmFsdWUgd2lsbCB0cnkgdG8gdHJhbnNmb3JtIGBJbmAsIGl0IGlzIGEgYnVnXG4gICAgICAgICAgICAvLyB0b2RvOiByZW1vdmUgdGhpcyB0cmFuc2Zvcm1lciBjaGVjayBhZnRlciAjMjM5MCBpcyBmaXhlZFxuICAgICAgICAgICAgLy8gVGhpcyBhbHNvIGZhaWxzIGZvciBlbWJlZGRlZCAmIHJlbGF0aW9uLCBzbyB1bnRpbCB0aGF0IGlzIGZpeGVkIHNraXAgaXQuXG4gICAgICAgICAgICBpZiAoIXByaW1hcnlDb2x1bW5fMS50cmFuc2Zvcm1lciAmJiAhcHJpbWFyeUNvbHVtbl8xLnJlbGF0aW9uTWV0YWRhdGEgJiYgIXByaW1hcnlDb2x1bW5fMS5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgIF9hW3ByaW1hcnlDb2x1bW5fMS5wcm9wZXJ0eU5hbWVdID0gSW4obm9ybWFsaXplZC5tYXAoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBwcmltYXJ5Q29sdW1uXzEuZ2V0RW50aXR5VmFsdWUoaWQsIGZhbHNlKTsgfSkpLFxuICAgICAgICAgICAgICAgICAgICBfYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEJyYWNrZXRzKGZ1bmN0aW9uIChxYikge1xuICAgICAgICAgICAgdmFyIGVfOSwgX2E7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcWIub3JXaGVyZShuZXcgQnJhY2tldHMoZnVuY3Rpb24gKHFiKSB7IHJldHVybiBxYi53aGVyZShkYXRhKTsgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbm9ybWFsaXplZF8xID0gX192YWx1ZXMobm9ybWFsaXplZCksIG5vcm1hbGl6ZWRfMV8xID0gbm9ybWFsaXplZF8xLm5leHQoKTsgIW5vcm1hbGl6ZWRfMV8xLmRvbmU7IG5vcm1hbGl6ZWRfMV8xID0gbm9ybWFsaXplZF8xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG5vcm1hbGl6ZWRfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzlfMSkgeyBlXzkgPSB7IGVycm9yOiBlXzlfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZF8xXzEgJiYgIW5vcm1hbGl6ZWRfMV8xLmRvbmUgJiYgKF9hID0gbm9ybWFsaXplZF8xLnJldHVybikpIF9hLmNhbGwobm9ybWFsaXplZF8xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZmluZENvbHVtbnNGb3JQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG4gICAgICAgIC8vIE1ha2UgYSBoZWxwZXIgdG8gaXRlcmF0ZSB0aGUgZW50aXR5ICYgcmVsYXRpb25zP1xuICAgICAgICAvLyBVc2UgdGhhdCB0byBzZXQgdGhlIGNvcnJlY3QgYWxpYXM/ICBPciB0aGUgb3RoZXIgd2F5IGFyb3VuZD9cbiAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGUgbWFpbiBhbGlhcyB3aXRoIG91ciBwcm9wZXJ0eSBwYXRoc1xuICAgICAgICB2YXIgYWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzO1xuICAgICAgICB2YXIgcm9vdCA9IFtdO1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcHJvcGVydHlQYXRoUGFydHNbMF07XG4gICAgICAgICAgICBpZiAoIShhbGlhcyA9PT0gbnVsbCB8fCBhbGlhcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWxpYXMuaGFzTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGlhcy5tZXRhZGF0YS5oYXNFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocGFydCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGVtYmVkZGVkIHRoZW4gd2Ugc2hvdWxkIGNvbWJpbmUgdGhlIHR3byBhcyBwYXJ0IG9mIG91ciBsb29rdXAuXG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBqdXN0IGJyZWFraW5nLCB3ZSBrZWVwIGdvaW5nIHdpdGggdGhpcyBpbiBjYXNlIHRoZXJlJ3MgYW4gZW1iZWRkZWQvcmVsYXRpb25cbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gZW1iZWRkZWQuXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoUGFydHMudW5zaGlmdChwcm9wZXJ0eVBhdGhQYXJ0cy5zaGlmdCgpICsgXCIuXCIgKyBwcm9wZXJ0eVBhdGhQYXJ0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsaWFzLm1ldGFkYXRhLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwYXJ0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZWxhdGlvbiB0aGVuIHdlIHNob3VsZCBmaW5kIHRoZSBhbGlhc2VzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaCB0aGUgcmVsYXRpb24gJiB0aGVuIGNvbnRpbnVlIGZ1cnRoZXIgZG93blxuICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBwYXRoXG4gICAgICAgICAgICAgICAgdmFyIGpvaW5BdHRyID0gdGhpc18yLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMuZmluZChmdW5jdGlvbiAoam9pbkF0dHIpIHsgcmV0dXJuIGpvaW5BdHRyLnJlbGF0aW9uUHJvcGVydHlQYXRoID09PSBwYXJ0OyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIShqb2luQXR0ciA9PT0gbnVsbCB8fCBqb2luQXR0ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogam9pbkF0dHIuYWxpYXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmdWxsUmVsYXRpb25QYXRoID0gcm9vdC5sZW5ndGggPiAwID8gcm9vdC5qb2luKFwiLlwiKSArIFwiLlwiICsgcGFydCA6IHBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGFsaWFzIGZvciByZWxhdGlvbiBhdCBcIiArIGZ1bGxSZWxhdGlvblBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbGlhcyA9IGpvaW5BdHRyLmFsaWFzO1xuICAgICAgICAgICAgICAgIHJvb3QucHVzaC5hcHBseShyb290LCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocGFydC5zcGxpdChcIi5cIikpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aFBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0aGlzXzIgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocHJvcGVydHlQYXRoUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8zKCk7XG4gICAgICAgICAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWxpYXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGFsaWFzIGZvciBwcm9wZXJ0eSBcIiArIHByb3BlcnR5UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtYWluaW5nIHBhcnRzIGFyZSBjb21iaW5lZCBiYWNrIGFuZCB1c2VkIHRvIGZpbmQgdGhlIGFjdHVhbCBwcm9wZXJ0eSBwYXRoXG4gICAgICAgIHZhciBhbGlhc1Byb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aFBhcnRzLmpvaW4oXCIuXCIpO1xuICAgICAgICB2YXIgY29sdW1ucyA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChhbGlhc1Byb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb2x1bW5Ob3RGb3VuZChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYWxpYXMsIHJvb3QsIGNvbHVtbnNdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByb3BlcnR5IHBhdGhzIGZvciBhIGdpdmVuIE9iamVjdExpdGVyYWwuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAobWV0YWRhdGEsIGVudGl0eSwgcHJlZml4KSB7XG4gICAgICAgIHZhciBlXzEwLCBfYTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdm9pZCAwKSB7IHByZWZpeCA9IFwiXCI7IH1cbiAgICAgICAgdmFyIHBhdGhzID0gW107XG4gICAgICAgIHZhciBfbG9vcF80ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHBhdGggPSBwcmVmaXggPyBwcmVmaXggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICAgICAgICAgIC8vIFRoZXJlJ3MgdGltZXMgd2hlcmUgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byB0cmF2ZXJzZSBkZWVwZXIuXG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBgRmluZE9wZXJhdG9yYCwgb3IgbnVsbCwgb3Igbm90IGFuIG9iamVjdCwgdGhlbiB3ZSBkb24ndCwgZm9yIGV4YW1wbGUuXG4gICAgICAgICAgICBpZiAoZW50aXR5W2tleV0gPT09IG51bGwgfHwgdHlwZW9mIGVudGl0eVtrZXldICE9PSBcIm9iamVjdFwiIHx8IGVudGl0eVtrZXldIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmhhc0VtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJQYXRocyA9IHRoaXNfMy5jcmVhdGVQcm9wZXJ0eVBhdGgobWV0YWRhdGEsIGVudGl0eVtrZXldLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBwYXRocy5wdXNoLmFwcGx5KHBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViUGF0aHMpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuaGFzUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwYXRoKTtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFsc28gY2FzZXMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gYmFjayBhbGwgb2YgdGhlIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHNvbWVvbmUgcGFzc2VzIHRoZSBtb2RlbCAmIHdlIGRvbid0IG5lZWQgdG8gbWFrZVxuICAgICAgICAgICAgICAgIC8vIGEgSFVHRSBgd2hlcmVgIHRvIHVuaXF1ZWx5IGxvb2sgdXAgdGhlIGVudGl0eS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhICotdG8tb25lLCB0aGVyZSdzIG9ubHkgZXZlciBvbmUgcG9zc2libGUgZW50aXR5IG9uIHRoZSBvdGhlciBzaWRlXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgdGhlIGpvaW4gY29sdW1ucyBhcmUgYWxsIGRlZmluZWQgd2UgY2FuIHJldHVybiBqdXN0IHRoZSByZWxhdGlvbiBpdHNlbGZcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGl0IHdpbGwgZmV0Y2ggb25seSB0aGUgam9pbiBjb2x1bW5zIGFuZCBkbyB0aGUgbG9va3VwLlxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFwib25lLXRvLW9uZVwiIHx8IHJlbGF0aW9uLnJlbGF0aW9uVHlwZSA9PT0gXCJtYW55LXRvLW9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChqKSB7IHJldHVybiBqLnJlZmVyZW5jZWRDb2x1bW47IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChqKSB7IHJldHVybiAhIWo7IH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzQWxsSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5sZW5ndGggPiAwICYmIGpvaW5Db2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHlba2V5XSwgZmFsc2UpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FsbEpvaW5Db2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBcIm9uZS10by1tYW55XCIgfHwgcmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBcIm1hbnktdG8tbWFueVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBxdWVyeSBhY3Jvc3MgXCIgKyByZWxhdGlvbi5yZWxhdGlvblR5cGUgKyBcIiBmb3IgcHJvcGVydHkgXCIgKyBwYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRm9yIGFueSBvdGhlciBjYXNlLCBpZiB0aGUgYGVudGl0eVtrZXldYCBjb250YWlucyBhbGwgb2YgdGhlIHByaW1hcnkga2V5cyB3ZSBjYW4gZG8gYVxuICAgICAgICAgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlc2UuICBXZSBkb24ndCBuZWVkIHRvIGxvb2sgdXAgdmlhIGFueSBvdGhlciB2YWx1ZXMgJ2NhdXNlIHRoZXNlIGFyZVxuICAgICAgICAgICAgICAgIC8vIHRoZSB1bmlxdWUgcHJpbWFyeSBrZXlzLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHNvbWVvbmUgcGFzc2VzIHRoZSBtb2RlbCAmIHdlIGRvbid0IG5lZWQgdG8gbWFrZVxuICAgICAgICAgICAgICAgIC8vIGEgSFVHRSB3aGVyZS5cbiAgICAgICAgICAgICAgICB2YXIgcHJpbWFyeUNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgdmFyIGhhc0FsbFByaW1hcnlLZXlzID0gcHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCAmJiBwcmltYXJ5Q29sdW1ucy5ldmVyeShmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W2tleV0sIGZhbHNlKTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0FsbFByaW1hcnlLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJQYXRoc18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIHBhdGggKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoLmFwcGx5KHBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViUGF0aHNfMSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgZWxzZSwganVzdCByZXR1cm4gZXZlcnkgcHJvcGVydHkgdGhhdCdzIGJlaW5nIHBhc3NlZCB0byB1cy5cbiAgICAgICAgICAgICAgICB2YXIgc3ViUGF0aHMgPSB0aGlzXzMuY3JlYXRlUHJvcGVydHlQYXRoKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgZW50aXR5W2tleV0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHBhdGggKyBcIi5cIiArIHA7IH0pO1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2guYXBwbHkocGF0aHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzdWJQYXRocyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0aGlzXzMgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhlbnRpdHkpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBfbG9vcF80KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTBfMSkgeyBlXzEwID0geyBlcnJvcjogZV8xMF8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMCkgdGhyb3cgZV8xMC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRocztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UHJlZGljYXRlcyA9IGZ1bmN0aW9uICh3aGVyZSkge1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRocywgcHJvcGVydHlQYXRoc18xLCBwcm9wZXJ0eVBhdGhzXzFfMSwgcHJvcGVydHlQYXRoLCBfYSwgYWxpYXMsIGFsaWFzUHJvcGVydHlQYXRoLCBjb2x1bW5zLCBjb2x1bW5zXzEsIGNvbHVtbnNfMV8xLCBjb2x1bW4sIGNvbnRhaW5lZFdoZXJlLCBhbGlhc1Byb3BlcnR5UGF0aF8xLCBhbGlhc1Byb3BlcnR5UGF0aF8xXzEsIHBhcnQsIGFsaWFzUGF0aCwgcGFyYW1ldGVyVmFsdWUsIGVfMTFfMSwgZV8xMl8xLCBfYiwgX2MsIGtleSwgcGFyYW1ldGVyVmFsdWUsIGFsaWFzUGF0aCwgZV8xM18xO1xuICAgICAgICB2YXIgZV8xMiwgX2QsIGVfMTEsIF9lLCBlXzE0LCBfZiwgZV8xMywgX2c7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2gubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhzID0gdGhpcy5jcmVhdGVQcm9wZXJ0eVBhdGgodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgd2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzEsIDEyLCAxMywgMTRdKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoc18xID0gX192YWx1ZXMocHJvcGVydHlQYXRocyksIHByb3BlcnR5UGF0aHNfMV8xID0gcHJvcGVydHlQYXRoc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhcHJvcGVydHlQYXRoc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGhzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQodGhpcy5maW5kQ29sdW1uc0ZvclByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpLCAzKSwgYWxpYXMgPSBfYVswXSwgYWxpYXNQcm9wZXJ0eVBhdGggPSBfYVsxXSwgY29sdW1ucyA9IF9hWzJdO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzMsIDgsIDksIDEwXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMSA9IChlXzExID0gdm9pZCAwLCBfX3ZhbHVlcyhjb2x1bW5zKSksIGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY29sdW1uc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZWRXaGVyZSA9IHdoZXJlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhbGlhc1Byb3BlcnR5UGF0aF8xID0gKGVfMTQgPSB2b2lkIDAsIF9fdmFsdWVzKGFsaWFzUHJvcGVydHlQYXRoKSksIGFsaWFzUHJvcGVydHlQYXRoXzFfMSA9IGFsaWFzUHJvcGVydHlQYXRoXzEubmV4dCgpOyAhYWxpYXNQcm9wZXJ0eVBhdGhfMV8xLmRvbmU7IGFsaWFzUHJvcGVydHlQYXRoXzFfMSA9IGFsaWFzUHJvcGVydHlQYXRoXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IGFsaWFzUHJvcGVydHlQYXRoXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lZFdoZXJlIHx8ICEocGFydCBpbiBjb250YWluZWRXaGVyZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkV2hlcmUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZFdoZXJlID0gY29udGFpbmVkV2hlcmVbcGFydF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTRfMSkgeyBlXzE0ID0geyBlcnJvcjogZV8xNF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc1Byb3BlcnR5UGF0aF8xXzEgJiYgIWFsaWFzUHJvcGVydHlQYXRoXzFfMS5kb25lICYmIChfZiA9IGFsaWFzUHJvcGVydHlQYXRoXzEucmV0dXJuKSkgX2YuY2FsbChhbGlhc1Byb3BlcnR5UGF0aF8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xNCkgdGhyb3cgZV8xNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLm5hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGggOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoY29udGFpbmVkV2hlcmUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBbYWxpYXNQYXRoLCBwYXJhbWV0ZXJWYWx1ZV1dO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zXzFfMSA9IGNvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgZV8xMV8xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBlXzExID0geyBlcnJvcjogZV8xMV8xIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uc18xXzEgJiYgIWNvbHVtbnNfMV8xLmRvbmUgJiYgKF9lID0gY29sdW1uc18xLnJldHVybikpIF9lLmNhbGwoY29sdW1uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTEpIHRocm93IGVfMTEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhzXzFfMSA9IHByb3BlcnR5UGF0aHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6IHJldHVybiBbMyAvKmJyZWFrKi8sIDE0XTtcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBlXzEyXzEgPSBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGVfMTIgPSB7IGVycm9yOiBlXzEyXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTRdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlQYXRoc18xXzEgJiYgIXByb3BlcnR5UGF0aHNfMV8xLmRvbmUgJiYgKF9kID0gcHJvcGVydHlQYXRoc18xLnJldHVybikpIF9kLmNhbGwocHJvcGVydHlQYXRoc18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzMgLypicmVhayovLCAyMl07XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFsxNSwgMjAsIDIxLCAyMl0pO1xuICAgICAgICAgICAgICAgICAgICBfYiA9IF9fdmFsdWVzKE9iamVjdC5rZXlzKHdoZXJlKSksIF9jID0gX2IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE2O1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIGlmICghIV9jLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE5XTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gd2hlcmVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoID0gdGhpcy5leHByZXNzaW9uTWFwLmFsaWFzTmFtZVByZWZpeGluZ0VuYWJsZWQgPyB0aGlzLmFsaWFzICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFthbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlXV07XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE4O1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIF9jID0gX2IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgY2FzZSAxOTogcmV0dXJuIFszIC8qYnJlYWsqLywgMjJdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIGVfMTNfMSA9IF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZV8xMyA9IHsgZXJyb3I6IGVfMTNfMSB9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMl07XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2cgPSBfYi5yZXR1cm4pKSBfZy5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTMpIHRocm93IGVfMTMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDIyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbiA9IGZ1bmN0aW9uIChhbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlKSB7XG4gICAgICAgIHZhciBlXzE1LCBfYTtcbiAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLnVzZVBhcmFtZXRlcikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS5vYmplY3RMaXRlcmFsUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyVmFsdWUub2JqZWN0TGl0ZXJhbFBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbWV0ZXJWYWx1ZS5tdWx0aXBsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMocGFyYW1ldGVyVmFsdWUudmFsdWUpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2godGhpcy5jcmVhdGVQYXJhbWV0ZXIodikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzE1XzEpIHsgZV8xNSA9IHsgZXJyb3I6IGVfMTVfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTUpIHRocm93IGVfMTUuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHRoaXMuY3JlYXRlUGFyYW1ldGVyKHBhcmFtZXRlclZhbHVlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLnR5cGUgPT09IFwicmF3XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyVmFsdWUuZ2V0U3FsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJWYWx1ZS5nZXRTcWwoYWxpYXNQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJlcXVhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbWV0ZXJWYWx1ZS50eXBlID09PSBcIm5vdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogcGFyYW1ldGVyVmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbihhbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJub3RFcXVhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogX19zcHJlYWRBcnJheShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBdLCBfX3JlYWQocGFyYW1ldGVycyksIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBwYXJhbWV0ZXJWYWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBfX3NwcmVhZEFycmF5KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aFxuICAgICAgICAgICAgICAgICAgICBdLCBfX3JlYWQocGFyYW1ldGVycyksIGZhbHNlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyYW1ldGVyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiaXNOdWxsXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXF1YWxcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQYXJhbWV0ZXIocGFyYW1ldGVyVmFsdWUpLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0V2hlcmVDb25kaXRpb24gPSBmdW5jdGlvbiAod2hlcmUpIHtcbiAgICAgICAgdmFyIGVfMTYsIF9hLCBlXzE3LCBfYjtcbiAgICAgICAgaWYgKHR5cGVvZiB3aGVyZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHdoZXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aGVyZSBpbnN0YW5jZW9mIEJyYWNrZXRzKSB7XG4gICAgICAgICAgICB2YXIgd2hlcmVRdWVyeUJ1aWxkZXIgPSB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICAgICAgICAgICAgd2hlcmVRdWVyeUJ1aWxkZXIucGFyZW50UXVlcnlCdWlsZGVyID0gdGhpcztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkO1xuICAgICAgICAgICAgd2hlcmVRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzID0gdGhpcy5leHByZXNzaW9uTWFwLnBhcmFtZXRlcnM7XG4gICAgICAgICAgICB3aGVyZVF1ZXJ5QnVpbGRlci5leHByZXNzaW9uTWFwLm5hdGl2ZVBhcmFtZXRlcnMgPSB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW107XG4gICAgICAgICAgICB3aGVyZS53aGVyZUZhY3Rvcnkod2hlcmVRdWVyeUJ1aWxkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJicmFja2V0c1wiLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogd2hlcmVRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC53aGVyZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdoZXJlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB3aGVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2hlcmVzID0gQXJyYXkuaXNBcnJheSh3aGVyZSkgPyB3aGVyZSA6IFt3aGVyZV07XG4gICAgICAgIHZhciBjbGF1c2VzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciB3aGVyZXNfMSA9IF9fdmFsdWVzKHdoZXJlcyksIHdoZXJlc18xXzEgPSB3aGVyZXNfMS5uZXh0KCk7ICF3aGVyZXNfMV8xLmRvbmU7IHdoZXJlc18xXzEgPSB3aGVyZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2hlcmVfMSA9IHdoZXJlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgdGhlIGNvbmRpdGlvbnMgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVyIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IChlXzE3ID0gdm9pZCAwLCBfX3ZhbHVlcyh0aGlzLmdldFByZWRpY2F0ZXMod2hlcmVfMSkpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lID0gX19yZWFkKF9kLnZhbHVlLCAyKSwgYWxpYXNQYXRoID0gX2VbMF0sIHBhcmFtZXRlclZhbHVlID0gX2VbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlUHJlZGljYXRlQ29uZGl0aW9uKGFsaWFzUGF0aCwgcGFyYW1ldGVyVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTdfMSkgeyBlXzE3ID0geyBlcnJvcjogZV8xN18xIH07IH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTcpIHRocm93IGVfMTcuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhdXNlcy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IGNvbmRpdGlvbnMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTZfMSkgeyBlXzE2ID0geyBlcnJvcjogZV8xNl8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZXNfMV8xICYmICF3aGVyZXNfMV8xLmRvbmUgJiYgKF9hID0gd2hlcmVzXzEucmV0dXJuKSkgX2EuY2FsbCh3aGVyZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTYpIHRocm93IGVfMTYuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhdXNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGF1c2VzWzBdLmNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhdXNlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZXhlY3V0ZSBzcWwgcXVlcmllcyBpbnNpZGUgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2J0YWluUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIH07XG4gICAgcmV0dXJuIFF1ZXJ5QnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEhlbHBlciB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgUXVlcnlCdWlsZGVyLlxuICovXG52YXIgUXVlcnlCdWlsZGVyVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVlcnlCdWlsZGVyVXRpbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eSxcbiAgICAgKiBlLmcuIFwicG9zdC5jYXRlZ29yeVwiIG9yIFwicG9zdC5pZFwiLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgLy8gYWxpYXMgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZyBhbmQgbXVzdCBoYXZlIGEgZG90IHNlcGFyYXRvclxuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIuaW5kZXhPZihcIi5cIikgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBleHRyYSBhbGlhcyBhbmQgaXRzIHByb3BlcnR5IHJlbGF0aW9uXG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChzdHIuc3BsaXQoXCIuXCIpLCAyKSwgYWxpYXNOYW1lID0gX2FbMF0sIHByb3BlcnR5TmFtZSA9IF9hWzFdOyAvLyB0b2RvOiB3aGF0IGFib3V0IHJlbGF0aW9ucyBpbiBlbWJlZGRlZD9cbiAgICAgICAgaWYgKCFhbGlhc05hbWUgfHwgIXByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYWxpYXMgYW5kIHByb3BlcnR5IG11c3QgYmUgcmVwcmVzZW50ZWQgaW4gYSBzcGVjaWFsIGZvcm1hdFxuICAgICAgICAvLyBjb25zdCBhbGlhc05hbWVSZWdleHAgPSAvXlthLXpBLVowLTlfLV0rJC87XG4gICAgICAgIC8vIGlmICghYWxpYXNOYW1lUmVnZXhwLnRlc3QoYWxpYXNOYW1lKSB8fCAhYWxpYXNOYW1lUmVnZXhwLnRlc3QocHJvcGVydHlOYW1lKSlcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHN0cmluZyBpcyBub3QgYSBzdWJxdWVyeVxuICAgICAgICBpZiAoc3RyLmluZGV4T2YoXCIoXCIpICE9PSAtMSB8fCBzdHIuaW5kZXhPZihcIilcIikgIT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXJVdGlscztcbn0oKSk7XG5leHBvcnQgeyBRdWVyeUJ1aWxkZXJVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUJ1aWxkZXJVdGlscy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFsaWFzIH0gZnJvbSBcIi4vQWxpYXNcIjtcbmltcG9ydCB7IEpvaW5BdHRyaWJ1dGUgfSBmcm9tIFwiLi9Kb2luQXR0cmlidXRlXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBDb250YWlucyBhbGwgcHJvcGVydGllcyBvZiB0aGUgUXVlcnlCdWlsZGVyIHRoYXQgbmVlZHMgdG8gYmUgYnVpbGQgYSBmaW5hbCBxdWVyeS5cbiAqL1xudmFyIFF1ZXJ5RXhwcmVzc2lvbk1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUXVlcnlFeHByZXNzaW9uTWFwKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgUXVlcnlCdWlsZGVyIHVzZWQgdG8gc2VsZWN0IGVudGl0aWVzIGFuZCBub3QgYSByYXcgcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBhbGlhc2VzIChpbmNsdWRpbmcgbWFpbiBhbGlhcykgdXNlZCBpbiB0aGUgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlcHJlc2VudHMgcXVlcnkgdHlwZS4gUXVlcnlCdWlsZGVyIGlzIGFibGUgdG8gYnVpbGQgU0VMRUNULCBVUERBVEUgYW5kIERFTEVURSBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBcInNlbGVjdFwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGF0YSBuZWVkcyB0byBiZSBTRUxFQ1QtZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbGVjdHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1heCBleGVjdXRpb24gdGltZSBpbiBtaWxsaXNlY29uZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWF4RXhlY3V0aW9uVGltZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIFNFTEVDVCBpcyBESVNUSU5DVC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0RGlzdGluY3QgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNFTEVDVCBESVNUSU5DVCBPTiBxdWVyeSAocG9zdGdyZXMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3REaXN0aW5jdE9uID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHRyYSByZXR1cm5pbmcgY29sdW1ucyB0byBiZSBhZGRlZCB0byB0aGUgcmV0dXJuaW5nIHN0YXRlbWVudCBpZiBkcml2ZXIgc3VwcG9ydHMgaXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4dHJhUmV0dXJuaW5nQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW9uYWwgb24gY29uZmxpY3Qgc3RhdGVtZW50IHVzZWQgaW4gaW5zZXJ0aW9uIHF1ZXJ5IGluIHBvc3RncmVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkNvbmZsaWN0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wdGlvbmFsIG9uIGlnbm9yZSBzdGF0ZW1lbnQgdXNlZCBpbiBpbnNlcnRpb24gcXVlcnkgaW4gZGF0YWJhc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbklnbm9yZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSk9JTiBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qb2luQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb25JZCBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gY291bnQgcXVlcmllcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdIRVJFIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndoZXJlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSEFWSU5HIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhdmluZ3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9SREVSIEJZIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yZGVyQnlzID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHUk9VUCBCWSBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cEJ5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHNvZnQtZGVsZXRlZCByb3dzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBlbnRpdHkgcmVzdWx0LlxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSBzb2Z0LWRlbGV0ZWQgcm93cyBhcmUgbm90IGluY2x1ZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aXRoRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGFyYW1ldGVycyB1c2VkIHRvIGJlIGVzY2FwZWQgaW4gZmluYWwgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBhbGlhcywgdGFibGUgbmFtZXMgYW5kIGNvbHVtbiBuYW1lcyB3aWxsIGJlIGVjYXBlZCBieSBkcml2ZXIsIG9yIG5vdC5cbiAgICAgICAgICpcbiAgICAgICAgICogdG9kbzogcmVuYW1lIHRvIGlzUXVvdGluZ0Rpc2FibGVkLCBhbHNvIHRoaW5rIGlmIGl0IHNob3VsZCBiZSBuYW1lZCBcImVzY2FwaW5nXCJcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzYWJsZUVzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB2aXJ0dWFsIGNvbHVtbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGVudGl0eSByZXN1bHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIHRvZG86IHdoYXQgdG8gZG8gd2l0aCBpdD8gaXMgaXQgcHJvcGVybHkgdXNlZD8gd2hhdCBhYm91dCBwZXJzaXN0ZW5jZT9cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW5hYmxlUmVsYXRpb25JZFZhbHVlcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmEgd2hlcmUgY29uZGl0aW9uIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2Ygb3JpZ2luYWwgd2hlcmUgY29uZGl0aW9ucyB3aXRoIEFORCBrZXl3b3JkLlxuICAgICAgICAgKiBPcmlnaW5hbCBjb25kaXRpb24gd2lsbCBiZSB3cmFwcGVkIGludG8gYnJhY2tldHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbiA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcXVlcnkgYnVpbGRlciBjcmVhdGVzIGEgc3VicXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1YlF1ZXJ5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcHJvcGVydHkgbmFtZXMgYXJlIHByZWZpeGVkIHdpdGggYWxpYXMgbmFtZXMgZHVyaW5nIHByb3BlcnR5IHJlcGxhY2VtZW50LlxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZCwgaG93ZXZlciB3ZSBuZWVkIHRoaXMgYmVjYXVzZSBhbGlhc2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFVQREFURSBhbmQgREVMRVRFIHF1ZXJpZXMsXG4gICAgICAgICAqIGJ1dCB1c2VyIGNhbiB1c2UgdGhlbSBpbiBXSEVSRSBleHByZXNzaW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcXVlcnkgcmVzdWx0IGNhY2hlIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW9ucyB0aGF0IGRlZmluZSBRdWVyeUJ1aWxkZXIgYmVoYXZpb3VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcHRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGNvbHVtbnMgd2hlcmUgZGF0YSBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gICAgICAgICAqIFVzZWQgaW4gSU5TRVJUIHF1ZXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnNlcnRDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIGlmIHVzZXIgd2FudHMgdG8gdXBkYXRlIG9yIGRlbGV0ZSBhIHNwZWNpZmljIGVudGl0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aGVyZUVudGl0aWVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciBpbnNlcnRpb24gLyB1cGRhdGlvbi5cbiAgICAgICAgICogVGhpcyBtYXkgcHJvZHVjZSBleHRyYSBxdWVyeSBvciB1c2UgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudCAoZGVwZW5kIG9uIGRhdGFiYXNlKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlRW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBsaXN0ZW5lcnMgYW5kIHN1YnNjcmliZXJzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbmQgYWZ0ZXIgcXVlcnkgZXhlY3V0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBxdWVyeSBtdXN0IGJlIHdyYXBwZWQgaW50byB0cmFuc2FjdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXNlVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBzdGFuZGFyZCBwYXJhbWV0ZXJzIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF0aXZlUGFyYW1ldGVycyA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSXRlbXMgZnJvbSBhbiBlbnRpdHkgdGhhdCBoYXZlIGJlZW4gbG9jYWxseSBnZW5lcmF0ZWQgJiBhcmUgcmVjb3JkZWQgaGVyZSBmb3IgbGF0ZXIgdXNlLlxuICAgICAgICAgKiBFeGFtcGxlcyBpbmNsdWRlIHRoZSBVVUlEIGdlbmVyYXRpb24gd2hlbiB0aGUgZGF0YWJhc2UgZG9lcyBub3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgICAgICAgICogVGhlc2UgYXJlIGluY2x1ZGVkIGluIHRoZSBlbnRpdHkgaW5kZXggb3JkZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvY2FsbHlHZW5lcmF0ZWQgPSB7fTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFF1ZXJ5RXhwcmVzc2lvbk1hcC5wcm90b3R5cGUsIFwiYWxsT3JkZXJCeXNcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYWxsIE9SREVSIEJZIHF1ZXJpZXMgLSBpZiBvcmRlciBieSBpcyBzcGVjaWZpZWQgYnkgdXNlciB0aGVuIGl0IHVzZXMgdGhlbSxcbiAgICAgICAgICogb3RoZXJ3aXNlIGl0IHVzZXMgZGVmYXVsdCBlbnRpdHkgb3JkZXIgYnkgaWYgaXQgd2FzIHNldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5vcmRlckJ5cykubGVuZ3RoICYmIHRoaXMubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwiZGlzYWJsZS1nbG9iYWwtb3JkZXJcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eU9yZGVyQnlfMSA9IHRoaXMubWFpbkFsaWFzLm1ldGFkYXRhLm9yZGVyQnkgfHwge307XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eU9yZGVyQnlfMSkucmVkdWNlKGZ1bmN0aW9uIChvcmRlckJ5LCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJCeVtfdGhpcy5tYWluQWxpYXMubmFtZSArIFwiLlwiICsga2V5XSA9IGVudGl0eU9yZGVyQnlfMVtrZXldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJCeTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcmRlckJ5cztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFpbiBhbGlhcyBhbmQgYWRkcyBpdCB0byB0aGUgY3VycmVudCBleHByZXNzaW9uIG1hcC5cbiAgICAgKi9cbiAgICBRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLnNldE1haW5BbGlhcyA9IGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAvLyBpZiBtYWluIGFsaWFzIGlzIGFscmVhZHkgc2V0IHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5XG4gICAgICAgIC8vIGlmICh0aGlzLm1haW5BbGlhcylcbiAgICAgICAgLy8gICAgIHRoaXMuYWxpYXNlcy5zcGxpY2UodGhpcy5hbGlhc2VzLmluZGV4T2YodGhpcy5tYWluQWxpYXMpKTtcbiAgICAgICAgLy8gc2V0IG5ldyBtYWluIGFsaWFzXG4gICAgICAgIHRoaXMubWFpbkFsaWFzID0gYWxpYXM7XG4gICAgICAgIHJldHVybiBhbGlhcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYWxpYXMgYW5kIGFkZHMgaXQgdG8gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBtYXAuXG4gICAgICovXG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5jcmVhdGVBbGlhcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBhbGlhc05hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIGlmICghYWxpYXNOYW1lICYmIG9wdGlvbnMudGFibGVQYXRoKVxuICAgICAgICAgICAgYWxpYXNOYW1lID0gb3B0aW9ucy50YWJsZVBhdGg7XG4gICAgICAgIGlmICghYWxpYXNOYW1lICYmIG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICBhbGlhc05hbWUgPSBvcHRpb25zLnRhcmdldC5uYW1lO1xuICAgICAgICBpZiAoIWFsaWFzTmFtZSAmJiB0eXBlb2Ygb3B0aW9ucy50YXJnZXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBhbGlhc05hbWUgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdmFyIGFsaWFzID0gbmV3IEFsaWFzKCk7XG4gICAgICAgIGFsaWFzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIGlmIChhbGlhc05hbWUpXG4gICAgICAgICAgICBhbGlhcy5uYW1lID0gYWxpYXNOYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5tZXRhZGF0YSlcbiAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGFyZ2V0ICYmICFhbGlhcy5oYXNNZXRhZGF0YSlcbiAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGFibGVQYXRoKVxuICAgICAgICAgICAgYWxpYXMudGFibGVQYXRoID0gb3B0aW9ucy50YWJsZVBhdGg7XG4gICAgICAgIGlmIChvcHRpb25zLnN1YlF1ZXJ5KVxuICAgICAgICAgICAgYWxpYXMuc3ViUXVlcnkgPSBvcHRpb25zLnN1YlF1ZXJ5O1xuICAgICAgICB0aGlzLmFsaWFzZXMucHVzaChhbGlhcyk7XG4gICAgICAgIHJldHVybiBhbGlhcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsaWFzIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogSWYgYWxpYXMgd2FzIG5vdCBmb3VuZCBpdCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAgICovXG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5maW5kQWxpYXNCeU5hbWUgPSBmdW5jdGlvbiAoYWxpYXNOYW1lKSB7XG4gICAgICAgIHZhciBhbGlhcyA9IHRoaXMuYWxpYXNlcy5maW5kKGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gYWxpYXMubmFtZSA9PT0gYWxpYXNOYW1lOyB9KTtcbiAgICAgICAgaWYgKCFhbGlhcylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJcXFwiXCIgKyBhbGlhc05hbWUgKyBcIlxcXCIgYWxpYXMgd2FzIG5vdCBmb3VuZC4gTWF5YmUgeW91IGZvcmdvdCB0byBqb2luIGl0P1wiKTtcbiAgICAgICAgcmV0dXJuIGFsaWFzO1xuICAgIH07XG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5maW5kQ29sdW1uQnlBbGlhc0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoYWxpYXNFeHByZXNzaW9uKSB7XG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChhbGlhc0V4cHJlc3Npb24uc3BsaXQoXCIuXCIpLCAyKSwgYWxpYXNOYW1lID0gX2FbMF0sIHByb3BlcnR5UGF0aCA9IF9hWzFdO1xuICAgICAgICB2YXIgYWxpYXMgPSB0aGlzLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpO1xuICAgICAgICByZXR1cm4gYWxpYXMubWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eU5hbWUocHJvcGVydHlQYXRoKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLCBcInJlbGF0aW9uTWV0YWRhdGFcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyByZWxhdGlvbiBtZXRhZGF0YSBvZiB0aGUgcmVsYXRpb24gdGhpcyBxdWVyeSBidWlsZGVyIHdvcmtzIHdpdGguXG4gICAgICAgICAqXG4gICAgICAgICAqIHRvZG86IGFkZCBwcm9wZXIgZXhjZXB0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWFpbkFsaWFzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFbnRpdHkgdG8gd29yayB3aXRoIGlzIG5vdCBzcGVjaWZpZWQhXCIpOyAvLyB0b2RvOiBiZXR0ZXIgbWVzc2FnZVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uTWV0YWRhdGEgPSB0aGlzLm1haW5BbGlhcy5tZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbk1ldGFkYXRhKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcIiArIHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGggKyBcIiB3YXMgbm90IGZvdW5kIGluIGVudGl0eSBcIiArIHRoaXMubWFpbkFsaWFzLm5hbWUpOyAvLyB0b2RvOiBiZXR0ZXIgbWVzc2FnZVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBDb3BpZXMgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgUXVlcnlFeHByZXNzaW9uTWFwIGludG8gYSBuZXcgb25lLlxuICAgICAqIFVzZWZ1bCB3aGVuIFF1ZXJ5QnVpbGRlciBuZWVkcyB0byBjcmVhdGUgYSBjb3B5IG9mIGl0c2VsZi5cbiAgICAgKi9cbiAgICBRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWFwID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbk1hcCh0aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICBtYXAucXVlcnlUeXBlID0gdGhpcy5xdWVyeVR5cGU7XG4gICAgICAgIG1hcC5zZWxlY3RzID0gdGhpcy5zZWxlY3RzLm1hcChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Q7IH0pO1xuICAgICAgICBtYXAubWF4RXhlY3V0aW9uVGltZSA9IHRoaXMubWF4RXhlY3V0aW9uVGltZTtcbiAgICAgICAgbWFwLnNlbGVjdERpc3RpbmN0ID0gdGhpcy5zZWxlY3REaXN0aW5jdDtcbiAgICAgICAgbWFwLnNlbGVjdERpc3RpbmN0T24gPSB0aGlzLnNlbGVjdERpc3RpbmN0T247XG4gICAgICAgIHRoaXMuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gbWFwLmFsaWFzZXMucHVzaChuZXcgQWxpYXMoYWxpYXMpKTsgfSk7XG4gICAgICAgIG1hcC5tYWluQWxpYXMgPSB0aGlzLm1haW5BbGlhcztcbiAgICAgICAgbWFwLnZhbHVlc1NldCA9IHRoaXMudmFsdWVzU2V0O1xuICAgICAgICBtYXAucmV0dXJuaW5nID0gdGhpcy5yZXR1cm5pbmc7XG4gICAgICAgIG1hcC5vbkNvbmZsaWN0ID0gdGhpcy5vbkNvbmZsaWN0O1xuICAgICAgICBtYXAub25JZ25vcmUgPSB0aGlzLm9uSWdub3JlO1xuICAgICAgICBtYXAub25VcGRhdGUgPSB0aGlzLm9uVXBkYXRlO1xuICAgICAgICBtYXAuam9pbkF0dHJpYnV0ZXMgPSB0aGlzLmpvaW5BdHRyaWJ1dGVzLm1hcChmdW5jdGlvbiAoam9pbikgeyByZXR1cm4gbmV3IEpvaW5BdHRyaWJ1dGUoX3RoaXMuY29ubmVjdGlvbiwgX3RoaXMsIGpvaW4pOyB9KTtcbiAgICAgICAgbWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzID0gdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIG5ldyBSZWxhdGlvbklkQXR0cmlidXRlKF90aGlzLCByZWxhdGlvbklkKTsgfSk7XG4gICAgICAgIG1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcyA9IHRoaXMucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7IHJldHVybiBuZXcgUmVsYXRpb25Db3VudEF0dHJpYnV0ZShfdGhpcywgcmVsYXRpb25Db3VudCk7IH0pO1xuICAgICAgICBtYXAud2hlcmVzID0gdGhpcy53aGVyZXMubWFwKGZ1bmN0aW9uICh3aGVyZSkgeyByZXR1cm4gKF9fYXNzaWduKHt9LCB3aGVyZSkpOyB9KTtcbiAgICAgICAgbWFwLmhhdmluZ3MgPSB0aGlzLmhhdmluZ3MubWFwKGZ1bmN0aW9uIChoYXZpbmcpIHsgcmV0dXJuIChfX2Fzc2lnbih7fSwgaGF2aW5nKSk7IH0pO1xuICAgICAgICBtYXAub3JkZXJCeXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9yZGVyQnlzKTtcbiAgICAgICAgbWFwLmdyb3VwQnlzID0gdGhpcy5ncm91cEJ5cy5tYXAoZnVuY3Rpb24gKGdyb3VwQnkpIHsgcmV0dXJuIGdyb3VwQnk7IH0pO1xuICAgICAgICBtYXAubGltaXQgPSB0aGlzLmxpbWl0O1xuICAgICAgICBtYXAub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIG1hcC5za2lwID0gdGhpcy5za2lwO1xuICAgICAgICBtYXAudGFrZSA9IHRoaXMudGFrZTtcbiAgICAgICAgbWFwLmxvY2tNb2RlID0gdGhpcy5sb2NrTW9kZTtcbiAgICAgICAgbWFwLmxvY2tWZXJzaW9uID0gdGhpcy5sb2NrVmVyc2lvbjtcbiAgICAgICAgbWFwLmxvY2tUYWJsZXMgPSB0aGlzLmxvY2tUYWJsZXM7XG4gICAgICAgIG1hcC53aXRoRGVsZXRlZCA9IHRoaXMud2l0aERlbGV0ZWQ7XG4gICAgICAgIG1hcC5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbWFwLmRpc2FibGVFc2NhcGluZyA9IHRoaXMuZGlzYWJsZUVzY2FwaW5nO1xuICAgICAgICBtYXAuZW5hYmxlUmVsYXRpb25JZFZhbHVlcyA9IHRoaXMuZW5hYmxlUmVsYXRpb25JZFZhbHVlcztcbiAgICAgICAgbWFwLmV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbiA9IHRoaXMuZXh0cmFBcHBlbmRlZEFuZFdoZXJlQ29uZGl0aW9uO1xuICAgICAgICBtYXAuc3ViUXVlcnkgPSB0aGlzLnN1YlF1ZXJ5O1xuICAgICAgICBtYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRoaXMuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZDtcbiAgICAgICAgbWFwLmNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgICAgbWFwLmNhY2hlSWQgPSB0aGlzLmNhY2hlSWQ7XG4gICAgICAgIG1hcC5jYWNoZUR1cmF0aW9uID0gdGhpcy5jYWNoZUR1cmF0aW9uO1xuICAgICAgICBtYXAucmVsYXRpb25Qcm9wZXJ0eVBhdGggPSB0aGlzLnJlbGF0aW9uUHJvcGVydHlQYXRoO1xuICAgICAgICBtYXAub2YgPSB0aGlzLm9mO1xuICAgICAgICBtYXAuaW5zZXJ0Q29sdW1ucyA9IHRoaXMuaW5zZXJ0Q29sdW1ucztcbiAgICAgICAgbWFwLndoZXJlRW50aXRpZXMgPSB0aGlzLndoZXJlRW50aXRpZXM7XG4gICAgICAgIG1hcC51cGRhdGVFbnRpdHkgPSB0aGlzLnVwZGF0ZUVudGl0eTtcbiAgICAgICAgbWFwLmNhbGxMaXN0ZW5lcnMgPSB0aGlzLmNhbGxMaXN0ZW5lcnM7XG4gICAgICAgIG1hcC51c2VUcmFuc2FjdGlvbiA9IHRoaXMudXNlVHJhbnNhY3Rpb247XG4gICAgICAgIG1hcC5uYXRpdmVQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5uYXRpdmVQYXJhbWV0ZXJzKTtcbiAgICAgICAgbWFwLmNvbW1lbnQgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcbiAgICByZXR1cm4gUXVlcnlFeHByZXNzaW9uTWFwO1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5RXhwcmVzc2lvbk1hcCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUV4cHJlc3Npb25NYXAuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogV3JhcHMgZW50aXRpZXMgYW5kIGNyZWF0ZXMgZ2V0dGVycy9zZXR0ZXJzIGZvciB0aGVpciByZWxhdGlvbnNcbiAqIHRvIGJlIGFibGUgdG8gbGF6aWx5IGxvYWQgcmVsYXRpb25zIHdoZW4gYWNjZXNzaW5nIHRoZXNlIHJlbGF0aW9ucy5cbiAqL1xudmFyIFJlbGF0aW9uTG9hZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWxhdGlvbkxvYWRlcihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2FkcyByZWxhdGlvbiBkYXRhIGZvciB0aGUgZ2l2ZW4gZW50aXR5IGFuZCBpdHMgcmVsYXRpb24uXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChxdWVyeVJ1bm5lciAmJiBxdWVyeVJ1bm5lci5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7IC8vIGdldCBuZXcgb25lIGlmIGFscmVhZHkgY2xvc2VkXG4gICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRNYW55VG9PbmVPck9uZVRvT25lT3duZXIocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc09uZVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPbmVUb01hbnlPck9uZVRvT25lTm90T3duZXIocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc01hbnlUb01hbnlPd25lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbnlUb01hbnlPd25lcihyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtYW55LXRvLW1hbnkgbm9uIG93bmVyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFueVRvTWFueU5vdE93bmVyKHJlbGF0aW9uLCBlbnRpdHlPckVudGl0aWVzLCBxdWVyeVJ1bm5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGRhdGEgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIG93bmVyIHJlbGF0aW9ucy5cbiAgICAgKlxuICAgICAqIChvdykgcG9zdC5jYXRlZ29yeTw9PmNhdGVnb3J5LnBvc3RcbiAgICAgKiBsb2FkZWQ6IGNhdGVnb3J5IGZyb20gcG9zdFxuICAgICAqIGV4YW1wbGU6IFNFTEVDVCBjYXRlZ29yeS5pZCBBUyBjYXRlZ29yeV9pZCwgY2F0ZWdvcnkubmFtZSBBUyBjYXRlZ29yeV9uYW1lIEZST00gY2F0ZWdvcnkgY2F0ZWdvcnlcbiAgICAgKiAgICAgICAgICAgICAgSU5ORVIgSk9JTiBwb3N0IFBvc3QgT04gUG9zdC5jYXRlZ29yeT1jYXRlZ29yeS5pZCBXSEVSRSBQb3N0LmlkPTFcbiAgICAgKi9cbiAgICBSZWxhdGlvbkxvYWRlci5wcm90b3R5cGUubG9hZE1hbnlUb09uZU9yT25lVG9PbmVPd25lciA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSA/IGVudGl0eU9yRW50aXRpZXMgOiBbZW50aXR5T3JFbnRpdGllc107XG4gICAgICAgIHZhciBjb2x1bW5zID0gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb24uam9pbkNvbHVtbnMgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHZhciBjb25kaXRpb25zID0gam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIiA9IFwiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgIHZhciBqb2luQWxpYXNOYW1lID0gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdChyZWxhdGlvbi5wcm9wZXJ0eU5hbWUpIC8vIGNhdGVnb3J5XG4gICAgICAgICAgICAuZnJvbShyZWxhdGlvbi50eXBlLCByZWxhdGlvbi5wcm9wZXJ0eU5hbWUpIC8vIENhdGVnb3J5LCBjYXRlZ29yeVxuICAgICAgICAgICAgLmlubmVySm9pbihyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsIGpvaW5BbGlhc05hbWUsIGNvbmRpdGlvbnMpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHFiLndoZXJlKGpvaW5BbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbnNbMF0ucHJvcGVydHlQYXRoICsgXCIgSU4gKDouLi5cIiArIChqb2luQWxpYXNOYW1lICsgXCJfXCIgKyBjb2x1bW5zWzBdLnByb3BlcnR5TmFtZSkgKyBcIilcIik7XG4gICAgICAgICAgICBxYi5zZXRQYXJhbWV0ZXIoam9pbkFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUsIGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBjb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGVudGl0eSk7IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSwgZW50aXR5SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtTmFtZSA9IGpvaW5BbGlhc05hbWUgKyBcIl9lbnRpdHlfXCIgKyBlbnRpdHlJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHFiLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5BbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIjsgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICBxYi53aGVyZShjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxYi5nZXRNYW55KCk7XG4gICAgICAgIC8vIHJldHVybiBxYi5nZXRPbmUoKTsgdG9kbzogZml4IGFsbCB1c2FnZXNcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGRhdGEgZm9yIG9uZS10by1tYW55IGFuZCBvbmUtdG8tb25lIG5vdCBvd25lciByZWxhdGlvbnMuXG4gICAgICpcbiAgICAgKiBTRUxFQ1QgcG9zdFxuICAgICAqIEZST00gcG9zdCBwb3N0XG4gICAgICogV0hFUkUgcG9zdC5bam9pbkNvbHVtbi5uYW1lXSA9IGVudGl0eVtqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5dXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWRPbmVUb01hbnlPck9uZVRvT25lTm90T3duZXIgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkoZW50aXR5T3JFbnRpdGllcykgPyBlbnRpdHlPckVudGl0aWVzIDogW2VudGl0eU9yRW50aXRpZXNdO1xuICAgICAgICB2YXIgYWxpYXNOYW1lID0gcmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucztcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdChhbGlhc05hbWUpXG4gICAgICAgICAgICAuZnJvbShyZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uZW50aXR5TWV0YWRhdGEudGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHFiLndoZXJlKGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uc1swXS5wcm9wZXJ0eVBhdGggKyBcIiBJTiAoOi4uLlwiICsgKGFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUpICsgXCIpXCIpO1xuICAgICAgICAgICAgcWIuc2V0UGFyYW1ldGVyKGFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUsIGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBjb2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiA9IGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gYWxpYXNOYW1lICsgXCJfZW50aXR5X1wiICsgZW50aXR5SW5kZXggKyBcIl9cIiArIGNvbHVtbkluZGV4O1xuICAgICAgICAgICAgICAgICAgICBxYi5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoY29uZGl0aW9uKSB7IHJldHVybiBcIihcIiArIGNvbmRpdGlvbiArIFwiKVwiOyB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgIHFiLndoZXJlKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHFiLmdldE1hbnkoKTtcbiAgICAgICAgLy8gcmV0dXJuIHJlbGF0aW9uLmlzT25lVG9NYW55ID8gcWIuZ2V0TWFueSgpIDogcWIuZ2V0T25lKCk7IHRvZG86IGZpeCBhbGwgdXNhZ2VzXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIGZvciBtYW55LXRvLW1hbnkgb3duZXIgcmVsYXRpb25zLlxuICAgICAqXG4gICAgICogU0VMRUNUIGNhdGVnb3J5XG4gICAgICogRlJPTSBjYXRlZ29yeSBjYXRlZ29yeVxuICAgICAqIElOTkVSIEpPSU4gcG9zdF9jYXRlZ29yaWVzIHBvc3RfY2F0ZWdvcmllc1xuICAgICAqIE9OIHBvc3RfY2F0ZWdvcmllcy5wb3N0SWQgPSA6cG9zdElkXG4gICAgICogQU5EIHBvc3RfY2F0ZWdvcmllcy5jYXRlZ29yeUlkID0gY2F0ZWdvcnkuaWRcbiAgICAgKi9cbiAgICBSZWxhdGlvbkxvYWRlci5wcm90b3R5cGUubG9hZE1hbnlUb01hbnlPd25lciA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSA/IGVudGl0eU9yRW50aXRpZXMgOiBbZW50aXR5T3JFbnRpdGllc107XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSByZWxhdGlvbi5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHZhciBqb2luQWxpYXMgPSByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZTtcbiAgICAgICAgdmFyIGpvaW5Db2x1bW5Db25kaXRpb25zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbkFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOICg6Li4uXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiKVwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGludmVyc2VKb2luQ29sdW1uQ29uZGl0aW9ucyA9IHJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGludmVyc2VKb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbkFsaWFzICsgXCIuXCIgKyBpbnZlcnNlSm9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIj1cIiArIG1haW5BbGlhcyArIFwiLlwiICsgaW52ZXJzZUpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLnJlZHVjZShmdW5jdGlvbiAocGFyYW1ldGVycywgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgcGFyYW1ldGVyc1tqb2luQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgIC5zZWxlY3QobWFpbkFsaWFzKVxuICAgICAgICAgICAgLmZyb20ocmVsYXRpb24udHlwZSwgbWFpbkFsaWFzKVxuICAgICAgICAgICAgLmlubmVySm9pbihqb2luQWxpYXMsIGpvaW5BbGlhcywgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoam9pbkNvbHVtbkNvbmRpdGlvbnMpLCBmYWxzZSksIF9fcmVhZChpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbnMpLCBmYWxzZSkuam9pbihcIiBBTkQgXCIpKVxuICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgICAgIC5nZXRNYW55KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIGZvciBtYW55LXRvLW1hbnkgbm90IG93bmVyIHJlbGF0aW9ucy5cbiAgICAgKlxuICAgICAqIFNFTEVDVCBwb3N0XG4gICAgICogRlJPTSBwb3N0IHBvc3RcbiAgICAgKiBJTk5FUiBKT0lOIHBvc3RfY2F0ZWdvcmllcyBwb3N0X2NhdGVnb3JpZXNcbiAgICAgKiBPTiBwb3N0X2NhdGVnb3JpZXMucG9zdElkID0gcG9zdC5pZFxuICAgICAqIEFORCBwb3N0X2NhdGVnb3JpZXMuY2F0ZWdvcnlJZCA9IHBvc3RfY2F0ZWdvcmllcy5jYXRlZ29yeUlkXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWRNYW55VG9NYW55Tm90T3duZXIgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkoZW50aXR5T3JFbnRpdGllcykgPyBlbnRpdHlPckVudGl0aWVzIDogW2VudGl0eU9yRW50aXRpZXNdO1xuICAgICAgICB2YXIgbWFpbkFsaWFzID0gcmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB2YXIgam9pbkFsaWFzID0gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgIHZhciBqb2luQ29sdW1uQ29uZGl0aW9ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlOYW1lICsgXCIgPSBcIiArIG1haW5BbGlhcyArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoaW52ZXJzZUpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQWxpYXMgKyBcIi5cIiArIGludmVyc2VKb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOICg6Li4uXCIgKyBpbnZlcnNlSm9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIilcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKHBhcmFtZXRlcnMsIGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnNbam9pbkNvbHVtbi5wcm9wZXJ0eU5hbWVdID0gZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICAuc2VsZWN0KG1haW5BbGlhcylcbiAgICAgICAgICAgIC5mcm9tKHJlbGF0aW9uLnR5cGUsIG1haW5BbGlhcylcbiAgICAgICAgICAgIC5pbm5lckpvaW4oam9pbkFsaWFzLCBqb2luQWxpYXMsIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGpvaW5Db2x1bW5Db25kaXRpb25zKSwgZmFsc2UpLCBfX3JlYWQoaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25zKSwgZmFsc2UpLmpvaW4oXCIgQU5EIFwiKSlcbiAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV3JhcHMgZ2l2ZW4gZW50aXR5IGFuZCBjcmVhdGVzIGdldHRlcnMvc2V0dGVycyBmb3IgaXRzIGdpdmVuIHJlbGF0aW9uXG4gICAgICogdG8gYmUgYWJsZSB0byBsYXppbHkgbG9hZCBkYXRhIHdoZW4gYWNjZXNzaW5nIHRoaXMgcmVsYXRpb24uXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmVuYWJsZUxhenlMb2FkID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBlbnRpdHksIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciByZWxhdGlvbkxvYWRlciA9IHRoaXM7XG4gICAgICAgIHZhciBkYXRhSW5kZXggPSBcIl9fXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluIHdoYXQgcHJvcGVydHkgb2YgdGhlIGVudGl0eSBsb2FkZWQgZGF0YSB3aWxsIGJlIHN0b3JlZFxuICAgICAgICB2YXIgcHJvbWlzZUluZGV4ID0gXCJfX3Byb21pc2VfXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluIHdoYXQgcHJvcGVydHkgb2YgdGhlIGVudGl0eSBsb2FkaW5nIHByb21pc2Ugd2lsbCBiZSBzdG9yZWRcbiAgICAgICAgdmFyIHJlc29sdmVJbmRleCA9IFwiX19oYXNfXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluZGljYXRlcyBpZiByZWxhdGlvbiBkYXRhIGFscmVhZHkgd2FzIGxvYWRlZCBvciBub3QsIHdlIG5lZWQgdGhpcyBmbGFnIGlmIGxvYWRlZCBkYXRhIGlzIGVtcHR5XG4gICAgICAgIHZhciBzZXREYXRhID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eVtkYXRhSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICBlbnRpdHlbcmVzb2x2ZUluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGUgZW50aXR5W3Byb21pc2VJbmRleF07XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzZXRQcm9taXNlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHlbcmVzb2x2ZUluZGV4XTtcbiAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHlbZGF0YUluZGV4XTtcbiAgICAgICAgICAgIGVudGl0eVtwcm9taXNlSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZS50aGVuKFxuICAgICAgICAgICAgLy8gZW5zdXJlIGRpZmZlcmVudCB2YWx1ZSBpcyBub3QgYXNzaWduZWQgeWV0XG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiBlbnRpdHlbcHJvbWlzZUluZGV4XSA9PT0gdmFsdWUgPyBzZXREYXRhKGVudGl0eSwgcmVzdWx0KSA6IHJlc3VsdDsgfSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbnRpdHksIHJlbGF0aW9uLnByb3BlcnR5TmFtZSwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcmVzb2x2ZUluZGV4XSA9PT0gdHJ1ZSB8fCB0aGlzW2RhdGFJbmRleF0gIT09IHVuZGVmaW5lZCkgLy8gaWYgcmVsYXRlZCBkYXRhIGFscmVhZHkgd2FzIGxvYWRlZCB0aGVuIHNpbXBseSByZXR1cm4gaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzW2RhdGFJbmRleF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3Byb21pc2VJbmRleF0pIC8vIGlmIHJlbGF0ZWQgZGF0YSBpcyBsb2FkaW5nIHRoZW4gcmV0dXJuIGEgcHJvbWlzZSByZWxhdGlvbkxvYWRlciBsb2FkcyBpdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1twcm9taXNlSW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgbG9hZGVkIHlldCwgbG9hZCByZWxhdGlvbiBkYXRhIGFuZCBzYXZlIGl0IGluIHRoZSBtb2RlbCBvbmNlIHRoZXkgYXJlIGxvYWRlZFxuICAgICAgICAgICAgICAgIHZhciBsb2FkZXIgPSByZWxhdGlvbkxvYWRlci5sb2FkKHJlbGF0aW9uLCB0aGlzLCBxdWVyeVJ1bm5lcikudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZWxhdGlvbi5pc09uZVRvT25lIHx8IHJlbGF0aW9uLmlzTWFueVRvT25lID8gKHJlc3VsdC5sZW5ndGggPT09IDAgPyBudWxsIDogcmVzdWx0WzBdKSA6IHJlc3VsdDsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFByb21pc2UodGhpcywgbG9hZGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHsgLy8gaWYgc2V0IGRhdGEgaXMgYSBwcm9taXNlIHRoZW4gd2FpdCBmb3IgaXRzIHJlc29sdmUgYW5kIHNhdmUgaW4gdGhlIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9taXNlKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIGlmIGl0cyBkaXJlY3QgZGF0YSBzZXQgKG5vbiBwcm9taXNlLCBwcm9iYWJseSBub3Qgc2FmZS10eXBlZClcbiAgICAgICAgICAgICAgICAgICAgc2V0RGF0YSh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbkxvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkxvYWRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkxvYWRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvblVwZGF0ZXIgfSBmcm9tIFwiLi9SZWxhdGlvblVwZGF0ZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uUmVtb3ZlciB9IGZyb20gXCIuL1JlbGF0aW9uUmVtb3ZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEFsbG93cyB0byB3b3JrIHdpdGggZW50aXR5IHJlbGF0aW9ucyBhbmQgcGVyZm9ybSBzcGVjaWZpYyBvcGVyYXRpb25zIHdpdGggdGhvc2UgcmVsYXRpb25zLlxuICpcbiAqIHRvZG86IGFkZCB0cmFuc2FjdGlvbnMgZXZlcnl3aGVyZVxuICovXG52YXIgUmVsYXRpb25RdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlbGF0aW9uUXVlcnlCdWlsZGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlbGF0aW9uUXVlcnlCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgSW1wbGVtZW50ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBzcWwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyBlbnRpdHkgKHRhcmdldCkgd2hpY2ggcmVsYXRpb25zIHdpbGwgYmUgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvblF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2YgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vZiA9IGVudGl0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIGVudGl0eSByZWxhdGlvbidzIHZhbHVlLlxuICAgICAqIFZhbHVlIGNhbiBiZSBlbnRpdHksIGVudGl0eSBpZCBvciBlbnRpdHkgaWQgbWFwIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFdvcmtzIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgKiBGb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMgdXNlICNhZGQgYW5kICNyZW1vdmUgbWV0aG9kcyBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCB1cGRhdGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAub2YpIC8vIHRvZG86IG1vdmUgdGhpcyBjaGVjayBiZWZvcmUgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBjcmVhdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aG9zZSByZWxhdGlvbiBuZWVkcyB0byBiZSBzZXQgaXMgbm90IHNldC4gVXNlIC5vZiBtZXRob2QgdG8gZGVmaW5lIHdob3NlIHJlbGF0aW9uIHlvdSB3YW50IHRvIHNldC5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNldCBvcGVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKFwiSG93ZXZlciBnaXZlbiBcXFwiXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIgaGFzIFwiICsgcmVsYXRpb24ucmVsYXRpb25UeXBlICsgXCIgcmVsYXRpb24uIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVzZSAuYWRkKCkgbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgdGhlbiB1c2VyIG11c3Qgc2VuZCBpZCBtYXAgYXMgXCJ2YWx1ZVwiIGFyZ3VtZW50LiBjaGVjayBpZiBoZSByZWFsbHkgZGlkIGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW5zICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKCEodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHx8IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPCByZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmFsdWUgdG8gYmUgc2V0IGludG8gdGhlIHJlbGF0aW9uIG11c3QgYmUgYSBtYXAgb2YgcmVsYXRpb24gaWRzLCBmb3IgZXhhbXBsZTogLnNldCh7IGZpcnN0TmFtZTogXFxcIi4uLlxcXCIsIGxhc3ROYW1lOiBcXFwiLi4uXFxcIiB9KVwiKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVyID0gbmV3IFJlbGF0aW9uVXBkYXRlcih0aGlzLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVyLnVwZGF0ZSh2YWx1ZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyAoYmluZHMpIGdpdmVuIHZhbHVlIHRvIGVudGl0eSByZWxhdGlvbi5cbiAgICAgKiBWYWx1ZSBjYW4gYmUgZW50aXR5LCBlbnRpdHkgaWQgb3IgZW50aXR5IGlkIG1hcCAoaWYgZW50aXR5IGhhcyBjb21wb3NpdGUgaWRzKS5cbiAgICAgKiBWYWx1ZSBhbHNvIGNhbiBiZSBhcnJheSBvZiBlbnRpdGllcywgYXJyYXkgb2YgZW50aXR5IGlkcyBvciBhcnJheSBvZiBlbnRpdHkgaWQgbWFwcyAoaWYgZW50aXR5IGhhcyBjb21wb3NpdGUgaWRzKS5cbiAgICAgKiBXb3JrcyBvbmx5IGZvciBtYW55LXRvLW1hbnkgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucy5cbiAgICAgKiBGb3IgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgdXNlICNzZXQgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgUmVsYXRpb25RdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIHVwZGF0ZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAub2YpIC8vIHRvZG86IG1vdmUgdGhpcyBjaGVjayBiZWZvcmUgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBjcmVhdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aG9zZSByZWxhdGlvbiBuZWVkcyB0byBiZSBzZXQgaXMgbm90IHNldC4gVXNlIC5vZiBtZXRob2QgdG8gZGVmaW5lIHdob3NlIHJlbGF0aW9uIHlvdSB3YW50IHRvIHNldC5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBZGQgb3BlcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBtYW55LXRvLW1hbnkgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKFwiSG93ZXZlciBnaXZlbiBcXFwiXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIgaGFzIFwiICsgcmVsYXRpb24ucmVsYXRpb25UeXBlICsgXCIgcmVsYXRpb24uIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVzZSAuc2V0KCkgbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgdGhlbiB1c2VyIG11c3Qgc2VuZCBpZCBtYXAgYXMgXCJ2YWx1ZVwiIGFyZ3VtZW50LiBjaGVjayBpZiBoZSByZWFsbHkgZGlkIGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW5zICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKCEodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHx8IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPCByZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmFsdWUgdG8gYmUgc2V0IGludG8gdGhlIHJlbGF0aW9uIG11c3QgYmUgYSBtYXAgb2YgcmVsYXRpb24gaWRzLCBmb3IgZXhhbXBsZTogLnNldCh7IGZpcnN0TmFtZTogXFxcIi4uLlxcXCIsIGxhc3ROYW1lOiBcXFwiLi4uXFxcIiB9KVwiKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVyID0gbmV3IFJlbGF0aW9uVXBkYXRlcih0aGlzLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVyLnVwZGF0ZSh2YWx1ZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyAodW5iaW5kcykgZ2l2ZW4gdmFsdWUgZnJvbSBlbnRpdHkgcmVsYXRpb24uXG4gICAgICogVmFsdWUgY2FuIGJlIGVudGl0eSwgZW50aXR5IGlkIG9yIGVudGl0eSBpZCBtYXAgKGlmIGVudGl0eSBoYXMgY29tcG9zaXRlIGlkcykuXG4gICAgICogVmFsdWUgYWxzbyBjYW4gYmUgYXJyYXkgb2YgZW50aXRpZXMsIGFycmF5IG9mIGVudGl0eSBpZHMgb3IgYXJyYXkgb2YgZW50aXR5IGlkIG1hcHMgKGlmIGVudGl0eSBoYXMgY29tcG9zaXRlIGlkcykuXG4gICAgICogV29ya3Mgb25seSBmb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMuXG4gICAgICogRm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHVzZSAjc2V0IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCByZW1vdmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbk1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm9mKSAvLyB0b2RvOiBtb3ZlIHRoaXMgY2hlY2sgYmVmb3JlIHJlbGF0aW9uIHF1ZXJ5IGJ1aWxkZXIgY3JlYXRpb24/XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFbnRpdHkgd2hvc2UgcmVsYXRpb24gbmVlZHMgdG8gYmUgc2V0IGlzIG5vdCBzZXQuIFVzZSAub2YgbWV0aG9kIHRvIGRlZmluZSB3aG9zZSByZWxhdGlvbiB5b3Ugd2FudCB0byBzZXQuXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQWRkIG9wZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChcIkhvd2V2ZXIgZ2l2ZW4gXFxcIlwiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCJcXFwiIGhhcyBcIiArIHJlbGF0aW9uLnJlbGF0aW9uVHlwZSArIFwiIHJlbGF0aW9uLiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJVc2UgLnNldChudWxsKSBtZXRob2QgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgcmVtb3ZlciA9IG5ldyBSZWxhdGlvblJlbW92ZXIodGhpcywgdGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVtb3Zlci5yZW1vdmUodmFsdWUpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgKGJpbmRzKSBhbmQgcmVtb3ZlcyAodW5iaW5kcykgZ2l2ZW4gdmFsdWVzIHRvL2Zyb20gZW50aXR5IHJlbGF0aW9uLlxuICAgICAqIFZhbHVlIGNhbiBiZSBlbnRpdHksIGVudGl0eSBpZCBvciBlbnRpdHkgaWQgbWFwIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFZhbHVlIGFsc28gY2FuIGJlIGFycmF5IG9mIGVudGl0aWVzLCBhcnJheSBvZiBlbnRpdHkgaWRzIG9yIGFycmF5IG9mIGVudGl0eSBpZCBtYXBzIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFdvcmtzIG9ubHkgZm9yIG1hbnktdG8tbWFueSBhbmQgb25lLXRvLW1hbnkgcmVsYXRpb25zLlxuICAgICAqIEZvciBtYW55LXRvLW9uZSBhbmQgb25lLXRvLW9uZSB1c2UgI3NldCBtZXRob2QgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvblF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYWRkQW5kUmVtb3ZlID0gZnVuY3Rpb24gKGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZW1vdmUocmVtb3ZlZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZChhZGRlZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBlbnRpdHkncyByZWxhdGlvbiBpZC5cbiAgICBhc3luYyBnZXRJZCgpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgfSovXG4gICAgLyoqXG4gICAgICogR2V0cyBlbnRpdHkncyByZWxhdGlvbiBpZHMuXG4gICAgYXN5bmMgZ2V0SWRzKCk6IFByb21pc2U8YW55W10+IHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0qL1xuICAgIC8qKlxuICAgICAqIExvYWRzIGEgc2luZ2xlIGVudGl0eSAocmVsYXRpb25hbCkgZnJvbSB0aGUgcmVsYXRpb24uXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgaWQgb2YgcmVsYXRpb25hbCBlbnRpdHkgdG8gZmlsdGVyIGJ5LlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkT25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMubG9hZE1hbnkoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7IHJldHVybiByZXN1bHRzWzBdOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBtYW55IGVudGl0aWVzIChyZWxhdGlvbmFsKSBmcm9tIHRoZSByZWxhdGlvbi5cbiAgICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBpZHMgb2YgcmVsYXRpb25hbCBlbnRpdGllcyB0byBmaWx0ZXIgYnkuXG4gICAgICovXG4gICAgUmVsYXRpb25RdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxvYWRNYW55ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2YsIG1ldGFkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG9mID0gdGhpcy5leHByZXNzaW9uTWFwLm9mO1xuICAgICAgICAgICAgICAgIGlmICghKG9mIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5oYXNNdWx0aXBsZVByaW1hcnlLZXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBsb2FkIGVudGl0eSBiZWNhdXNlIG9ubHkgb25lIHByaW1hcnkga2V5IHdhcyBzcGVjaWZpZWQsIGhvd2V2ZXIgZW50aXR5IGNvbnRhaW5zIG11bHRpcGxlIHByaW1hcnkga2V5c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgb2YgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5jcmVhdGVWYWx1ZU1hcChvZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNvbm5lY3Rpb24ucmVsYXRpb25Mb2FkZXIubG9hZCh0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25NZXRhZGF0YSwgb2YsIHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvblF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBSZWxhdGlvblF1ZXJ5QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gd29yayB3aXRoIGVudGl0eSByZWxhdGlvbnMgYW5kIHBlcmZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyB3aXRoIHRob3NlIHJlbGF0aW9ucy5cbiAqXG4gKiB0b2RvOiBhZGQgdHJhbnNhY3Rpb25zIGV2ZXJ5d2hlcmVcbiAqL1xudmFyIFJlbGF0aW9uUmVtb3ZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25SZW1vdmVyKHF1ZXJ5QnVpbGRlciwgZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLnF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwID0gZXhwcmVzc2lvbk1hcDtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHJlbW92ZSBvcGVyYXRpb24gb24gYSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvblJlbW92ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIG9mcywgdmFsdWVzXzEsIHVwZGF0ZVNldF8xLCBwYXJhbWV0ZXJzXzEsIGNvbmRpdGlvbnNfMSwgY29uZGl0aW9uLCBqdW5jdGlvbk1ldGFkYXRhXzEsIG9mcywgdmFsdWVzLCBmaXJzdENvbHVtblZhbHVlcywgc2Vjb25kQ29sdW1uVmFsdWVzXzEsIHBhcmFtZXRlcnNfMiwgY29uZGl0aW9uc18yLCBjb25kaXRpb247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbk1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5pc09uZVRvTWFueSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc18xID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXRfMSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldF8xW2NvbHVtbi5wcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zXzEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mcy5mb3JFYWNoKGZ1bmN0aW9uIChvZiwgb2ZJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMS5wdXNoLmFwcGx5KGNvbmRpdGlvbnNfMSwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHZhbHVlc18xLm1hcChmdW5jdGlvbiAodmFsdWUsIHZhbHVlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJqb2luQ29sdW1uX1wiICsgb2ZJbmRleCArIFwiX1wiICsgdmFsdWVJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzFbcGFyYW1ldGVyTmFtZV0gPSBvZiBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKG9mKSA6IG9mO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpLCBfX3JlYWQocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBcInByaW1hcnlDb2x1bW5fXCIgKyB2YWx1ZUluZGV4ICsgXCJfXCIgKyB2YWx1ZUluZGV4ICsgXCJfXCIgKyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbWV0ZXJOYW1lXSA9IHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbnNfMS5tYXAoZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gXCIoXCIgKyBzdHIgKyBcIilcIjsgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHVwZGF0ZVNldF8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAganVuY3Rpb25NZXRhZGF0YV8xID0gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyA9IEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLm9mKSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5vZiA6IFt0aGlzLmV4cHJlc3Npb25NYXAub2ZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbHVtblZhbHVlcyA9IHJlbGF0aW9uLmlzTWFueVRvTWFueU93bmVyID8gb2ZzIDogdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kQ29sdW1uVmFsdWVzXzEgPSByZWxhdGlvbi5pc01hbnlUb01hbnlPd25lciA/IHZhbHVlcyA6IG9mcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc18yID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbHVtblZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaXJzdENvbHVtblZhbCwgZmlyc3RDb2x1bW5WYWxJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMi5wdXNoLmFwcGx5KGNvbmRpdGlvbnNfMiwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHNlY29uZENvbHVtblZhbHVlc18xLm1hcChmdW5jdGlvbiAoc2Vjb25kQ29sdW1uVmFsLCBzZWNvbmRDb2x1bW5WYWxJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoanVuY3Rpb25NZXRhZGF0YV8xLm93bmVyQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJmaXJzdFZhbHVlX1wiICsgZmlyc3RDb2x1bW5WYWxJbmRleCArIFwiX1wiICsgc2Vjb25kQ29sdW1uVmFsSW5kZXggKyBcIl9cIiArIGNvbHVtbkluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yW3BhcmFtZXRlck5hbWVdID0gZmlyc3RDb2x1bW5WYWwgaW5zdGFuY2VvZiBPYmplY3QgPyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShmaXJzdENvbHVtblZhbCkgOiBmaXJzdENvbHVtblZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lICsgXCIgPSA6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGZhbHNlKSwgX19yZWFkKGp1bmN0aW9uTWV0YWRhdGFfMS5pbnZlcnNlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJzZWNvbmRWYWx1ZV9cIiArIGZpcnN0Q29sdW1uVmFsSW5kZXggKyBcIl9cIiArIHNlY29uZENvbHVtblZhbEluZGV4ICsgXCJfXCIgKyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMltwYXJhbWV0ZXJOYW1lXSA9IHNlY29uZENvbHVtblZhbCBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHNlY29uZENvbHVtblZhbCkgOiBzZWNvbmRDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZSArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBmYWxzZSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uc18yLm1hcChmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBcIihcIiArIHN0ciArIFwiKVwiOyB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oanVuY3Rpb25NZXRhZGF0YV8xLnRhYmxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25SZW1vdmVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uUmVtb3ZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblJlbW92ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTYXBEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NhcC9TYXBEcml2ZXJcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEFsbG93cyB0byB3b3JrIHdpdGggZW50aXR5IHJlbGF0aW9ucyBhbmQgcGVyZm9ybSBzcGVjaWZpYyBvcGVyYXRpb25zIHdpdGggdGhvc2UgcmVsYXRpb25zLlxuICpcbiAqIHRvZG86IGFkZCB0cmFuc2FjdGlvbnMgZXZlcnl3aGVyZVxuICovXG52YXIgUmVsYXRpb25VcGRhdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWxhdGlvblVwZGF0ZXIocXVlcnlCdWlsZGVyLCBleHByZXNzaW9uTWFwKSB7XG4gICAgICAgIHRoaXMucXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgc2V0IG9yIGFkZCBvcGVyYXRpb24gb24gYSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvblVwZGF0ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIHVwZGF0ZVNldCwgdXBkYXRlU2V0XzEsIG9mcywgcGFyYW1ldGVyc18xLCBjb25kaXRpb25zXzEsIGNvbmRpdGlvbiwgb2ZfMSwgdXBkYXRlU2V0LCBqdW5jdGlvbk1ldGFkYXRhXzEsIG9mcywgdmFsdWVzLCBmaXJzdENvbHVtblZhbHVlcywgc2Vjb25kQ29sdW1uVmFsdWVzXzEsIGJ1bGtJbnNlcnRlZF8xO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldCA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLnJlZHVjZShmdW5jdGlvbiAodXBkYXRlU2V0LCBqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCA/IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnNldEVudGl0eVZhbHVlKHVwZGF0ZVNldCwgcmVsYXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm9mIHx8IChBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgJiYgIXRoaXMuZXhwcmVzc2lvbk1hcC5vZi5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCh1cGRhdGVTZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZUluSWRzKHRoaXMuZXhwcmVzc2lvbk1hcC5vZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lciB8fCByZWxhdGlvbi5pc09uZVRvTWFueSkgJiYgdmFsdWUgPT09IG51bGwpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldF8xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0XzFbY29sdW1uLnByb3BlcnR5TmFtZV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMuZm9yRWFjaChmdW5jdGlvbiAob2YsIG9mSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJqb2luQ29sdW1uX1wiICsgb2ZJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbWV0ZXJOYW1lXSA9IG9mIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUob2YpIDogb2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMS5wdXNoKGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb25zXzEubWFwKGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIFwiKFwiICsgc3RyICsgXCIpXCI7IH0pLmpvaW4oXCIgT1IgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUocmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCh1cGRhdGVTZXRfMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIgfHwgcmVsYXRpb24uaXNPbmVUb01hbnkpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIllvdSBjYW5ub3QgdXBkYXRlIHJlbGF0aW9ucyBvZiBtdWx0aXBsZSBlbnRpdGllcyB3aXRoIHRoZSBzYW1lIHJlbGF0ZWQgb2JqZWN0LiBQcm92aWRlIGEgc2luZ2xlIGVudGl0eSBpbnRvIC5vZiBtZXRob2QuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZfMSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldCA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKHVwZGF0ZVNldCwgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvblZhbHVlID0gb2ZfMSBpbnN0YW5jZW9mIE9iamVjdCA/IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShvZl8xKSA6IG9mXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5zZXRFbnRpdHlWYWx1ZSh1cGRhdGVTZXQsIHJlbGF0aW9uVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHVwZGF0ZVNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlSW5JZHModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uTWV0YWRhdGFfMSA9IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2x1bW5WYWx1ZXMgPSByZWxhdGlvbi5pc01hbnlUb01hbnlPd25lciA/IG9mcyA6IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZENvbHVtblZhbHVlc18xID0gcmVsYXRpb24uaXNNYW55VG9NYW55T3duZXIgPyB2YWx1ZXMgOiBvZnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0ZWRfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2x1bW5WYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlyc3RDb2x1bW5WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRDb2x1bW5WYWx1ZXNfMS5mb3JFYWNoKGZ1bmN0aW9uIChzZWNvbmRDb2x1bW5WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uTWV0YWRhdGFfMS5vd25lckNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IGZpcnN0Q29sdW1uVmFsIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZmlyc3RDb2x1bW5WYWwpIDogZmlyc3RDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbk1ldGFkYXRhXzEuaW52ZXJzZUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IHNlY29uZENvbHVtblZhbCBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHNlY29uZENvbHVtblZhbCkgOiBzZWNvbmRDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0ZWRfMS5wdXNoKGluc2VydGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWxrSW5zZXJ0ZWRfMS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeUJ1aWxkZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5xdWVyeUJ1aWxkZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGJ1bGtJbnNlcnRlZF8xLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKGp1bmN0aW9uTWV0YWRhdGFfMS50YWJsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50byhqdW5jdGlvbk1ldGFkYXRhXzEudGFibGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoYnVsa0luc2VydGVkXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25VcGRhdGVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uVXBkYXRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblVwZGF0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBVcGRhdGVzIGVudGl0eSB3aXRoIHJldHVybmluZyByZXN1bHRzIGluIHRoZSBlbnRpdHkgaW5zZXJ0IGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqL1xudmFyIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvcihxdWVyeVJ1bm5lciwgZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcCA9IGV4cHJlc3Npb25NYXA7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGVudGl0aWVzIHdpdGggYSBzcGVjaWFsIGNvbHVtbnMgYWZ0ZXIgdXBkYXRpb24gcXVlcnkgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodXBkYXRlUmVzdWx0LCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eUluZGV4KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQsIHJldHVybmluZ0NvbHVtbnMsIHVwZGF0aW9uQ29sdW1ucywgZW50aXR5SWQsIGxvYWRlZFJldHVybmluZ0NvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgQXJyYXkuaXNBcnJheSh1cGRhdGVSZXN1bHQucmF3KSAmJiB0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdC5yYXcgPSB1cGRhdGVSZXN1bHQucmF3LnJlZHVjZShmdW5jdGlvbiAobmV3UmF3LCByYXdJdGVtLCByYXdJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYXdbX3RoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnNbcmF3SXRlbUluZGV4XS5kYXRhYmFzZU5hbWVdID0gcmF3SXRlbVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkodXBkYXRlUmVzdWx0LnJhdykgPyB1cGRhdGVSZXN1bHQucmF3W2VudGl0eUluZGV4XSA6IHVwZGF0ZVJlc3VsdC5yYXc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnMgPSB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZUdlbmVyYXRlZE1hcChtZXRhZGF0YSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmluZ0NvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGVudGl0eSwgcmV0dXJuaW5nQ29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZXN1bHQuZ2VuZXJhdGVkTWFwcy5wdXNoKHJldHVybmluZ0NvbHVtbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRpb25Db2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodXBkYXRpb25Db2x1bW5zLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IHVwZGF0ZSBlbnRpdHkgYmVjYXVzZSBlbnRpdHkgaWQgaXMgbm90IHNldCBpbiB0aGUgZW50aXR5LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdCh1cGRhdGlvbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIG1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKG1ldGFkYXRhLnRhcmdldCwgbWV0YWRhdGEudGFyZ2V0TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWxldGVkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uKFwiY3JlYXRlLXBvam9cIikgLy8gdXNlIFBPSk8gYmVjYXVzZSBjcmVhdGVkIG9iamVjdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlcywgZS5nLiBwcm9wZXJ0eSA9IG51bGwgYW5kIHRob3NlIHByb3BlcnRpZXMgbWFpZ2h0IGJlIG92ZXJyaWRkZW4gYnkgbWVyZ2UgcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPbmUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRSZXR1cm5pbmdDb2x1bW5zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkUmV0dXJuaW5nQ29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKG1ldGFkYXRhLnRhcmdldCwgZW50aXR5LCBsb2FkZWRSZXR1cm5pbmdDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzLnB1c2gobG9hZGVkUmV0dXJuaW5nQ29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgZW50aXRpZXMgd2l0aCBhIHNwZWNpYWwgY29sdW1ucyBhZnRlciBpbnNlcnRpb24gcXVlcnkgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoaW5zZXJ0UmVzdWx0LCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIGluc2VydGlvbkNvbHVtbnMsIGdlbmVyYXRlZE1hcHMsIGVudGl0eUlkcywgcmV0dXJuaW5nUmVzdWx0XzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uQ29sdW1ucyA9IHRoaXMuZ2V0SW5zZXJ0aW9uUmV0dXJuaW5nQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkTWFwcyA9IGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciAmJiBBcnJheS5pc0FycmF5KGluc2VydFJlc3VsdC5yYXcpICYmIF90aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0LnJhdyA9IGluc2VydFJlc3VsdC5yYXcucmVkdWNlKGZ1bmN0aW9uIChuZXdSYXcsIHJhd0l0ZW0sIHJhd0l0ZW1JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmF3W190aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zW3Jhd0l0ZW1JbmRleF0uZGF0YWJhc2VOYW1lXSA9IHJhd0l0ZW1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgdmFsdWVzIGdlbmVyYXRlZCBieSBhIGRhdGFiYXNlIGZvciB1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5pc0FycmF5KGluc2VydFJlc3VsdC5yYXcpID8gaW5zZXJ0UmVzdWx0LnJhd1tlbnRpdHlJbmRleF0gOiBpbnNlcnRSZXN1bHQucmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0ZWRNYXAgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVHZW5lcmF0ZWRNYXAobWV0YWRhdGEsIHJlc3VsdCwgZW50aXR5SW5kZXgsIGVudGl0aWVzLmxlbmd0aCkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eUluZGV4IGluIF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKG1ldGFkYXRhLnRhcmdldCwgZ2VuZXJhdGVkTWFwLCBfdGhpcy5leHByZXNzaW9uTWFwLmxvY2FsbHlHZW5lcmF0ZWRbZW50aXR5SW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGVudGl0eSwgZ2VuZXJhdGVkTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkTWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkgPT09IGZhbHNlICYmIGluc2VydGlvbkNvbHVtbnMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWRzID0gZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5SWQgPSBtZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGFuIGVtcHR5IGBlbnRpdHlJZGAgLSBpZiB3ZSBkb24ndCwgdGhlIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0aXZlbHkgZHJvcHMgdGhlIGB3aGVyZWAgY2xhdXNlIGVudGlyZWx5IGFuZCB0aGUgZmlyc3QgcmVjb3JkIHdpbGwgYmUgcmV0dXJuZWQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB3aGF0IHdlIHdhbnQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgdXBkYXRlIGVudGl0eSBiZWNhdXNlIGVudGl0eSBpZCBpcyBub3Qgc2V0IGluIHRoZSBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdChpbnNlcnRpb25Db2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20obWV0YWRhdGEudGFyZ2V0LCBtZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoZW50aXR5SWRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uKFwiY3JlYXRlLXBvam9cIikgLy8gdXNlIFBPSk8gYmVjYXVzZSBjcmVhdGVkIG9iamVjdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlcywgZS5nLiBwcm9wZXJ0eSA9IG51bGwgYW5kIHRob3NlIHByb3BlcnRpZXMgbWFpZ2h0IGJlIG92ZXJyaWRkZW4gYnkgbWVyZ2UgcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nUmVzdWx0XzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGdlbmVyYXRlZE1hcHNbZW50aXR5SW5kZXhdLCByZXR1cm5pbmdSZXN1bHRfMVtlbnRpdHlJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIubWVyZ2UobWV0YWRhdGEudGFyZ2V0LCBlbnRpdHksIHJldHVybmluZ1Jlc3VsdF8xW2VudGl0eUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHlJZCA9IG1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0LmlkZW50aWZpZXJzLnB1c2goZW50aXR5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFJlc3VsdC5nZW5lcmF0ZWRNYXBzLnB1c2goZ2VuZXJhdGVkTWFwc1tlbnRpdHlJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29sdW1ucyB3ZSBuZWVkIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIHdoZW4gd2UgaW5zZXJ0IGVudGl0eS5cbiAgICAgKi9cbiAgICBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5wcm90b3R5cGUuZ2V0SW5zZXJ0aW9uUmV0dXJuaW5nQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZm9yIGRhdGFiYXNlcyB3aGljaCBzdXBwb3J0IHJldHVybmluZyBzdGF0ZW1lbnQgd2UgbmVlZCB0byByZXR1cm4gZXh0cmEgY29sdW1ucyBsaWtlIGlkXG4gICAgICAgIC8vIGZvciBvdGhlciBkYXRhYmFzZXMgd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gaWQgY29sdW1uIHNpbmNlIGl0cyByZXR1cm5lZCBieSBhIGRyaXZlciBhbHJlYWR5XG4gICAgICAgIHZhciBuZWVkVG9DaGVja0dlbmVyYXRlZCA9IHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQoKTtcbiAgICAgICAgLy8gZmlsdGVyIG91dCB0aGUgY29sdW1ucyBvZiB3aGljaCB3ZSBuZWVkIGRhdGFiYXNlIGluc2VydGVkIHZhbHVlcyB0byB1cGRhdGUgb3VyIGVudGl0eVxuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIChuZWVkVG9DaGVja0dlbmVyYXRlZCAmJiBjb2x1bW4uaXNHZW5lcmF0ZWQpIHx8XG4gICAgICAgICAgICAgICAgY29sdW1uLmlzQ3JlYXRlRGF0ZSB8fFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pc1VwZGF0ZURhdGUgfHxcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNEZWxldGVEYXRlIHx8XG4gICAgICAgICAgICAgICAgY29sdW1uLmlzVmVyc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2x1bW5zIHdlIG5lZWQgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2Ugd2hlbiB3ZSB1cGRhdGUgZW50aXR5LlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5nZXRVcGRhdGlvblJldHVybmluZ0NvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNVcGRhdGVEYXRlIHx8IGNvbHVtbi5pc1ZlcnNpb247XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29sdW1ucyB3ZSBuZWVkIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIHdoZW4gd2Ugc29mdCBkZWxldGUgYW5kIHJlc3RvcmUgZW50aXR5LlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5nZXRTb2Z0RGVsZXRpb25SZXR1cm5pbmdDb2x1bW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmlzVXBkYXRlRGF0ZSB8fCBjb2x1bW4uaXNWZXJzaW9uIHx8IGNvbHVtbi5pc0RlbGV0ZURhdGU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yO1xufSgpKTtcbmV4cG9ydCB7IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIgfSBmcm9tIFwiLi90cmFuc2Zvcm1lci9SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yXCI7XG5pbXBvcnQgeyBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciB9IGZyb20gXCIuLi9lcnJvci9Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvclwiO1xuaW1wb3J0IHsgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciB9IGZyb20gXCIuLi9lcnJvci9PcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yXCI7XG5pbXBvcnQgeyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIjtcbmltcG9ydCB7IEpvaW5BdHRyaWJ1dGUgfSBmcm9tIFwiLi9Kb2luQXR0cmlidXRlXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIjtcbmltcG9ydCB7IFJlbGF0aW9uSWRMb2FkZXIgfSBmcm9tIFwiLi9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTG9hZGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRMb2FkZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcbmltcG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbGl0ZS1hYnN0cmFjdC9BYnN0cmFjdFNxbGl0ZURyaXZlclwiO1xuaW1wb3J0IHsgT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eU5vdEZvdW5kRXJyb3JcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBTZWxlY3RRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNlbGVjdFF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVTZWxlY3RFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUpvaW5FeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZVdoZXJlRXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVHcm91cEJ5RXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVIYXZpbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0T2Zmc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMb2NrRXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgPSBzcWwudHJpbSgpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnN1YlF1ZXJ5KVxuICAgICAgICAgICAgc3FsID0gXCIoXCIgKyBzcWwgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHNxbDtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3VicXVlcnkgLSBxdWVyeSB0aGF0IGNhbiBiZSB1c2VkIGluc2lkZSBvdGhlciBxdWVyaWVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc3ViUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgIHFiLmV4cHJlc3Npb25NYXAuc3ViUXVlcnkgPSB0cnVlO1xuICAgICAgICBxYi5wYXJlbnRRdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcWI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFNFTEVDVCBxdWVyeSBhbmQgc2VsZWN0cyBnaXZlbiBkYXRhLlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBzZWxlY3Rpb25BbGlhc05hbWUpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9IFwic2VsZWN0XCI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gc2VsZWN0aW9uLm1hcChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7IHJldHVybiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhzdWJRdWVyeUJ1aWxkZXIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnB1c2goeyBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLCBhbGlhc05hbWU6IHNlbGVjdGlvbkFsaWFzTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gW3sgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgc2VsZWN0aW9uIHRvIHRoZSBTRUxFQ1QgcXVlcnkuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRTZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBzZWxlY3Rpb25BbGlhc05hbWUpIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5jb25jYXQoc2VsZWN0aW9uLm1hcChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7IHJldHVybiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc3ViUXVlcnlCdWlsZGVyID0gc2VsZWN0aW9uKHRoaXMuc3ViUXVlcnkoKSk7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMoc3ViUXVlcnlCdWlsZGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBzdWJRdWVyeUJ1aWxkZXIuZ2V0UXVlcnkoKSwgYWxpYXNOYW1lOiBzZWxlY3Rpb25BbGlhc05hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IG1heCBleGVjdXRpb24gdGltZS5cbiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5tYXhFeGVjdXRpb25UaW1lID0gZnVuY3Rpb24gKG1pbGxpc2Vjb25kcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSA9IG1pbGxpc2Vjb25kcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBESVNUSU5DVC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmRpc3RpbmN0ID0gZnVuY3Rpb24gKGRpc3RpbmN0KSB7XG4gICAgICAgIGlmIChkaXN0aW5jdCA9PT0gdm9pZCAwKSB7IGRpc3RpbmN0ID0gdHJ1ZTsgfVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3QgPSBkaXN0aW5jdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXN0aW5jdCBvbiBjbGF1c2UgZm9yIFBvc3RncmVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZGlzdGluY3RPbiA9IGZ1bmN0aW9uIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3REaXN0aW5jdE9uID0gZGlzdGluY3RPbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5mcm9tID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKSB7XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZEZyb20gPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpIHtcbiAgICAgICAgdmFyIGFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKGFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luID0gZnVuY3Rpb24gKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5qb2luKFwiSU5ORVJcIiwgZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGVmdEpvaW4gPSBmdW5jdGlvbiAoZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5pbm5lckpvaW5BbmRTZWxlY3QgPSBmdW5jdGlvbiAoZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcyk7XG4gICAgICAgIHRoaXMuaW5uZXJKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kU2VsZWN0ID0gZnVuY3Rpb24gKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmxlZnRKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luQW5kTWFwTWFueSA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKTtcbiAgICAgICAgdGhpcy5qb2luKFwiSU5ORVJcIiwgZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycywgbWFwVG9Qcm9wZXJ0eSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luQW5kTWFwT25lID0gZnVuY3Rpb24gKG1hcFRvUHJvcGVydHksIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmpvaW4oXCJJTk5FUlwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kTWFwTWFueSA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKTtcbiAgICAgICAgdGhpcy5qb2luKFwiTEVGVFwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kTWFwT25lID0gZnVuY3Rpb24gKG1hcFRvUHJvcGVydHksIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMsIG1hcFRvUHJvcGVydHksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHJlbGF0aW9uIGlkIGFuZCBtYXBzIGl0IGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmVsYXRpb25JZEFuZE1hcCA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCByZWxhdGlvbk5hbWUsIGFsaWFzTmFtZU9yT3B0aW9ucywgcXVlcnlCdWlsZGVyRmFjdG9yeSkge1xuICAgICAgICB2YXIgcmVsYXRpb25JZEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbklkQXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHk7XG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgICAgICBpZiAodHlwZW9mIGFsaWFzTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUuYWxpYXMgPSBhbGlhc05hbWVPck9wdGlvbnM7XG4gICAgICAgIGlmIChhbGlhc05hbWVPck9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QgJiYgYWxpYXNOYW1lT3JPcHRpb25zLmRpc2FibGVNaXhlZE1hcClcbiAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUuZGlzYWJsZU1peGVkTWFwID0gdHJ1ZTtcbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gcXVlcnlCdWlsZGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLnB1c2gocmVsYXRpb25JZEF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChyZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uSWRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvdW50cyBudW1iZXIgb2YgZW50aXRpZXMgb2YgZW50aXR5J3MgcmVsYXRpb24gYW5kIG1hcHMgdGhlIHZhbHVlIGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmVsYXRpb25Db3VudEFuZE1hcCA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCByZWxhdGlvbk5hbWUsIGFsaWFzTmFtZSwgcXVlcnlCdWlsZGVyRmFjdG9yeSkge1xuICAgICAgICB2YXIgcmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHk7XG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLmFsaWFzID0gYWxpYXNOYW1lO1xuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnF1ZXJ5QnVpbGRlckZhY3RvcnkgPSBxdWVyeUJ1aWxkZXJGYWN0b3J5O1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMucHVzaChyZWxhdGlvbkNvdW50QXR0cmlidXRlKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5qdW5jdGlvbkFsaWFzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHJlbGF0aW9uIGlkcyBmb3IgYWxsIHJlbGF0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgZW50aXR5LlxuICAgICAqIEFsbCByZWxhdGlvbiBpZHMgd2lsbCBiZSBtYXBwZWQgdG8gcmVsYXRpb24gcHJvcGVydHkgdGhlbXNlbGYuXG4gICAgICogSWYgYXJyYXkgb2Ygc3RyaW5ncyBpcyBnaXZlbiB0aGVuIGxvYWRzIG9ubHkgcmVsYXRpb24gaWRzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubG9hZEFsbFJlbGF0aW9uSWRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZWxhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlbGF0aW9ucy5pbmRleE9mKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIF90aGlzLmxvYWRSZWxhdGlvbklkQW5kTWFwKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCwgX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IFdIRVJFIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBXSEVSRSBjb25kaXRpb25zLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hbmRXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcImFuZFwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSkgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICpcbiAgICAgKiBJZHMgYXJlIG1peGVkLlxuICAgICAqIEl0IG1lYW5zIGlmIHlvdSBoYXZlIHNpbmdsZSBwcmltYXJ5IGtleSB5b3UgY2FuIHBhc3MgYSBzaW1wbGUgaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSBbMSwgMiwgM10uXG4gICAgICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIHlvdSBuZWVkIHRvIHBhc3Mgb2JqZWN0IHdpdGggcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBzcGVjaWZpZWQsXG4gICAgICogZm9yIGV4YW1wbGUgW3sgZmlyc3RJZDogMSwgc2Vjb25kSWQ6IDIgfSwgeyBmaXJzdElkOiAyLCBzZWNvbmRJZDogMyB9LCAuLi5dXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5kV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcldoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgSEFWSU5HIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgSEFWSU5HIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBIQVZJTkcgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5oYXZpbmcgPSBmdW5jdGlvbiAoaGF2aW5nLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLnB1c2goeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGhhdmluZyB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kSGF2aW5nID0gZnVuY3Rpb24gKGhhdmluZywgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiBoYXZpbmcgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JIYXZpbmcgPSBmdW5jdGlvbiAoaGF2aW5nLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogaGF2aW5nIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIEdST1VQIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgR1JPVVAgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IEdST1VQIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5ncm91cEJ5ID0gZnVuY3Rpb24gKGdyb3VwQnkpIHtcbiAgICAgICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5ncm91cEJ5cyA9IFtncm91cEJ5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5ncm91cEJ5cyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRHcm91cEJ5ID0gZnVuY3Rpb24gKGdyb3VwQnkpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLnB1c2goZ3JvdXBCeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcXFwib3JkZXJcXFwiIGNhbiBhY2NlcHQgb25seSBcXFwiQVNDXFxcIiBhbmQgXFxcIkRFU0NcXFwiIHZhbHVlcy5cIik7XG4gICAgICAgIGlmIChudWxscyAhPT0gdW5kZWZpbmVkICYmIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiYgbnVsbHMgIT09IFwiTlVMTFMgTEFTVFwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFxcXCJudWxsc1xcXCIgY2FuIGFjY2VwdCBvbmx5IFxcXCJOVUxMUyBGSVJTVFxcXCIgYW5kIFxcXCJOVUxMUyBMQVNUXFxcIiB2YWx1ZXMuXCIpO1xuICAgICAgICBpZiAoc29ydCkge1xuICAgICAgICAgICAgaWYgKHNvcnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSBzb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IChfYSA9IHt9LCBfYVtzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfSwgX2EpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9iID0ge30sIF9iW3NvcnRdID0gb3JkZXIsIF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYWRkT3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcXFwib3JkZXJcXFwiIGNhbiBhY2NlcHQgb25seSBcXFwiQVNDXFxcIiBhbmQgXFxcIkRFU0NcXFwiIHZhbHVlcy5cIik7XG4gICAgICAgIGlmIChudWxscyAhPT0gdW5kZWZpbmVkICYmIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiYgbnVsbHMgIT09IFwiTlVMTFMgTEFTVFwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFxcXCJudWxsc1xcXCIgY2FuIGFjY2VwdCBvbmx5IFxcXCJOVUxMUyBGSVJTVFxcXCIgYW5kIFxcXCJOVUxMUyBMQVNUXFxcIiB2YWx1ZXMuXCIpO1xuICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IG9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0J3MgTElNSVQgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqIE5PVEUgdGhhdCBpdCBtYXkgbm90IHdvcmsgYXMgeW91IGV4cGVjdCBpZiB5b3UgYXJlIHVzaW5nIGpvaW5zLlxuICAgICAqIElmIHlvdSB3YW50IHRvIGltcGxlbWVudCBwYWdpbmF0aW9uLCBhbmQgeW91IGFyZSBoYXZpbmcgam9pbiBpbiB5b3VyIHF1ZXJ5LFxuICAgICAqIHRoZW4gdXNlIGluc3RlYWQgdGFrZSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCA9IHRoaXMubm9ybWFsaXplTnVtYmVyKGxpbWl0KTtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgXFxcImxpbWl0XFxcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0J3MgT0ZGU0VUIC0gc2VsZWN0aW9uIG9mZnNldC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHNraXAgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcihvZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9mZnNldCAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIFxcXCJvZmZzZXRcXFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIG1heGltYWwgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHRha2UuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS50YWtlID0gZnVuY3Rpb24gKHRha2UpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnRha2UgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcih0YWtlKTtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlICE9PSB1bmRlZmluZWQgJiYgaXNOYU4odGhpcy5leHByZXNzaW9uTWFwLnRha2UpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIFxcXCJ0YWtlXFxcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBudW1iZXIgb2YgZW50aXRpZXMgdG8gc2tpcC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAoc2tpcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2tpcCA9IHRoaXMubm9ybWFsaXplTnVtYmVyKHNraXApO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnNraXAgIT09IHVuZGVmaW5lZCAmJiBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAuc2tpcCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgXFxcInNraXBcXFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgY2VydGFpbiBpbmRleCB0byBiZSB1c2VkIGJ5IHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBOYW1lIG9mIGluZGV4IHRvIGJlIHVzZWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS51c2VJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlSW5kZXggPSBpbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2tpbmcgbW9kZS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldExvY2sgPSBmdW5jdGlvbiAobG9ja01vZGUsIGxvY2tWZXJzaW9uLCBsb2NrVGFibGVzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9IGxvY2tNb2RlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gPSBsb2NrVmVyc2lvbjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMgPSBsb2NrVGFibGVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBnbG9iYWwgY29uZGl0aW9uIG9mIFwibm9uLWRlbGV0ZWRcIiBmb3IgdGhlIGVudGl0eSB3aXRoIGRlbGV0ZSBkYXRlIGNvbHVtbnMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aXRoRGVsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGZpcnN0IHJhdyByZXN1bHQgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFJhd09uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpWzBdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCByYXcgcmVzdWx0cyByZXR1cm5lZCBieSBleGVjdXRpb24gb2YgZ2VuZXJhdGVkIHF1ZXJ5IGJ1aWxkZXIgc3FsLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UmF3TWFueSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZXN1bHRzLCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA3LCAxMiwgMTVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VUcmFuc2FjdGlvbiA9PT0gdHJ1ZSAmJiBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbOCwgMTAsICwgMTFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHF1ZXJ5UnVubmVyICE9PSB0aGlzLnF1ZXJ5UnVubmVyKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBzcWwgZ2VuZXJhdGVkIGJ5IHF1ZXJ5IGJ1aWxkZXIgYW5kIHJldHVybnMgb2JqZWN0IHdpdGggcmF3IHJlc3VsdHMgYW5kIGVudGl0aWVzIGNyZWF0ZWQgZnJvbSB0aGVtLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UmF3QW5kRW50aXRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgcmVzdWx0cywgZXJyb3JfMiwgcm9sbGJhY2tFcnJvcl8yO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgNywgMTIsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlRW50aXRpZXNBbmRSYXdSZXN1bHRzKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs4LCAxMCwgLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgc2luZ2xlIGVudGl0eSByZXR1cm5lZCBieSBleGVjdXRpb24gb2YgZ2VuZXJhdGVkIHF1ZXJ5IGJ1aWxkZXIgc3FsLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0T25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cywgcmVzdWx0LCBtZXRhZGF0YSwgYWN0dWFsVmVyc2lvbiwgYWN0dWFsVmVyc2lvbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSYXdBbmRFbnRpdGllcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMuZW50aXRpZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIgJiYgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFZlcnNpb24gPSBtZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmdldEVudGl0eVZhbHVlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxWZXJzaW9uLmdldFRpbWUoKSAhPT0gdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLmdldFRpbWUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yKG1ldGFkYXRhLm5hbWUsIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrVmVyc2lvbiwgYWN0dWFsVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbkNvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVmVyc2lvbiAhPT0gdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IobWV0YWRhdGEubmFtZSwgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbnRpdHkgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbCBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0T25lT3JGYWlsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldE9uZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Tm90Rm91bmRFcnJvcih0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLnRhcmdldCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50aXR5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0aWVzIHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRNYW55ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJhd0FuZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHMuZW50aXRpZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgY291bnQgLSBudW1iZXIgb2YgZW50aXRpZXMgc2VsZWN0ZWQgYnkgc3FsIGdlbmVyYXRlZCBieSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQ291bnQgZXhjbHVkZXMgYWxsIGxpbWl0YXRpb25zIHNldCBieSBzZXRGaXJzdFJlc3VsdCBhbmQgc2V0TWF4UmVzdWx0cyBtZXRob2RzIGNhbGwuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZXN1bHRzLCBlcnJvcl8zLCByb2xsYmFja0Vycm9yXzM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgNywgMTIsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzgsIDEwLCAsIDExXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6IHRocm93IGVycm9yXzM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGVudGl0aWVzIGFuZCBvdmVyYWxsIGVudGl0aWVzIGNvdW50ICh3aXRob3V0IGxpbWl0YXRpb24pLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBidWlsZCBwYWdpbmF0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0TWFueUFuZENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGVudGl0aWVzQW5kUmF3LCBjYWNoZUlkLCBjb3VudCwgcmVzdWx0cywgZXJyb3JfNCwgcm9sbGJhY2tFcnJvcl80O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDgsIDEzLCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUVudGl0aWVzQW5kUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllc0FuZFJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeUVudGl0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVJZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBjYWNoZUlkIGZvciB0aGUgY291bnQgcXVlcnksIG9yIGl0IHdpbGwgcmV0cmVpdmUgdGhlIGFib3ZlIHF1ZXJ5IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VudCB3aWxsIHJldHVybiAwLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSAoY2FjaGVJZCkgPyBjYWNoZUlkICsgXCItY291bnRcIiA6IGNhY2hlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtlbnRpdGllc0FuZFJhdy5lbnRpdGllcywgY291bnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl80ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbOSwgMTEsICwgMTJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IHRocm93IGVycm9yXzQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHJhdyBkYXRhIHN0cmVhbS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzcWwsIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZWxlYXNlRm4sIHJlc3VsdHMsIGVycm9yXzUsIHJvbGxiYWNrRXJyb3JfNTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX19yZWFkKHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKCksIDIpLCBzcWwgPSBfYVswXSwgcGFyYW1ldGVycyA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgNiwgLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gX3RoaXMucXVlcnlSdW5uZXIpIC8vIG1lYW5zIHdlIGNyZWF0ZWQgb3VyIG93biBxdWVyeSBydW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHF1ZXJ5UnVubmVyLnN0cmVhbShzcWwsIHBhcmFtZXRlcnMsIHJlbGVhc2VGbiwgcmVsZWFzZUZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzcsIDksICwgMTBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl81ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiB0aHJvdyBlcnJvcl81O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZy5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNhY2hlID0gZnVuY3Rpb24gKGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQsIG1heWJlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZE9yTWlsbGlzZWNvbmRzT3JJZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVEdXJhdGlvbiA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVEdXJhdGlvbiA9IG1heWJlTWlsbGlzZWNvbmRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBxdWVyeSBidWlsZGVyIHdvcmtzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0T3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChkaXJlY3Rpb24sIGVudGl0eU9yUHJvcGVydHksIGFsaWFzTmFtZSwgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCBpc01hcHBpbmdNYW55KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzIHx8IHt9KTtcbiAgICAgICAgdmFyIGpvaW5BdHRyaWJ1dGUgPSBuZXcgSm9pbkF0dHJpYnV0ZSh0aGlzLmNvbm5lY3Rpb24sIHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICBqb2luQXR0cmlidXRlLm1hcFRvUHJvcGVydHkgPSBtYXBUb1Byb3BlcnR5O1xuICAgICAgICBqb2luQXR0cmlidXRlLmlzTWFwcGluZ01hbnkgPSBpc01hcHBpbmdNYW55O1xuICAgICAgICBqb2luQXR0cmlidXRlLmVudGl0eU9yUHJvcGVydHkgPSBlbnRpdHlPclByb3BlcnR5OyAvLyByZWxhdGlvbk5hbWVcbiAgICAgICAgam9pbkF0dHJpYnV0ZS5jb25kaXRpb24gPSBjb25kaXRpb24gPyBjb25kaXRpb24gOiB1bmRlZmluZWQ7IC8vIGpvaW5JbnZlcnNlU2lkZUNvbmRpdGlvblxuICAgICAgICAvLyBqb2luQXR0cmlidXRlLmp1bmN0aW9uQWxpYXMgPSBqb2luQXR0cmlidXRlLnJlbGF0aW9uLmlzT3duaW5nID8gcGFyZW50QWxpYXMgKyBcIl9cIiArIGRlc3RpbmF0aW9uVGFibGVBbGlhcyA6IGRlc3RpbmF0aW9uVGFibGVBbGlhcyArIFwiX1wiICsgcGFyZW50QWxpYXM7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5wdXNoKGpvaW5BdHRyaWJ1dGUpO1xuICAgICAgICBpZiAoam9pbkF0dHJpYnV0ZS5tZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbiAmJiAhdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkRlbGV0ZUNvbHVtbiA9IGFsaWFzTmFtZSArIFwiLlwiICsgam9pbkF0dHJpYnV0ZS5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiA9IGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uID8gXCIgXCIgKyBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiArIFwiIEFORCBcIiArIGNvbmRpdGlvbkRlbGV0ZUNvbHVtbiA6IFwiXCIgKyBjb25kaXRpb25EZWxldGVDb2x1bW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b2RvOiBmaW5kIGFuZCBzZXQgbWV0YWRhdGEgcmlnaHQgdGhlcmU/XG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUubWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUucmVsYXRpb24gJiYgam9pbkF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqb2luXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5BdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChlbnRpdHlPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViUXVlcnlCdWlsZGVyID0gZW50aXR5T3JQcm9wZXJ0eSh0aGlzLnN1YlF1ZXJ5KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhzdWJRdWVyeUJ1aWxkZXIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgICAgICAgICAgICBzdWJRdWVyeSA9IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViUXVlcnkgPSBlbnRpdHlPclByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzU3ViUXVlcnkgPSBlbnRpdHlPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgMSkgPT09IFwiKFwiICYmIGVudGl0eU9yUHJvcGVydHkuc3Vic3RyKC0xKSA9PT0gXCIpXCI7XG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoOiBpc1N1YlF1ZXJ5ID09PSBmYWxzZSA/IGVudGl0eU9yUHJvcGVydHkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IGlzU3ViUXVlcnkgPT09IHRydWUgPyBzdWJRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiU0VMRUNUIEZST01cIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVNlbGVjdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgYnVpbGQgcXVlcnkgYmVjYXVzZSBtYWluIGFsaWFzIGlzIG5vdCBzZXQgKGNhbGwgcWIjZnJvbSBtZXRob2QpXCIpO1xuICAgICAgICAvLyB0b2RvIHRocm93IGV4Y2VwdGlvbiBpZiBzZWxlY3RzIG9yIGZyb20gaXMgbWlzc2luZ1xuICAgICAgICB2YXIgYWxsU2VsZWN0cyA9IFtdO1xuICAgICAgICB2YXIgZXhjbHVkZWRTZWxlY3RzID0gW107XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoLmFwcGx5KGFsbFNlbGVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmJ1aWxkRXNjYXBlZEVudGl0eUNvbHVtblNlbGVjdHModGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCBtZXRhZGF0YSkpLCBmYWxzZSkpO1xuICAgICAgICAgICAgZXhjbHVkZWRTZWxlY3RzLnB1c2guYXBwbHkoZXhjbHVkZWRTZWxlY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsIG1ldGFkYXRhKSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIHNlbGVjdHMgZnJvbSBqb2luc1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChqb2luKSB7XG4gICAgICAgICAgICBpZiAoam9pbi5tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaC5hcHBseShhbGxTZWxlY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoX3RoaXMuYnVpbGRFc2NhcGVkRW50aXR5Q29sdW1uU2VsZWN0cyhqb2luLmFsaWFzLm5hbWUsIGpvaW4ubWV0YWRhdGEpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaC5hcHBseShleGNsdWRlZFNlbGVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChfdGhpcy5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyhqb2luLmFsaWFzLm5hbWUsIGpvaW4ubWV0YWRhdGEpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYXNNYWluQWxpYXMgPSBfdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuc29tZShmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBqb2luLmFsaWFzLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBfdGhpcy5lc2NhcGUoam9pbi5hbGlhcy5uYW1lKSArIFwiLipcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1ZGVkU2VsZWN0ID0gX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbmQoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gam9pbi5hbGlhcy5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRTZWxlY3RzLnB1c2goZXhjbHVkZWRTZWxlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFkZCBhbGwgb3RoZXIgc2VsZWN0c1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0c1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBleGNsdWRlZFNlbGVjdHMuaW5kZXhPZihzZWxlY3QpID09PSAtMTsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIGFsbFNlbGVjdHMucHVzaCh7IHNlbGVjdGlvbjogX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoc2VsZWN0LnNlbGVjdGlvbiksIGFsaWFzTmFtZTogc2VsZWN0LmFsaWFzTmFtZSB9KTsgfSk7XG4gICAgICAgIC8vIGlmIHN0aWxsIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlbiBzaW1wbHkgc2V0IGl0IHRvIGFsbCAoKilcbiAgICAgICAgaWYgKGFsbFNlbGVjdHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBcIipcIiB9KTtcbiAgICAgICAgdmFyIGxvY2sgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICBsb2NrID0gXCIgV0lUSCAoSE9MRExPQ0ssIFJPV0xPQ0spXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZVwiOlxuICAgICAgICAgICAgICAgICAgICBsb2NrID0gXCIgV0lUSCAoVVBETE9DSywgUk9XTE9DSylcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRpcnR5X3JlYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgbG9jayA9IFwiIFdJVEggKE5PTE9DSylcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGNlcnRhaW4gaW5kZXhcbiAgICAgICAgdmFyIHVzZUluZGV4ID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgIHVzZUluZGV4ID0gXCIgVVNFIElOREVYIChcIiArIHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCArIFwiKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIHNlbGVjdGlvbiBxdWVyeVxuICAgICAgICB2YXIgZnJvbXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNlc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIGFsaWFzLnR5cGUgPT09IFwiZnJvbVwiICYmIChhbGlhcy50YWJsZVBhdGggfHwgYWxpYXMuc3ViUXVlcnkpOyB9KVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgIGlmIChhbGlhcy5zdWJRdWVyeSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXMuc3ViUXVlcnkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShhbGlhcy5uYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5nZXRUYWJsZU5hbWUoYWxpYXMudGFibGVQYXRoKSArIFwiIFwiICsgX3RoaXMuZXNjYXBlKGFsaWFzLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNlbGVjdCA9IHRoaXMuY3JlYXRlU2VsZWN0RGlzdGluY3RFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBhbGxTZWxlY3RzLm1hcChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uICsgKHNlbGVjdC5hbGlhc05hbWUgPyBcIiBBUyBcIiArIF90aGlzLmVzY2FwZShzZWxlY3QuYWxpYXNOYW1lKSA6IFwiXCIpOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBzZWxlY3QgKyBzZWxlY3Rpb24gKyBcIiBGUk9NIFwiICsgZnJvbXMuam9pbihcIiwgXCIpICsgbG9jayArIHVzZUluZGV4O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzZWxlY3QgfCBzZWxlY3QgZGlzdGluY3QgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVTZWxlY3REaXN0aW5jdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZXhwcmVzc2lvbk1hcCwgc2VsZWN0RGlzdGluY3QgPSBfYS5zZWxlY3REaXN0aW5jdCwgc2VsZWN0RGlzdGluY3RPbiA9IF9hLnNlbGVjdERpc3RpbmN0T24sIG1heEV4ZWN1dGlvblRpbWUgPSBfYS5tYXhFeGVjdXRpb25UaW1lO1xuICAgICAgICB2YXIgZHJpdmVyID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlcjtcbiAgICAgICAgdmFyIHNlbGVjdCA9IFwiU0VMRUNUIFwiO1xuICAgICAgICBpZiAobWF4RXhlY3V0aW9uVGltZSA+IDApIHtcbiAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgIHNlbGVjdCArPSBcIi8qKyBNQVhfRVhFQ1VUSU9OX1RJTUUoXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSArIFwiKSAqLyBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgc2VsZWN0RGlzdGluY3RPbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0RGlzdGluY3RPbk1hcCA9IHNlbGVjdERpc3RpbmN0T24ubWFwKGZ1bmN0aW9uIChvbikgeyByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMob24pOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBPTiAoXCIgKyBzZWxlY3REaXN0aW5jdE9uTWFwICsgXCIpIFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdERpc3RpbmN0KSB7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkpPSU5cIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUpvaW5FeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBleGFtcGxlczpcbiAgICAgICAgLy8gc2VsZWN0IGZyb20gb3duaW5nIHNpZGVcbiAgICAgICAgLy8gcWIuc2VsZWN0KFwicG9zdFwiKVxuICAgICAgICAvLyAgICAgLmxlZnRKb2luQW5kU2VsZWN0KFwicG9zdC5jYXRlZ29yeVwiLCBcImNhdGVnb3J5XCIpO1xuICAgICAgICAvLyBzZWxlY3QgZnJvbSBub24tb3duaW5nIHNpZGVcbiAgICAgICAgLy8gcWIuc2VsZWN0KFwiY2F0ZWdvcnlcIilcbiAgICAgICAgLy8gICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdChcImNhdGVnb3J5LnBvc3RcIiwgXCJwb3N0XCIpO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgam9pbnMgPSB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChqb2luQXR0cikge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gam9pbkF0dHIucmVsYXRpb247XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25UYWJsZU5hbWUgPSBqb2luQXR0ci50YWJsZVBhdGg7XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25UYWJsZUFsaWFzID0gam9pbkF0dHIuYWxpYXMubmFtZTtcbiAgICAgICAgICAgIHZhciBhcHBlbmRlZENvbmRpdGlvbiA9IGpvaW5BdHRyLmNvbmRpdGlvbiA/IFwiIEFORCAoXCIgKyBqb2luQXR0ci5jb25kaXRpb24gKyBcIilcIiA6IFwiXCI7XG4gICAgICAgICAgICB2YXIgcGFyZW50QWxpYXMgPSBqb2luQXR0ci5wYXJlbnRBbGlhcztcbiAgICAgICAgICAgIC8vIGlmIGpvaW4gd2FzIGJ1aWxkIHdpdGhvdXQgcmVsYXRpb24gKGUuZy4gd2l0aG91dCBcInBvc3QuY2F0ZWdvcnlcIikgdGhlbiBpdCBtZWFucyB0aGF0IHdlIGhhdmUgZGlyZWN0XG4gICAgICAgICAgICAvLyB0YWJsZSB0byBqb2luLCB3aXRob3V0IGp1bmN0aW9uIHRhYmxlIGludm9sdmVkLiBUaGlzIG1lYW5zIHdlIHNpbXBseSBqb2luIGRpcmVjdCB0YWJsZS5cbiAgICAgICAgICAgIGlmICghcGFyZW50QWxpYXMgfHwgIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlc3RpbmF0aW9uSm9pbiA9IGpvaW5BdHRyLmFsaWFzLnN1YlF1ZXJ5ID8gam9pbkF0dHIuYWxpYXMuc3ViUXVlcnkgOiBfdGhpcy5nZXRUYWJsZU5hbWUoZGVzdGluYXRpb25UYWJsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIiBcIiArIGpvaW5BdHRyLmRpcmVjdGlvbiArIFwiIEpPSU4gXCIgKyBkZXN0aW5hdGlvbkpvaW4gKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICtcbiAgICAgICAgICAgICAgICAgICAgKGpvaW5BdHRyLmNvbmRpdGlvbiA/IFwiIE9OIFwiICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoam9pbkF0dHIuY29uZGl0aW9uKSA6IFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgcmVhbCBlbnRpdHkgcmVsYXRpb24gaXMgaW52b2x2ZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBKT0lOIGBjYXRlZ29yeWAgYGNhdGVnb3J5YCBPTiBgY2F0ZWdvcnlgLmBpZGAgPSBgcG9zdGAuYGNhdGVnb3J5SWRgXG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIFwiICsgam9pbkF0dHIuZGlyZWN0aW9uICsgXCIgSk9JTiBcIiArIF90aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICsgXCIgT04gXCIgKyBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc09uZVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBKT0lOIGBwb3N0YCBgcG9zdGAgT04gYHBvc3RgLmBjYXRlZ29yeUlkYCA9IGBjYXRlZ29yeWAuYGlkYFxuICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZENvbmRpdGlvbiArPSBcIiBBTkQgXCIgKyBkZXN0aW5hdGlvblRhYmxlQWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZSArIFwiPSdcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWUgKyBcIidcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIiBcIiArIGpvaW5BdHRyLmRpcmVjdGlvbiArIFwiIEpPSU4gXCIgKyBfdGhpcy5nZXRUYWJsZU5hbWUoZGVzdGluYXRpb25UYWJsZU5hbWUpICsgXCIgXCIgKyBfdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArIFwiIE9OIFwiICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29uZGl0aW9uICsgYXBwZW5kZWRDb25kaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1lYW5zIG1hbnktdG8tbWFueVxuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEudGFibGVQYXRoO1xuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvbkFsaWFzXzEgPSBqb2luQXR0ci5qdW5jdGlvbkFsaWFzO1xuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvbkNvbmRpdGlvbiA9IFwiXCIsIGRlc3RpbmF0aW9uQ29uZGl0aW9uID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAganVuY3Rpb25Db25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwb3N0X2NhdGVnb3J5YC5gcG9zdElkYCA9IGBwb3N0YC5gaWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgY2F0ZWdvcnlgLmBpZGAgPSBgcG9zdF9jYXRlZ29yeWAuYGNhdGVnb3J5SWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgKyBqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbmRpdGlvbiA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcG9zdF9jYXRlZ29yeWAuYGNhdGVnb3J5SWRgID0gYGNhdGVnb3J5YC5gaWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcG9zdGAuYGlkYCA9IGBwb3N0X2NhdGVnb3J5YC5gcG9zdElkYFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgXCIgKyBqb2luQXR0ci5kaXJlY3Rpb24gKyBcIiBKT0lOIFwiICsgX3RoaXMuZ2V0VGFibGVOYW1lKGp1bmN0aW9uVGFibGVOYW1lKSArIFwiIFwiICsgX3RoaXMuZXNjYXBlKGp1bmN0aW9uQWxpYXNfMSkgKyBcIiBPTiBcIiArIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGp1bmN0aW9uQ29uZGl0aW9uKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICsgam9pbkF0dHIuZGlyZWN0aW9uICsgXCIgSk9JTiBcIiArIF90aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICsgXCIgT04gXCIgKyBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhkZXN0aW5hdGlvbkNvbmRpdGlvbiArIGFwcGVuZGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBqb2lucy5qb2luKFwiIFwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJHUk9VUCBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIHJldHVybiBcIiBHUk9VUCBCWSBcIiArIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXModGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLmpvaW4oXCIsIFwiKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiT1JERVIgQllcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxsT3JkZXJCeXM7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmRlckJ5cykubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBcIiBPUkRFUiBCWSBcIiArIE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yZGVyQnlzW2NvbHVtbk5hbWVdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29sdW1uTmFtZSkgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm9yZGVyICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXS5udWxscztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkxJTUlUXCIgYW5kIFwiT0ZGU0VUXCIgcGFydHMgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTGltaXRPZmZzZXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiBub3RoaW5nIGlzIGpvaW5lZCBpbiB0aGUgcXVlcnkgYnVpbGRlciB3ZSBkb24ndCBuZWVkIHRvIG1ha2UgdHdvIHJlcXVlc3RzIHRvIGdldCBwYWdpbmF0ZWQgcmVzdWx0c1xuICAgICAgICAvLyB3ZSBjYW4gdXNlIHJlZ3VsYXIgbGltaXQgLyBvZmZzZXQsIHRoYXQncyB3aHkgd2UgYWRkIG9mZnNldCBhbmQgbGltaXQgY29uc3RydWN0aW9uIGhlcmUgYmFzZWQgb24gc2tpcCBhbmQgdGFrZSB2YWx1ZXNcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQsIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0O1xuICAgICAgICBpZiAoIW9mZnNldCAmJiAhbGltaXQgJiYgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNraXA7XG4gICAgICAgICAgICBsaW1pdCA9IHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gYSBsaW1pdGF0aW9uIGluIFNRTCBTZXJ2ZXIncyBwYXJzZXIgaW1wbGVtZW50YXRpb24gaXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZ1xuICAgICAgICAgICAgLy8gT0ZGU0VUIG9yIEZFVENIIE5FWFQgd2l0aG91dCBhbiBPUkRFUiBCWSBjbGF1c2UgYmVpbmcgcHJvdmlkZWQuIEluIGNhc2VzIHdoZXJlIHRoZVxuICAgICAgICAgICAgLy8gdXNlciBkb2VzIG5vdCByZXF1ZXN0IG9uZSB3ZSBpbnNlcnQgYSBkdW1teSBPUkRFUiBCWSB0aGF0IGRvZXMgbm90aGluZyBhbmQgc2hvdWxkXG4gICAgICAgICAgICAvLyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgcXVlcnkgcGxhbm5lciBvciBvbiB0aGUgb3JkZXIgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQuXG4gICAgICAgICAgICAvLyBodHRwczovL2RiYS5zdGFja2V4Y2hhbmdlLmNvbS9hLzE5Mzc5OVxuICAgICAgICAgICAgdmFyIHByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoKGxpbWl0IHx8IG9mZnNldCkgJiYgT2JqZWN0LmtleXModGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzKS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiIE9SREVSIEJZIChTRUxFQ1QgTlVMTClcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiIE9GRlNFVCBcIiArIG9mZnNldCArIFwiIFJPV1MgRkVUQ0ggTkVYVCBcIiArIGxpbWl0ICsgXCIgUk9XUyBPTkxZXCI7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiIE9GRlNFVCAwIFJPV1MgRkVUQ0ggTkVYVCBcIiArIGxpbWl0ICsgXCIgUk9XUyBPTkxZXCI7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcikge1xuICAgICAgICAgICAgaWYgKGxpbWl0ICYmIG9mZnNldClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdCArIFwiIE9GRlNFVCBcIiArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIC0xIE9GRlNFVCBcIiArIG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTIEZFVENIIE5FWFQgXCIgKyBsaW1pdCArIFwiIFJPV1MgT05MWVwiO1xuICAgICAgICAgICAgaWYgKGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBGRVRDSCBORVhUIFwiICsgbGltaXQgKyBcIiBST1dTIE9OTFlcIjtcbiAgICAgICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIE9GRlNFVCBcIiArIG9mZnNldCArIFwiIFJPV1NcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTE9DS1wiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTG9ja0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkcml2ZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyO1xuICAgICAgICB2YXIgbG9ja1RhYmxlc0NsYXVzZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcykge1xuICAgICAgICAgICAgaWYgKCEoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgfHwgZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJMb2NrIHRhYmxlcyBub3Qgc3VwcG9ydGVkIGluIHNlbGVjdGVkIGRyaXZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2tUYWJsZXMgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja1RhYmxlc0NsYXVzZSA9IFwiIE9GIFwiICsgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMuam9pbihcIiwgXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBMT0NLIElOIFNIQVJFIE1PREVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBTSEFSRVwiICsgbG9ja1RhYmxlc0NsYXVzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3dyaXRlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIgfHwgZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIFwiIFNLSVAgTE9DS0VEXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIFwiIE5PV0FJVFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURSBOT1dBSVRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZvcl9ub19rZXlfdXBkYXRlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIE5PIEtFWSBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJIQVZJTkdcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUhhdmluZ0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3MgfHwgIXRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB2YXIgY29uZGl0aW9ucyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLm1hcChmdW5jdGlvbiAoaGF2aW5nLCBpbmRleCkge1xuICAgICAgICAgICAgc3dpdGNoIChoYXZpbmcudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA+IDAgPyBcIkFORCBcIiA6IFwiXCIpICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPiAwID8gXCJPUiBcIiA6IFwiXCIpICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGhhdmluZy5jb25kaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKCFjb25kaXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICByZXR1cm4gXCIgSEFWSU5HIFwiICsgY29uZGl0aW9ucztcbiAgICB9O1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYnVpbGRFc2NhcGVkRW50aXR5Q29sdW1uU2VsZWN0cyA9IGZ1bmN0aW9uIChhbGlhc05hbWUsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNNYWluQWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5zb21lKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZTsgfSk7XG4gICAgICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaC5hcHBseShjb2x1bW5zLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQobWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzU2VsZWN0ID09PSB0cnVlOyB9KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1ucy5wdXNoLmFwcGx5KGNvbHVtbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChtZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KTtcbiAgICAgICAgfSkpLCBmYWxzZSkpO1xuICAgICAgICAvLyBpZiB1c2VyIHVzZWQgcGFydGlhbCBzZWxlY3Rpb24gYW5kIGRpZCBub3Qgc2VsZWN0IHNvbWUgcHJpbWFyeSBjb2x1bW5zIHdoaWNoIGFyZSByZXF1aXJlZCB0byBiZSBzZWxlY3RlZFxuICAgICAgICAvLyB3ZSBzZWxlY3QgdGhvc2UgcHJpbWFyeSBjb2x1bW5zIGFuZCBtYXJrIHRoZW0gYXMgXCJ2aXJ0dWFsXCIuIExhdGVyIHZpcnR1YWwgY29sdW1uIHZhbHVlcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmaW5hbCBlbnRpdHlcbiAgICAgICAgLy8gdG8gbWFrZSBlbnRpdHkgY29udGFpbiBleGFjdGx5IHdoYXQgdXNlciBzZWxlY3RlZFxuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIC8vIGhvd2V2ZXIgbm90IGluIHRoZSBjYXNlIHdoZW4gbm90aGluZyAoZXZlbiBwYXJ0aWFsKSB3YXMgc2VsZWN0ZWQgZnJvbSB0aGlzIHRhcmdldCAoZm9yIGV4YW1wbGUgam9pbnMgd2l0aG91dCBzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHZhciBub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID8gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7IHJldHVybiBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUNvbHVtbikgPT09IC0xOyB9KSA6IFtdO1xuICAgICAgICB2YXIgYWxsQ29sdW1ucyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGNvbHVtbnMpLCBmYWxzZSksIF9fcmVhZChub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zKSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IF90aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICB2YXIgc2VsZWN0aW9uUGF0aCA9IF90aGlzLmVzY2FwZShhbGlhc05hbWUpICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzVGV4dCA9IHVzZUxlZ2FjeSA/IFwiQXNUZXh0XCIgOiBcIlNUX0FzVGV4dFwiO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXRoID0gYXNUZXh0ICsgXCIoXCIgKyBzZWxlY3Rpb25QYXRoICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKVxuICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IHRvIEpTT04gdG8gdHJpZ2dlciBwYXJzaW5nIGluIHRoZSBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5wcmVjaXNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhdGggPSBcIlNUX0FzR2VvSlNPTihcIiArIHNlbGVjdGlvblBhdGggKyBcIiwgXCIgKyBjb2x1bW4ucHJlY2lzaW9uICsgXCIpOjpqc29uXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXRoID0gXCJTVF9Bc0dlb0pTT04oXCIgKyBzZWxlY3Rpb25QYXRoICsgXCIpOjpqc29uXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhdGggPSBzZWxlY3Rpb25QYXRoICsgXCIuVG9TdHJpbmcoKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmFsaWFzTmFtZSA/IHNlbGVjdGlvbi5hbGlhc05hbWUgOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCBhbGlhc05hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpLFxuICAgICAgICAgICAgICAgIC8vIHRvZG86IG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgY3VzdG9tIHNlbGVjdGlvbi5hbGlhc05hbWUgYnJlYWtzIGh5ZHJhdG9yLiBmaXggaXQgbGF0ZXIhXG4gICAgICAgICAgICAgICAgdmlydHVhbDogc2VsZWN0aW9uID8gc2VsZWN0aW9uLnZpcnR1YWwgPT09IHRydWUgOiAoaGFzTWFpbkFsaWFzID8gZmFsc2UgOiB0cnVlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyA9IGZ1bmN0aW9uIChhbGlhc05hbWUsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBtYWluU2VsZWN0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWU7IH0pO1xuICAgICAgICBpZiAobWFpblNlbGVjdClcbiAgICAgICAgICAgIHJldHVybiBbbWFpblNlbGVjdF07XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHNlbGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmNvbHVtbnMuc29tZShmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY29tcHV0ZUNvdW50RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZTsgLy8gdG9kbzogd2lsbCB0aGlzIHdvcmsgd2l0aCBcImZyb21UYWJsZU5hbWVcIj9cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgIHZhciBkaXN0aW5jdEFsaWFzID0gdGhpcy5lc2NhcGUobWFpbkFsaWFzKTtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IGRvaW5nIGFueXRoaW5nIHRoYXQgd2lsbCBjcmVhdGUgYSBqb2luLCB3ZSBjYW4gdXNlIGEgc2ltcGxlciBgQ09VTlRgIGluc3RlYWRcbiAgICAgICAgLy8gc28gd2UgcHJldmVudCBwb29yIHF1ZXJ5IHBhdHRlcm5zIGluIHRoZSBtb3N0IGxpa2VseSBjYXNlc1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiQ09VTlQoMSlcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSdsbCBuZWVkIHRvIGRvIHNvbWUgaGFja2VyeSB0byBnZXQgdGhlIGNvcnJlY3QgY291bnQgdmFsdWVzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVzIGFuZCBDb2Nrcm9hY2hEQiBjYW4gcGFzcyBtdWx0aXBsZSBwYXJhbWV0ZXJzIHRvIHRoZSBgRElTVElOQ1RgIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzkuNS9zcWwtc2VsZWN0Lmh0bWwjU1FMLURJU1RJTkNUXG4gICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVChcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBkaXN0aW5jdEFsaWFzICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgIFwiKSlcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBNeVNRTCAmIE1hcmlhREIgY2FuIHBhc3MgbXVsdGlwbGUgcGFyYW1ldGVycyB0byB0aGUgYERJU1RJTkNUYCBsYW5ndWFnZSBjb25zdHJ1Y3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWFyaWFkYi5jb20va2IvZW4vY291bnQtZGlzdGluY3QvXG4gICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVCBcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBkaXN0aW5jdEFsaWFzICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBTUUwgU2VydmVyIGhhcyBnb3R0YSBiZSBkaWZmZXJlbnQgZnJvbSBldmVyeW9uZSBlbHNlLiAgVGhleSBkb24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBkaXN0aW5jdCBjb3VudGluZyBtdWx0aXBsZSBjb2x1bW5zICYgdGhleSBkb24ndCBoYXZlIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAgICAgICAgICAvLyBjaGFyYWN0ZXJpc3RpYyBmb3IgY29uY2F0ZW5hdGluZywgc28gd2UgZ290dGEgdXNlIHRoZSBgQ09OQ0FUYCBmdW5jdGlvbi5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIElmIGl0J3MgZXhhY3RseSAxIGNvbHVtbiB3ZSBjYW4gb21pdCB0aGUgYENPTkNBVGAgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICAgICAgICAgIHZhciBjb2x1bW5zRXhwcmVzc2lvbiA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikgeyByZXR1cm4gZGlzdGluY3RBbGlhcyArIFwiLlwiICsgX3RoaXMuZXNjYXBlKHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKTsgfSkuam9pbihcIiwgJ3w7fCcsIFwiKTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVChcIiArIGNvbHVtbnNFeHByZXNzaW9uICsgXCIpKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiQ09VTlQoRElTVElOQ1QoQ09OQ0FUKFwiICsgY29sdW1uc0V4cHJlc3Npb24gKyBcIikpKVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCBmYWxsIGJhY2sgdG8gYSBgQ09VTlRgIGFuZCBgRElTVElOQ1RgIGFjcm9zcyBhbGwgdGhlIHByaW1hcnkgY29sdW1ucyBjb25jYXRlbmF0ZWQuXG4gICAgICAgIC8vIFBlciB0aGUgU1FMIHNwZWMsIHRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBtZWNoYW5pc20gd2hpY2ggaXMgbW9zdFxuICAgICAgICAvLyBsaWtlbHkgdG8gd29yayBhY3Jvc3Mgc2VydmVycyBpbXBsZW1lbnRpbmcgdGhlIFNRTCBzdGFuZGFyZC5cbiAgICAgICAgLy8gUGxlYXNlIG5vdGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHByaW1hcnkgY29sdW1uIHRoYXQgdGhlIGNvbmNhdGVuYXRpb24gZG9lcyBub3Qgb2NjdXIgaW4gdGhpc1xuICAgICAgICAvLyBxdWVyeSBhbmQgdGhlIHF1ZXJ5IGlzIGEgc3RhbmRhcmQgYENPVU5UIERJU1RJTkNUYCBpbiB0aGF0IGNhc2UuXG4gICAgICAgIHJldHVybiBcIkNPVU5UKERJU1RJTkNUKFwiICtcbiAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gZGlzdGluY3RBbGlhcyArIFwiLlwiICsgX3RoaXMuZXNjYXBlKGMuZGF0YWJhc2VOYW1lKTsgfSkuam9pbihcIiB8fCAnfDt8JyB8fCBcIikgK1xuICAgICAgICAgICAgXCIpKVwiO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlQ291bnRRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY291bnRTcWwsIHJlc3VsdHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudFNxbCA9IHRoaXMuY29tcHV0ZUNvdW50RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdyb3VwQnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXAodW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGFrZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoY291bnRTcWwsIFwiY250XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcHRpb24oXCJkaXNhYmxlLWdsb2JhbC1vcmRlclwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cyB8fCAhcmVzdWx0c1swXSB8fCAhcmVzdWx0c1swXVtcImNudFwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGFyc2VJbnQocmVzdWx0c1swXVtcImNudFwiXSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyBvYmplY3Qgd2l0aCByYXcgcmVzdWx0cyBhbmQgZW50aXRpZXMgY3JlYXRlZCBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlRW50aXRpZXNBbmRSYXdSZXN1bHRzID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcmVsYXRpb25JZExvYWRlciwgcmVsYXRpb25Db3VudExvYWRlciwgcmVsYXRpb25JZE1ldGFkYXRhVHJhbnNmb3JtZXIsIHJlbGF0aW9uQ291bnRNZXRhZGF0YVRyYW5zZm9ybWVyLCByYXdSZXN1bHRzLCBlbnRpdGllcywgX2EsIHNlbGVjdHMsIG9yZGVyQnlzXzEsIG1ldGFkYXRhXzEsIG1haW5BbGlhc05hbWVfMSwgcXVlcnlTZWxlY3RzLCBjb25kaXRpb24sIHBhcmFtZXRlcnNfMSwgYWxpYXNfMSwgaWRzLCBhcmVBbGxOdW1iZXJzLCByYXdSZWxhdGlvbklkUmVzdWx0cywgcmF3UmVsYXRpb25Db3VudFJlc3VsdHMsIHRyYW5zZm9ybWVyO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQWxpYXMgaXMgbm90IHNldC4gVXNlIFxcXCJmcm9tXFxcIiBtZXRob2QgdG8gc2V0IGFuIGFsaWFzLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3JlYWRcIiB8fCB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVcIiB8fCB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiIHx8IHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgfHwgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcImZvcl9ub19rZXlfdXBkYXRlXCIpICYmICFxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEudmVyc2lvbkNvbHVtbiAmJiAhbWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZExvYWRlciA9IG5ldyBSZWxhdGlvbklkTG9hZGVyKHRoaXMuY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIsIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkNvdW50TG9hZGVyID0gbmV3IFJlbGF0aW9uQ291bnRMb2FkZXIodGhpcy5jb25uZWN0aW9uLCBxdWVyeVJ1bm5lciwgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyID0gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIodGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIgPSBuZXcgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lcih0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIudHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHRzID0gW10sIGVudGl0aWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgodGhpcy5leHByZXNzaW9uTWFwLnNraXAgfHwgdGhpcy5leHByZXNzaW9uTWFwLnRha2UpICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmNyZWF0ZU9yZGVyQnlDb21iaW5lZFdpdGhTZWxlY3RFeHByZXNzaW9uKFwiZGlzdGluY3RBbGlhc1wiKSwgMiksIHNlbGVjdHMgPSBfYVswXSwgb3JkZXJCeXNfMSA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfMSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluQWxpYXNOYW1lXzEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVNlbGVjdHMgPSBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW5jdEFsaWFzID0gX3RoaXMuZXNjYXBlKFwiZGlzdGluY3RBbGlhc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQWxpYXMgPSBfdGhpcy5lc2NhcGUoRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgbWFpbkFsaWFzTmFtZV8xLCBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCeXNfMVtjb2x1bW5BbGlhc10pIC8vIG1ha2Ugc3VyZSB3ZSBhcmVuJ3Qgb3ZlcnJpZGluZyB1c2VyLWRlZmluZWQgb3JkZXIgaW4gaW52ZXJzZSBkaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCeXNfMVtjb2x1bW5BbGlhc10gPSBcIkFTQ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIsIFwiaWRzX1wiICsgbWFpbkFsaWFzTmFtZV8xLCBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3RpbmN0QWxpYXMgKyBcIi5cIiArIGNvbHVtbkFsaWFzICsgXCIgYXMgXFxcIlwiICsgYWxpYXMgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcih0aGlzLmNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KFwiRElTVElOQ1QgXCIgKyBxdWVyeVNlbGVjdHMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0KHNlbGVjdHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKFwiKFwiICsgdGhpcy5jbG9uZSgpLm9yZGVyQnkoKS5nZXRRdWVyeSgpICsgXCIpXCIsIFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHRoaXMuZXhwcmVzc2lvbk1hcC5za2lwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGltaXQodGhpcy5leHByZXNzaW9uTWFwLnRha2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5KG9yZGVyQnlzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoZSh0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgPyB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCwgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmF0aXZlUGFyYW1ldGVycyh0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1Jlc3VsdHMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyYXdSZXN1bHRzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YV8xLmhhc011bHRpcGxlUHJpbWFyeUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSByYXdSZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFfMS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbUtleSA9IFwib3JtX2Rpc3RpbmN0X2lkc19cIiArIGluZGV4ICsgXCJfXCIgKyBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbUtleV0gPSByZXN1bHRbXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lXzEgKyBcIl9cIiArIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWluQWxpYXNOYW1lXzEgKyBcIi5cIiArIHByaW1hcnlDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9OlwiICsgcGFyYW1LZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzXzEgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsIFwiaWRzX1wiICsgbWFpbkFsaWFzTmFtZV8xLCBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzID0gcmF3UmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W2FsaWFzXzFdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVBbGxOdW1iZXJzID0gaWRzLmV2ZXJ5KGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gdHlwZW9mIGlkID09PSBcIm51bWJlclwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlQWxsTnVtYmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlcyAjMTkwLiBpZiBhbGwgbnVtYmVycyB0aGVuIGl0cyBzYWZlIHRvIHBlcmZvcm0gcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gbWFpbkFsaWFzTmFtZV8xICsgXCIuXCIgKyBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zWzBdLnByb3BlcnR5UGF0aCArIFwiIElOIChcIiArIGlkcy5qb2luKFwiLCBcIikgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtcIm9ybV9kaXN0aW5jdF9pZHNcIl0gPSBpZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IG1haW5BbGlhc05hbWVfMSArIFwiLlwiICsgbWV0YWRhdGFfMS5wcmltYXJ5Q29sdW1uc1swXS5wcm9wZXJ0eVBhdGggKyBcIiBJTiAoOi4uLm9ybV9kaXN0aW5jdF9pZHMpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXJnZUV4cHJlc3Npb25NYXAoeyBleHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb246IGNvbmRpdGlvbiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHRzID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3UmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmF3UmVzdWx0cy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVsYXRpb25JZExvYWRlci5sb2FkKHJhd1Jlc3VsdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3UmVsYXRpb25JZFJlc3VsdHMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZWxhdGlvbkNvdW50TG9hZGVyLmxvYWQocmF3UmVzdWx0cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZWxhdGlvbkNvdW50UmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gbmV3IFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyKHRoaXMuZXhwcmVzc2lvbk1hcCwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgcmF3UmVsYXRpb25JZFJlc3VsdHMsIHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKHJhd1Jlc3VsdHMsIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkxvYWRcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgZW50aXRpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXM6IGVudGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVPcmRlckJ5Q29tYmluZWRXaXRoU2VsZWN0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChwYXJlbnRBbGlhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBpZiB0YWJsZSBoYXMgYSBkZWZhdWx0IG9yZGVyIHRoZW4gYXBwbHkgaXRcbiAgICAgICAgdmFyIG9yZGVyQnlzID0gdGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzO1xuICAgICAgICB2YXIgc2VsZWN0U3RyaW5nID0gT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChvcmRlckNyaXRlcmlhKSB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3JpdGVyaWFQYXJ0cyA9IG9yZGVyQ3JpdGVyaWEuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IF90aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKGFsaWFzTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIF90aGlzLmVzY2FwZShEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCBhbGlhc05hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBvcmRlckNyaXRlcmlhIHx8IHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWE7IH0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArIFwiLlwiICsgb3JkZXJDcml0ZXJpYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHZhciBvcmRlckJ5T2JqZWN0ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKG9yZGVyQnlzKS5mb3JFYWNoKGZ1bmN0aW9uIChvcmRlckNyaXRlcmlhKSB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3JpdGVyaWFQYXJ0cyA9IG9yZGVyQ3JpdGVyaWEuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IF90aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKGFsaWFzTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgb3JkZXJCeU9iamVjdFtfdGhpcy5lc2NhcGUocGFyZW50QWxpYXMpICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgYWxpYXNOYW1lLCBjb2x1bW4uZGF0YWJhc2VOYW1lKSldID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbmQoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gb3JkZXJDcml0ZXJpYSB8fCBzZWxlY3QuYWxpYXNOYW1lID09PSBvcmRlckNyaXRlcmlhOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W190aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIG9yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W29yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RTdHJpbmcsIG9yZGVyQnlPYmplY3RdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgcmF3IHJlc3VsdHMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmF3UmVzdWx0cyA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNxbCwgcGFyYW1ldGVycywgcXVlcnlJZCwgY2FjaGVPcHRpb25zLCBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLCBjYWNoZUVycm9yLCBlcnJvcl82LCByZXN1bHRzLCBlcnJvcl83O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHNxbCA9IF9hWzBdLCBwYXJhbWV0ZXJzID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUlkID0gc3FsICsgXCIgLS0gUEFSQU1FVEVSUzogXCIgKyBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlT3B0aW9ucyA9IHR5cGVvZiB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZSA9PT0gXCJvYmplY3RcIiA/IHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUgJiYgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZCkpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLmdldEZyb21DYWNoZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uIHx8IGNhY2hlT3B0aW9ucy5kdXJhdGlvbiB8fCAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRRdWVyeVJlc3VsdENhY2hlT3B0aW9ucyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zICYmICF0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5pc0V4cGlyZWQoc2F2ZWRRdWVyeVJlc3VsdENhY2hlT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgSlNPTi5wYXJzZShzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLnJlc3VsdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzYgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl82O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5xdWVyeShzcWwsIHBhcmFtZXRlcnMsIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCFjYWNoZUVycm9yICYmIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlICYmICh0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgfHwgY2FjaGVPcHRpb25zLmFsd2F5c0VuYWJsZWQpKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbNiwgOCwgLCA5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5zdG9yZUluQ2FjaGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24gfHwgY2FjaGVPcHRpb25zLmR1cmF0aW9uIHx8IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogSlNPTi5zdHJpbmdpZnkocmVzdWx0cy5yZWNvcmRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMsIHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl83ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZU9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JfNztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzLnJlY29yZHNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lcmdlcyBpbnRvIGV4cHJlc3Npb24gbWFwIGdpdmVuIGV4cHJlc3Npb24gbWFwIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5tZXJnZUV4cHJlc3Npb25NYXAgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICBPYmplY3RVdGlscy5hc3NpZ24odGhpcy5leHByZXNzaW9uTWFwLCBleHByZXNzaW9uTWFwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgZ2l2ZSBudW1iZXIgLSBjb252ZXJ0cyB0byBpbnQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5ub3JtYWxpemVOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiIHx8IG51bSA9PT0gdW5kZWZpbmVkIHx8IG51bSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgIHJldHVybiBOdW1iZXIobnVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZXhlY3V0ZSBzcWwgcXVlcmllcyBpbnNpZGUgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2J0YWluUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcihcInNsYXZlXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdFF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcbmltcG9ydCB7IFNxbFNlcnZlckRyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzRHJpdmVyXCI7XG5pbXBvcnQgeyBVcGRhdGVSZXN1bHQgfSBmcm9tIFwiLi9yZXN1bHQvVXBkYXRlUmVzdWx0XCI7XG5pbXBvcnQgeyBSZXR1cm5pbmdTdGF0ZW1lbnROb3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9SZXR1cm5pbmdTdGF0ZW1lbnROb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IgfSBmcm9tIFwiLi9SZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBMaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL01pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3JcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1VwZGF0ZVZhbHVlc01pc3NpbmdFcnJvclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG52YXIgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU29mdERlbGV0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU29mdERlbGV0ZVF1ZXJ5QnVpbGRlcihjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgSW1wbGVtZW50ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBzcWwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFF1ZXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3FsID0gdGhpcy5jcmVhdGVVcGRhdGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4gc3FsLnRyaW0oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLCBfYSwgc3FsLCBwYXJhbWV0ZXJzLCBxdWVyeVJlc3VsdCwgdXBkYXRlUmVzdWx0LCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAxMywgMTgsIDIxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJCZWZvcmVVcGRhdGVcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gbmV3IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yKHF1ZXJ5UnVubmVyLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMgPSByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5nZXRTb2Z0RGVsZXRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnF1ZXJ5KHNxbCwgcGFyYW1ldGVycywgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IFVwZGF0ZVJlc3VsdC5mcm9tKHF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IudXBkYXRlKHVwZGF0ZVJlc3VsdCwgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KFwiQWZ0ZXJVcGRhdGVcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVSZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMTQsIDE2LCAsIDE3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OiB0aHJvdyBlcnJvcl8xO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZS9zb2Z0LWRlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5mcm9tID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKSB7XG4gICAgICAgIGVudGl0eVRhcmdldCA9IGVudGl0eVRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSA/IGVudGl0eVRhcmdldC5vcHRpb25zLm5hbWUgOiBlbnRpdHlUYXJnZXQ7XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgV0hFUkUgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IFdIRVJFIGNvbmRpdGlvbnMuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vcldoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMucHVzaCh7IHR5cGU6IFwib3JcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFuZFdoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZFdoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vcldoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcmV0dXJuaW5nL291dHB1dCBjbGF1c2UuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJldHVybmluZyA9IGZ1bmN0aW9uIChyZXR1cm5pbmcpIHtcbiAgICAgICAgLy8gbm90IGFsbCBkYXRhYmFzZXMgc3VwcG9ydCByZXR1cm5pbmcvb3V0cHV0IGNhdXNlXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPSByZXR1cm5pbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yZGVyQnkgPSBmdW5jdGlvbiAoc29ydCwgb3JkZXIsIG51bGxzKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChvcmRlciA9PT0gdm9pZCAwKSB7IG9yZGVyID0gXCJBU0NcIjsgfVxuICAgICAgICBpZiAoc29ydCkge1xuICAgICAgICAgICAgaWYgKHNvcnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSBzb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IChfYSA9IHt9LCBfYVtzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfSwgX2EpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9iID0ge30sIF9iW3NvcnRdID0gb3JkZXIsIF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZE9yZGVyQnkgPSBmdW5jdGlvbiAoc29ydCwgb3JkZXIsIG51bGxzKSB7XG4gICAgICAgIGlmIChvcmRlciA9PT0gdm9pZCAwKSB7IG9yZGVyID0gXCJBU0NcIjsgfVxuICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IG9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBMSU1JVCAtIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbiAobGltaXQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIi53aGVyZUVudGl0eSBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCBvbiBxdWVyaWVzIHdoaWNoIHVwZGF0ZSByZWFsIGVudGl0eSB0YWJsZS5cIik7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHkpID8gZW50aXR5IDogW2VudGl0eV07XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGVudGl0eUlkTWFwID0gX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghZW50aXR5SWRNYXApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIGVudGl0eSBkb2VzIG5vdCBoYXZlIGlkcyBzZXQsIGNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbi5cIik7XG4gICAgICAgICAgICBfdGhpcy5vcldoZXJlSW5JZHMoZW50aXR5SWRNYXApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMgPSBlbnRpdGllcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqIFRoaXMgbWF5IHByb2R1Y2UgZXh0cmEgcXVlcnkgb3IgdXNlIFJFVFVSTklORyAvIE9VVFBVVCBzdGF0ZW1lbnQgKGRlcGVuZCBvbiBkYXRhYmFzZSkuXG4gICAgICogRW5hYmxlZCBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnVwZGF0ZUVudGl0eSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFVQREFURSBleHByZXNzIHVzZWQgdG8gcGVyZm9ybSBpbnNlcnQgcXVlcnkuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbWV0YWRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGdldCBlbnRpdHkgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBhbGlhcyBcXFwiXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzICsgXCJcXFwiXCIpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVwYXJlIGNvbHVtbnMgYW5kIHZhbHVlcyB0byBiZSB1cGRhdGVkXG4gICAgICAgIHZhciB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMgPSBbXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic29mdC1kZWxldGVcIjpcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IENVUlJFTlRfVElNRVNUQU1QXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlc3RvcmVcIjpcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IE5VTExcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJUaGUgcXVlcnlUeXBlIG11c3QgYmUgXFxcInNvZnQtZGVsZXRlXFxcIiBvciBcXFwicmVzdG9yZVxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnZlcnNpb25Db2x1bW4pXG4gICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS52ZXJzaW9uQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IFwiICsgdGhpcy5lc2NhcGUobWV0YWRhdGEudmVyc2lvbkNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgKyAxXCIpO1xuICAgICAgICBpZiAobWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbilcbiAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKHRoaXMuZXNjYXBlKG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiID0gQ1VSUkVOVF9USU1FU1RBTVBcIik7IC8vIHRvZG86IGZpeCBpc3N1ZSB3aXRoIENVUlJFTlRfVElNRVNUQU1QKDYpIGJlaW5nIHVzZWQsIGNhbiBcIkRFRkFVTFRcIiBiZSB1c2VkPyFcbiAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhIHRhYmxlIG5hbWUgYW5kIGFsbCBjb2x1bW4gZGF0YWJhc2UgbmFtZXNcbiAgICAgICAgdmFyIHdoZXJlRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVSZXR1cm5pbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGFuZCByZXR1cm4gc3FsIHVwZGF0ZSBxdWVyeVxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlVQREFURSBcIiArIHRoaXMuZ2V0VGFibGVOYW1lKHRoaXMuZ2V0TWFpblRhYmxlTmFtZSgpKSArIFwiIFNFVCBcIiArIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5qb2luKFwiLCBcIikgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiVVBEQVRFIFwiICsgdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIgU0VUIFwiICsgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLmpvaW4oXCIsIFwiKSArIFwiIE9VVFBVVCBcIiArIHJldHVybmluZ0V4cHJlc3Npb24gKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJVUERBVEUgXCIgKyB0aGlzLmdldFRhYmxlTmFtZSh0aGlzLmdldE1haW5UYWJsZU5hbWUoKSkgKyBcIiBTRVQgXCIgKyB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMuam9pbihcIiwgXCIpICsgd2hlcmVFeHByZXNzaW9uOyAvLyB0b2RvOiBob3cgZG8gd2UgcmVwbGFjZSBhbGlhc2VzIGluIHdoZXJlIHRvIG5vdGhpbmc/XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXM7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmRlckJ5cykubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBcIiBPUkRFUiBCWSBcIiArIE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yZGVyQnlzW2NvbHVtbk5hbWVdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29sdW1uTmFtZSkgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm9yZGVyICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXS5udWxscztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkxJTUlUXCIgcGFydHMgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0O1xuICAgICAgICBpZiAobGltaXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9O1xuICAgIHJldHVybiBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyO1xufShRdWVyeUJ1aWxkZXIpKTtcbmV4cG9ydCB7IFNvZnREZWxldGVRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgVXBkYXRlUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0L1VwZGF0ZVJlc3VsdFwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yIH0gZnJvbSBcIi4vUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3JcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0xpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9vcmFjbGUvT3JhY2xlRHJpdmVyXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9IGZyb20gXCIuLi9lcnJvci9FbnRpdHlDb2x1bW5Ob3RGb3VuZFwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBVcGRhdGVRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVwZGF0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVXBkYXRlUXVlcnlCdWlsZGVyKGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyLCBxdWVyeVJ1bm5lcikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVVcGRhdGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4gc3FsLnRyaW0oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgZGVjbGFyZVNxbCwgc2VsZWN0T3V0cHV0U3FsLCByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciwgcmV0dXJuaW5nQ29sdW1uc18xLCBfYSwgX2IsIGNvbHVtblBhdGgsIF9jLCB1cGRhdGVTcWwsIHBhcmFtZXRlcnMsIHN0YXRlbWVudHMsIHF1ZXJ5UmVzdWx0LCB1cGRhdGVSZXN1bHQsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMSwgMTMsIDE4LCAyMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KFwiQmVmb3JlVXBkYXRlXCIsIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIHRoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlU3FsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE91dHB1dFNxbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciA9IG5ldyBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvcihxdWVyeVJ1bm5lciwgdGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnNfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZykgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uUGF0aCA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xLnB1c2guYXBwbHkocmV0dXJuaW5nQ29sdW1uc18xLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5maW5kQ29sdW1uc1dpdGhQcm9wZXJ0eVBhdGgoY29sdW1uUGF0aCkpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9kID0gX2EucmV0dXJuKSkgX2QuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAudXBkYXRlRW50aXR5ID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZUVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zID0gcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuZ2V0VXBkYXRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xLnB1c2guYXBwbHkocmV0dXJuaW5nQ29sdW1uc18xLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGMpIHsgcmV0dXJuICFyZXR1cm5pbmdDb2x1bW5zXzEuaW5jbHVkZXMoYyk7IH0pKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5pbmdDb2x1bW5zXzEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZVNxbCA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuYnVpbGRUYWJsZVZhcmlhYmxlRGVjbGFyYXRpb24oXCJAT3V0cHV0VGFibGVcIiwgcmV0dXJuaW5nQ29sdW1uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RPdXRwdXRTcWwgPSBcIlNFTEVDVCAqIEZST00gQE91dHB1dFRhYmxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYyA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgdXBkYXRlU3FsID0gX2NbMF0sIHBhcmFtZXRlcnMgPSBfY1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMgPSBbZGVjbGFyZVNxbCwgdXBkYXRlU3FsLCBzZWxlY3RPdXRwdXRTcWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3RhdGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHNxbCkgeyByZXR1cm4gc3FsICE9IG51bGw7IH0pLmpvaW4oXCI7XFxuXFxuXCIpLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0ID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gVXBkYXRlUmVzdWx0LmZyb20ocXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVwZGF0ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci51cGRhdGUodXBkYXRlUmVzdWx0LCB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJBZnRlclVwZGF0ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLCB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHVwZGF0ZVJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDIwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFZhbHVlcyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBXSEVSRSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgV0hFUkUgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW107IC8vIGRvbid0IG1vdmUgdGhpcyBibG9jayBiZWxvdyBzaW5jZSBjb21wdXRlV2hlcmVQYXJhbWV0ZXIgY2FuIGFkZCB3aGVyZSBleHByZXNzaW9uc1xuICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSk7XG4gICAgICAgIGlmIChjb25kaXRpb24pXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW3sgdHlwZTogXCJzaW1wbGVcIiwgY29uZGl0aW9uOiBjb25kaXRpb24gfV07XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUud2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFuZFdoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZFdoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXR1cm5pbmcvb3V0cHV0IGNsYXVzZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm91dHB1dCA9IGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuaW5nKG91dHB1dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXR1cm5pbmcvb3V0cHV0IGNsYXVzZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJldHVybmluZyA9IGZ1bmN0aW9uIChyZXR1cm5pbmcpIHtcbiAgICAgICAgLy8gbm90IGFsbCBkYXRhYmFzZXMgc3VwcG9ydCByZXR1cm5pbmcvb3V0cHV0IGNhdXNlXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPSByZXR1cm5pbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChzb3J0KSB7XG4gICAgICAgICAgICBpZiAoc29ydCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHNvcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9hID0ge30sIF9hW3NvcnRdID0geyBvcmRlcjogb3JkZXIsIG51bGxzOiBudWxscyB9LCBfYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSAoX2IgPSB7fSwgX2Jbc29ydF0gPSBvcmRlciwgX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRPcmRlckJ5ID0gZnVuY3Rpb24gKHNvcnQsIG9yZGVyLCBudWxscykge1xuICAgICAgICBpZiAob3JkZXIgPT09IHZvaWQgMCkgeyBvcmRlciA9IFwiQVNDXCI7IH1cbiAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXNbc29ydF0gPSB7IG9yZGVyOiBvcmRlciwgbnVsbHM6IG51bGxzIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXNbc29ydF0gPSBvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgTElNSVQgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbiAobGltaXQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlRW50aXR5ID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiLndoZXJlRW50aXR5IG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIG9uIHF1ZXJpZXMgd2hpY2ggdXBkYXRlIHJlYWwgZW50aXR5IHRhYmxlLlwiKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcyA9IFtdO1xuICAgICAgICB2YXIgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KGVudGl0eSkgPyBlbnRpdHkgOiBbZW50aXR5XTtcbiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5SWRNYXAgPSBfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKCFlbnRpdHlJZE1hcClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgaWRzIHNldCwgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uLlwiKTtcbiAgICAgICAgICAgIF90aGlzLm9yV2hlcmVJbklkcyhlbnRpdHlJZE1hcCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcyA9IGVudGl0aWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBlbnRpdHkgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIHVwZGF0ZSBvcGVyYXRpb24uXG4gICAgICogVGhpcyBtYXkgcHJvZHVjZSBleHRyYSBxdWVyeSBvciB1c2UgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudCAoZGVwZW5kIG9uIGRhdGFiYXNlKS5cbiAgICAgKiBFbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVFbnRpdHkgPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXBkYXRlRW50aXR5ID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBVUERBVEUgZXhwcmVzcyB1c2VkIHRvIHBlcmZvcm0gaW5zZXJ0IHF1ZXJ5LlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHZhbHVlc1NldCA9IHRoaXMuZ2V0VmFsdWVTZXQoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHByZXBhcmUgY29sdW1ucyBhbmQgdmFsdWVzIHRvIGJlIHVwZGF0ZWRcbiAgICAgICAgdmFyIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcyA9IFtdO1xuICAgICAgICB2YXIgdXBkYXRlZENvbHVtbnMgPSBbXTtcbiAgICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnR5UGF0aChtZXRhZGF0YSwgdmFsdWVzU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyB0b2RvOiBtYWtlIHRoaXMgYW5kIG90aGVyIHF1ZXJ5IGJ1aWxkZXIgdG8gd29yayB3aXRoIHByb3Blcmx5IHdpdGggdGFibGVzIHdpdGhvdXQgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1ucyA9IG1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb2x1bW5Ob3RGb3VuZChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbi5pc1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlc1NldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlUGVyc2lzdGVudFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGR1cGxpY2F0aW9uIHpvbmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHVwZGF0ZSBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSBcIiArIHZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaChfdGhpcy5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IE5VTExcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcmFtZXRyaXplVmFsdWUoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvbUZyb21UZXh0ID0gdXNlTGVnYWN5ID8gXCJHZW9tRnJvbVRleHRcIiA6IFwiU1RfR2VvbUZyb21UZXh0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zcmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGdlb21Gcm9tVGV4dCArIFwiKFwiICsgcGFyYW1OYW1lICsgXCIsIFwiICsgY29sdW1uLnNyaWQgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBnZW9tRnJvbVRleHQgKyBcIihcIiArIHBhcmFtTmFtZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc3JpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBcIlNUX1NldFNSSUQoU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpLCBcIiArIGNvbHVtbi5zcmlkICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IFwiU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gY29sdW1uLnR5cGUgKyBcIjo6U1RHZW9tRnJvbVRleHQoXCIgKyBwYXJhbU5hbWUgKyBcIiwgXCIgKyAoY29sdW1uLnNyaWQgfHwgXCIwXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSBcIiArIGV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS52ZXJzaW9uQ29sdW1uICYmIHVwZGF0ZWRDb2x1bW5zLmluZGV4T2YobWV0YWRhdGEudmVyc2lvbkNvbHVtbikgPT09IC0xKVxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKHRoaXMuZXNjYXBlKG1ldGFkYXRhLnZlcnNpb25Db2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiID0gXCIgKyB0aGlzLmVzY2FwZShtZXRhZGF0YS52ZXJzaW9uQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiArIDFcIik7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiB1cGRhdGVkQ29sdW1ucy5pbmRleE9mKG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4pID09PSAtMSlcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IENVUlJFTlRfVElNRVNUQU1QXCIpOyAvLyB0b2RvOiBmaXggaXNzdWUgd2l0aCBDVVJSRU5UX1RJTUVTVEFNUCg2KSBiZWluZyB1c2VkLCBjYW4gXCJERUZBVUxUXCIgYmUgdXNlZD8hXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXNTZXQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzU2V0W2tleV07XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogZHVwbGljYXRpb24gem9uZVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7IC8vIHN1cHBvcnQgZm9yIFNRTCBleHByZXNzaW9ucyBpbiB1cGRhdGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGtleSkgKyBcIiA9IFwiICsgdmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKF90aGlzLmVzY2FwZShrZXkpICsgXCIgPSBOVUxMXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBzdG9yZSBhcnJheSB2YWx1ZXMgaW4gYSBzcGVjaWFsIGNsYXNzIHRvIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgcmVwbGFjZW1lbnQgd2lsbCB3b3JrIGNvcnJlY3RseVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhbHVlID0gbmV3IEFycmF5UGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtTmFtZSA9IF90aGlzLmNyZWF0ZVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKF90aGlzLmVzY2FwZShrZXkpICsgXCIgPSBcIiArIHBhcmFtTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhIHRhYmxlIG5hbWUgYW5kIGFsbCBjb2x1bW4gZGF0YWJhc2UgbmFtZXNcbiAgICAgICAgdmFyIHdoZXJlRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVSZXR1cm5pbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGFuZCByZXR1cm4gc3FsIHVwZGF0ZSBxdWVyeVxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlVQREFURSBcIiArIHRoaXMuZ2V0VGFibGVOYW1lKHRoaXMuZ2V0TWFpblRhYmxlTmFtZSgpKSArIFwiIFNFVCBcIiArIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5qb2luKFwiLCBcIikgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiVVBEQVRFIFwiICsgdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIgU0VUIFwiICsgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLmpvaW4oXCIsIFwiKSArIFwiIE9VVFBVVCBcIiArIHJldHVybmluZ0V4cHJlc3Npb24gKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJVUERBVEUgXCIgKyB0aGlzLmdldFRhYmxlTmFtZSh0aGlzLmdldE1haW5UYWJsZU5hbWUoKSkgKyBcIiBTRVQgXCIgKyB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMuam9pbihcIiwgXCIpICsgd2hlcmVFeHByZXNzaW9uOyAvLyB0b2RvOiBob3cgZG8gd2UgcmVwbGFjZSBhbGlhc2VzIGluIHdoZXJlIHRvIG5vdGhpbmc/XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlT3JkZXJCeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBvcmRlckJ5cyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cztcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yZGVyQnlzKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiIE9SREVSIEJZIFwiICsgT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JkZXJCeXNbY29sdW1uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGNvbHVtbk5hbWUpICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV0ub3JkZXIgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm51bGxzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTElNSVRcIiBwYXJ0cyBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMaW1pdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaW1pdCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdDtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFycmF5IG9mIHZhbHVlcyBuZWVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFZhbHVlU2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldCBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0O1xuICAgICAgICB0aHJvdyBuZXcgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVXBkYXRlUXVlcnlCdWlsZGVyO1xufShRdWVyeUJ1aWxkZXIpKTtcbmV4cG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1VcGRhdGVRdWVyeUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlclV0aWxzIH0gZnJvbSBcIi4uL1F1ZXJ5QnVpbGRlclV0aWxzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG52YXIgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25Db3VudEF0dHJpYnV0ZShleHByZXNzaW9uTWFwLCByZWxhdGlvbkNvdW50QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcCA9IGV4cHJlc3Npb25NYXA7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCByZWxhdGlvbkNvdW50QXR0cmlidXRlIHx8IHt9KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImpvaW5JbnZlcnNlU2lkZU1ldGFkYXRhXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcInBhcmVudEFsaWFzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsaWFzIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBqb2luLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwicG9zdFwiIGlzIGEgcGFyZW50IGFsaWFzLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uTmFtZS5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25Db3VudEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25Qcm9wZXJ0eVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwiY2F0ZWdvcnlcIiBpcyBhIHJlbGF0aW9uIHByb3BlcnR5LlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxpYXMgcHJvcGVydHlcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbk5hbWUuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImp1bmN0aW9uQWxpYXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZCh0aGlzLnJlbGF0aW9uTmFtZS5zcGxpdChcIi5cIiksIDIpLCBwYXJlbnRBbGlhcyA9IF9hWzBdLCByZWxhdGlvblByb3BlcnR5ID0gX2FbMV07XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50QWxpYXMgKyBcIl9cIiArIHJlbGF0aW9uUHJvcGVydHkgKyBcIl9yY1wiO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcInJlbGF0aW9uXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSh0aGlzLnJlbGF0aW9uTmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkdpdmVuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsaWFzIHByb3BlcnR5XCIpO1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKSwgMiksIHBhcmVudEFsaWFzID0gX2FbMF0sIHByb3BlcnR5UGF0aCA9IF9hWzFdO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uT3duZXJTZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHBhcmVudEFsaWFzKTtcbiAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVsYXRpb24gd2l0aCBwcm9wZXJ0eSBwYXRoIFwiICsgcHJvcGVydHlQYXRoICsgXCIgaW4gZW50aXR5IHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1ldGFkYXRhXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1ldGFkYXRhIG9mIHRoZSBqb2luZWQgZW50aXR5LlxuICAgICAgICAgKiBJZiB0YWJsZSB3aXRob3V0IGVudGl0eSB3YXMgam9pbmVkLCB0aGVuIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5yZWxhdGlvbk5hbWUpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJHaXZlbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRBbGlhcyA9IHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHBhcmVudEFsaWFzKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25Db3VudEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwibWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVG9Qcm9wZXJ0eS5zcGxpdChcIi5cIilbMV07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudEF0dHJpYnV0ZTtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkNvdW50QXR0cmlidXRlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG52YXIgUmVsYXRpb25Db3VudExvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25Db3VudExvYWRlcihjb25uZWN0aW9uLCBxdWVyeVJ1bm5lciwgcmVsYXRpb25Db3VudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICB0aGlzLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzID0gcmVsYXRpb25Db3VudEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBSZWxhdGlvbkNvdW50TG9hZGVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKHJhd0VudGl0aWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbmx5VW5pcXVlLCBwcm9taXNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgb25seVVuaXF1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgsIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMgPSB0aGlzLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLm1hcChmdW5jdGlvbiAocmVsYXRpb25Db3VudEF0dHIpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCBpbnZlcnNlUmVsYXRpb24sIHJlZmVyZW5jZUNvbHVtbk5hbWVfMSwgaW52ZXJzZVNpZGVUYWJsZSwgaW52ZXJzZVNpZGVUYWJsZU5hbWUsIGludmVyc2VTaWRlVGFibGVBbGlhcywgaW52ZXJzZVNpZGVQcm9wZXJ0eU5hbWUsIHJlZmVyZW5jZUNvbHVtblZhbHVlcywgcWIsIGpvaW5UYWJsZUNvbHVtbk5hbWVfMSwgaW52ZXJzZUpvaW5Db2x1bW5OYW1lLCBmaXJzdEp1bmN0aW9uQ29sdW1uLCBzZWNvbmRKdW5jdGlvbkNvbHVtbiwgcmVmZXJlbmNlQ29sdW1uVmFsdWVzLCBqdW5jdGlvbkFsaWFzLCBpbnZlcnNlU2lkZVRhYmxlTmFtZSwgaW52ZXJzZVNpZGVUYWJsZUFsaWFzLCBqdW5jdGlvblRhYmxlTmFtZSwgY29uZGl0aW9uLCBxYjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbkNvdW50QXR0ci5yZWxhdGlvbi5pc09uZVRvTWFueSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VSZWxhdGlvbiA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlQ29sdW1uTmFtZV8xID0gaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVUYWJsZU5hbWUgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlQWxpYXMgPSByZWxhdGlvbkNvdW50QXR0ci5hbGlhcyB8fCBpbnZlcnNlU2lkZVRhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eU5hbWUgPSBpbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5WYWx1ZXMgPSByYXdFbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmF3RW50aXR5KSB7IHJldHVybiByYXdFbnRpdHlbcmVsYXRpb25Db3VudEF0dHIucGFyZW50QWxpYXMgKyBcIl9cIiArIHJlZmVyZW5jZUNvbHVtbk5hbWVfMV07IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gISF2YWx1ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtblZhbHVlcyA9IHJlZmVyZW5jZUNvbHVtblZhbHVlcy5maWx0ZXIob25seVVuaXF1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHIsIHJlc3VsdHM6IFtdIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIodGhpcy5xdWVyeVJ1bm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLnNlbGVjdChpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lLCBcInBhcmVudElkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0KFwiQ09VTlQoKilcIiwgXCJjbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKGludmVyc2VTaWRlVGFibGUsIGludmVyc2VTaWRlVGFibGVBbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lICsgXCIgSU4gKDouLi5pZHMpXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXBCeShpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcihcImlkc1wiLCByZWZlcmVuY2VDb2x1bW5WYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBjb25kaXRpb24gKGN1c3RvbSBxdWVyeSBidWlsZGVyIGZhY3RvcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbkNvdW50QXR0ci5xdWVyeUJ1aWxkZXJGYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeShxYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZ2V0UmF3TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2EucmVzdWx0cyA9IF9jLnNlbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbk5hbWUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SnVuY3Rpb25Db2x1bW4gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEp1bmN0aW9uQ29sdW1uID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaXNPd25pbmcpIHsgLy8gdG9kbyBmaXggam9pbkNvbHVtbnNbMF0gYW5kIGludmVyc2VKb2luQ29sdW1uc1swXS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5UYWJsZUNvbHVtbk5hbWVfMSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5OYW1lID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RKdW5jdGlvbkNvbHVtbiA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEuY29sdW1uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEp1bmN0aW9uQ29sdW1uID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS5jb2x1bW5zWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pblRhYmxlQ29sdW1uTmFtZV8xID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uTmFtZSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SnVuY3Rpb25Db2x1bW4gPSByZWxhdGlvbkNvdW50QXR0ci5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmNvbHVtbnNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRKdW5jdGlvbkNvbHVtbiA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEuY29sdW1uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5WYWx1ZXMgPSByYXdFbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmF3RW50aXR5KSB7IHJldHVybiByYXdFbnRpdHlbcmVsYXRpb25Db3VudEF0dHIucGFyZW50QWxpYXMgKyBcIl9cIiArIGpvaW5UYWJsZUNvbHVtbk5hbWVfMV07IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gISF2YWx1ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtblZhbHVlcyA9IHJlZmVyZW5jZUNvbHVtblZhbHVlcy5maWx0ZXIob25seVVuaXF1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHIsIHJlc3VsdHM6IFtdIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkFsaWFzID0gcmVsYXRpb25Db3VudEF0dHIuanVuY3Rpb25BbGlhcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVUYWJsZU5hbWUgPSByZWxhdGlvbkNvdW50QXR0ci5qb2luSW52ZXJzZVNpZGVNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VTaWRlVGFibGVBbGlhcyA9IHJlbGF0aW9uQ291bnRBdHRyLmFsaWFzIHx8IGludmVyc2VTaWRlVGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBqdW5jdGlvbkFsaWFzICsgXCIuXCIgKyBmaXJzdEp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOIChcIiArIHJlZmVyZW5jZUNvbHVtblZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbHMpIHsgcmV0dXJuIGlzTmFOKHZhbHMpID8gXCInXCIgKyB2YWxzICsgXCInXCIgOiB2YWxzOyB9KSArIFwiKVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIEFORCBcIiArIGp1bmN0aW9uQWxpYXMgKyBcIi5cIiArIHNlY29uZEp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiID0gXCIgKyBpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VKb2luQ29sdW1uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYi5zZWxlY3QoanVuY3Rpb25BbGlhcyArIFwiLlwiICsgZmlyc3RKdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUsIFwicGFyZW50SWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTZWxlY3QoXCJDT1VOVChcIiArIHFiLmVzY2FwZShpbnZlcnNlU2lkZVRhYmxlQWxpYXMpICsgXCIuXCIgKyBxYi5lc2NhcGUoaW52ZXJzZUpvaW5Db2x1bW5OYW1lKSArIFwiKVwiLCBcImNudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oaW52ZXJzZVNpZGVUYWJsZU5hbWUsIGludmVyc2VTaWRlVGFibGVBbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbm5lckpvaW4oanVuY3Rpb25UYWJsZU5hbWUsIGp1bmN0aW9uQWxpYXMsIGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cEJ5KGp1bmN0aW9uQWxpYXMgKyBcIi5cIiArIGZpcnN0SnVuY3Rpb25Db2x1bW4ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgY29uZGl0aW9uIChjdXN0b20gcXVlcnkgYnVpbGRlciBmYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uQ291bnRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkocWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGU6IHJlbGF0aW9uQ291bnRBdHRyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9iLnJlc3VsdHMgPSBfYy5zZW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYildO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudExvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkNvdW50TG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnRMb2FkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBSZWxhdGlvbkNvdW50QXR0cmlidXRlIH0gZnJvbSBcIi4vUmVsYXRpb25Db3VudEF0dHJpYnV0ZVwiO1xudmFyIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBieSBleGFtcGxlOlxuICAgICAgICAvLyBwb3N0IGhhcyByZWxhdGlvbiBjb3VudDpcbiAgICAgICAgLy8gQFJlbGF0aW9uQ291bnQocG9zdCA9PiBwb3N0LmNhdGVnb3JpZXMpIGNhdGVnb3J5Q291bnRcbiAgICAgICAgLy8gY2F0ZWdvcnkgaGFzIHJlbGF0aW9uIGNvdW50XG4gICAgICAgIC8vIEBSZWxhdGlvbkNvdW50KGNhdGVnb3J5ID0+IGNhdGVnb3J5LmltYWdlcykgaW1hZ2VDb3VudFxuICAgICAgICAvLyB3ZSBsb2FkIHBvc3QgYW5kIGpvaW4gY2F0ZWdvcnlcbiAgICAgICAgLy8gd2UgZXhwZWN0IHBvc3QuY2F0ZWdvcnlDb3VudCBhbmQgcG9zdC5jYXRlZ29yeS5pbWFnZUNvdW50IHRvIGhhdmUgcmVsYXRpb24gY291bnRzXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGZpcnN0IGNyZWF0ZSByZWxhdGlvbiBjb3VudCBhdHRyaWJ1dGVzIGZvciBhbGwgcmVsYXRpb24gY291bnQgbWV0YWRhdGFzIG9mIHRoZSBtYWluIHNlbGVjdGVkIG9iamVjdCAocG9zdCBmcm9tIGV4YW1wbGUpXG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLnJlbGF0aW9uQ291bnRzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uQ291bnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gX3RoaXMubWV0YWRhdGFUb0F0dHJpYnV0ZShfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCByZWxhdGlvbkNvdW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNlY29uZCBjcmVhdGUgcmVsYXRpb24gY291bnQgYXR0cmlidXRlcyBmb3IgYWxsIHJlbGF0aW9uIGNvdW50IG1ldGFkYXRhcyBvZiBhbGwgam9pbmVkIG9iamVjdHMgKGNhdGVnb3J5IGZyb20gZXhhbXBsZSlcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGpvaW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0aGlzIGpvaW4gaGFzIGEgbWV0YWRhdGEsIGJlY2F1c2UgcmVsYXRpb24gY291bnQgY2FuIG9ubHkgd29yayBmb3IgcmVhbCBvcm0gZW50aXRpZXNcbiAgICAgICAgICAgIGlmICgham9pbi5tZXRhZGF0YSB8fCBqb2luLm1ldGFkYXRhLmlzSnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgam9pbi5tZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IF90aGlzLm1ldGFkYXRhVG9BdHRyaWJ1dGUoam9pbi5hbGlhcy5uYW1lLCByZWxhdGlvbkNvdW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUubWV0YWRhdGFUb0F0dHJpYnV0ZSA9IGZ1bmN0aW9uIChwYXJlbnRBbGlhc05hbWUsIHJlbGF0aW9uQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCwge1xuICAgICAgICAgICAgcmVsYXRpb25OYW1lOiBwYXJlbnRBbGlhc05hbWUgKyBcIi5cIiArIHJlbGF0aW9uQ291bnQucmVsYXRpb24ucHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbWFwVG9Qcm9wZXJ0eTogcGFyZW50QWxpYXNOYW1lICsgXCIuXCIgKyByZWxhdGlvbkNvdW50LnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGFsaWFzOiByZWxhdGlvbkNvdW50LmFsaWFzLFxuICAgICAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogcmVsYXRpb25Db3VudC5xdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXJVdGlscyB9IGZyb20gXCIuLi9RdWVyeUJ1aWxkZXJVdGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBTdG9yZXMgYWxsIGpvaW4gcmVsYXRpb24gaWQgYXR0cmlidXRlcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgYSBKT0lOIHF1ZXJ5LlxuICovXG52YXIgUmVsYXRpb25JZEF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25JZEF0dHJpYnV0ZShxdWVyeUV4cHJlc3Npb25NYXAsIHJlbGF0aW9uSWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAgPSBxdWVyeUV4cHJlc3Npb25NYXA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcmVsYXRpb24gaWQgc2hvdWxkIE5PVCBiZSBsb2FkZWQgYXMgaWQgbWFwLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlTWl4ZWRNYXAgPSBmYWxzZTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHJlbGF0aW9uSWRBdHRyaWJ1dGUgfHwge30pO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwiam9pbkludmVyc2VTaWRlTWV0YWRhdGFcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicGFyZW50QWxpYXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxpYXMgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGpvaW4uXG4gICAgICAgICAqIEZvciBleGFtcGxlLCBpZiB3ZSBqb2luIChcInBvc3QuY2F0ZWdvcnlcIiwgXCJjYXRlZ29yeUFsaWFzXCIpIHRoZW4gXCJwb3N0XCIgaXMgYSBwYXJlbnQgYWxpYXMuXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gZW50aXR5T3JQcm9wZXJ0eSB2YWx1ZS5cbiAgICAgICAgICogVGhpcyBpcyBhdmFpbGFibGUgd2hlbiBqb2luIHdhcyBtYWRlIHVzaW5nIFwicG9zdC5jYXRlZ29yeVwiIHN5bnRheC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5yZWxhdGlvbk5hbWUpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJHaXZlbiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsaWFzIHByb3BlcnR5XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25OYW1lLnN1YnN0cigwLCB0aGlzLnJlbGF0aW9uTmFtZS5pbmRleE9mKFwiLlwiKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25Qcm9wZXJ0eVBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gcHJvcGVydHkgbmFtZSBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGpvaW5lZC5cbiAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHdlIGpvaW4gKFwicG9zdC5jYXRlZ29yeVwiLCBcImNhdGVnb3J5QWxpYXNcIikgdGhlbiBcImNhdGVnb3J5XCIgaXMgYSByZWxhdGlvbiBwcm9wZXJ0eS5cbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSBlbnRpdHlPclByb3BlcnR5IHZhbHVlLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSh0aGlzLnJlbGF0aW9uTmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkdpdmVuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxpYXMgcHJvcGVydHlcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbk5hbWUuc3Vic3RyKHRoaXMucmVsYXRpb25OYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25cIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gb2YgdGhlIHBhcmVudC5cbiAgICAgICAgICogVGhpcyBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBqb2luZWQuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciByZWxhdGlvbk93bmVyU2VsZWN0aW9uID0gdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHRoaXMucGFyZW50QWxpYXMpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmVsYXRpb25Pd25lclNlbGVjdGlvbi5tZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVsYXRpb24gd2l0aCBwcm9wZXJ0eSBwYXRoIFwiICsgdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCArIFwiIGluIGVudGl0eSB3YXMgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGlvbklkQXR0cmlidXRlLnByb3RvdHlwZSwgXCJqdW5jdGlvbkFsaWFzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdlbmVyYXRlcyBhbGlhcyBvZiBqdW5jdGlvbiB0YWJsZSwgd2hvc2UgaWRzIHdlIGdldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKSwgMiksIHBhcmVudEFsaWFzID0gX2FbMF0sIHJlbGF0aW9uUHJvcGVydHkgPSBfYVsxXTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRBbGlhcyArIFwiX1wiICsgcmVsYXRpb25Qcm9wZXJ0eSArIFwiX3JpZFwiO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uSWRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImp1bmN0aW9uTWV0YWRhdGFcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTWV0YWRhdGEgb2YgdGhlIGpvaW5lZCBlbnRpdHkuXG4gICAgICAgICAqIElmIGV4dHJhIGNvbmRpdGlvbiB3aXRob3V0IGVudGl0eSB3YXMgam9pbmVkLCB0aGVuIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGlvbklkQXR0cmlidXRlLnByb3RvdHlwZSwgXCJtYXBUb1Byb3BlcnR5UGFyZW50QWxpYXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcFRvUHJvcGVydHkuc3Vic3RyKDAsIHRoaXMubWFwVG9Qcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwibWFwVG9Qcm9wZXJ0eVByb3BlcnR5UGF0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVG9Qcm9wZXJ0eS5zdWJzdHIodGhpcy5tYXBUb1Byb3BlcnR5LmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUmVsYXRpb25JZEF0dHJpYnV0ZTtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRBdHRyaWJ1dGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uLy4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1R5cGVPUk1FcnJvclwiO1xudmFyIFJlbGF0aW9uSWRMb2FkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSWRMb2FkZXIoY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIsIHJlbGF0aW9uSWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcyA9IHJlbGF0aW9uSWRBdHRyaWJ1dGVzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25JZExvYWRlci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChyYXdFbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzID0gdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uSWRBdHRyKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVzXzEsIHJlc3VsdHMsIHJlbGF0aW9uXzEsIGpvaW5Db2x1bW5zXzEsIHRhYmxlLCB0YWJsZU5hbWUsIHRhYmxlQWxpYXNfMSwgZHVwbGljYXRlc18yLCBwYXJhbWV0ZXJzXzEsIGNvbmRpdGlvbiwgcWJfMSwgcmVzdWx0cywgcmVsYXRpb24sIGpvaW5Db2x1bW5zXzIsIGludmVyc2VKb2luQ29sdW1uc18xLCBqdW5jdGlvbkFsaWFzXzEsIGludmVyc2VTaWRlVGFibGVOYW1lLCBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSwganVuY3Rpb25UYWJsZU5hbWUsIG1hcHBlZENvbHVtbnMsIHBhcmFtZXRlcnNfMiwgZHVwbGljYXRlc18zLCBqb2luQ29sdW1uQ29uZGl0aW9ucywgaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25fMSwgY29uZGl0aW9uLCBxYl8yLCByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5pc09uZVRvT25lT3duZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogUG9zdCBhbmQgVGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRSZWxhdGlvbklkQW5kTWFwKFwicG9zdC50YWdJZFwiLCBcInBvc3QudGFnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCBpdCB0byBsb2FkIGlkIG9mIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25JZEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBZGRpdGlvbmFsIGNvbmRpdGlvbiBjYW4gbm90IGJlIHVzZWQgd2l0aCBNYW55VG9PbmUgb3IgT25lVG9PbmUgb3duZXIgcmVsYXRpb25zLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByYXdFbnRpdGllcy5tYXAoZnVuY3Rpb24gKHJhd0VudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cGxpY2F0ZVBhcnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5qb2luQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2pvaW5Db2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJhd0VudGl0eVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCByZWxhdGlvbklkQXR0ci5wYXJlbnRBbGlhcywgam9pbkNvbHVtbi5kYXRhYmFzZU5hbWUpXSwgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydCA9IGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lICsgXCI6XCIgKyByZXN1bHRbam9pbkNvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVQYXJ0cy5pbmRleE9mKGR1cGxpY2F0ZVBhcnQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5wdXNoKGR1cGxpY2F0ZVBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZEF0dHIucmVsYXRpb24uZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShyYXdFbnRpdHlbRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgcmVsYXRpb25JZEF0dHIucGFyZW50QWxpYXMsIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKV0sIHByaW1hcnlDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0gcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUgKyBcIjpcIiArIHJlc3VsdFtwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVBhcnRzLmluZGV4T2YoZHVwbGljYXRlUGFydCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVBhcnRzLnB1c2goZHVwbGljYXRlUGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5zb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlID0gZHVwbGljYXRlUGFydHMuam9pbihcIjo6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZXNfMS5pbmRleE9mKGR1cGxpY2F0ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVzXzEucHVzaChkdXBsaWNhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0cmlidXRlOiByZWxhdGlvbklkQXR0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbl8xID0gcmVsYXRpb25JZEF0dHIucmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW5zXzEgPSByZWxhdGlvbl8xLmlzT3duaW5nID8gcmVsYXRpb25fMS5qb2luQ29sdW1ucyA6IHJlbGF0aW9uXzEuaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHJlbGF0aW9uXzEuaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gcmVsYXRpb25fMS5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUFsaWFzXzEgPSByZWxhdGlvbklkQXR0ci5hbGlhcyB8fCB0YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcmF3RW50aXRpZXMubWFwKGZ1bmN0aW9uIChyYXdFbnRpdHksIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJQYXJ0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydCA9IGpvaW5Db2x1bW5zXzEubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBqb2luQ29sdW1uLmRhdGFiYXNlTmFtZSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJWYWx1ZSA9IHJhd0VudGl0eVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCByZWxhdGlvbklkQXR0ci5wYXJlbnRBbGlhcywgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0gdGFibGVBbGlhc18xICsgXCI6XCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiOlwiICsgcGFyYW1ldGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVBhcnRzLmluZGV4T2YoZHVwbGljYXRlUGFydCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5wdXNoKGR1cGxpY2F0ZVBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclBhcnRzW3BhcmFtZXRlck5hbWVdID0gcGFyYW1ldGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVBhcnRzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGUgPSBkdXBsaWNhdGVQYXJ0cy5qb2luKFwiOjpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlc18yLmluZGV4T2YoZHVwbGljYXRlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMi5wdXNoKGR1cGxpY2F0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHBhcmFtZXRlcnNfMSwgcGFyYW1ldGVyUGFydHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9KS5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHdlIHdvbid0IHBlcmZvcm0gcmVkdW5kYW50IHF1ZXJpZXMgZm9yIGpvaW5lZCBkYXRhIHdoaWNoIHdhcyBub3QgZm91bmQgaW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IGlmIHBvc3QuY2F0ZWdvcnkgd2FzIG5vdCBmb3VuZCBpbiBkYiB0aGVuIG5vIG5lZWQgdG8gZXhlY3V0ZSBxdWVyeSBmb3IgY2F0ZWdvcnkuaW1hZ2VJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyByZWxhdGlvbklkQXR0cmlidXRlOiByZWxhdGlvbklkQXR0ciwgcmVzdWx0czogW10gfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuYWRkU2VsZWN0KHRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgsIGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uXzEuaW52ZXJzZVJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuYWRkU2VsZWN0KHRhYmxlQWxpYXNfMSArIFwiLlwiICsgcHJpbWFyeUNvbHVtbi5wcm9wZXJ0eVBhdGgsIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuZnJvbSh0YWJsZSwgdGFibGVBbGlhc18xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFwiKFwiICsgY29uZGl0aW9uICsgXCIpXCIpIC8vIG5lZWQgYnJhY2tldHMgYmVjYXVzZSBpZiB3ZSBoYXZlIGFkZGl0aW9uYWwgY29uZGl0aW9uIGFuZCBubyBicmFja2V0cywgaXQgbG9va3MgbGlrZSAoYSA9IDEpIE9SIChhID0gMikgQU5EIGIgPSAxLCB0aGF0IGlzIGluY29ycmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgY29uZGl0aW9uIChjdXN0b20gcXVlcnkgYnVpbGRlciBmYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25JZEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkocWJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiXzEuZ2V0UmF3TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSwgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbl8xLmludmVyc2VSZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShyZXN1bHRbY29sdW1uLmRhdGFiYXNlTmFtZV0sIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZTogcmVsYXRpb25JZEF0dHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18yID0gcmVsYXRpb24uaXNPd25pbmcgPyByZWxhdGlvbi5qb2luQ29sdW1ucyA6IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uc18xID0gcmVsYXRpb24uaXNPd25pbmcgPyByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXNfMSA9IHJlbGF0aW9uSWRBdHRyLmp1bmN0aW9uQWxpYXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VTaWRlVGFibGVOYW1lID0gcmVsYXRpb25JZEF0dHIuam9pbkludmVyc2VTaWRlTWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSA9IHJlbGF0aW9uSWRBdHRyLmFsaWFzIHx8IGludmVyc2VTaWRlVGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZENvbHVtbnMgPSByYXdFbnRpdGllcy5tYXAoZnVuY3Rpb24gKHJhd0VudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW5zXzIucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBbam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGhdID0gcmF3RW50aXR5W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIsIHJlbGF0aW9uSWRBdHRyLnBhcmVudEFsaWFzLCBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHJlbGF0aW9uSWRBdHRyaWJ1dGU6IHJlbGF0aW9uSWRBdHRyLCByZXN1bHRzOiBbXSB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uQ29uZGl0aW9ucyA9IG1hcHBlZENvbHVtbnMubWFwKGZ1bmN0aW9uIChtYXBwZWRDb2x1bW4sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJQYXJ0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydCA9IE9iamVjdC5rZXlzKG1hcHBlZENvbHVtbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyTmFtZSA9IGtleSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJWYWx1ZSA9IG1hcHBlZENvbHVtbltrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0ganVuY3Rpb25BbGlhc18xICsgXCI6XCIgKyBrZXkgKyBcIjpcIiArIHBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVQYXJ0cy5pbmRleE9mKGR1cGxpY2F0ZVBhcnQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlUGFydHMucHVzaChkdXBsaWNhdGVQYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJQYXJ0c1twYXJhbWV0ZXJOYW1lXSA9IHBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGtleSArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAocykgeyByZXR1cm4gczsgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlUGFydHMuc29ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZVBhcnRzLmpvaW4oXCI6OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVzXzMuaW5kZXhPZihkdXBsaWNhdGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlc18zLnB1c2goZHVwbGljYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1ldGVyc18yLCBwYXJhbWV0ZXJQYXJ0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHM7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbl8xID0gaW52ZXJzZUpvaW5Db2x1bW5zXzEubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gXCIgKyBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBqb2luQ29sdW1uQ29uZGl0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFwiICsgY29uZGl0aW9uICsgXCIgQU5EIFwiICsgaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25fMSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWJfMiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIodGhpcy5xdWVyeVJ1bm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzIuYWRkU2VsZWN0KGp1bmN0aW9uQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgsIGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRPcmRlckJ5KGp1bmN0aW9uQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbnNfMi5mb3JFYWNoKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYl8yLmFkZFNlbGVjdChqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoLCBqb2luQ29sdW1uLmRhdGFiYXNlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkT3JkZXJCeShqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzIuZnJvbShpbnZlcnNlU2lkZVRhYmxlTmFtZSwgaW52ZXJzZVNpZGVUYWJsZUFsaWFzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5uZXJKb2luKGp1bmN0aW9uVGFibGVOYW1lLCBqdW5jdGlvbkFsaWFzXzEsIGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IGNvbmRpdGlvbiAoY3VzdG9tIHF1ZXJ5IGJ1aWxkZXIgZmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uSWRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0ci5xdWVyeUJ1aWxkZXJGYWN0b3J5KHFiXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxYl8yLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoam9pbkNvbHVtbnNfMiksIGZhbHNlKSwgX19yZWFkKGludmVyc2VKb2luQ29sdW1uc18xKSwgZmFsc2UpLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSwgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGU6IHJlbGF0aW9uSWRBdHRyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25JZExvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbklkTG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRMb2FkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xudmFyIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBieSBleGFtcGxlOlxuICAgICAgICAvLyBwb3N0IGhhcyByZWxhdGlvbiBpZDpcbiAgICAgICAgLy8gQFJlbGF0aW9uSWQocG9zdCA9PiBwb3N0LmNhdGVnb3JpZXMpIGNhdGVnb3J5SWRzXG4gICAgICAgIC8vIGNhdGVnb3J5IGhhcyByZWxhdGlvbiBpZFxuICAgICAgICAvLyBAUmVsYXRpb25JZChjYXRlZ29yeSA9PiBjYXRlZ29yeS5pbWFnZXMpIGltYWdlSWRzXG4gICAgICAgIC8vIHdlIGxvYWQgcG9zdCBhbmQgam9pbiBjYXRlZ29yeVxuICAgICAgICAvLyB3ZSBleHBlY3QgcG9zdC5jYXRlZ29yeUlkcyBhbmQgcG9zdC5jYXRlZ29yeS5pbWFnZUlkcyB0byBoYXZlIHJlbGF0aW9uIGlkc1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBmaXJzdCBjcmVhdGUgcmVsYXRpb24gaWQgYXR0cmlidXRlcyBmb3IgYWxsIHJlbGF0aW9uIGlkIG1ldGFkYXRhcyBvZiB0aGUgbWFpbiBzZWxlY3RlZCBvYmplY3QgKHBvc3QgZnJvbSBleGFtcGxlKVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcykge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5yZWxhdGlvbklkcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IF90aGlzLm1ldGFkYXRhVG9BdHRyaWJ1dGUoX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSwgcmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZWNvbmQgY3JlYXRlIHJlbGF0aW9uIGlkIGF0dHJpYnV0ZXMgZm9yIGFsbCByZWxhdGlvbiBpZCBtZXRhZGF0YXMgb2YgYWxsIGpvaW5lZCBvYmplY3RzIChjYXRlZ29yeSBmcm9tIGV4YW1wbGUpXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChqb2luKSB7XG4gICAgICAgICAgICAvLyBlbnN1cmUgdGhpcyBqb2luIGhhcyBhIG1ldGFkYXRhLCBiZWNhdXNlIHJlbGF0aW9uIGlkIGNhbiBvbmx5IHdvcmsgZm9yIHJlYWwgb3JtIGVudGl0aWVzXG4gICAgICAgICAgICBpZiAoIWpvaW4ubWV0YWRhdGEgfHwgam9pbi5tZXRhZGF0YS5pc0p1bmN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEucmVsYXRpb25JZHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBfdGhpcy5tZXRhZGF0YVRvQXR0cmlidXRlKGpvaW4uYWxpYXMubmFtZSwgcmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIucHJvdG90eXBlLm1ldGFkYXRhVG9BdHRyaWJ1dGUgPSBmdW5jdGlvbiAocGFyZW50QWxpYXNOYW1lLCByZWxhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25JZEF0dHJpYnV0ZSh0aGlzLmV4cHJlc3Npb25NYXAsIHtcbiAgICAgICAgICAgIHJlbGF0aW9uTmFtZTogcGFyZW50QWxpYXNOYW1lICsgXCIuXCIgKyByZWxhdGlvbklkLnJlbGF0aW9uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHk6IHBhcmVudEFsaWFzTmFtZSArIFwiLlwiICsgcmVsYXRpb25JZC5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBhbGlhczogcmVsYXRpb25JZC5hbGlhcyxcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlckZhY3Rvcnk6IHJlbGF0aW9uSWQucXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBEZWxldGVRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgRGVsZXRlUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlbGV0ZVJlc3VsdCgpIHtcbiAgICB9XG4gICAgRGVsZXRlUmVzdWx0LmZyb20gPSBmdW5jdGlvbiAocXVlcnlSZXN1bHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyB0aGlzKCk7XG4gICAgICAgIHJlc3VsdC5yYXcgPSBxdWVyeVJlc3VsdC5yZWNvcmRzO1xuICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSBxdWVyeVJlc3VsdC5hZmZlY3RlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBEZWxldGVSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IHsgRGVsZXRlUmVzdWx0IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZVJlc3VsdC5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBJbnNlcnRRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgSW5zZXJ0UmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluc2VydFJlc3VsdCgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnRhaW5zIGluc2VydGVkIGVudGl0eSBpZC5cbiAgICAgICAgICogSGFzIGVudGl0eS1saWtlIHN0cnVjdHVyZSAobm90IGp1c3QgY29sdW1uIGRhdGFiYXNlIG5hbWUgYW5kIHZhbHVlcykuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkZW50aWZpZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IGEgZGF0YWJhc2UuXG4gICAgICAgICAqIEhhcyBlbnRpdHktbGlrZSBzdHJ1Y3R1cmUgKG5vdCBqdXN0IGNvbHVtbiBkYXRhYmFzZSBuYW1lIGFuZCB2YWx1ZXMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRNYXBzID0gW107XG4gICAgfVxuICAgIEluc2VydFJlc3VsdC5mcm9tID0gZnVuY3Rpb24gKHF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgdGhpcygpO1xuICAgICAgICByZXN1bHQucmF3ID0gcXVlcnlSZXN1bHQucmF3O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIEluc2VydFJlc3VsdDtcbn0oKSk7XG5leHBvcnQgeyBJbnNlcnRSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0UmVzdWx0LmpzLm1hcFxuIiwiLyoqXG4gKiBSZXN1bHQgb2JqZWN0IHJldHVybmVkIGJ5IFVwZGF0ZVF1ZXJ5QnVpbGRlciBleGVjdXRpb24uXG4gKi9cbnZhciBVcGRhdGVSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVXBkYXRlUmVzdWx0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29udGFpbnMgaW5zZXJ0ZWQgZW50aXR5IGlkLlxuICAgICAgICAgKiBIYXMgZW50aXR5LWxpa2Ugc3RydWN0dXJlIChub3QganVzdCBjb2x1bW4gZGF0YWJhc2UgbmFtZSBhbmQgdmFsdWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIGlkZW50aWZpZXI6IE9iamVjdExpdGVyYWxbXSA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2VuZXJhdGVkIHZhbHVlcyByZXR1cm5lZCBieSBhIGRhdGFiYXNlLlxuICAgICAgICAgKiBIYXMgZW50aXR5LWxpa2Ugc3RydWN0dXJlIChub3QganVzdCBjb2x1bW4gZGF0YWJhc2UgbmFtZSBhbmQgdmFsdWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkTWFwcyA9IFtdO1xuICAgIH1cbiAgICBVcGRhdGVSZXN1bHQuZnJvbSA9IGZ1bmN0aW9uIChxdWVyeVJlc3VsdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IHRoaXMoKTtcbiAgICAgICAgcmVzdWx0LnJhdyA9IHF1ZXJ5UmVzdWx0LnJlY29yZHM7XG4gICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHF1ZXJ5UmVzdWx0LmFmZmVjdGVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFVwZGF0ZVJlc3VsdDtcbn0oKSk7XG5leHBvcnQgeyBVcGRhdGVSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXBkYXRlUmVzdWx0LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqL1xudmFyIExvYWRNYXBJdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvYWRNYXBJdGVtKHBsYWluRW50aXR5LCBtZXRhZGF0YSwgcGFyZW50TG9hZE1hcEl0ZW0sIHJlbGF0aW9uKSB7XG4gICAgICAgIHRoaXMucGxhaW5FbnRpdHkgPSBwbGFpbkVudGl0eTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgICAgICB0aGlzLnBhcmVudExvYWRNYXBJdGVtID0gcGFyZW50TG9hZE1hcEl0ZW07XG4gICAgICAgIHRoaXMucmVsYXRpb24gPSByZWxhdGlvbjtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvYWRNYXBJdGVtLnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb2FkTWFwSXRlbS5wcm90b3R5cGUsIFwiaWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAodGhpcy5wbGFpbkVudGl0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gTG9hZE1hcEl0ZW07XG59KCkpO1xudmFyIExvYWRNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9hZE1hcCgpIHtcbiAgICAgICAgdGhpcy5sb2FkTWFwSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvYWRNYXAucHJvdG90eXBlLCBcIm1haW5Mb2FkTWFwSXRlbVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hcEl0ZW1zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuICFpdGVtLnJlbGF0aW9uICYmICFpdGVtLnBhcmVudExvYWRNYXBJdGVtOyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIExvYWRNYXAucHJvdG90eXBlLmFkZExvYWRNYXAgPSBmdW5jdGlvbiAobmV3TG9hZE1hcCkge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMubG9hZE1hcEl0ZW1zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0udGFyZ2V0ID09PSBuZXdMb2FkTWFwLnRhcmdldCAmJiBpdGVtLmlkID09PSBuZXdMb2FkTWFwLmlkOyB9KTtcbiAgICAgICAgaWYgKCFpdGVtKVxuICAgICAgICAgICAgdGhpcy5sb2FkTWFwSXRlbXMucHVzaChuZXdMb2FkTWFwKTtcbiAgICB9O1xuICAgIExvYWRNYXAucHJvdG90eXBlLmZpbGxFbnRpdGllcyA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0aWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5sb2FkTWFwSXRlbXMuZmluZChmdW5jdGlvbiAobG9hZE1hcEl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZE1hcEl0ZW0udGFyZ2V0ID09PSB0YXJnZXQgJiYgbG9hZE1hcEl0ZW0ubWV0YWRhdGEuY29tcGFyZUVudGl0aWVzKGVudGl0eSwgbG9hZE1hcEl0ZW0ucGxhaW5FbnRpdHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXRlbSlcbiAgICAgICAgICAgICAgICBpdGVtLmVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBMb2FkTWFwLnByb3RvdHlwZS5ncm91cEJ5VGFyZ2V0SWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgICAgIHRoaXMubG9hZE1hcEl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGxvYWRNYXBJdGVtKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHMuZmluZChmdW5jdGlvbiAoZ3JvdXApIHsgcmV0dXJuIGdyb3VwLnRhcmdldCA9PT0gbG9hZE1hcEl0ZW0udGFyZ2V0OyB9KTtcbiAgICAgICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBncm91cCA9IHsgdGFyZ2V0OiBsb2FkTWFwSXRlbS50YXJnZXQsIGlkczogW10gfTtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cC5pZHMucHVzaChsb2FkTWFwSXRlbS5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH07XG4gICAgcmV0dXJuIExvYWRNYXA7XG59KCkpO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIHBsYWluIG9sZCBqYXZhc2NyaXB0IG9iamVjdFxuICogRW50aXR5IGlzIGNvbnN0cnVjdGVkIGJhc2VkIG9uIGl0cyBlbnRpdHkgbWV0YWRhdGEuXG4gKi9cbnZhciBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lcihtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHBsYWluT2JqZWN0LCBtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbG9hZE1hcCwgZmlsbExvYWRNYXA7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGxhaW4gb2JqZWN0IGRvZXMgbm90IGhhdmUgaWQgdGhlbiBub3RoaW5nIHRvIGxvYWQgcmVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmhhc0FsbFByaW1hcnlLZXlzKHBsYWluT2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QoXCJHaXZlbiBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkgY29sdW1uLCBjYW5ub3QgdHJhbnNmb3JtIGl0IHRvIGRhdGFiYXNlIGVudGl0eS5cIildO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE1hcCA9IG5ldyBMb2FkTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTG9hZE1hcCA9IGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eU1ldGFkYXRhLCBwYXJlbnRMb2FkTWFwSXRlbSwgcmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBMb2FkTWFwSXRlbShlbnRpdHksIGVudGl0eU1ldGFkYXRhLCBwYXJlbnRMb2FkTWFwSXRlbSwgcmVsYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXAuYWRkTG9hZE1hcChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdFJlbGF0aW9uVmFsdWVzRnJvbUVudGl0eShlbnRpdHksIG1ldGFkYXRhLnJlbGF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2IgPSBfX3JlYWQoX2EsIDMpLCByZWxhdGlvbiA9IF9iWzBdLCB2YWx1ZSA9IF9iWzFdLCBpbnZlcnNlRW50aXR5TWV0YWRhdGEgPSBfYlsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGxMb2FkTWFwKHZhbHVlLCBpbnZlcnNlRW50aXR5TWV0YWRhdGEsIGl0ZW0sIHJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTG9hZE1hcChwbGFpbk9iamVjdCwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBhbGwgZW50aXRpZXMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGxvYWQgbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChsb2FkTWFwLmdyb3VwQnlUYXJnZXRJZHMoKS5tYXAoZnVuY3Rpb24gKHRhcmdldFdpdGhJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQnlJZHModGFyZ2V0V2l0aElkcy50YXJnZXQsIHRhcmdldFdpdGhJZHMuaWRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGVudGl0aWVzKSB7IHJldHVybiBsb2FkTWFwLmZpbGxFbnRpdGllcyh0YXJnZXRXaXRoSWRzLnRhcmdldCwgZW50aXRpZXMpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGFsbCBlbnRpdGllcyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbG9hZCBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggZWFjaCBpdGVtIGluIHRoZSBsb2FkIG1hcCBhbmQgc2V0IHRoZWlyIGVudGl0eSByZWxhdGlvbnNoaXAgdXNpbmcgbWV0YWRhdGEgc3RvcmVkIGluIGxvYWQgbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkTWFwLmxvYWRNYXBJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2FkTWFwSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9hZE1hcEl0ZW0ucmVsYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxvYWRNYXBJdGVtLmVudGl0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbG9hZE1hcEl0ZW0ucGFyZW50TG9hZE1hcEl0ZW0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkTWFwSXRlbS5yZWxhdGlvbi5pc01hbnlUb01hbnkgfHwgbG9hZE1hcEl0ZW0ucmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2FkTWFwSXRlbS5wYXJlbnRMb2FkTWFwSXRlbS5lbnRpdHlbbG9hZE1hcEl0ZW0ucmVsYXRpb24ucHJvcGVydHlOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdLnB1c2gobG9hZE1hcEl0ZW0uZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gbG9hZE1hcEl0ZW0uZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGxvYWRNYXAubWFpbkxvYWRNYXBJdGVtID8gbG9hZE1hcC5tYWluTG9hZE1hcEl0ZW0uZW50aXR5IDogdW5kZWZpbmVkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIuanMubWFwXG4iLCIvKipcbiAqIFRyYW5zZm9ybXMgcGxhaW4gb2xkIGphdmFzY3JpcHQgb2JqZWN0XG4gKiBFbnRpdHkgaXMgY29uc3RydWN0ZWQgYmFzZWQgb24gaXRzIGVudGl0eSBtZXRhZGF0YS5cbiAqL1xudmFyIFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXIoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChuZXdFbnRpdHksIG9iamVjdCwgbWV0YWRhdGEsIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJncm91cEFuZFRyYW5zZm9ybSBlbnRpdHk6XCIsIG5ld0VudGl0eSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ3JvdXBBbmRUcmFuc2Zvcm0gb2JqZWN0OlwiLCBvYmplY3QpO1xuICAgICAgICB0aGlzLmdyb3VwQW5kVHJhbnNmb3JtKG5ld0VudGl0eSwgb2JqZWN0LCBtZXRhZGF0YSwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBuZXdFbnRpdHkpO1xuICAgICAgICByZXR1cm4gbmV3RW50aXR5O1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByaXZhdGUgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTaW5jZSBkYiByZXR1cm5zIGEgZHVwbGljYXRlZCByb3dzIG9mIHRoZSBkYXRhIHdoZXJlIGFjY3VyYWNpZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSBkdXBsaWNhdGVkXG4gICAgICogd2UgbmVlZCB0byBncm91cCBvdXIgcmVzdWx0IGFuZCB3ZSBtdXN0IGhhdmUgc29tZSB1bmlxdWUgaWQgKHByaW1hcnkga2V5IGluIG91ciBjYXNlKVxuICAgICAqL1xuICAgIFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUuZ3JvdXBBbmRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZW50aXR5LCBvYmplY3QsIG1ldGFkYXRhLCBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ3JvdXBBbmRUcmFuc2Zvcm0gZW50aXR5OlwiLCBlbnRpdHkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImdyb3VwQW5kVHJhbnNmb3JtIG9iamVjdDpcIiwgb2JqZWN0KTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgLy8gY29weSByZWd1bGFyIGNvbHVtbiBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAgICBtZXRhZGF0YS5ub25WaXJ0dWFsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3RDb2x1bW5WYWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShvYmplY3QpO1xuICAgICAgICAgICAgaWYgKG9iamVjdENvbHVtblZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKGVudGl0eSwgb2JqZWN0Q29sdW1uVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gLy8gY29weSByZWxhdGlvbiBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAgICBpZiAobWV0YWRhdGEucmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgdmFyIG9iamVjdFJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKG9iamVjdCwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdFJlbGF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uLmlzTWFueVRvTWFueSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0UmVsYXRlZFZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHlSZWxhdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uc2V0RW50aXR5VmFsdWUoZW50aXR5LCBlbnRpdHlSZWxhdGVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFJlbGF0ZWRWYWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChvYmplY3RSZWxhdGVkVmFsdWVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgaXRlbSBmcm9tIHRoZSBtZXJnaW5nIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgZW50aXR5IHdlIG1lcmdlIGludG9cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3RSZWxhdGVkVmFsdWVFbnRpdHkgPSBlbnRpdHlSZWxhdGVkVmFsdWUuZmluZChmdW5jdGlvbiAoZW50aXR5UmVsYXRlZFZhbHVlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuY29tcGFyZUVudGl0aWVzKG9iamVjdFJlbGF0ZWRWYWx1ZUl0ZW0sIGVudGl0eVJlbGF0ZWRWYWx1ZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdWNoIGl0ZW0gYWxyZWFkeSBleGlzdCB0aGVuIG1lcmdlIG5ldyBkYXRhIGludG8gaXQsIGlmIGl0cyBub3Qgd2UgY3JlYXRlIGEgbmV3IGVudGl0eSBhbmQgbWVyZ2UgaXQgaW50byB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5ID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmNyZWF0ZSh1bmRlZmluZWQsIHsgZnJvbURlc2VyaWFsaXplcjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlSZWxhdGVkVmFsdWUucHVzaChvYmplY3RSZWxhdGVkVmFsdWVFbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ3JvdXBBbmRUcmFuc2Zvcm0ob2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5LCBvYmplY3RSZWxhdGVkVmFsdWVJdGVtLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgb2JqZWN0IGlzbid0IGFuIG9iamVjdCAoZGlyZWN0IHJlbGF0aW9uIGlkIGZvciBleGFtcGxlKVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IHNldCBpdCB0byB0aGUgZW50aXR5IHJlbGF0aW9uLCB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIG1vcmUgZnJvbSBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyIHdlIGRvIGl0IG9ubHkgaWYgb3JpZ2luYWwgZW50aXR5IGRvZXMgbm90IGhhdmUgdGhpcyByZWxhdGlvbiBzZXQgdG8gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZnVsbCBvdmVycmlkaW5nIG9mIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0UmVsYXRlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZW50aXR5UmVsYXRlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIG9iamVjdFJlbGF0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHlSZWxhdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5jcmVhdGUodW5kZWZpbmVkLCB7IGZyb21EZXNlcmlhbGl6ZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIGVudGl0eVJlbGF0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ3JvdXBBbmRUcmFuc2Zvcm0oZW50aXR5UmVsYXRlZFZhbHVlLCBvYmplY3RSZWxhdGVkVmFsdWUsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vLi4vZHJpdmVyL0RyaXZlclV0aWxzXCI7XG4vKipcbiAqIFRyYW5zZm9ybXMgcmF3IHNxbCByZXN1bHRzIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIGludG8gZW50aXR5IG9iamVjdC5cbiAqIEVudGl0eSBpcyBjb25zdHJ1Y3RlZCBiYXNlZCBvbiBpdHMgZW50aXR5IG1ldGFkYXRhLlxuICovXG52YXIgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyKGV4cHJlc3Npb25NYXAsIGRyaXZlciwgcmF3UmVsYXRpb25JZFJlc3VsdHMsIHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgICAgICB0aGlzLmRyaXZlciA9IGRyaXZlcjtcbiAgICAgICAgdGhpcy5yYXdSZWxhdGlvbklkUmVzdWx0cyA9IHJhd1JlbGF0aW9uSWRSZXN1bHRzO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uQ291bnRSZXN1bHRzID0gcmF3UmVsYXRpb25Db3VudFJlc3VsdHM7XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNpbmNlIGRiIHJldHVybnMgYSBkdXBsaWNhdGVkIHJvd3Mgb2YgdGhlIGRhdGEgd2hlcmUgYWNjdXJhY2llcyBvZiB0aGUgc2FtZSBvYmplY3QgY2FuIGJlIGR1cGxpY2F0ZWRcbiAgICAgKiB3ZSBuZWVkIHRvIGdyb3VwIG91ciByZXN1bHQgYW5kIHdlIG11c3QgaGF2ZSBzb21lIHVuaXF1ZSBpZCAocHJpbWFyeSBrZXkgaW4gb3VyIGNhc2UpXG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChyYXdSZXN1bHRzLCBhbGlhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3VwKHJhd1Jlc3VsdHMsIGFsaWFzKTtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gW107XG4gICAgICAgIGdyb3VwLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBfdGhpcy50cmFuc2Zvcm1SYXdSZXN1bHRzR3JvdXAocmVzdWx0cywgYWxpYXMpO1xuICAgICAgICAgICAgaWYgKGVudGl0eSAhPT0gdW5kZWZpbmVkICYmICFPYmplY3QudmFsdWVzKGVudGl0eSkuZXZlcnkoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSA9PT0gbnVsbDsgfSkpXG4gICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVudGl0aWVzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBnaXZlbiByYXcgcmVzdWx0cyBieSBpZHMgb2YgZ2l2ZW4gYWxpYXMuXG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLmdyb3VwID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGFsaWFzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgIGlmIChhbGlhcy5tZXRhZGF0YS50YWJsZVR5cGUgPT09IFwidmlld1wiKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFsaWFzLm1ldGFkYXRhLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBhbGlhcy5uYW1lLCBjb2x1bW4uZGF0YWJhc2VOYW1lKTsgfSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhbGlhcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5kcml2ZXIsIGFsaWFzLm5hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpOyB9KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmF3UmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyYXdSZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWUgPSByYXdSZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5VmFsdWUudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleVZhbHVlO1xuICAgICAgICAgICAgfSkuam9pbihcIl9cIik7IC8vIHRvZG86IGNoZWNrIHBhcnRpYWxcbiAgICAgICAgICAgIHZhciBpdGVtcyA9IG1hcC5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtcykge1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIFtyYXdSZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2gocmF3UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIHNldCBvZiBkYXRhIHJlc3VsdHMgaW50byBzaW5nbGUgZW50aXR5LlxuICAgICAqL1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1SYXdSZXN1bHRzR3JvdXAgPSBmdW5jdGlvbiAocmF3UmVzdWx0cywgYWxpYXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gbGV0IGhhc0NvbHVtbnMgPSBmYWxzZTsgLy8gLCBoYXNFbWJlZGRlZENvbHVtbnMgPSBmYWxzZSwgaGFzUGFyZW50Q29sdW1ucyA9IGZhbHNlLCBoYXNQYXJlbnRFbWJlZGRlZENvbHVtbnMgPSBmYWxzZTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gYWxpYXMubWV0YWRhdGE7XG4gICAgICAgIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgZGlzY3JpbWluYXRvclZhbHVlc18xID0gcmF3UmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBhbGlhcy5uYW1lLCBhbGlhcy5tZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZSldOyB9KTtcbiAgICAgICAgICAgIHZhciBkaXNjcmltaW5hdG9yTWV0YWRhdGEgPSBtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChjaGlsZEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkaXNjcmltaW5hdG9yVmFsdWVzXzEuZmluZChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSBjaGlsZEVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZTsgfSkgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGlzY3JpbWluYXRvck1ldGFkYXRhKVxuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gZGlzY3JpbWluYXRvck1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRpdHkgPSB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5pbmRleE9mKFwiY3JlYXRlLXBvam9cIikgIT09IC0xID8ge30gOiBtZXRhZGF0YS5jcmVhdGUodGhpcy5xdWVyeVJ1bm5lciwgeyBmcm9tRGVzZXJpYWxpemVyOiB0cnVlIH0pO1xuICAgICAgICAvLyBnZXQgdmFsdWUgZnJvbSBjb2x1bW5zIHNlbGVjdGlvbnMgYW5kIHB1dCB0aGVtIGludG8gbmV3bHkgY3JlYXRlZCBlbnRpdHlcbiAgICAgICAgdmFyIGhhc0NvbHVtbnMgPSB0aGlzLnRyYW5zZm9ybUNvbHVtbnMocmF3UmVzdWx0cywgYWxpYXMsIGVudGl0eSwgbWV0YWRhdGEpO1xuICAgICAgICB2YXIgaGFzUmVsYXRpb25zID0gdGhpcy50cmFuc2Zvcm1Kb2lucyhyYXdSZXN1bHRzLCBlbnRpdHksIGFsaWFzLCBtZXRhZGF0YSk7XG4gICAgICAgIHZhciBoYXNSZWxhdGlvbklkcyA9IHRoaXMudHJhbnNmb3JtUmVsYXRpb25JZHMocmF3UmVzdWx0cywgYWxpYXMsIGVudGl0eSwgbWV0YWRhdGEpO1xuICAgICAgICB2YXIgaGFzUmVsYXRpb25Db3VudHMgPSB0aGlzLnRyYW5zZm9ybVJlbGF0aW9uQ291bnRzKHJhd1Jlc3VsdHMsIGFsaWFzLCBlbnRpdHkpO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBjb2x1bW4gdGhlbiByZXR1cm4gdGhpcyBlbnRpdHlcbiAgICAgICAgLy8gc2luY2UgZW50aXR5IG11c3QgaGF2ZSBhdCBsZWFzdCBwcmltYXJ5IGNvbHVtbnMgdG8gYmUgcmVhbGx5IHNlbGVjdGVkIGFuZCB0cmFuc2Zvcm1lZCBpbnRvIGVudGl0eVxuICAgICAgICBpZiAoaGFzQ29sdW1ucylcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IHNlbGVjdGVkIGNvbHVtbiB3ZSBzaG91bGQgbm90IHJldHVybiBlbnRpdHksXG4gICAgICAgIC8vIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugd2hlbiBlbnRpdHkgb25seSBjb250YWluIGEgcHJpbWFyeSBjb2x1bW4gYXMgYSByZWxhdGlvbiB0byBhbm90aGVyIGVudGl0eVxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgaXRzIGFic29sdXRlbHkgcG9zc2libGUgb3VyIGVudGl0eSB0byBub3QgaGF2ZSBhbnkgY29sdW1ucyBleGNlcHQgYSBzaW5nbGUgcmVsYXRpb25cbiAgICAgICAgdmFyIGhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnMgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzVmlydHVhbCA9PT0gZmFsc2U7IH0pLmxlbmd0aCA9PT0gMDsgLy8gdG9kbzogY3JlYXRlIG1ldGFkYXRhLmhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnNcbiAgICAgICAgaWYgKGhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnMgJiYgKGhhc1JlbGF0aW9ucyB8fCBoYXNSZWxhdGlvbklkcyB8fCBoYXNSZWxhdGlvbkNvdW50cykpXG4gICAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLy8gZ2V0IHZhbHVlIGZyb20gY29sdW1ucyBzZWxlY3Rpb25zIGFuZCBwdXQgdGhlbSBpbnRvIG9iamVjdFxuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1Db2x1bW5zID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGFsaWFzLCBlbnRpdHksIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNEYXRhID0gZmFsc2U7XG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZiB0YWJsZSBpbmhlcml0YW5jZSBpcyB1c2VkIG1ha2Ugc3VyZSB0aGlzIGNvbHVtbiBpcyBub3QgY2hpbGQncyBjb2x1bW5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5sZW5ndGggPiAwICYmIG1ldGFkYXRhLmNoaWxkRW50aXR5TWV0YWRhdGFzLm1hcChmdW5jdGlvbiAobWV0YWRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhLnRhcmdldDsgfSkuaW5kZXhPZihjb2x1bW4udGFyZ2V0KSAhPT0gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmF3UmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmRyaXZlciwgYWxpYXMubmFtZSwgY29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmlzVmlydHVhbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB1c2VyIGRvZXMgbm90IHNlbGVjdGVkIHRoZSB3aG9sZSBlbnRpdHkgb3IgaGUgdXNlZCBwYXJ0aWFsIHNlbGVjdGlvbiBhbmQgZG9lcyBub3Qgc2VsZWN0IHRoaXMgcGFydGljdWxhciBjb2x1bW5cbiAgICAgICAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgYWRkIHRoaXMgY29sdW1uIGFuZCBpdHMgdmFsdWUgaW50byB0aGUgZW50aXR5XG4gICAgICAgICAgICBpZiAoIV90aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzLm5hbWUgfHwgc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXMubmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKGVudGl0eSwgX3RoaXMuZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgLy8gd2UgZG9uJ3QgbWFyayBpdCBhcyBoYXMgZGF0YSBiZWNhdXNlIGlmIHdlIHdpbGwgaGF2ZSBhbGwgbnVsbHMgaW4gb3VyIG9iamVjdCAtIHdlIGRvbid0IG5lZWQgc3VjaCBvYmplY3RcbiAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYXNEYXRhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBqb2luZWQgZW50aXRpZXMgaW4gdGhlIGdpdmVuIHJhdyByZXN1bHRzIGJ5IGEgZ2l2ZW4gYWxpYXMgYW5kIHN0b3JlcyB0byB0aGUgZ2l2ZW4gKHBhcmVudCkgZW50aXR5XG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybUpvaW5zID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGVudGl0eSwgYWxpYXMsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNEYXRhID0gZmFsc2U7XG4gICAgICAgIC8vIGxldCBkaXNjcmltaW5hdG9yVmFsdWU6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIC8vIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKVxuICAgICAgICAvLyAgICAgZGlzY3JpbWluYXRvclZhbHVlID0gcmF3UmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsIGFsaWFzLm5hbWUsIGFsaWFzLm1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW4hLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAoam9pbikge1xuICAgICAgICAgICAgLy8gc2tpcCBqb2lucyB3aXRob3V0IG1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoIWpvaW4ubWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgc2ltcGxlIGxlZnQgb3IgaW5uZXIgam9pbiB3YXMgcGVyZm9ybWVkIHdpdGhvdXQgc2VsZWN0aW9uIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKCFqb2luLmlzU2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBuZWVkIHRvIGF2b2lkIHNldHRpbmcgcHJvcGVydGllcyB0aGFuIG5vdCBiZWxvbmcgdG8gZW50aXR5IHdoZW4gc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIHVzZWQuICh0b2RvOiBjaGVjayBpZiB3ZSBzdGlsbCBuZWVkIGl0KVxuICAgICAgICAgICAgLy8gY29uc3QgbWV0YWRhdGEgPSBtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGNoaWxkRW50aXR5TWV0YWRhdGEgPT4gZGlzY3JpbWluYXRvclZhbHVlID09PSBjaGlsZEVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoam9pbi5yZWxhdGlvbiAmJiAhbWV0YWRhdGEucmVsYXRpb25zLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbiA9PT0gam9pbi5yZWxhdGlvbjsgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gc29tZSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoaXMgam9pbiBpcyBmb3IgY3VycmVudCBhbGlhc1xuICAgICAgICAgICAgaWYgKGpvaW4ubWFwVG9Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGlmIChqb2luLm1hcFRvUHJvcGVydHlQYXJlbnRBbGlhcyAhPT0gYWxpYXMubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2luLnJlbGF0aW9uIHx8IGpvaW4ucGFyZW50QWxpYXMgIT09IGFsaWFzLm5hbWUgfHwgam9pbi5yZWxhdGlvblByb3BlcnR5UGF0aCAhPT0gam9pbi5yZWxhdGlvbi5wcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBqb2luZWQgZGF0YSBpbnRvIGVudGl0aWVzXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3RoaXMudHJhbnNmb3JtKHJhd1Jlc3VsdHMsIGpvaW4uYWxpYXMpO1xuICAgICAgICAgICAgcmVzdWx0ID0gIWpvaW4uaXNNYW55ID8gcmVzdWx0WzBdIDogcmVzdWx0O1xuICAgICAgICAgICAgcmVzdWx0ID0gIWpvaW4uaXNNYW55ICYmIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdDsgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSByZWxhdGlvbnMgdG8gcmV0dXJuIG51bGwgd2hlbiBpdHMgam9pbmVkIGJ1dCBub3RoaW5nIHdhcyBmb3VuZCBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkgLy8gaWYgbm90aGluZyB3YXMgam9pbmVkIHRoZW4gc2ltcGx5IHJldHVyblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIGpvaW4gd2FzIG1hcHBlZCB0byBzb21lIHByb3BlcnR5IHRoZW4gc2F2ZSByZXN1bHQgdG8gdGhhdCBwcm9wZXJ0eVxuICAgICAgICAgICAgaWYgKGpvaW4ubWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgIGVudGl0eVtqb2luLm1hcFRvUHJvcGVydHlQcm9wZXJ0eU5hbWVdID0gcmVzdWx0OyAvLyB0b2RvOiBmaXggZW1iZWRzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gb3RoZXJ3aXNlIHNldCB0byByZWxhdGlvblxuICAgICAgICAgICAgICAgIGpvaW4ucmVsYXRpb24uc2V0RW50aXR5VmFsdWUoZW50aXR5LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFzRGF0YTtcbiAgICB9O1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1SZWxhdGlvbklkcyA9IGZ1bmN0aW9uIChyYXdTcWxSZXN1bHRzLCBhbGlhcywgZW50aXR5LCBtZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGFzRGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uSWRSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJhd1JlbGF0aW9uSWRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChyYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUucGFyZW50QWxpYXMgIT09IGFsaWFzLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmF3UmVsYXRpb25JZFJlc3VsdC5yZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uO1xuICAgICAgICAgICAgdmFyIHZhbHVlTWFwID0gX3RoaXMuY3JlYXRlVmFsdWVNYXBGcm9tSm9pbkNvbHVtbnMocmVsYXRpb24sIHJhd1JlbGF0aW9uSWRSZXN1bHQucmVsYXRpb25JZEF0dHJpYnV0ZS5wYXJlbnRBbGlhcywgcmF3U3FsUmVzdWx0cyk7XG4gICAgICAgICAgICBpZiAodmFsdWVNYXAgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZU1hcCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgaWRNYXBzID0gcmF3UmVsYXRpb25JZFJlc3VsdC5yZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eVByaW1hcnlJZHMgPSBfdGhpcy5leHRyYWN0RW50aXR5UHJpbWFyeUlkcyhyZWxhdGlvbiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoT3JtVXRpbHMuY29tcGFyZUlkcyhlbnRpdHlQcmltYXJ5SWRzLCB2YWx1ZU1hcCkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnM7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKGpvaW5Db2x1bW4gPT4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uISk7IC8vLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoam9pbkNvbHVtbiA9PiBqb2luQ29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE1hbnlUb01hbnlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzT3duaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGlkTWFwID0gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGlkTWFwLCBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0W2NvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbCAmJiBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiAmJiBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUgIT09IGNvbHVtbi5wcm9wZXJ0eU5hbWUpIC8vIGlmIGNvbHVtbiBpcyBhIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMubWVyZ2VEZWVwKGlkTWFwLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKSAvLyBpZiBjb2x1bW4gaXMgYSByZWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMubWVyZ2VEZWVwKGlkTWFwLCBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiByYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUuZGlzYWJsZU1peGVkTWFwID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShpZE1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGlkTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaWRNYXA7XG4gICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSByYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eVByb3BlcnR5UGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB2YXIgbWFwVG9Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBtYXAsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXBbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXBUb1Byb3BlcnR5KHByb3BlcnRpZXMsIG1hcFtwcm9wZXJ0eV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc09uZVRvT25lIHx8IHJlbGF0aW9uLmlzTWFueVRvT25lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkTWFwc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFRvUHJvcGVydHkocHJvcGVydGllcywgZW50aXR5LCBpZE1hcHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBUb1Byb3BlcnR5KHByb3BlcnRpZXMsIGVudGl0eSwgaWRNYXBzKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0RhdGE7XG4gICAgfTtcbiAgICBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtUmVsYXRpb25Db3VudHMgPSBmdW5jdGlvbiAocmF3U3FsUmVzdWx0cywgYWxpYXMsIGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGFzRGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uQ291bnRSZXN1bHRzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyYXdSZWxhdGlvbkNvdW50UmVzdWx0KSB7IHJldHVybiByYXdSZWxhdGlvbkNvdW50UmVzdWx0LnJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucGFyZW50QWxpYXMgPT09IGFsaWFzLm5hbWU7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmF3UmVsYXRpb25Db3VudFJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmF3UmVsYXRpb25Db3VudFJlc3VsdC5yZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uO1xuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUNvbHVtbk5hbWU7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5OYW1lID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lOyAvLyB0b2RvOiBmaXggam9pbkNvbHVtbnNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtbk5hbWUgPSByZWxhdGlvbi5pc093bmluZyA/IHJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lIDogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUNvbHVtblZhbHVlID0gcmF3U3FsUmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmRyaXZlciwgYWxpYXMubmFtZSwgcmVmZXJlbmNlQ29sdW1uTmFtZSldOyAvLyB3ZSB1c2UgemVybyBpbmRleCBzaW5jZSBpdHMgZ3JvdXBlZCBkYXRhIC8vIHRvZG86IHNlbGVjdGlvbiB3aXRoIGFsaWFzIGZvciBlbnRpdHkgY29sdW1ucyB3b250IHdvcmtcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHJlZmVyZW5jZUNvbHVtblZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZW50aXR5W3Jhd1JlbGF0aW9uQ291bnRSZXN1bHQucmVsYXRpb25Db3VudEF0dHJpYnV0ZS5tYXBUb1Byb3BlcnR5UHJvcGVydHlOYW1lXSA9IDA7XG4gICAgICAgICAgICAgICAgcmF3UmVsYXRpb25Db3VudFJlc3VsdC5yZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W1wicGFyZW50SWRcIl0gPT09IHJlZmVyZW5jZUNvbHVtblZhbHVlOyB9KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eVtyYXdSZWxhdGlvbkNvdW50UmVzdWx0LnJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZV0gPSBwYXJzZUludChyZXN1bHRbXCJjbnRcIl0pO1xuICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYXNEYXRhO1xuICAgIH07XG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLmNyZWF0ZVZhbHVlTWFwRnJvbUpvaW5Db2x1bW5zID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBwYXJlbnRBbGlhcywgcmF3U3FsUmVzdWx0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgY29sdW1ucyA9IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uICh2YWx1ZU1hcCwgY29sdW1uKSB7XG4gICAgICAgICAgICByYXdTcWxSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJhd1NxbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUocmF3U3FsUmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBwYXJlbnRBbGlhcywgY29sdW1uLmRhdGFiYXNlTmFtZSldLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUocmF3U3FsUmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBwYXJlbnRBbGlhcywgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV0sIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS5leHRyYWN0RW50aXR5UHJpbWFyeUlkcyA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgcmVsYXRpb25JZFJhd1Jlc3VsdCkge1xuICAgICAgICB2YXIgY29sdW1ucztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgY29sdW1ucyA9IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChkYXRhLCBjb2x1bW4pIHtcbiAgICAgICAgICAgIGRhdGFbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSByZWxhdGlvbklkUmF3UmVzdWx0W2NvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIHJldHVybiBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lcjtcbn0oKSk7XG5leHBvcnQgeyBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4uL2RyaXZlci9RdWVyeVwiO1xuaW1wb3J0IHsgU3FsSW5NZW1vcnkgfSBmcm9tIFwiLi4vZHJpdmVyL1NxbEluTWVtb3J5XCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG52YXIgQmFzZVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VRdWVyeVJ1bm5lcigpIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29ubmVjdGlvbiBmb3IgdGhpcyBxdWVyeSBydW5uZXIgaXMgcmVsZWFzZWQuXG4gICAgICAgICAqIE9uY2UgaXRzIHJlbGVhc2VkLCBxdWVyeSBydW5uZXIgY2Fubm90IHJ1biBxdWVyaWVzIGFueW1vcmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcmVzIHRlbXBvcmFyaWx5IHVzZXIgZGF0YS5cbiAgICAgICAgICogVXNlZnVsIGZvciBzaGFyaW5nIGRhdGEgd2l0aCBzdWJzY3JpYmVycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsIHN5bmNocm9uaXplZCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2FkZWRUYWJsZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBzeW5jaHJvbml6ZWQgdmlld3MgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2FkZWRWaWV3cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHNwZWNpYWwgcXVlcnkgcnVubmVyIG1vZGUgaW4gd2hpY2ggc3FsIHF1ZXJpZXMgd29uJ3QgYmUgZXhlY3V0ZWQgaXMgZW5hYmxlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3FsTWVtb3J5TW9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3FsLXMgc3RvcmVkIGlmIFwic3FsIGluIG1lbW9yeVwiIG1vZGUgaXMgZW5hYmxlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3FsSW5NZW1vcnkgPSBuZXcgU3FsSW5NZW1vcnkoKTtcbiAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzID0ge307XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2FkcyBnaXZlbiB0YWJsZSdzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVGFibGVzKFt0YWJsZVBhdGhdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFRhYmxlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmxvYWRlZFRhYmxlcy5sZW5ndGggPiAwID8gdGhpcy5sb2FkZWRUYWJsZXNbMF0gOiB1bmRlZmluZWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGFsbCB0YWJsZXMgKHdpdGggZ2l2ZW4gbmFtZXMpIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0VGFibGVzID0gZnVuY3Rpb24gKHRhYmxlTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGFibGVOYW1lcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRUYWJsZXModGFibGVOYW1lcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IFxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjYWNoZSBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG5ldyBjYXNlICYgaXNuJ3QgdXNlZCBhbnl3aGVyZSBlbHNlIGFueXdheS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9iLnNlbnQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFRhYmxlcyh0YWJsZU5hbWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFRhYmxlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmxvYWRlZFRhYmxlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgZ2l2ZW4gdmlldydzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRWaWV3ID0gZnVuY3Rpb24gKHZpZXdQYXRoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFZpZXdzKFt2aWV3UGF0aF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubG9hZGVkVmlld3MgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5sb2FkZWRWaWV3cy5sZW5ndGggPiAwID8gdGhpcy5sb2FkZWRWaWV3c1swXSA6IHVuZGVmaW5lZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgZ2l2ZW4gdmlldydzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRWaWV3cyA9IGZ1bmN0aW9uICh2aWV3UGF0aHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVmlld3Modmlld1BhdGhzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFZpZXdzID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMubG9hZGVkVmlld3NdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3BlY2lhbCBxdWVyeSBydW5uZXIgbW9kZSBpbiB3aGljaCBzcWwgcXVlcmllcyB3b24ndCBiZSBleGVjdXRlZCxcbiAgICAgKiBpbnN0ZWFkIHRoZXkgd2lsbCBiZSBtZW1vcml6ZWQgaW50byBhIHNwZWNpYWwgdmFyaWFibGUgaW5zaWRlIHF1ZXJ5IHJ1bm5lci5cbiAgICAgKiBZb3UgY2FuIGdldCBtZW1vcml6ZWQgc3FsIHVzaW5nIGdldE1lbW9yeVNxbCgpIG1ldGhvZC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmVuYWJsZVNxbE1lbW9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zcWxJbk1lbW9yeSA9IG5ldyBTcWxJbk1lbW9yeSgpO1xuICAgICAgICB0aGlzLnNxbE1lbW9yeU1vZGUgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgc3BlY2lhbCBxdWVyeSBydW5uZXIgbW9kZSBpbiB3aGljaCBzcWwgcXVlcmllcyB3b24ndCBiZSBleGVjdXRlZFxuICAgICAqIHN0YXJ0ZWQgYnkgY2FsbGluZyBlbmFibGVTcWxNZW1vcnkoKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBQcmV2aW91c2x5IG1lbW9yaXplZCBzcWwgd2lsbCBiZSBmbHVzaGVkLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZGlzYWJsZVNxbE1lbW9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zcWxJbk1lbW9yeSA9IG5ldyBTcWxJbk1lbW9yeSgpO1xuICAgICAgICB0aGlzLnNxbE1lbW9yeU1vZGUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgYWxsIG1lbW9yaXplZCBzcWxzLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2xlYXJTcWxNZW1vcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsSW5NZW1vcnkgPSBuZXcgU3FsSW5NZW1vcnkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgc3FsIHN0b3JlZCBpbiB0aGUgbWVtb3J5LiBQYXJhbWV0ZXJzIGluIHRoZSBzcWwgYXJlIGFscmVhZHkgcmVwbGFjZWQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRNZW1vcnlTcWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNxbEluTWVtb3J5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdXAgc3FsIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5leGVjdXRlTWVtb3J5VXBTcWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBxdWVyeSwgcGFyYW1ldGVycywgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLnNxbEluTWVtb3J5LnVwUXVlcmllcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gX2IudmFsdWUsIHF1ZXJ5ID0gX2MucXVlcnksIHBhcmFtZXRlcnMgPSBfYy5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMV8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2QgPSBfYS5yZXR1cm4pKSBfZC5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGRvd24gc3FsIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5leGVjdXRlTWVtb3J5RG93blNxbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlXzJfMTtcbiAgICAgICAgICAgIHZhciBlXzIsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuc3FsSW5NZW1vcnkuZG93blF1ZXJpZXMucmV2ZXJzZSgpKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MgPSBfYi52YWx1ZSwgcXVlcnkgPSBfYy5xdWVyeSwgcGFyYW1ldGVycyA9IF9jLnBhcmFtZXRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfZCA9IF9hLnJldHVybikpIF9kLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRSZXBsaWNhdGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGU7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0cyB2aWV3IGZyb20gcHJldmlvdXNseSBsb2FkZWQgdmlld3MsIG90aGVyd2lzZSBsb2FkcyBpdCBmcm9tIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0Q2FjaGVkVmlldyA9IGZ1bmN0aW9uICh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmlldywgZm91bmRWaWV3cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvYWRlZFZpZXdzLmZpbmQoZnVuY3Rpb24gKHZpZXcpIHsgcmV0dXJuIHZpZXcubmFtZSA9PT0gdmlld05hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHZpZXddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVmlld3MoW3ZpZXdOYW1lXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZpZXdzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkVmlld3MucHVzaChmb3VuZFZpZXdzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZm91bmRWaWV3c1swXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmlldyBcXFwiXCIgKyB2aWV3TmFtZSArIFwiXFxcIiBkb2VzIG5vdCBleGlzdC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyB0YWJsZSBmcm9tIHByZXZpb3VzbHkgbG9hZGVkIHRhYmxlcywgb3RoZXJ3aXNlIGxvYWRzIGl0IGZyb20gZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRDYWNoZWRUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlUGF0aF8xLCB0YWJsZSwgZm91bmRUYWJsZXMsIGZvdW5kVGFibGVQYXRoXzEsIGNhY2hlZFRhYmxlO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZU5hbWUgaW4gdGhpcy5jYWNoZWRUYWJsZVBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQYXRoXzEgPSB0aGlzLmNhY2hlZFRhYmxlUGF0aHNbdGFibGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXMubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSB0YWJsZVBhdGhfMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0YWJsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVGFibGVzKFt0YWJsZU5hbWVdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFibGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kVGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRhYmxlUGF0aF8xID0gdGhpcy5nZXRUYWJsZVBhdGgoZm91bmRUYWJsZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFRhYmxlID0gdGhpcy5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IGZvdW5kVGFibGVQYXRoXzE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzW3RhYmxlTmFtZV0gPSB0aGlzLmdldFRhYmxlUGF0aChmb3VuZFRhYmxlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkVGFibGVzLnB1c2goZm91bmRUYWJsZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZm91bmRUYWJsZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNhY2hlZFRhYmxlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVGFibGUgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiIGRvZXMgbm90IGV4aXN0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBsb2FkZWQgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VkIHRhYmxlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUucmVwbGFjZUNhY2hlZFRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBjaGFuZ2VkVGFibGUpIHtcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBvbGRUYWJsZVBhdGggPSB0aGlzLmdldFRhYmxlUGF0aCh0YWJsZSk7XG4gICAgICAgIHZhciBmb3VuZFRhYmxlID0gdGhpcy5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAobG9hZGVkVGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aChsb2FkZWRUYWJsZSkgPT09IG9sZFRhYmxlUGF0aDsgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9va3VwIGNhY2hlLi5cbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXModGhpcy5jYWNoZWRUYWJsZVBhdGhzKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQoX2MudmFsdWUsIDIpLCBrZXkgPSBfZFswXSwgY2FjaGVkUGF0aCA9IF9kWzFdO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRQYXRoID09PSBvbGRUYWJsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzW2tleV0gPSB0aGlzLmdldFRhYmxlUGF0aChjaGFuZ2VkVGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zXzEpIHsgZV8zID0geyBlcnJvcjogZV8zXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZFRhYmxlKSB7XG4gICAgICAgICAgICBmb3VuZFRhYmxlLmRhdGFiYXNlID0gY2hhbmdlZFRhYmxlLmRhdGFiYXNlO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5zY2hlbWEgPSBjaGFuZ2VkVGFibGUuc2NoZW1hO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5uYW1lID0gY2hhbmdlZFRhYmxlLm5hbWU7XG4gICAgICAgICAgICBmb3VuZFRhYmxlLmNvbHVtbnMgPSBjaGFuZ2VkVGFibGUuY29sdW1ucztcbiAgICAgICAgICAgIGZvdW5kVGFibGUuaW5kaWNlcyA9IGNoYW5nZWRUYWJsZS5pbmRpY2VzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5mb3JlaWduS2V5cyA9IGNoYW5nZWRUYWJsZS5mb3JlaWduS2V5cztcbiAgICAgICAgICAgIGZvdW5kVGFibGUudW5pcXVlcyA9IGNoYW5nZWRUYWJsZS51bmlxdWVzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5jaGVja3MgPSBjaGFuZ2VkVGFibGUuY2hlY2tzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5qdXN0Q3JlYXRlZCA9IGNoYW5nZWRUYWJsZS5qdXN0Q3JlYXRlZDtcbiAgICAgICAgICAgIGZvdW5kVGFibGUuZW5naW5lID0gY2hhbmdlZFRhYmxlLmVuZ2luZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRUYWJsZVBhdGggPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKHBhcnNlZC50YWJsZU5hbWUsIHBhcnNlZC5zY2hlbWEsIHBhcnNlZC5kYXRhYmFzZSk7XG4gICAgfTtcbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKFwidHlwZW9ybV9tZXRhZGF0YVwiLCBvcHRpb25zLnNjaGVtYSwgb3B0aW9ucy5kYXRhYmFzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgU1FMIHF1ZXJ5IHRvIGluc2VydCBhIHJlY29yZCBpbnRvIFwidHlwZW9ybV9tZXRhZGF0YVwiIHRhYmxlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IF9hLmRhdGFiYXNlLCBzY2hlbWEgPSBfYS5zY2hlbWEsIHRhYmxlID0gX2EudGFibGUsIHR5cGUgPSBfYS50eXBlLCBuYW1lID0gX2EubmFtZSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkKHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAuaW50byh0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpKVxuICAgICAgICAgICAgLnZhbHVlcyh7IGRhdGFiYXNlOiBkYXRhYmFzZSwgc2NoZW1hOiBzY2hlbWEsIHRhYmxlOiB0YWJsZSwgdHlwZTogdHlwZSwgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pXG4gICAgICAgICAgICAuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKCksIDIpLCBxdWVyeSA9IF9iWzBdLCBwYXJhbWV0ZXJzID0gX2JbMV07XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkocXVlcnksIHBhcmFtZXRlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIFNRTCBxdWVyeSB0byBkZWxldGUgYSByZWNvcmQgZnJvbSBcInR5cGVvcm1fbWV0YWRhdGFcIiB0YWJsZS5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgZGF0YWJhc2UgPSBfYS5kYXRhYmFzZSwgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZSA9IF9hLnRhYmxlLCB0eXBlID0gX2EudHlwZSwgbmFtZSA9IF9hLm5hbWU7XG4gICAgICAgIHZhciBxYiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgICAgICAgdmFyIGRlbGV0ZVFiID0gcWIuZGVsZXRlKClcbiAgICAgICAgICAgIC5mcm9tKHRoaXMuZ2V0VHlwZW9ybU1ldGFkYXRhVGFibGVOYW1lKCkpXG4gICAgICAgICAgICAud2hlcmUocWIuZXNjYXBlKFwidHlwZVwiKSArIFwiID0gOnR5cGVcIiwgeyB0eXBlOiB0eXBlIH0pXG4gICAgICAgICAgICAuYW5kV2hlcmUocWIuZXNjYXBlKFwibmFtZVwiKSArIFwiID0gOm5hbWVcIiwgeyBuYW1lOiBuYW1lIH0pO1xuICAgICAgICBpZiAoZGF0YWJhc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZVFiLmFuZFdoZXJlKHFiLmVzY2FwZShcImRhdGFiYXNlXCIpICsgXCIgPSA6ZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogZGF0YWJhc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgZGVsZXRlUWIuYW5kV2hlcmUocWIuZXNjYXBlKFwic2NoZW1hXCIpICsgXCIgPSA6c2NoZW1hXCIsIHsgc2NoZW1hOiBzY2hlbWEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICBkZWxldGVRYi5hbmRXaGVyZShxYi5lc2NhcGUoXCJ0YWJsZVwiKSArIFwiID0gOnRhYmxlXCIsIHsgdGFibGU6IHRhYmxlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYiA9IF9fcmVhZChkZWxldGVRYi5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHF1ZXJ5ID0gX2JbMF0sIHBhcmFtZXRlcnMgPSBfYlsxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYXQgbGVhc3Qgb25lIG9mIGNvbHVtbiBwcm9wZXJ0aWVzIHdhcyBjaGFuZ2VkLlxuICAgICAqIERvZXMgbm90IGNoZWNrcyBjb2x1bW4gdHlwZSwgbGVuZ3RoIGFuZCBhdXRvaW5jcmVtZW50LCBiZWNhdXNlIHRoZXNlIHByb3BlcnRpZXMgY2hhbmdlcyBzZXBhcmF0ZWx5LlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuaXNDb2x1bW5DaGFuZ2VkID0gZnVuY3Rpb24gKG9sZENvbHVtbiwgbmV3Q29sdW1uLCBjaGVja0RlZmF1bHQsIGNoZWNrQ29tbWVudCkge1xuICAgICAgICAvLyB0aGlzIGxvZ3MgbmVlZCB0byBkZWJ1ZyBpc3N1ZXMgaW4gY29sdW1uIGNoYW5nZSBkZXRlY3Rpb24uIERvIG5vdCBkZWxldGUgaXQhXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hhcnNldCAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jaGFyc2V0ICE9PSBuZXdDb2x1bW4uY2hhcnNldCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jaGFyc2V0LCBuZXdDb2x1bW4uY2hhcnNldCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY29sbGF0aW9uIC0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLmNvbGxhdGlvbiAhPT0gbmV3Q29sdW1uLmNvbGxhdGlvbik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jb2xsYXRpb24sIG5ld0NvbHVtbi5jb2xsYXRpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInByZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5wcmVjaXNpb24gIT09IG5ld0NvbHVtbi5wcmVjaXNpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4ucHJlY2lzaW9uLCBuZXdDb2x1bW4ucHJlY2lzaW9uKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJzY2FsZSAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5zY2FsZSAhPT0gbmV3Q29sdW1uLnNjYWxlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLnNjYWxlLCBuZXdDb2x1bW4uc2NhbGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlZmF1bHQgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygoY2hlY2tEZWZhdWx0ICYmIG9sZENvbHVtbi5kZWZhdWx0ICE9PSBuZXdDb2x1bW4uZGVmYXVsdCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uZGVmYXVsdCwgbmV3Q29sdW1uLmRlZmF1bHQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzTnVsbGFibGUgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uaXNOdWxsYWJsZSAhPT0gbmV3Q29sdW1uLmlzTnVsbGFibGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uaXNOdWxsYWJsZSwgbmV3Q29sdW1uLmlzTnVsbGFibGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNvbW1lbnQgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygoY2hlY2tDb21tZW50ICYmIG9sZENvbHVtbi5jb21tZW50ICE9PSBuZXdDb2x1bW4uY29tbWVudCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uY29tbWVudCwgbmV3Q29sdW1uLmNvbW1lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVudW0gLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyghT3JtVXRpbHMuaXNBcnJheXNFcXVhbChvbGRDb2x1bW4uZW51bSB8fCBbXSwgbmV3Q29sdW1uLmVudW0gfHwgW10pKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLmVudW0sIG5ld0NvbHVtbi5lbnVtKTtcbiAgICAgICAgcmV0dXJuIG9sZENvbHVtbi5jaGFyc2V0ICE9PSBuZXdDb2x1bW4uY2hhcnNldFxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLmNvbGxhdGlvbiAhPT0gbmV3Q29sdW1uLmNvbGxhdGlvblxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLnByZWNpc2lvbiAhPT0gbmV3Q29sdW1uLnByZWNpc2lvblxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLnNjYWxlICE9PSBuZXdDb2x1bW4uc2NhbGVcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi53aWR0aCAhPT0gbmV3Q29sdW1uLndpZHRoIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi56ZXJvZmlsbCAhPT0gbmV3Q29sdW1uLnplcm9maWxsIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi51bnNpZ25lZCAhPT0gbmV3Q29sdW1uLnVuc2lnbmVkIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi5hc0V4cHJlc3Npb24gIT09IG5ld0NvbHVtbi5hc0V4cHJlc3Npb24gLy8gTXlTUUwgb25seVxuICAgICAgICAgICAgfHwgKGNoZWNrRGVmYXVsdCAmJiBvbGRDb2x1bW4uZGVmYXVsdCAhPT0gbmV3Q29sdW1uLmRlZmF1bHQpXG4gICAgICAgICAgICB8fCBvbGRDb2x1bW4ub25VcGRhdGUgIT09IG5ld0NvbHVtbi5vblVwZGF0ZSAvLyBNeVNRTCBvbmx5XG4gICAgICAgICAgICB8fCBvbGRDb2x1bW4uaXNOdWxsYWJsZSAhPT0gbmV3Q29sdW1uLmlzTnVsbGFibGVcbiAgICAgICAgICAgIHx8IChjaGVja0NvbW1lbnQgJiYgb2xkQ29sdW1uLmNvbW1lbnQgIT09IG5ld0NvbHVtbi5jb21tZW50KVxuICAgICAgICAgICAgfHwgIU9ybVV0aWxzLmlzQXJyYXlzRXF1YWwob2xkQ29sdW1uLmVudW0gfHwgW10sIG5ld0NvbHVtbi5lbnVtIHx8IFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gbGVuZ3RoIGlzIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5pc0RlZmF1bHRDb2x1bW5MZW5ndGggPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgbGVuZ3RoKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YUxlbmd0aCA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZ2V0Q29sdW1uTGVuZ3RoKGNvbHVtbk1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGFMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ubGVuZ3RoLnRvU3RyaW5nKCkgPT09IGxlbmd0aC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gcHJlY2lzaW9uIGlzIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5pc0RlZmF1bHRDb2x1bW5QcmVjaXNpb24gPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgcHJlY2lzaW9uKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSAmJiBjb2x1bW5NZXRhZGF0YS5wcmVjaXNpb24gIT09IG51bGwgJiYgY29sdW1uTWV0YWRhdGEucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNcbiAgICAgICAgICAgICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV1cbiAgICAgICAgICAgICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ucHJlY2lzaW9uICE9PSBudWxsXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ucHJlY2lzaW9uID09PSBwcmVjaXNpb247XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gc2NhbGUgaXMgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmlzRGVmYXVsdENvbHVtblNjYWxlID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4sIHNjYWxlKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSAmJiBjb2x1bW5NZXRhZGF0YS5zY2FsZSAhPT0gbnVsbCAmJiBjb2x1bW5NZXRhZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnNjYWxlICE9PSBudWxsXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzW2NvbHVtbi50eXBlXS5zY2FsZSA9PT0gc2NhbGU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCB1c2VkIHNwZWNpYWwgZm9yIHNjaGVtYSBidWlsZC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmV4ZWN1dGVRdWVyaWVzID0gZnVuY3Rpb24gKHVwUXVlcmllcywgZG93blF1ZXJpZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllc18xLCB1cFF1ZXJpZXNfMV8xLCBfYSwgcXVlcnksIHBhcmFtZXRlcnMsIGVfNF8xO1xuICAgICAgICAgICAgdmFyIF9iLCBfYywgZV80LCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cFF1ZXJpZXMgaW5zdGFuY2VvZiBRdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbdXBRdWVyaWVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3duUXVlcmllcyBpbnN0YW5jZW9mIFF1ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW2Rvd25RdWVyaWVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYiA9IHRoaXMuc3FsSW5NZW1vcnkudXBRdWVyaWVzKS5wdXNoLmFwcGx5KF9iLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodXBRdWVyaWVzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYyA9IHRoaXMuc3FsSW5NZW1vcnkuZG93blF1ZXJpZXMpLnB1c2guYXBwbHkoX2MsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChkb3duUXVlcmllcyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzcWwtaW4tbWVtb3J5IG1vZGUgaXMgZW5hYmxlZCB0aGVuIHNpbXBseSBzdG9yZSBzcWwgaW4gbWVtb3J5IGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNxbE1lbW9yeU1vZGUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXNfMSA9IF9fdmFsdWVzKHVwUXVlcmllcyksIHVwUXVlcmllc18xXzEgPSB1cFF1ZXJpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXVwUXVlcmllc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHVwUXVlcmllc18xXzEudmFsdWUsIHF1ZXJ5ID0gX2EucXVlcnksIHBhcmFtZXRlcnMgPSBfYS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllc18xXzEgPSB1cFF1ZXJpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV80XzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwUXVlcmllc18xXzEgJiYgIXVwUXVlcmllc18xXzEuZG9uZSAmJiAoX2QgPSB1cFF1ZXJpZXNfMS5yZXR1cm4pKSBfZC5jYWxsKHVwUXVlcmllc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlUXVlcnlSdW5uZXI7XG59KCkpO1xuZXhwb3J0IHsgQmFzZVF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VRdWVyeVJ1bm5lci5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBVcGRhdGVRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgUXVlcnlSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVlcnlSZXN1bHQoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSb3dzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5UmVzdWx0O1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXJ5UmVzdWx0LmpzLm1hcFxuIiwiaW1wb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3JcIjtcbmltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3JcIjtcbi8qKlxuICogUHJvdmlkZXMgYWJzdHJhY3QgY2xhc3MgZm9yIGN1c3RvbSByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIG9yaWdpbmFsIG9ybSBSZXBvc2l0b3J5LlxuICogQ29udGFpbnMgYWxsIG1vc3QtbmVjZXNzYXJ5IG1ldGhvZHMgdG8gc2ltcGxpZnkgY29kZSBpbiB0aGUgY3VzdG9tIHJlcG9zaXRvcnkuXG4gKiBBbGwgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIHRodXMgbm90IGV4cG9zZWQgYW5kIGl0IGFsbG93cyB0byBjcmVhdGUgZW5jYXBzdWxhdGVkIGN1c3RvbSByZXBvc2l0b3J5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xudmFyIEFic3RyYWN0UmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBYnN0cmFjdFJlcG9zaXRvcnkoKSB7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdFJlcG9zaXRvcnkucHJvdG90eXBlLCBcInJlcG9zaXRvcnlcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFByb3RlY3RlZCBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgb3JpZ2luYWwgT1JNIHJlcG9zaXRvcnkgZm9yIHRoZSBlbnRpdHkgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgICAgICogSWYgY3VycmVudCByZXBvc2l0b3J5IGRvZXMgbm90IG1hbmFnZSBhbnkgZW50aXR5LCB0aGVuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuZ2V0Q3VzdG9tUmVwb3NpdG9yeVRhcmdldCh0aGlzKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvcih0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUsIFwidHJlZVJlcG9zaXRvcnlcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgb3JpZ2luYWwgT1JNIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGVudGl0eSB0aGF0IGlzIG1hbmFnZWQgYnkgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgICAgKiBJZiBjdXJyZW50IHJlcG9zaXRvcnkgZG9lcyBub3QgbWFuYWdlIGFueSBlbnRpdHksIHRoZW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5nZXRDdXN0b21SZXBvc2l0b3J5VGFyZ2V0KHRoaXMpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRUcmVlUmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkncyBlbnRpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNxbCBxdWVyeS5cbiAgICAgKiBJZiBjdXJyZW50IHJlcG9zaXRvcnkgZG9lcyBub3QgbWFuYWdlIGFueSBlbnRpdHksIHRoZW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmdldEN1c3RvbVJlcG9zaXRvcnlUYXJnZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFJlcG9zaXRvcnkodGFyZ2V0KS5jcmVhdGVRdWVyeUJ1aWxkZXIoYWxpYXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gZW50aXR5IHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgQWJzdHJhY3RSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGVRdWVyeUJ1aWxkZXJGb3IgPSBmdW5jdGlvbiAoZW50aXR5LCBhbGlhcykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5Rm9yKGVudGl0eSkuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9yaWdpbmFsIE9STSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuZ2V0UmVwb3NpdG9yeUZvciA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRSZXBvc2l0b3J5KGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBvcmlnaW5hbCBPUk0gdHJlZSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuZ2V0VHJlZVJlcG9zaXRvcnlGb3IgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0cyBjdXN0b20gcmVwb3NpdG9yeSdzIG1hbmFnZWQgZW50aXR5LlxuICAgICAqIElmIGdpdmVuIGN1c3RvbSByZXBvc2l0b3J5IGRvZXMgbm90IG1hbmFnZSBhbnkgZW50aXR5IHRoZW4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RSZXBvc2l0b3J5LnByb3RvdHlwZS5nZXRDdXN0b21SZXBvc2l0b3J5VGFyZ2V0ID0gZnVuY3Rpb24gKGN1c3RvbVJlcG9zaXRvcnkpIHtcbiAgICAgICAgdmFyIGVudGl0eVJlcG9zaXRvcnlNZXRhZGF0YUFyZ3MgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5UmVwb3NpdG9yaWVzLmZpbmQoZnVuY3Rpb24gKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5LnRhcmdldCA9PT0gKGN1c3RvbVJlcG9zaXRvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGN1c3RvbVJlcG9zaXRvcnkgOiBjdXN0b21SZXBvc2l0b3J5LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncylcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvcihjdXN0b21SZXBvc2l0b3J5KTtcbiAgICAgICAgcmV0dXJuIGVudGl0eVJlcG9zaXRvcnlNZXRhZGF0YUFyZ3MuZW50aXR5O1xuICAgIH07XG4gICAgcmV0dXJuIEFic3RyYWN0UmVwb3NpdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBBYnN0cmFjdFJlcG9zaXRvcnkgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzdHJhY3RSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbi8qKlxuICogQmFzZSBhYnN0cmFjdCBlbnRpdHkgZm9yIGFsbCBlbnRpdGllcywgdXNlZCBpbiBBY3RpdmVSZWNvcmQgcGF0dGVybnMuXG4gKi9cbnZhciBCYXNlRW50aXR5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VFbnRpdHkoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGhhcyBhbiBpZC5cbiAgICAgKiBJZiBlbnRpdHkgY29tcG9zaXRlIGNvbXBvc2UgaWRzLCBpdCB3aWxsIGNoZWNrIHRoZW0gYWxsLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLmhhc0lkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuaGFzSWQodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBjdXJyZW50IGVudGl0eSBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICogSWYgZW50aXR5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0aGVuIGluc2VydHMsIG90aGVyd2lzZSB1cGRhdGVzLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuc2F2ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgY3VycmVudCBlbnRpdHkgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0UmVwb3NpdG9yeSgpLnJlbW92ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIGN1cnJlbnQgZW50aXR5LlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuc29mdFJlbW92ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY292ZXJzIGEgZ2l2ZW4gZW50aXR5IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnByb3RvdHlwZS5yZWNvdmVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0UmVwb3NpdG9yeSgpLnJlY292ZXIodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIGVudGl0eSBkYXRhIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJhc2UsIG5ld2VzdEVudGl0eTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYmFzZS5nZXRSZXBvc2l0b3J5KCkuZmluZE9uZU9yRmFpbChiYXNlLmdldElkKHRoaXMpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VzdEVudGl0eSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBuZXdlc3RFbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25uZWN0aW9uIHRvIGJlIHVzZWQgYnkgZW50aXR5LlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkudXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMudXNlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBjdXJyZW50IGVudGl0eSdzIFJlcG9zaXRvcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5nZXRSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMudXNlZENvbm5lY3Rpb24gfHwgZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRSZXBvc2l0b3J5KHRoaXMpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2VFbnRpdHksIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgb2JqZWN0IHRoYXQgaXMgbWFuYWdlZCBieSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICAgICAqIElmIHRoaXMgcmVwb3NpdG9yeSBtYW5hZ2VzIGVudGl0eSBmcm9tIHNjaGVtYSxcbiAgICAgICAgICogdGhlbiBpdCByZXR1cm5zIGEgbmFtZSBvZiB0aGF0IHNjaGVtYSBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkudGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGVudGl0eSBoYXMgYW4gaWQuXG4gICAgICogSWYgZW50aXR5IGNvbXBvc2l0ZSBjb21wb3NlIGlkcywgaXQgd2lsbCBjaGVjayB0aGVtIGFsbC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lmhhc0lkID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuaGFzSWQoZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXR5IG1peGVkIGlkLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuZ2V0SWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5nZXRJZChlbnRpdHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jcmVhdGVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgaW5zdGFuY2UgYW5kIGNvcGllcyBhbGwgZW50aXR5IHByb3BlcnRpZXMgZnJvbSB0aGlzIG9iamVjdCBpbnRvIGEgbmV3IGVudGl0eS5cbiAgICAgICogTm90ZSB0aGF0IGl0IGNvcGllcyBvbmx5IHByb3BlcnRpZXMgdGhhdCBwcmVzZW50IGluIGVudGl0eSBzY2hlbWEuXG4gICAgICAqL1xuICAgIEJhc2VFbnRpdHkuY3JlYXRlID0gZnVuY3Rpb24gKGVudGl0eU9yRW50aXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZShlbnRpdHlPckVudGl0aWVzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lcmdlcyBtdWx0aXBsZSBlbnRpdGllcyAob3IgZW50aXR5LWxpa2Ugb2JqZWN0cykgaW50byBhIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lm1lcmdlID0gZnVuY3Rpb24gKG1lcmdlSW50b0VudGl0eSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBlbnRpdHlMaWtlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZW50aXR5TGlrZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuZ2V0UmVwb3NpdG9yeSgpKS5tZXJnZS5hcHBseShfYSwgX19zcHJlYWRBcnJheShbbWVyZ2VJbnRvRW50aXR5XSwgX19yZWFkKGVudGl0eUxpa2VzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGZyb20gdGhlIGdpdmVuIHBsYWluIGphdmFzY3JpcHQgb2JqZWN0LiBJZiBlbnRpdHkgYWxyZWFkeSBleGlzdCBpbiB0aGUgZGF0YWJhc2UsIHRoZW5cbiAgICAgKiBpdCBsb2FkcyBpdCAoYW5kIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBpdCksIHJlcGxhY2VzIGFsbCB2YWx1ZXMgd2l0aCB0aGUgbmV3IG9uZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XG4gICAgICogYW5kIHJldHVybnMgdGhpcyBuZXcgZW50aXR5LiBUaGlzIG5ldyBlbnRpdHkgaXMgYWN0dWFsbHkgYSBsb2FkZWQgZnJvbSB0aGUgZGIgZW50aXR5IHdpdGggYWxsIHByb3BlcnRpZXNcbiAgICAgKiByZXBsYWNlZCBmcm9tIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGdpdmVuIGVudGl0eS1saWtlIG9iamVjdCBtdXN0IGhhdmUgYW4gZW50aXR5IGlkIC8gcHJpbWFyeSBrZXkgdG8gZmluZCBlbnRpdHkgYnkuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgZW50aXR5IHdpdGggZ2l2ZW4gaWQgd2FzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnByZWxvYWQgPSBmdW5jdGlvbiAoZW50aXR5TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkucHJlbG9hZChlbnRpdHlMaWtlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNhdmVzIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuc2F2ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5zYXZlKGVudGl0eU9yRW50aXRpZXMsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnJlbW92ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5yZW1vdmUoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIHRoZSBkZWxldGUgZGF0ZSBvZiBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuc29mdFJlbW92ZShlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBnaXZlbiBlbnRpdHkgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCBzbyBxdWVyeSB3aWxsIGZhaWwgaWYgZHVwbGljYXRlIGVudGl0eSBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lmluc2VydCA9IGZ1bmN0aW9uIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmluc2VydChlbnRpdHksIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBlbnRpdHkgcGFydGlhbGx5LiBFbnRpdHkgY2FuIGJlIGZvdW5kIGJ5IGEgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgVVBEQVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS51cGRhdGUgPSBmdW5jdGlvbiAoY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLnVwZGF0ZShjcml0ZXJpYSwgcGFydGlhbEVudGl0eSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgZ2l2ZW4gZW50aXR5IGludG8gdGhlIGRhdGFiYXNlLCB1bmxlc3MgYSB1bmlxdWUgY29uc3RyYWludCBjb25mbGljdHMgdGhlbiB1cGRhdGVzIHRoZSBlbnRpdHlcbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgSU5TRVJUIC4uLiBPTiBDT05GTElDVCBETyBVUERBVEUvT04gRFVQTElDQVRFIEtFWSBVUERBVEUgcXVlcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS51cHNlcnQgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgY29uZmxpY3RQYXRoc09yT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkudXBzZXJ0KGVudGl0eU9yRW50aXRpZXMsIGNvbmZsaWN0UGF0aHNPck9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSByZW1vdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IERFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuZGVsZXRlID0gZnVuY3Rpb24gKGNyaXRlcmlhLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5kZWxldGUoY3JpdGVyaWEsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ291bnRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5jb3VudChvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmZpbmQob3B0aW9uc09yQ29uZGl0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zLlxuICAgICAqIEFsc28gY291bnRzIGFsbCBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGNvbmRpdGlvbnMsXG4gICAgICogYnV0IGlnbm9yZXMgcGFnaW5hdGlvbiBzZXR0aW5ncyAoZnJvbSBhbmQgdGFrZSBvcHRpb25zKS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kQW5kQ291bnQob3B0aW9uc09yQ29uZGl0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyBieSBpZHMuXG4gICAgICogT3B0aW9uYWxseSBmaW5kIG9wdGlvbnMgY2FuIGJlIGFwcGxpZWQuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kQnlJZHMgPSBmdW5jdGlvbiAoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kQnlJZHMoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LmZpbmRPbmUgPSBmdW5jdGlvbiAob3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kT25lKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBmaXJzdCBlbnRpdHkgdGhhdCBtYXRjaGVzIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kT25lT3JGYWlsID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuZmluZE9uZU9yRmFpbChvcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGEgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICogUmF3IHF1ZXJ5IGV4ZWN1dGlvbiBpcyBzdXBwb3J0ZWQgb25seSBieSByZWxhdGlvbmFsIGRhdGFiYXNlcyAoTW9uZ29EQiBpcyBub3Qgc3VwcG9ydGVkKS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlL2NvbGxlY3Rpb24gKHRydW5jYXRlcy9kcm9wcyBpdCkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNsZWFyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUVudGl0eTtcbn0oKSk7XG5leHBvcnQgeyBCYXNlRW50aXR5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VFbnRpdHkuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbW92ZU9wdGlvbnMuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogUmVwb3NpdG9yeSBpcyBzdXBwb3NlZCB0byB3b3JrIHdpdGggeW91ciBlbnRpdHkgb2JqZWN0cy4gRmluZCBlbnRpdGllcywgaW5zZXJ0LCB1cGRhdGUsIGRlbGV0ZSwgZXRjLlxuICovXG52YXIgUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBvc2l0b3J5KCkge1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmNyZWF0ZVF1ZXJ5QnVpbGRlcih0aGlzLm1ldGFkYXRhLnRhcmdldCwgYWxpYXMgfHwgdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lLCBxdWVyeVJ1bm5lciB8fCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXBvc2l0b3J5LnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBvYmplY3QgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgICAgICogSWYgdGhpcyByZXBvc2l0b3J5IG1hbmFnZXMgZW50aXR5IGZyb20gc2NoZW1hLFxuICAgICAgICAgKiB0aGVuIGl0IHJldHVybnMgYSBuYW1lIG9mIHRoYXQgc2NoZW1hIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnRpdHkgaGFzIGFuIGlkLlxuICAgICAqIElmIGVudGl0eSBjb21wb3NpdGUgY29tcG9zZSBpZHMsIGl0IHdpbGwgY2hlY2sgdGhlbSBhbGwuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuaGFzSWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaGFzSWQodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtaXhlZCBpZC5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRJZCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGluc3RhbmNlIG9yIGluc3RhbmNlcy5cbiAgICAgKiBDYW4gY29weSBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdCBpbnRvIG5ldyBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocGxhaW5FbnRpdHlMaWtlT3JQbGFpbkVudGl0eUxpa2VzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY3JlYXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBwbGFpbkVudGl0eUxpa2VPclBsYWluRW50aXR5TGlrZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIG11bHRpcGxlIGVudGl0aWVzIChvciBlbnRpdHktbGlrZSBvYmplY3RzKSBpbnRvIGEgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKG1lcmdlSW50b0VudGl0eSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBlbnRpdHlMaWtlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZW50aXR5TGlrZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMubWFuYWdlcikubWVyZ2UuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3RoaXMubWV0YWRhdGEudGFyZ2V0LCBtZXJnZUludG9FbnRpdHldLCBfX3JlYWQoZW50aXR5TGlrZXMpLCBmYWxzZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgZnJvbSB0aGUgZ2l2ZW4gcGxhaW4gamF2YXNjcmlwdCBvYmplY3QuIElmIGVudGl0eSBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZSwgdGhlblxuICAgICAqIGl0IGxvYWRzIGl0IChhbmQgZXZlcnl0aGluZyByZWxhdGVkIHRvIGl0KSwgcmVwbGFjZXMgYWxsIHZhbHVlcyB3aXRoIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBnaXZlbiBvYmplY3RcbiAgICAgKiBhbmQgcmV0dXJucyB0aGlzIG5ldyBlbnRpdHkuIFRoaXMgbmV3IGVudGl0eSBpcyBhY3R1YWxseSBhIGxvYWRlZCBmcm9tIHRoZSBkYiBlbnRpdHkgd2l0aCBhbGwgcHJvcGVydGllc1xuICAgICAqIHJlcGxhY2VkIGZyb20gdGhlIG5ldyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgZ2l2ZW4gZW50aXR5LWxpa2Ugb2JqZWN0IG11c3QgaGF2ZSBhbiBlbnRpdHkgaWQgLyBwcmltYXJ5IGtleSB0byBmaW5kIGVudGl0eSBieS5cbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBlbnRpdHkgd2l0aCBnaXZlbiBpZCB3YXMgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnByZWxvYWQgPSBmdW5jdGlvbiAoZW50aXR5TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnByZWxvYWQodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eUxpa2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2F2ZXMgb25lIG9yIG1hbnkgZ2l2ZW4gZW50aXRpZXMuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuc2F2ZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucmVtb3ZlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnNvZnRSZW1vdmUodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eU9yRW50aXRpZXMsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnMgb25lIG9yIG1hbnkgZ2l2ZW4gZW50aXRpZXMuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUucmVjb3ZlciA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucmVjb3Zlcih0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgZ2l2ZW4gZW50aXR5IGludG8gdGhlIGRhdGFiYXNlLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBJTlNFUlQgcXVlcnkuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgZW50aXR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZSwgc28gcXVlcnkgd2lsbCBmYWlsIGlmIGR1cGxpY2F0ZSBlbnRpdHkgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmluc2VydCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgZW50aXR5IHBhcnRpYWxseS4gRW50aXR5IGNhbiBiZSBmb3VuZCBieSBhIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IFVQREFURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjcml0ZXJpYSwgcGFydGlhbEVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnVwZGF0ZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIGdpdmVuIGVudGl0eSBpbnRvIHRoZSBkYXRhYmFzZSwgdW5sZXNzIGEgdW5pcXVlIGNvbnN0cmFpbnQgY29uZmxpY3RzIHRoZW4gdXBkYXRlcyB0aGUgZW50aXR5XG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCAuLi4gT04gQ09ORkxJQ1QgRE8gVVBEQVRFL09OIERVUExJQ0FURSBLRVkgVVBEQVRFIHF1ZXJ5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnVwc2VydCA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBjb25mbGljdFBhdGhzT3JPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIudXBzZXJ0KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBlbnRpdHlPckVudGl0aWVzLCBjb25mbGljdFBhdGhzT3JPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgZW50aXRpZXMgYnkgYSBnaXZlbiBjcml0ZXJpYS5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgREVMRVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZGVsZXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIHRoZSBkZWxldGUgZGF0ZSBvZiBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBTT0ZULURFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnNvZnREZWxldGUgPSBmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5zb2Z0RGVsZXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBTT0ZULURFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5yZXN0b3JlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb3VudHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgb3IgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY291bnQodGhpcy5tZXRhZGF0YS50YXJnZXQsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgb3IgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5maW5kKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICogQWxzbyBjb3VudHMgYWxsIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gY29uZGl0aW9ucyxcbiAgICAgKiBidXQgaWdub3JlcyBwYWdpbmF0aW9uIHNldHRpbmdzIChmcm9tIGFuZCB0YWtlIG9wdGlvbnMpLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZEFuZENvdW50KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIGJ5IGlkcy5cbiAgICAgKiBPcHRpb25hbGx5IGZpbmQgb3B0aW9ucyBjYW4gYmUgYXBwbGllZC5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kQnlJZHMgPSBmdW5jdGlvbiAoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZEJ5SWRzKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBpZHMsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZmlyc3QgZW50aXR5IHRoYXQgbWF0Y2hlcyBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRPbmUgPSBmdW5jdGlvbiAob3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZE9uZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgb3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kT25lT3JGYWlsID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmZpbmRPbmVPckZhaWwodGhpcy5tZXRhZGF0YS50YXJnZXQsIG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgYSByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKiBSYXcgcXVlcnkgZXhlY3V0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGJ5IHJlbGF0aW9uYWwgZGF0YWJhc2VzIChNb25nb0RCIGlzIG5vdCBzdXBwb3J0ZWQpLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucXVlcnkocXVlcnksIHBhcmFtZXRlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBnaXZlbiB0YWJsZS9jb2xsZWN0aW9uICh0cnVuY2F0ZXMvZHJvcHMgaXQpLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgdXNlcyBUUlVOQ0FURSBhbmQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaW4gdHJhbnNhY3Rpb25zIG9uIHNvbWUgcGxhdGZvcm1zLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU5NzI3MzgvOTI1MTUxXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY2xlYXIodGhpcy5tZXRhZGF0YS50YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jcmVtZW50cyBzb21lIGNvbHVtbiBieSBwcm92aWRlZCB2YWx1ZSBvZiB0aGUgZW50aXRpZXMgbWF0Y2hlZCBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmluY3JlbWVudCA9IGZ1bmN0aW9uIChjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaW5jcmVtZW50KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlY3JlbWVudHMgc29tZSBjb2x1bW4gYnkgcHJvdmlkZWQgdmFsdWUgb2YgdGhlIGVudGl0aWVzIG1hdGNoZWQgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5kZWNyZW1lbnQgPSBmdW5jdGlvbiAoY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmRlY3JlbWVudCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVwb3NpdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBSZXBvc2l0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcG9zaXRvcnkuanMubWFwXG4iLCJpbXBvcnQgeyBUcmVlUmVwb3NpdG9yeSB9IGZyb20gXCIuL1RyZWVSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IE1vbmdvUmVwb3NpdG9yeSB9IGZyb20gXCIuL01vbmdvUmVwb3NpdG9yeVwiO1xuLyoqXG4gKiBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIGRpZmZlcmVudCB0eXBlcyBvZiByZXBvc2l0b3JpZXMuXG4gKi9cbnZhciBSZXBvc2l0b3J5RmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBvc2l0b3J5RmFjdG9yeSgpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBvc2l0b3J5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnlGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAobWFuYWdlciwgbWV0YWRhdGEsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChtZXRhZGF0YS50cmVlVHlwZSkge1xuICAgICAgICAgICAgLy8gTk9URTogZHluYW1pYyBhY2Nlc3MgdG8gcHJvdGVjdGVkIHByb3BlcnRpZXMuIFdlIG5lZWQgdGhpcyB0byBwcmV2ZW50IHVud2FudGVkIHByb3BlcnRpZXMgaW4gdGhvc2UgY2xhc3NlcyB0byBiZSBleHBvc2VkLFxuICAgICAgICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIHRoZXNlIHByb3BlcnRpZXMgZm9yIGludGVybmFsIHdvcmsgb2YgdGhlIGNsYXNzXG4gICAgICAgICAgICB2YXIgcmVwb3NpdG9yeSA9IG5ldyBUcmVlUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBvc2l0b3J5LCB7XG4gICAgICAgICAgICAgICAgbWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IGR5bmFtaWMgYWNjZXNzIHRvIHByb3RlY3RlZCBwcm9wZXJ0aWVzLiBXZSBuZWVkIHRoaXMgdG8gcHJldmVudCB1bndhbnRlZCBwcm9wZXJ0aWVzIGluIHRob3NlIGNsYXNzZXMgdG8gYmUgZXhwb3NlZCxcbiAgICAgICAgICAgIC8vIGhvd2V2ZXIgd2UgbmVlZCB0aGVzZSBwcm9wZXJ0aWVzIGZvciBpbnRlcm5hbCB3b3JrIG9mIHRoZSBjbGFzc1xuICAgICAgICAgICAgdmFyIHJlcG9zaXRvcnkgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAobWFuYWdlci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IG5ldyBNb25nb1JlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBvc2l0b3J5LCB7XG4gICAgICAgICAgICAgICAgbWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFJlcG9zaXRvcnlGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IFJlcG9zaXRvcnlGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcG9zaXRvcnlGYWN0b3J5LmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TYXZlT3B0aW9ucy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1V0aWxzIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzXCI7XG4vKipcbiAqIFJlcG9zaXRvcnkgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggdHJlZXMuXG4gKlxuICogQHNlZSBSZXBvc2l0b3J5XG4gKi9cbnZhciBUcmVlUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJlZVJlcG9zaXRvcnksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJlZVJlcG9zaXRvcnkoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgY29tcGxldGUgdHJlZXMgZm9yIGFsbCByb290cyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRUcmVlcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByb290cztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZmluZFJvb3RzKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChyb290cy5tYXAoZnVuY3Rpb24gKHJvb3QpIHsgcmV0dXJuIF90aGlzLmZpbmREZXNjZW5kYW50c1RyZWUocm9vdCwgb3B0aW9ucyk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByb290c107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9vdHMgYXJlIGVudGl0aWVzIHRoYXQgaGF2ZSBubyBhbmNlc3RvcnMuIEZpbmRzIHRoZW0gYWxsLlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kUm9vdHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXNjYXBlQWxpYXMgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgdmFyIGVzY2FwZUNvbHVtbiA9IGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbik7IH07XG4gICAgICAgIHZhciBwYXJlbnRQcm9wZXJ0eU5hbWUgPSB0aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luQ29sdW1uTmFtZSh0aGlzLm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5wcm9wZXJ0eU5hbWUsIHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIpO1xuICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5T3B0aW9uc1RvVHJlZVF1ZXJ5QnVpbGRlcihxYiwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBxYlxuICAgICAgICAgICAgLndoZXJlKGVzY2FwZUFsaWFzKFwidHJlZUVudGl0eVwiKSArIFwiLlwiICsgZXNjYXBlQ29sdW1uKHBhcmVudFByb3BlcnR5TmFtZSkgKyBcIiBJUyBOVUxMXCIpXG4gICAgICAgICAgICAuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gKGRlc2NlbmRhbnRzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gYWxsIGluIGEgZmxhdCBhcnJheS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZERlc2NlbmRhbnRzID0gZnVuY3Rpb24gKGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgcWIgPSB0aGlzLmNyZWF0ZURlc2NlbmRhbnRzUXVlcnlCdWlsZGVyKFwidHJlZUVudGl0eVwiLCBcInRyZWVDbG9zdXJlXCIsIGVudGl0eSk7XG4gICAgICAgIEZpbmRPcHRpb25zVXRpbHMuYXBwbHlPcHRpb25zVG9UcmVlUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHFiLmdldE1hbnkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIChkZXNjZW5kYW50cykgb2YgdGhlIGdpdmVuIGVudGl0eS4gUmV0dXJucyB0aGVtIGluIGEgdHJlZSAtIG5lc3RlZCBpbnRvIGVhY2ggb3RoZXIuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmREZXNjZW5kYW50c1RyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxYiwgZW50aXRpZXMsIHJlbGF0aW9uTWFwcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVEZXNjZW5kYW50c1F1ZXJ5QnVpbGRlcihcInRyZWVFbnRpdHlcIiwgXCJ0cmVlQ2xvc3VyZVwiLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZ2V0UmF3QW5kRW50aXRpZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NYXBzID0gdGhpcy5jcmVhdGVSZWxhdGlvbk1hcHMoXCJ0cmVlRW50aXR5XCIsIGVudGl0aWVzLnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ2hpbGRyZW5FbnRpdHlUcmVlKGVudGl0eSwgZW50aXRpZXMuZW50aXRpZXMsIHJlbGF0aW9uTWFwcywgX19hc3NpZ24oeyBkZXB0aDogLTEgfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGVudGl0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBudW1iZXIgb2YgZGVzY2VuZGFudHMgb2YgdGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuY291bnREZXNjZW5kYW50cyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5jcmVhdGVEZXNjZW5kYW50c1F1ZXJ5QnVpbGRlcihcInRyZWVFbnRpdHlcIiwgXCJ0cmVlQ2xvc3VyZVwiLCBlbnRpdHkpXG4gICAgICAgICAgICAuZ2V0Q291bnQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZ2V0IGRlc2NlbmRhbnRzIG9mIHRoZSBlbnRpdGllcyBpbiBhIHRyZWUuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmNyZWF0ZURlc2NlbmRhbnRzUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzLCBjbG9zdXJlVGFibGVBbGlhcywgZW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGJldHRlciByZWFkYWJpbGl0eVxuICAgICAgICB2YXIgZXNjYXBlID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5tYW5hZ2VyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIikge1xuICAgICAgICAgICAgdmFyIGpvaW5Db25kaXRpb24gPSB0aGlzLm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZShjbG9zdXJlVGFibGVBbGlhcykgKyBcIi5cIiArIGVzY2FwZShjb2x1bW4ucHJvcGVydHlQYXRoKSArIFwiID0gXCIgKyBlc2NhcGUoYWxpYXMpICsgXCIuXCIgKyBlc2NhcGUoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgIHZhciB3aGVyZUNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xW2NvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY2xvc3VyZVRhYmxlQWxpYXMpICsgXCIuXCIgKyBlc2NhcGUoY29sdW1uLnByb3BlcnR5UGF0aCkgKyBcIiA9IDpcIiArIGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAuaW5uZXJKb2luKHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUudGFibGVOYW1lLCBjbG9zdXJlVGFibGVBbGlhcywgam9pbkNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAud2hlcmUod2hlcmVDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm5lc3RlZC1zZXRcIikge1xuICAgICAgICAgICAgdmFyIHdoZXJlQ29uZGl0aW9uID0gYWxpYXMgKyBcIi5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBCRVRXRUVOIFwiICtcbiAgICAgICAgICAgICAgICBcImpvaW5lZC5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBBTkQgam9pbmVkLlwiICsgdGhpcy5tZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVyc18yID0ge307XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yW3BhcmFtZXRlck5hbWVdID0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiam9pbmVkLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAuaW5uZXJKb2luKHRoaXMubWV0YWRhdGEudGFyZ2V0TmFtZSwgXCJqb2luZWRcIiwgd2hlcmVDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgLndoZXJlKGpvaW5Db25kaXRpb24sIHBhcmFtZXRlcnNfMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJtYXRlcmlhbGl6ZWQtcGF0aFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoYWxpYXMpXG4gICAgICAgICAgICAgICAgLndoZXJlKGZ1bmN0aW9uIChxYikge1xuICAgICAgICAgICAgICAgIHZhciBzdWJRdWVyeSA9IHFiLnN1YlF1ZXJ5KClcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChfdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCwgXCJwYXRoXCIpXG4gICAgICAgICAgICAgICAgICAgIC5mcm9tKF90aGlzLm1ldGFkYXRhLnRhcmdldCwgX3RoaXMubWV0YWRhdGEudGFyZ2V0TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoX3RoaXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAoZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXMgKyBcIi5cIiArIF90aGlzLm1ldGFkYXRhLm1hdGVyaWFsaXplZFBhdGhDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgTElLRSBcIiArIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiB8fCAnJSdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlhcyArIFwiLlwiICsgX3RoaXMubWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBMSUtFIENPTkNBVChcIiArIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiwgJyUnKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTdXBwb3J0ZWQgb25seSBpbiB0cmVlIGVudGl0aWVzXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcGFyZW50cyAoYW5jZXN0b3JzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gYWxsIGluIGEgZmxhdCBhcnJheS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZEFuY2VzdG9ycyA9IGZ1bmN0aW9uIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KTtcbiAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcWIuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcGFyZW50cyAoYW5jZXN0b3JzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gaW4gYSB0cmVlIC0gbmVzdGVkIGludG8gZWFjaCBvdGhlci5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZEFuY2VzdG9yc1RyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxYiwgZW50aXRpZXMsIHJlbGF0aW9uTWFwcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuYXBwbHlPcHRpb25zVG9UcmVlUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmdldFJhd0FuZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTWFwcyA9IHRoaXMuY3JlYXRlUmVsYXRpb25NYXBzKFwidHJlZUVudGl0eVwiLCBlbnRpdGllcy5yYXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFBhcmVudEVudGl0eVRyZWUoZW50aXR5LCBlbnRpdGllcy5lbnRpdGllcywgcmVsYXRpb25NYXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbnRpdHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgbnVtYmVyIG9mIGFuY2VzdG9ycyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5jb3VudEFuY2VzdG9ycyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KVxuICAgICAgICAgICAgLmdldENvdW50KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgYnVpbGRlciB1c2VkIHRvIGdldCBhbmNlc3RvcnMgb2YgdGhlIGVudGl0aWVzIGluIHRoZSB0cmVlLlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoYWxpYXMsIGNsb3N1cmVUYWJsZUFsaWFzLCBlbnRpdHkpIHtcbiAgICAgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XG4gICAgICAgIC8vIGNvbnN0IGVzY2FwZSA9IChhbGlhczogc3RyaW5nKSA9PiB0aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEudHJlZVR5cGUgPT09IFwiY2xvc3VyZS10YWJsZVwiKSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb3N1cmVUYWJsZUFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgPSBcIiArIGFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVyc18zID0ge307XG4gICAgICAgICAgICB2YXIgd2hlcmVDb25kaXRpb24gPSB0aGlzLm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18zW2NvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9zdXJlVGFibGVBbGlhcyArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKVxuICAgICAgICAgICAgICAgIC5pbm5lckpvaW4odGhpcy5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS50YWJsZU5hbWUsIGNsb3N1cmVUYWJsZUFsaWFzLCBqb2luQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgIC53aGVyZSh3aGVyZUNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0YWRhdGEudHJlZVR5cGUgPT09IFwibmVzdGVkLXNldFwiKSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IFwiam9pbmVkLlwiICsgdGhpcy5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLnByb3BlcnR5UGF0aCArIFwiIEJFVFdFRU4gXCIgK1xuICAgICAgICAgICAgICAgIGFsaWFzICsgXCIuXCIgKyB0aGlzLm1ldGFkYXRhLm5lc3RlZFNldExlZnRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgQU5EIFwiICsgYWxpYXMgKyBcIi5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4ucHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnNfNCA9IHt9O1xuICAgICAgICAgICAgdmFyIHdoZXJlQ29uZGl0aW9uID0gdGhpcy5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzRbcGFyYW1ldGVyTmFtZV0gPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJqb2luZWQuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgPSA6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKVxuICAgICAgICAgICAgICAgIC5pbm5lckpvaW4odGhpcy5tZXRhZGF0YS50YXJnZXROYW1lLCBcImpvaW5lZFwiLCBqb2luQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgIC53aGVyZSh3aGVyZUNvbmRpdGlvbiwgcGFyYW1ldGVyc180KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm1hdGVyaWFsaXplZC1wYXRoXCIpIHtcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IFNFTEVDVCAqIEZST00gY2F0ZWdvcnkgY2F0ZWdvcnkgV0hFUkUgKFNFTEVDVCBtcGF0aCBGUk9NIGBjYXRlZ29yeWAgV0hFUkUgaWQgPSAyKSBMSUtFIENPTkNBVChjYXRlZ29yeS5tcGF0aCwgJyUnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAud2hlcmUoZnVuY3Rpb24gKHFiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5ID0gcWIuc3ViUXVlcnkoKVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KF90aGlzLm1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIi5cIiArIF90aGlzLm1ldGFkYXRhLm1hdGVyaWFsaXplZFBhdGhDb2x1bW4ucHJvcGVydHlQYXRoLCBcInBhdGhcIilcbiAgICAgICAgICAgICAgICAgICAgLmZyb20oX3RoaXMubWV0YWRhdGEudGFyZ2V0LCBfdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhfdGhpcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMubWFuYWdlci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEFic3RyYWN0U3FsaXRlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJRdWVyeS5nZXRRdWVyeSgpICsgXCIgTElLRSBcIiArIGFsaWFzICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiIHx8ICclJ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiBMSUtFIENPTkNBVChcIiArIGFsaWFzICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiLCAnJScpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBvcnRlZCBvbmx5IGluIHRyZWUgZW50aXRpZXNcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNb3ZlcyBlbnRpdHkgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZW4gZ2l2ZW4gZW50aXR5LlxuICAgICAqXG4gICAgbW92ZShlbnRpdHk6IEVudGl0eSwgdG86IEVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSAqL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUmVsYXRpb25NYXBzID0gZnVuY3Rpb24gKGFsaWFzLCByYXdSZXN1bHRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiByYXdSZXN1bHRzLm1hcChmdW5jdGlvbiAocmF3UmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IF90aGlzLm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5qb2luQ29sdW1uc1swXTtcbiAgICAgICAgICAgIC8vIGZpeGVzIGlzc3VlICMyNTE4LCBkZWZhdWx0IHRvIGRhdGFiYXNlTmFtZSBwcm9wZXJ0eSB3aGVuIGdpdmVuRGF0YWJhc2VOYW1lIGlzIG5vdCBzZXRcbiAgICAgICAgICAgIHZhciBqb2luQ29sdW1uTmFtZSA9IGpvaW5Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgfHwgam9pbkNvbHVtbi5kYXRhYmFzZU5hbWU7XG4gICAgICAgICAgICB2YXIgaWQgPSByYXdSZXN1bHRbYWxpYXMgKyBcIl9cIiArIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICB2YXIgcGFyZW50SWQgPSByYXdSZXN1bHRbYWxpYXMgKyBcIl9cIiArIGpvaW5Db2x1bW5OYW1lXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUoaWQsIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogX3RoaXMubWFuYWdlci5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShwYXJlbnRJZCwgam9pbkNvbHVtbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5idWlsZENoaWxkcmVuRW50aXR5VHJlZSA9IGZ1bmN0aW9uIChlbnRpdHksIGVudGl0aWVzLCByZWxhdGlvbk1hcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNoaWxkUHJvcGVydHkgPSB0aGlzLm1ldGFkYXRhLnRyZWVDaGlsZHJlblJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIGVudGl0eVtjaGlsZFByb3BlcnR5XSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRFbnRpdHlJZCA9IHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgdmFyIGNoaWxkUmVsYXRpb25NYXBzID0gcmVsYXRpb25NYXBzLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb25NYXApIHsgcmV0dXJuIHJlbGF0aW9uTWFwLnBhcmVudElkID09PSBwYXJlbnRFbnRpdHlJZDsgfSk7XG4gICAgICAgIHZhciBjaGlsZElkcyA9IG5ldyBTZXQoY2hpbGRSZWxhdGlvbk1hcHMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbk1hcCkgeyByZXR1cm4gcmVsYXRpb25NYXAuaWQ7IH0pKTtcbiAgICAgICAgZW50aXR5W2NoaWxkUHJvcGVydHldID0gZW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIGNoaWxkSWRzLmhhcyhfdGhpcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTsgfSk7XG4gICAgICAgIGVudGl0eVtjaGlsZFByb3BlcnR5XS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgICAgX3RoaXMuYnVpbGRDaGlsZHJlbkVudGl0eVRyZWUoY2hpbGRFbnRpdHksIGVudGl0aWVzLCByZWxhdGlvbk1hcHMsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBkZXB0aDogb3B0aW9ucy5kZXB0aCAtIDEgfSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5idWlsZFBhcmVudEVudGl0eVRyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBlbnRpdGllcywgcmVsYXRpb25NYXBzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwYXJlbnRQcm9wZXJ0eSA9IHRoaXMubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgdmFyIGVudGl0eUlkID0gdGhpcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICB2YXIgcGFyZW50UmVsYXRpb25NYXAgPSByZWxhdGlvbk1hcHMuZmluZChmdW5jdGlvbiAocmVsYXRpb25NYXApIHsgcmV0dXJuIHJlbGF0aW9uTWFwLmlkID09PSBlbnRpdHlJZDsgfSk7XG4gICAgICAgIHZhciBwYXJlbnRFbnRpdHkgPSBlbnRpdGllcy5maW5kKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50UmVsYXRpb25NYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGVudGl0eSkgPT09IHBhcmVudFJlbGF0aW9uTWFwLnBhcmVudElkO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBhcmVudEVudGl0eSkge1xuICAgICAgICAgICAgZW50aXR5W3BhcmVudFByb3BlcnR5XSA9IHBhcmVudEVudGl0eTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQYXJlbnRFbnRpdHlUcmVlKGVudGl0eVtwYXJlbnRQcm9wZXJ0eV0sIGVudGl0aWVzLCByZWxhdGlvbk1hcHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJlZVJlcG9zaXRvcnk7XG59KFJlcG9zaXRvcnkpKTtcbmV4cG9ydCB7IFRyZWVSZXBvc2l0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSBcIi4vdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IFRhYmxlRm9yZWlnbktleSB9IGZyb20gXCIuL3RhYmxlL1RhYmxlRm9yZWlnbktleVwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuL3RhYmxlL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiLi91dGlsL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBUYWJsZVVuaXF1ZSB9IGZyb20gXCIuL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBUYWJsZUNoZWNrIH0gZnJvbSBcIi4vdGFibGUvVGFibGVDaGVja1wiO1xuaW1wb3J0IHsgVGFibGVFeGNsdXNpb24gfSBmcm9tIFwiLi90YWJsZS9UYWJsZUV4Y2x1c2lvblwiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgVmlld1V0aWxzIH0gZnJvbSBcIi4vdXRpbC9WaWV3VXRpbHNcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG4vKipcbiAqIENyZWF0ZXMgY29tcGxldGUgdGFibGVzIHNjaGVtYXMgaW4gdGhlIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBlbnRpdHkgbWV0YWRhdGFzLlxuICpcbiAqIFN0ZXBzIGhvdyBzY2hlbWEgaXMgYmVpbmcgYnVpbHQ6XG4gKiAxLiBsb2FkIGxpc3Qgb2YgYWxsIHRhYmxlcyB3aXRoIGNvbXBsZXRlIGNvbHVtbiBhbmQga2V5cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYlxuICogMi4gZHJvcCBhbGwgKG9sZCkgZm9yZWlnbiBrZXlzIHRoYXQgZXhpc3QgaW4gdGhlIHRhYmxlLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1ldGFkYXRhXG4gKiAzLiBjcmVhdGUgbmV3IHRhYmxlcyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYiwgYnV0IGV4aXN0IGluIHRoZSBtZXRhZGF0YVxuICogNC4gZHJvcCBhbGwgY29sdW1ucyBleGlzdCAobGVmdCBvbGQpIGluIHRoZSBkYiB0YWJsZSwgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtZXRhZGF0YVxuICogNS4gYWRkIGNvbHVtbnMgZnJvbSBtZXRhZGF0YSB3aGljaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgdGFibGVcbiAqIDYuIHVwZGF0ZSBhbGwgZXhpc3QgY29sdW1ucyB3aGljaCBtZXRhZGF0YSBoYXMgY2hhbmdlZFxuICogNy4gdXBkYXRlIHByaW1hcnkga2V5cyAtIHVwZGF0ZSBvbGQgYW5kIGNyZWF0ZSBuZXcgcHJpbWFyeSBrZXkgZnJvbSBjaGFuZ2VkIGNvbHVtbnNcbiAqIDguIGNyZWF0ZSBmb3JlaWduIGtleXMgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRhYmxlIHlldFxuICogOS4gY3JlYXRlIGluZGljZXMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LCBhbmQgZHJvcHMgaW5kaWNlcyB3aGljaCBleGlzdCBpbiB0aGUgZGIsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWV0YWRhdGEgYW55bW9yZVxuICovXG52YXIgUmRibXNTY2hlbWFCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZGJtc1NjaGVtYUJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb21wbGV0ZSBzY2hlbWFzIGZvciB0aGUgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhcy5cbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNVc2luZ1RyYW5zYWN0aW9ucywgdGFibGVQYXRocywgZXJyb3JfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2UgfHwgdGhpcy5jdXJyZW50RGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNpbmdUcmFuc2FjdGlvbnMgPSAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLm1pZ3JhdGlvbnNUcmFuc2FjdGlvbk1vZGUgIT09IFwibm9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVc2luZ1RyYW5zYWN0aW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCAxMSwgMTcsIDE5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1ldGFkYXRhVGFibGVJZk5lY2Vzc2FyeSh0aGlzLnF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aHMgPSB0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcy5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZ2V0VGFibGVzKHRhYmxlUGF0aHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5nZXRWaWV3cyhbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVTY2hlbWFTeW5jT3BlcmF0aW9uc0luUHJvcGVyT3JkZXIoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUuc3luY2hyb25pemUodGhpcy5xdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVc2luZ1RyYW5zYWN0aW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEyLCAxNSwgLCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nVHJhbnNhY3Rpb25zKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIHZpZXdzLCBjcmVhdGUgdGhlIHR5cGVvcm1fbWV0YWRhdGEgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU1ldGFkYXRhVGFibGVJZk5lY2Vzc2FyeSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnZpZXdFbnRpdHlUb1N5bmNNZXRhZGF0YXMubGVuZ3RoID4gMCB8fCAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNHZW5lcmF0ZWRDb2x1bW5zU3VwcG9ydGVkKSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVUeXBlb3JtTWV0YWRhdGFUYWJsZShxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgc3FsIHF1ZXJpZXMgdG8gYmUgZXhlY3V0ZWQgYnkgc2NoZW1hIGJ1aWxkZXIuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZVBhdGhzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAsIDcsIDldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aHMgPSB0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcy5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZ2V0VGFibGVzKHRhYmxlUGF0aHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5nZXRWaWV3cyhbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmVuYWJsZVNxbE1lbW9yeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlU2NoZW1hU3luY09wZXJhdGlvbnNJblByb3Blck9yZGVyKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLnN5bmNocm9uaXplKHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLnF1ZXJ5UnVubmVyLmdldE1lbW9yeVNxbCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGltcG9ydGFudCB0byBkaXNhYmxlIHRoaXMgbW9kZSBkZXNwaXRlIHRoZSBmYWN0IHdlIGFyZSByZWxlYXNlIHF1ZXJ5IGJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgZXhpc3QgZHJpdmVycyB3aGljaCByZXVzZSBzYW1lIHF1ZXJ5IHJ1bm5lci4gQWxzbyBpdHMgaW1wb3J0YW50IHRvIGRpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNxbCBtZW1vcnkgYWZ0ZXIgY2FsbCBvZiBnZXRNZW1vcnlTcWwoKSBtZXRob2QgYmVjYXVzZSBsYXN0IG9uZSBmbHVzaGVzIHNxbCBtZW1vcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmRpc2FibGVTcWxNZW1vcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUsIFwiZW50aXR5VG9TeW5jTWV0YWRhdGFzXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIG9ubHkgZW50aXRpZXMgdGhhdCBzaG91bGQgYmUgc3luY2VkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEuc3luY2hyb25pemUgJiYgbWV0YWRhdGEudGFibGVUeXBlICE9PSBcImVudGl0eS1jaGlsZFwiICYmIG1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJ2aWV3XCI7IH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUsIFwidmlld0VudGl0eVRvU3luY01ldGFkYXRhc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIG9ubHkgZW50aXRpZXMgdGhhdCBzaG91bGQgYmUgc3luY2VkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFibGVUeXBlID09PSBcInZpZXdcIiAmJiBtZXRhZGF0YS5zeW5jaHJvbml6ZTsgfSlcbiAgICAgICAgICAgICAgICAvLyBzb3J0IHZpZXdzIGluIGNyZWF0aW9uIG9yZGVyIGJ5IGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgIC5zb3J0KFZpZXdVdGlscy52aWV3TWV0YWRhdGFDbXApO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc2NoZW1hIHN5bmMgb3BlcmF0aW9ucyBpbiBhIHByb3BlciBvcmRlci5cbiAgICAgKiBPcmRlciBvZiBvcGVyYXRpb25zIG1hdHRlciBoZXJlLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZVNjaGVtYVN5bmNPcGVyYXRpb25zSW5Qcm9wZXJPcmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BPbGRWaWV3cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wT2xkRm9yZWlnbktleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcE9sZEluZGljZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcE9sZENoZWNrcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wT2xkRXhjbHVzaW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wQ29tcG9zaXRlVW5pcXVlQ29uc3RyYWludHMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMucmVuYW1lVGFibGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlbmFtZUNvbHVtbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMucmVuYW1lVGFibGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU5ld1RhYmxlcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wUmVtb3ZlZENvbHVtbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYWRkTmV3Q29sdW1ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlUHJpbWFyeUtleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnVwZGF0ZUV4aXN0Q29sdW1ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTmV3SW5kaWNlcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTmV3Q2hlY2tzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVOZXdFeGNsdXNpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVDb21wb3NpdGVVbmlxdWVDb25zdHJhaW50cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlRm9yZWlnbktleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVZpZXdzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZ2V0VGFibGVQYXRoID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShwYXJzZWQudGFibGVOYW1lLCBwYXJzZWQuc2NoZW1hIHx8IHRoaXMuY3VycmVudFNjaGVtYSwgcGFyc2VkLmRhdGFiYXNlIHx8IHRoaXMuY3VycmVudERhdGFiYXNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCAob2xkKSBmb3JlaWduIGtleXMgdGhhdCBleGlzdCBpbiB0aGUgdGFibGVzLCBidXQgZG8gbm90IGV4aXN0IGluIHRoZSBlbnRpdHkgbWV0YWRhdGEuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkRm9yZWlnbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xLCB0aGlzXzEsIF9hLCBfYiwgbWV0YWRhdGEsIGVfMV8xO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMSA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgdGFibGVGb3JlaWduS2V5c1RvRHJvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMS5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRm9yZWlnbktleXNUb0Ryb3AgPSB0YWJsZS5mb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFGSyA9IG1ldGFkYXRhLmZvcmVpZ25LZXlzLmZpbmQoZnVuY3Rpb24gKG1ldGFkYXRhRm9yZWlnbktleSkgeyByZXR1cm4gKCh0YWJsZUZvcmVpZ25LZXkubmFtZSA9PT0gbWV0YWRhdGFGb3JlaWduS2V5Lm5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlRm9yZWlnbktleSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YUZvcmVpZ25LZXkucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhKSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtZXRhZGF0YUZLXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YWRhdGFGSy5vbkRlbGV0ZSAmJiBtZXRhZGF0YUZLLm9uRGVsZXRlICE9PSB0YWJsZUZvcmVpZ25LZXkub25EZWxldGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YWRhdGFGSy5vblVwZGF0ZSAmJiBtZXRhZGF0YUZLLm9uVXBkYXRlICE9PSB0YWJsZUZvcmVpZ25LZXkub25VcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUZvcmVpZ25LZXlzVG9Ecm9wLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIGZvcmVpZ24ga2V5cyBvZiBcIiArIHRhYmxlLm5hbWUgKyBcIjogXCIgKyB0YWJsZUZvcmVpZ25LZXlzVG9Ecm9wLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXkubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGZvcmVpZ24ga2V5cyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMS5xdWVyeVJ1bm5lci5kcm9wRm9yZWlnbktleXModGFibGUsIHRhYmxlRm9yZWlnbktleXNUb0Ryb3ApXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGZvcmVpZ24ga2V5cyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzEobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWUgdGFibGVzXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5yZW5hbWVUYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIGNvbHVtbnMuXG4gICAgICogV29ya3MgaWYgb25seSBvbmUgY29sdW1uIHBlciB0YWJsZSB3YXMgY2hhbmdlZC5cbiAgICAgKiBDaGFuZ2VzIG9ubHkgY29sdW1uIG5hbWUuIElmIHNvbWV0aGluZyBiZXNpZGVzIG5hbWUgd2FzIGNoYW5nZWQsIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUucmVuYW1lQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzIsIHRoaXNfMiwgX2EsIF9iLCBtZXRhZGF0YSwgZV8yXzE7XG4gICAgICAgICAgICB2YXIgZV8yLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8yID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCByZW5hbWVkTWV0YWRhdGFDb2x1bW5zLCByZW5hbWVkVGFibGVDb2x1bW5zLCByZW5hbWVkQ29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpc18yLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbHVtbnMubGVuZ3RoICE9PSB0YWJsZS5jb2x1bW5zLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lZE1ldGFkYXRhQ29sdW1ucyA9IG1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKHRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uLmRhdGFiYXNlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRhYmxlQ29sdW1uLnR5cGUgPT09IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRhYmxlQ29sdW1uLmlzTnVsbGFibGUgPT09IGNvbHVtbi5pc051bGxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFibGVDb2x1bW4uaXNVbmlxdWUgPT09IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZUlzVW5pcXVlKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVkTWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCByZW5hbWVkTWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZWRUYWJsZUNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAodGFibGVDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWUgPT09IHRhYmxlQ29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKGNvbHVtbikgPT09IHRhYmxlQ29sdW1uLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uaXNOdWxsYWJsZSA9PT0gdGFibGVDb2x1bW4uaXNOdWxsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZUlzVW5pcXVlKGNvbHVtbikgPT09IHRhYmxlQ29sdW1uLmlzVW5pcXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lZFRhYmxlQ29sdW1ucy5sZW5ndGggPT09IDAgfHwgcmVuYW1lZFRhYmxlQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVkQ29sdW1uID0gcmVuYW1lZFRhYmxlQ29sdW1uc1swXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZWRDb2x1bW4ubmFtZSA9IHJlbmFtZWRNZXRhZGF0YUNvbHVtbnNbMF0uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMi5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcInJlbmFtaW5nIGNvbHVtbiBcXFwiXCIgKyByZW5hbWVkVGFibGVDb2x1bW5zWzBdLm5hbWUgKyBcIlxcXCIgaW4gdG8gXFxcIlwiICsgcmVuYW1lZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMi5xdWVyeVJ1bm5lci5yZW5hbWVDb2x1bW4odGFibGUsIHJlbmFtZWRUYWJsZUNvbHVtbnNbMF0sIHJlbmFtZWRDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18yID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8yKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkSW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzMsIHRoaXNfMywgX2EsIF9iLCBtZXRhZGF0YSwgZV8zXzE7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8zID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBkcm9wUXVlcmllcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMy5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BRdWVyaWVzID0gdGFibGUuaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleE1ldGFkYXRhID0gbWV0YWRhdGEuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZSA9PT0gdGFibGVJbmRleC5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLnN5bmNocm9uaXplID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhNZXRhZGF0YS5pc1VuaXF1ZSAhPT0gdGFibGVJbmRleC5pc1VuaXF1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLmlzU3BhdGlhbCAhPT0gdGFibGVJbmRleC5pc1NwYXRpYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNGdWxsVGV4dENvbHVtblR5cGVTdXBwb3J0ZWQoKSAmJiBpbmRleE1ldGFkYXRhLmlzRnVsbHRleHQgIT09IHRhYmxlSW5kZXguaXNGdWxsdGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLmNvbHVtbnMubGVuZ3RoICE9PSB0YWJsZUluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaW5kZXhNZXRhZGF0YS5jb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIHRhYmxlSW5kZXguY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW4uZGF0YWJhc2VOYW1lKSAhPT0gLTE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhYmxlSW5kZXgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImRyb3BwaW5nIGFuIGluZGV4OiBcXFwiXCIgKyB0YWJsZUluZGV4Lm5hbWUgKyBcIlxcXCIgZnJvbSB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLmRyb3BJbmRleCh0YWJsZSwgdGFibGVJbmRleCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChkcm9wUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzMobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzNfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmRyb3BPbGRDaGVja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF80LCB0aGlzXzQsIF9hLCBfYiwgbWV0YWRhdGEsIGVfNF8xO1xuICAgICAgICAgICAgdmFyIGVfNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXlzcWwgZG9lcyBub3Qgc3VwcG9ydCBjaGVjayBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF80ID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBvbGRDaGVja3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzQucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDaGVja3MgPSB0YWJsZS5jaGVja3MuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZUNoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGNoZWNrTWV0YWRhdGEpIHsgcmV0dXJuIGNoZWNrTWV0YWRhdGEubmFtZSA9PT0gdGFibGVDaGVjay5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ2hlY2tzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc180LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIGNoZWNrIGNvbnN0cmFpbnQ6IFwiICsgb2xkQ2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHsgcmV0dXJuIFwiXFxcIlwiICsgY2hlY2submFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBmcm9tIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc180LnF1ZXJ5UnVubmVyLmRyb3BDaGVja0NvbnN0cmFpbnRzKHRhYmxlLCBvbGRDaGVja3MpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc180ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF80KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV80XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29tcG9zaXRlVW5pcXVlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF81LCB0aGlzXzUsIF9hLCBfYiwgbWV0YWRhdGEsIGVfNV8xO1xuICAgICAgICAgICAgdmFyIGVfNSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfNSA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgY29tcG9zaXRlVW5pcXVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfNS5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVVuaXF1ZXMgPSB0YWJsZS51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodGFibGVVbmlxdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlVW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA+IDEgJiYgIW1ldGFkYXRhLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlTWV0YWRhdGEpIHsgcmV0dXJuIHVuaXF1ZU1ldGFkYXRhLm5hbWUgPT09IHRhYmxlVW5pcXVlLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc181LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIHVuaXF1ZSBjb25zdHJhaW50OiBcIiArIGNvbXBvc2l0ZVVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpICsgXCIgZnJvbSB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfNS5xdWVyeVJ1bm5lci5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIGNvbXBvc2l0ZVVuaXF1ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc181ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF81KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkRXhjbHVzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzYsIHRoaXNfNiwgX2EsIF9iLCBtZXRhZGF0YSwgZV82XzE7XG4gICAgICAgICAgICB2YXIgZV82LCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IFBvc3RncmVTUUwgc3VwcG9ydHMgZXhjbHVzaW9uIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzYgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG9sZEV4Y2x1c2lvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzYucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFeGNsdXNpb25zID0gdGFibGUuZXhjbHVzaW9ucy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlRXhjbHVzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuZXhjbHVzaW9ucy5maW5kKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gZXhjbHVzaW9uTWV0YWRhdGEubmFtZSA9PT0gdGFibGVFeGNsdXNpb24ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEV4Y2x1c2lvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzYuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJkcm9wcGluZyBvbGQgZXhjbHVzaW9uIGNvbnN0cmFpbnQ6IFwiICsgb2xkRXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gXCJcXFwiXCIgKyBleGNsdXNpb24ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBmcm9tIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc182LnF1ZXJ5UnVubmVyLmRyb3BFeGNsdXNpb25Db25zdHJhaW50cyh0YWJsZSwgb2xkRXhjbHVzaW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzYobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzZfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNikgdGhyb3cgZV82LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYmxlcyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgeWV0LlxuICAgICAqIE5ldyB0YWJsZXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBmb3JlaWduIGFuZCBwcmltYXJ5IGtleXMuXG4gICAgICogUHJpbWFyeSBrZXkgb25seSBjYW4gYmUgY3JlYXRlZCBpbiBjb25jbHVzaW9uIHdpdGggYXV0byBnZW5lcmF0ZWQgY29sdW1uLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3VGFibGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfNywgdGhpc183LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzdfMTtcbiAgICAgICAgICAgIHZhciBlXzcsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzcgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RUYWJsZSwgdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RUYWJsZSA9IHRoaXNfNy5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdFRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzcuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJjcmVhdGluZyBhIG5ldyB0YWJsZTogXCIgKyB0aGlzXzcuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBUYWJsZS5jcmVhdGUobWV0YWRhdGEsIHRoaXNfNy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc183LnF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRhYmxlLCBmYWxzZSwgZmFsc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc183LnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5wdXNoKHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzcgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzcobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzdfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNyA9IHsgZXJyb3I6IGVfN18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfOCwgdGhpc184LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzhfMTtcbiAgICAgICAgICAgIHZhciBlXzgsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzggPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RWaWV3LCB2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0VmlldyA9IHRoaXNfOC5xdWVyeVJ1bm5lci5sb2FkZWRWaWV3cy5maW5kKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3RXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3LmV4cHJlc3Npb24gPT09IFwic3RyaW5nXCIgPyB2aWV3LmV4cHJlc3Npb24udHJpbSgpIDogdmlldy5leHByZXNzaW9uKF90aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YUV4cHJlc3Npb24gPSB0eXBlb2YgbWV0YWRhdGEuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IG1ldGFkYXRhLmV4cHJlc3Npb24udHJpbSgpIDogbWV0YWRhdGEuZXhwcmVzc2lvbihfdGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHZpZXcpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpICYmIHZpZXdFeHByZXNzaW9uID09PSBtZXRhZGF0YUV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0VmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiY3JlYXRpbmcgYSBuZXcgdmlldzogXCIgKyB0aGlzXzguZ2V0VGFibGVQYXRoKG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IFZpZXcuY3JlYXRlKG1ldGFkYXRhLCB0aGlzXzguY29ubmVjdGlvbi5kcml2ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfOC5xdWVyeVJ1bm5lci5jcmVhdGVWaWV3KHZpZXcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184LnF1ZXJ5UnVubmVyLmxvYWRlZFZpZXdzLnB1c2godmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMudmlld0VudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfOChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOF8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV84ID0geyBlcnJvcjogZV84XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV84KSB0aHJvdyBlXzguZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZHJvcE9sZFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZHJvcHBlZFZpZXdzLCB2aWV3RW50aXR5VG9TeW5jTWV0YWRhdGFzLCB2aWV3VG9NZXRhZGF0YSwgX2xvb3BfOSwgX2EsIF9iLCB2aWV3LCBfYywgX2QsIHZpZXcsIHZpZXdNZXRhZGF0YSwgdmlld0V4cHJlc3Npb24sIG1ldGFkYXRhRXhwcmVzc2lvbiwgdmlld0RlcGVuZGVuY3lDaGFpbiwgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcywgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xLCBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSwgdmlldywgZV85XzE7XG4gICAgICAgICAgICB2YXIgZV8xMCwgX2UsIGVfMTEsIF9mLCBlXzksIF9nO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9oLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0VudGl0eVRvU3luY01ldGFkYXRhcyA9IHRoaXMudmlld0VudGl0eVRvU3luY01ldGFkYXRhcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUb01ldGFkYXRhID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfOSA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdNZXRhZGF0YSA9IHZpZXdFbnRpdHlUb1N5bmNNZXRhZGF0YXMuZmluZChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh2aWV3KSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUb01ldGFkYXRhLnNldCh2aWV3LCB2aWV3TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFZpZXdzKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3ID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzkodmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTBfMSkgeyBlXzEwID0geyBlcnJvcjogZV8xMF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2UgPSBfYS5yZXR1cm4pKSBfZS5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEwKSB0aHJvdyBlXzEwLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGhlciBhbGwgY2hhbmdlZCB2aWV3LCB0aGF0IG5lZWQgYSBkcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfYyA9IF9fdmFsdWVzKHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVmlld3MpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld01ldGFkYXRhID0gdmlld1RvTWV0YWRhdGEuZ2V0KHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0V4cHJlc3Npb24gPSB0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiID8gdmlldy5leHByZXNzaW9uLnRyaW0oKSA6IHZpZXcuZXhwcmVzc2lvbih0aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3TWV0YWRhdGEuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHZpZXdNZXRhZGF0YS5leHByZXNzaW9uLnRyaW0oKSA6IHZpZXdNZXRhZGF0YS5leHByZXNzaW9uKHRoaXMuY29ubmVjdGlvbikuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdFeHByZXNzaW9uID09PSBtZXRhZGF0YUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImRyb3BwaW5nIGFuIG9sZCB2aWV3OiBcIiArIHZpZXcubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgdmlldyB0byBiZSBkcm9wcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzExXzEpIHsgZV8xMSA9IHsgZXJyb3I6IGVfMTFfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9mID0gX2MucmV0dXJuKSkgX2YuY2FsbChfYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMSkgdGhyb3cgZV8xMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0RlcGVuZGVuY3lDaGFpbiA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMTIsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlldyBtZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3TWV0YWRhdGEgPSB2aWV3VG9NZXRhZGF0YS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdXaXRoRGVwZW5kZW5jaWVzID0gW3ZpZXddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIG1ldGFkYXRhIGlzIGtub3duIGZvciB0aGUgdmlldywgc2ltcGx5IHJldHVybiB0aGUgdmlldyBpdHNlbGZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlld1dpdGhEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwga25vd24gdmlld3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh2aWV3VG9NZXRhZGF0YS5lbnRyaWVzKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQoX2MudmFsdWUsIDIpLCBjdXJyZW50VmlldyA9IF9kWzBdLCBjdXJyZW50TWV0YWRhdGEgPSBfZFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzZWxmIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWV3ID09PSB2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudGx5IGl0ZXJhdGVkIHZpZXcgZGVwZW5kcyBvbiB0aGUgcGFzc2VkIGluIHZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWV0YWRhdGEuZGVwZW5kc09uICYmIChjdXJyZW50TWV0YWRhdGEuZGVwZW5kc09uLmhhcyh2aWV3TWV0YWRhdGEudGFyZ2V0KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZXRhZGF0YS5kZXBlbmRzT24uaGFzKHZpZXdNZXRhZGF0YS5uYW1lKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY3VycmVudGx5IGl0ZXJhdGUgdmlldyBhbmQgaXRzIGRlcGVuZGVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3V2l0aERlcGVuZGVuY2llcyA9IHZpZXdXaXRoRGVwZW5kZW5jaWVzLmNvbmNhdCh2aWV3RGVwZW5kZW5jeUNoYWluKGN1cnJlbnRWaWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTJfMSkgeyBlXzEyID0geyBlcnJvcjogZV8xMl8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFsbCBjb2xsZWN0ZWQgdmlld3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlld1dpdGhEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBkcm9wcGVkIHZpZXdzLCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkVmlld3MubWFwKGZ1bmN0aW9uICh2aWV3KSB7IHJldHVybiB2aWV3RGVwZW5kZW5jeUNoYWluKHZpZXcpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsYXR0ZW5lZCB0byBzaW5nbGUgQXJyYXkgKCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBmbGF0TWFwLCBvbmNlIHN1cHBvcnRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhbGwsIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsLmNvbmNhdChzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvcnQgdGhlIHZpZXdzIHRvIGJlIGRyb3BwZWQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaWV3VXRpbHMudmlld01ldGFkYXRhQ21wKHZpZXdUb01ldGFkYXRhLmdldChhKSwgdmlld1RvTWV0YWRhdGEuZ2V0KGIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBvcmRlciB0byBnZXQgZHJvcCBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMSA9IF9fdmFsdWVzKGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXMpLCBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSA9IGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5kcm9wVmlldyh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xXzEgPSBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOV8xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV85ID0geyBlcnJvcjogZV85XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSAmJiAhZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xXzEuZG9uZSAmJiAoX2cgPSBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEucmV0dXJuKSkgX2cuY2FsbChkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5sb2FkZWRWaWV3cyA9IHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVmlld3MuZmlsdGVyKGZ1bmN0aW9uICh2aWV3KSB7IHJldHVybiAhZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcy5oYXModmlldyk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCBjb2x1bW5zIHRoYXQgZXhpc3QgaW4gdGhlIHRhYmxlLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1ldGFkYXRhIChsZWZ0IG9sZCkuXG4gICAgICogV2UgZHJvcCB0aGVpciBrZXlzIHRvbywgc2luY2UgaXQgc2hvdWxkIGJlIHNhZmUuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wUmVtb3ZlZENvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xMCwgdGhpc185LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzEzXzE7XG4gICAgICAgICAgICB2YXIgZV8xMywgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTAgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIGRyb3BwZWRUYWJsZUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzkucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkVGFibGVDb2x1bW5zID0gdGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW5NZXRhZGF0YSkgeyByZXR1cm4gY29sdW1uTWV0YWRhdGEuZGF0YWJhc2VOYW1lID09PSB0YWJsZUNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcHBlZFRhYmxlQ29sdW1ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfOS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImNvbHVtbnMgZHJvcHBlZCBpbiBcIiArIHRhYmxlLm5hbWUgKyBcIjogXCIgKyBkcm9wcGVkVGFibGVDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzkucXVlcnlSdW5uZXIuZHJvcENvbHVtbnModGFibGUsIGRyb3BwZWRUYWJsZUNvbHVtbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc185ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xMChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTNfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTMgPSB7IGVycm9yOiBlXzEzXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMykgdGhyb3cgZV8xMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBjb2x1bW5zIGZyb20gbWV0YWRhdGEgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRhYmxlLlxuICAgICAqIENvbHVtbnMgYXJlIGNyZWF0ZWQgd2l0aG91dCBrZXlzLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuYWRkTmV3Q29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzExLCB0aGlzXzEwLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzE0XzE7XG4gICAgICAgICAgICB2YXIgZV8xNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTEgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0NvbHVtbk1ldGFkYXRhcywgbmV3VGFibGVDb2x1bW5PcHRpb25zLCBuZXdUYWJsZUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzEwLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uTWV0YWRhdGFzID0gbWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uICh0YWJsZUNvbHVtbikgeyByZXR1cm4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uTWV0YWRhdGEuZGF0YWJhc2VOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uTWV0YWRhdGFzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGVDb2x1bW5PcHRpb25zID0gdGhpc18xMC5tZXRhZGF0YUNvbHVtbnNUb1RhYmxlQ29sdW1uT3B0aW9ucyhuZXdDb2x1bW5NZXRhZGF0YXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlQ29sdW1ucyA9IG5ld1RhYmxlQ29sdW1uT3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikgeyByZXR1cm4gbmV3IFRhYmxlQ29sdW1uKG9wdGlvbik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUYWJsZUNvbHVtbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEwLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwibmV3IGNvbHVtbnMgYWRkZWQ6IFwiICsgbmV3Q29sdW1uTWV0YWRhdGFzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTAucXVlcnlSdW5uZXIuYWRkQ29sdW1ucyh0YWJsZSwgbmV3VGFibGVDb2x1bW5zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTAgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzExKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNF8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNCA9IHsgZXJyb3I6IGVfMTRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE0KSB0aHJvdyBlXzE0LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVQcmltYXJ5S2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzEyLCB0aGlzXzExLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzE1XzE7XG4gICAgICAgICAgICB2YXIgZV8xNSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTIgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIHByaW1hcnlNZXRhZGF0YUNvbHVtbnMsIHByaW1hcnlUYWJsZUNvbHVtbnMsIGNoYW5nZWRQcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTEucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zID0gbWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhYmxlQ29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHByaW1hcnlUYWJsZUNvbHVtbnMubGVuZ3RoICE9PSBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLmxlbmd0aCAmJiBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA+IDEpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJpbWFyeUNvbHVtbnMgPSBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeU1ldGFkYXRhQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVDb2x1bW4oVGFibGVVdGlscy5jcmVhdGVUYWJsZUNvbHVtbk9wdGlvbnMocHJpbWFyeU1ldGFkYXRhQ29sdW1uLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTEucXVlcnlSdW5uZXIudXBkYXRlUHJpbWFyeUtleXModGFibGUsIGNoYW5nZWRQcmltYXJ5Q29sdW1ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTEgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzEyKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNV8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNSA9IHsgZXJyb3I6IGVfMTVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE1KSB0aHJvdyBlXzE1LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYWxsIGV4aXN0IGNvbHVtbnMgd2hpY2ggbWV0YWRhdGEgaGFzIGNoYW5nZWQuXG4gICAgICogU3RpbGwgZG9uJ3QgY3JlYXRlIGtleXMuIEFsc28gd2UgZG9uJ3QgdG91Y2ggZm9yZWlnbiBrZXlzIG9mIHRoZSBjaGFuZ2VkIGNvbHVtbnMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVFeGlzdENvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xMywgdGhpc18xMiwgX2EsIF9iLCBtZXRhZGF0YSwgZV8xNl8xO1xuICAgICAgICAgICAgdmFyIGVfMTYsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEzID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBjaGFuZ2VkQ29sdW1ucywgY2hhbmdlZENvbHVtbnNfMSwgY2hhbmdlZENvbHVtbnNfMV8xLCBjaGFuZ2VkQ29sdW1uLCBlXzE3XzEsIGNoYW5nZWRDb2x1bW5zXzIsIGNoYW5nZWRDb2x1bW5zXzJfMSwgY2hhbmdlZENvbHVtbiwgZV8xOF8xLCBjaGFuZ2VkQ29sdW1uc18zLCBjaGFuZ2VkQ29sdW1uc18zXzEsIGNoYW5nZWRDb2x1bW4sIGVfMTlfMSwgbmV3QW5kT2xkVGFibGVDb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzE3LCBfZSwgZV8xOCwgX2YsIGVfMTksIF9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfaC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpc18xMi5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zID0gdGhpc18xMi5jb25uZWN0aW9uLmRyaXZlci5maW5kQ2hhbmdlZENvbHVtbnModGFibGUuY29sdW1ucywgbWV0YWRhdGEuY29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zXzEgPSAoZV8xNyA9IHZvaWQgMCwgX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpKSwgY2hhbmdlZENvbHVtbnNfMV8xID0gY2hhbmdlZENvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNoYW5nZWRDb2x1bW5zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtblJlZmVyZW5jZWRGb3JlaWduS2V5cyh0aGlzXzEyLmdldFRhYmxlUGF0aChtZXRhZGF0YSksIGNoYW5nZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uc18xXzEgPSBjaGFuZ2VkQ29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xN18xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMTcgPSB7IGVycm9yOiBlXzE3XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZENvbHVtbnNfMV8xICYmICFjaGFuZ2VkQ29sdW1uc18xXzEuZG9uZSAmJiAoX2UgPSBjaGFuZ2VkQ29sdW1uc18xLnJldHVybikpIF9lLmNhbGwoY2hhbmdlZENvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xNykgdGhyb3cgZV8xNy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFs4LCAxMywgMTQsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMiA9IChlXzE4ID0gdm9pZCAwLCBfX3ZhbHVlcyhjaGFuZ2VkQ29sdW1ucykpLCBjaGFuZ2VkQ29sdW1uc18yXzEgPSBjaGFuZ2VkQ29sdW1uc18yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfMl8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtbkNvbXBvc2l0ZUluZGljZXModGhpc18xMi5nZXRUYWJsZVBhdGgobWV0YWRhdGEpLCBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMl8xID0gY2hhbmdlZENvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMThfMSA9IF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzE4ID0geyBlcnJvcjogZV8xOF8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZENvbHVtbnNfMl8xICYmICFjaGFuZ2VkQ29sdW1uc18yXzEuZG9uZSAmJiAoX2YgPSBjaGFuZ2VkQ29sdW1uc18yLnJldHVybikpIF9mLmNhbGwoY2hhbmdlZENvbHVtbnNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xOCkgdGhyb3cgZV8xOC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghISh0aGlzXzEyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpc18xMi5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFsxNiwgMjEsIDIyLCAyM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zXzMgPSAoZV8xOSA9IHZvaWQgMCwgX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpKSwgY2hhbmdlZENvbHVtbnNfM18xID0gY2hhbmdlZENvbHVtbnNfMy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxNztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfM18xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfM18xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtbkNvbXBvc2l0ZVVuaXF1ZXModGhpc18xMi5nZXRUYWJsZVBhdGgobWV0YWRhdGEpLCBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfM18xID0gY2hhbmdlZENvbHVtbnNfMy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMjNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzE5XzEgPSBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xOSA9IHsgZXJyb3I6IGVfMTlfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDIzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zXzNfMSAmJiAhY2hhbmdlZENvbHVtbnNfM18xLmRvbmUgJiYgKF9nID0gY2hhbmdlZENvbHVtbnNfMy5yZXR1cm4pKSBfZy5jYWxsKGNoYW5nZWRDb2x1bW5zXzMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTkpIHRocm93IGVfMTkuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbmRPbGRUYWJsZUNvbHVtbnMgPSBjaGFuZ2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNoYW5nZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFRhYmxlQ29sdW1uID0gdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lID09PSBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUYWJsZUNvbHVtbk9wdGlvbnMgPSBUYWJsZVV0aWxzLmNyZWF0ZVRhYmxlQ29sdW1uT3B0aW9ucyhjaGFuZ2VkQ29sdW1uLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUYWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihuZXdUYWJsZUNvbHVtbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uOiBvbGRUYWJsZUNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbjogbmV3VGFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QW5kT2xkVGFibGVDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xMi5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImNvbHVtbnMgY2hhbmdlZCBpbiBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiLiB1cGRhdGluZzogXCIgKyBjaGFuZ2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEyLnF1ZXJ5UnVubmVyLmNoYW5nZUNvbHVtbnModGFibGUsIG5ld0FuZE9sZFRhYmxlQ29sdW1ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xMiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMTMobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzE2XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzE2ID0geyBlcnJvcjogZV8xNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTYpIHRocm93IGVfMTYuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29tcG9zaXRlIGluZGljZXMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3SW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE0LCB0aGlzXzEzLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzIwXzE7XG4gICAgICAgICAgICB2YXIgZV8yMCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTQgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0luZGljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzEzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5kaWNlcyA9IG1ldGFkYXRhLmluZGljZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaW5kZXhNZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmluZGljZXMuZmluZChmdW5jdGlvbiAodGFibGVJbmRleCkgeyByZXR1cm4gdGFibGVJbmRleC5uYW1lID09PSBpbmRleE1ldGFkYXRhLm5hbWU7IH0pICYmIGluZGV4TWV0YWRhdGEuc3luY2hyb25pemUgPT09IHRydWU7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4TWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlSW5kZXguY3JlYXRlKGluZGV4TWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kaWNlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJhZGRpbmcgbmV3IGluZGljZXMgXCIgKyBuZXdJbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTMucXVlcnlSdW5uZXIuY3JlYXRlSW5kaWNlcyh0YWJsZSwgbmV3SW5kaWNlcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xNChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjBfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjAgPSB7IGVycm9yOiBlXzIwXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yMCkgdGhyb3cgZV8yMC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVOZXdDaGVja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xNSwgdGhpc18xNCwgX2EsIF9iLCBtZXRhZGF0YSwgZV8yMV8xO1xuICAgICAgICAgICAgdmFyIGVfMjEsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE15c3FsIGRvZXMgbm90IHN1cHBvcnQgY2hlY2sgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTUgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0NoZWNrcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTQucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGVja3MgPSBtZXRhZGF0YS5jaGVja3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY2hlY2tNZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmNoZWNrcy5maW5kKGZ1bmN0aW9uICh0YWJsZUNoZWNrKSB7IHJldHVybiB0YWJsZUNoZWNrLm5hbWUgPT09IGNoZWNrTWV0YWRhdGEubmFtZTsgfSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNoZWNrTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlQ2hlY2suY3JlYXRlKGNoZWNrTWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2hlY2tzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNC5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImFkZGluZyBuZXcgY2hlY2sgY29uc3RyYWludHM6IFwiICsgbmV3Q2hlY2tzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTQucXVlcnlSdW5uZXIuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyh0YWJsZSwgbmV3Q2hlY2tzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzE1KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMV8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMSA9IHsgZXJyb3I6IGVfMjFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIxKSB0aHJvdyBlXzIxLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNvbXBvc2l0ZSB1bmlxdWVzIHdoaWNoIGFyZSBtaXNzaW5nIGluIGRiIHlldC5cbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUNvbXBvc2l0ZVVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMTYsIHRoaXNfMTUsIF9hLCBfYiwgbWV0YWRhdGEsIGVfMjJfMTtcbiAgICAgICAgICAgIHZhciBlXzIyLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xNiA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgY29tcG9zaXRlVW5pcXVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTUucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVVbmlxdWVzID0gbWV0YWRhdGEudW5pcXVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh1bmlxdWVNZXRhZGF0YSkgeyByZXR1cm4gdW5pcXVlTWV0YWRhdGEuY29sdW1ucy5sZW5ndGggPiAxICYmICF0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlVW5pcXVlKSB7IHJldHVybiB0YWJsZVVuaXF1ZS5uYW1lID09PSB1bmlxdWVNZXRhZGF0YS5uYW1lOyB9KTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodW5pcXVlTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlVW5pcXVlLmNyZWF0ZSh1bmlxdWVNZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImFkZGluZyBuZXcgdW5pcXVlIGNvbnN0cmFpbnRzOiBcIiArIGNvbXBvc2l0ZVVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpICsgXCIgaW4gdGFibGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzE1LnF1ZXJ5UnVubmVyLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlLCBjb21wb3NpdGVVbmlxdWVzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzE2KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMl8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMiA9IHsgZXJyb3I6IGVfMjJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIyKSB0aHJvdyBlXzIyLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGV4Y2x1c2lvbnMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3RXhjbHVzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE3LCB0aGlzXzE2LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzIzXzE7XG4gICAgICAgICAgICB2YXIgZV8yMywgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBQb3N0Z3JlU1FMIHN1cHBvcnRzIGV4Y2x1c2lvbiBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xNyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgbmV3RXhjbHVzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTYucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeGNsdXNpb25zID0gbWV0YWRhdGEuZXhjbHVzaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmV4Y2x1c2lvbnMuZmluZChmdW5jdGlvbiAodGFibGVFeGNsdXNpb24pIHsgcmV0dXJuIHRhYmxlRXhjbHVzaW9uLm5hbWUgPT09IGV4Y2x1c2lvbk1ldGFkYXRhLm5hbWU7IH0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gVGFibGVFeGNsdXNpb24uY3JlYXRlKGV4Y2x1c2lvbk1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0V4Y2x1c2lvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE2LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiYWRkaW5nIG5ldyBleGNsdXNpb24gY29uc3RyYWludHM6IFwiICsgbmV3RXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gXCJcXFwiXCIgKyBleGNsdXNpb24ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTYucXVlcnlSdW5uZXIuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludHModGFibGUsIG5ld0V4Y2x1c2lvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMTcobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIzXzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIzID0geyBlcnJvcjogZV8yM18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMjMpIHRocm93IGVfMjMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZm9yZWlnbiBrZXlzIHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIHRoZSB0YWJsZSB5ZXQuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVGb3JlaWduS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE4LCB0aGlzXzE3LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzI0XzE7XG4gICAgICAgICAgICB2YXIgZV8yNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTggPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0tleXMsIGRiRm9yZWlnbktleXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzE3LnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3S2V5cyA9IG1ldGFkYXRhLmZvcmVpZ25LZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWJsZS5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChkYkZvcmVpZ25LZXkpIHsgcmV0dXJuICgoZGJGb3JlaWduS2V5Lm5hbWUgPT09IGZvcmVpZ25LZXkubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfdGhpcy5nZXRUYWJsZVBhdGgoZGJGb3JlaWduS2V5KSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhKSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3S2V5cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiRm9yZWlnbktleXMgPSBuZXdLZXlzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleU1ldGFkYXRhKSB7IHJldHVybiBUYWJsZUZvcmVpZ25LZXkuY3JlYXRlKGZvcmVpZ25LZXlNZXRhZGF0YSwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE3LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiY3JlYXRpbmcgYSBmb3JlaWduIGtleXM6IFwiICsgbmV3S2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5Lm5hbWU7IH0pLmpvaW4oXCIsIFwiKSArIFwiIG9uIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc18xNy5xdWVyeVJ1bm5lci5jcmVhdGVGb3JlaWduS2V5cyh0YWJsZSwgZGJGb3JlaWduS2V5cyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE3ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xOChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjRfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjQgPSB7IGVycm9yOiBlXzI0XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yNCkgdGhyb3cgZV8yNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYWxsIGZvcmVpZ24ga2V5cyB3aGVyZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIHRhYmxlIGlzIGJlaW5nIHVzZWQuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29sdW1uUmVmZXJlbmNlZEZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlUGF0aCwgY29sdW1uTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIHRhYmxlc1dpdGhGSywgY29sdW1uRm9yZWlnbktleSwgY2xvbmVkVGFibGUsIF9sb29wXzE5LCBfYSwgX2IsIGxvYWRlZFRhYmxlLCB0YWJsZXNXaXRoRktfMSwgdGFibGVzV2l0aEZLXzFfMSwgdGFibGVXaXRoRkssIGVfMjVfMTtcbiAgICAgICAgICAgIHZhciBlXzI2LCBfYywgZV8yNSwgX2Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gdGFibGVQYXRoOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzV2l0aEZLID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JlaWduS2V5ID0gdGFibGUuZm9yZWlnbktleXMuZmluZChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gZm9yZWlnbktleS5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5mb3JlaWduS2V5cyA9IFtjb2x1bW5Gb3JlaWduS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRksucHVzaChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlRm9yZWlnbktleShjb2x1bW5Gb3JlaWduS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzE5ID0gZnVuY3Rpb24gKGxvYWRlZFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGVuZEZvcmVpZ25LZXlzID0gbG9hZGVkVGFibGUuZm9yZWlnbktleXMuZmlsdGVyKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSkgPT09IHRhYmxlUGF0aCAmJiBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kRm9yZWlnbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkVGFibGUgPSBsb2FkZWRUYWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5mb3JlaWduS2V5cyA9IGRlcGVuZEZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRksucHVzaChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZEZvcmVpZ25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGRlcGVuZEZvcmVpZ25LZXkpIHsgcmV0dXJuIGxvYWRlZFRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZGVwZW5kRm9yZWlnbktleSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcyksIF9iID0gX2EubmV4dCgpOyAhX2IuZG9uZTsgX2IgPSBfYS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkVGFibGUgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTkobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzI2XzEpIHsgZV8yNiA9IHsgZXJyb3I6IGVfMjZfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yNikgdGhyb3cgZV8yNi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVzV2l0aEZLLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRktfMSA9IF9fdmFsdWVzKHRhYmxlc1dpdGhGSyksIHRhYmxlc1dpdGhGS18xXzEgPSB0YWJsZXNXaXRoRktfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRhYmxlc1dpdGhGS18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVdpdGhGSyA9IHRhYmxlc1dpdGhGS18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgcmVsYXRlZCBmb3JlaWduIGtleXMgb2YgXCIgKyB0YWJsZVdpdGhGSy5uYW1lICsgXCI6IFwiICsgdGFibGVXaXRoRksuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5Lm5hbWU7IH0pLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLmRyb3BGb3JlaWduS2V5cyh0YWJsZVdpdGhGSywgdGFibGVXaXRoRksuZm9yZWlnbktleXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRktfMV8xID0gdGFibGVzV2l0aEZLXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjVfMSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjUgPSB7IGVycm9yOiBlXzI1XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZXNXaXRoRktfMV8xICYmICF0YWJsZXNXaXRoRktfMV8xLmRvbmUgJiYgKF9kID0gdGFibGVzV2l0aEZLXzEucmV0dXJuKSkgX2QuY2FsbCh0YWJsZXNXaXRoRktfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMjUpIHRocm93IGVfMjUuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCBjb21wb3NpdGUgaW5kaWNlcywgcmVsYXRlZCB0byBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29sdW1uQ29tcG9zaXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZVBhdGgsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCByZWxhdGVkSW5kaWNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSB0YWJsZVBhdGg7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkSW5kaWNlcyA9IHRhYmxlLmluZGljZXMuZmlsdGVyKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXguY29sdW1uTmFtZXMubGVuZ3RoID4gMSAmJiBpbmRleC5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRlZEluZGljZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJkcm9wcGluZyByZWxhdGVkIGluZGljZXMgb2YgXFxcIlwiICsgdGFibGVQYXRoICsgXCJcXFwiLlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCI6IFwiICsgcmVsYXRlZEluZGljZXMubWFwKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZHJvcEluZGljZXModGFibGUsIHJlbGF0ZWRJbmRpY2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbGwgY29tcG9zaXRlIHVuaXF1ZXMsIHJlbGF0ZWQgdG8gZ2l2ZW4gY29sdW1uLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZHJvcENvbHVtbkNvbXBvc2l0ZVVuaXF1ZXMgPSBmdW5jdGlvbiAodGFibGVQYXRoLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgcmVsYXRlZFVuaXF1ZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gdGFibGVQYXRoOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFVuaXF1ZXMgPSB0YWJsZS51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID4gMSAmJiB1bmlxdWUuY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW5OYW1lKSAhPT0gLTE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgcmVsYXRlZCB1bmlxdWUgY29uc3RyYWludHMgb2YgXFxcIlwiICsgdGFibGVQYXRoICsgXCJcXFwiLlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCI6IFwiICsgcmVsYXRlZFVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIHVuaXF1ZS5uYW1lOyB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIHJlbGF0ZWRVbmlxdWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGNvbHVtbiBtZXRhZGF0YXMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5tZXRhZGF0YUNvbHVtbnNUb1RhYmxlQ29sdW1uT3B0aW9ucyA9IGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zKGNvbHVtbk1ldGFkYXRhLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcik7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0eXBlb3JtIHNlcnZpY2UgdGFibGUgZm9yIHN0b3JpbmcgdXNlciBkZWZpbmVkIFZpZXdzLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVHlwZW9ybU1ldGFkYXRhVGFibGUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYSwgZGF0YWJhc2UsIHR5cGVvcm1NZXRhZGF0YVRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gdGhpcy5jdXJyZW50U2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLmN1cnJlbnREYXRhYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvcm1NZXRhZGF0YVRhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShcInR5cGVvcm1fbWV0YWRhdGFcIiwgc2NoZW1hLCBkYXRhYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jcmVhdGVUYWJsZShuZXcgVGFibGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlb3JtTWV0YWRhdGFUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1ldGFkYXRhVHlwZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImRhdGFiYXNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFEYXRhYmFzZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFTY2hlbWEgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdWxsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFUYWJsZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1ldGFkYXRhTmFtZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5tZXRhZGF0YVZhbHVlIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJkYm1zU2NoZW1hQnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZGJtc1NjaGVtYUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmRibXNTY2hlbWFCdWlsZGVyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUNoZWNrT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVDb2x1bW5PcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUV4Y2x1c2lvbk9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlRm9yZWlnbktleU9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlSW5kZXhPcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZU9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlVW5pcXVlT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Vmlld09wdGlvbnMuanMubWFwXG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi9UYWJsZUNvbHVtblwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlRm9yZWlnbktleSB9IGZyb20gXCIuL1RhYmxlRm9yZWlnbktleVwiO1xuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4vVGFibGVVbmlxdWVcIjtcbmltcG9ydCB7IFRhYmxlQ2hlY2sgfSBmcm9tIFwiLi9UYWJsZUNoZWNrXCI7XG5pbXBvcnQgeyBUYWJsZUV4Y2x1c2lvbiB9IGZyb20gXCIuL1RhYmxlRXhjbHVzaW9uXCI7XG4vKipcbiAqIFRhYmxlIGluIHRoZSBkYXRhYmFzZSByZXByZXNlbnRlZCBpbiB0aGlzIGNsYXNzLlxuICovXG52YXIgVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFRhYmxlKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGluZGljZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGZvcmVpZ24ga2V5cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9yZWlnbktleXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoZWNrcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGNsdXNpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGFibGUgd2FzIGp1c3QgY3JlYXRlZC5cbiAgICAgICAgICogVGhpcyBpcyBuZWVkZWQsIGZvciBleGFtcGxlIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2tpcCBwcmltYXJ5IGtleXMgY3JlYXRpb25cbiAgICAgICAgICogZm9yIG5ldyB0YWJsZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmp1c3RDcmVhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gb3B0aW9ucy5kYXRhYmFzZTtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gbmV3IFRhYmxlQ29sdW1uKGNvbHVtbik7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5kaWNlcylcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljZXMgPSBvcHRpb25zLmluZGljZXMubWFwKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gbmV3IFRhYmxlSW5kZXgoaW5kZXgpOyB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmVpZ25LZXlzKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleXMgPSBvcHRpb25zLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZm9yZWlnbktleSksIHsgcmVmZXJlbmNlZERhdGFiYXNlOiAoZm9yZWlnbktleSA9PT0gbnVsbCB8fCBmb3JlaWduS2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JlaWduS2V5LnJlZmVyZW5jZWREYXRhYmFzZSkgfHwgb3B0aW9ucy5kYXRhYmFzZSwgcmVmZXJlbmNlZFNjaGVtYTogKGZvcmVpZ25LZXkgPT09IG51bGwgfHwgZm9yZWlnbktleSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9yZWlnbktleS5yZWZlcmVuY2VkU2NoZW1hKSB8fCBvcHRpb25zLnNjaGVtYSB9KSk7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudW5pcXVlcylcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZXMgPSBvcHRpb25zLnVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIG5ldyBUYWJsZVVuaXF1ZSh1bmlxdWUpOyB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNoZWNrcylcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrcyA9IG9wdGlvbnMuY2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHsgcmV0dXJuIG5ldyBUYWJsZUNoZWNrKGNoZWNrKTsgfSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVzaW9ucyA9IG9wdGlvbnMuZXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gbmV3IFRhYmxlRXhjbHVzaW9uKGV4Y2x1c2lvbik7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanVzdENyZWF0ZWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0aGlzLmp1c3RDcmVhdGVkID0gb3B0aW9ucy5qdXN0Q3JlYXRlZDtcbiAgICAgICAgICAgIHRoaXMuZW5naW5lID0gb3B0aW9ucy5lbmdpbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRhYmxlLnByb3RvdHlwZSwgXCJwcmltYXJ5Q29sdW1uc1wiLCB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gQWNjZXNzb3JzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhpcyB0YWJsZSB0byBhIG5ldyB0YWJsZSB3aXRoIGFsbCBwcm9wZXJ0aWVzIGNsb25lZC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRhdGFiYXNlLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uY2xvbmUoKTsgfSksXG4gICAgICAgICAgICBpbmRpY2VzOiB0aGlzLmluZGljZXMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgZm9yZWlnbktleXM6IHRoaXMuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgdW5pcXVlczogdGhpcy51bmlxdWVzLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludC5jbG9uZSgpOyB9KSxcbiAgICAgICAgICAgIGNoZWNrczogdGhpcy5jaGVja3MubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgZXhjbHVzaW9uczogdGhpcy5leGNsdXNpb25zLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludC5jbG9uZSgpOyB9KSxcbiAgICAgICAgICAgIGp1c3RDcmVhdGVkOiB0aGlzLmp1c3RDcmVhdGVkLFxuICAgICAgICAgICAgZW5naW5lOiB0aGlzLmVuZ2luZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgY29sdW1uIGFuZCBjcmVhdGVzIGl0cyBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkQ29sdW1uID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGNvbHVtbiBhbmQgaXRzIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVDb2x1bW4gPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHZhciBmb3VuZENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGZvdW5kQ29sdW1uKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZSh0aGlzLmNvbHVtbnMuaW5kZXhPZihmb3VuZENvbHVtbiksIDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gdW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICBpZiAodW5pcXVlQ29sdW1uKVxuICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbi5pc1VuaXF1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVtb3ZlZFVuaXF1ZSkge1xuICAgICAgICB2YXIgZm91bmRVbmlxdWUgPSB0aGlzLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUubmFtZSA9PT0gcmVtb3ZlZFVuaXF1ZS5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGZvdW5kVW5pcXVlKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXF1ZXMuc3BsaWNlKHRoaXMudW5pcXVlcy5pbmRleE9mKGZvdW5kVW5pcXVlKSwgMSk7XG4gICAgICAgICAgICBpZiAoZm91bmRVbmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaXF1ZUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lID09PSBmb3VuZFVuaXF1ZS5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXF1ZUNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29sdW1uLmlzVW5pcXVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICB0aGlzLmNoZWNrcy5wdXNoKGNoZWNrQ29uc3RyYWludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZUNoZWNrQ29uc3RyYWludCA9IGZ1bmN0aW9uIChyZW1vdmVkQ2hlY2spIHtcbiAgICAgICAgdmFyIGZvdW5kQ2hlY2sgPSB0aGlzLmNoZWNrcy5maW5kKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gY2hlY2submFtZSA9PT0gcmVtb3ZlZENoZWNrLm5hbWU7IH0pO1xuICAgICAgICBpZiAoZm91bmRDaGVjaykge1xuICAgICAgICAgICAgdGhpcy5jaGVja3Muc3BsaWNlKHRoaXMuY2hlY2tzLmluZGV4T2YoZm91bmRDaGVjayksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGV4Y2x1c2lvbiBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5hZGRFeGNsdXNpb25Db25zdHJhaW50ID0gZnVuY3Rpb24gKGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5leGNsdXNpb25zLnB1c2goZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGV4Y2x1c2lvbiBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVFeGNsdXNpb25Db25zdHJhaW50ID0gZnVuY3Rpb24gKHJlbW92ZWRFeGNsdXNpb24pIHtcbiAgICAgICAgdmFyIGZvdW5kRXhjbHVzaW9uID0gdGhpcy5leGNsdXNpb25zLmZpbmQoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gZXhjbHVzaW9uLm5hbWUgPT09IHJlbW92ZWRFeGNsdXNpb24ubmFtZTsgfSk7XG4gICAgICAgIGlmIChmb3VuZEV4Y2x1c2lvbikge1xuICAgICAgICAgICAgdGhpcy5leGNsdXNpb25zLnNwbGljZSh0aGlzLmV4Y2x1c2lvbnMuaW5kZXhPZihmb3VuZEV4Y2x1c2lvbiksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGZvcmVpZ24ga2V5cy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkRm9yZWlnbktleSA9IGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgIHRoaXMuZm9yZWlnbktleXMucHVzaChmb3JlaWduS2V5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZm9yZWlnbiBrZXkuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAocmVtb3ZlZEZvcmVpZ25LZXkpIHtcbiAgICAgICAgdmFyIGZrID0gdGhpcy5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5Lm5hbWUgPT09IHJlbW92ZWRGb3JlaWduS2V5Lm5hbWU7IH0pO1xuICAgICAgICBpZiAoZmspXG4gICAgICAgICAgICB0aGlzLmZvcmVpZ25LZXlzLnNwbGljZSh0aGlzLmZvcmVpZ25LZXlzLmluZGV4T2YoZmspLCAxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgaW5kZXguXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLmFkZEluZGV4ID0gZnVuY3Rpb24gKGluZGV4LCBpc015c3FsKSB7XG4gICAgICAgIGlmIChpc015c3FsID09PSB2b2lkIDApIHsgaXNNeXNxbCA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuaW5kaWNlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgLy8gaW4gTXlzcWwgdW5pcXVlIGluZGljZXMgYW5kIHVuaXF1ZSBjb25zdHJhaW50cyBhcmUgdGhlIHNhbWUgdGhpbmdcbiAgICAgICAgLy8gaWYgaW5kZXggaXMgdW5pcXVlIGFuZCBoYXZlIG9ubHkgb25lIGNvbHVtbiwgd2UgbWFyayB0aGlzIGNvbHVtbiBhcyB1bmlxdWVcbiAgICAgICAgaWYgKGluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBpbmRleC5pc1VuaXF1ZSAmJiBpc015c3FsKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gaW5kZXguY29sdW1uTmFtZXNbMF07IH0pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbilcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNVbmlxdWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGluZGV4LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVJbmRleCA9IGZ1bmN0aW9uICh0YWJsZUluZGV4LCBpc015c3FsKSB7XG4gICAgICAgIGlmIChpc015c3FsID09PSB2b2lkIDApIHsgaXNNeXNxbCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZSA9PT0gdGFibGVJbmRleC5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmluZGljZXMuc3BsaWNlKHRoaXMuaW5kaWNlcy5pbmRleE9mKGluZGV4KSwgMSk7XG4gICAgICAgICAgICAvLyBpbiBNeXNxbCB1bmlxdWUgaW5kaWNlcyBhbmQgdW5pcXVlIGNvbnN0cmFpbnRzIGFyZSB0aGUgc2FtZSB0aGluZ1xuICAgICAgICAgICAgLy8gaWYgaW5kZXggaXMgdW5pcXVlIGFuZCBoYXZlIG9ubHkgb25lIGNvbHVtbiwgd2UgbW92ZSBgdW5pcXVlYCBhdHRyaWJ1dGUgZnJvbSBpdHMgY29sdW1uXG4gICAgICAgICAgICBpZiAoaW5kZXguY29sdW1uTmFtZXMubGVuZ3RoID09PSAxICYmIGluZGV4LmlzVW5pcXVlICYmIGlzTXlzcWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uXzEgPSB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBpbmRleC5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbl8xKVxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5fMS5pc1VuaXF1ZSA9IHRoaXMuaW5kaWNlcy5zb21lKGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIGluZC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgaW5kLmNvbHVtbk5hbWVzWzBdID09PSBjb2x1bW5fMS5uYW1lICYmICEhaW5kZXguaXNVbmlxdWU7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gbmFtZTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb2x1bW4gaW5kaWNlcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkluZGljZXMgPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZXMuZmlsdGVyKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuICEhaW5kZXguY29sdW1uTmFtZXMuZmluZChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gY29sdW1uTmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGNvbHVtbiBmb3JlaWduIGtleXMuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLmZpbmRDb2x1bW5Gb3JlaWduS2V5cyA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleXMuZmlsdGVyKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gISFmb3JlaWduS2V5LmNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb2x1bW4gdW5pcXVlcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtblVuaXF1ZXMgPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuaXF1ZXMuZmlsdGVyKGZ1bmN0aW9uICh1bmlxdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXVuaXF1ZS5jb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgY29sdW1uIGNoZWNrcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkNoZWNrcyA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tzLmZpbHRlcihmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiAhIWNoZWNrLmNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0YWJsZSBmcm9tIGEgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqL1xuICAgIFRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlID09PSBkcml2ZXIuZGF0YWJhc2UgPyB1bmRlZmluZWQgOiBlbnRpdHlNZXRhZGF0YS5kYXRhYmFzZTtcbiAgICAgICAgdmFyIHNjaGVtYSA9IGVudGl0eU1ldGFkYXRhLnNjaGVtYSA9PT0gZHJpdmVyLm9wdGlvbnMuc2NoZW1hID8gdW5kZWZpbmVkIDogZW50aXR5TWV0YWRhdGEuc2NoZW1hO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGRhdGFiYXNlOiBlbnRpdHlNZXRhZGF0YS5kYXRhYmFzZSxcbiAgICAgICAgICAgIHNjaGVtYTogZW50aXR5TWV0YWRhdGEuc2NoZW1hLFxuICAgICAgICAgICAgbmFtZTogZHJpdmVyLmJ1aWxkVGFibGVOYW1lKGVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgc2NoZW1hLCBkYXRhYmFzZSksXG4gICAgICAgICAgICBlbmdpbmU6IGVudGl0eU1ldGFkYXRhLmVuZ2luZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGVudGl0eU1ldGFkYXRhLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbjsgfSlcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zKGNvbHVtbiwgZHJpdmVyKTsgfSksXG4gICAgICAgICAgICBpbmRpY2VzOiBlbnRpdHlNZXRhZGF0YS5pbmRpY2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGluZGV4LnN5bmNocm9uaXplID09PSB0cnVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBUYWJsZUluZGV4LmNyZWF0ZShpbmRleCk7IH0pLFxuICAgICAgICAgICAgdW5pcXVlczogZW50aXR5TWV0YWRhdGEudW5pcXVlcy5tYXAoZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gVGFibGVVbmlxdWUuY3JlYXRlKHVuaXF1ZSk7IH0pLFxuICAgICAgICAgICAgY2hlY2tzOiBlbnRpdHlNZXRhZGF0YS5jaGVja3MubWFwKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gVGFibGVDaGVjay5jcmVhdGUoY2hlY2spOyB9KSxcbiAgICAgICAgICAgIGV4Y2x1c2lvbnM6IGVudGl0eU1ldGFkYXRhLmV4Y2x1c2lvbnMubWFwKGZ1bmN0aW9uIChleGNsdXNpb24pIHsgcmV0dXJuIFRhYmxlRXhjbHVzaW9uLmNyZWF0ZShleGNsdXNpb24pOyB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZShvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZTtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBEYXRhYmFzZSdzIHRhYmxlIGNoZWNrIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUNoZWNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBUYWJsZUNoZWNrKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiB0aGF0IGNvbnRhaW5zIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gb3B0aW9ucy5jb2x1bW5OYW1lcztcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gb3B0aW9ucy5leHByZXNzaW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb3B5IG9mIHRoaXMgY29uc3RyYWludCB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlQ2hlY2sucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2hlY2soe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IHRoaXMuY29sdW1uTmFtZXMgPyBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5jb2x1bW5OYW1lcyksIGZhbHNlKSA6IFtdLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNoZWNrcyBmcm9tIHRoZSBjaGVjayBtZXRhZGF0YSBvYmplY3QuXG4gICAgICovXG4gICAgVGFibGVDaGVjay5jcmVhdGUgPSBmdW5jdGlvbiAoY2hlY2tNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2hlY2soe1xuICAgICAgICAgICAgbmFtZTogY2hlY2tNZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogY2hlY2tNZXRhZGF0YS5leHByZXNzaW9uXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlQ2hlY2s7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVDaGVjayB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUNoZWNrLmpzLm1hcFxuIiwiLyoqXG4gKiBUYWJsZSdzIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIHJlcHJlc2VudGVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUNvbHVtbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVDb2x1bW4ob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBpcyBOVUxMLCBvciBpcyBOT1QgTlVMTCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgYXV0by1nZW5lcmF0ZWQgc2VxdWVuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzR2VuZXJhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBoYXMgdW5pcXVlIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VuaXF1ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBzdG9yZXMgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiB0eXBlJ3MgbGVuZ3RoLiBVc2VkIG9ubHkgb24gc29tZSBjb2x1bW4gdHlwZXMuXG4gICAgICAgICAqIEZvciBleGFtcGxlIHR5cGUgPSBcInN0cmluZ1wiIGFuZCBsZW5ndGggPSBcIjEwMFwiIG1lYW5zIHRoYXQgT1JNIHdpbGwgY3JlYXRlIGEgY29sdW1uIHdpdGggdHlwZSB2YXJjaGFyKDEwMCkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFpFUk9GSUxMIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqIElmIHlvdSBzcGVjaWZ5IFpFUk9GSUxMIGZvciBhIG51bWVyaWMgY29sdW1uLCBNeVNRTCBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIFVOU0lHTkVEIGF0dHJpYnV0ZSB0byB0aGUgY29sdW1uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnplcm9maWxsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFVOU0lHTkVEIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuc2lnbmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgXCJcIjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggfHwgXCJcIjtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5jaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgICAgICAgICAgdGhpcy5jb2xsYXRpb24gPSBvcHRpb25zLmNvbGxhdGlvbjtcbiAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5wcmVjaXNpb247XG4gICAgICAgICAgICB0aGlzLnNjYWxlID0gb3B0aW9ucy5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuemVyb2ZpbGwgPSBvcHRpb25zLnplcm9maWxsIHx8IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy51bnNpZ25lZCA9IHRoaXMuemVyb2ZpbGwgPyB0cnVlIDogKG9wdGlvbnMudW5zaWduZWQgfHwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZSA9IG9wdGlvbnMub25VcGRhdGU7XG4gICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmlzTnVsbGFibGUgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzR2VuZXJhdGVkID0gb3B0aW9ucy5pc0dlbmVyYXRlZCB8fCBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGlvblN0cmF0ZWd5ID0gb3B0aW9ucy5nZW5lcmF0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IG9wdGlvbnMuaXNQcmltYXJ5IHx8IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1VuaXF1ZSA9IG9wdGlvbnMuaXNVbmlxdWUgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSBvcHRpb25zLmlzQXJyYXkgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmVudW0gPSBvcHRpb25zLmVudW07XG4gICAgICAgICAgICB0aGlzLmVudW1OYW1lID0gb3B0aW9ucy5lbnVtTmFtZTtcbiAgICAgICAgICAgIHRoaXMuYXNFeHByZXNzaW9uID0gb3B0aW9ucy5hc0V4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFR5cGUgPSBvcHRpb25zLmdlbmVyYXRlZFR5cGU7XG4gICAgICAgICAgICB0aGlzLnNwYXRpYWxGZWF0dXJlVHlwZSA9IG9wdGlvbnMuc3BhdGlhbEZlYXR1cmVUeXBlO1xuICAgICAgICAgICAgdGhpcy5zcmlkID0gb3B0aW9ucy5zcmlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhpcyBjb2x1bW4gdG8gYSBuZXcgY29sdW1uIHdpdGggZXhhY3Qgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoaXMgY29sdW1uIGhhcy5cbiAgICAgKi9cbiAgICBUYWJsZUNvbHVtbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb2x1bW4oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgY2hhcnNldDogdGhpcy5jaGFyc2V0LFxuICAgICAgICAgICAgY29sbGF0aW9uOiB0aGlzLmNvbGxhdGlvbixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdGhpcy5wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZSxcbiAgICAgICAgICAgIHplcm9maWxsOiB0aGlzLnplcm9maWxsLFxuICAgICAgICAgICAgdW5zaWduZWQ6IHRoaXMudW5zaWduZWQsXG4gICAgICAgICAgICBlbnVtOiB0aGlzLmVudW0sXG4gICAgICAgICAgICBlbnVtTmFtZTogdGhpcy5lbnVtTmFtZSxcbiAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogdGhpcy5hc0V4cHJlc3Npb24sXG4gICAgICAgICAgICBnZW5lcmF0ZWRUeXBlOiB0aGlzLmdlbmVyYXRlZFR5cGUsXG4gICAgICAgICAgICBkZWZhdWx0OiB0aGlzLmRlZmF1bHQsXG4gICAgICAgICAgICBvblVwZGF0ZTogdGhpcy5vblVwZGF0ZSxcbiAgICAgICAgICAgIGlzTnVsbGFibGU6IHRoaXMuaXNOdWxsYWJsZSxcbiAgICAgICAgICAgIGlzR2VuZXJhdGVkOiB0aGlzLmlzR2VuZXJhdGVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvblN0cmF0ZWd5OiB0aGlzLmdlbmVyYXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogdGhpcy5pc1ByaW1hcnksXG4gICAgICAgICAgICBpc1VuaXF1ZTogdGhpcy5pc1VuaXF1ZSxcbiAgICAgICAgICAgIGlzQXJyYXk6IHRoaXMuaXNBcnJheSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudCxcbiAgICAgICAgICAgIHNwYXRpYWxGZWF0dXJlVHlwZTogdGhpcy5zcGF0aWFsRmVhdHVyZVR5cGUsXG4gICAgICAgICAgICBzcmlkOiB0aGlzLnNyaWRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDb2x1bW47XG59KCkpO1xuZXhwb3J0IHsgVGFibGVDb2x1bW4gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVDb2x1bW4uanMubWFwXG4iLCIvKipcbiAqIERhdGFiYXNlJ3MgdGFibGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUV4Y2x1c2lvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVFeGNsdXNpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG9wdGlvbnMuZXhwcmVzc2lvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiB0aGlzIGNvbnN0cmFpbnQgd2l0aCBleGFjdGx5IHNhbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBUYWJsZUV4Y2x1c2lvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVFeGNsdXNpb24oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGV4Y2x1c2lvbnMgZnJvbSB0aGUgZXhjbHVzaW9uIG1ldGFkYXRhIG9iamVjdC5cbiAgICAgKi9cbiAgICBUYWJsZUV4Y2x1c2lvbi5jcmVhdGUgPSBmdW5jdGlvbiAoZXhjbHVzaW9uTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUV4Y2x1c2lvbih7XG4gICAgICAgICAgICBuYW1lOiBleGNsdXNpb25NZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhjbHVzaW9uTWV0YWRhdGEuZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUV4Y2x1c2lvbjtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZUV4Y2x1c2lvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUV4Y2x1c2lvbi5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBGb3JlaWduIGtleSBmcm9tIHRoZSBkYXRhYmFzZSBzdG9yZWQgaW4gdGhpcyBjbGFzcy5cbiAqL1xudmFyIFRhYmxlRm9yZWlnbktleSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVGb3JlaWduS2V5KG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiBuYW1lcyB3aGljaCBpbmNsdWRlZCBieSB0aGlzIGZvcmVpZ24ga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1uIG5hbWVzIHdoaWNoIGluY2x1ZGVkIGJ5IHRoaXMgZm9yZWlnbiBrZXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBvcHRpb25zLmNvbHVtbk5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbk5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWREYXRhYmFzZSA9IG9wdGlvbnMucmVmZXJlbmNlZERhdGFiYXNlO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRTY2hlbWEgPSBvcHRpb25zLnJlZmVyZW5jZWRTY2hlbWE7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSA9IG9wdGlvbnMucmVmZXJlbmNlZFRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy5vbkRlbGV0ZSA9IG9wdGlvbnMub25EZWxldGU7XG4gICAgICAgIHRoaXMub25VcGRhdGUgPSBvcHRpb25zLm9uVXBkYXRlO1xuICAgICAgICB0aGlzLmRlZmVycmFibGUgPSBvcHRpb25zLmRlZmVycmFibGU7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhpcyBmb3JlaWduIGtleSB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlRm9yZWlnbktleS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb3JlaWduS2V5KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5jb2x1bW5OYW1lcyksIGZhbHNlKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVzKSwgZmFsc2UpLFxuICAgICAgICAgICAgcmVmZXJlbmNlZERhdGFiYXNlOiB0aGlzLnJlZmVyZW5jZWREYXRhYmFzZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRTY2hlbWE6IHRoaXMucmVmZXJlbmNlZFNjaGVtYSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiB0aGlzLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IHRoaXMub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiB0aGlzLmRlZmVycmFibGUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFibGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgbWV0YWRhdGEuXG4gICAgICovXG4gICAgVGFibGVGb3JlaWduS2V5LmNyZWF0ZSA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb3JlaWduS2V5KHtcbiAgICAgICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICBjb2x1bW5OYW1lczogbWV0YWRhdGEuY29sdW1uTmFtZXMsXG4gICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZXM6IG1ldGFkYXRhLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyxcbiAgICAgICAgICAgIHJlZmVyZW5jZWREYXRhYmFzZTogbWV0YWRhdGEucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLmRhdGFiYXNlLFxuICAgICAgICAgICAgcmVmZXJlbmNlZFNjaGVtYTogbWV0YWRhdGEucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnNjaGVtYSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IG1ldGFkYXRhLnJlZmVyZW5jZWRUYWJsZVBhdGgsXG4gICAgICAgICAgICBvbkRlbGV0ZTogbWV0YWRhdGEub25EZWxldGUsXG4gICAgICAgICAgICBvblVwZGF0ZTogbWV0YWRhdGEub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBtZXRhZGF0YS5kZWZlcnJhYmxlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUZvcmVpZ25LZXk7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVGb3JlaWduS2V5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlRm9yZWlnbktleS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBEYXRhYmFzZSdzIHRhYmxlIGluZGV4IHN0b3JlZCBpbiB0aGlzIGNsYXNzLlxuICovXG52YXIgVGFibGVJbmRleCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVJbmRleChvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb2x1bW5zIGluY2x1ZGVkIGluIHRoaXMgaW5kZXguXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gW107XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IG9wdGlvbnMuY29sdW1uTmFtZXM7XG4gICAgICAgIHRoaXMuaXNVbmlxdWUgPSAhIW9wdGlvbnMuaXNVbmlxdWU7XG4gICAgICAgIHRoaXMuaXNTcGF0aWFsID0gISFvcHRpb25zLmlzU3BhdGlhbDtcbiAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gISFvcHRpb25zLmlzRnVsbHRleHQ7XG4gICAgICAgIHRoaXMucGFyc2VyID0gb3B0aW9ucy5wYXJzZXI7XG4gICAgICAgIHRoaXMud2hlcmUgPSBvcHRpb25zLndoZXJlID8gb3B0aW9ucy53aGVyZSA6IFwiXCI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhpcyBpbmRleCB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlSW5kZXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlSW5kZXgoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmNvbHVtbk5hbWVzKSwgZmFsc2UpLFxuICAgICAgICAgICAgaXNVbmlxdWU6IHRoaXMuaXNVbmlxdWUsXG4gICAgICAgICAgICBpc1NwYXRpYWw6IHRoaXMuaXNTcGF0aWFsLFxuICAgICAgICAgICAgaXNGdWxsdGV4dDogdGhpcy5pc0Z1bGx0ZXh0LFxuICAgICAgICAgICAgcGFyc2VyOiB0aGlzLnBhcnNlcixcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLndoZXJlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaW5kZXggZnJvbSB0aGUgaW5kZXggbWV0YWRhdGEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRhYmxlSW5kZXguY3JlYXRlID0gZnVuY3Rpb24gKGluZGV4TWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHtcbiAgICAgICAgICAgIG5hbWU6IGluZGV4TWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBpbmRleE1ldGFkYXRhLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWU7IH0pLFxuICAgICAgICAgICAgaXNVbmlxdWU6IGluZGV4TWV0YWRhdGEuaXNVbmlxdWUsXG4gICAgICAgICAgICBpc1NwYXRpYWw6IGluZGV4TWV0YWRhdGEuaXNTcGF0aWFsLFxuICAgICAgICAgICAgaXNGdWxsdGV4dDogaW5kZXhNZXRhZGF0YS5pc0Z1bGx0ZXh0LFxuICAgICAgICAgICAgcGFyc2VyOiBpbmRleE1ldGFkYXRhLnBhcnNlcixcbiAgICAgICAgICAgIHdoZXJlOiBpbmRleE1ldGFkYXRhLndoZXJlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlSW5kZXg7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVJbmRleCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIERhdGFiYXNlJ3MgdGFibGUgdW5pcXVlIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZVVuaXF1ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVVbmlxdWUob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1ucyB0aGF0IGNvbnRhaW5zIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gb3B0aW9ucy5jb2x1bW5OYW1lcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiB0aGlzIGNvbnN0cmFpbnQgd2l0aCBleGFjdGx5IHNhbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBUYWJsZVVuaXF1ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmNvbHVtbk5hbWVzKSwgZmFsc2UpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdW5pcXVlIGZyb20gdGhlIHVuaXF1ZSBtZXRhZGF0YSBvYmplY3QuXG4gICAgICovXG4gICAgVGFibGVVbmlxdWUuY3JlYXRlID0gZnVuY3Rpb24gKHVuaXF1ZU1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgbmFtZTogdW5pcXVlTWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiB1bmlxdWVNZXRhZGF0YS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVVuaXF1ZTtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZVVuaXF1ZSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZVVuaXF1ZS5qcy5tYXBcbiIsInZhciBUYWJsZVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlVXRpbHMoKSB7XG4gICAgfVxuICAgIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zID0gZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhLCBkcml2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgIGxlbmd0aDogZHJpdmVyLmdldENvbHVtbkxlbmd0aChjb2x1bW5NZXRhZGF0YSksXG4gICAgICAgICAgICB3aWR0aDogY29sdW1uTWV0YWRhdGEud2lkdGgsXG4gICAgICAgICAgICBjaGFyc2V0OiBjb2x1bW5NZXRhZGF0YS5jaGFyc2V0LFxuICAgICAgICAgICAgY29sbGF0aW9uOiBjb2x1bW5NZXRhZGF0YS5jb2xsYXRpb24sXG4gICAgICAgICAgICBwcmVjaXNpb246IGNvbHVtbk1ldGFkYXRhLnByZWNpc2lvbixcbiAgICAgICAgICAgIHNjYWxlOiBjb2x1bW5NZXRhZGF0YS5zY2FsZSxcbiAgICAgICAgICAgIHplcm9maWxsOiBjb2x1bW5NZXRhZGF0YS56ZXJvZmlsbCxcbiAgICAgICAgICAgIHVuc2lnbmVkOiBjb2x1bW5NZXRhZGF0YS51bnNpZ25lZCxcbiAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogY29sdW1uTWV0YWRhdGEuYXNFeHByZXNzaW9uLFxuICAgICAgICAgICAgZ2VuZXJhdGVkVHlwZTogY29sdW1uTWV0YWRhdGEuZ2VuZXJhdGVkVHlwZSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGRyaXZlci5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbk1ldGFkYXRhKSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjb2x1bW5NZXRhZGF0YS5vblVwZGF0ZSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGNvbHVtbk1ldGFkYXRhLmNvbW1lbnQsXG4gICAgICAgICAgICBpc0dlbmVyYXRlZDogY29sdW1uTWV0YWRhdGEuaXNHZW5lcmF0ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uU3RyYXRlZ3k6IGNvbHVtbk1ldGFkYXRhLmdlbmVyYXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIGlzTnVsbGFibGU6IGNvbHVtbk1ldGFkYXRhLmlzTnVsbGFibGUsXG4gICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW5NZXRhZGF0YSksXG4gICAgICAgICAgICBpc1ByaW1hcnk6IGNvbHVtbk1ldGFkYXRhLmlzUHJpbWFyeSxcbiAgICAgICAgICAgIGlzVW5pcXVlOiBkcml2ZXIubm9ybWFsaXplSXNVbmlxdWUoY29sdW1uTWV0YWRhdGEpLFxuICAgICAgICAgICAgaXNBcnJheTogY29sdW1uTWV0YWRhdGEuaXNBcnJheSB8fCBmYWxzZSxcbiAgICAgICAgICAgIGVudW06IGNvbHVtbk1ldGFkYXRhLmVudW0gPyBjb2x1bW5NZXRhZGF0YS5lbnVtLm1hcChmdW5jdGlvbiAodmFsKSB7IHJldHVybiB2YWwgKyBcIlwiOyB9KSA6IGNvbHVtbk1ldGFkYXRhLmVudW0sXG4gICAgICAgICAgICBlbnVtTmFtZTogY29sdW1uTWV0YWRhdGEuZW51bU5hbWUsXG4gICAgICAgICAgICBzcGF0aWFsRmVhdHVyZVR5cGU6IGNvbHVtbk1ldGFkYXRhLnNwYXRpYWxGZWF0dXJlVHlwZSxcbiAgICAgICAgICAgIHNyaWQ6IGNvbHVtbk1ldGFkYXRhLnNyaWRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFRhYmxlVXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVVdGlscy5qcy5tYXBcbiIsInZhciBWaWV3VXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmlld1V0aWxzKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJhdG9yIGZvciAuc29ydCgpIHRoYXQgd2lsbCBvcmRlciB2aWV3cyBiYXNlcyBvbiBkZXBlbmRlbmNpZXMgaW4gY3JlYXRpb24gb3JkZXJcbiAgICAgKi9cbiAgICBWaWV3VXRpbHMudmlld01ldGFkYXRhQ21wID0gZnVuY3Rpb24gKG1ldGFkYXRhQSwgbWV0YWRhdGFCKSB7XG4gICAgICAgIGlmICghbWV0YWRhdGFBIHx8ICFtZXRhZGF0YUIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YUEuZGVwZW5kc09uICYmIChtZXRhZGF0YUEuZGVwZW5kc09uLmhhcyhtZXRhZGF0YUIudGFyZ2V0KSB8fFxuICAgICAgICAgICAgbWV0YWRhdGFBLmRlcGVuZHNPbi5oYXMobWV0YWRhdGFCLm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhQi5kZXBlbmRzT24gJiYgKG1ldGFkYXRhQi5kZXBlbmRzT24uaGFzKG1ldGFkYXRhQS50YXJnZXQpIHx8XG4gICAgICAgICAgICBtZXRhZGF0YUIuZGVwZW5kc09uLmhhcyhtZXRhZGF0YUEubmFtZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld1V0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFZpZXdVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3VXRpbHMuanMubWFwXG4iLCIvKipcbiAqIFZpZXcgaW4gdGhlIGRhdGFiYXNlIHJlcHJlc2VudGVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBWaWV3KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBvcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBvcHRpb25zLnNjaGVtYTtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG9wdGlvbnMuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxpemVkID0gISFvcHRpb25zLm1hdGVyaWFsaXplZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoaXMgdGFibGUgdG8gYSBuZXcgdGFibGUgd2l0aCBhbGwgcHJvcGVydGllcyBjbG9uZWQuXG4gICAgICovXG4gICAgVmlldy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlldyh7XG4gICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRoaXMubWF0ZXJpYWxpemVkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHZpZXcgZnJvbSBhIGdpdmVuIGVudGl0eSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBWaWV3LmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGF0YWJhc2U6IGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlLFxuICAgICAgICAgICAgc2NoZW1hOiBlbnRpdHlNZXRhZGF0YS5zY2hlbWEsXG4gICAgICAgICAgICBuYW1lOiBkcml2ZXIuYnVpbGRUYWJsZU5hbWUoZW50aXR5TWV0YWRhdGEudGFibGVOYW1lLCBlbnRpdHlNZXRhZGF0YS5zY2hlbWEsIGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGVudGl0eU1ldGFkYXRhLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IGVudGl0eU1ldGFkYXRhLnRhYmxlTWV0YWRhdGFBcmdzLm1hdGVyaWFsaXplZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXcob3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gVmlldztcbn0oKSk7XG5leHBvcnQgeyBWaWV3IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXcuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyUmVzdWx0IH0gZnJvbSBcIi4vQnJvYWRjYXN0ZXJSZXN1bHRcIjtcbi8qKlxuICogQnJvYWRjYXN0ZXIgcHJvdmlkZXMgYSBoZWxwZXIgbWV0aG9kcyB0byBicm9hZGNhc3QgZXZlbnRzIHRvIHRoZSBzdWJzY3JpYmVycy5cbiAqL1xudmFyIEJyb2FkY2FzdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBCcm9hZGNhc3RlcihxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGJyb2FkY2FzdEZ1bmN0aW9uO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJyb2FkY2FzdGVyUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RGdW5jdGlvbiA9IHRoaXNbXCJicm9hZGNhc3RcIiArIGV2ZW50ICsgXCJFdmVudFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnJvYWRjYXN0RnVuY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IGJyb2FkY2FzdEZ1bmN0aW9uKS5jYWxsLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRdLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXN1bHQud2FpdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJCRUZPUkVfSU5TRVJUXCIgZXZlbnQuXG4gICAgICogQmVmb3JlIGluc2VydCBldmVudCBpcyBleGVjdXRlZCBiZWZvcmUgZW50aXR5IGlzIGJlaW5nIGluc2VydGVkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQWxsIHN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIHdobyBsaXN0ZW5lZCB0byB0aGlzIGV2ZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgKiBTdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyBjYW4gcmV0dXJuIHByb21pc2VzLCBpdCB3aWxsIHdhaXQgdW50aWwgdGhleSBhcmUgcmVzb2x2ZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24sIGRvIG5vdCBjaGFuZ2UgY29kZSBzdHJ1Y3R1cmUuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEJlZm9yZUluc2VydEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW50aXR5ICYmIG1ldGFkYXRhLmJlZm9yZUluc2VydExpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmJlZm9yZUluc2VydExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5iZWZvcmVJbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlSW5zZXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJCRUZPUkVfVVBEQVRFXCIgZXZlbnQuXG4gICAgICogQmVmb3JlIHVwZGF0ZSBldmVudCBpcyBleGVjdXRlZCBiZWZvcmUgZW50aXR5IGlzIGJlaW5nIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVVcGRhdGVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5LCB1cGRhdGVkQ29sdW1ucywgdXBkYXRlZFJlbGF0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW50aXR5ICYmIG1ldGFkYXRhLmJlZm9yZVVwZGF0ZUxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmJlZm9yZVVwZGF0ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5iZWZvcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUVudGl0eTogZGF0YWJhc2VFbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQ29sdW1uczogdXBkYXRlZENvbHVtbnMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUmVsYXRpb25zOiB1cGRhdGVkUmVsYXRpb25zIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQkVGT1JFX1JFTU9WRVwiIGV2ZW50LlxuICAgICAqIEJlZm9yZSByZW1vdmUgZXZlbnQgaXMgZXhlY3V0ZWQgYmVmb3JlIGVudGl0eSBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVSZW1vdmVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmlzQWxsb3dlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRpb25SZXN1bHQgPSBsaXN0ZW5lci5leGVjdXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzQWxsb3dlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWV0YWRhdGEudGFyZ2V0KSAmJiBzdWJzY3JpYmVyLmJlZm9yZVJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5iZWZvcmVSZW1vdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyOiBfdGhpcy5xdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlRW50aXR5OiBkYXRhYmFzZUVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBtZXRhZGF0YS5nZXRFbnRpdHlJZE1peGVkTWFwKGRhdGFiYXNlRW50aXR5KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX0lOU0VSVFwiIGV2ZW50LlxuICAgICAqIEFmdGVyIGluc2VydCBldmVudCBpcyBleGVjdXRlZCBhZnRlciBlbnRpdHkgaXMgYmVpbmcgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQWxsIHN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIHdobyBsaXN0ZW5lZCB0byB0aGlzIGV2ZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgKiBTdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyBjYW4gcmV0dXJuIHByb21pc2VzLCBpdCB3aWxsIHdhaXQgdW50aWwgdGhleSBhcmUgcmVzb2x2ZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24sIGRvIG5vdCBjaGFuZ2UgY29kZSBzdHJ1Y3R1cmUuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVySW5zZXJ0RXZlbnQgPSBmdW5jdGlvbiAocmVzdWx0LCBtZXRhZGF0YSwgZW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJJbnNlcnRMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlckluc2VydExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlckluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlckluc2VydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQkVGT1JFX1RSQU5TQUNUSU9OX1NUQVJUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEJlZm9yZVRyYW5zYWN0aW9uU3RhcnRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25TdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5iZWZvcmVUcmFuc2FjdGlvblN0YXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX1RSQU5TQUNUSU9OX1NUQVJUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVyVHJhbnNhY3Rpb25TdGFydEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlci5hZnRlclRyYW5zYWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvblN0YXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9UUkFOU0FDVElPTl9DT01NSVRcIiBldmVudC5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0QmVmb3JlVHJhbnNhY3Rpb25Db21taXRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Db21taXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Db21taXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyOiBfdGhpcy5xdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQUZURVJfVFJBTlNBQ1RJT05fQ09NTUlUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVyVHJhbnNhY3Rpb25Db21taXRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclRyYW5zYWN0aW9uQ29tbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9UUkFOU0FDVElPTl9ST0xMQkFDS1wiIGV2ZW50LlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrRXZlbnQgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmJlZm9yZVRyYW5zYWN0aW9uUm9sbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Sb2xsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJBRlRFUl9UUkFOU0FDVElPTl9ST0xMQkFDS1wiIGV2ZW50LlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2tFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRpb25SZXN1bHQgPSBzdWJzY3JpYmVyLmFmdGVyVHJhbnNhY3Rpb25Sb2xsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJBRlRFUl9VUERBVEVcIiBldmVudC5cbiAgICAgKiBBZnRlciB1cGRhdGUgZXZlbnQgaXMgZXhlY3V0ZWQgYWZ0ZXIgZW50aXR5IGlzIGJlaW5nIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlclVwZGF0ZUV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0eSwgZGF0YWJhc2VFbnRpdHksIHVwZGF0ZWRDb2x1bW5zLCB1cGRhdGVkUmVsYXRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJVcGRhdGVMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlclVwZGF0ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlclVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VFbnRpdHk6IGRhdGFiYXNlRW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZENvbHVtbnM6IHVwZGF0ZWRDb2x1bW5zIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFJlbGF0aW9uczogdXBkYXRlZFJlbGF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX1JFTU9WRVwiIGV2ZW50LlxuICAgICAqIEFmdGVyIHJlbW92ZSBldmVudCBpcyBleGVjdXRlZCBhZnRlciBlbnRpdHkgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBBbGwgc3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgd2hvIGxpc3RlbmVkIHRvIHRoaXMgZXZlbnQgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGlzIHBvaW50LlxuICAgICAqIFN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIGNhbiByZXR1cm4gcHJvbWlzZXMsIGl0IHdpbGwgd2FpdCB1bnRpbCB0aGV5IGFyZSByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGhhcyBhIHBlcmZvcm1hbmNlLW9wdGltaXplZCBjb2RlIG9yZ2FuaXphdGlvbiwgZG8gbm90IGNoYW5nZSBjb2RlIHN0cnVjdHVyZS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0QWZ0ZXJSZW1vdmVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJSZW1vdmVMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlclJlbW92ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlclJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclJlbW92ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VFbnRpdHk6IGRhdGFiYXNlRW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IG1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoZGF0YWJhc2VFbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYGJyb2FkY2FzdExvYWRGb3JBbGxFdmVudGBcbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0TG9hZEV2ZW50c0ZvckFsbCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gdGhpcy5icm9hZGNhc3RMb2FkRXZlbnQocmVzdWx0LCBtZXRhZGF0YSwgZW50aXRpZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX0xPQURcIiBldmVudCBmb3IgYWxsIGdpdmVuIGVudGl0aWVzLCBhbmQgdGhlaXIgc3ViLWVudGl0aWVzLlxuICAgICAqIEFmdGVyIGxvYWQgZXZlbnQgaXMgZXhlY3V0ZWQgYWZ0ZXIgZW50aXR5IGhhcyBiZWVuIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBBbGwgc3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgd2hvIGxpc3RlbmVkIHRvIHRoaXMgZXZlbnQgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGlzIHBvaW50LlxuICAgICAqIFN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIGNhbiByZXR1cm4gcHJvbWlzZXMsIGl0IHdpbGwgd2FpdCB1bnRpbCB0aGV5IGFyZSByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGhhcyBhIHBlcmZvcm1hbmNlLW9wdGltaXplZCBjb2RlIG9yZ2FuaXphdGlvbiwgZG8gbm90IGNoYW5nZSBjb2RlIHN0cnVjdHVyZS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0TG9hZEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0aWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIFByb21pc2UpIC8vIHRvZG86IGNoZWNrIHdoeSBuZWVkIHRoaXM/XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29sbGVjdCBsb2FkIGV2ZW50cyBmb3IgYWxsIGNoaWxkcmVuIGVudGl0aWVzIHRoYXQgd2VyZSBsb2FkZWQgd2l0aCB0aGUgbWFpbiBlbnRpdHlcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5yZWxhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIGxhenkgcmVsYXRpb25zIHdlIGNhbm5vdCBzaW1wbHkgYWNjZXNzIHRvIGVudGl0eSBwcm9wZXJ0eSBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSBnZXR0ZXIgYW5kIGEgZGF0YWJhc2UgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTGF6eSAmJiAhZW50aXR5Lmhhc093blByb3BlcnR5KHJlbGF0aW9uLnByb3BlcnR5TmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmJyb2FkY2FzdExvYWRFdmVudChyZXN1bHQsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmFmdGVyTG9hZExpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZnRlckxvYWRMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmlzQWxsb3dlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzQWxsb3dlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWV0YWRhdGEudGFyZ2V0KSAmJiBzdWJzY3JpYmVyLmFmdGVyTG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYWZ0ZXJMb2FkKGVudGl0eSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgc3Vic2NyaWJlcidzIG1ldGhvZHMgY2FuIGJlIGV4ZWN1dGVkIGJ5IGNoZWNraW5nIGlmIGl0cyBkb24ndCBsaXN0ZW4gdG8gdGhlIHBhcnRpY3VsYXIgZW50aXR5LFxuICAgICAqIG9yIGxpc3RlbnMgb3VyIGVudGl0eS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuaXNBbGxvd2VkU3Vic2NyaWJlciA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuICFzdWJzY3JpYmVyLmxpc3RlblRvIHx8XG4gICAgICAgICAgICAhc3Vic2NyaWJlci5saXN0ZW5UbygpIHx8XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmxpc3RlblRvKCkgPT09IE9iamVjdCB8fFxuICAgICAgICAgICAgc3Vic2NyaWJlci5saXN0ZW5UbygpID09PSB0YXJnZXQgfHxcbiAgICAgICAgICAgIHN1YnNjcmliZXIubGlzdGVuVG8oKS5pc1Byb3RvdHlwZU9mKHRhcmdldCk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvYWRjYXN0ZXI7XG59KCkpO1xuZXhwb3J0IHsgQnJvYWRjYXN0ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvYWRjYXN0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEJyb2FkY2FzdGVyIGV4ZWN1dGlvbiByZXN1bHQgLSBwcm9taXNlcyBleGVjdXRlZCBieSBvcGVyYXRpb25zIGFuZCBudW1iZXIgb2YgZXhlY3V0ZWQgbGlzdGVuZXJzIGFuZCBzdWJzY3JpYmVycy5cbiAqL1xudmFyIEJyb2FkY2FzdGVyUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJyb2FkY2FzdGVyUmVzdWx0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGV4ZWN1dGVkIGxpc3RlbmVycyBhbmQgc3Vic2NyaWJlcnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb21pc2VzIHJldHVybmVkIGJ5IGxpc3RlbmVycyBhbmQgc3Vic2NyaWJlcnMgd2hpY2ggbmVlZHMgdG8gYmUgYXdhaXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJvbWlzZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdCBmb3IgYWxsIHByb21pc2VzIHRvIHNldHRsZVxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyUmVzdWx0LnByb3RvdHlwZS53YWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnByb21pc2VzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHRoaXMucHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvYWRjYXN0ZXJSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IHsgQnJvYWRjYXN0ZXJSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvYWRjYXN0ZXJSZXN1bHQuanMubWFwXG4iLCJ2YXIgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBcHBseVZhbHVlVHJhbnNmb3JtZXJzKCkge1xuICAgIH1cbiAgICBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybUZyb20gPSBmdW5jdGlvbiAodHJhbnNmb3JtZXIsIGRhdGFiYXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNmb3JtZXIpKSB7XG4gICAgICAgICAgICB2YXIgcmV2ZXJzZVRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VUcmFuc2Zvcm1lcnMucmVkdWNlKGZ1bmN0aW9uICh0cmFuc2Zvcm1lZFZhbHVlLCBfdHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RyYW5zZm9ybWVyLmZyb20odHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICAgICAgICB9LCBkYXRhYmFzZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZnJvbShkYXRhYmFzZVZhbHVlKTtcbiAgICB9O1xuICAgIEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbiAodHJhbnNmb3JtZXIsIGVudGl0eVZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLnJlZHVjZShmdW5jdGlvbiAodHJhbnNmb3JtZWRWYWx1ZSwgX3RyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc2Zvcm1lci50byh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgICAgICAgIH0sIGVudGl0eVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIudG8oZW50aXR5VmFsdWUpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnM7XG59KCkpO1xuZXhwb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBseVZhbHVlVHJhbnNmb3JtZXJzLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byB0cmFuc2Zvcm0gaHlkcmF0ZWQgYW5kIHBlcnNpc3RlZCBkYXRhLlxuICovXG52YXIgRGF0ZVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVVdGlscygpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGRhdGUgb2JqZWN0IGh5ZHJhdGVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIERhdGVVdGlscy5ub3JtYWxpemVIeWRyYXRlZERhdGUgPSBmdW5jdGlvbiAobWl4ZWREYXRlKSB7XG4gICAgICAgIGlmICghbWl4ZWREYXRlKVxuICAgICAgICAgICAgcmV0dXJuIG1peGVkRGF0ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtaXhlZERhdGUgPT09IFwic3RyaW5nXCIgPyBuZXcgRGF0ZShtaXhlZERhdGUpIDogbWl4ZWREYXRlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gdmFsdWUgaW50byBkYXRlIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERFwiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEZ1bGxZZWFyKCkpICsgXCItXCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0TW9udGgoKSArIDEpICsgXCItXCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gdmFsdWUgaW50byBkYXRlIG9iamVjdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlID0gZnVuY3Rpb24gKG1peGVkRGF0ZSwgdG9VdGMsIHVzZU1pbGxpc2Vjb25kcykge1xuICAgICAgICBpZiAodG9VdGMgPT09IHZvaWQgMCkgeyB0b1V0YyA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh1c2VNaWxsaXNlY29uZHMgPT09IHZvaWQgMCkgeyB1c2VNaWxsaXNlY29uZHMgPSB0cnVlOyB9XG4gICAgICAgIHZhciBkYXRlID0gdHlwZW9mIG1peGVkRGF0ZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBEYXRlKG1peGVkRGF0ZSkgOiBtaXhlZERhdGU7XG4gICAgICAgIGlmICh0b1V0YylcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSwgZGF0ZS5nZXRVVENEYXRlKCksIGRhdGUuZ2V0VVRDSG91cnMoKSwgZGF0ZS5nZXRVVENNaW51dGVzKCksIGRhdGUuZ2V0VVRDU2Vjb25kcygpLCBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgaWYgKCF1c2VNaWxsaXNlY29uZHMpXG4gICAgICAgICAgICBkYXRlLnNldFVUQ01pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIHRpbWUgc3RyaW5nIGluIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9UaW1lU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlLCBza2lwU2Vjb25kcykge1xuICAgICAgICBpZiAoc2tpcFNlY29uZHMgPT09IHZvaWQgMCkgeyBza2lwU2Vjb25kcyA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICBcIjpcIiArIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAoIXNraXBTZWNvbmRzID8gXCI6XCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0U2Vjb25kcygpKSA6IFwiXCIpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIHRpbWUgc3RyaW5nIGluIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWRUaW1lVG9EYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZCh2YWx1ZS5zcGxpdChcIjpcIiksIDMpLCBob3VycyA9IF9hWzBdLCBtaW51dGVzID0gX2FbMV0sIHNlY29uZHMgPSBfYVsyXTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGlmIChob3VycylcbiAgICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KGhvdXJzKSk7XG4gICAgICAgICAgICBpZiAobWludXRlcylcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQobWludXRlcykpO1xuICAgICAgICAgICAgaWYgKHNlY29uZHMpXG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKHBhcnNlSW50KHNlY29uZHMpKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGdpdmVuIHN0cmluZyB2YWx1ZSB3aXRoIFwiLVwiIHNlcGFyYXRvciBpbnRvIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWRUaW1lVG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUsIHNraXBTZWNvbmRzKSB7XG4gICAgICAgIGlmIChza2lwU2Vjb25kcyA9PT0gdm9pZCAwKSB7IHNraXBTZWNvbmRzID0gZmFsc2U7IH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyAodmFsdWUuZ2V0SG91cnMoKSArIFwiOlwiICsgdmFsdWUuZ2V0TWludXRlcygpICsgKCFza2lwU2Vjb25kcyA/IFwiOlwiICsgdmFsdWUuZ2V0U2Vjb25kcygpIDogXCJcIikpIDogdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIjpcIilcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2Lmxlbmd0aCA9PT0gMSA/IFwiMFwiICsgdiA6IHY7IH0pIC8vIGFwcGVuZCB6ZXJvIGF0IGJlZ2lubmluZyBpZiB3ZSBoYXZlIGEgZmlyc3QtemVyby1sZXNzIG51bWJlclxuICAgICAgICAgICAgICAgIC5qb2luKFwiOlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIGRhdGV0aW1lIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERCBISC1tbS1zc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRldGltZVN0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdXNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHZhciBmaW5hbFZhbHVlID0gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEZ1bGxZZWFyKCkpICsgXCItXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNb250aCgpICsgMSkgKyBcIi1cIiArXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldERhdGUoKSkgKyBcIiBcIiArXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEhvdXJzKCkpICsgXCI6XCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNaW51dGVzKCkpICsgXCI6XCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgaWYgKHVzZU1pbGxpc2Vjb25kcylcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlICs9IFwiLlwiICsgdGhpcy5mb3JtYXRNaWxsaXNlY29uZHModmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICAgICAgdmFsdWUgPSBmaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGdpdmVuIHZhbHVlIGludG8gdXRjIGRhdGV0aW1lIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERCBISC1tbS1zcy5zc3NcIiBmb3JtYXQuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLm1peGVkRGF0ZVRvVXRjRGF0ZXRpbWVTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENGdWxsWWVhcigpKSArIFwiLVwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDTW9udGgoKSArIDEpICsgXCItXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENEYXRlKCkpICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENIb3VycygpKSArIFwiOlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDTWludXRlcygpKSArIFwiOlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDU2Vjb25kcygpKSArIFwiLlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdE1pbGxpc2Vjb25kcyh2YWx1ZS5nZXRVVENNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZWFjaCBpdGVtIGluIHRoZSBnaXZlbiBhcnJheSB0byBzdHJpbmcgam9pbmVkIGJ5IFwiLFwiIHNlcGFyYXRvci5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMuc2ltcGxlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIFN0cmluZyhpKTsgfSlcbiAgICAgICAgICAgICAgICAuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gc3RyaW5nIHRvIHNpbXBsZSBhcnJheSBzcGxpdCBieSBcIixcIiBzZXBhcmF0b3IuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLnN0cmluZ1RvU2ltcGxlQXJyYXkgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9O1xuICAgIERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUpzb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWU7XG4gICAgfTtcbiAgICBEYXRlVXRpbHMuc2ltcGxlRW51bVRvU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gICAgfTtcbiAgICBEYXRlVXRpbHMuc3RyaW5nVG9TaW1wbGVFbnVtID0gZnVuY3Rpb24gKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEuZW51bVxuICAgICAgICAgICAgJiYgIWlzTmFOKHZhbHVlKVxuICAgICAgICAgICAgJiYgY29sdW1uTWV0YWRhdGEuZW51bS5pbmRleE9mKHBhcnNlSW50KHZhbHVlKSkgPj0gMCkge1xuICAgICAgICAgICAgLy8gY29udmVydCB0byBudW1iZXIgaWYgdGhhdCBleGlzdHMgaW4gcG9vc2libGUgZW51bSBvcHRpb25zXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGdpdmVuIG51bWJlciB0byBcIjB4XCIgZm9ybWF0LCBlLmcuIGlmIGl0IGlzIDEgdGhlbiBpdCB3aWxsIHJldHVybiBcIjAxXCIuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLmZvcm1hdFplcm9sZXNzVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMTApXG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGdpdmVuIG51bWJlciB0byBcIjB4XCIgZm9ybWF0LCBlLmcuIGlmIGl0IGlzIDEgdGhlbiBpdCB3aWxsIHJldHVybiBcIjAxXCIuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLmZvcm1hdE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPCAxMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMDBcIiArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgMTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IERhdGVVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRlVXRpbHMuanMubWFwXG4iLCIvKipcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanJpZWNrZW4vZGVwZW5kZW5jeS1ncmFwaFxuICogSnVzdCBhZGRlZCBcImFueVwiIHR5cGVzIGhlcmUsIHdyYXBwZXIgZXZlcnl0aGluZyBpbnRvIGV4cG9ydGVkIGNsYXNzLlxuICogV2UgY2FudCB1c2UgYSBwYWNrYWdlIGl0c2VsZiBiZWNhdXNlIHdlIHdhbnQgdG8gcGFja2FnZSBcImV2ZXJ5dGhpbmctaW4taXRcIiBmb3IgdGhlIGZyb250ZW5kIHVzZXJzIG9mIFR5cGVPUk0uXG4gKi9cbi8qKlxuICogQSBzaW1wbGUgZGVwZW5kZW5jeSBncmFwaFxuICovXG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogSGVscGVyIGZvciBjcmVhdGluZyBhIERlcHRoLUZpcnN0LVNlYXJjaCBvblxuICogYSBzZXQgb2YgZWRnZXMuXG4gKlxuICogRGV0ZWN0cyBjeWNsZXMgYW5kIHRocm93cyBhbiBFcnJvciBpZiBvbmUgaXMgZGV0ZWN0ZWQuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURGUyhlZGdlcywgbGVhdmVzT25seSwgcmVzdWx0KSB7XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gW107XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24gREZTKGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZpc2l0ZWRbY3VycmVudE5vZGVdID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudFBhdGgucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgIGVkZ2VzW2N1cnJlbnROb2RlXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbm9kZV0pIHtcbiAgICAgICAgICAgICAgICBERlMobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50UGF0aC5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJEZXBlbmRlbmN5IEN5Y2xlIEZvdW5kOiBcIiArIGN1cnJlbnRQYXRoLmpvaW4oXCIgLT4gXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRQYXRoLnBvcCgpO1xuICAgICAgICBpZiAoKCFsZWF2ZXNPbmx5IHx8IGVkZ2VzW2N1cnJlbnROb2RlXS5sZW5ndGggPT09IDApICYmIHJlc3VsdC5pbmRleE9mKGN1cnJlbnROb2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG52YXIgRGVwR3JhcGggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwR3JhcGgoKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSB7fTtcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGVuY3kgTm9kZV1cbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGFudCBOb2RlXVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBub2RlIHRvIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBDaGVja2luZyB0aGUgYXJndW1lbnRzIGxlbmd0aCBhbGxvd3MgdGhlIHVzZXIgdG8gYWRkIGEgbm9kZSB3aXRoIHVuZGVmaW5lZCBkYXRhXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgICAqL1xuICAgIERlcEdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgICAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlZGdlTGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUxpc3Rba2V5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgbm9kZSBleGlzdHMgaW4gdGhlIGdyYXBoXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZURhdGEgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgZGF0YSBmb3IgYSBnaXZlbiBub2RlIG5hbWUuIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLnNldE5vZGVEYXRhID0gZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy4gSWYgZWl0aGVyIG9mIHRoZSBub2RlcyBkb2VzIG5vdCBleGlzdCxcbiAgICAgKiBhbiBFcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICBpZiAoIXRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5wdXNoKHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUucmVtb3ZlRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICB2YXIgaWR4O1xuICAgICAgICBpZiAodGhpcy5oYXNOb2RlKGZyb20pKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0byk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgICAgICAgIGlkeCA9IHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBkZXBlbmRzIG9uICh0cmFuc2l0aXZlbHkpLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgICAqXG4gICAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqL1xuICAgIERlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbmNpZXNPZiA9IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHZhciBERlMgPSBjcmVhdGVERlModGhpcy5vdXRnb2luZ0VkZ2VzLCBsZWF2ZXNPbmx5LCByZXN1bHQpO1xuICAgICAgICAgICAgREZTKG5vZGUpO1xuICAgICAgICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgICAqXG4gICAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgaGF2ZSBhbnkgZGVwZW5kYW50cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mID0gZnVuY3Rpb24gKG5vZGUsIGxlYXZlc09ubHkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyh0aGlzLmluY29taW5nRWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCk7XG4gICAgICAgICAgICBERlMobm9kZSk7XG4gICAgICAgICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCB0aGUgb3ZlcmFsbCBwcm9jZXNzaW5nIG9yZGVyIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAgICpcbiAgICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLm92ZXJhbGxPcmRlciA9IGZ1bmN0aW9uIChsZWF2ZXNPbmx5KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7IC8vIEVtcHR5IGdyYXBoXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBjeWNsZXMgLSB3ZSBydW4gdGhlIERGUyBzdGFydGluZyBhdCBhbGwgdGhlIG5vZGVzIGluIGNhc2UgdGhlcmVcbiAgICAgICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgICAgIHZhciBDeWNsZURGU18xID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgICAgIEN5Y2xlREZTXzEobik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBERlNfMSA9IGNyZWF0ZURGUyh0aGlzLm91dGdvaW5nRWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCk7XG4gICAgICAgICAgICAvLyBGaW5kIGFsbCBwb3RlbnRpYWwgc3RhcnRpbmcgcG9pbnRzIChub2RlcyB3aXRoIG5vdGhpbmcgZGVwZW5kaW5nIG9uIHRoZW0pIGFuXG4gICAgICAgICAgICAvLyBydW4gYSBERlMgc3RhcnRpbmcgYXQgdGhlc2UgcG9pbnRzIHRvIGdldCB0aGUgb3JkZXJcbiAgICAgICAgICAgIGtleXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgREZTXzEobik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZXBHcmFwaDtcbn0oKSk7XG5leHBvcnQgeyBEZXBHcmFwaCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXBHcmFwaC5qcy5tYXBcbiIsImltcG9ydCB7IF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG52YXIgT2JqZWN0VXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JqZWN0VXRpbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAgICogdGFyZ2V0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAgICogQHBhcmFtIHNvdXJjZXMgT25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBPYmplY3RVdGlscy5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgc291cmNlc18xID0gX192YWx1ZXMoc291cmNlcyksIHNvdXJjZXNfMV8xID0gc291cmNlc18xLm5leHQoKTsgIXNvdXJjZXNfMV8xLmRvbmU7IHNvdXJjZXNfMV8xID0gc291cmNlc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IChlXzIgPSB2b2lkIDAsIF9fdmFsdWVzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSkpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYiA9IF9jLnJldHVybikpIF9iLmNhbGwoX2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VzXzFfMSAmJiAhc291cmNlc18xXzEuZG9uZSAmJiAoX2EgPSBzb3VyY2VzXzEucmV0dXJuKSkgX2EuY2FsbChzb3VyY2VzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHM7XG59KCkpO1xuZXhwb3J0IHsgT2JqZWN0VXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VXRpbHMuanMubWFwXG4iLCJpbXBvcnQgeyBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xudmFyIE9ybVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ybVV0aWxzKCkge1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2h1bmtzIGFycmF5IGludG8gcGllY2VzLlxuICAgICAqL1xuICAgIE9ybVV0aWxzLmNodW5rID0gZnVuY3Rpb24gKGFycmF5LCBzaXplKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSksIGZ1bmN0aW9uIChfLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2UoaSAqIHNpemUsIGkgKiBzaXplICsgc2l6ZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyA9IGZ1bmN0aW9uIChjbHNlc0FuZFN0cmluZ3MpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIChjbHNlc0FuZFN0cmluZ3MpLmZpbHRlcihmdW5jdGlvbiAoY2xzKSB7IHJldHVybiB0eXBlb2YgY2xzICE9PSBcInN0cmluZ1wiOyB9KSxcbiAgICAgICAgICAgIChjbHNlc0FuZFN0cmluZ3MpLmZpbHRlcihmdW5jdGlvbiAoc3RyKSB7IHJldHVybiB0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiOyB9KSxcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLmdyb3VwQnkgPSBmdW5jdGlvbiAoYXJyYXksIHByb3BlcnR5Q2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAoZ3JvdXBlZEFycmF5LCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IHByb3BlcnR5Q2FsbGJhY2sodmFsdWUpO1xuICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBncm91cGVkQXJyYXkuZmluZChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5pZCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZCkge1xuICAgICAgICAgICAgICAgIGdyb3VwZWQgPSB7IGlkOiBrZXksIGl0ZW1zOiBbXSB9O1xuICAgICAgICAgICAgICAgIGdyb3VwZWRBcnJheS5wdXNoKGdyb3VwZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBlZC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBncm91cGVkQXJyYXk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLnVuaXEgPSBmdW5jdGlvbiAoYXJyYXksIGNyaXRlcmlhT3JQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uICh1bmlxdWVBcnJheSwgaXRlbSkge1xuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoY3JpdGVyaWFPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlXzEgPSBjcml0ZXJpYU9yUHJvcGVydHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSAhIXVuaXF1ZUFycmF5LmZpbmQoZnVuY3Rpb24gKHVuaXF1ZUl0ZW0pIHsgcmV0dXJuIGNyaXRlcmlhT3JQcm9wZXJ0eSh1bmlxdWVJdGVtKSA9PT0gaXRlbVZhbHVlXzE7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNyaXRlcmlhT3JQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gISF1bmlxdWVBcnJheS5maW5kKGZ1bmN0aW9uICh1bmlxdWVJdGVtKSB7IHJldHVybiB1bmlxdWVJdGVtW2NyaXRlcmlhT3JQcm9wZXJ0eV0gPT09IGl0ZW1bY3JpdGVyaWFPclByb3BlcnR5XTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHVuaXF1ZUFycmF5LmluZGV4T2YoaXRlbSkgIT09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgICAgICB1bmlxdWVBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZUFycmF5O1xuICAgICAgICB9LCBbXSk7XG4gICAgfTtcbiAgICAvLyBDaGVja3MgaWYgaXQncyBhbiBvYmplY3QgbWFkZSBieSBPYmplY3QuY3JlYXRlKG51bGwpLCB7fSBvciBuZXcgT2JqZWN0KClcbiAgICBPcm1VdGlscy5pc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpdGVtLmNvbnN0cnVjdG9yIHx8IGl0ZW0uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9O1xuICAgIE9ybVV0aWxzLm1lcmdlQXJyYXlLZXkgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBtZW1vKSB7XG4gICAgICAgIC8vIEhhdmUgd2Ugc2VlbiB0aGlzIGJlZm9yZT8gIFByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICBpZiAobWVtby5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lbW8uZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHByb21pc2VzIGVudGlyZWx5LlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhvbGQtb3ZlciBmcm9tIHRoZSBvbGQgY29kZSAmIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluXG4gICAgICAgICAgICAvLyB0aGUgbGF6eSBmaWVsZHMuICBJZGVhbGx5IHdlJ2QgcmVtb3ZlIHRoZXNlIHByb21pc2VzIHZpYSBhbm90aGVyIGZ1bmN0aW9uIGZpcnN0XG4gICAgICAgICAgICAvLyBidXQgZm9yIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBtZW1vLnNldCh2YWx1ZSwgdGFyZ2V0W2tleV0pO1xuICAgICAgICB0aGlzLm1lcmdlKHRhcmdldFtrZXldLCB2YWx1ZSwgbWVtbyk7XG4gICAgICAgIG1lbW8uZGVsZXRlKHZhbHVlKTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLm1lcmdlT2JqZWN0S2V5ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgbWVtbykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgLy8gSGF2ZSB3ZSBzZWVuIHRoaXMgYmVmb3JlPyAgUHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgICAgIGlmIChtZW1vLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCAoX2EgPSB7fSwgX2Fba2V5XSA9IG1lbW8uZ2V0KHZhbHVlKSwgX2EpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHByb21pc2VzIGVudGlyZWx5LlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhvbGQtb3ZlciBmcm9tIHRoZSBvbGQgY29kZSAmIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluXG4gICAgICAgICAgICAvLyB0aGUgbGF6eSBmaWVsZHMuICBJZGVhbGx5IHdlJ2QgcmVtb3ZlIHRoZXNlIHByb21pc2VzIHZpYSBhbm90aGVyIGZ1bmN0aW9uIGZpcnN0XG4gICAgICAgICAgICAvLyBidXQgZm9yIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIChfYiA9IHt9LCBfYltrZXldID0gdmFsdWUsIF9iKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIChfYyA9IHt9LCBfY1trZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9LCBfYykpO1xuICAgICAgICB9XG4gICAgICAgIG1lbW8uc2V0KHZhbHVlLCB0YXJnZXRba2V5XSk7XG4gICAgICAgIHRoaXMubWVyZ2UodGFyZ2V0W2tleV0sIHZhbHVlLCBtZW1vKTtcbiAgICAgICAgbWVtby5kZWxldGUodmFsdWUpO1xuICAgIH07XG4gICAgT3JtVXRpbHMubWVyZ2UgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIG1lbW8pIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIGlmIChtZW1vID09PSB2b2lkIDApIHsgbWVtbyA9IG5ldyBNYXAoKTsgfVxuICAgICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhzb3VyY2UpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VPYmplY3RLZXkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldLCBtZW1vKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSA9IDA7IGtleSA8IHNvdXJjZS5sZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXJnZUFycmF5S2V5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSwgbWVtbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlZXAgT2JqZWN0LmFzc2lnbi5cbiAgICAgKi9cbiAgICBPcm1VdGlscy5tZXJnZURlZXAgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzb3VyY2VzXzEgPSBfX3ZhbHVlcyhzb3VyY2VzKSwgc291cmNlc18xXzEgPSBzb3VyY2VzXzEubmV4dCgpOyAhc291cmNlc18xXzEuZG9uZTsgc291cmNlc18xXzEgPSBzb3VyY2VzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlKHRhcmdldCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNfMV8xICYmICFzb3VyY2VzXzFfMS5kb25lICYmIChfYSA9IHNvdXJjZXNfMS5yZXR1cm4pKSBfYS5jYWxsKHNvdXJjZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlZXAgY29tcGFyZSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTQ0MjQ5XG4gICAgICovXG4gICAgT3JtVXRpbHMuZGVlcENvbXBhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGksIGwsIGxlZnRDaGFpbiwgcmlnaHRDaGFpbjtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRGllIHNpbGVudGx5PyBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgc3VjaCBjYXNlLCBwbGVhc2UgaGVscC4uLlxuICAgICAgICAgICAgLy8gdGhyb3cgXCJOZWVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyB0byBjb21wYXJlXCI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGxlZnRDaGFpbiA9IFtdOyAvLyBUb2RvOiB0aGlzIGNhbiBiZSBjYWNoZWRcbiAgICAgICAgICAgIHJpZ2h0Q2hhaW4gPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb21wYXJlMk9iamVjdHMobGVmdENoYWluLCByaWdodENoYWluLCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0d28gZW50aXR5LWlkLW1hcHMgYXJlIHRoZSBzYW1lXG4gICAgICovXG4gICAgT3JtVXRpbHMuY29tcGFyZUlkcyA9IGZ1bmN0aW9uIChmaXJzdElkLCBzZWNvbmRJZCkge1xuICAgICAgICBpZiAoZmlyc3RJZCA9PT0gdW5kZWZpbmVkIHx8IGZpcnN0SWQgPT09IG51bGwgfHwgc2Vjb25kSWQgPT09IHVuZGVmaW5lZCB8fCBzZWNvbmRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gT3B0aW1pemVkIHZlcnNpb24gZm9yIHRoZSBjb21tb24gY2FzZVxuICAgICAgICBpZiAoKCh0eXBlb2YgZmlyc3RJZC5pZCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Ygc2Vjb25kSWQuaWQgPT09IFwic3RyaW5nXCIpIHx8XG4gICAgICAgICAgICAodHlwZW9mIGZpcnN0SWQuaWQgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHNlY29uZElkLmlkID09PSBcIm51bWJlclwiKSkgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpcnN0SWQpLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2Vjb25kSWQpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0SWQuaWQgPT09IHNlY29uZElkLmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcm1VdGlscy5kZWVwQ29tcGFyZShmaXJzdElkLCBzZWNvbmRJZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGdpdmVuIHZhbHVlIGludG8gYm9vbGVhbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBPcm1VdGlscy50b0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcIjFcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+IDA7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXBvc2VzIGFuIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBrZXlzIGFuZCB2YWx1ZXMuXG4gICAgICovXG4gICAgT3JtVXRpbHMuemlwT2JqZWN0ID0gZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKG9iamVjdCwgY29sdW1uLCBpbmRleCkge1xuICAgICAgICAgICAgb2JqZWN0W2NvbHVtbl0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIGFycmF5cy5cbiAgICAgKi9cbiAgICBPcm1VdGlscy5pc0FycmF5c0VxdWFsID0gZnVuY3Rpb24gKGFycjEsIGFycjIpIHtcbiAgICAgICAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnIyLmluZGV4T2YoZWxlbWVudCkgIT09IC0xO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLmFyZU11dHVhbGx5RXhjbHVzaXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlzdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGxpc3RzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhdmVTaGFyZWRPYmplY3RzID0gbGlzdHMuc29tZShmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgdmFyIG90aGVyTGlzdHMgPSBsaXN0cy5maWx0ZXIoZnVuY3Rpb24gKG90aGVyTGlzdCkgeyByZXR1cm4gb3RoZXJMaXN0ICE9PSBsaXN0OyB9KTtcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIG90aGVyTGlzdHMuc29tZShmdW5jdGlvbiAob3RoZXJMaXN0KSB7IHJldHVybiBvdGhlckxpc3QuaW5jbHVkZXMoaXRlbSk7IH0pOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhaGF2ZVNoYXJlZE9iamVjdHM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIE9ybVV0aWxzLmNvbXBhcmUyT2JqZWN0cyA9IGZ1bmN0aW9uIChsZWZ0Q2hhaW4sIHJpZ2h0Q2hhaW4sIHgsIHkpIHtcbiAgICAgICAgdmFyIHA7XG4gICAgICAgIC8vIHJlbWVtYmVyIHRoYXQgTmFOID09PSBOYU4gcmV0dXJucyBmYWxzZVxuICAgICAgICAvLyBhbmQgaXNOYU4odW5kZWZpbmVkKSByZXR1cm5zIHRydWVcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih4KSAmJiBOdW1iZXIuaXNOYU4oeSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQ29tcGFyZSBwcmltaXRpdmVzIGFuZCBmdW5jdGlvbnMuXG4gICAgICAgIC8vIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGxpbmsgdG8gdGhlIHNhbWUgb2JqZWN0LlxuICAgICAgICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgc3RlcCB3aGVyZSB3ZSBjb21wYXJlIHByb3RvdHlwZXNcbiAgICAgICAgaWYgKHggPT09IHkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gVW5lcXVhbCwgYnV0IGVpdGhlciBpcyBudWxsIG9yIHVuZGVmaW5lZCAodXNlIGNhc2U6IGpzb25iIGNvbXBhcmFzaW9uKVxuICAgICAgICAvLyBQUiAjMzc3NiwgdG9kbzogYWRkIHRlc3RzXG4gICAgICAgIGlmICh4ID09PSBudWxsIHx8IHkgPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gRml4IHRoZSBidWZmZXIgY29tcGFyZSBidWcuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3R5cGVvcm0vdHlwZW9ybS9pc3N1ZXMvMzY1NFxuICAgICAgICBpZiAoKHR5cGVvZiB4LmVxdWFscyA9PT0gXCJmdW5jdGlvblwiIHx8IHguZXF1YWxzIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmIHguZXF1YWxzKHkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIFdvcmtzIGluIGNhc2Ugd2hlbiBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgaW4gY29uc3RydWN0b3IuXG4gICAgICAgIC8vIENvbXBhcmluZyBkYXRlcyBpcyBhIGNvbW1vbiBzY2VuYXJpby4gQW5vdGhlciBidWlsdC1pbnM/XG4gICAgICAgIC8vIFdlIGNhbiBldmVuIGhhbmRsZSBmdW5jdGlvbnMgcGFzc2VkIGFjcm9zcyBpZnJhbWVzXG4gICAgICAgIGlmICgodHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiKSB8fFxuICAgICAgICAgICAgKHggaW5zdGFuY2VvZiBEYXRlICYmIHkgaW5zdGFuY2VvZiBEYXRlKSB8fFxuICAgICAgICAgICAgKHggaW5zdGFuY2VvZiBSZWdFeHAgJiYgeSBpbnN0YW5jZW9mIFJlZ0V4cCkgfHxcbiAgICAgICAgICAgICh4IGluc3RhbmNlb2YgU3RyaW5nICYmIHkgaW5zdGFuY2VvZiBTdHJpbmcpIHx8XG4gICAgICAgICAgICAoeCBpbnN0YW5jZW9mIE51bWJlciAmJiB5IGluc3RhbmNlb2YgTnVtYmVyKSlcbiAgICAgICAgICAgIHJldHVybiB4LnRvU3RyaW5nKCkgPT09IHkudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gQXQgbGFzdCBjaGVja2luZyBwcm90b3R5cGVzIGFzIGdvb2QgYXMgd2UgY2FuXG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QgJiYgeSBpbnN0YW5jZW9mIE9iamVjdCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh4LmlzUHJvdG90eXBlT2YoeSkgfHwgeS5pc1Byb3RvdHlwZU9mKHgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHgucHJvdG90eXBlICE9PSB5LnByb3RvdHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGluZmluaXRpdmUgbGlua2luZyBsb29wc1xuICAgICAgICBpZiAobGVmdENoYWluLmluZGV4T2YoeCkgPiAtMSB8fCByaWdodENoYWluLmluZGV4T2YoeSkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gUXVpY2sgY2hlY2tpbmcgb2Ygb25lIG9iamVjdCBiZWluZyBhIHN1YnNldCBvZiBhbm90aGVyLlxuICAgICAgICAvLyB0b2RvOiBjYWNoZSB0aGUgc3RydWN0dXJlIG9mIGFyZ3VtZW50c1swXSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgZm9yIChwIGluIHkpIHtcbiAgICAgICAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICE9PSB4Lmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHlbcF0gIT09IHR5cGVvZiB4W3BdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocCBpbiB4KSB7XG4gICAgICAgICAgICBpZiAoeS5oYXNPd25Qcm9wZXJ0eShwKSAhPT0geC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB5W3BdICE9PSB0eXBlb2YgeFtwXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mICh4W3BdKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgbGVmdENoYWluLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2hhaW4ucHVzaCh5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBhcmUyT2JqZWN0cyhsZWZ0Q2hhaW4sIHJpZ2h0Q2hhaW4sIHhbcF0sIHlbcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGVmdENoYWluLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICByaWdodENoYWluLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoeFtwXSAhPT0geVtwXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIE9ybVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IE9ybVV0aWxzIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9ybVV0aWxzLmpzLm1hcFxuIiwidmFyIFJhbmRvbUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5kb21HZW5lcmF0b3IoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc2hhMS9cbiAgICAgKiBvcmlnaW5hbCBieTogV2VidG9vbGtpdC5pbmZvIChodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby8pXG4gICAgICogaW1wcm92ZWQgYnk6IE1pY2hhZWwgV2hpdGUgKGh0dHA6Ly9nZXRzcHJpbmsuY29tKVxuICAgICAqIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuICAgICAqICAgIGlucHV0IGJ5OiBCcmV0dCBaYW1pciAoaHR0cDovL2JyZXR0LXphbWlyLm1lKVxuICAgICAqICAgICAgbm90ZSAxOiBLZWVwIGluIG1pbmQgdGhhdCBpbiBhY2NvcmRhbmNlIHdpdGggUEhQLCB0aGUgd2hvbGUgc3RyaW5nIGlzIGJ1ZmZlcmVkIGFuZCB0aGVuXG4gICAgICogICAgICBub3RlIDE6IGhhc2hlZC4gSWYgYXZhaWxhYmxlLCB3ZSdkIHJlY29tbWVuZCB1c2luZyBOb2RlJ3MgbmF0aXZlIGNyeXB0byBtb2R1bGVzIGRpcmVjdGx5XG4gICAgICogICAgICBub3RlIDE6IGluIGEgc3RlYW1pbmcgZmFzaGlvbiBmb3IgZmFzdGVyIGFuZCBtb3JlIGVmZmljaWVudCBoYXNoaW5nXG4gICAgICogICBleGFtcGxlIDE6IHNoYTEoJ0tldmluIHZhbiBab25uZXZlbGQnKVxuICAgICAqICAgcmV0dXJucyAxOiAnNTQ5MTZkMmU2MmY2NWIzYWZhNmUxOTJlNmE2MDFjZGJlNWNiNTg5NydcbiAgICAgKi9cbiAgICBSYW5kb21HZW5lcmF0b3Iuc2hhMSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgdmFyIF9yb3RMZWZ0ID0gZnVuY3Rpb24gKG4sIHMpIHtcbiAgICAgICAgICAgIHZhciB0NCA9IChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKTtcbiAgICAgICAgICAgIHJldHVybiB0NDtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIF9jdnRIZXggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHYgPSAodmFsID4+PiAoaSAqIDQpKSAmIDB4MGY7XG4gICAgICAgICAgICAgICAgc3RyICs9IHYudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGJsb2Nrc3RhcnQ7XG4gICAgICAgIHZhciBpLCBqO1xuICAgICAgICB2YXIgVyA9IG5ldyBBcnJheSg4MCk7XG4gICAgICAgIHZhciBIMCA9IDB4Njc0NTIzMDE7XG4gICAgICAgIHZhciBIMSA9IDB4RUZDREFCODk7XG4gICAgICAgIHZhciBIMiA9IDB4OThCQURDRkU7XG4gICAgICAgIHZhciBIMyA9IDB4MTAzMjU0NzY7XG4gICAgICAgIHZhciBINCA9IDB4QzNEMkUxRjA7XG4gICAgICAgIHZhciBBLCBCLCBDLCBELCBFO1xuICAgICAgICB2YXIgdGVtcDtcbiAgICAgICAgLy8gdXRmOF9lbmNvZGVcbiAgICAgICAgc3RyID0gLyp1bmVzY2FwZSovIChlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG4gICAgICAgIHZhciBzdHJMZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICB2YXIgd29yZEFycmF5ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW4gLSAzOyBpICs9IDQpIHtcbiAgICAgICAgICAgIGogPSBzdHIuY2hhckNvZGVBdChpKSA8PCAyNCB8XG4gICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoaSArIDEpIDw8IDE2IHxcbiAgICAgICAgICAgICAgICBzdHIuY2hhckNvZGVBdChpICsgMikgPDwgOCB8XG4gICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoaSArIDMpO1xuICAgICAgICAgICAgd29yZEFycmF5LnB1c2goaik7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChzdHJMZW4gJSA0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaSA9IDB4MDgwMDAwMDAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGkgPSBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PCAyNCB8IDB4MDgwMDAwMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpID0gc3RyLmNoYXJDb2RlQXQoc3RyTGVuIC0gMikgPDwgMjQgfCBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PCAxNiB8IDB4MDgwMDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgaSA9IHN0ci5jaGFyQ29kZUF0KHN0ckxlbiAtIDMpIDw8IDI0IHxcbiAgICAgICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoc3RyTGVuIC0gMikgPDwgMTYgfFxuICAgICAgICAgICAgICAgICAgICBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PFxuICAgICAgICAgICAgICAgICAgICAgICAgOCB8IDB4ODA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgd29yZEFycmF5LnB1c2goaSk7XG4gICAgICAgIHdoaWxlICgod29yZEFycmF5Lmxlbmd0aCAlIDE2KSAhPT0gMTQpIHtcbiAgICAgICAgICAgIHdvcmRBcnJheS5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIHdvcmRBcnJheS5wdXNoKHN0ckxlbiA+Pj4gMjkpO1xuICAgICAgICB3b3JkQXJyYXkucHVzaCgoc3RyTGVuIDw8IDMpICYgMHgwZmZmZmZmZmYpO1xuICAgICAgICBmb3IgKGJsb2Nrc3RhcnQgPSAwOyBibG9ja3N0YXJ0IDwgd29yZEFycmF5Lmxlbmd0aDsgYmxvY2tzdGFydCArPSAxNikge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBXW2ldID0gd29yZEFycmF5W2Jsb2Nrc3RhcnQgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDE2OyBpIDw9IDc5OyBpKyspIHtcbiAgICAgICAgICAgICAgICBXW2ldID0gX3JvdExlZnQoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBBID0gSDA7XG4gICAgICAgICAgICBCID0gSDE7XG4gICAgICAgICAgICBDID0gSDI7XG4gICAgICAgICAgICBEID0gSDM7XG4gICAgICAgICAgICBFID0gSDQ7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDE5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKChCICYgQykgfCAofkIgJiBEKSkgKyBFICsgV1tpXSArIDB4NUE4Mjc5OTkpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDIwOyBpIDw9IDM5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKEIgXiBDIF4gRCkgKyBFICsgV1tpXSArIDB4NkVEOUVCQTEpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDQwOyBpIDw9IDU5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKChCICYgQykgfCAoQiAmIEQpIHwgKEMgJiBEKSkgKyBFICsgV1tpXSArIDB4OEYxQkJDREMpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDYwOyBpIDw9IDc5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKEIgXiBDIF4gRCkgKyBFICsgV1tpXSArIDB4Q0E2MkMxRDYpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEgwID0gKEgwICsgQSkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgxID0gKEgxICsgQikgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgyID0gKEgyICsgQykgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgzID0gKEgzICsgRCkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEg0ID0gKEg0ICsgRSkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wID0gX2N2dEhleChIMCkgKyBfY3Z0SGV4KEgxKSArIF9jdnRIZXgoSDIpICsgX2N2dEhleChIMykgKyBfY3Z0SGV4KEg0KTtcbiAgICAgICAgcmV0dXJuIHRlbXAudG9Mb3dlckNhc2UoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJGQzQxMjIgY29tcGxpYW50IFVVSUQgdjQgZ2VuZXJhdG9yLlxuICAgICAqL1xuICAgIFJhbmRvbUdlbmVyYXRvci51dWlkNCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gXCJ4XCIgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSYW5kb21HZW5lcmF0b3I7XG59KCkpO1xuZXhwb3J0IHsgUmFuZG9tR2VuZXJhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmRvbUdlbmVyYXRvci5qcy5tYXBcbiIsImltcG9ydCBzaGFqcyBmcm9tIFwic2hhLmpzXCI7XG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBpbnRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjk3MDUyNS9jb252ZXJ0aW5nLWFueS1zdHJpbmctaW50by1jYW1lbC1jYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyLCBmaXJzdENhcGl0YWwpIHtcbiAgICBpZiAoZmlyc3RDYXBpdGFsID09PSB2b2lkIDApIHsgZmlyc3RDYXBpdGFsID0gZmFsc2U7IH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL14oW0EtWl0pfFtcXHMtX10oXFx3KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHAxLCBwMiwgb2Zmc2V0KSB7XG4gICAgICAgIGlmIChmaXJzdENhcGl0YWwgPT09IHRydWUgJiYgb2Zmc2V0ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHAxO1xuICAgICAgICBpZiAocDIpXG4gICAgICAgICAgICByZXR1cm4gcDIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIHAxLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBpbnRvIHNuYWtlX2Nhc2UuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gc25ha2VDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLy8gQUJjIC0+IGFfYmNcbiAgICAgICAgLnJlcGxhY2UoLyhbQS1aXSkoW0EtWl0pKFthLXpdKS9nLCBcIiQxXyQyJDNcIilcbiAgICAgICAgLy8gYUMgLT4gYV9jXG4gICAgICAgIC5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgaW50byBUaXRsZSBDYXNlLlxuICpcbiAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTY5NzIvY29udmVydC1zdHJpbmctdG8tdGl0bGUtY2FzZS13aXRoLWphdmFzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpdGxlQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkgeyByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpOyB9KTtcbn1cbi8qKlxuICogQnVpbGRzIGFiYnJldmlhdGVkIHN0cmluZyBmcm9tIGdpdmVuIHN0cmluZztcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFiYnJldmlhdGUoc3RyLCBhYmJyTGV0dGVyc0NvdW50KSB7XG4gICAgaWYgKGFiYnJMZXR0ZXJzQ291bnQgPT09IHZvaWQgMCkgeyBhYmJyTGV0dGVyc0NvdW50ID0gMTsgfVxuICAgIHZhciB3b3JkcyA9IHN0ci5yZXBsYWNlKC8oW2EtelxceEUwLVxceEZGXSkoW0EtWlxceEMwXFx4REZdKS9nLCBcIiQxICQyXCIpLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gd29yZHMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIHdvcmQpIHtcbiAgICAgICAgcmVzICs9IHdvcmQuc3Vic3RyKDAsIGFiYnJMZXR0ZXJzQ291bnQpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIFwiXCIpO1xufVxuLyoqXG4gKiBTaG9ydGVuIGEgZ2l2ZW4gYGlucHV0YC4gVXNlZnVsIGZvciBSREJNUyBpbXBvc2luZyBhIGxpbWl0IG9uIHRoZVxuICogbWF4aW11bSBsZW5ndGggb2YgYWxpYXNlcyBhbmQgY29sdW1uIG5hbWVzIGluIFNRTCBxdWVyaWVzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gYmUgc2hvcnRlbmVkLlxuICogQHBhcmFtIG9wdGlvbnMgRGVmYXVsdCB0byBgNGAgZm9yIHNlZ21lbnRzIGxlbmd0aCwgYDJgIGZvciB0ZXJtcyBsZW5ndGgsIGAnX18nYCBhcyBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcmV0dXJuIFNob3J0ZW5lZCBgaW5wdXRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyByZXR1cm5zOiBcIlVzU2hDYV9fb3JkZV9fbWFya19fZGlyZVwiXG4gKiBzaG9ydGVuKCdVc2VyU2hvcHBpbmdDYXJ0X19vcmRlcl9fbWFya2V0X19kaXJlY3RvcicpXG4gKlxuICogLy8gcmV0dXJuczogXCJjYXRfd2l0X3Zlcl9sb25fbmFtX3Bvc193aXRfdmVyX2xvbl9uYW1fcG9zX3dpdF92ZXJfbG9uX25hbVwiXG4gKiBzaG9ydGVuKFxuICogICAnY2F0ZWdvcnlfd2l0aF92ZXJ5X2xvbmdfbmFtZV9wb3N0c193aXRoX3ZlcnlfbG9uZ19uYW1lX3Bvc3Rfd2l0aF92ZXJ5X2xvbmdfbmFtZScsXG4gKiAgIHsgc2VwYXJhdG9yOiAnXycsIHNlZ21lbnRMZW5ndGg6IDMgfVxuICogKVxuICpcbiAqIC8vIGVxdWFsczogVXNTaENhX19vcmRlX19tYXJrX21hcmtldF9pZFxuICogYCR7c2hvcnRlbignVXNlclNob3BwaW5nQ2FydF9fb3JkZXJfX21hcmtldCcpfV9tYXJrZXRfaWRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydGVuKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgX2EgPSBvcHRpb25zLnNlZ21lbnRMZW5ndGgsIHNlZ21lbnRMZW5ndGggPSBfYSA9PT0gdm9pZCAwID8gNCA6IF9hLCBfYiA9IG9wdGlvbnMuc2VwYXJhdG9yLCBzZXBhcmF0b3IgPSBfYiA9PT0gdm9pZCAwID8gXCJfX1wiIDogX2IsIF9jID0gb3B0aW9ucy50ZXJtTGVuZ3RoLCB0ZXJtTGVuZ3RoID0gX2MgPT09IHZvaWQgMCA/IDIgOiBfYztcbiAgICB2YXIgc2VnbWVudHMgPSBpbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xuICAgIHZhciBzaG9ydFNlZ21lbnRzID0gc2VnbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHZhbCkge1xuICAgICAgICAvLyBzcGxpdCB0aGUgZ2l2ZW4gc2VnbWVudCBpbnRvIG1hbnkgdGVybXMgYmFzZWQgb24gYW4gZXZlbnR1YWwgY2FtZWwgY2FzZWQgbmFtZVxuICAgICAgICB2YXIgc2VnbWVudFRlcm1zID0gdmFsLnJlcGxhY2UoLyhbYS16XFx4RTAtXFx4RkZdKShbQS1aXFx4QzAtXFx4REZdKS9nLCBcIiQxICQyXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgLy8gXCJPcmRlckl0ZW1MaXN0XCIgYmVjb21lcyBcIk9ySXRMaVwiLCB3aGlsZSBcImNvbXBhbnlcIiBiZWNvbWVzIFwiY29tcFwiXG4gICAgICAgIHZhciBsZW5ndGggPSBzZWdtZW50VGVybXMubGVuZ3RoID4gMSA/IHRlcm1MZW5ndGggOiBzZWdtZW50TGVuZ3RoO1xuICAgICAgICB2YXIgc2hvcnRTZWdtZW50ID0gc2VnbWVudFRlcm1zLm1hcChmdW5jdGlvbiAodGVybSkgeyByZXR1cm4gdGVybS5zdWJzdHIoMCwgbGVuZ3RoKTsgfSkuam9pbihcIlwiKTtcbiAgICAgICAgYWNjLnB1c2goc2hvcnRTZWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHNob3J0U2VnbWVudHMuam9pbihzZXBhcmF0b3IpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgaGFzaGVkIGlucHV0LlxuICpcbiAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gYmUgaGFzaGVkLlxuICogQHBhcmFtIG9wdGlvbnMubGVuZ3RoIE9wdGlvbmFsbHksIHNob3J0ZW4gdGhlIG91dHB1dCB0byBkZXNpcmVkIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBoYXNoRnVuY3Rpb24gPSBzaGFqcyhcInNoYTI1NlwiKTtcbiAgICBoYXNoRnVuY3Rpb24udXBkYXRlKGlucHV0LCBcInV0ZjhcIik7XG4gICAgdmFyIGhhc2hlZElucHV0ID0gaGFzaEZ1bmN0aW9uLmRpZ2VzdChcImhleFwiKTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hlZElucHV0LnNsaWNlKDAsIG9wdGlvbnMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZElucHV0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdVdGlscy5qcy5tYXBcbiIsInZhciBWZXJzaW9uVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmVyc2lvblV0aWxzKCkge1xuICAgIH1cbiAgICBWZXJzaW9uVXRpbHMuaXNHcmVhdGVyT3JFcXVhbCA9IGZ1bmN0aW9uICh2ZXJzaW9uLCB0YXJnZXRWZXJzaW9uKSB7XG4gICAgICAgIHZhciB2MSA9IHBhcnNlVmVyc2lvbih2ZXJzaW9uKTtcbiAgICAgICAgdmFyIHYyID0gcGFyc2VWZXJzaW9uKHRhcmdldFZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdjFbMF0gPiB2MlswXSB8fFxuICAgICAgICAgICAgdjFbMF0gPT09IHYyWzBdICYmIHYxWzFdID4gdjJbMV0gfHxcbiAgICAgICAgICAgIHYxWzBdID09PSB2MlswXSAmJiB2MVsxXSA9PT0gdjJbMV0gJiYgdjFbMl0gPj0gdjJbMl07XG4gICAgfTtcbiAgICByZXR1cm4gVmVyc2lvblV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFZlcnNpb25VdGlscyB9O1xuZnVuY3Rpb24gcGFyc2VWZXJzaW9uKHZlcnNpb24pIHtcbiAgICBpZiAodmVyc2lvbiA9PT0gdm9pZCAwKSB7IHZlcnNpb24gPSBcIlwiOyB9XG4gICAgdmFyIHYgPSBbMCwgMCwgMF07XG4gICAgdmVyc2lvbi5zcGxpdChcIi5cIikuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHsgcmV0dXJuIHZbaV0gPSBwYXJzZUludCh2YWx1ZSwgMTApOyB9KTtcbiAgICByZXR1cm4gdjtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VmVyc2lvblV0aWxzLmpzLm1hcFxuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcblxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuXG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cblxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gdXNlVW5jb250cm9sbGVkUHJvcChwcm9wVmFsdWUsIGRlZmF1bHRWYWx1ZSwgaGFuZGxlcikge1xuICB2YXIgd2FzUHJvcFJlZiA9IHVzZVJlZihwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgICBzdGF0ZVZhbHVlID0gX3VzZVN0YXRlWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfdXNlU3RhdGVbMV07XG5cbiAgdmFyIGlzUHJvcCA9IHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgd2FzUHJvcCA9IHdhc1Byb3BSZWYuY3VycmVudDtcbiAgd2FzUHJvcFJlZi5jdXJyZW50ID0gaXNQcm9wO1xuICAvKipcbiAgICogSWYgYSBwcm9wIHN3aXRjaGVzIGZyb20gY29udHJvbGxlZCB0byBVbmNvbnRyb2xsZWRcbiAgICogcmVzZXQgaXRzIHZhbHVlIHRvIHRoZSBkZWZhdWx0VmFsdWVcbiAgICovXG5cbiAgaWYgKCFpc1Byb3AgJiYgd2FzUHJvcCAmJiBzdGF0ZVZhbHVlICE9PSBkZWZhdWx0VmFsdWUpIHtcbiAgICBzZXRTdGF0ZShkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIFtpc1Byb3AgPyBwcm9wVmFsdWUgOiBzdGF0ZVZhbHVlLCB1c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlcikgaGFuZGxlci5hcHBseSh2b2lkIDAsIFt2YWx1ZV0uY29uY2F0KGFyZ3MpKTtcbiAgICBzZXRTdGF0ZSh2YWx1ZSk7XG4gIH0sIFtoYW5kbGVyXSldO1xufVxuXG5leHBvcnQgeyB1c2VVbmNvbnRyb2xsZWRQcm9wIH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVbmNvbnRyb2xsZWQocHJvcHMsIGNvbmZpZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZmllbGROYW1lKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcmVmID0gcmVzdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBfcmVmW1V0aWxzLmRlZmF1bHRLZXkoZmllbGROYW1lKV0sXG4gICAgICAgIHByb3BzVmFsdWUgPSBfcmVmW2ZpZWxkTmFtZV0sXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbVXRpbHMuZGVmYXVsdEtleShmaWVsZE5hbWUpLCBmaWVsZE5hbWVdLm1hcChfdG9Qcm9wZXJ0eUtleSkpO1xuXG4gICAgdmFyIGhhbmRsZXJOYW1lID0gY29uZmlnW2ZpZWxkTmFtZV07XG5cbiAgICB2YXIgX3VzZVVuY29udHJvbGxlZFByb3AgPSB1c2VVbmNvbnRyb2xsZWRQcm9wKHByb3BzVmFsdWUsIGRlZmF1bHRWYWx1ZSwgcHJvcHNbaGFuZGxlck5hbWVdKSxcbiAgICAgICAgdmFsdWUgPSBfdXNlVW5jb250cm9sbGVkUHJvcFswXSxcbiAgICAgICAgaGFuZGxlciA9IF91c2VVbmNvbnRyb2xsZWRQcm9wWzFdO1xuXG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCByZXN0LCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltmaWVsZE5hbWVdID0gdmFsdWUsIF9leHRlbmRzMltoYW5kbGVyTmFtZV0gPSBoYW5kbGVyLCBfZXh0ZW5kczIpKTtcbiAgfSwgcHJvcHMpO1xufSIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlVW5jb250cm9sbGVkLCB1c2VVbmNvbnRyb2xsZWRQcm9wIH0gZnJvbSAnLi9ob29rJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jb250cm9sbGFibGUgfSBmcm9tICcuL3VuY29udHJvbGxhYmxlJzsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG52YXIgX2pzeEZpbGVOYW1lID0gXCIvVXNlcnMvanF1ZW5zZS9zcmMvdW5jb250cm9sbGFibGUvc3JjL3VuY29udHJvbGxhYmxlLmpzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcG9seWZpbGwgfSBmcm9tICdyZWFjdC1saWZlY3ljbGVzLWNvbXBhdCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVuY29udHJvbGxhYmxlKENvbXBvbmVudCwgY29udHJvbGxlZFZhbHVlcywgbWV0aG9kcykge1xuICBpZiAobWV0aG9kcyA9PT0gdm9pZCAwKSB7XG4gICAgbWV0aG9kcyA9IFtdO1xuICB9XG5cbiAgdmFyIGRpc3BsYXlOYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB2YXIgY2FuQWNjZXB0UmVmID0gVXRpbHMuY2FuQWNjZXB0UmVmKENvbXBvbmVudCk7XG4gIHZhciBjb250cm9sbGVkUHJvcHMgPSBPYmplY3Qua2V5cyhjb250cm9sbGVkVmFsdWVzKTtcbiAgdmFyIFBST1BTX1RPX09NSVQgPSBjb250cm9sbGVkUHJvcHMubWFwKFV0aWxzLmRlZmF1bHRLZXkpO1xuICAhKGNhbkFjY2VwdFJlZiB8fCAhbWV0aG9kcy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnW3VuY29udHJvbGxhYmxlXSBzdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgcGFzcyB0aHJvdWdoIG1ldGhvZHMgJyArICdiZWNhdXNlIHRoZXkgaGF2ZSBubyBhc3NvY2lhdGVkIGluc3RhbmNlcy4gQ2hlY2sgY29tcG9uZW50OiAnICsgZGlzcGxheU5hbWUgKyAnLCAnICsgJ2F0dGVtcHRpbmcgdG8gcGFzcyB0aHJvdWdoIG1ldGhvZHM6ICcgKyBtZXRob2RzLmpvaW4oJywgJykpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICB2YXIgVW5jb250cm9sbGVkQ29tcG9uZW50ID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFVuY29udHJvbGxlZENvbXBvbmVudCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBVbmNvbnRyb2xsZWRDb21wb25lbnQoKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgICAgX3RoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHZhciBoYW5kbGVyTmFtZSA9IGNvbnRyb2xsZWRWYWx1ZXNbcHJvcE5hbWVdO1xuXG4gICAgICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHNbaGFuZGxlck5hbWVdKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcylbaGFuZGxlck5hbWVdLmFwcGx5KF90aGlzJHByb3BzLCBbdmFsdWVdLmNvbmNhdChhcmdzKSk7XG5cbiAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIV90aGlzLnVubW91bnRlZCkgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBfcmVmLnZhbHVlcztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlczogX2V4dGVuZHMoT2JqZWN0LmNyZWF0ZShudWxsKSwgdmFsdWVzLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltwcm9wTmFtZV0gPSB2YWx1ZSwgX2V4dGVuZHMyKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuaGFuZGxlcnNbaGFuZGxlck5hbWVdID0gaGFuZGxlQ2hhbmdlO1xuICAgICAgfSk7XG4gICAgICBpZiAobWV0aG9kcy5sZW5ndGgpIF90aGlzLmF0dGFjaFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgX3RoaXMuaW5uZXIgPSByZWY7XG4gICAgICB9O1xuICAgICAgdmFyIHZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb250cm9sbGVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhbHVlc1trZXldID0gX3RoaXMucHJvcHNbVXRpbHMuZGVmYXVsdEtleShrZXkpXTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICBwcmV2UHJvcHM6IHt9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBVbmNvbnRyb2xsZWRDb21wb25lbnQucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgIC8vbGV0IHNldFN0YXRlIHRyaWdnZXIgdGhlIHVwZGF0ZVxuICAgICAgcmV0dXJuICF0aGlzLl9ub3RpZnlpbmc7XG4gICAgfTtcblxuICAgIFVuY29udHJvbGxlZENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgdmFsdWVzID0gX3JlZjIudmFsdWVzLFxuICAgICAgICAgIHByZXZQcm9wcyA9IF9yZWYyLnByZXZQcm9wcztcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIHZhbHVlczogX2V4dGVuZHMoT2JqZWN0LmNyZWF0ZShudWxsKSwgdmFsdWVzKSxcbiAgICAgICAgcHJldlByb3BzOiB7fVxuICAgICAgfTtcbiAgICAgIGNvbnRyb2xsZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGEgcHJvcCBzd2l0Y2hlcyBmcm9tIGNvbnRyb2xsZWQgdG8gVW5jb250cm9sbGVkXG4gICAgICAgICAqIHJlc2V0IGl0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdFZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICBuZXh0U3RhdGUucHJldlByb3BzW2tleV0gPSBwcm9wc1trZXldO1xuXG4gICAgICAgIGlmICghVXRpbHMuaXNQcm9wKHByb3BzLCBrZXkpICYmIFV0aWxzLmlzUHJvcChwcmV2UHJvcHMsIGtleSkpIHtcbiAgICAgICAgICBuZXh0U3RhdGUudmFsdWVzW2tleV0gPSBwcm9wc1tVdGlscy5kZWZhdWx0S2V5KGtleSldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGlubmVyUmVmID0gX3RoaXMkcHJvcHMyLmlubmVyUmVmLFxuICAgICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMyLCBbXCJpbm5lclJlZlwiXSk7XG5cbiAgICAgIFBST1BTX1RPX09NSVQuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBkZWxldGUgcHJvcHNbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBfdGhpczIucHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICBuZXdQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCA/IHByb3BWYWx1ZSA6IF90aGlzMi5zdGF0ZS52YWx1ZXNbcHJvcE5hbWVdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCBwcm9wcywgbmV3UHJvcHMsIHRoaXMuaGFuZGxlcnMsIHtcbiAgICAgICAgcmVmOiBpbm5lclJlZiB8fCB0aGlzLmF0dGFjaFJlZlxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gVW5jb250cm9sbGVkQ29tcG9uZW50O1xuICB9KFJlYWN0LkNvbXBvbmVudCk7XG5cbiAgcG9seWZpbGwoVW5jb250cm9sbGVkQ29tcG9uZW50KTtcbiAgVW5jb250cm9sbGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gXCJVbmNvbnRyb2xsZWQoXCIgKyBkaXNwbGF5TmFtZSArIFwiKVwiO1xuICBVbmNvbnRyb2xsZWRDb21wb25lbnQucHJvcFR5cGVzID0gX2V4dGVuZHMoe1xuICAgIGlubmVyUmVmOiBmdW5jdGlvbiBpbm5lclJlZigpIHt9XG4gIH0sIFV0aWxzLnVuY29udHJvbGxlZFByb3BUeXBlcyhjb250cm9sbGVkVmFsdWVzLCBkaXNwbGF5TmFtZSkpO1xuICBtZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIFVuY29udHJvbGxlZENvbXBvbmVudC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICRwcm94aWVkTWV0aG9kKCkge1xuICAgICAgdmFyIF90aGlzJGlubmVyO1xuXG4gICAgICByZXR1cm4gKF90aGlzJGlubmVyID0gdGhpcy5pbm5lcilbbWV0aG9kXS5hcHBseShfdGhpcyRpbm5lciwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KTtcbiAgdmFyIFdyYXBwZWRDb21wb25lbnQgPSBVbmNvbnRyb2xsZWRDb21wb25lbnQ7XG5cbiAgaWYgKFJlYWN0LmZvcndhcmRSZWYpIHtcbiAgICBXcmFwcGVkQ29tcG9uZW50ID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVW5jb250cm9sbGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgaW5uZXJSZWY6IHJlZixcbiAgICAgICAgX19zb3VyY2U6IHtcbiAgICAgICAgICBmaWxlTmFtZTogX2pzeEZpbGVOYW1lLFxuICAgICAgICAgIGxpbmVOdW1iZXI6IDEyOFxuICAgICAgICB9LFxuICAgICAgICBfX3NlbGY6IHRoaXNcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgICBXcmFwcGVkQ29tcG9uZW50LnByb3BUeXBlcyA9IFVuY29udHJvbGxlZENvbXBvbmVudC5wcm9wVHlwZXM7XG4gIH1cblxuICBXcmFwcGVkQ29tcG9uZW50LkNvbnRyb2xsZWRDb21wb25lbnQgPSBDb21wb25lbnQ7XG4gIC8qKlxuICAgKiB1c2VmdWwgd2hlbiB3cmFwcGluZyBhIENvbXBvbmVudCBhbmQgeW91IHdhbnQgdG8gY29udHJvbFxuICAgKiBldmVyeXRoaW5nXG4gICAqL1xuXG4gIFdyYXBwZWRDb21wb25lbnQuZGVmZXJDb250cm9sVG8gPSBmdW5jdGlvbiAobmV3Q29tcG9uZW50LCBhZGRpdGlvbnMsIG5leHRNZXRob2RzKSB7XG4gICAgaWYgKGFkZGl0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBhZGRpdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5jb250cm9sbGFibGUobmV3Q29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgY29udHJvbGxlZFZhbHVlcywgYWRkaXRpb25zKSwgbmV4dE1ldGhvZHMpO1xuICB9O1xuXG4gIHJldHVybiBXcmFwcGVkQ29tcG9uZW50O1xufSIsImltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIHJlYWRPbmx5UHJvcFR5cGUoaGFuZGxlciwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSkge1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwcm9wc1toYW5kbGVyXSkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiWW91IGhhdmUgcHJvdmlkZWQgYSBgXCIgKyBwcm9wTmFtZSArIFwiYCBwcm9wIHRvIGBcIiArIG5hbWUgKyBcImAgXCIgKyAoXCJ3aXRob3V0IGFuIGBcIiArIGhhbmRsZXIgKyBcImAgaGFuZGxlciBwcm9wLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBcIikgKyAoXCJJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBcIiArIGRlZmF1bHRLZXkocHJvcE5hbWUpICsgXCJgLiBcIikgKyAoXCJPdGhlcndpc2UsIHNldCBgXCIgKyBoYW5kbGVyICsgXCJgLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5jb250cm9sbGVkUHJvcFR5cGVzKGNvbnRyb2xsZWRWYWx1ZXMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciBwcm9wVHlwZXMgPSB7fTtcbiAgT2JqZWN0LmtleXMoY29udHJvbGxlZFZhbHVlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIC8vIGFkZCBkZWZhdWx0IHByb3BUeXBlcyBmb3IgZm9sa3MgdGhhdCB1c2UgcnVudGltZSBjaGVja3NcbiAgICBwcm9wVHlwZXNbZGVmYXVsdEtleShwcm9wKV0gPSBub29wO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gY29udHJvbGxlZFZhbHVlc1twcm9wXTtcbiAgICAgICEodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnICYmIGhhbmRsZXIudHJpbSgpLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmNvbnRyb2xsYWJsZSAtIFslc106IHRoZSBwcm9wIGAlc2AgbmVlZHMgYSB2YWxpZCBoYW5kbGVyIGtleSBuYW1lIGluIG9yZGVyIHRvIG1ha2UgaXQgdW5jb250cm9sbGFibGUnLCBkaXNwbGF5TmFtZSwgcHJvcCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgcHJvcFR5cGVzW3Byb3BdID0gcmVhZE9ubHlQcm9wVHlwZShoYW5kbGVyLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHByb3BUeXBlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3AocHJvcHMsIHByb3ApIHtcbiAgcmV0dXJuIHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEtleShrZXkpIHtcbiAgcmV0dXJuICdkZWZhdWx0JyArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHIoMSk7XG59XG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbkFjY2VwdFJlZihjb21wb25lbnQpIHtcbiAgcmV0dXJuICEhY29tcG9uZW50ICYmICh0eXBlb2YgY29tcG9uZW50ICE9PSAnZnVuY3Rpb24nIHx8IGNvbXBvbmVudC5wcm90b3R5cGUgJiYgY29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn0iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIF9fREVWX18gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChfX0RFVl9fKSB7XG4gIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAxID8gbGVuIC0gMSA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDE7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMV0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG5cbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAgICdtZXNzYWdlIGFyZ3VtZW50J1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHByaW50V2FybmluZy5hcHBseShudWxsLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRnVuY3Rpb25Db21wb25lbnQsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSGlkZGVuSW5wdXQsIExpc3QgfSBmcm9tICdyZWFjdC1ib290c3RyYXAtbW9iaWxlJztcbmltcG9ydCB7IHVzZUFwcERpc3BhdGNoLCB1c2VBcHBTZWxlY3RvciB9IGZyb20gJy4uL1N0b3JlL3JlZHV4SG9va3MnO1xuaW1wb3J0IHsgcmVtb3ZlTWVtYmVyLCBzYXZlTWVtYmVyLCBzZWxlY3RNZW1iZXJzIH0gZnJvbSAnLi9wcmF5ZXJDaXJjbGVTbGljZSc7XG5pbXBvcnQgeyBNZW1iZXJUeXBlIH0gZnJvbSAnLi9NZW1iZXJUeXBlJztcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuXG50eXBlIFByb3BzID0ge307XG5cbmV4cG9ydCBjb25zdCBNZW1iZXJMaXN0OiBGdW5jdGlvbkNvbXBvbmVudDxQcm9wcz4gPSBSZWFjdC5tZW1vKCh7fSkgPT4ge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlQXBwRGlzcGF0Y2goKTtcbiAgICBjb25zdCBtZW1iZXJzID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzZWxlY3RNZW1iZXJzKHN0YXRlKSk7XG4gICAgbWVtYmVycy5wdXNoKHtcbiAgICAgICAgaWQ6IG5hbm9pZCgpLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgdXNlZEZvckJhbGFuY2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBrZXlFeHRyYWN0b3IgPSB1c2VDYWxsYmFjaygoaXRlbTogTWVtYmVyVHlwZSkgPT4gaXRlbS5pZCA/PyAndW5kZWZpbmVkJywgW10pO1xuICAgIGNvbnN0IHNhdmVDaGFuZ2VkTWVtYmVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAgICh7IGV4dHJhRGF0YTogbWVtYmVySWQsIHRhcmdldDogeyB2YWx1ZTogbmFtZSB9IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlTWVtYmVyKG1lbWJlcklkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU1lbWJlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbWVtYmVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNwYXRjaF1cbiAgICApO1xuXG4gICAgLy8gRWZmZWN0c1xuXG4gICAgLy8gT3RoZXJcblxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICBjb25zdCByZW5kZXJNZW1iZXIgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKG1lbWJlcjogTWVtYmVyVHlwZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8SGlkZGVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAga2V5PXttZW1iZXIuaWR9XG4gICAgICAgICAgICAgICAgICAgIG5vRm9jdXNIaW50PXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bWVtYmVyLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKyBBZGQgUGVyc29uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3NhdmVDaGFuZ2VkTWVtYmVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZURhdGE9e21lbWJlci5pZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgW3NhdmVDaGFuZ2VkTWVtYmVyXVxuICAgICk7XG5cbiAgICByZXR1cm4gPExpc3QgaXRlbXM9e21lbWJlcnN9IHJlbmRlckl0ZW09e3JlbmRlck1lbWJlcn0ga2V5RXh0cmFjdG9yPXtrZXlFeHRyYWN0b3J9IC8+O1xufSk7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUFwcERpc3BhdGNoLCB1c2VBcHBTZWxlY3RvciB9IGZyb20gJy4uL1N0b3JlL3JlZHV4SG9va3MnO1xuaW1wb3J0IHsgc2VsZWN0TWVtYmVySWRzLCBzZXRXZWVrIH0gZnJvbSAnLi9wcmF5ZXJDaXJjbGVTbGljZSc7XG5pbXBvcnQgeyBCb2R5LCBCdXR0b24sIENvbHVtbiwgQ29sdW1uQ2VsbERhdGEsIEZsZXgsIEdyb3csIFRhYmxlIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5pbXBvcnQgeyBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9QcmF5ZXJDaXJjbGVDYWxjdWxhdG9yJztcblxuZXhwb3J0IHR5cGUgUGFydG5lclRhYmxlUHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gUGFydG5lclRhYmxlKHt9OiBQYXJ0bmVyVGFibGVQcm9wcykge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IG1lbWJlcnNJZHMgPSB1c2VBcHBTZWxlY3Rvcigoc3RhdGUpID0+IHNlbGVjdE1lbWJlcklkcyhzdGF0ZSkpO1xuICAgIGNvbnN0IG1lbWJlcnMgPSB1c2VBcHBTZWxlY3Rvcigoc3RhdGUpID0+IHN0YXRlLnByYXllckNpcmNsZS5tZW1iZXJzKTtcbiAgICBjb25zdCB3ZWVrID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5wcmF5ZXJDaXJjbGUud2VlayA/PyAwKTtcbiAgICBjb25zdCB1c2VXZWVrZGF5cyA9IHVzZUFwcFNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUucHJheWVyQ2lyY2xlLnVzZVdlZWtkYXlzKTtcbiAgICBjb25zdCB1c2VQYXJ0bmVycyA9IHVzZUFwcFNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUucHJheWVyQ2lyY2xlLnVzZVBhcnRuZXJzKTtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZUFwcERpc3BhdGNoKCk7XG5cbiAgICBjb25zdCBjb2x1bW5zV2VlayA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW48c3RyaW5nPltdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1BhcnRuZXIgMScsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdwYXJ0bmVyMScsIC8vIGFjY2Vzc29yIGlzIHRoZSBcImtleVwiIGluIHRoZSBkYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1BhcnRuZXIgMicsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdwYXJ0bmVyMicsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCF1c2VQYXJ0bmVycykge1xuICAgICAgICAgICAgY29sdW1ucy5zcGxpY2UoMSwgMCwge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJycsXG4gICAgICAgICAgICAgICAgaWQ6ICdwcmF5aW5nVGl0bGVzJyxcbiAgICAgICAgICAgICAgICBDZWxsOiAoKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Qm9keSBibG9jaz17dHJ1ZX0+SWNoIGJldGUgZsO8cjwvQm9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCb2R5IGJsb2NrPXt0cnVlfSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRsO8ciBtaWNoIGJldGV0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbHVtbnNbMF0uQ2VsbCA9IChjZWxsRGF0YTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHBhcnRuZXIgPSBjZWxsRGF0YS52YWx1ZTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnY2VsbERhdGEnLCBjZWxsRGF0YSk7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIC8vICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDxCb2R5PntwYXJ0bmVyfTwvQm9keT5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHsvKiA8Qm9keT5JY2ggYmV0ZSBmw7xyPC9Cb2R5PiAqL31cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICA8Qm9keSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIEbDvHIgbWljaCBiZXRldFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIDwvQm9keT5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIC8vICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAvLyAgICAgKTtcbiAgICAgICAgICAgIC8vIH07XG5cbiAgICAgICAgICAgIGNvbHVtbnNbMl0uQ2VsbCA9ICh7IGNlbGw6IHsgY29sdW1uLCByb3cgfSwgdmFsdWU6IHBhcnRuZXIgfTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyID0gcm93Lm9yaWdpbmFsW2Ake2NvbHVtbi5pZH1PdGhlcmBdO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Qm9keSBibG9jaz17dHJ1ZX0+e3BhcnRuZXJ9PC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9IHByaW89XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3RoZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFt1c2VQYXJ0bmVyc10pO1xuXG4gICAgY29uc3QgY29sdW1uc1dlZWtkYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbjxzdHJpbmc+W10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnUGVyc29uJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ3BlcnNvbicsIC8vIGFjY2Vzc29yIGlzIHRoZSBcImtleVwiIGluIHRoZSBkYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ01vJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBIZWFkZXI6ICdEaScsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdkYXkxJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnTWknLFxuICAgICAgICAgICAgICAgIGFjY2Vzc29yOiAnZGF5MicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ0RvJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBIZWFkZXI6ICdGcicsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdkYXk0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnU2EnLFxuICAgICAgICAgICAgICAgIGFjY2Vzc29yOiAnZGF5NScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1NvJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCF1c2VQYXJ0bmVycykge1xuICAgICAgICAgICAgY29sdW1uc1swXS5DZWxsID0gKHsgdmFsdWU6IHBhcnRuZXIgfTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxGbGV4PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEdyb3c+e3BhcnRuZXJ9PC9Hcm93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEdyb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9PkljaCBiZXRlIGbDvHI8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9IHByaW89XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRsO8ciBtaWNoIGJldGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Hcm93PlxuICAgICAgICAgICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckZ1bmN0aW9uID0gKGNlbGxEYXRhOiBDb2x1bW5DZWxsRGF0YTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydG5lciA9IGNlbGxEYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyID0gY2VsbERhdGEuY2VsbC5yb3cub3JpZ2luYWxbYCR7Y2VsbERhdGEuY2VsbC5jb2x1bW4uaWR9T3RoZXJgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9PntwYXJ0bmVyfTwvQm9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCb2R5IGJsb2NrPXt0cnVlfSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge290aGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbHVtbnNbMV0uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICAgICAgY29sdW1uc1syXS5DZWxsID0gcmVuZGVyRnVuY3Rpb247XG4gICAgICAgICAgICBjb2x1bW5zWzNdLkNlbGwgPSByZW5kZXJGdW5jdGlvbjtcbiAgICAgICAgICAgIGNvbHVtbnNbNF0uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICAgICAgY29sdW1uc1s1XS5DZWxsID0gcmVuZGVyRnVuY3Rpb247XG4gICAgICAgICAgICBjb2x1bW5zWzZdLkNlbGwgPSByZW5kZXJGdW5jdGlvbjtcbiAgICAgICAgICAgIGNvbHVtbnNbN10uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFt1c2VQYXJ0bmVyc10pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBpbmNyZW1lbnRXZWVrID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goc2V0V2Vlayh3ZWVrICsgMSkpLCBbd2VlaywgZGlzcGF0Y2hdKTtcbiAgICBjb25zdCBkZWNyZW1lbnRXZWVrID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goc2V0V2Vlayh3ZWVrIC0gMSkpLCBbd2VlaywgZGlzcGF0Y2hdKTtcblxuICAgIC8vIEVmZmVjdHNcblxuICAgIC8vIE90aGVyXG4gICAgY29uc3QgW3BhcnRuZXJUYWJsZSwgaW52ZXJ0ZWRQYXJ0bmVyVGFibGVdID0gdXNlTWVtbyhcbiAgICAgICAgKCkgPT4gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVRhYmxlRm9yKG1lbWJlcnNJZHMsIHVzZVBhcnRuZXJzKSxcbiAgICAgICAgW21lbWJlcnNJZHMsIHVzZVBhcnRuZXJzXVxuICAgICk7XG5cbiAgICBpZiAoIXBhcnRuZXJUYWJsZSB8fCAhaW52ZXJ0ZWRQYXJ0bmVyVGFibGUgfHwgbWVtYmVyc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2cocGFydG5lclRhYmxlLCBpbnZlcnRlZFBhcnRuZXJUYWJsZSk7XG5cbiAgICBjb25zdCBwYXJ0bmVyVGFibGVOYW1lcyA9IHBhcnRuZXJUYWJsZS5tYXAoKHBhcnRuZXJDb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXJ0bmVyQ29sdW1uKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbWVtYmVyc1tpZF0/Lm5hbWUgPz8gaWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJ0bmVyTmFtZSA9IG1lbWJlcnNbcGFydG5lckNvbHVtbltpZF1dPy5uYW1lID8/IHBhcnRuZXJDb2x1bW5baWRdO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQYXJ0bmVyTmFtZSA9IG1lbWJlcnNbaW52ZXJ0ZWRQYXJ0bmVyVGFibGVbaW5kZXhdW2lkXV0/Lm5hbWUgPz8gaW52ZXJ0ZWRQYXJ0bmVyVGFibGVbaW5kZXhdW2lkXTtcbiAgICAgICAgICAgIHJldHVybiBbbmFtZSwgcGFydG5lck5hbWUsIG90aGVyUGFydG5lck5hbWVdO1xuICAgICAgICB9KSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ11bXTtcbiAgICB9KTtcblxuICAgIGxldCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcbiAgICBpZiAoIXVzZVdlZWtkYXlzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHBhcnRuZXJUYWJsZU5hbWVzW3dlZWsgJSBwYXJ0bmVyVGFibGVOYW1lcy5sZW5ndGhdO1xuICAgICAgICBkYXRhID0gY29sdW1uLm1hcCgoW25hbWUxLCBuYW1lMiwgbmFtZTNdKSA9PiAoe1xuICAgICAgICAgICAgcGFydG5lcjE6IG5hbWUxLFxuICAgICAgICAgICAgcGFydG5lcjI6IG5hbWUyLFxuICAgICAgICAgICAgcGFydG5lcjJPdGhlcjogbmFtZTMsXG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xJbmRleCA9ICh3ZWVrICogNyArIGkpICUgcGFydG5lclRhYmxlTmFtZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcGFydG5lclRhYmxlTmFtZXNbY29sSW5kZXhdO1xuICAgICAgICAgICAgY29sdW1uLmZvckVhY2goKFtwZXJzb24sIHBhcnRuZXIxLCBwYXJ0bmVyMl0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2luZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IHsgcGVyc29uIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdW2BkYXkke2l9YF0gPSBwYXJ0bmVyMTtcbiAgICAgICAgICAgICAgICBkYXRhW2luZGV4XVtgZGF5JHtpfU90aGVyYF0gPSBwYXJ0bmVyMjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHVzZVdlZWtkYXlzID8gY29sdW1uc1dlZWtkYXlzIDogY29sdW1uc1dlZWs7XG5cbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPEZsZXg+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtkZWNyZW1lbnRXZWVrfT4mbHQ7PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPEdyb3cgY2VudGVyPldvY2hlIHt3ZWVrICsgMX08L0dyb3c+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtpbmNyZW1lbnRXZWVrfT4mZ3Q7PC9CdXR0b24+XG4gICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICAgICB7LyogPExpc3QgcmVuZGVySXRlbT17cmVuZGVyUGFydG5lclBhYXJ9IGtleUV4dHJhY3Rvcj17cGFydG5lcktleUV4dHJhY3Rvcn0gaXRlbXM9e3BhcnRuZXJzfS8+ICovfVxuICAgICAgICAgICAgPFRhYmxlIGRhdGE9e2RhdGF9IGNvbHVtbnM9e2NvbHVtbnN9IC8+XG4gICAgICAgIDwvPlxuICAgICk7XG59XG5cbmNvbnN0IHRtcCA9IFJlYWN0Lm1lbW8oUGFydG5lclRhYmxlKSBhcyB0eXBlb2YgUGFydG5lclRhYmxlO1xuZXhwb3J0IHsgdG1wIGFzIFBhcnRuZXJUYWJsZSB9O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2l0ZXMsIHVzZVRvcEJhciB9IGZyb20gJ2NvcmRvdmEtc2l0ZXMnO1xuaW1wb3J0IHsgTWVtYmVyTGlzdCB9IGZyb20gJy4vTWVtYmVyTGlzdCc7XG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5pbXBvcnQgeyBQYXJ0bmVyVGFibGUgfSBmcm9tICcuL1BhcnRuZXJUYWJsZSc7XG5pbXBvcnQgeyBDb2wsIFJvdyB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBQcmF5ZXJDaXJjbGVTZXR0aW5ncyB9IGZyb20gJy4vUHJheWVyY2lyY2xlU2V0dGluZ3MnO1xuXG5leHBvcnQgdHlwZSBQcmF5ZXJDaXJjbGVQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiBQcmF5ZXJDaXJjbGUoe306IFByYXllckNpcmNsZVByb3BzKSB7XG4gICAgLy8gVmFyaWFibGVzXG5cbiAgICAvLyBTdGF0ZXNcblxuICAgIC8vIFJlZnNcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgLy8gRWZmZWN0c1xuICAgIHVzZVRvcEJhcih7XG4gICAgICAgIHRpdGxlOiAnUHJheWVyY2lyY2xlJyxcbiAgICB9KTtcblxuICAgIC8vIE90aGVyXG5cbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPFJvdyBsZz17M30gbWQ9ezJ9IHNtPXsxfT5cbiAgICAgICAgICAgICAgICA8Q29sPlxuICAgICAgICAgICAgICAgICAgICA8Q2FyZCBmdWxsSGVpZ2h0PXt0cnVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQcmF5ZXJDaXJjbGVTZXR0aW5ncyAvPlxuICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgICAgICAgPENvbCBjbGFzc05hbWU9XCJvcmRlci1tZC1maXJzdFwiIG1kPXs2fSBsZz17OH0+XG4gICAgICAgICAgICAgICAgICAgIDxDYXJkIG5vUGFkZGluZ0hlaWdodD17dHJ1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVtYmVyTGlzdCAvPlxuICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgICA8L1Jvdz5cbiAgICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgICAgIDxQYXJ0bmVyVGFibGUgLz5cbiAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC8+XG4gICAgKTtcbn1cblxuY29uc3QgdG1wID0gUmVhY3QubWVtbyhQcmF5ZXJDaXJjbGUpIGFzIHR5cGVvZiBQcmF5ZXJDaXJjbGU7XG5leHBvcnQgeyB0bXAgYXMgUHJheWVyQ2lyY2xlIH07XG5cblNpdGVzLmFkZEluaXRpYWxpemF0aW9uKChhcHApID0+IGFwcC5hZGREZWVwTGluaygnL1ByYXllckNpcmNsZScsIHRtcCkpO1xuIiwiaW1wb3J0IHsgSnNvbkhlbHBlciB9IGZyb20gJ2pzLWhlbHBlcic7XG5cbnR5cGUgQ29sdW1uID0gUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbnR5cGUgUG9zc2libGVQYXJ0bmVycyA9IFJlY29yZDxudW1iZXIsIG51bWJlcltdPjtcblxuZXhwb3J0IGNsYXNzIFByYXllckNpcmNsZUNhbGN1bGF0b3Ige1xuICAgIHN0YXRpYyB0YWJsZXM6IFJlY29yZDxudW1iZXIsIFJlY29yZDxudW1iZXIsIG51bWJlcj5bXSB8IGZhbHNlPiA9IHtcbiAgICAgICAgMjogW3sgMDogMSwgMTogMCB9XSxcbiAgICAgICAgNDogW1xuICAgICAgICAgICAgeyAwOiAxLCAxOiAwLCAyOiAzLCAzOiAyIH0sXG4gICAgICAgICAgICB7IDA6IDIsIDE6IDMsIDI6IDAsIDM6IDEgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogMiwgMjogMSwgMzogMCB9LFxuICAgICAgICBdLFxuICAgICAgICA2OiBbXG4gICAgICAgICAgICB7IDA6IDEsIDE6IDAsIDI6IDMsIDM6IDIsIDQ6IDUsIDU6IDQgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDMsIDE6IDUsIDI6IDQsIDM6IDAsIDQ6IDIsIDU6IDEgfSxcbiAgICAgICAgICAgIHsgMDogNCwgMTogMywgMjogNSwgMzogMSwgNDogMCwgNTogMiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgODogW1xuICAgICAgICAgICAgeyAwOiAxLCAxOiAwLCAyOiAzLCAzOiAyLCA0OiA1LCA1OiA0LCA2OiA3LCA3OiA2IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogMiwgMjogMSwgMzogMCwgNDogNywgNTogNiwgNjogNSwgNzogNCB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDUsIDE6IDQsIDI6IDcsIDM6IDYsIDQ6IDEsIDU6IDAsIDY6IDMsIDc6IDIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogNCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyAwOiA3LCAxOiA2LCAyOiA1LCAzOiA0LCA0OiAzLCA1OiAyLCA2OiAxLCA3OiAwIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDEwOiBbXG4gICAgICAgICAgICB7IDA6IDEsIDE6IDAsIDI6IDMsIDM6IDIsIDQ6IDUsIDU6IDQsIDY6IDcsIDc6IDYsIDg6IDksIDk6IDggfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDgsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMSxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogNSwgMjogOCwgMzogMCwgNDogNywgNTogMSwgNjogOSwgNzogNCwgODogMiwgOTogNiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyAwOiA1LCAxOiAyLCAyOiAxLCAzOiA3LCA0OiA5LCA1OiAwLCA2OiA4LCA3OiAzLCA4OiA2LCA5OiA0IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDcsIDE6IDksIDI6IDQsIDM6IDYsIDQ6IDIsIDU6IDgsIDY6IDMsIDc6IDAsIDg6IDUsIDk6IDEgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiA0LFxuICAgICAgICAgICAgICAgIDQ6IDMsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogOSwgMTogMywgMjogNiwgMzogMSwgNDogOCwgNTogNywgNjogMiwgNzogNSwgODogNCwgOTogMCB9LFxuICAgICAgICBdLFxuICAgICAgICAxMjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAwLFxuICAgICAgICAgICAgICAgIDQ6IDcsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDQsXG4gICAgICAgICAgICAgICAgODogMTEsXG4gICAgICAgICAgICAgICAgOTogMTAsXG4gICAgICAgICAgICAgICAgMTA6IDksXG4gICAgICAgICAgICAgICAgMTE6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDAsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAyLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogMTEsXG4gICAgICAgICAgICAgICAgNzogMTAsXG4gICAgICAgICAgICAgICAgODogMixcbiAgICAgICAgICAgICAgICA5OiAzLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA5LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDcsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAxLFxuICAgICAgICAgICAgICAgIDEwOiA2LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNixcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDExLCAxOiAxMCwgMjogNCwgMzogNywgNDogMiwgNTogOCwgNjogOSwgNzogMywgODogNSwgOTogNiwgMTA6IDEsIDExOiAwIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDE0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIsXG4gICAgICAgICAgICAgICAgMTogMTIsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogOCxcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogMTMsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogMTIsXG4gICAgICAgICAgICAgICAgMTI6IDExLFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiAxLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMTEsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDgsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogNCxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAyLFxuICAgICAgICAgICAgICAgIDU6IDYsXG4gICAgICAgICAgICAgICAgNjogNSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiAzLFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAxLFxuICAgICAgICAgICAgICAgIDc6IDEyLFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMyxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDEsXG4gICAgICAgICAgICAgICAgNDogMTMsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDExLFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTIsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAwLFxuICAgICAgICAgICAgICAgIDEyOiA2LFxuICAgICAgICAgICAgICAgIDEzOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogMCxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDksXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAxNjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIsXG4gICAgICAgICAgICAgICAgMTogMyxcbiAgICAgICAgICAgICAgICAyOiAwLFxuICAgICAgICAgICAgICAgIDM6IDEsXG4gICAgICAgICAgICAgICAgNDogNixcbiAgICAgICAgICAgICAgICA1OiA3LFxuICAgICAgICAgICAgICAgIDY6IDQsXG4gICAgICAgICAgICAgICAgNzogNSxcbiAgICAgICAgICAgICAgICA4OiAxMCxcbiAgICAgICAgICAgICAgICA5OiAxMSxcbiAgICAgICAgICAgICAgICAxMDogOCxcbiAgICAgICAgICAgICAgICAxMTogOSxcbiAgICAgICAgICAgICAgICAxMjogMTQsXG4gICAgICAgICAgICAgICAgMTM6IDE1LFxuICAgICAgICAgICAgICAgIDE0OiAxMixcbiAgICAgICAgICAgICAgICAxNTogMTMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgICAgICA4OiAxMixcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDE1LFxuICAgICAgICAgICAgICAgIDEyOiA4LFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogNCxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAxMyxcbiAgICAgICAgICAgICAgICA5OiAxMixcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDE0LFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA4LFxuICAgICAgICAgICAgICAgIDE0OiAxMSxcbiAgICAgICAgICAgICAgICAxNTogMTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDgsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxNSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDksXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDgsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMCxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAxMixcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAxNCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDUsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxMCxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDMsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDcsXG4gICAgICAgICAgICAgICAgMTU6IDYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAxNSxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDQsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDExLFxuICAgICAgICAgICAgICAgIDE6IDEwLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxMyxcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDcsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDUsXG4gICAgICAgICAgICAgICAgMTU6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAxMCxcbiAgICAgICAgICAgICAgICA3OiAxMSxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDEyLFxuICAgICAgICAgICAgICAgIDI6IDE1LFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogOCxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE0LFxuICAgICAgICAgICAgICAgIDE6IDE1LFxuICAgICAgICAgICAgICAgIDI6IDEyLFxuICAgICAgICAgICAgICAgIDM6IDEzLFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDgsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE0LFxuICAgICAgICAgICAgICAgIDI6IDEzLFxuICAgICAgICAgICAgICAgIDM6IDEyLFxuICAgICAgICAgICAgICAgIDQ6IDExLFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDIsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAxODogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICAgICAgMTY6IDE3LFxuICAgICAgICAgICAgICAgIDE3OiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAxNixcbiAgICAgICAgICAgICAgICAyOiAwLFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogNixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDQsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAxMCxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiAxMyxcbiAgICAgICAgICAgICAgICAxMjogMTQsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAxMixcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTYsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAxNSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDE3LFxuICAgICAgICAgICAgICAgIDE1OiAxMixcbiAgICAgICAgICAgICAgICAxNjogMixcbiAgICAgICAgICAgICAgICAxNzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxLFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDE2LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAxNCxcbiAgICAgICAgICAgICAgICAxNDogMTMsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDcsXG4gICAgICAgICAgICAgICAgMTc6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAxNixcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE3LFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICAgICAgMTY6IDUsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogNSxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDE2LFxuICAgICAgICAgICAgICAgIDE2OiAxNSxcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxNyxcbiAgICAgICAgICAgICAgICAxMjogMSxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiA3LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiA2LFxuICAgICAgICAgICAgICAgIDE0OiAzLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMTIsXG4gICAgICAgICAgICAgICAgMTc6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMTQsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMTUsXG4gICAgICAgICAgICAgICAgNzogMTcsXG4gICAgICAgICAgICAgICAgODogMTYsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogNCxcbiAgICAgICAgICAgICAgICAxNTogNixcbiAgICAgICAgICAgICAgICAxNjogOCxcbiAgICAgICAgICAgICAgICAxNzogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAxNyxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDE1LFxuICAgICAgICAgICAgICAgIDEwOiA1LFxuICAgICAgICAgICAgICAgIDExOiAwLFxuICAgICAgICAgICAgICAgIDEyOiAzLFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiA4LFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAyLFxuICAgICAgICAgICAgICAgIDc6IDMsXG4gICAgICAgICAgICAgICAgODogMSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDE2LFxuICAgICAgICAgICAgICAgIDEyOiAwLFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiA0LFxuICAgICAgICAgICAgICAgIDE2OiAxMSxcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDExLFxuICAgICAgICAgICAgICAgIDc6IDE0LFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMTYsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiAwLFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAxMCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDE1LFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogNCxcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTYsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDcsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDEwLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNSxcbiAgICAgICAgICAgICAgICAxOiAyLFxuICAgICAgICAgICAgICAgIDI6IDEsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogMTMsXG4gICAgICAgICAgICAgICAgMTc6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE2LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxNCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMCxcbiAgICAgICAgICAgICAgICAxNzogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogMTUsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA0LFxuICAgICAgICAgICAgICAgIDExOiAyLFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiAxLFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgMjA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxLFxuICAgICAgICAgICAgICAgIDE6IDAsXG4gICAgICAgICAgICAgICAgMjogMyxcbiAgICAgICAgICAgICAgICAzOiAyLFxuICAgICAgICAgICAgICAgIDQ6IDUsXG4gICAgICAgICAgICAgICAgNTogNCxcbiAgICAgICAgICAgICAgICA2OiA3LFxuICAgICAgICAgICAgICAgIDc6IDYsXG4gICAgICAgICAgICAgICAgODogOSxcbiAgICAgICAgICAgICAgICA5OiA4LFxuICAgICAgICAgICAgICAgIDEwOiAxMSxcbiAgICAgICAgICAgICAgICAxMTogMTAsXG4gICAgICAgICAgICAgICAgMTI6IDEzLFxuICAgICAgICAgICAgICAgIDEzOiAxMixcbiAgICAgICAgICAgICAgICAxNDogMTUsXG4gICAgICAgICAgICAgICAgMTU6IDE0LFxuICAgICAgICAgICAgICAgIDE2OiAxNyxcbiAgICAgICAgICAgICAgICAxNzogMTYsXG4gICAgICAgICAgICAgICAgMTg6IDE5LFxuICAgICAgICAgICAgICAgIDE5OiAxOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxOCxcbiAgICAgICAgICAgICAgICAxODogMTcsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA0LFxuICAgICAgICAgICAgICAgIDE6IDE2LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogMTgsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDEzLFxuICAgICAgICAgICAgICAgIDE4OiAzLFxuICAgICAgICAgICAgICAgIDE5OiAxNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDE2LFxuICAgICAgICAgICAgICAgIDM6IDE3LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiAxMyxcbiAgICAgICAgICAgICAgICA5OiAxMixcbiAgICAgICAgICAgICAgICAxMDogNyxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogOSxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTksXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiAyLFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAxNSxcbiAgICAgICAgICAgICAgICAxOTogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgICAgIDEwOiAxMixcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogMTAsXG4gICAgICAgICAgICAgICAgMTM6IDE5LFxuICAgICAgICAgICAgICAgIDE0OiA4LFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMyxcbiAgICAgICAgICAgICAgICAxNzogMTUsXG4gICAgICAgICAgICAgICAgMTg6IDIsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA3LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxLFxuICAgICAgICAgICAgICAgIDc6IDAsXG4gICAgICAgICAgICAgICAgODogMTUsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMTksXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAzLFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogNCxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDE0LFxuICAgICAgICAgICAgICAgIDE5OiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiAxNyxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDE0LFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE4LFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgICAgICAxNDogNCxcbiAgICAgICAgICAgICAgICAxNTogOSxcbiAgICAgICAgICAgICAgICAxNjogNSxcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgICAgICAxODogNixcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDE3LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTYsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMTEsXG4gICAgICAgICAgICAgICAgMTg6IDEyLFxuICAgICAgICAgICAgICAgIDE5OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMCxcbiAgICAgICAgICAgICAgICAxOiAxMSxcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMTksXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA0LFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogMTQsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogMTUsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogNixcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgICAgIDE0OiAyLFxuICAgICAgICAgICAgICAgIDE1OiA3LFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICAgICAgMTg6IDgsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDE0LFxuICAgICAgICAgICAgICAgIDI6IDE1LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMyxcbiAgICAgICAgICAgICAgICA5OiAxNyxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMTksXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICAgICAgMTY6IDcsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMyxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMixcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDE3LFxuICAgICAgICAgICAgICAgIDk6IDE4LFxuICAgICAgICAgICAgICAgIDEwOiAxLFxuICAgICAgICAgICAgICAgIDExOiAxNSxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogMCxcbiAgICAgICAgICAgICAgICAxNDogMTYsXG4gICAgICAgICAgICAgICAgMTU6IDExLFxuICAgICAgICAgICAgICAgIDE2OiAxNCxcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogMTAsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxOCxcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDIsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDYsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDUsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE4LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogMTksXG4gICAgICAgICAgICAgICAgODogMTYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAzLFxuICAgICAgICAgICAgICAgIDE1OiAwLFxuICAgICAgICAgICAgICAgIDE2OiA4LFxuICAgICAgICAgICAgICAgIDE3OiA2LFxuICAgICAgICAgICAgICAgIDE4OiAxLFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNixcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDExLFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogOSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDAsXG4gICAgICAgICAgICAgICAgMTc6IDE0LFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDE0LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMTgsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDUsXG4gICAgICAgICAgICAgICAgMTQ6IDcsXG4gICAgICAgICAgICAgICAgMTU6IDE2LFxuICAgICAgICAgICAgICAgIDE2OiAxNSxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogMTEsXG4gICAgICAgICAgICAgICAgMTk6IDMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE4LFxuICAgICAgICAgICAgICAgIDE6IDEyLFxuICAgICAgICAgICAgICAgIDI6IDE5LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDE3LFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTMsXG4gICAgICAgICAgICAgICAgODogNSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDksXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOSxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTMsXG4gICAgICAgICAgICAgICAgNTogMTcsXG4gICAgICAgICAgICAgICAgNjogMTIsXG4gICAgICAgICAgICAgICAgNzogMTgsXG4gICAgICAgICAgICAgICAgODogMixcbiAgICAgICAgICAgICAgICA5OiAzLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAxLFxuICAgICAgICAgICAgICAgIDE2OiAxMCxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDIyOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICAgICAgMTQ6IDE1LFxuICAgICAgICAgICAgICAgIDE1OiAxNCxcbiAgICAgICAgICAgICAgICAxNjogMTcsXG4gICAgICAgICAgICAgICAgMTc6IDE2LFxuICAgICAgICAgICAgICAgIDE4OiAxOSxcbiAgICAgICAgICAgICAgICAxOTogMTgsXG4gICAgICAgICAgICAgICAgMjA6IDIxLFxuICAgICAgICAgICAgICAgIDIxOiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDIwLFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDE3LFxuICAgICAgICAgICAgICAgIDIxOiAxOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMyxcbiAgICAgICAgICAgICAgICAxOiAyLFxuICAgICAgICAgICAgICAgIDI6IDEsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDYsXG4gICAgICAgICAgICAgICAgNjogNSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAxNSxcbiAgICAgICAgICAgICAgICAxMzogMTQsXG4gICAgICAgICAgICAgICAgMTQ6IDEzLFxuICAgICAgICAgICAgICAgIDE1OiAxMixcbiAgICAgICAgICAgICAgICAxNjogMTksXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiAyMCxcbiAgICAgICAgICAgICAgICAxOTogMTYsXG4gICAgICAgICAgICAgICAgMjA6IDE4LFxuICAgICAgICAgICAgICAgIDIxOiAxNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAwLFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDEwLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMjAsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAyMSxcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICAgICAgMjA6IDE2LFxuICAgICAgICAgICAgICAgIDIxOiAxOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDcsXG4gICAgICAgICAgICAgICAgMzogNixcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAyLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiAxNSxcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDksXG4gICAgICAgICAgICAgICAgMTM6IDgsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAxMCxcbiAgICAgICAgICAgICAgICAxNjogMjEsXG4gICAgICAgICAgICAgICAgMTc6IDE4LFxuICAgICAgICAgICAgICAgIDE4OiAxNyxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDQsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiAyLFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAxNyxcbiAgICAgICAgICAgICAgICAxMTogMTgsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAyMCxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogMjEsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICAgICAgMjA6IDEzLFxuICAgICAgICAgICAgICAgIDIxOiAxNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE3LFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTksXG4gICAgICAgICAgICAgICAgMTI6IDE4LFxuICAgICAgICAgICAgICAgIDEzOiAyMSxcbiAgICAgICAgICAgICAgICAxNDogMjAsXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICAgICAgMTY6IDEwLFxuICAgICAgICAgICAgICAgIDE3OiA5LFxuICAgICAgICAgICAgICAgIDE4OiAxMixcbiAgICAgICAgICAgICAgICAxOTogMTEsXG4gICAgICAgICAgICAgICAgMjA6IDE0LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE3LFxuICAgICAgICAgICAgICAgIDc6IDE4LFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMyxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogMTksXG4gICAgICAgICAgICAgICAgMTQ6IDIxLFxuICAgICAgICAgICAgICAgIDE1OiAyMCxcbiAgICAgICAgICAgICAgICAxNjogNSxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogMTMsXG4gICAgICAgICAgICAgICAgMjA6IDE1LFxuICAgICAgICAgICAgICAgIDIxOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOSxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDExLFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDEzLFxuICAgICAgICAgICAgICAgIDU6IDE3LFxuICAgICAgICAgICAgICAgIDY6IDE2LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDEsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMjEsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDE4LFxuICAgICAgICAgICAgICAgIDE1OiAxOSxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiAxMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMTEsXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiA5LFxuICAgICAgICAgICAgICAgIDQ6IDE0LFxuICAgICAgICAgICAgICAgIDU6IDE4LFxuICAgICAgICAgICAgICAgIDY6IDE5LFxuICAgICAgICAgICAgICAgIDc6IDIxLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMjAsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMTMsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiA2LFxuICAgICAgICAgICAgICAgIDIwOiAxMixcbiAgICAgICAgICAgICAgICAyMTogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogMTAsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiA4LFxuICAgICAgICAgICAgICAgIDQ6IDE1LFxuICAgICAgICAgICAgICAgIDU6IDIwLFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDE2LFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMSxcbiAgICAgICAgICAgICAgICAxMTogMCxcbiAgICAgICAgICAgICAgICAxMjogMTcsXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDEzLFxuICAgICAgICAgICAgICAgIDE5OiAxNCxcbiAgICAgICAgICAgICAgICAyMDogNSxcbiAgICAgICAgICAgICAgICAyMTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTIsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogMTQsXG4gICAgICAgICAgICAgICAgMzogMTUsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxOSxcbiAgICAgICAgICAgICAgICA2OiAxOCxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDIwLFxuICAgICAgICAgICAgICAgIDEwOiAyMSxcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA3LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiA1LFxuICAgICAgICAgICAgICAgIDIwOiA5LFxuICAgICAgICAgICAgICAgIDIxOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogMTIsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogOSxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiAxNixcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMTcsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDExLFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogNyxcbiAgICAgICAgICAgICAgICAyMDogNixcbiAgICAgICAgICAgICAgICAyMTogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogMTUsXG4gICAgICAgICAgICAgICAgMjogMTYsXG4gICAgICAgICAgICAgICAgMzogMTcsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogOCxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogMjEsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDIsXG4gICAgICAgICAgICAgICAgMTc6IDMsXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDksXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTUsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMTcsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDIwLFxuICAgICAgICAgICAgICAgIDEyOiA3LFxuICAgICAgICAgICAgICAgIDEzOiA2LFxuICAgICAgICAgICAgICAgIDE0OiAxLFxuICAgICAgICAgICAgICAgIDE1OiAwLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiA4LFxuICAgICAgICAgICAgICAgIDE5OiA0LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTYsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMjAsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiA1LFxuICAgICAgICAgICAgICAgIDEwOiAxOSxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogMixcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogNyxcbiAgICAgICAgICAgICAgICAxNTogMTgsXG4gICAgICAgICAgICAgICAgMTY6IDAsXG4gICAgICAgICAgICAgICAgMTc6IDEsXG4gICAgICAgICAgICAgICAgMTg6IDE1LFxuICAgICAgICAgICAgICAgIDE5OiAxMCxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogMTYsXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogMTksXG4gICAgICAgICAgICAgICAgNDogMjEsXG4gICAgICAgICAgICAgICAgNTogMTEsXG4gICAgICAgICAgICAgICAgNjogMTQsXG4gICAgICAgICAgICAgICAgNzogMTUsXG4gICAgICAgICAgICAgICAgODogMjAsXG4gICAgICAgICAgICAgICAgOTogMTgsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMSxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogMyxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTgsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMjAsXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMTAsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAxNyxcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMCxcbiAgICAgICAgICAgICAgICAxOTogMSxcbiAgICAgICAgICAgICAgICAyMDogMixcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTksXG4gICAgICAgICAgICAgICAgMTogMTgsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMjAsXG4gICAgICAgICAgICAgICAgNDogMTEsXG4gICAgICAgICAgICAgICAgNTogMTMsXG4gICAgICAgICAgICAgICAgNjogMTUsXG4gICAgICAgICAgICAgICAgNzogMTAsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMTQsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogMSxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogMyxcbiAgICAgICAgICAgICAgICAyMTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjAsXG4gICAgICAgICAgICAgICAgMTogMjEsXG4gICAgICAgICAgICAgICAgMjogMTgsXG4gICAgICAgICAgICAgICAgMzogMTIsXG4gICAgICAgICAgICAgICAgNDogMTYsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogOCxcbiAgICAgICAgICAgICAgICAyMDogMCxcbiAgICAgICAgICAgICAgICAyMTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjEsXG4gICAgICAgICAgICAgICAgMTogMjAsXG4gICAgICAgICAgICAgICAgMjogMTksXG4gICAgICAgICAgICAgICAgMzogMTgsXG4gICAgICAgICAgICAgICAgNDogMTcsXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogNixcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiA1LFxuICAgICAgICAgICAgICAgIDE2OiAxNCxcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgICAgICAxODogMyxcbiAgICAgICAgICAgICAgICAxOTogMixcbiAgICAgICAgICAgICAgICAyMDogMSxcbiAgICAgICAgICAgICAgICAyMTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDI0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICAgICAgMTQ6IDE1LFxuICAgICAgICAgICAgICAgIDE1OiAxNCxcbiAgICAgICAgICAgICAgICAxNjogMTcsXG4gICAgICAgICAgICAgICAgMTc6IDE2LFxuICAgICAgICAgICAgICAgIDE4OiAxOSxcbiAgICAgICAgICAgICAgICAxOTogMTgsXG4gICAgICAgICAgICAgICAgMjA6IDIxLFxuICAgICAgICAgICAgICAgIDIxOiAyMCxcbiAgICAgICAgICAgICAgICAyMjogMjMsXG4gICAgICAgICAgICAgICAgMjM6IDIyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiAxLFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE0LFxuICAgICAgICAgICAgICAgIDEzOiAxNSxcbiAgICAgICAgICAgICAgICAxNDogMTIsXG4gICAgICAgICAgICAgICAgMTU6IDEzLFxuICAgICAgICAgICAgICAgIDE2OiAxOCxcbiAgICAgICAgICAgICAgICAxNzogMTksXG4gICAgICAgICAgICAgICAgMTg6IDE2LFxuICAgICAgICAgICAgICAgIDE5OiAxNyxcbiAgICAgICAgICAgICAgICAyMDogMjIsXG4gICAgICAgICAgICAgICAgMjE6IDIzLFxuICAgICAgICAgICAgICAgIDIyOiAyMCxcbiAgICAgICAgICAgICAgICAyMzogMjEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxOCxcbiAgICAgICAgICAgICAgICAxODogMTcsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgICAgIDIwOiAyMyxcbiAgICAgICAgICAgICAgICAyMTogMjIsXG4gICAgICAgICAgICAgICAgMjI6IDIxLFxuICAgICAgICAgICAgICAgIDIzOiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAwLFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDEwLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMjAsXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiAyMixcbiAgICAgICAgICAgICAgICAxOTogMjMsXG4gICAgICAgICAgICAgICAgMjA6IDE2LFxuICAgICAgICAgICAgICAgIDIxOiAxNyxcbiAgICAgICAgICAgICAgICAyMjogMTgsXG4gICAgICAgICAgICAgICAgMjM6IDE5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiAzLFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMTMsXG4gICAgICAgICAgICAgICAgOTogMTIsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogOSxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAyMSxcbiAgICAgICAgICAgICAgICAxNzogMjAsXG4gICAgICAgICAgICAgICAgMTg6IDIzLFxuICAgICAgICAgICAgICAgIDE5OiAyMixcbiAgICAgICAgICAgICAgICAyMDogMTcsXG4gICAgICAgICAgICAgICAgMjE6IDE2LFxuICAgICAgICAgICAgICAgIDIyOiAxOSxcbiAgICAgICAgICAgICAgICAyMzogMTgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDgsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICAgICAgMTY6IDIyLFxuICAgICAgICAgICAgICAgIDE3OiAyMyxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDIxLFxuICAgICAgICAgICAgICAgIDIwOiAxOCxcbiAgICAgICAgICAgICAgICAyMTogMTksXG4gICAgICAgICAgICAgICAgMjI6IDE2LFxuICAgICAgICAgICAgICAgIDIzOiAxNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE0LFxuICAgICAgICAgICAgICAgIDEwOiAxMyxcbiAgICAgICAgICAgICAgICAxMTogMTIsXG4gICAgICAgICAgICAgICAgMTI6IDExLFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgICAgICAxNDogOSxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogMjMsXG4gICAgICAgICAgICAgICAgMTc6IDIyLFxuICAgICAgICAgICAgICAgIDE4OiAyMSxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxOCxcbiAgICAgICAgICAgICAgICAyMjogMTcsXG4gICAgICAgICAgICAgICAgMjM6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDE2LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDE4LFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDIwLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDIyLFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDE5LFxuICAgICAgICAgICAgICAgIDEyOiA0LFxuICAgICAgICAgICAgICAgIDEzOiAyMSxcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogMjMsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDExLFxuICAgICAgICAgICAgICAgIDIwOiA1LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogNyxcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAxNixcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAyMSxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE5LFxuICAgICAgICAgICAgICAgIDExOiAxOCxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogMjMsXG4gICAgICAgICAgICAgICAgMTU6IDIyLFxuICAgICAgICAgICAgICAgIDE2OiAyLFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMTAsXG4gICAgICAgICAgICAgICAgMjA6IDYsXG4gICAgICAgICAgICAgICAgMjE6IDcsXG4gICAgICAgICAgICAgICAgMjI6IDE1LFxuICAgICAgICAgICAgICAgIDIzOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAyMixcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDE4LFxuICAgICAgICAgICAgICAgIDEwOiAwLFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogNixcbiAgICAgICAgICAgICAgICAxMzogMjMsXG4gICAgICAgICAgICAgICAgMTQ6IDQsXG4gICAgICAgICAgICAgICAgMTU6IDIxLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAxLFxuICAgICAgICAgICAgICAgIDE4OiA5LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogMTUsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyMSxcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAyMCxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDE4LFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMjMsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiAyMixcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDQsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiAxMixcbiAgICAgICAgICAgICAgICAyMDogMyxcbiAgICAgICAgICAgICAgICAyMTogMSxcbiAgICAgICAgICAgICAgICAyMjogMTQsXG4gICAgICAgICAgICAgICAgMjM6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDIwLFxuICAgICAgICAgICAgICAgIDI6IDE5LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTAsXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogMjIsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMjEsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMjMsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogNSxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTMsXG4gICAgICAgICAgICAgICAgMTg6IDE0LFxuICAgICAgICAgICAgICAgIDE5OiAyLFxuICAgICAgICAgICAgICAgIDIwOiAxLFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiA2LFxuICAgICAgICAgICAgICAgIDIzOiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAyMSxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiAxNixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAxLFxuICAgICAgICAgICAgICAgIDEwOiAyMyxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMjIsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDE5LFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiA1LFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiA3LFxuICAgICAgICAgICAgICAgIDE5OiAxNCxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgICAgICAyMjogMTIsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiAyMixcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAyMSxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDIzLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDE4LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxNyxcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogMCxcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAxMixcbiAgICAgICAgICAgICAgICAxODogMTAsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDIsXG4gICAgICAgICAgICAgICAgMjE6IDQsXG4gICAgICAgICAgICAgICAgMjI6IDEsXG4gICAgICAgICAgICAgICAgMjM6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE4LFxuICAgICAgICAgICAgICAgIDI6IDIzLFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTcsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTMsXG4gICAgICAgICAgICAgICAgODogMyxcbiAgICAgICAgICAgICAgICA5OiAxNixcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMjIsXG4gICAgICAgICAgICAgICAgMTI6IDIwLFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgICAgIDE0OiAyMSxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMSxcbiAgICAgICAgICAgICAgICAxOTogNCxcbiAgICAgICAgICAgICAgICAyMDogMTIsXG4gICAgICAgICAgICAgICAgMjE6IDE0LFxuICAgICAgICAgICAgICAgIDIyOiAxMSxcbiAgICAgICAgICAgICAgICAyMzogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTYsXG4gICAgICAgICAgICAgICAgMTogMjMsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTAsXG4gICAgICAgICAgICAgICAgNDogMjAsXG4gICAgICAgICAgICAgICAgNTogMTgsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxNyxcbiAgICAgICAgICAgICAgICAxMjogMjEsXG4gICAgICAgICAgICAgICAgMTM6IDIyLFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAwLFxuICAgICAgICAgICAgICAgIDE3OiAxMSxcbiAgICAgICAgICAgICAgICAxODogNSxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogMTIsXG4gICAgICAgICAgICAgICAgMjI6IDEzLFxuICAgICAgICAgICAgICAgIDIzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxOSxcbiAgICAgICAgICAgICAgICAyOiAxNCxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAyMixcbiAgICAgICAgICAgICAgICA1OiAyMyxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAxOCxcbiAgICAgICAgICAgICAgICA5OiAyMCxcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiAyLFxuICAgICAgICAgICAgICAgIDE1OiA3LFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogOCxcbiAgICAgICAgICAgICAgICAxOTogMSxcbiAgICAgICAgICAgICAgICAyMDogOSxcbiAgICAgICAgICAgICAgICAyMTogMTAsXG4gICAgICAgICAgICAgICAgMjI6IDQsXG4gICAgICAgICAgICAgICAgMjM6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE4LFxuICAgICAgICAgICAgICAgIDE6IDE1LFxuICAgICAgICAgICAgICAgIDI6IDEyLFxuICAgICAgICAgICAgICAgIDM6IDIyLFxuICAgICAgICAgICAgICAgIDQ6IDIzLFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDIxLFxuICAgICAgICAgICAgICAgIDEwOiAxNyxcbiAgICAgICAgICAgICAgICAxMTogNyxcbiAgICAgICAgICAgICAgICAxMjogMixcbiAgICAgICAgICAgICAgICAxMzogNixcbiAgICAgICAgICAgICAgICAxNDogMjAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiA1LFxuICAgICAgICAgICAgICAgIDIwOiAxNCxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogMyxcbiAgICAgICAgICAgICAgICAyMzogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTksXG4gICAgICAgICAgICAgICAgMTogMTEsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMTUsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDIyLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDIwLFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiAzLFxuICAgICAgICAgICAgICAgIDE2OiAxMCxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogNCxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogMTMsXG4gICAgICAgICAgICAgICAgMjE6IDIsXG4gICAgICAgICAgICAgICAgMjI6IDksXG4gICAgICAgICAgICAgICAgMjM6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiAxNCxcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDIzLFxuICAgICAgICAgICAgICAgIDg6IDIyLFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxOCxcbiAgICAgICAgICAgICAgICAxNDogMSxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDEyLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogMTUsXG4gICAgICAgICAgICAgICAgMjA6IDAsXG4gICAgICAgICAgICAgICAgMjE6IDYsXG4gICAgICAgICAgICAgICAgMjI6IDgsXG4gICAgICAgICAgICAgICAgMjM6IDcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIxLFxuICAgICAgICAgICAgICAgIDE6IDEwLFxuICAgICAgICAgICAgICAgIDI6IDIyLFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAyMyxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDE2LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTksXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIwLFxuICAgICAgICAgICAgICAgIDE2OiAxMSxcbiAgICAgICAgICAgICAgICAxNzogNyxcbiAgICAgICAgICAgICAgICAxODogMTIsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgICAgIDIwOiAxNSxcbiAgICAgICAgICAgICAgICAyMTogMCxcbiAgICAgICAgICAgICAgICAyMjogMixcbiAgICAgICAgICAgICAgICAyMzogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjIsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAxOSxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDgsXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiA1LFxuICAgICAgICAgICAgICAgIDIyOiAwLFxuICAgICAgICAgICAgICAgIDIzOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiA5LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDE3LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAyMSxcbiAgICAgICAgICAgICAgICAxMjogMSxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgICAgICAxNDogMTYsXG4gICAgICAgICAgICAgICAgMTU6IDQsXG4gICAgICAgICAgICAgICAgMTY6IDE0LFxuICAgICAgICAgICAgICAgIDE3OiA4LFxuICAgICAgICAgICAgICAgIDE4OiAyLFxuICAgICAgICAgICAgICAgIDE5OiAzLFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiAxMSxcbiAgICAgICAgICAgICAgICAyMjogMTAsXG4gICAgICAgICAgICAgICAgMjM6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAyNjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICAgICAgMTY6IDE3LFxuICAgICAgICAgICAgICAgIDE3OiAxNixcbiAgICAgICAgICAgICAgICAxODogMTksXG4gICAgICAgICAgICAgICAgMTk6IDE4LFxuICAgICAgICAgICAgICAgIDIwOiAyMSxcbiAgICAgICAgICAgICAgICAyMTogMjAsXG4gICAgICAgICAgICAgICAgMjI6IDIzLFxuICAgICAgICAgICAgICAgIDIzOiAyMixcbiAgICAgICAgICAgICAgICAyNDogMjUsXG4gICAgICAgICAgICAgICAgMjU6IDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDI0LFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDIyLFxuICAgICAgICAgICAgICAgIDIxOiAxOSxcbiAgICAgICAgICAgICAgICAyMjogMjAsXG4gICAgICAgICAgICAgICAgMjM6IDI1LFxuICAgICAgICAgICAgICAgIDI0OiAxLFxuICAgICAgICAgICAgICAgIDI1OiAyMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMyxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDI0LFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiA2LFxuICAgICAgICAgICAgICAgIDEwOiAxMyxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDEwLFxuICAgICAgICAgICAgICAgIDE0OiAxNyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMjEsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgICAgIDIwOiAyMyxcbiAgICAgICAgICAgICAgICAyMTogMTgsXG4gICAgICAgICAgICAgICAgMjI6IDI1LFxuICAgICAgICAgICAgICAgIDIzOiAyMCxcbiAgICAgICAgICAgICAgICAyNDogMixcbiAgICAgICAgICAgICAgICAyNTogMjIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogMjIsXG4gICAgICAgICAgICAgICAgMjogMjMsXG4gICAgICAgICAgICAgICAgMzogMjQsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDIwLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiAxNixcbiAgICAgICAgICAgICAgICAyMTogMjUsXG4gICAgICAgICAgICAgICAgMjI6IDEsXG4gICAgICAgICAgICAgICAgMjM6IDIsXG4gICAgICAgICAgICAgICAgMjQ6IDMsXG4gICAgICAgICAgICAgICAgMjU6IDIxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDE4LFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMjEsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICAgICAgMjA6IDI1LFxuICAgICAgICAgICAgICAgIDIxOiAxNixcbiAgICAgICAgICAgICAgICAyMjogMjQsXG4gICAgICAgICAgICAgICAgMjM6IDMsXG4gICAgICAgICAgICAgICAgMjQ6IDIyLFxuICAgICAgICAgICAgICAgIDI1OiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiAyMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMixcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDE3LFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogMTAsXG4gICAgICAgICAgICAgICAgMTM6IDgsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAyMSxcbiAgICAgICAgICAgICAgICAxNjogMjIsXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDI1LFxuICAgICAgICAgICAgICAgIDIwOiAxLFxuICAgICAgICAgICAgICAgIDIxOiAxNSxcbiAgICAgICAgICAgICAgICAyMjogMTYsXG4gICAgICAgICAgICAgICAgMjM6IDI0LFxuICAgICAgICAgICAgICAgIDI0OiAyMyxcbiAgICAgICAgICAgICAgICAyNTogMTksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogMTAsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAyMSxcbiAgICAgICAgICAgICAgICA1OiAxNSxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDIyLFxuICAgICAgICAgICAgICAgIDEzOiAyNSxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogNSxcbiAgICAgICAgICAgICAgICAxNjogMjMsXG4gICAgICAgICAgICAgICAgMTc6IDE4LFxuICAgICAgICAgICAgICAgIDE4OiAxNyxcbiAgICAgICAgICAgICAgICAxOTogMyxcbiAgICAgICAgICAgICAgICAyMDogMjQsXG4gICAgICAgICAgICAgICAgMjE6IDQsXG4gICAgICAgICAgICAgICAgMjI6IDEyLFxuICAgICAgICAgICAgICAgIDIzOiAxNixcbiAgICAgICAgICAgICAgICAyNDogMjAsXG4gICAgICAgICAgICAgICAgMjU6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogMTcsXG4gICAgICAgICAgICAgICAgNDogMjQsXG4gICAgICAgICAgICAgICAgNTogMjIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDIwLFxuICAgICAgICAgICAgICAgIDEwOiAyNSxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMTgsXG4gICAgICAgICAgICAgICAgMTM6IDE5LFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAxNixcbiAgICAgICAgICAgICAgICAxNjogMTUsXG4gICAgICAgICAgICAgICAgMTc6IDMsXG4gICAgICAgICAgICAgICAgMTg6IDEyLFxuICAgICAgICAgICAgICAgIDE5OiAxMyxcbiAgICAgICAgICAgICAgICAyMDogOSxcbiAgICAgICAgICAgICAgICAyMTogMjMsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDIxLFxuICAgICAgICAgICAgICAgIDI0OiA0LFxuICAgICAgICAgICAgICAgIDI1OiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOSxcbiAgICAgICAgICAgICAgICAxOiAyMyxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDIwLFxuICAgICAgICAgICAgICAgIDQ6IDI1LFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE0LFxuICAgICAgICAgICAgICAgIDExOiAyMSxcbiAgICAgICAgICAgICAgICAxMjogMTcsXG4gICAgICAgICAgICAgICAgMTM6IDE1LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTMsXG4gICAgICAgICAgICAgICAgMTY6IDI0LFxuICAgICAgICAgICAgICAgIDE3OiAxMixcbiAgICAgICAgICAgICAgICAxODogMjIsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICAgICAgMjA6IDMsXG4gICAgICAgICAgICAgICAgMjE6IDExLFxuICAgICAgICAgICAgICAgIDIyOiAxOCxcbiAgICAgICAgICAgICAgICAyMzogMSxcbiAgICAgICAgICAgICAgICAyNDogMTYsXG4gICAgICAgICAgICAgICAgMjU6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDQsXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMTQsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDIzLFxuICAgICAgICAgICAgICAgIDEyOiA3LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiAyMCxcbiAgICAgICAgICAgICAgICAxNjogMjUsXG4gICAgICAgICAgICAgICAgMTc6IDIyLFxuICAgICAgICAgICAgICAgIDE4OiAyNCxcbiAgICAgICAgICAgICAgICAxOTogOCxcbiAgICAgICAgICAgICAgICAyMDogMTUsXG4gICAgICAgICAgICAgICAgMjE6IDMsXG4gICAgICAgICAgICAgICAgMjI6IDE3LFxuICAgICAgICAgICAgICAgIDIzOiAxMSxcbiAgICAgICAgICAgICAgICAyNDogMTgsXG4gICAgICAgICAgICAgICAgMjU6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyNSxcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiA4LFxuICAgICAgICAgICAgICAgIDQ6IDE2LFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMTIsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDksXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiAyMyxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDIyLFxuICAgICAgICAgICAgICAgIDIwOiAyLFxuICAgICAgICAgICAgICAgIDIxOiAyNCxcbiAgICAgICAgICAgICAgICAyMjogMTksXG4gICAgICAgICAgICAgICAgMjM6IDE3LFxuICAgICAgICAgICAgICAgIDI0OiAyMSxcbiAgICAgICAgICAgICAgICAyNTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTIsXG4gICAgICAgICAgICAgICAgMTogMTYsXG4gICAgICAgICAgICAgICAgMjogMTcsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiAxMyxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDI0LFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogMCxcbiAgICAgICAgICAgICAgICAxMzogNixcbiAgICAgICAgICAgICAgICAxNDogMyxcbiAgICAgICAgICAgICAgICAxNTogMjUsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDIsXG4gICAgICAgICAgICAgICAgMTg6IDIzLFxuICAgICAgICAgICAgICAgIDE5OiA0LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogMjIsXG4gICAgICAgICAgICAgICAgMjI6IDIxLFxuICAgICAgICAgICAgICAgIDIzOiAxOCxcbiAgICAgICAgICAgICAgICAyNDogOCxcbiAgICAgICAgICAgICAgICAyNTogMTUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDE3LFxuICAgICAgICAgICAgICAgIDI6IDE2LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDExLFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTksXG4gICAgICAgICAgICAgICAgNzogMjUsXG4gICAgICAgICAgICAgICAgODogNSxcbiAgICAgICAgICAgICAgICA5OiAyNCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDIxLFxuICAgICAgICAgICAgICAgIDE1OiAyMixcbiAgICAgICAgICAgICAgICAxNjogMixcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDE4LFxuICAgICAgICAgICAgICAgIDIxOiAxNCxcbiAgICAgICAgICAgICAgICAyMjogMTUsXG4gICAgICAgICAgICAgICAgMjM6IDEyLFxuICAgICAgICAgICAgICAgIDI0OiA5LFxuICAgICAgICAgICAgICAgIDI1OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDEzLFxuICAgICAgICAgICAgICAgIDM6IDE4LFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE3LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMjIsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDI1LFxuICAgICAgICAgICAgICAgIDEyOiAyMCxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgICAgICAxNDogMCxcbiAgICAgICAgICAgICAgICAxNTogMjMsXG4gICAgICAgICAgICAgICAgMTY6IDUsXG4gICAgICAgICAgICAgICAgMTc6IDYsXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDI0LFxuICAgICAgICAgICAgICAgIDIwOiAxMixcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogOCxcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICAgICAgMjQ6IDE5LFxuICAgICAgICAgICAgICAgIDI1OiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTUsXG4gICAgICAgICAgICAgICAgMTogNCxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMjUsXG4gICAgICAgICAgICAgICAgNjogMjQsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAxNyxcbiAgICAgICAgICAgICAgICA5OiAyMixcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxOCxcbiAgICAgICAgICAgICAgICAxNDogMjMsXG4gICAgICAgICAgICAgICAgMTU6IDAsXG4gICAgICAgICAgICAgICAgMTY6IDEyLFxuICAgICAgICAgICAgICAgIDE3OiA4LFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxMCxcbiAgICAgICAgICAgICAgICAyMjogOSxcbiAgICAgICAgICAgICAgICAyMzogMTQsXG4gICAgICAgICAgICAgICAgMjQ6IDYsXG4gICAgICAgICAgICAgICAgMjU6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE2LFxuICAgICAgICAgICAgICAgIDE6IDIxLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAzLFxuICAgICAgICAgICAgICAgIDc6IDIyLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIwLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxOSxcbiAgICAgICAgICAgICAgICAxMzogMjMsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDI0LFxuICAgICAgICAgICAgICAgIDE2OiAwLFxuICAgICAgICAgICAgICAgIDE3OiA5LFxuICAgICAgICAgICAgICAgIDE4OiAyNSxcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiAxLFxuICAgICAgICAgICAgICAgIDIyOiA3LFxuICAgICAgICAgICAgICAgIDIzOiAxMyxcbiAgICAgICAgICAgICAgICAyNDogMTUsXG4gICAgICAgICAgICAgICAgMjU6IDE4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDIyLFxuICAgICAgICAgICAgICAgIDQ6IDIwLFxuICAgICAgICAgICAgICAgIDU6IDEzLFxuICAgICAgICAgICAgICAgIDY6IDI1LFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMTYsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDE4LFxuICAgICAgICAgICAgICAgIDEyOiAyMSxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgICAgICAxNDogMjQsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDAsXG4gICAgICAgICAgICAgICAgMTg6IDExLFxuICAgICAgICAgICAgICAgIDE5OiAyMyxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogMTIsXG4gICAgICAgICAgICAgICAgMjI6IDMsXG4gICAgICAgICAgICAgICAgMjM6IDE5LFxuICAgICAgICAgICAgICAgIDI0OiAxNCxcbiAgICAgICAgICAgICAgICAyNTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTgsXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAyNSxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAyMixcbiAgICAgICAgICAgICAgICA3OiAyMyxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDIwLFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMTAsXG4gICAgICAgICAgICAgICAgMTc6IDI0LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiA5LFxuICAgICAgICAgICAgICAgIDIwOiAxMyxcbiAgICAgICAgICAgICAgICAyMTogNSxcbiAgICAgICAgICAgICAgICAyMjogNixcbiAgICAgICAgICAgICAgICAyMzogNyxcbiAgICAgICAgICAgICAgICAyNDogMTcsXG4gICAgICAgICAgICAgICAgMjU6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE5LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDIyLFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAyMyxcbiAgICAgICAgICAgICAgICA3OiAyMSxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAxOCxcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDI0LFxuICAgICAgICAgICAgICAgIDEzOiAxNixcbiAgICAgICAgICAgICAgICAxNDogMjUsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogNyxcbiAgICAgICAgICAgICAgICAyMjogMixcbiAgICAgICAgICAgICAgICAyMzogNixcbiAgICAgICAgICAgICAgICAyNDogMTIsXG4gICAgICAgICAgICAgICAgMjU6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxOSxcbiAgICAgICAgICAgICAgICAzOiAxNSxcbiAgICAgICAgICAgICAgICA0OiAyMixcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAyMSxcbiAgICAgICAgICAgICAgICA3OiAxNixcbiAgICAgICAgICAgICAgICA4OiAxOCxcbiAgICAgICAgICAgICAgICA5OiAyNSxcbiAgICAgICAgICAgICAgICAxMDogMjMsXG4gICAgICAgICAgICAgICAgMTE6IDE3LFxuICAgICAgICAgICAgICAgIDEyOiAxLFxuICAgICAgICAgICAgICAgIDEzOiAyNCxcbiAgICAgICAgICAgICAgICAxNDogNSxcbiAgICAgICAgICAgICAgICAxNTogMyxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTEsXG4gICAgICAgICAgICAgICAgMTg6IDgsXG4gICAgICAgICAgICAgICAgMTk6IDIsXG4gICAgICAgICAgICAgICAgMjA6IDAsXG4gICAgICAgICAgICAgICAgMjE6IDYsXG4gICAgICAgICAgICAgICAgMjI6IDQsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgICAgIDI0OiAxMyxcbiAgICAgICAgICAgICAgICAyNTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjEsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMjMsXG4gICAgICAgICAgICAgICAgNjogMTgsXG4gICAgICAgICAgICAgICAgNzogMjQsXG4gICAgICAgICAgICAgICAgODogMTUsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDIyLFxuICAgICAgICAgICAgICAgIDE0OiAyMCxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogMyxcbiAgICAgICAgICAgICAgICAxNzogMjUsXG4gICAgICAgICAgICAgICAgMTg6IDYsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICAgICAgMjA6IDE0LFxuICAgICAgICAgICAgICAgIDIxOiAwLFxuICAgICAgICAgICAgICAgIDIyOiAxMyxcbiAgICAgICAgICAgICAgICAyMzogNSxcbiAgICAgICAgICAgICAgICAyNDogNyxcbiAgICAgICAgICAgICAgICAyNTogMTcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAyMCxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAyNSxcbiAgICAgICAgICAgICAgICA5OiAyMyxcbiAgICAgICAgICAgICAgICAxMDogMjQsXG4gICAgICAgICAgICAgICAgMTE6IDE5LFxuICAgICAgICAgICAgICAgIDEyOiA2LFxuICAgICAgICAgICAgICAgIDEzOiA0LFxuICAgICAgICAgICAgICAgIDE0OiAxNixcbiAgICAgICAgICAgICAgICAxNTogMixcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiA3LFxuICAgICAgICAgICAgICAgIDE5OiAxMSxcbiAgICAgICAgICAgICAgICAyMDogNSxcbiAgICAgICAgICAgICAgICAyMTogMTcsXG4gICAgICAgICAgICAgICAgMjI6IDAsXG4gICAgICAgICAgICAgICAgMjM6IDksXG4gICAgICAgICAgICAgICAgMjQ6IDEwLFxuICAgICAgICAgICAgICAgIDI1OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxOCxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAyNSxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAyNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAyMCxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDIyLFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICAgICAgMTg6IDEsXG4gICAgICAgICAgICAgICAgMTk6IDE0LFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiAxMSxcbiAgICAgICAgICAgICAgICAyMzogMCxcbiAgICAgICAgICAgICAgICAyNDogNSxcbiAgICAgICAgICAgICAgICAyNTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjQsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMTcsXG4gICAgICAgICAgICAgICAgNTogMTgsXG4gICAgICAgICAgICAgICAgNjogMjAsXG4gICAgICAgICAgICAgICAgNzogMTksXG4gICAgICAgICAgICAgICAgODogMjMsXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAxNixcbiAgICAgICAgICAgICAgICAxMjogMjUsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiA2LFxuICAgICAgICAgICAgICAgIDIxOiAyLFxuICAgICAgICAgICAgICAgIDIyOiAxMCxcbiAgICAgICAgICAgICAgICAyMzogOCxcbiAgICAgICAgICAgICAgICAyNDogMCxcbiAgICAgICAgICAgICAgICAyNTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDI1LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogMTgsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAyMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDE5LFxuICAgICAgICAgICAgICAgIDExOiAyNCxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogMjEsXG4gICAgICAgICAgICAgICAgMTQ6IDIyLFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiA4LFxuICAgICAgICAgICAgICAgIDE3OiAyMCxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogMTAsXG4gICAgICAgICAgICAgICAgMjA6IDE3LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogMTQsXG4gICAgICAgICAgICAgICAgMjM6IDQsXG4gICAgICAgICAgICAgICAgMjQ6IDExLFxuICAgICAgICAgICAgICAgIDI1OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgMjg6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxLFxuICAgICAgICAgICAgICAgIDE6IDAsXG4gICAgICAgICAgICAgICAgMjogMyxcbiAgICAgICAgICAgICAgICAzOiAyLFxuICAgICAgICAgICAgICAgIDQ6IDUsXG4gICAgICAgICAgICAgICAgNTogNCxcbiAgICAgICAgICAgICAgICA2OiA3LFxuICAgICAgICAgICAgICAgIDc6IDYsXG4gICAgICAgICAgICAgICAgODogOSxcbiAgICAgICAgICAgICAgICA5OiA4LFxuICAgICAgICAgICAgICAgIDEwOiAxMSxcbiAgICAgICAgICAgICAgICAxMTogMTAsXG4gICAgICAgICAgICAgICAgMTI6IDEzLFxuICAgICAgICAgICAgICAgIDEzOiAxMixcbiAgICAgICAgICAgICAgICAxNDogMTUsXG4gICAgICAgICAgICAgICAgMTU6IDE0LFxuICAgICAgICAgICAgICAgIDE2OiAxNyxcbiAgICAgICAgICAgICAgICAxNzogMTYsXG4gICAgICAgICAgICAgICAgMTg6IDE5LFxuICAgICAgICAgICAgICAgIDE5OiAxOCxcbiAgICAgICAgICAgICAgICAyMDogMjEsXG4gICAgICAgICAgICAgICAgMjE6IDIwLFxuICAgICAgICAgICAgICAgIDIyOiAyMyxcbiAgICAgICAgICAgICAgICAyMzogMjIsXG4gICAgICAgICAgICAgICAgMjQ6IDI1LFxuICAgICAgICAgICAgICAgIDI1OiAyNCxcbiAgICAgICAgICAgICAgICAyNjogMjcsXG4gICAgICAgICAgICAgICAgMjc6IDI2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiAxLFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE0LFxuICAgICAgICAgICAgICAgIDEzOiAxNSxcbiAgICAgICAgICAgICAgICAxNDogMTIsXG4gICAgICAgICAgICAgICAgMTU6IDEzLFxuICAgICAgICAgICAgICAgIDE2OiAxOCxcbiAgICAgICAgICAgICAgICAxNzogMTksXG4gICAgICAgICAgICAgICAgMTg6IDE2LFxuICAgICAgICAgICAgICAgIDE5OiAxNyxcbiAgICAgICAgICAgICAgICAyMDogMjIsXG4gICAgICAgICAgICAgICAgMjE6IDIzLFxuICAgICAgICAgICAgICAgIDIyOiAyMCxcbiAgICAgICAgICAgICAgICAyMzogMjEsXG4gICAgICAgICAgICAgICAgMjQ6IDI2LFxuICAgICAgICAgICAgICAgIDI1OiAyNyxcbiAgICAgICAgICAgICAgICAyNjogMjQsXG4gICAgICAgICAgICAgICAgMjc6IDI1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAwLFxuICAgICAgICAgICAgICAgIDQ6IDcsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDQsXG4gICAgICAgICAgICAgICAgODogMTEsXG4gICAgICAgICAgICAgICAgOTogMTAsXG4gICAgICAgICAgICAgICAgMTA6IDksXG4gICAgICAgICAgICAgICAgMTE6IDgsXG4gICAgICAgICAgICAgICAgMTI6IDE1LFxuICAgICAgICAgICAgICAgIDEzOiAxNCxcbiAgICAgICAgICAgICAgICAxNDogMTMsXG4gICAgICAgICAgICAgICAgMTU6IDEyLFxuICAgICAgICAgICAgICAgIDE2OiAxOSxcbiAgICAgICAgICAgICAgICAxNzogMTgsXG4gICAgICAgICAgICAgICAgMTg6IDE3LFxuICAgICAgICAgICAgICAgIDE5OiAxNixcbiAgICAgICAgICAgICAgICAyMDogMjMsXG4gICAgICAgICAgICAgICAgMjE6IDIyLFxuICAgICAgICAgICAgICAgIDIyOiAyMSxcbiAgICAgICAgICAgICAgICAyMzogMjAsXG4gICAgICAgICAgICAgICAgMjQ6IDI3LFxuICAgICAgICAgICAgICAgIDI1OiAyNixcbiAgICAgICAgICAgICAgICAyNjogMjUsXG4gICAgICAgICAgICAgICAgMjc6IDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA0LFxuICAgICAgICAgICAgICAgIDE6IDI0LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogMjYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDIwLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMjIsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiAxNixcbiAgICAgICAgICAgICAgICAyMTogMjUsXG4gICAgICAgICAgICAgICAgMjI6IDE4LFxuICAgICAgICAgICAgICAgIDIzOiAyNyxcbiAgICAgICAgICAgICAgICAyNDogMSxcbiAgICAgICAgICAgICAgICAyNTogMjEsXG4gICAgICAgICAgICAgICAgMjY6IDMsXG4gICAgICAgICAgICAgICAgMjc6IDIzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMjQsXG4gICAgICAgICAgICAgICAgMzogMjUsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgICAgIDY6IDExLFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA4LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogMTgsXG4gICAgICAgICAgICAgICAgMTY6IDIxLFxuICAgICAgICAgICAgICAgIDE3OiAyMCxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDE0LFxuICAgICAgICAgICAgICAgIDIwOiAxNyxcbiAgICAgICAgICAgICAgICAyMTogMTYsXG4gICAgICAgICAgICAgICAgMjI6IDI3LFxuICAgICAgICAgICAgICAgIDIzOiAyNixcbiAgICAgICAgICAgICAgICAyNDogMixcbiAgICAgICAgICAgICAgICAyNTogMyxcbiAgICAgICAgICAgICAgICAyNjogMjMsXG4gICAgICAgICAgICAgICAgMjc6IDIyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMjYsXG4gICAgICAgICAgICAgICAgMzogMjQsXG4gICAgICAgICAgICAgICAgNDogMTEsXG4gICAgICAgICAgICAgICAgNTogMSxcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMTQsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDEwLFxuICAgICAgICAgICAgICAgIDEzOiAxOSxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDIyLFxuICAgICAgICAgICAgICAgIDE3OiAxNSxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgICAgIDIwOiAxOCxcbiAgICAgICAgICAgICAgICAyMTogMjcsXG4gICAgICAgICAgICAgICAgMjI6IDE2LFxuICAgICAgICAgICAgICAgIDIzOiAyNSxcbiAgICAgICAgICAgICAgICAyNDogMyxcbiAgICAgICAgICAgICAgICAyNTogMjMsXG4gICAgICAgICAgICAgICAgMjY6IDIsXG4gICAgICAgICAgICAgICAgMjc6IDIxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA3LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMjQsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxNSxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgICAgIDEwOiAyNyxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMTksXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA4LFxuICAgICAgICAgICAgICAgIDE2OiAyMyxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogMTMsXG4gICAgICAgICAgICAgICAgMTk6IDEyLFxuICAgICAgICAgICAgICAgIDIwOiAyNSxcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgICAgICAyMjogMjYsXG4gICAgICAgICAgICAgICAgMjM6IDE2LFxuICAgICAgICAgICAgICAgIDI0OiA0LFxuICAgICAgICAgICAgICAgIDI1OiAyMCxcbiAgICAgICAgICAgICAgICAyNjogMjIsXG4gICAgICAgICAgICAgICAgMjc6IDEwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiAyNSxcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAyNixcbiAgICAgICAgICAgICAgICA3OiAyLFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAyMCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDIxLFxuICAgICAgICAgICAgICAgIDE2OiAyNCxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDI3LFxuICAgICAgICAgICAgICAgIDE5OiAyMixcbiAgICAgICAgICAgICAgICAyMDogMTMsXG4gICAgICAgICAgICAgICAgMjE6IDE1LFxuICAgICAgICAgICAgICAgIDIyOiAxOSxcbiAgICAgICAgICAgICAgICAyMzogMyxcbiAgICAgICAgICAgICAgICAyNDogMTYsXG4gICAgICAgICAgICAgICAgMjU6IDQsXG4gICAgICAgICAgICAgICAgMjY6IDYsXG4gICAgICAgICAgICAgICAgMjc6IDE4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDIyLFxuICAgICAgICAgICAgICAgIDI6IDE3LFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDI3LFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDI1LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDE5LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTYsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMixcbiAgICAgICAgICAgICAgICAxODogMTIsXG4gICAgICAgICAgICAgICAgMTk6IDgsXG4gICAgICAgICAgICAgICAgMjA6IDcsXG4gICAgICAgICAgICAgICAgMjE6IDI2LFxuICAgICAgICAgICAgICAgIDIyOiAxLFxuICAgICAgICAgICAgICAgIDIzOiAyNCxcbiAgICAgICAgICAgICAgICAyNDogMjMsXG4gICAgICAgICAgICAgICAgMjU6IDYsXG4gICAgICAgICAgICAgICAgMjY6IDIxLFxuICAgICAgICAgICAgICAgIDI3OiA0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMCxcbiAgICAgICAgICAgICAgICAxOiAxOCxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxOSxcbiAgICAgICAgICAgICAgICA1OiAyNixcbiAgICAgICAgICAgICAgICA2OiAyNCxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiAyMixcbiAgICAgICAgICAgICAgICA5OiAyNSxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDIxLFxuICAgICAgICAgICAgICAgIDE0OiAyMyxcbiAgICAgICAgICAgICAgICAxNTogMTEsXG4gICAgICAgICAgICAgICAgMTY6IDMsXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDEsXG4gICAgICAgICAgICAgICAgMTk6IDQsXG4gICAgICAgICAgICAgICAgMjA6IDI3LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogOCxcbiAgICAgICAgICAgICAgICAyMzogMTQsXG4gICAgICAgICAgICAgICAgMjQ6IDYsXG4gICAgICAgICAgICAgICAgMjU6IDksXG4gICAgICAgICAgICAgICAgMjY6IDUsXG4gICAgICAgICAgICAgICAgMjc6IDIwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyMyxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDIxLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDE0LFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogMCxcbiAgICAgICAgICAgICAgICAxMjogMTYsXG4gICAgICAgICAgICAgICAgMTM6IDI3LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiAzLFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogMjQsXG4gICAgICAgICAgICAgICAgMTg6IDI2LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiAxMCxcbiAgICAgICAgICAgICAgICAyMTogNCxcbiAgICAgICAgICAgICAgICAyMjogMjUsXG4gICAgICAgICAgICAgICAgMjM6IDEsXG4gICAgICAgICAgICAgICAgMjQ6IDE3LFxuICAgICAgICAgICAgICAgIDI1OiAyMixcbiAgICAgICAgICAgICAgICAyNjogMTgsXG4gICAgICAgICAgICAgICAgMjc6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiAxNCxcbiAgICAgICAgICAgICAgICAyOiAyMSxcbiAgICAgICAgICAgICAgICAzOiAyMixcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDE1LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDgsXG4gICAgICAgICAgICAgICAgODogNyxcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAxOSxcbiAgICAgICAgICAgICAgICAxMTogMjUsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDI2LFxuICAgICAgICAgICAgICAgIDE3OiAyNyxcbiAgICAgICAgICAgICAgICAxODogMjMsXG4gICAgICAgICAgICAgICAgMTk6IDEwLFxuICAgICAgICAgICAgICAgIDIwOiAyNCxcbiAgICAgICAgICAgICAgICAyMTogMixcbiAgICAgICAgICAgICAgICAyMjogMyxcbiAgICAgICAgICAgICAgICAyMzogMTgsXG4gICAgICAgICAgICAgICAgMjQ6IDIwLFxuICAgICAgICAgICAgICAgIDI1OiAxMSxcbiAgICAgICAgICAgICAgICAyNjogMTYsXG4gICAgICAgICAgICAgICAgMjc6IDE3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMyxcbiAgICAgICAgICAgICAgICAxOiAyNSxcbiAgICAgICAgICAgICAgICAyOiAxOSxcbiAgICAgICAgICAgICAgICAzOiA5LFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDEyLFxuICAgICAgICAgICAgICAgIDY6IDE1LFxuICAgICAgICAgICAgICAgIDc6IDIxLFxuICAgICAgICAgICAgICAgIDg6IDI2LFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDE4LFxuICAgICAgICAgICAgICAgIDEyOiA1LFxuICAgICAgICAgICAgICAgIDEzOiAwLFxuICAgICAgICAgICAgICAgIDE0OiAyMCxcbiAgICAgICAgICAgICAgICAxNTogNixcbiAgICAgICAgICAgICAgICAxNjogMjcsXG4gICAgICAgICAgICAgICAgMTc6IDIzLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMixcbiAgICAgICAgICAgICAgICAyMDogMTQsXG4gICAgICAgICAgICAgICAgMjE6IDcsXG4gICAgICAgICAgICAgICAgMjI6IDI0LFxuICAgICAgICAgICAgICAgIDIzOiAxNyxcbiAgICAgICAgICAgICAgICAyNDogMjIsXG4gICAgICAgICAgICAgICAgMjU6IDEsXG4gICAgICAgICAgICAgICAgMjY6IDgsXG4gICAgICAgICAgICAgICAgMjc6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiAyMSxcbiAgICAgICAgICAgICAgICAyOiAxNSxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDE4LFxuICAgICAgICAgICAgICAgIDU6IDIzLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMjIsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMjQsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiAyNixcbiAgICAgICAgICAgICAgICAxMjogMjAsXG4gICAgICAgICAgICAgICAgMTM6IDEwLFxuICAgICAgICAgICAgICAgIDE0OiAwLFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAyNSxcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogNCxcbiAgICAgICAgICAgICAgICAxOTogMjcsXG4gICAgICAgICAgICAgICAgMjA6IDEyLFxuICAgICAgICAgICAgICAgIDIxOiAxLFxuICAgICAgICAgICAgICAgIDIyOiA3LFxuICAgICAgICAgICAgICAgIDIzOiA1LFxuICAgICAgICAgICAgICAgIDI0OiA5LFxuICAgICAgICAgICAgICAgIDI1OiAxNixcbiAgICAgICAgICAgICAgICAyNjogMTEsXG4gICAgICAgICAgICAgICAgMjc6IDE5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNSxcbiAgICAgICAgICAgICAgICAxOiAxNixcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAyMCxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiAyNixcbiAgICAgICAgICAgICAgICA4OiAyMyxcbiAgICAgICAgICAgICAgICA5OiAyNyxcbiAgICAgICAgICAgICAgICAxMDogMjUsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDIyLFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogMSxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDQsXG4gICAgICAgICAgICAgICAgMjE6IDI0LFxuICAgICAgICAgICAgICAgIDIyOiAxMixcbiAgICAgICAgICAgICAgICAyMzogOCxcbiAgICAgICAgICAgICAgICAyNDogMjEsXG4gICAgICAgICAgICAgICAgMjU6IDEwLFxuICAgICAgICAgICAgICAgIDI2OiA3LFxuICAgICAgICAgICAgICAgIDI3OiA5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNixcbiAgICAgICAgICAgICAgICAxOiAyNixcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDIwLFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMjUsXG4gICAgICAgICAgICAgICAgNjogMTQsXG4gICAgICAgICAgICAgICAgNzogMjQsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAxMyxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiA2LFxuICAgICAgICAgICAgICAgIDE1OiAyNyxcbiAgICAgICAgICAgICAgICAxNjogMCxcbiAgICAgICAgICAgICAgICAxNzogOSxcbiAgICAgICAgICAgICAgICAxODogOCxcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDMsXG4gICAgICAgICAgICAgICAgMjE6IDE5LFxuICAgICAgICAgICAgICAgIDIyOiAxMCxcbiAgICAgICAgICAgICAgICAyMzogMTIsXG4gICAgICAgICAgICAgICAgMjQ6IDcsXG4gICAgICAgICAgICAgICAgMjU6IDUsXG4gICAgICAgICAgICAgICAgMjY6IDEsXG4gICAgICAgICAgICAgICAgMjc6IDE1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxOSxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxOCxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAyNCxcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAyNSxcbiAgICAgICAgICAgICAgICA5OiAyMyxcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDI3LFxuICAgICAgICAgICAgICAgIDEzOiAyMixcbiAgICAgICAgICAgICAgICAxNDogNyxcbiAgICAgICAgICAgICAgICAxNTogMjYsXG4gICAgICAgICAgICAgICAgMTY6IDQsXG4gICAgICAgICAgICAgICAgMTc6IDAsXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICAgICAgMjA6IDYsXG4gICAgICAgICAgICAgICAgMjE6IDEwLFxuICAgICAgICAgICAgICAgIDIyOiAxMyxcbiAgICAgICAgICAgICAgICAyMzogOSxcbiAgICAgICAgICAgICAgICAyNDogNSxcbiAgICAgICAgICAgICAgICAyNTogOCxcbiAgICAgICAgICAgICAgICAyNjogMTUsXG4gICAgICAgICAgICAgICAgMjc6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOCxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiAyMixcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiA5LFxuICAgICAgICAgICAgICAgIDc6IDI1LFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDIzLFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogMyxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogMjcsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDI2LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiAyNCxcbiAgICAgICAgICAgICAgICAyMDogMTEsXG4gICAgICAgICAgICAgICAgMjE6IDUsXG4gICAgICAgICAgICAgICAgMjI6IDIsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgICAgIDI0OiAxOSxcbiAgICAgICAgICAgICAgICAyNTogNyxcbiAgICAgICAgICAgICAgICAyNjogMTcsXG4gICAgICAgICAgICAgICAgMjc6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOSxcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDIzLFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMTUsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiAxOCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDI3LFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMjIsXG4gICAgICAgICAgICAgICAgMTI6IDI0LFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAyMSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogMTAsXG4gICAgICAgICAgICAgICAgMTc6IDI1LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiAwLFxuICAgICAgICAgICAgICAgIDIwOiAyNixcbiAgICAgICAgICAgICAgICAyMTogMTQsXG4gICAgICAgICAgICAgICAgMjI6IDExLFxuICAgICAgICAgICAgICAgIDIzOiAyLFxuICAgICAgICAgICAgICAgIDI0OiAxMixcbiAgICAgICAgICAgICAgICAyNTogMTcsXG4gICAgICAgICAgICAgICAgMjY6IDIwLFxuICAgICAgICAgICAgICAgIDI3OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDI3LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMTQsXG4gICAgICAgICAgICAgICAgNTogMTMsXG4gICAgICAgICAgICAgICAgNjogMjMsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMjEsXG4gICAgICAgICAgICAgICAgMTI6IDI2LFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAyNCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogMjIsXG4gICAgICAgICAgICAgICAgMTg6IDEwLFxuICAgICAgICAgICAgICAgIDE5OiAyNSxcbiAgICAgICAgICAgICAgICAyMDogMCxcbiAgICAgICAgICAgICAgICAyMTogMTEsXG4gICAgICAgICAgICAgICAgMjI6IDE3LFxuICAgICAgICAgICAgICAgIDIzOiA2LFxuICAgICAgICAgICAgICAgIDI0OiAxNSxcbiAgICAgICAgICAgICAgICAyNTogMTksXG4gICAgICAgICAgICAgICAgMjY6IDEyLFxuICAgICAgICAgICAgICAgIDI3OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMSxcbiAgICAgICAgICAgICAgICAxOiAyNyxcbiAgICAgICAgICAgICAgICAyOiAxNCxcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDIyLFxuICAgICAgICAgICAgICAgIDY6IDEyLFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMjAsXG4gICAgICAgICAgICAgICAgMTA6IDI0LFxuICAgICAgICAgICAgICAgIDExOiAyMyxcbiAgICAgICAgICAgICAgICAxMjogNixcbiAgICAgICAgICAgICAgICAxMzogNyxcbiAgICAgICAgICAgICAgICAxNDogMixcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAyNSxcbiAgICAgICAgICAgICAgICAxOTogMjYsXG4gICAgICAgICAgICAgICAgMjA6IDksXG4gICAgICAgICAgICAgICAgMjE6IDAsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDExLFxuICAgICAgICAgICAgICAgIDI0OiAxMCxcbiAgICAgICAgICAgICAgICAyNTogMTgsXG4gICAgICAgICAgICAgICAgMjY6IDE5LFxuICAgICAgICAgICAgICAgIDI3OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMixcbiAgICAgICAgICAgICAgICAxOiAxMyxcbiAgICAgICAgICAgICAgICAyOiAxNixcbiAgICAgICAgICAgICAgICAzOiAxMCxcbiAgICAgICAgICAgICAgICA0OiAyMyxcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDE1LFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMjYsXG4gICAgICAgICAgICAgICAgMTA6IDMsXG4gICAgICAgICAgICAgICAgMTE6IDI3LFxuICAgICAgICAgICAgICAgIDEyOiAyNSxcbiAgICAgICAgICAgICAgICAxMzogMSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDcsXG4gICAgICAgICAgICAgICAgMTY6IDIsXG4gICAgICAgICAgICAgICAgMTc6IDE0LFxuICAgICAgICAgICAgICAgIDE4OiAyNCxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiA2LFxuICAgICAgICAgICAgICAgIDIyOiAwLFxuICAgICAgICAgICAgICAgIDIzOiA0LFxuICAgICAgICAgICAgICAgIDI0OiAxOCxcbiAgICAgICAgICAgICAgICAyNTogMTIsXG4gICAgICAgICAgICAgICAgMjY6IDksXG4gICAgICAgICAgICAgICAgMjc6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxMCxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiAxOSxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAyNyxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAyMixcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMjQsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDI2LFxuICAgICAgICAgICAgICAgIDE1OiAyNSxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgICAgICAxODogMjEsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICAgICAgMjA6IDgsXG4gICAgICAgICAgICAgICAgMjE6IDE4LFxuICAgICAgICAgICAgICAgIDIyOiA5LFxuICAgICAgICAgICAgICAgIDIzOiAwLFxuICAgICAgICAgICAgICAgIDI0OiAxMSxcbiAgICAgICAgICAgICAgICAyNTogMTUsXG4gICAgICAgICAgICAgICAgMjY6IDE0LFxuICAgICAgICAgICAgICAgIDI3OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNCxcbiAgICAgICAgICAgICAgICAxOiAyMCxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDI3LFxuICAgICAgICAgICAgICAgIDQ6IDI2LFxuICAgICAgICAgICAgICAgIDU6IDE4LFxuICAgICAgICAgICAgICAgIDY6IDIyLFxuICAgICAgICAgICAgICAgIDc6IDEyLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDE3LFxuICAgICAgICAgICAgICAgIDExOiAxOSxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMjUsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiAyMyxcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiAxMSxcbiAgICAgICAgICAgICAgICAyMDogMSxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogNixcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICAgICAgMjQ6IDAsXG4gICAgICAgICAgICAgICAgMjU6IDEzLFxuICAgICAgICAgICAgICAgIDI2OiA0LFxuICAgICAgICAgICAgICAgIDI3OiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNSxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiA0LFxuICAgICAgICAgICAgICAgIDQ6IDMsXG4gICAgICAgICAgICAgICAgNTogMjAsXG4gICAgICAgICAgICAgICAgNjogMjcsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMjQsXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMjYsXG4gICAgICAgICAgICAgICAgMTQ6IDIyLFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA3LFxuICAgICAgICAgICAgICAgIDE3OiAyMSxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogMjMsXG4gICAgICAgICAgICAgICAgMjA6IDUsXG4gICAgICAgICAgICAgICAgMjE6IDE3LFxuICAgICAgICAgICAgICAgIDIyOiAxNCxcbiAgICAgICAgICAgICAgICAyMzogMTksXG4gICAgICAgICAgICAgICAgMjQ6IDgsXG4gICAgICAgICAgICAgICAgMjU6IDAsXG4gICAgICAgICAgICAgICAgMjY6IDEzLFxuICAgICAgICAgICAgICAgIDI3OiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNixcbiAgICAgICAgICAgICAgICAxOiAxNyxcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxMixcbiAgICAgICAgICAgICAgICA1OiAyNyxcbiAgICAgICAgICAgICAgICA2OiAxMCxcbiAgICAgICAgICAgICAgICA3OiAyMyxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiAxOCxcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDI0LFxuICAgICAgICAgICAgICAgIDE0OiAyNSxcbiAgICAgICAgICAgICAgICAxNTogMjIsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiAxLFxuICAgICAgICAgICAgICAgIDE4OiA5LFxuICAgICAgICAgICAgICAgIDE5OiAzLFxuICAgICAgICAgICAgICAgIDIwOiAyLFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiAxNSxcbiAgICAgICAgICAgICAgICAyMzogNyxcbiAgICAgICAgICAgICAgICAyNDogMTMsXG4gICAgICAgICAgICAgICAgMjU6IDE0LFxuICAgICAgICAgICAgICAgIDI2OiAwLFxuICAgICAgICAgICAgICAgIDI3OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDI1LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMjIsXG4gICAgICAgICAgICAgICAgNTogMTYsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAyNixcbiAgICAgICAgICAgICAgICAxMTogMTcsXG4gICAgICAgICAgICAgICAgMTI6IDIxLFxuICAgICAgICAgICAgICAgIDEzOiAyMyxcbiAgICAgICAgICAgICAgICAxNDogMjQsXG4gICAgICAgICAgICAgICAgMTU6IDIwLFxuICAgICAgICAgICAgICAgIDE2OiA1LFxuICAgICAgICAgICAgICAgIDE3OiAxMSxcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgICAgICAyMDogMTUsXG4gICAgICAgICAgICAgICAgMjE6IDEyLFxuICAgICAgICAgICAgICAgIDIyOiA0LFxuICAgICAgICAgICAgICAgIDIzOiAxMyxcbiAgICAgICAgICAgICAgICAyNDogMTQsXG4gICAgICAgICAgICAgICAgMjU6IDIsXG4gICAgICAgICAgICAgICAgMjY6IDEwLFxuICAgICAgICAgICAgICAgIDI3OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xuXG4gICAgc3RhdGljIGdlbmVyYXRlVGFibGVGb3IyKG1lbWJlcklkczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlcklkcyA9IG1lbWJlcklkcy5zbGljZSgpO1xuICAgICAgICBpZiAobWVtYmVySWRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIG1lbWJlcklkcy5wdXNoKCdKT0tFUicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbnVtYmVyVGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlVGFibGUyKG1lbWJlcklkcy5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChudW1iZXJUYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVGFibGUubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWRDb2x1bW5bbWVtYmVySWRzW051bWJlcihpbmRleCldXSA9IG1lbWJlcklkc1tjb2x1bW5bTnVtYmVyKGluZGV4KV1dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWRDb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZW5lcmF0ZVRhYmxlMihudW1QcmF5ZXJzOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bVByYXllcnMgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlUGFydG5lcnM6IFBvc3NpYmxlUGFydG5lcnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHBvc3NpYmxlUGFydG5lcnNbaV0gPSBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5LmZpbHRlcigoaWQpID0+IGlkICE9PSBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYmxlOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnMgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHRhYmxlLnB1c2goe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVDb2x1bW4yKHRhYmxlLCAwLCBwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNvbHVtbjIoXG4gICAgICAgIHRhYmxlOiBDb2x1bW5bXSxcbiAgICAgICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICAgICAgcG9zc2libGVQYXJ0bmVyczogUG9zc2libGVQYXJ0bmVyc1xuICAgICk6IENvbHVtbltdIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0YWJsZVtjb2x1bW5JbmRleF07XG4gICAgICAgIGNvbnN0IG5ld1Bvc3NpYmxlUGFydG5lcnMgPSBKc29uSGVscGVyLmRlZXBDb3B5KHBvc3NpYmxlUGFydG5lcnMpO1xuICAgICAgICBjb25zdCByZXMgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlUGFpcjIoY29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhYmxlW2NvbHVtbkluZGV4XSA9IHJlcy5jb2x1bW47XG4gICAgICAgIC8vIGNoZWNrIHNvbHZlZFxuICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IHRhYmxlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzID0gcmVzLnBvc3NpYmxlUGFydG5lcnM7XG4gICAgICAgIHJldHVybiBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlQ29sdW1uMih0YWJsZSwgY29sdW1uSW5kZXggKyAxLCBwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVBhaXIyKFxuICAgICAgICBjb2x1bW46IENvbHVtbixcbiAgICAgICAgcG9zc2libGVQYXJ0bmVyczogUG9zc2libGVQYXJ0bmVyc1xuICAgICk6IHsgY29sdW1uOiBDb2x1bW47IHBvc3NpYmxlUGFydG5lcnM6IFBvc3NpYmxlUGFydG5lcnMgfSB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbWVtYmVyV2l0aG91dFBhcnRuZXIgPSBOdW1iZXIoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwb3NzaWJsZVBhcnRuZXJzKS5maW5kKChpZCkgPT4gY29sdW1uW051bWJlcihpZCldID09PSB1bmRlZmluZWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtZW1iZXJXaXRob3V0UGFydG5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbHVtbiwgcG9zc2libGVQYXJ0bmVycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld0NvbHVtbjogQ29sdW1uID0ge307XG4gICAgICAgIGxldCBuZXdQb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzID0ge307XG4gICAgICAgIGNvbnN0IGZvdW5kU29sdXRpb24gPSBwb3NzaWJsZVBhcnRuZXJzW21lbWJlcldpdGhvdXRQYXJ0bmVyXS5zb21lKChwYXJ0bmVySWQsIHBhcnRuZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbltwYXJ0bmVySWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0bXBDb2x1bW4gPSBKc29uSGVscGVyLmRlZXBDb3B5KGNvbHVtbik7XG4gICAgICAgICAgICB0bXBDb2x1bW5bbWVtYmVyV2l0aG91dFBhcnRuZXJdID0gcGFydG5lcklkO1xuICAgICAgICAgICAgdG1wQ29sdW1uW3BhcnRuZXJJZF0gPSBtZW1iZXJXaXRob3V0UGFydG5lcjtcblxuICAgICAgICAgICAgY29uc3QgdG1wUG9zc2libGVQYXJ0bmVycyA9IEpzb25IZWxwZXIuZGVlcENvcHkocG9zc2libGVQYXJ0bmVycyk7XG4gICAgICAgICAgICB0bXBQb3NzaWJsZVBhcnRuZXJzW21lbWJlcldpdGhvdXRQYXJ0bmVyXS5zcGxpY2UocGFydG5lckluZGV4LCAxKTtcbiAgICAgICAgICAgIGNvbnN0IG90aGVySW5kZXggPSB0bXBQb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXJJZF0uZmluZEluZGV4KChpZCkgPT4gaWQgPT09IG1lbWJlcldpdGhvdXRQYXJ0bmVyKTtcbiAgICAgICAgICAgIHRtcFBvc3NpYmxlUGFydG5lcnNbcGFydG5lcklkXS5zcGxpY2Uob3RoZXJJbmRleCwgMSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVQYWlyMih0bXBDb2x1bW4sIHRtcFBvc3NpYmxlUGFydG5lcnMpO1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdDb2x1bW4gPSByZXMuY29sdW1uO1xuICAgICAgICAgICAgbmV3UG9zc2libGVQYXJ0bmVycyA9IHJlcy5wb3NzaWJsZVBhcnRuZXJzO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChmb3VuZFNvbHV0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW46IG5ld0NvbHVtbiwgcG9zc2libGVQYXJ0bmVyczogbmV3UG9zc2libGVQYXJ0bmVycyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVUYWJsZXMoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlczogUmVjb3JkPG51bWJlciwgQ29sdW1uW10gfCBmYWxzZT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPD0gMjg7IGkgKz0gMikge1xuICAgICAgICAgICAgdGFibGVzW2ldID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVRhYmxlKGkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdUQUJMRVMnLCBKU09OLnN0cmluZ2lmeSh0YWJsZXMpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVUYWJsZUZvcihcbiAgICAgICAgbWVtYmVySWRzOiBzdHJpbmdbXSxcbiAgICAgICAgdXNlUGFydG5lcnMgPSB0cnVlXG4gICAgKTogW2ZhbHNlLCBmYWxzZV0gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPltdLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W11dIHtcbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbW10sIFtdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlcklkcyA9IG1lbWJlcklkcy5zbGljZSgpO1xuICAgICAgICBpZiAodXNlUGFydG5lcnMgJiYgbWVtYmVySWRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIG1lbWJlcklkcy5wdXNoKCdKT0tFUicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG51bWJlclRhYmxlOiBDb2x1bW5bXSB8IGZhbHNlO1xuICAgICAgICBpZiAoIXVzZVBhcnRuZXJzKSB7XG4gICAgICAgICAgICBudW1iZXJUYWJsZSA9IHRoaXMuZ2VuZXJhdGVDaGFpblRhYmxlRm9yKG1lbWJlcklkcy5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnVtYmVyVGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlVGFibGUobWVtYmVySWRzLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyVGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmluZmxhdGVUYWJsZShtZW1iZXJJZHMsIG51bWJlclRhYmxlKTtcbiAgICAgICAgY29uc3QgaW52ZXJ0ZWRUYWJsZSA9IFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2V0SW52ZXJ0ZWRDaGFpblRhYmxlRm9yKHRhYmxlKTtcbiAgICAgICAgcmV0dXJuIFt0YWJsZSwgaW52ZXJ0ZWRUYWJsZV07XG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlVGFibGUobnVtUHJheWVyczogbnVtYmVyKTogUmVjb3JkPG51bWJlciwgbnVtYmVyPltdIHwgZmFsc2Uge1xuICAgICAgICBpZiAobnVtUHJheWVycyAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnRhYmxlc1tudW1QcmF5ZXJzXSkge1xuICAgICAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IudGFibGVzW251bVByYXllcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJlcGFyZSBwb3NzaWJsZSBwYXJ0bmVyc1xuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvc3NpYmxlUGFydG5lcnM6IFJlY29yZDxudW1iZXIsIG51bWJlcltdPiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc1tpXSA9IHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkuZmlsdGVyKChpZCkgPT4gaWQgIT09IGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGU6IFJlY29yZDxudW1iZXIsIG51bWJlcj5bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHJheWVycyAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZUNvbHVtbihwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVUYWJsZTIobnVtUHJheWVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbLCBwb3NzaWJsZVBhcnRuZXJzXSA9IHJlcztcbiAgICAgICAgICAgIHRhYmxlLnB1c2gocmVzWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNvbHVtbihwb3NzaWJsZVBhcnRuZXJzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcnRuZXJCYXNlOiBudW1iZXJbXSA9IE9iamVjdC5rZXlzKHBvc3NpYmxlUGFydG5lcnMpLm1hcCgoaWQpID0+IE51bWJlcihpZCkpO1xuXG4gICAgICAgIHJldHVybiBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlUGFpcihjb2x1bW4sIHBvc3NpYmxlUGFydG5lcnMsIHBhcnRuZXJCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVBhaXIoXG4gICAgICAgIGNvbHVtbjogQ29sdW1uLFxuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4sXG4gICAgICAgIG9wZW5QcmF5ZXJzOiBudW1iZXJbXVxuICAgICk6IGZhbHNlIHwgW0NvbHVtbiwgUG9zc2libGVQYXJ0bmVyc10ge1xuICAgICAgICBjb25zdCBuZXdQb3NzaWJsZVBhcnRuZXJzID0gSnNvbkhlbHBlci5kZWVwQ29weShwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gSnNvbkhlbHBlci5kZWVwQ29weShjb2x1bW4pO1xuXG4gICAgICAgIGlmIChvcGVuUHJheWVycy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdFBhcnRuZXIsIHNlY29uZFBhcnRuZXJdID0gb3BlblByYXllcnM7XG4gICAgICAgICAgICBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnNldFBhcnRuZXJzKG5ld0NvbHVtbiwgbmV3UG9zc2libGVQYXJ0bmVycywgZmlyc3RQYXJ0bmVyLCBzZWNvbmRQYXJ0bmVyKTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3Q29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4gPSB7fTtcbiAgICAgICAgY29uc3QgW2ZpcnN0UGFydG5lcl0gPSBvcGVuUHJheWVycy5yZWR1Y2UoXG4gICAgICAgICAgICAoW3ByZXZJZCwgcHJldlZhbF06IFtudW1iZXIsIG51bWJlcl0sIGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFBvc3NpYmxlUGFydG5lcnMgPSBuZXdQb3NzaWJsZVBhcnRuZXJzW2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChvdGhlcklkKSA9PiAobmV3Q29sdW1uW290aGVySWRdID8/IC0xKSA9PT0gLTFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2lkXSA9IHJlYWxQb3NzaWJsZVBhcnRuZXJzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZWYWwgPiByZWFsUG9zc2libGVQYXJ0bmVycy5sZW5ndGggPyBbaWQsIHJlYWxQb3NzaWJsZVBhcnRuZXJzLmxlbmd0aF0gOiBbcHJldklkLCBwcmV2VmFsXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbLTEsIEluZmluaXR5XVxuICAgICAgICApO1xuXG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IFtzZWNvbmRQYXJ0bmVyXSA9IHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2ZpcnN0UGFydG5lcl0ucmVkdWNlKFxuICAgICAgICAgICAgICAgIChbcHJldklkLCBwcmV2VmFsXSwgaWQpID0+XG4gICAgICAgICAgICAgICAgICAgIHByZXZWYWwgPiByZWFsUG9zc2libGVQYXJ0bmVyc01hcFtpZF0ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtpZCwgcmVhbFBvc3NpYmxlUGFydG5lcnNNYXBbaWRdLmxlbmd0aF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW3ByZXZJZCwgcHJldlZhbF0sXG4gICAgICAgICAgICAgICAgWy0xLCBJbmZpbml0eV1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWNvbmRQYXJ0bmVyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5zZXRQYXJ0bmVycyhuZXdDb2x1bW4sIG5ld1Bvc3NpYmxlUGFydG5lcnMsIGZpcnN0UGFydG5lciwgc2Vjb25kUGFydG5lcik7XG4gICAgICAgICAgICBjb25zdCBuZXdPcGVuUHJheWVycyA9IG9wZW5QcmF5ZXJzLmZpbHRlcigoaWQpID0+IGlkICE9PSBmaXJzdFBhcnRuZXIgJiYgaWQgIT09IHNlY29uZFBhcnRuZXIpO1xuICAgICAgICAgICAgcmVzID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVBhaXIobmV3Q29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzLCBuZXdPcGVuUHJheWVycyk7XG4gICAgICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2ZpcnN0UGFydG5lcl0uc3BsaWNlKFxuICAgICAgICAgICAgICAgICAgICByZWFsUG9zc2libGVQYXJ0bmVyc01hcFtmaXJzdFBhcnRuZXJdLmluZGV4T2Yoc2Vjb25kUGFydG5lciksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghcmVzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNldFBhcnRuZXJzKGNvbHVtbjogQ29sdW1uLCBwb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzLCBwYXJ0bmVyMTogbnVtYmVyLCBwYXJ0bmVyMjogbnVtYmVyKSB7XG4gICAgICAgIGNvbHVtbltwYXJ0bmVyMV0gPSBwYXJ0bmVyMjtcbiAgICAgICAgY29sdW1uW3BhcnRuZXIyXSA9IHBhcnRuZXIxO1xuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXIxXS5zcGxpY2UocG9zc2libGVQYXJ0bmVyc1twYXJ0bmVyMV0uaW5kZXhPZihwYXJ0bmVyMiksIDEpO1xuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXIyXS5zcGxpY2UocG9zc2libGVQYXJ0bmVyc1twYXJ0bmVyMl0uaW5kZXhPZihwYXJ0bmVyMSksIDEpO1xuXG4gICAgICAgIHJldHVybiBbY29sdW1uLCBwb3NzaWJsZVBhcnRuZXJzXSBhcyBbQ29sdW1uLCBQb3NzaWJsZVBhcnRuZXJzXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNoYWluVGFibGVGb3IobnVtUHJheWVyczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1QcmF5ZXJzIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHJheWVyczsgaSsrKSB7XG4gICAgICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW2ldID0gcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gaSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJsZTogUmVjb3JkPG51bWJlciwgbnVtYmVyPltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB0YWJsZS5wdXNoKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkuZm9yRWFjaCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJNZW1iZXJzID0gcG9zc2libGVQYXJ0bmVyc1ttZW1iZXJdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnMgLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWJsZVtpXVttZW1iZXJdID0gb3RoZXJNZW1iZXJzWyhpbmRleCArIGkpICUgb3RoZXJNZW1iZXJzLmxlbmd0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW52ZXJ0ZWRDaGFpblRhYmxlRm9yKHRhYmxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10pIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnZlcnRlZENvbHVtbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChpZDEpID0+IHtcbiAgICAgICAgICAgICAgICBpbnZlcnRlZENvbHVtbltjb2x1bW5baWQxXV0gPSBpZDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZlcnRlZENvbHVtbjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5mbGF0ZVRhYmxlKG1lbWJlcklkczogc3RyaW5nW10sIHRhYmxlOiBDb2x1bW5bXSkge1xuICAgICAgICByZXR1cm4gdGFibGUubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWRDb2x1bW5bbWVtYmVySWRzW051bWJlcihpbmRleCldXSA9IG1lbWJlcklkc1tjb2x1bW5bTnVtYmVyKGluZGV4KV1dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWRDb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoZWNrYm94LCBTd2l0Y2ggfSBmcm9tICdyZWFjdC1ib290c3RyYXAtbW9iaWxlJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQXBwRGlzcGF0Y2gsIHVzZUFwcFNlbGVjdG9yIH0gZnJvbSAnLi4vU3RvcmUvcmVkdXhIb29rcyc7XG5pbXBvcnQgeyBzZXRVc2VQYXJ0bmVycywgc2V0VXNlV2Vla2RheXMgfSBmcm9tICcuL3ByYXllckNpcmNsZVNsaWNlJztcbmltcG9ydCB7IHNldERlc2lnbiB9IGZyb20gJy4uL1NldHRpbmdzL3NldHRpbmdzU2xpY2UnO1xuXG5leHBvcnQgdHlwZSBQcmF5ZXJDaXJjbGVTZXR0aW5nc1Byb3BzID0ge307XG5cbmZ1bmN0aW9uIFByYXllckNpcmNsZVNldHRpbmdzKHt9OiBQcmF5ZXJDaXJjbGVTZXR0aW5nc1Byb3BzKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VBcHBEaXNwYXRjaCgpO1xuICAgIGNvbnN0IHVzZVdlZWtkYXlzID0gdXNlQXBwU2VsZWN0b3IoKHN0b3JlKSA9PiBzdG9yZS5wcmF5ZXJDaXJjbGUudXNlV2Vla2RheXMgPz8gZmFsc2UpO1xuICAgIGNvbnN0IHVzZVBhcnRuZXJzID0gdXNlQXBwU2VsZWN0b3IoKHN0b3JlKSA9PiBzdG9yZS5wcmF5ZXJDaXJjbGUudXNlUGFydG5lcnMgPz8gdHJ1ZSk7XG4gICAgY29uc3QgZGVzaWduID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5zZXR0aW5ncy5kZXNpZ24pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBvbkNoYW5nZVVzZVdlZWtkYXlzID0gdXNlQ2FsbGJhY2soKHsgdGFyZ2V0OiB7IGNoZWNrZWQgfSB9KSA9PiBkaXNwYXRjaChzZXRVc2VXZWVrZGF5cyhjaGVja2VkKSksIFtkaXNwYXRjaF0pO1xuICAgIGNvbnN0IG9uQ2hhbmdlVXNlUGFydG5lcnMgPSB1c2VDYWxsYmFjaygoeyB0YXJnZXQ6IHsgY2hlY2tlZCB9IH0pID0+IGRpc3BhdGNoKHNldFVzZVBhcnRuZXJzKGNoZWNrZWQpKSwgW2Rpc3BhdGNoXSk7XG4gICAgY29uc3QgdG9nZ2xlVGhlbWVDYWxsYmFjayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgaWYgKGRlc2lnbiA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0RGVzaWduKCdmbGF0JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0RGVzaWduKCdtYXRlcmlhbCcpKTtcbiAgICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGVzaWduXSk7XG5cbiAgICAvLyBFZmZlY3RzXG5cbiAgICAvLyBPdGhlclxuXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxTd2l0Y2ggcHJlTGFiZWw9XCJLZXR0ZVwiIG9uQ2hhbmdlPXtvbkNoYW5nZVVzZVBhcnRuZXJzfSBjaGVja2VkPXt1c2VQYXJ0bmVyc30+XG4gICAgICAgICAgICAgICAgUGFydG5lclxuICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxDaGVja2JveCBsYWJlbD1cIkJlbnV0emUgV29jaGVudGFnZVwiIGNoZWNrZWQ9e3VzZVdlZWtkYXlzfSBvbkNoYW5nZT17b25DaGFuZ2VVc2VXZWVrZGF5c30gLz5cbiAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgIGlkPVwic3dpdGNoVGhlbWVcIlxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2Rlc2lnbiA9PT0gJ2ZsYXQnfVxuICAgICAgICAgICAgICAgIHByZUxhYmVsPVwiYW5kcm9pZFwiXG4gICAgICAgICAgICAgICAgaXNEdWFsPXt0cnVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0b2dnbGVUaGVtZUNhbGxiYWNrfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIGlvc1xuICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgIDwvPlxuICAgICk7XG59XG5cbmNvbnN0IHRtcCA9IFJlYWN0Lm1lbW8oUHJheWVyQ2lyY2xlU2V0dGluZ3MpIGFzIHR5cGVvZiBQcmF5ZXJDaXJjbGVTZXR0aW5ncztcbmV4cG9ydCB7IHRtcCBhcyBQcmF5ZXJDaXJjbGVTZXR0aW5ncyB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UsIFBheWxvYWRBY3Rpb24gfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcbmltcG9ydCB7IE1lbWJlclR5cGUgfSBmcm9tICcuL01lbWJlclR5cGUnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAncHJveHktbWVtb2l6ZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlU3RhdGUgfSBmcm9tICcuLi9TdG9yZS9zdG9yZSc7XG5cbmV4cG9ydCBjb25zdCBwcmF5ZXJDaXJjbGVTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiAncHJheWVyQ2lyY2xlJyxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgbWVtYmVyczoge30gYXMgUmVjb3JkPHN0cmluZywgTWVtYmVyVHlwZT4sXG4gICAgICAgIHdlZWs6IDAsXG4gICAgICAgIHVzZVdlZWtkYXlzOiBmYWxzZSxcbiAgICAgICAgdXNlUGFydG5lcnM6IHRydWUsXG4gICAgfSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgICBzYXZlTWVtYmVyOiAoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxNZW1iZXJUeXBlPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICBzdGF0ZS5tZW1iZXJzW21lbWJlci5pZF0gPSBtZW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZU1lbWJlcjogKHN0YXRlLCB7IHBheWxvYWQ6IG1lbWJlcklkIH06IFBheWxvYWRBY3Rpb248c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLm1lbWJlcnNbbWVtYmVySWRdO1xuICAgICAgICB9LFxuICAgICAgICBzZXRXZWVrOiAoc3RhdGUsIHsgcGF5bG9hZDogd2VlayB9OiBQYXlsb2FkQWN0aW9uPG51bWJlcj4pID0+IHtcbiAgICAgICAgICAgIHN0YXRlLndlZWsgPSB3ZWVrO1xuICAgICAgICB9LFxuICAgICAgICBzZXRVc2VXZWVrZGF5czogKHN0YXRlLCB7IHBheWxvYWQ6IHVzZVdlZWtkYXlzIH06IFBheWxvYWRBY3Rpb248Ym9vbGVhbj4pID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnVzZVdlZWtkYXlzID0gdXNlV2Vla2RheXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFVzZVBhcnRuZXJzOiAoc3RhdGUsIHsgcGF5bG9hZDogdXNlUGFydG5lcnMgfTogUGF5bG9hZEFjdGlvbjxib29sZWFuPikgPT4ge1xuICAgICAgICAgICAgc3RhdGUudXNlUGFydG5lcnMgPSB1c2VQYXJ0bmVycztcbiAgICAgICAgfSxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCB7IHNhdmVNZW1iZXIsIHJlbW92ZU1lbWJlciwgc2V0V2Vlaywgc2V0VXNlV2Vla2RheXMsIHNldFVzZVBhcnRuZXJzIH0gPSBwcmF5ZXJDaXJjbGVTbGljZS5hY3Rpb25zO1xuZXhwb3J0IGNvbnN0IHsgcmVkdWNlcjogcHJheWVyQ2lyY2xlIH0gPSBwcmF5ZXJDaXJjbGVTbGljZTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE1lbWJlcnMgPSBtZW1vaXplKChzdGF0ZTogU3RvcmVTdGF0ZSkgPT4gT2JqZWN0LnZhbHVlcyhzdGF0ZS5wcmF5ZXJDaXJjbGUubWVtYmVycykpO1xuZXhwb3J0IGNvbnN0IHNlbGVjdE1lbWJlcklkcyA9IG1lbW9pemUoKHN0YXRlOiBTdG9yZVN0YXRlKSA9PiBPYmplY3Qua2V5cyhzdGF0ZS5wcmF5ZXJDaXJjbGUubWVtYmVycykpO1xuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UsIFBheWxvYWRBY3Rpb24gfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gICAgbmFtZTogJ3NldHRpbmdzJyxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgZGVzaWduOiAnbWF0ZXJpYWwnIGFzICdtYXRlcmlhbCcgfCAnZmxhdCcsXG4gICAgfSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgICBzZXREZXNpZ246IChzdGF0ZSwgeyBwYXlsb2FkOiBkZXNpZ24gfTogUGF5bG9hZEFjdGlvbjwnbWF0ZXJpYWwnIHwgJ2ZsYXQnPikgPT4ge1xuICAgICAgICAgICAgc3RhdGUuZGVzaWduID0gZGVzaWduO1xuICAgICAgICB9LFxuICAgIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IHsgc2V0RGVzaWduIH0gPSBzZXR0aW5nc1NsaWNlLmFjdGlvbnM7XG5leHBvcnQgY29uc3QgeyByZWR1Y2VyOiBzZXR0aW5ncyB9ID0gc2V0dGluZ3NTbGljZTtcbiIsImltcG9ydCB7IFR5cGVkVXNlU2VsZWN0b3JIb29rLCB1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlU3RhdGUsIEFwcERpc3BhdGNoIH0gZnJvbSAnLi9zdG9yZSc7XG5cbi8vIFVzZSB0aHJvdWdob3V0IHlvdXIgYXBwIGluc3RlYWQgb2YgcGxhaW4gYHVzZURpc3BhdGNoYCBhbmQgYHVzZVNlbGVjdG9yYFxuZXhwb3J0IGNvbnN0IHVzZUFwcERpc3BhdGNoID0gKCkgPT4gdXNlRGlzcGF0Y2g8QXBwRGlzcGF0Y2g+KCk7XG5leHBvcnQgY29uc3QgdXNlQXBwU2VsZWN0b3I6IFR5cGVkVXNlU2VsZWN0b3JIb29rPFN0b3JlU3RhdGU+ID0gdXNlU2VsZWN0b3I7XG4iLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSAnQHJlZHV4anMvdG9vbGtpdCc7XG5pbXBvcnQgeyBwcmF5ZXJDaXJjbGUgfSBmcm9tICcuLi9QcmF5ZXJDaXJjbGUvcHJheWVyQ2lyY2xlU2xpY2UnO1xuaW1wb3J0IHsgTmF0aXZlU3RvcmFnZVByb21pc2UgfSBmcm9tICdjb3Jkb3ZhLXNpdGVzJztcbmltcG9ydCB7IHBlcnNpc3RSZWR1Y2VyLCBwZXJzaXN0U3RvcmUsIEZMVVNILCBSRUhZRFJBVEUsIFBBVVNFLCBQRVJTSVNULCBQVVJHRSwgUkVHSVNURVIgfSBmcm9tICdyZWR1eC1wZXJzaXN0JztcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSAnLi4vU2V0dGluZ3Mvc2V0dGluZ3NTbGljZSc7XG5cbmNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAgICBwcmF5ZXJDaXJjbGUsXG4gICAgc2V0dGluZ3MsXG59KTtcblxuY29uc3QgcGVyc2lzdENvbmZpZyA9IHtcbiAgICBrZXk6ICdyZWR1eC1zdG9yZScsXG4gICAgdmVyc2lvbjogMSxcbiAgICBzdG9yYWdlOiBOYXRpdmVTdG9yYWdlUHJvbWlzZSxcbn07XG5cbmNvbnN0IHBlcnNpc3RlZFJlZHVjZXIgPSBwZXJzaXN0UmVkdWNlcihwZXJzaXN0Q29uZmlnLCByZWR1Y2Vycyk7XG5cbmV4cG9ydCBjb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICByZWR1Y2VyOiBwZXJzaXN0ZWRSZWR1Y2VyLFxuICAgIG1pZGRsZXdhcmU6IChnZXREZWZhdWx0TWlkZGxld2FyZSkgPT5cbiAgICAgICAgZ2V0RGVmYXVsdE1pZGRsZXdhcmUoe1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQ2hlY2s6IHsgaWdub3JlZEFjdGlvbnM6IFtGTFVTSCwgUkVIWURSQVRFLCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFR0lTVEVSXSB9LFxuICAgICAgICB9KSxcbn0pO1xuXG4vLyBsZXQgc2F2ZVRpbWVvdXQ6IFRpbWVvdXRJZCB8IHVuZGVmaW5lZDtcbi8vIHN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4vLyAgICAgaWYgKCFzYXZlVGltZW91dCkge1xuLy8gICAgICAgICBzYXZlVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuLy8gICAgICAgICAgICAgc2F2ZVRpbWVvdXQgPSB1bmRlZmluZWQ7XG4vLyAgICAgICAgICAgICBjb25zdCBkYXRhID0gc3RvcmUuZ2V0U3RhdGUoKTtcbi8vICAgICAgICAgICAgIGF3YWl0IE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnNldEl0ZW0oYHN0b3JlLWRhdGFgLCBkYXRhKTtcbi8vICAgICAgICAgfSwgNTAwKTtcbi8vICAgICB9XG4vLyB9KTtcbmV4cG9ydCBjb25zdCBwZXJzaXN0b3IgPSBwZXJzaXN0U3RvcmUoc3RvcmUpO1xuXG5leHBvcnQgdHlwZSBTdG9yZVN0YXRlID0gUmV0dXJuVHlwZTx0eXBlb2Ygc3RvcmUuZ2V0U3RhdGU+O1xuZXhwb3J0IHR5cGUgQXBwRGlzcGF0Y2ggPSB0eXBlb2Ygc3RvcmUuZGlzcGF0Y2g7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgU2l0ZXMgfSBmcm9tICdjb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50JztcblxuaW1wb3J0ICdib290c3RyYXAvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MnO1xuaW1wb3J0ICcuLi9zYXNzL2luZGV4LnNjc3MnO1xuXG5pbXBvcnQgeyBwZXJzaXN0b3IsIHN0b3JlIH0gZnJvbSAnLi9TdG9yZS9zdG9yZSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFByYXllckNpcmNsZSB9IGZyb20gJy4vUHJheWVyQ2lyY2xlL1ByYXllckNpcmNsZSc7XG5pbXBvcnQgeyBQZXJzaXN0R2F0ZSB9IGZyb20gJ3JlZHV4LXBlcnNpc3QvaW50ZWdyYXRpb24vcmVhY3QnO1xuXG5jb25zdCBXcmFwcGVyID0gUmVhY3QubWVtbygoeyBjaGlsZHJlbiB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPFBlcnNpc3RHYXRlIHBlcnNpc3Rvcj17cGVyc2lzdG9yfSBsb2FkaW5nPXtudWxsfT5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9QZXJzaXN0R2F0ZT5cbiAgICApO1xufSk7XG5cblJlYWN0RE9NLnJlbmRlcihcbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlfT5cbiAgICAgICAgPFNpdGVzIHN0YXJ0U2l0ZT17UHJheWVyQ2lyY2xlfSBiYXNlUGF0aD17d2luZG93LmxvY2F0aW9uLm9yaWdpbn0gY29udGVudFdyYXBwZXI9e1dyYXBwZXJ9IC8+XG4gICAgPC9Qcm92aWRlcj4sXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWNvbnRhaW5lcicpXG4pO1xuXG5sZXQgb2xkRGVzaWduOiAnbWF0ZXJpYWwnIHwgJ2ZsYXQnID0gJ21hdGVyaWFsJztcbnN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgY29uc3QgbmV3RGVzaWduID0gc3RvcmUuZ2V0U3RhdGUoKS5zZXR0aW5ncy5kZXNpZ247XG4gICAgaWYgKG9sZERlc2lnbiAhPT0gbmV3RGVzaWduKSB7XG4gICAgICAgIG9sZERlc2lnbiA9IG5ld0Rlc2lnbjtcblxuICAgICAgICBpZiAobmV3RGVzaWduID09PSAnbWF0ZXJpYWwnKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsYXQtZGVzaWduJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ21hdGVyaWFsLWRlc2lnbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtYXRlcmlhbC1kZXNpZ24nKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnZmxhdC1kZXNpZ24nKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0UGFyZW50Tm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRTY3JvbGxQYXJlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Vmlld3BvcnRSZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZW51bXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLWJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2Zvcm1hdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VuaXF1ZUJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy93aXRoaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1hcmlhL3Nzci9kaXN0L21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlZHV4anMvdG9vbGtpdC9kaXN0L3JlZHV4LXRvb2xraXQuZXNtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ2FsbGJhY2tSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VDb21taXR0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VFdmVudENhbGxiYWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlSXNvbW9ycGhpY0VmZmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1lcmdlZFJlZnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNb3VudGVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlVGltZW91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZUVmZmVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VXaWxsVW5tb3VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0FuY2hvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0RhdGFLZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Ecm9wZG93bi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duSXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duTWVudS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL0Ryb3Bkb3duVG9nZ2xlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vTW9kYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9Nb2RhbE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS9OYXZDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vTmF2SXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL05vb3BUcmFuc2l0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL1NlbGVjdGFibGVDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vVGFiQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL1RhYlBhbmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vVGFicy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL2dldFNjcm9sbGJhcldpZHRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9lc20vbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3BvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3Nzci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVBvcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVJvb3RDbG9zZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvZXNtL3VzZVdhaXRGb3JET01SZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL2VzbS91c2VXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ2FsbGJhY2tSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlQ29tbWl0dGVkUmVmLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZUV2ZW50Q2FsbGJhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VGb3JjZVVwZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VHbG9iYWxMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VJc29tb3JwaGljRWZmZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1lcmdlU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlTWVyZ2VTdGF0ZUZyb21Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHJlc3RhcnQvdWkvbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L2hvb2tzL2VzbS91c2VNZXJnZWRSZWZzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZU1vdW50ZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUHJldmlvdXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUmFmSW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlUmVzaXplT2JzZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlU2FmZVN0YXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AcmVzdGFydC91aS9ub2RlX21vZHVsZXMvQHJlc3RhcnQvaG9va3MvZXNtL3VzZVVwZGF0ZWRSZWYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0ByZXN0YXJ0L3VpL25vZGVfbW9kdWxlcy9AcmVzdGFydC9ob29rcy9lc20vdXNlV2lsbFVubW91bnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2Rpc3QvY3NzL2Jvb3RzdHJhcC5taW4uY3NzPzk0NDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL0RlZXBMaW5rcy9EZWVwTGlua0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL0RlZXBMaW5rcy9Sb3V0ZURlZXBMaW5rSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZG92YS1zaXRlcy9kaXN0L2NsaWVudC9BcHAvSG9va3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vQ2xhc3NTaXRlQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0FwcC9TaXRlQW5pbWF0aW9uL0RlZmF1bHRTaXRlQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0FwcC9TaXRlQW5pbWF0aW9uL1NpdGVBbmltYXRpb25JbnRlcmZhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVJZENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvQXBwL1NpdGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L0RldmljZVJlYWR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L05hdGl2ZVN0b3JhZ2VQcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvRmluaXNoU2l0ZUxpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvU2l0ZS9TaXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvU2l0ZUNvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZG92YS1zaXRlcy9kaXN0L2NsaWVudC9TaXRlL1NpdGVMaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50L1NpdGUvVG9wQmFyL0JhY2tCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2l0ZXMvZGlzdC9jbGllbnQvU2l0ZS9Ub3BCYXIvVG9wQmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGVxdWFsL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWN0aXZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2FkZENsYXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vYWRkRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2NhbWVsaXplLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY2FuVXNlRE9NLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vY29udGFpbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9jc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9nZXRDb21wdXRlZFN0eWxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vaGFzQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9oeXBoZW5hdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS9oeXBoZW5hdGVTdHlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL2lzVHJhbnNmb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vbGlzdGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vb3duZXJEb2N1bWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL293bmVyV2luZG93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcXVlcnlTZWxlY3RvckFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL3JlbW92ZUNsYXNzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vcmVtb3ZlRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXNtL3Njcm9sbGJhclNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2VzbS90cmFuc2l0aW9uRW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kb20taGVscGVycy9lc20vdHJpZ2dlckV2ZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5lc20uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzLWhlbHBlci9kaXN0L3NoYXJlZC9BcnJheUhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0NvdW50ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2pzLWhlbHBlci9kaXN0L3NoYXJlZC9EYXRlSGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvSGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvSnNvbkhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL01pZ3JhdGlvbkhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL09iamVjdEhlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1ByaW9yaXRpemVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qcy1oZWxwZXIvZGlzdC9zaGFyZWQvUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1JhbmRvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvanMtaGVscGVyL2Rpc3Qvc2hhcmVkL1hTU0hlbHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtbGlicy1icm93c2VyL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy1leHRyYS9saWIvYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzLWV4dHJhL2xpYi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3h5LWNvbXBhcmUvZGlzdC9pbmRleC5tb2Rlcm4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3h5LW1lbW9pemUvZGlzdC9pbmRleC5tb2Rlcm4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9ib290c3RyYXBSZWFjdE1vYmlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9DYXJkL0NhcmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL0J1dHRvbi9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL0NoZWNrQm94L0NoZWNrYm94LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL0Zvcm1FbGVtZW50cy9FdmVudFR5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL0Zvcm1FbGVtZW50cy9JbnB1dC9IaWRkZW5JbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9Gb3JtRWxlbWVudHMvSW5wdXQvSW5wdXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvRm9ybUVsZW1lbnRzL1N3aXRjaC9Td2l0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGF5b3V0L0ZsZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGF5b3V0L0dyb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvTGlzdC9MaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1JibUNvbXBvbmVudFByb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RhYmxlL1RhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RleHQvQm9keS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwLW1vYmlsZS9kaXN0L3NyYy9Ub3BCYXIvVG9wQmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAtbW9iaWxlL2Rpc3Qvc3JjL1RvcEJhci9Ub3BCYXJCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvVHlwZUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUvZGlzdC9zcmMvaGVscGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Fic3RyYWN0TW9kYWxIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkJvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uQnV0dG9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkNvbGxhcHNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uSGVhZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0FjY29yZGlvbkl0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWNjb3JkaW9uSXRlbUNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQWxlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQW5jaG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0JhZGdlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Jvb3RzdHJhcE1vZGFsTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CcmVhZGNydW1iLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0JyZWFkY3J1bWJJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0J1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CdXR0b25Hcm91cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9CdXR0b25Ub29sYmFyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NhcmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NhcmRIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEhlYWRlckNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2FyZEltZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DYXJvdXNlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9DYXJvdXNlbENhcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vQ2Fyb3VzZWxJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Nsb3NlQnV0dG9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0NvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Db2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Db250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25CdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25Db250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Ryb3Bkb3duSXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ecm9wZG93bk1lbnUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRHJvcGRvd25Ub2dnbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRWxlbWVudENoaWxkcmVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0ZhZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmVlZGJhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmlndXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0ZpZ3VyZUNhcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmlndXJlSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRmxvYXRpbmdMYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Zvcm1DaGVjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ2hlY2tJbnB1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ2hlY2tMYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtQ29udHJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtRmxvYXRpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRm9ybUdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0Zvcm1MYWJlbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vRm9ybVNlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Gb3JtVGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9JbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9JbnB1dEdyb3VwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0lucHV0R3JvdXBDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL0xpc3RHcm91cC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9MaXN0R3JvdXBJdGVtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL01vZGFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL01vZGFsQm9keS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Nb2RhbENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxEaWFsb2cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxGb290ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTW9kYWxUaXRsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2RHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vTmF2SXRlbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZMaW5rLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdmJhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJCcmFuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJDb2xsYXBzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL05hdmJhck9mZmNhbnZhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9OYXZiYXJUb2dnbGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc0JvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT2ZmY2FudmFzSGVhZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc1RpdGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL09mZmNhbnZhc1RvZ2dsaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL092ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vT3ZlcmxheVRyaWdnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUGFnZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9QbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9QbGFjZWhvbGRlckJ1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Qb3BvdmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1BvcG92ZXJCb2R5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1BvcG92ZXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUHJvZ3Jlc3NCYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUmF0aW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vUm93LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1NTUlByb3ZpZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1NwaW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3BsaXRCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3RhY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vU3dpdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UYWJDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVGFiQ29udGVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UYWJQYW5lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RhYnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVGhlbWVQcm92aWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdEJvZHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9hc3RDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9hc3RDb250ZXh0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL1RvYXN0RmFkZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2FzdEhlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9Ub2dnbGVCdXR0b24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9nZ2xlQnV0dG9uR3JvdXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9UcmFuc2l0aW9uV3JhcHBlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9jcmVhdGVDaGFpbmVkRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vY3JlYXRlVXRpbGl0eUNsYXNzZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vY3JlYXRlV2l0aEJzUHJlZml4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL2RpdldpdGhDbGFzc05hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvZXNtL3NhZmVGaW5kRE9NTm9kZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS90cmFuc2l0aW9uRW5kTGlzdGVuZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdHJpZ2dlckJyb3dzZXJSZWZsb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9lc20vdXNlT3ZlcmxheU9mZnNldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS91c2VQbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2VzbS91c2VXcmFwcGVkUmVmV2l0aFdhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0L3JlYWN0LWxpZmVjeWNsZXMtY29tcGF0LmVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL0NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L2Nvbm5lY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2V4cG9ydHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZURpc3BhdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVNlbGVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10YWJsZS9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10YWJsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vVHJhbnNpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vVHJhbnNpdGlvbkdyb3VwQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9lc20vY29uZmlnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL2VzbS91dGlscy9Qcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC1wZXJzaXN0L2VzL2NyZWF0ZU1pZ3JhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvY3JlYXRlUGVyc2lzdG9pZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9jcmVhdGVUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvZ2V0U3RvcmVkU3RhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvaW50ZWdyYXRpb24vcmVhY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvcGVyc2lzdENvbWJpbmVSZWR1Y2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9wZXJzaXN0UmVkdWNlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9wZXJzaXN0U3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXBlcnNpc3QvZXMvcHVyZ2VTdG9yZWRTdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVkdXgtcGVyc2lzdC9lcy9zdGF0ZVJlY29uY2lsZXIvYXV0b01lcmdlTGV2ZWwxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC1wZXJzaXN0L2VzL3N0YXRlUmVjb25jaWxlci9hdXRvTWVyZ2VMZXZlbDIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVmbGVjdC1tZXRhZGF0YS9SZWZsZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZXNlbGVjdC9lcy9kZWZhdWx0TWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVzZWxlY3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvdHJhY2luZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL2hhc2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYTEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyMjQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyNTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEzODQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGE1MTIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NhY2hlL0RiUXVlcnlSZXN1bHRDYWNoZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NhY2hlL1F1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY2FjaGUvUmVkaXNRdWVyeVJlc3VsdENhY2hlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL0RlZXBQYXJ0aWFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL0VudGl0eVRhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2NvbW1vbi9PYmplY3RMaXRlcmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29tbW9uL09iamVjdFR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9jb25uZWN0aW9uL0Nvbm5lY3Rpb25NYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29ubmVjdGlvbi9Db25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvY29udGFpbmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0NoZWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0VudGl0eVJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvRXhjbHVzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL0dlbmVyYXRlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9JbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9VbmlxdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9Db2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9DcmVhdGVEYXRlQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvRGVsZXRlRGF0ZUNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL09iamVjdElkQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvUHJpbWFyeUNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvY29sdW1ucy9VcGRhdGVEYXRlQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2NvbHVtbnMvVmVyc2lvbkNvbHVtbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9jb2x1bW5zL1ZpZXdDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvZW50aXR5LXZpZXcvVmlld0VudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9lbnRpdHkvQ2hpbGRFbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvZW50aXR5L0VudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9lbnRpdHkvVGFibGVJbmhlcml0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQWZ0ZXJJbnNlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyTG9hZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQWZ0ZXJSZW1vdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyVXBkYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2xpc3RlbmVycy9CZWZvcmVJbnNlcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvbGlzdGVuZXJzL0JlZm9yZVJlbW92ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9saXN0ZW5lcnMvQmVmb3JlVXBkYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL2xpc3RlbmVycy9FdmVudFN1YnNjcmliZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL29wdGlvbnMvRW50aXR5T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL0luZGV4T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL0pvaW5Db2x1bW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL29wdGlvbnMvSm9pblRhYmxlT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL1JlbGF0aW9uT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9vcHRpb25zL1ZhbHVlVHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5Db2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5UYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9yZWxhdGlvbnMvTWFueVRvTWFueS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci9yZWxhdGlvbnMvTWFueVRvT25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9PbmVUb01hbnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvcmVsYXRpb25zL09uZVRvT25lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbkNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbklkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RlY29yYXRvci90cmFuc2FjdGlvbi9UcmFuc2FjdGlvblJlcG9zaXRvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kZWNvcmF0b3IvdHJlZS9UcmVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZUNoaWxkcmVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZUxldmVsQ29sdW1uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZGVjb3JhdG9yL3RyZWUvVHJlZVBhcmVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9Ecml2ZXJGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL0RyaXZlclV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL1F1ZXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL1NxbEluTWVtb3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS1wZy9BdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2NhcGFjaXRvci9DYXBhY2l0b3JEcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvY2FwYWNpdG9yL0NhcGFjaXRvclF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL2NvcmRvdmEvQ29yZG92YURyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9jb3Jkb3ZhL0NvcmRvdmFRdWVyeVJ1bm5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9leHBvL0V4cG9Ecml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvZXhwby9FeHBvUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvbW9uZ29kYi90eXBpbmdzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL25hdGl2ZXNjcmlwdC9OYXRpdmVzY3JpcHREcml2ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvbmF0aXZlc2NyaXB0L05hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvcmVhY3QtbmF0aXZlL1JlYWN0TmF0aXZlRHJpdmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3JlYWN0LW5hdGl2ZS9SZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3NxbGl0ZS1hYnN0cmFjdC9BYnN0cmFjdFNxbGl0ZURyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxqcy9TcWxqc0RyaXZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci9zcWxqcy9TcWxqc1F1ZXJ5UnVubmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZHJpdmVyL3NxbHNlcnZlci9Nc3NxbFBhcmFtZXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2RyaXZlci90eXBlcy9EYXRhYmFzZVR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvdHlwZXMvTWV0YWRhdGFUYWJsZVR5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9kcml2ZXIvdHlwZXMvUmVwbGljYXRpb25Nb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LW1hbmFnZXIvRW50aXR5TWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2VudGl0eS1tYW5hZ2VyL0VudGl0eU1hbmFnZXJGYWN0b3J5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LW1hbmFnZXIvU3FsanNFbnRpdHlNYW5hZ2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0Nhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DaXJjdWxhclJlbGF0aW9uc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ29ubmVjdGlvbklzTm90U2V0RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Db25uZWN0aW9uTm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0N1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9DdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0RhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0RyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0VudGl0eUNvbHVtbk5vdEZvdW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvRW50aXR5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL0ZpbmRSZWxhdGlvbnNOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9NaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWlzc2luZ0RyaXZlckVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTWlzc2luZ0pvaW5Db2x1bW5FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01pc3NpbmdKb2luVGFibGVFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL01pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9NdXN0QmVFbnRpdHlFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL05hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL05lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTm9Db25uZWN0aW9uRm9yUmVwb3NpdG9yeUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ob05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL09mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL09wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9QZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9SZXBvc2l0b3J5Tm90VHJlZUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1N1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9UcmVlUmVwb3NpdG9yeU5vdFN1cHBvcnRlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVHlwZU9STUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9lcnJvci9Vc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZXJyb3IvVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL1VzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2Vycm9yL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0ZpbmRDb25kaXRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0ZpbmRNYW55T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT25lT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT3BlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvRmluZE9wZXJhdG9yVHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL0pvaW5PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQW55LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0JldHdlZW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSXNOdWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuT3JFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9MaWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuT3JFcXVhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9Ob3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9maW5kLW9wdGlvbnMvb3BlcmF0b3IvUmF3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvZ2xvYmFscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbG9nZ2VyL0FkdmFuY2VkQ29uc29sZUxvZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9EZWJ1Z0xvZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9Mb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9sb2dnZXIvTG9nZ2VyRmFjdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL2xvZ2dlci9Mb2dnZXJPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbG9nZ2VyL1NpbXBsZUNvbnNvbGVMb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1hcmdzL01ldGFkYXRhQXJnc1N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL0Nsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhLWJ1aWxkZXIvRW50aXR5TWV0YWRhdGFCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEtYnVpbGRlci9FbnRpdHlNZXRhZGF0YVZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhLWJ1aWxkZXIvSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL01ldGFkYXRhVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS1idWlsZGVyL1JlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9DaGVja01ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9FbWJlZGRlZE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvRW50aXR5TGlzdGVuZXJNZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvRXhjbHVzaW9uTWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9Gb3JlaWduS2V5TWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9tZXRhZGF0YS9JbmRleE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25Db3VudE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25JZE1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvUmVsYXRpb25NZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21ldGFkYXRhL1VuaXF1ZU1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWV0YWRhdGEvdHlwZXMvRXZlbnRMaXN0ZW5lclR5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvbWlncmF0aW9uL01pZ3JhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL21pZ3JhdGlvbi9NaWdyYXRpb25FeGVjdXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL25hbWluZy1zdHJhdGVneS9EZWZhdWx0TmFtaW5nU3RyYXRlZ3kuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9FbnRpdHlQZXJzaXN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9TdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvQ2FzY2FkZXNTdWJqZWN0QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3BlcnNpc3RlbmNlL3N1YmplY3QtYnVpbGRlci9NYW55VG9NYW55U3ViamVjdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvT25lVG9NYW55U3ViamVjdEJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wZXJzaXN0ZW5jZS9zdWJqZWN0LWJ1aWxkZXIvT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9DbG9zdXJlU3ViamVjdEV4ZWN1dG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9NYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGVyc2lzdGVuY2UvdHJlZS9OZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXJEdW1teS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3BsYXRmb3JtL0Jyb3dzZXJEaXJlY3RvcnlFeHBvcnRlZENsYXNzZXNMb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyRGlzYWJsZWREcml2ZXJzRHVtbXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9wbGF0Zm9ybS9Ccm93c2VyRmlsZUxvZ2dlckR1bW15LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcGxhdGZvcm0vQnJvd3NlclBsYXRmb3JtVG9vbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL0FsaWFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9CcmFja2V0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvRGVsZXRlUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9JbnNlcnRRdWVyeUJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL0pvaW5BdHRyaWJ1dGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1F1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUXVlcnlCdWlsZGVyVXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1F1ZXJ5RXhwcmVzc2lvbk1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25Mb2FkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1JlbGF0aW9uUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9SZWxhdGlvblJlbW92ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1JlbGF0aW9uVXBkYXRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvVXBkYXRlUXVlcnlCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50QXR0cmlidXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkQXR0cmlidXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTG9hZGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvRGVsZXRlUmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvSW5zZXJ0UmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci9yZXN1bHQvVXBkYXRlUmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci90cmFuc2Zvcm1lci9QbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LWJ1aWxkZXIvdHJhbnNmb3JtZXIvUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcXVlcnktYnVpbGRlci90cmFuc2Zvcm1lci9SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3F1ZXJ5LXJ1bm5lci9CYXNlUXVlcnlSdW5uZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9yZXBvc2l0b3J5L0Fic3RyYWN0UmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvQmFzZUVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVtb3ZlT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9yZXBvc2l0b3J5L1NhdmVPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvcmVwb3NpdG9yeS9UcmVlUmVwb3NpdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL1JkYm1zU2NoZW1hQnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVDaGVja09wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ29sdW1uT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVFeGNsdXNpb25PcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUZvcmVpZ25LZXlPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUluZGV4T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZVVuaXF1ZU9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1ZpZXdPcHRpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUV4Y2x1c2lvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRm9yZWlnbktleS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlSW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZVVuaXF1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3V0aWwvVGFibGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3NjaGVtYS1idWlsZGVyL3V0aWwvVmlld1V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc2NoZW1hLWJ1aWxkZXIvdmlldy9WaWV3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvc3Vic2NyaWJlci9Ccm9hZGNhc3Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJSZXN1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL0RhdGVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvRGVwR3JhcGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3R5cGVvcm0vYnJvd3Nlci91dGlsL09iamVjdFV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvdXRpbC9Pcm1VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvUmFuZG9tR2VuZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90eXBlb3JtL2Jyb3dzZXIvdXRpbC9TdHJpbmdVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHlwZW9ybS9icm93c2VyL3V0aWwvVmVyc2lvblV0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91bmNvbnRyb2xsYWJsZS9saWIvZXNtL2hvb2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vdW5jb250cm9sbGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VuY29udHJvbGxhYmxlL2xpYi9lc20vdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvc2Fzcy9pbmRleC5zY3NzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL01lbWJlckxpc3QudHN4Iiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL1BhcnRuZXJUYWJsZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9QcmF5ZXJDaXJjbGUvUHJheWVyQ2lyY2xlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1ByYXllckNpcmNsZS9QcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvUHJheWVyQ2lyY2xlL1ByYXllcmNpcmNsZVNldHRpbmdzLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1ByYXllckNpcmNsZS9wcmF5ZXJDaXJjbGVTbGljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY2xpZW50L3RzL1NldHRpbmdzL3NldHRpbmdzU2xpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9TdG9yZS9yZWR1eEhvb2tzLnRzIiwid2VicGFjazovLy8uL3NyYy9jbGllbnQvdHMvU3RvcmUvc3RvcmUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NsaWVudC90cy9pbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7O0FDbEZBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7O0FDYkE7QUFBQTtBQUFlO0FBQ2Y7QUFDQSxtQkFBbUIs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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDLGtDQUFVOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQixpQkFBaUI7QUFDcEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxX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QTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwySkFBMko7QUFDM0osa0VBQWtFO0FBQ2xFO0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FDNXZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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Q0E7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw2QkFBNkI7QUFDN0IsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQiwyQkFBMkI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLDRGQUE0RixTQUFNO0FBQzdJO0FBQ0E7O0FBRUEsbUJBQW1CLGdDQUFnQztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsZ0NBQWdDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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MEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7O0FBRUEsZ0JBQWdCO0FBQ2hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHlCQUF5QjtBQUN6QjtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekI7QUFDQSxTQUFTO0FBQ1Qsa0NBQWtDO0FBQ2xDO0FBQ0EsU0FBUztBQUNULDRCQUE0QjtBQUM1QjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTs7QUFFQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxrQkFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7OztBQUdqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBaUU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsOEJBQThCO0FBQzlCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixxQkFBcUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0EsNERBQTREO0FBQzVELE1BQU0sZ0NBQWdDLEtBQUs7QUFDM0M7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDROQUE0TjtBQUM1TjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEUsWUFBWTtBQUN4RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkhBQTJILDZCQUE2QjtBQUN4SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTywwQ0FBMEM7OztB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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksVUFBVTtBQUN0Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCx1RUFBdUU7O0FBRXZFO0FBQ0EsOERBQThEO0FBQzlEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxLQUFLO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixXQUFXLEtBQUs7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHNDQUFzQzs7QUFFdEMsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBOztBQUVBLG1CQUFtQixpQ0FBaUM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsNENBQTRDO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLHlaQUF5Wjs7QUFFelo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQix1QkFBdUI7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0EsK0VBQStFO0FBQy9FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZHQUE2RztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSCxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwR0FBMEc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0QsZ1RBQWdUO0FBQ2hUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNB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TztBQUNoQztBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlJQUFpSSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUNsTSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUssb0dBQW9HLGtDQUFrQztBQUMzSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwdkJBQTB2Qjs7QUFFMXZCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEMsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLCtDQUErQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywrQ0FBK0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOzs7QUFHQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdELDBEQUEwRDs7QUFFMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQSwwSEFBMEg7QUFDMUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7O0FBRTlDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhEQUE4RDs7QUFFOUQsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1ELHlEQUF5RDtBQUM1Ryw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyx5QkFBeUI7OztBQUdsQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOzs7QUFHVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtJQUFrSTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0lBQWtJO0FBQ2xJO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SkFBOEoseUNBQXlDO0FBQ3ZNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGtEQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZCQUE2QjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMLHVFQUF1RTs7QUFFdkUsVUFBVSw2QkFBNkI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTCx1RUFBdUU7O0FBRXZFLFVBQVUsWUFBWTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxNQUFNO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRIQUE0SDs7QUFFNUgsb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFD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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCLG9DQUFvQzs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDJDQUEyQztBQUNoRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQzs7QUFFM0MscUNBQXFDO0FBQ3JDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DOztBQUVuQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEdBQUcsb0NBQW9DOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRyx1QkFBdUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLHlLQUF5SywwQ0FBMEM7QUFDbk47QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EseUVBQXlFOztBQUV6RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0EsR0FBRzs7O0FBR0gsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0wsd0NBQXdDOztBQUV4QztBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlOQUF5TixHQUFHOztBQUU1TjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25IOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7O0FBR0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLG9DQUFvQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBLHFIQUFxSDs7QUFFckgsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLHFFQUFxRTs7QUFFckUsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVzs7QUFFWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0RBQW9EOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGOztBQUV0RjtBQUNBO0FBQ0EsbUJBQW1COzs7QUFHbkI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUEsK0RBQStEOztBQUUvRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7O0FBR0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsZ0hBQWdIO0FBQ2hIO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEMsS0FBSyxNQUFNLEVBS047QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxSEFBcUg7O0FBRXJIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0Esc0VBQXNFOztBQUV0RTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBLEtBQUssa0NBQWtDO0FBQ3ZDOzs7QUFHQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RTs7QUFFekU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYix5TkFBeU4scUNBQXFDLHdGQUF3RiwyQkFBMkIscUJBQXFCLFFBQVEsWUFBWTtBQUMxWixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU8sNElBQTRJO0FBQ25KO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRywrQkFBK0I7QUFDbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsK0JBQStCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87O0FBRVAsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEIsaUNBQWlDOztBQUVqQyw4QkFBOEI7O0FBRTlCLDBCQUEwQjs7QUFFMUIsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEOztBQUVyRCxrREFBa0Q7O0FBRWxELHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDOztBQUVBLDZDQUE2Qzs7QUFFN0MsNkNBQTZDOztBQUU3QztBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUEsK0NBQStDOztBQUUvQyw0R0FBNEc7O0FBRTVHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkY7O0FBRTNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtRUFBbUU7OztBQUduRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3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QTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsMkNBQTJDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx3QkFBd0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrQ0FBK0M7O0FBRS9DLHVDQUF1QztBQUN2Qzs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJELHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJFQUEyRTs7QUFFM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5RUFBeUU7QUFDekU7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0Esa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0QsT0FBTzs7QUFFdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GOztBQUVuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaU1BQWlNLGNBQWM7QUFDL007QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssRUFBRTtBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsNkVBQTZFOztBQUU3RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7O0FDcnB6QmE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxLQUFxQyxFQUFFLEVBSzFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMsdURBQWdDO0FBQzNEOzs7Ozs7Ozs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7OztBQUliLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7QUNwTGE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMscURBQStCO0FBQzFEOzs7Ozs7Ozs7QUNOQTtBQUFBO0FBQUE7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O0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsNkZBQTZGLGFBQWE7QUFDMUc7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakMsb0RBQW9EOztBQUVwRCxxQ0FBcUMsRUFBRTs7QUFFdkMsd0RBQXdEOztBQUV4RCw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7OztBQUc3RCxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssNENBQTRDOztBQUVqRDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0Esd0NBQXdDOzs7QUFHeEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxvQ0FBb0M7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTCw4REFBOEQ7QUFDOUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSyxJQUFJOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0EsS0FBSztBQUNMLHFFQUFxRTs7QUFFckU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsaUZBQWlGO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPLEVBQUU7O0FBRVQ7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQixVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RCx3QkFBd0I7O0FBRXhCLDZCQUE2Qjs7QUFFN0IsMkJBQTJCOztBQUUzQiwyQkFBMkI7O0FBRTNCLGdFQUFnRTs7QUFFaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7O0FBRWI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87OztBQUdQO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDBCQUEwQjtBQUMxQjtBQUNBLFNBQVM7QUFDVDs7QUFFQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQiwrQkFBK0IsaUNBQWlDO0FBQ2hFLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FB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QUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRix3RUFBd0U7O0FBRXhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLLGNBQWM7QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEU7O0FBRTVFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU8sRUFBRTtBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7O0FBR1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7O0FBRWY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDOztBQUU5QyxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRCx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUZBQWlGOztBQUVqRixvRUFBb0U7O0FBRXBFO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLElBQUk7QUFDVDs7QUFFQSx5Q0FBeUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7OztBQUdyQztBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBLHFEQUFxRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QjtBQUN4QjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0EsT0FBTztBQUNQLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQSwwQkFBMEI7O0FBRTFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHOztBQUVaO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssY0FBYzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssY0FBYzs7QUFFbkIsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxHQUFHOztBQUVaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7QUFDeEI7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUztBQUNUOztBQUVBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBIQUEwSDtBQUMxSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLGNBQWM7QUFDekIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRDs7QUFFbkQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLGFBQWE7QUFDekI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEhBQTBIO0FBQzFIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUVBQW1FOztBQUVuRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLEVBQUU7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFF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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUc7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELHVCQUF1QjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCwwQkFBMEI7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxhQUFhO0FBQ2hGLHFFQUFxRSxhQUFhO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7QUMxVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFD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QWUsbUJBQU8sQ0FBQyw2Q0FBVTtBQUNqQyxhQUFhLG1CQUFPLENBQUMsaUNBQVU7QUFDL0IsV0FBVyxtQkFBTyxDQUFDLCtCQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxxQ0FBYTs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7OztBQ3hEQSxlQUFlLG1CQUFPLENBQUMsNkNBQVU7QUFDakMsV0FBVyxtQkFBTyxDQUFDLCtCQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxxQ0FBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQ25RQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsZ0JBQWdC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QUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDdENBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1RUFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDckNBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFFBQVEsdUVBQXNCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FDbEJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDO0FBQ3dCO0FBQ2I7QUFDVTtBQUNGO0FBQzFEO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSw0REFBNEQsRUFBRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdURBQVE7QUFDM0IsU0FBUyxJQUFJO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtDQUErQyxFQUFFO0FBQy9HO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBd0Q7QUFDTjtBQUNGO0FBQ0s7QUFDQTtBQUNYO0FBQ0s7QUFDRjtBQUNBO0FBQ0Y7QUFDTztBQUNGO0FBQ0g7QUFDSTtBQUNYO0FBQ1E7QUFDVjtBQUNpQjtBQUNKO0FBQ0k7QUFDVTtBQUNMO0FBQ0o7QUFDRztBQUNWO0FBQ0U7QUFDUjtBQUNhO0FBQ0o7QUFDVDtBQUNHO0FBQ0w7QUFDRjtBQUNZO0FBQ1M7QUFDaEI7QUFDUztBQUNSO0FBQ087QUFDTztBQUNmO0FBQ0c7QUFDSDtBQUNJO0FBQ1k7QUFDakI7QUFDRztBQUNEO0FBQ0g7QUFDTDtBQUNpQjtBQUNPO0FBQ0Q7QUFDVjtBQUNEO0FBQ0k7QUFDUjtBQUNPO0FBQ0k7QUFDTDtBQUNQO0FBQ1g7O0FBRS9COzs7Ozs7Ozs7QUMvREE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MscUJBQXFCO0FBQzNELDRDQUE0Qyw0QkFBNEI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ3VCOztBQUV4Qjs7Ozs7Ozs7O0FDNUdBO0FBQVU7O0FBRVY7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF3RDtBQUN5QjtBQUM3QjtBQUNaO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1EQUFZO0FBQzFDO0FBQ0E7QUFDQSx5Q0FBeUMsc0RBQVEsMENBQTBDLG1CQUFtQjtBQUM5RztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixRQUFRLGdCQUFnQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwwQkFBMEI7QUFDdkQ7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDJEQUFhLEtBQUssb0RBQU07QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw0RkFBMEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0Esa0NBQWtDLG1EQUFZO0FBQzlDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiwyREFBYSxLQUFLLG9EQUFNO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsNEZBQTBCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGlDQUFpQyxFQUFFO0FBQ2hGLDBDQUEwQyx1Q0FBdUMsRUFBRTtBQUNuRiw2Q0FBNkMsd0RBQXdELEVBQUU7QUFDdkc7QUFDQTtBQUNBLDRFQUE0RSx3REFBd0QsRUFBRTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBVyxtQ0FBbUMsOEJBQThCO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSw0Q0FBNEMsRUFBRTtBQUMzSDtBQUNBO0FBQ0EsMkVBQTJFLDJDQUEyQyxFQUFFO0FBQ3hIO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsK0RBQVcsbUNBQW1DLGdCQUFnQjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixzREFBUSxrREFBa0QsVUFBVTtBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixRQUFRLGdCQUFnQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwQkFBMEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixzREFBUSwyQ0FBMkMsVUFBVTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVEsZ0JBQWdCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBCQUEwQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDMkI7O0FBRTVCOzs7Ozs7Ozs7QUN6VEE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1AsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDVEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUErQztBQUMvQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUCxlQUFlLDBEQUFZO0FBQzNCOztBQUVBOzs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzQkFBc0I7QUFDbkM7QUFDTztBQUNQLGVBQWUsMERBQVk7QUFDM0I7O0FBRUE7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUErQztBQUN4QztBQUNQO0FBQ0EsbUJBQW1CLDBEQUFZO0FBQy9CO0FBQ0EsZUFBZSwwREFBWTtBQUMzQjs7QUFFQTs7Ozs7Ozs7O0FDUkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStDO0FBQzJCO0FBQ2pCO0FBQ3NCO0FBQ1o7QUFDcEI7QUFDL0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFFQUFhO0FBQ25DO0FBQ0EscURBQXFELHNGQUFtQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFLFdBQVcsdURBQVM7QUFDcEIsZUFBZSx5REFBVztBQUMxQixzQ0FBc0MsMkZBQXVCO0FBQzdELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsbUVBQWdCLENBQUMsK0VBQWlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsdURBQVM7QUFDcEI7QUFDQSxlQUFlLHlEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsdURBQVM7QUFDcEI7QUFDQSxlQUFlLHlEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyRkFBdUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsK0NBQStDLEVBQUU7QUFDbkgsNkZBQTZGLDZCQUE2QixFQUFFO0FBQzVIO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQyw0QkFBNEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0NBQW9DLDRCQUE0QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0MsNEJBQTRCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7OztBQ3JLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzhCOztBQUUvQjs7Ozs7Ozs7O0FDOUZBO0FBQUE7QUFBQTtBQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FB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RDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDb0M7O0FBRXJDOzs7Ozs7Ozs7QUNsS0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDd0I7O0FBRXpCOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDRjtBQUNnQjtBQUNBO0FBQ1k7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Qjs7Ozs7Ozs7OztBQ3pmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDO0FBQ2M7QUFDcEI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxtQ0FBbUMsRUFBRTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbURBQVk7QUFDOUI7QUFDQTtBQUNBLHlDQUF5Qyx1RUFBVztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywyREFBYSxLQUFLLG9EQUFNO0FBQzlELGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLHdEQUF3RCxFQUFFO0FBQzdIO0FBQ0E7QUFDQSxxRUFBcUUsNERBQTRELEVBQUU7QUFDbkk7QUFDQTtBQUNBLHFFQUFxRSw0REFBNEQsRUFBRTtBQUNuSTtBQUNBO0FBQ0EscUVBQXFFLDBEQUEwRCxFQUFFO0FBQ2pJO0FBQ0E7QUFDQSxxRUFBcUUsMERBQTBELEVBQUU7QUFDakk7QUFDQTtBQUNBLHFFQUFxRSw4REFBOEQsRUFBRTtBQUNySTtBQUNBO0FBQ0EscUVBQXFFLGlFQUFpRSxFQUFFO0FBQ3hJO0FBQ0E7QUFDQSxDQUFDO0FBQzJCOztBQUU1Qjs7Ozs7Ozs7O0FDL01BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1JQUFtSTtBQUNuSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCx1Q0FBdUMsRUFBRTtBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNpQzs7QUFFbEM7Ozs7Ozs7OztBQzVEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4QztBQUNKO0FBQzJDO0FBQ3pDO0FBQ0U7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxtRkFBbUYsRUFBRTtBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCx5RkFBeUYsRUFBRTtBQUNuSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdHQUE0QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0IscUNBQXFDO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxrQkFBa0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHVEQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsNkNBQTZDLEVBQUU7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCw2Q0FBNkMsRUFBRTtBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELDZDQUE2QyxFQUFFO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCw2Q0FBNkMsRUFBRTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSwrQ0FBK0MsRUFBRTtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsNkNBQTZDLEVBQUU7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsK0NBQStDLEVBQUU7QUFDekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCwrQ0FBK0MsRUFBRTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELCtDQUErQyxFQUFFO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsK0NBQStDLEVBQUU7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHNEQUFvQjtBQUM5QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsMEdBQTBHLEVBQUU7QUFDL0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QywyREFBYSxLQUFLLG9EQUFNO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxRQUFRLHVEQUFRLHFDQUFxQyxFQUFFO0FBQ3JILFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVEQUFRO0FBQzNCLFNBQVMsSUFBSTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUVBQU8sK0JBQStCLG1DQUFtQztBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0tBQWtLO0FBQ2xLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLGlEQUFpRCxFQUFFO0FBQzlILHFFQUFxRSx5QkFBeUIsRUFBRTtBQUNoRztBQUNBLDhFQUE4RSxtRUFBbUUsRUFBRTtBQUNuSjtBQUNBO0FBQ0EseUVBQXlFLDhDQUE4QyxFQUFFO0FBQ3pIO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw2QkFBNkI7QUFDM0Q7QUFDQSxxQkFBcUIsMENBQTBDLGdCQUFnQixzQkFBc0I7QUFDckc7QUFDQSxRQUFRLDBCQUEwQiw4QkFBOEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFFBQVEsdURBQVEsNERBQTRELEVBQUU7QUFDOUgsb0RBQW9ELFFBQVEsdURBQVEsZ0VBQWdFLEVBQUU7QUFDdEk7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUN5Qjs7QUFFMUI7Ozs7Ozs7OztBQ2xrQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDNEI7O0FBRTdCOzs7Ozs7Ozs7QUM5QkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCw0QkFBNEIsRUFBRTtBQUM3RixtRkFBbUYsNEJBQTRCLEVBQUU7QUFDakg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCOztBQUU5Qjs7Ozs7Ozs7O0FDbkRBO0FBQUE7QUFBQTtBQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHFFQUFxRSw4QkFBOEIsRUFBRTtBQUNyRztBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsa0JBQWtCLEVBQUU7QUFDbEcsaUVBQWlFLHNCQUFzQixFQUFFO0FBQ3pGO0FBQ0E7QUFDQSwyRkFBMkYsa0JBQWtCLEVBQUU7QUFDL0csa0ZBQWtGLHdEQUF3RCxFQUFFO0FBQzVJO0FBQ0E7QUFDQTtBQUNBLDhGQUE4Riw2Q0FBNkMsRUFBRTtBQUM3STtBQUNBO0FBQ0E7QUFDQSxvR0FBb0csNEVBQTRFLEVBQUU7QUFDbEw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixtREFBWTtBQUN0QyxhQUFhO0FBQ2IseUNBQXlDLG9CQUFvQixFQUFFO0FBQy9EO0FBQ0E7QUFDQSw4RUFBOEUsb0NBQW9DLEVBQUU7QUFDcEg7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJO0FBQ2Isa0pBQWtKLDRCQUE0QixFQUFFO0FBQ2hMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDd0I7O0FBRXpCOzs7Ozs7Ozs7QUN6SEE7QUFBQTtBQUFBO0FBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbURBQVk7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNnQzs7QUFFakM7Ozs7Ozs7OztBQ2xDQTtBQUFBO0FBQUE7QUFBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMEJBQTBCLDRDQUE0QyxFQUFFO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtREFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzZCOztBQUU5Qjs7Ozs7Ozs7O0FDeERBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEM7QUFDSTtBQUNWO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsMkRBQWEsS0FBSyxvREFBTTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUM7QUFDc0M7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDMEI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDb0I7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDc0I7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDdUI7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDdUI7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDOEI7O0FBRS9COzs7Ozs7Ozs7QUNySkE7QUFBQTtBQUFBO0FBQUE7QUFBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNzQjtBQUN2QjtBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDcUI7O0FBRXRCOzs7Ozs7Ozs7QUN6REE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixJQUFJO0FBQ3JCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw0Q0FBSztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDcUI7O0FBRXRCOzs7Ozs7Ozs7QUN6UEE7QUFBVTs7QUFFVjs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0EsbURBQW1ELDJEQUFhLDBDQUEwQyxvREFBTTtBQUNoSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNxQjs7QUFFdEI7Ozs7Ozs7OztBQzNOQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtEO0FBQ1I7QUFDa0I7QUFDUjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsMkRBQWEsS0FBSyxvREFBTTtBQUNwRTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxDQUFDO0FBQ3FCOztBQUV0Qjs7Ozs7Ozs7O0FDOUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNzQjs7QUFFdkI7Ozs7Ozs7OztBQzdHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDc0I7O0FBRXZCOzs7Ozs7Ozs7QUNwZEE7QUFBQTtBQUFBO0FBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdURBQVM7QUFDeEIsbUJBQW1CLHlEQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUM7QUFDNEI7O0FBRTdCOzs7Ozs7Ozs7QUNyQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ2lDOztBQUVsQzs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBQTtBQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUMseUNBQXlDLHdCQUF3QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHFCQUFxQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG9EQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxxQkFBcUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHFDQUFxQyxFQUFFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxrQkFBa0IsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNvQjs7QUFFckI7Ozs7Ozs7OztBQzlMQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG1EQUFZO0FBQ3RDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtB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QUNwQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUE5MElNLDZCQUFNLEdBQXFEO1FBQzlELENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxFQUFFO1lBQ0MsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzFCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMxQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7U0FDN0I7UUFDRCxDQUFDLEVBQUU7WUFDQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEM7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtTQUNKO1FBQ0QsQ0FBQyxFQUFFO1lBQ0MsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDbEQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2xEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNsRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQzthQUNQO1lBQ0QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7U0FDckQ7UUFDRCxFQUFFLEVBQUU7WUFDQSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUM5RDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQzthQUNQO1lBQ0QsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzlEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDOUQ7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDUDtZQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtTQUNqRTtRQUNELEVBQUUsRUFBRTtZQUNBO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRCxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1NBQ2pGO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1NBQ0o7UUFDRCxFQUFFLEVBQUU7WUFDQTtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1NBQ0o7UUFDRCxFQUFFLEVBQUU7WUFDQTtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtTQUNKO1FBQ0QsRUFBRSxFQUFFO1lBQ0E7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2FBQ1Q7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTthQUNUO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7YUFDVDtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLEVBQUUsQ0FBQzthQUNSO1lBQ0Q7Z0JBQ0ksQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLENBQUM7YUFDUjtZQUNEO2dCQUNJLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLENBQUMsRUFBRSxFQUFFO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxDQUFDO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2FBQ1I7WUFDRDtnQkFDSSxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsRUFBRTtnQkFDTCxFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsRUFBRTtnQkFDTixFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFF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aUJBQWlCLENBQUMsQ0FDN0MsQ0FBQztBQUVGLElBQUksU0FBUyxHQUF3QixVQUFVLENBQUM7QUFDaEQsYUFBSyxDQUFDLFNBQVMsQ0FBQztJQUNaLElBQU0sU0FBUyxHQUFHLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtRQUN6QixTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRXRCLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRTtZQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5QztLQUNKO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoiaW5kZXguYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvY2xpZW50L3RzL2luZGV4LnRzeFwiKTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn0iLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuXG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSB7XG4gICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIGlmIChpICUgMikge1xuICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZGlmaWVycyBmcm9tIFwiLi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gXCIuL3V0aWxzL3VuaXF1ZUJ5LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlKSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgJiYgaW5jbHVkZVNjYWxlKSB7XG4gICAgdmFyIG9mZnNldEhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIHZhciBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIERvIG5vdCBhdHRlbXB0IHRvIGRpdmlkZSBieSAwLCBvdGhlcndpc2Ugd2UgZ2V0IGBJbmZpbml0eWAgYXMgc2NhbGVcbiAgICAvLyBGYWxsYmFjayB0byAxIGluIGNhc2UgYm90aCB2YWx1ZXMgYXJlIGAwYFxuXG4gICAgaWYgKG9mZnNldFdpZHRoID4gMCkge1xuICAgICAgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBvZmZzZXRXaWR0aCB8fCAxO1xuICAgIH1cblxuICAgIGlmIChvZmZzZXRIZWlnaHQgPiAwKSB7XG4gICAgICBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBvZmZzZXRIZWlnaHQgfHwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoIC8gc2NhbGVYLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQgLyBzY2FsZVksXG4gICAgdG9wOiByZWN0LnRvcCAvIHNjYWxlWSxcbiAgICByaWdodDogcmVjdC5yaWdodCAvIHNjYWxlWCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tIC8gc2NhbGVZLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB4OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeTogcmVjdC50b3AgLyBzY2FsZVlcbiAgfTtcbn0iLCJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JyAmJiAoY2FuRXNjYXBlQ2xpcHBpbmcgPyBnZXRDb21wdXRlZFN0eWxlKGNsaXBwaW5nUGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgOiB0cnVlKTtcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiOyAvLyBSZXR1cm5zIHRoZSBsYXlvdXQgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuIExheW91dFxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuICB2YXIgaXNJRSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpICE9PSAtMTtcblxuICBpZiAoaXNJRSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gSW4gSUUgOSwgMTAgYW5kIDExIGZpeGVkIGVsZW1lbnRzIGNvbnRhaW5pbmcgYmxvY2sgaXMgYWx3YXlzIGVzdGFibGlzaGVkIGJ5IHRoZSB2aWV3cG9ydFxuICAgIHZhciBlbGVtZW50Q3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgIGlmIChlbGVtZW50Q3NzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDApIHtcbiAgICB2YXIgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7IC8vIFRoaXMgaXMgbm9uLWV4aGF1c3RpdmUgYnV0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gQ1NTIHByb3BlcnRpZXMgdGhhdFxuICAgIC8vIGNyZWF0ZSBhIGNvbnRhaW5pbmcgYmxvY2suXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnXS5pbmRleE9mKGNzcy53aWxsQ2hhbmdlKSAhPT0gLTEgfHwgaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJyB8fCBpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufSAvLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpO1xuXG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKG9mZnNldFBhcmVudCAmJiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2h0bWwnIHx8IGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7IC8vIE5COiBUaGlzIGlzbid0IHN1cHBvcnRlZCBvbiBpT1MgPD0gMTIuIElmIHRoZSBrZXlib2FyZCBpcyBvcGVuLCB0aGUgcG9wcGVyXG4gIC8vIGNhbiBiZSBvYnNjdXJlZCB1bmRlcm5lYXRoIGl0LlxuICAvLyBBbHNvLCBgaHRtbC5jbGllbnRIZWlnaHRgIGFkZHMgdGhlIGJvdHRvbSBiYXIgaGVpZ2h0IGluIFNhZmFyaSBpT1MsIGV2ZW5cbiAgLy8gaWYgaXQgaXNuJ3Qgb3Blbiwgc28gaWYgdGhpcyBpc24ndCBhdmFpbGFibGUsIHRoZSBwb3BwZXIgd2lsbCBiZSBkZXRlY3RlZFxuICAvLyB0byBvdmVyZmxvdyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gdG9vIGVhcmx5LlxuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0OyAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZmFpbHMgaW4gbW9iaWxlIGVtdWxhdGlvbiBtb2RlIGluIENocm9tZS5cbiAgICAvLyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZpc3VhbFZpZXdwb3J0LnNjYWxlIC0gdmlzdWFsVmlld3BvcnQud2lkdGgpIDxcbiAgICAvLyAwLjAwMVxuICAgIC8vIEZhbGxiYWNrIGhlcmU6IFwiTm90IFNhZmFyaVwiIHVzZXJBZ2VudFxuXG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCB2YXIgdG9wID0gJ3RvcCc7XG5leHBvcnQgdmFyIGJvdHRvbSA9ICdib3R0b20nO1xuZXhwb3J0IHZhciByaWdodCA9ICdyaWdodCc7XG5leHBvcnQgdmFyIGxlZnQgPSAnbGVmdCc7XG5leHBvcnQgdmFyIGF1dG8gPSAnYXV0byc7XG5leHBvcnQgdmFyIGJhc2VQbGFjZW1lbnRzID0gW3RvcCwgYm90dG9tLCByaWdodCwgbGVmdF07XG5leHBvcnQgdmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbmV4cG9ydCB2YXIgZW5kID0gJ2VuZCc7XG5leHBvcnQgdmFyIGNsaXBwaW5nUGFyZW50cyA9ICdjbGlwcGluZ1BhcmVudHMnO1xuZXhwb3J0IHZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG5leHBvcnQgdmFyIHBvcHBlciA9ICdwb3BwZXInO1xuZXhwb3J0IHZhciByZWZlcmVuY2UgPSAncmVmZXJlbmNlJztcbmV4cG9ydCB2YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbmV4cG9ydCB2YXIgYmVmb3JlUmVhZCA9ICdiZWZvcmVSZWFkJztcbmV4cG9ydCB2YXIgcmVhZCA9ICdyZWFkJztcbmV4cG9ydCB2YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbmV4cG9ydCB2YXIgYmVmb3JlTWFpbiA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCB2YXIgbWFpbiA9ICdtYWluJztcbmV4cG9ydCB2YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxuZXhwb3J0IHZhciBiZWZvcmVXcml0ZSA9ICdiZWZvcmVXcml0ZSc7XG5leHBvcnQgdmFyIHdyaXRlID0gJ3dyaXRlJztcbmV4cG9ydCB2YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbmV4cG9ydCB2YXIgbW9kaWZpZXJQaGFzZXMgPSBbYmVmb3JlUmVhZCwgcmVhZCwgYWZ0ZXJSZWFkLCBiZWZvcmVNYWluLCBtYWluLCBhZnRlck1haW4sIGJlZm9yZVdyaXRlLCB3cml0ZSwgYWZ0ZXJXcml0ZV07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLCAnZWxlbWVudC4nXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG5cbiAgdmFyIF9yZWYzID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIob2Zmc2V0cykgOiB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKG9mZnNldHMpIDogb2Zmc2V0cyxcbiAgICAgIF9yZWYzJHggPSBfcmVmMy54LFxuICAgICAgeCA9IF9yZWYzJHggPT09IHZvaWQgMCA/IDAgOiBfcmVmMyR4LFxuICAgICAgX3JlZjMkeSA9IF9yZWYzLnksXG4gICAgICB5ID0gX3JlZjMkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJHk7XG5cbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuICAgIHZhciBoZWlnaHRQcm9wID0gJ2NsaWVudEhlaWdodCc7XG4gICAgdmFyIHdpZHRoUHJvcCA9ICdjbGllbnRXaWR0aCc7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG5cbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICAgIGhlaWdodFByb3AgPSAnc2Nyb2xsSGVpZ2h0JztcbiAgICAgICAgd2lkdGhQcm9wID0gJ3Njcm9sbFdpZHRoJztcbiAgICAgIH1cbiAgICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG5cbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQ7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSB0b3AgfHwgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCBwbGFjZW1lbnQgPT09IHJpZ2h0KSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB2YXIgb2Zmc2V0WSA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LmhlaWdodCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSBsZWZ0IHx8IChwbGFjZW1lbnQgPT09IHRvcCB8fCBwbGFjZW1lbnQgPT09IGJvdHRvbSkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB2YXIgb2Zmc2V0WCA9IGlzRml4ZWQgJiYgd2luLnZpc3VhbFZpZXdwb3J0ID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoIDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbd2lkdGhQcm9wXTtcbiAgICAgIHggLT0gb2Zmc2V0WCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY0KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY0LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY0Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJpbXBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoc3RyKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQoYXJncykucmVkdWNlKGZ1bmN0aW9uIChwLCBjKSB7XG4gICAgcmV0dXJuIHAucmVwbGFjZSgvJXMvLCBjKTtcbiAgfSwgc3RyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVCeShhcnIsIGZuKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaWRlbnRpZmllciA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKCFpZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgIGlkZW50aWZpZXJzLmFkZChpZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59IiwiaW1wb3J0IGZvcm1hdCBmcm9tIFwiLi9mb3JtYXQuanNcIjtcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIFtdLmNvbmNhdChPYmplY3Qua2V5cyhtb2RpZmllciksIFZBTElEX1BST1BFUlRJRVMpIC8vIElFMTEtY29tcGF0aWJsZSByZXBsYWNlbWVudCBmb3IgYG5ldyBTZXQoaXRlcmFibGUpYFxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5uYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgU3RyaW5nKG1vZGlmaWVyLm5hbWUpLCAnXCJuYW1lXCInLCAnXCJzdHJpbmdcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLm5hbWUpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlbmFibGVkJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmVuYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZW5hYmxlZFwiJywgJ1wiYm9vbGVhblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZW5hYmxlZCkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICBpZiAobW9kaWZpZXJQaGFzZXMuaW5kZXhPZihtb2RpZmllci5waGFzZSkgPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJwaGFzZVwiJywgXCJlaXRoZXIgXCIgKyBtb2RpZmllclBoYXNlcy5qb2luKCcsICcpLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5waGFzZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2ZuJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJmblwiJywgJ1wiZnVuY3Rpb25cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmZuKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWZmZWN0JzpcbiAgICAgICAgICBpZiAobW9kaWZpZXIuZWZmZWN0ICE9IG51bGwgJiYgdHlwZW9mIG1vZGlmaWVyLmVmZmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZWZmZWN0XCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyZXF1aXJlcyc6XG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnJlcXVpcmVzICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0iLCJpbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbk1heENsYW1wKG1pbiwgdmFsdWUsIG1heCkge1xuICB2YXIgdiA9IHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpO1xuICByZXR1cm4gdiA+IG1heCA/IG1heCA6IHY7XG59IiwiaW1wb3J0IF9yZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG4vLyBEZWZhdWx0IGNvbnRleHQgdmFsdWUgdG8gdXNlIGluIGNhc2UgdGhlcmUgaXMgbm8gU1NSUHJvdmlkZXIuIFRoaXMgaXMgZmluZSBmb3Jcbi8vIGNsaWVudC1vbmx5IGFwcHMuIEluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IEFyaWEgcG90ZW50aWFsbHlcbi8vIGJlaW5nIG9uIHRoZSBwYWdlIGF0IG9uY2UsIHRoZSBwcmVmaXggaXMgc2V0IHRvIGEgcmFuZG9tIG51bWJlci4gU1NSUHJvdmlkZXJcbi8vIHdpbGwgcmVzZXQgdGhpcyB0byB6ZXJvIGZvciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50LCBzbyBpbiB0aGVcbi8vIFNTUiBjYXNlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBBcmlhIGlzIG5vdCBzdXBwb3J0ZWQuXG5jb25zdCAkZjAxYTE4M2NjN2JkZmY3Nzg0OWU0OWFkMjZlYjkwNCR2YXIkZGVmYXVsdENvbnRleHQgPSB7XG4gIHByZWZpeDogU3RyaW5nKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDAwKSksXG4gIGN1cnJlbnQ6IDBcbn07XG5cbmNvbnN0ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRTU1JDb250ZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5jcmVhdGVDb250ZXh0KCRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCk7XG5cbi8qKlxuICogV2hlbiB1c2luZyBTU1Igd2l0aCBSZWFjdCBBcmlhLCBhcHBsaWNhdGlvbnMgbXVzdCBiZSB3cmFwcGVkIGluIGFuIFNTUlByb3ZpZGVyLlxuICogVGhpcyBlbnN1cmVzIHRoYXQgYXV0byBnZW5lcmF0ZWQgaWRzIGFyZSBjb25zaXN0ZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU1NSUHJvdmlkZXIocHJvcHMpIHtcbiAgbGV0IGN1ciA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpO1xuICBsZXQgdmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgU1NSUHJvdmlkZXIsIHN0YXJ0IHdpdGggYW4gZW1wdHkgc3RyaW5nIHByZWZpeCwgb3RoZXJ3aXNlXG4gICAgLy8gYXBwZW5kIGFuZCBpbmNyZW1lbnQgdGhlIGNvdW50ZXIuXG4gICAgcHJlZml4OiBjdXIgPT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCA/ICcnIDogY3VyLnByZWZpeCArIFwiLVwiICsgKytjdXIuY3VycmVudCxcbiAgICBjdXJyZW50OiAwXG4gIH0pLCBbY3VyXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmNyZWF0ZUVsZW1lbnQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSwgcHJvcHMuY2hpbGRyZW4pO1xufVxubGV0ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRjYW5Vc2VET00gPSBCb29sZWFuKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG4vKiogQHByaXZhdGUgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNTUlNhZmVJZChkZWZhdWx0SWQpIHtcbiAgbGV0IGN0eCA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpOyAvLyBJZiB3ZSBhcmUgcmVuZGVyaW5nIGluIGEgbm9uLURPTSBlbnZpcm9ubWVudCwgYW5kIHRoZXJlJ3Mgbm8gU1NSUHJvdmlkZXIsXG4gIC8vIHByb3ZpZGUgYSB3YXJuaW5nIHRvIGhpbnQgdG8gdGhlIGRldmVsb3BlciB0byBhZGQgb25lLlxuXG4gIGlmIChjdHggPT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dCAmJiAhJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJGNhblVzZURPTSkge1xuICAgIGNvbnNvbGUud2FybignV2hlbiBzZXJ2ZXIgcmVuZGVyaW5nLCB5b3UgbXVzdCB3cmFwIHlvdXIgYXBwbGljYXRpb24gaW4gYW4gPFNTUlByb3ZpZGVyPiB0byBlbnN1cmUgY29uc2lzdGVudCBpZHMgYXJlIGdlbmVyYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4nKTtcbiAgfVxuXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IGRlZmF1bHRJZCB8fCBcInJlYWN0LWFyaWFcIiArIGN0eC5wcmVmaXggKyBcIi1cIiArICsrY3R4LmN1cnJlbnQsIFtkZWZhdWx0SWRdKTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGJlaW5nIHNlcnZlciBzaWRlIHJlbmRlcmVkIG9yXG4gKiBoeWRyYXRlZCBvbiB0aGUgY2xpZW50LiBDYW4gYmUgdXNlZCB0byBkZWxheSBicm93c2VyLXNwZWNpZmljIHJlbmRlcmluZ1xuICogdW50aWwgYWZ0ZXIgaHlkcmF0aW9uLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VJc1NTUigpIHtcbiAgbGV0IGN1ciA9IHVzZUNvbnRleHQoJGYwMWExODNjYzdiZGZmNzc4NDllNDlhZDI2ZWI5MDQkdmFyJFNTUkNvbnRleHQpO1xuICBsZXQgaXNJblNTUkNvbnRleHQgPSBjdXIgIT09ICRmMDFhMTgzY2M3YmRmZjc3ODQ5ZTQ5YWQyNmViOTA0JHZhciRkZWZhdWx0Q29udGV4dDtcbiAgbGV0IFtpc1NTUiwgc2V0SXNTU1JdID0gdXNlU3RhdGUoaXNJblNTUkNvbnRleHQpOyAvLyBJZiBvbiB0aGUgY2xpZW50LCBhbmQgdGhlIGNvbXBvbmVudCB3YXMgaW5pdGlhbGx5IHNlcnZlciByZW5kZXJlZCxcbiAgLy8gdGhlbiBzY2hlZHVsZSBhIGxheW91dCBlZmZlY3QgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQgYWZ0ZXIgaHlkcmF0aW9uLlxuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luU1NSQ29udGV4dCkge1xuICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IHRlY2huaWNhbGx5IGJyZWFrcyB0aGUgcnVsZXMgb2YgaG9va3MsIGJ1dCBpcyBzYWZlXG4gICAgLy8gYmVjYXVzZSB0aGUgY29uZGl0aW9uIG5ldmVyIGNoYW5nZXMgYWZ0ZXIgbW91bnRpbmcuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIHNldElzU1NSKGZhbHNlKTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICByZXR1cm4gaXNTU1I7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUuanMubWFwXG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59O1xyXG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn07XHJcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XHJcbnZhciBfX2RlZlByb3BzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XHJcbnZhciBfX2dldE93blByb3BEZXNjcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzO1xyXG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XHJcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcclxudmFyIF9fZGVmTm9ybWFsUHJvcCA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHsgcmV0dXJuIGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTsgfTtcclxudmFyIF9fc3ByZWFkVmFsdWVzID0gZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcclxuICAgICAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXHJcbiAgICAgICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcclxuICAgIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2MgPSBfX2dldE93blByb3BTeW1ib2xzKGIpOyBfaSA8IF9jLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgcHJvcCA9IF9jW19pXTtcclxuICAgICAgICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxyXG4gICAgICAgICAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiBhO1xyXG59O1xyXG52YXIgX19zcHJlYWRQcm9wcyA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBfX2RlZlByb3BzKGEsIF9fZ2V0T3duUHJvcERlc2NzKGIpKTsgfTtcclxudmFyIF9fYXN5bmMgPSBmdW5jdGlvbiAoX190aGlzLCBfX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIHZhciBmdWxmaWxsZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0ZXAoZ2VuZXJhdG9yLnRocm93KHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHN0ZXAgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5kb25lID8gcmVzb2x2ZSh4LnZhbHVlKSA6IFByb21pc2UucmVzb2x2ZSh4LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9O1xyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseShfX3RoaXMsIF9fYXJndW1lbnRzKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59O1xyXG4vLyBzcmMvaW5kZXgudHNcclxuaW1wb3J0IHsgZW5hYmxlRVM1IH0gZnJvbSBcImltbWVyXCI7XHJcbmV4cG9ydCAqIGZyb20gXCJyZWR1eFwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0IGFzIGRlZmF1bHQyLCBjdXJyZW50IGFzIGN1cnJlbnQyLCBmcmVlemUsIG9yaWdpbmFsLCBpc0RyYWZ0IGFzIGlzRHJhZnQ0IH0gZnJvbSBcImltbWVyXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yIGFzIGNyZWF0ZVNlbGVjdG9yMiB9IGZyb20gXCJyZXNlbGVjdFwiO1xyXG4vLyBzcmMvY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IudHNcclxuaW1wb3J0IHsgY3VycmVudCwgaXNEcmFmdCB9IGZyb20gXCJpbW1lclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJyZXNlbGVjdFwiO1xyXG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgYXJncyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICB2YXIgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3Rvci5hcHBseSh2b2lkIDAsIGFyZ3MpO1xyXG4gICAgdmFyIHdyYXBwZWRTZWxlY3RvciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIHZhciByZXN0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgcmVzdFtfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlXSwgcmVzdCkpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiB3cmFwcGVkU2VsZWN0b3I7XHJcbn07XHJcbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xyXG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgY29tcG9zZSBhcyBjb21wb3NlMiwgYXBwbHlNaWRkbGV3YXJlLCBjb21iaW5lUmVkdWNlcnMgfSBmcm9tIFwicmVkdXhcIjtcclxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXHJcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tIFwicmVkdXhcIjtcclxudmFyIGNvbXBvc2VXaXRoRGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIDogZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcclxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKVxyXG4gICAgICAgIHJldHVybiBjb21wb3NlO1xyXG4gICAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxudmFyIGRldlRvb2xzRW5oYW5jZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gOiBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5vb3ApIHtcclxuICAgICAgICByZXR1cm4gbm9vcDtcclxuICAgIH07XHJcbn07XHJcbi8vIHNyYy9pc1BsYWluT2JqZWN0LnRzXHJcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcclxuICAgIGlmIChwcm90byA9PT0gbnVsbClcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIHZhciBiYXNlUHJvdG8gPSBwcm90bztcclxuICAgIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XHJcbn1cclxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXHJcbmltcG9ydCB0aHVua01pZGRsZXdhcmUgZnJvbSBcInJlZHV4LXRodW5rXCI7XHJcbi8vIHNyYy91dGlscy50c1xyXG5mdW5jdGlvbiBnZXRUaW1lTWVhc3VyZVV0aWxzKG1heERlbGF5LCBmbk5hbWUpIHtcclxuICAgIHZhciBlbGFwc2VkID0gMDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbWVhc3VyZVRpbWU6IGZ1bmN0aW9uIChmbikge1xyXG4gICAgICAgICAgICB2YXIgc3RhcnRlZCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgIHZhciBmaW5pc2hlZCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICBlbGFwc2VkICs9IGZpbmlzaGVkIC0gc3RhcnRlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2FybklmRXhjZWVkZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGVsYXBzZWQgPiBtYXhEZWxheSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGZuTmFtZSArIFwiIHRvb2sgXCIgKyBlbGFwc2VkICsgXCJtcywgd2hpY2ggaXMgbW9yZSB0aGFuIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiBcIiArIG1heERlbGF5ICsgXCJtcy4gXFxuSWYgeW91ciBzdGF0ZSBvciBhY3Rpb25zIGFyZSB2ZXJ5IGxhcmdlLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgbWlkZGxld2FyZSBhcyBpdCBtaWdodCBjYXVzZSB0b28gbXVjaCBvZiBhIHNsb3dkb3duIGluIGRldmVsb3BtZW50IG1vZGUuIFNlZSBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL2FwaS9nZXREZWZhdWx0TWlkZGxld2FyZSBmb3IgaW5zdHJ1Y3Rpb25zLlxcbkl0IGlzIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxudmFyIE1pZGRsZXdhcmVBcnJheSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhNaWRkbGV3YXJlQXJyYXksIF9zdXBlcik7XHJcbiAgICBmdW5jdGlvbiBNaWRkbGV3YXJlQXJyYXkoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKSB8fCB0aGlzO1xyXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgTWlkZGxld2FyZUFycmF5LnByb3RvdHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1pZGRsZXdhcmVBcnJheSwgU3ltYm9sLnNwZWNpZXMsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1pZGRsZXdhcmVBcnJheTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBNaWRkbGV3YXJlQXJyYXkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJyW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNvbmNhdC5hcHBseSh0aGlzLCBhcnIpO1xyXG4gICAgfTtcclxuICAgIE1pZGRsZXdhcmVBcnJheS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYXJyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJyW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcnIubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJyWzBdKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IChNaWRkbGV3YXJlQXJyYXkuYmluZC5hcHBseShNaWRkbGV3YXJlQXJyYXksIF9fc3ByZWFkQXJyYXkoW3ZvaWQgMF0sIGFyclswXS5jb25jYXQodGhpcykpKSkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyAoTWlkZGxld2FyZUFycmF5LmJpbmQuYXBwbHkoTWlkZGxld2FyZUFycmF5LCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBhcnIuY29uY2F0KHRoaXMpKSkpKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE1pZGRsZXdhcmVBcnJheTtcclxufShBcnJheSkpO1xyXG4vLyBzcmMvaW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXHJcbnZhciBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XHJcbnZhciBwcmVmaXggPSBcIkludmFyaWFudCBmYWlsZWRcIjtcclxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xyXG4gICAgaWYgKGNvbmRpdGlvbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4KTtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihwcmVmaXggKyBcIjogXCIgKyAobWVzc2FnZSB8fCBcIlwiKSk7XHJcbn1cclxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaiwgc2VyaWFsaXplciwgaW5kZW50LCBkZWN5Y2xlcikge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZ2V0U2VyaWFsaXplKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSwgaW5kZW50KTtcclxufVxyXG5mdW5jdGlvbiBnZXRTZXJpYWxpemUoc2VyaWFsaXplciwgZGVjeWNsZXIpIHtcclxuICAgIHZhciBzdGFjayA9IFtdLCBrZXlzID0gW107XHJcbiAgICBpZiAoIWRlY3ljbGVyKVxyXG4gICAgICAgIGRlY3ljbGVyID0gZnVuY3Rpb24gKF8sIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFja1swXSA9PT0gdmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfl1cIjtcclxuICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIH4uXCIgKyBrZXlzLnNsaWNlKDAsIHN0YWNrLmluZGV4T2YodmFsdWUpKS5qb2luKFwiLlwiKSArIFwiXVwiO1xyXG4gICAgICAgIH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgdGhpc1BvcyA9IHN0YWNrLmluZGV4T2YodGhpcyk7XHJcbiAgICAgICAgICAgIH50aGlzUG9zID8gc3RhY2suc3BsaWNlKHRoaXNQb3MgKyAxKSA6IHN0YWNrLnB1c2godGhpcyk7XHJcbiAgICAgICAgICAgIH50aGlzUG9zID8ga2V5cy5zcGxpY2UodGhpc1BvcywgSW5maW5pdHksIGtleSkgOiBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVjeWNsZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gc2VyaWFsaXplciA9PSBudWxsID8gdmFsdWUgOiBzZXJpYWxpemVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGVmYXVsdCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKTtcclxufVxyXG5mdW5jdGlvbiB0cmFja0Zvck11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaikge1xyXG4gICAgdmFyIHRyYWNrZWRQcm9wZXJ0aWVzID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZGV0ZWN0TXV0YXRpb25zOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZVBhdGhzLCB0cmFja2VkUHJvcGVydGllcywgb2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaiwgcGF0aCkge1xyXG4gICAgaWYgKGlnbm9yZVBhdGhzID09PSB2b2lkIDApIHsgaWdub3JlUGF0aHMgPSBbXTsgfVxyXG4gICAgaWYgKHBhdGggPT09IHZvaWQgMCkgeyBwYXRoID0gXCJcIjsgfVxyXG4gICAgdmFyIHRyYWNrZWQgPSB7IHZhbHVlOiBvYmogfTtcclxuICAgIGlmICghaXNJbW11dGFibGUob2JqKSkge1xyXG4gICAgICAgIHRyYWNrZWQuY2hpbGRyZW4gPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgICAgICBpZiAoaWdub3JlUGF0aHMubGVuZ3RoICYmIGlnbm9yZVBhdGhzLmluZGV4T2YoY2hpbGRQYXRoKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyYWNrZWQuY2hpbGRyZW5ba2V5XSA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9ialtrZXldLCBjaGlsZFBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cmFja2VkO1xyXG59XHJcbmZ1bmN0aW9uIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eSwgb2JqLCBzYW1lUGFyZW50UmVmLCBwYXRoKSB7XHJcbiAgICBpZiAoaWdub3JlUGF0aHMgPT09IHZvaWQgMCkgeyBpZ25vcmVQYXRocyA9IFtdOyB9XHJcbiAgICBpZiAoc2FtZVBhcmVudFJlZiA9PT0gdm9pZCAwKSB7IHNhbWVQYXJlbnRSZWYgPSBmYWxzZTsgfVxyXG4gICAgaWYgKHBhdGggPT09IHZvaWQgMCkgeyBwYXRoID0gXCJcIjsgfVxyXG4gICAgdmFyIHByZXZPYmogPSB0cmFja2VkUHJvcGVydHkgPyB0cmFja2VkUHJvcGVydHkudmFsdWUgOiB2b2lkIDA7XHJcbiAgICB2YXIgc2FtZVJlZiA9IHByZXZPYmogPT09IG9iajtcclxuICAgIGlmIChzYW1lUGFyZW50UmVmICYmICFzYW1lUmVmICYmICFOdW1iZXIuaXNOYU4ob2JqKSkge1xyXG4gICAgICAgIHJldHVybiB7IHdhc011dGF0ZWQ6IHRydWUsIHBhdGg6IHBhdGggfTtcclxuICAgIH1cclxuICAgIGlmIChpc0ltbXV0YWJsZShwcmV2T2JqKSB8fCBpc0ltbXV0YWJsZShvYmopKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgd2FzTXV0YXRlZDogZmFsc2UgfTtcclxuICAgIH1cclxuICAgIHZhciBrZXlzVG9EZXRlY3QgPSB7fTtcclxuICAgIGZvciAodmFyIGtleSBpbiB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW4pIHtcclxuICAgICAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yICh2YXIga2V5IGluIGtleXNUb0RldGVjdCkge1xyXG4gICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgIGlmIChpZ25vcmVQYXRocy5sZW5ndGggJiYgaWdub3JlUGF0aHMuaW5kZXhPZihjaGlsZFBhdGgpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbltrZXldLCBvYmpba2V5XSwgc2FtZVJlZiwgY2hpbGRQYXRoKTtcclxuICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB3YXNNdXRhdGVkOiBmYWxzZSB9O1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAobmV4dCkgeyByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV4dChhY3Rpb24pOyB9OyB9OyB9O1xyXG4gICAgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy5pc0ltbXV0YWJsZSwgaXNJbW11dGFibGUgPSBfYyA9PT0gdm9pZCAwID8gaXNJbW11dGFibGVEZWZhdWx0IDogX2MsIGlnbm9yZWRQYXRocyA9IG9wdGlvbnMuaWdub3JlZFBhdGhzLCBfZCA9IG9wdGlvbnMud2FybkFmdGVyLCB3YXJuQWZ0ZXIgPSBfZCA9PT0gdm9pZCAwID8gMzIgOiBfZCwgaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7XHJcbiAgICBpZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMgfHwgaWdub3JlO1xyXG4gICAgdmFyIHRyYWNrID0gdHJhY2tGb3JNdXRhdGlvbnMuYmluZChudWxsLCBpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzKTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICB2YXIgZ2V0U3RhdGUgPSBfYy5nZXRTdGF0ZTtcclxuICAgICAgICB2YXIgc3RhdGUgPSBnZXRTdGF0ZSgpO1xyXG4gICAgICAgIHZhciB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xyXG4gICAgICAgIHZhciByZXN1bHQ7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7IHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XHJcbiAgICAgICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcclxuICAgICAgICAgICAgICAgIGludmFyaWFudCghcmVzdWx0Lndhc011dGF0ZWQsIFwiQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiBkaXNwYXRjaGVzLCBpbiB0aGUgcGF0aCAnXCIgKyAocmVzdWx0LnBhdGggfHwgXCJcIikgKyBcIicuICBUaGlzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKVwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHZhciBkaXNwYXRjaGVkQWN0aW9uID0gbmV4dChhY3Rpb24pO1xyXG4gICAgICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQud2FzTXV0YXRlZCAmJiBpbnZhcmlhbnQoIXJlc3VsdC53YXNNdXRhdGVkLCBcIkEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGluc2lkZSBhIGRpc3BhdGNoLCBpbiB0aGUgcGF0aDogXCIgKyAocmVzdWx0LnBhdGggfHwgXCJcIikgKyBcIi4gVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhlIGFjdGlvbiBcIiArIHN0cmluZ2lmeShhY3Rpb24pICsgXCIuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKVwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2hlZEFjdGlvbjtcclxuICAgICAgICB9OyB9O1xyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvc2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXHJcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XHJcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XHJcbiAgICByZXR1cm4gdHlwZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWwgPT09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XHJcbn1cclxuZnVuY3Rpb24gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHZhbHVlLCBwYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzKSB7XHJcbiAgICBpZiAocGF0aCA9PT0gdm9pZCAwKSB7IHBhdGggPSBcIlwiOyB9XHJcbiAgICBpZiAoaXNTZXJpYWxpemFibGUgPT09IHZvaWQgMCkgeyBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW47IH1cclxuICAgIGlmIChpZ25vcmVkUGF0aHMgPT09IHZvaWQgMCkgeyBpZ25vcmVkUGF0aHMgPSBbXTsgfVxyXG4gICAgdmFyIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xyXG4gICAgaWYgKCFpc1NlcmlhbGl6YWJsZSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXlQYXRoOiBwYXRoIHx8IFwiPHJvb3Q+XCIsXHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdmFyIGVudHJpZXMgPSBnZXRFbnRyaWVzICE9IG51bGwgPyBnZXRFbnRyaWVzKHZhbHVlKSA6IE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcclxuICAgIHZhciBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcclxuICAgIGZvciAodmFyIF9pID0gMCwgZW50cmllc18xID0gZW50cmllczsgX2kgPCBlbnRyaWVzXzEubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgdmFyIF9jID0gZW50cmllc18xW19pXSwga2V5ID0gX2NbMF0sIG5lc3RlZFZhbHVlID0gX2NbMV07XHJcbiAgICAgICAgdmFyIG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xyXG4gICAgICAgIGlmIChoYXNJZ25vcmVkUGF0aHMgJiYgaWdub3JlZFBhdGhzLmluZGV4T2YobmVzdGVkUGF0aCkgPj0gMCkge1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc1NlcmlhbGl6YWJsZShuZXN0ZWRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGtleVBhdGg6IG5lc3RlZFBhdGgsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShuZXN0ZWRWYWx1ZSwgbmVzdGVkUGF0aCwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyk7XHJcbiAgICAgICAgICAgIGlmIChmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAobmV4dCkgeyByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gbmV4dChhY3Rpb24pOyB9OyB9OyB9O1xyXG4gICAgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy5pc1NlcmlhbGl6YWJsZSwgaXNTZXJpYWxpemFibGUgPSBfYyA9PT0gdm9pZCAwID8gaXNQbGFpbiA6IF9jLCBnZXRFbnRyaWVzID0gb3B0aW9ucy5nZXRFbnRyaWVzLCBfZCA9IG9wdGlvbnMuaWdub3JlZEFjdGlvbnMsIGlnbm9yZWRBY3Rpb25zID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIF9lID0gb3B0aW9ucy5pZ25vcmVkQWN0aW9uUGF0aHMsIGlnbm9yZWRBY3Rpb25QYXRocyA9IF9lID09PSB2b2lkIDAgPyBbXCJtZXRhLmFyZ1wiLCBcIm1ldGEuYmFzZVF1ZXJ5TWV0YVwiXSA6IF9lLCBfZiA9IG9wdGlvbnMuaWdub3JlZFBhdGhzLCBpZ25vcmVkUGF0aHMgPSBfZiA9PT0gdm9pZCAwID8gW10gOiBfZiwgX2cgPSBvcHRpb25zLndhcm5BZnRlciwgd2FybkFmdGVyID0gX2cgPT09IHZvaWQgMCA/IDMyIDogX2csIF9oID0gb3B0aW9ucy5pZ25vcmVTdGF0ZSwgaWdub3JlU3RhdGUgPSBfaCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfaDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoc3RvcmVBUEkpIHsgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7IHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKGlnbm9yZWRBY3Rpb25zLmxlbmd0aCAmJiBpZ25vcmVkQWN0aW9ucy5pbmRleE9mKGFjdGlvbi50eXBlKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIlNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcclxuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShhY3Rpb24sIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkQWN0aW9uUGF0aHMpO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGtleVBhdGggPSBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlLmtleVBhdGgsIHZhbHVlID0gZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIGFuIGFjdGlvbiwgaW4gdGhlIHBhdGg6IGBcIiArIGtleVBhdGggKyBcImAuIFZhbHVlOlwiLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgbG9naWMgdGhhdCBkaXNwYXRjaGVkIHRoaXMgYWN0aW9uOiBcIiwgYWN0aW9uLCBcIlxcbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL2FjdGlvbnMjd2h5LXNob3VsZC10eXBlLWJlLWEtc3RyaW5nLW9yLWF0LWxlYXN0LXNlcmlhbGl6YWJsZS13aHktc2hvdWxkLW15LWFjdGlvbi10eXBlcy1iZS1jb25zdGFudHMpXCIsIFwiXFxuKFRvIGFsbG93IG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIHNlZTogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy91c2FnZS91c2FnZS1ndWlkZSN3b3JraW5nLXdpdGgtbm9uLXNlcmlhbGl6YWJsZS1kYXRhKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXh0KGFjdGlvbik7XHJcbiAgICAgICAgaWYgKCFpZ25vcmVTdGF0ZSkge1xyXG4gICAgICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gc3RvcmVBUEkuZ2V0U3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHZhciBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoc3RhdGUsIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXlQYXRoID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlLmtleVBhdGgsIHZhbHVlID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIHRoZSBzdGF0ZSwgaW4gdGhlIHBhdGg6IGBcIiArIGtleVBhdGggKyBcImAuIFZhbHVlOlwiLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGlzIGFjdGlvbiB0eXBlOiBcIiArIGFjdGlvbi50eXBlICsgXCIuXFxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvb3JnYW5pemluZy1zdGF0ZSNjYW4taS1wdXQtZnVuY3Rpb25zLXByb21pc2VzLW9yLW90aGVyLW5vbi1zZXJpYWxpemFibGUtaXRlbXMtaW4tbXktc3RvcmUtc3RhdGUpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbWVhc3VyZVV0aWxzLndhcm5JZkV4Y2VlZGVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9OyB9OyB9O1xyXG59XHJcbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xyXG5mdW5jdGlvbiBpc0Jvb2xlYW4oeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImJvb2xlYW5cIjtcclxufVxyXG5mdW5jdGlvbiBjdXJyeUdldERlZmF1bHRNaWRkbGV3YXJlKCkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIGdldERlZmF1bHRNaWRkbGV3YXJlKG9wdGlvbnMpO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBnZXREZWZhdWx0TWlkZGxld2FyZShvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgdmFyIF9jID0gb3B0aW9ucy50aHVuaywgdGh1bmsgPSBfYyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9jLCBfZCA9IG9wdGlvbnMuaW1tdXRhYmxlQ2hlY2ssIGltbXV0YWJsZUNoZWNrID0gX2QgPT09IHZvaWQgMCA/IHRydWUgOiBfZCwgX2UgPSBvcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLCBzZXJpYWxpemFibGVDaGVjayA9IF9lID09PSB2b2lkIDAgPyB0cnVlIDogX2U7XHJcbiAgICB2YXIgbWlkZGxld2FyZUFycmF5ID0gbmV3IE1pZGRsZXdhcmVBcnJheSgpO1xyXG4gICAgaWYgKHRodW5rKSB7XHJcbiAgICAgICAgaWYgKGlzQm9vbGVhbih0aHVuaykpIHtcclxuICAgICAgICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2godGh1bmtNaWRkbGV3YXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHRodW5rTWlkZGxld2FyZS53aXRoRXh0cmFBcmd1bWVudCh0aHVuay5leHRyYUFyZ3VtZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgIGlmIChpbW11dGFibGVDaGVjaykge1xyXG4gICAgICAgICAgICB2YXIgaW1tdXRhYmxlT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoIWlzQm9vbGVhbihpbW11dGFibGVDaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIGltbXV0YWJsZU9wdGlvbnMgPSBpbW11dGFibGVDaGVjaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoaW1tdXRhYmxlT3B0aW9ucykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VyaWFsaXphYmxlQ2hlY2spIHtcclxuICAgICAgICAgICAgdmFyIHNlcmlhbGl6YWJsZU9wdGlvbnMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKCFpc0Jvb2xlYW4oc2VyaWFsaXphYmxlQ2hlY2spKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPcHRpb25zID0gc2VyaWFsaXphYmxlQ2hlY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2goY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKHNlcmlhbGl6YWJsZU9wdGlvbnMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWlkZGxld2FyZUFycmF5O1xyXG59XHJcbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xyXG52YXIgSVNfUFJPRFVDVElPTiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcclxuZnVuY3Rpb24gY29uZmlndXJlU3RvcmUob3B0aW9ucykge1xyXG4gICAgdmFyIGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZSA9IGN1cnJ5R2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcclxuICAgIHZhciBfYyA9IG9wdGlvbnMgfHwge30sIF9kID0gX2MucmVkdWNlciwgcmVkdWNlciA9IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZCwgX2UgPSBfYy5taWRkbGV3YXJlLCBtaWRkbGV3YXJlID0gX2UgPT09IHZvaWQgMCA/IGN1cnJpZWRHZXREZWZhdWx0TWlkZGxld2FyZSgpIDogX2UsIF9mID0gX2MuZGV2VG9vbHMsIGRldlRvb2xzID0gX2YgPT09IHZvaWQgMCA/IHRydWUgOiBfZiwgX2cgPSBfYy5wcmVsb2FkZWRTdGF0ZSwgcHJlbG9hZGVkU3RhdGUgPSBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2csIF9oID0gX2MuZW5oYW5jZXJzLCBlbmhhbmNlcnMgPSBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2g7XHJcbiAgICB2YXIgcm9vdFJlZHVjZXI7XHJcbiAgICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3QocmVkdWNlcikpIHtcclxuICAgICAgICByb290UmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJyZWR1Y2VyXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnMnKTtcclxuICAgIH1cclxuICAgIHZhciBmaW5hbE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlO1xyXG4gICAgaWYgKHR5cGVvZiBmaW5hbE1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIGZpbmFsTWlkZGxld2FyZSA9IGZpbmFsTWlkZGxld2FyZShjdXJyaWVkR2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xyXG4gICAgICAgIGlmICghSVNfUFJPRFVDVElPTiAmJiAhQXJyYXkuaXNBcnJheShmaW5hbE1pZGRsZXdhcmUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIUlTX1BST0RVQ1RJT04gJiYgZmluYWxNaWRkbGV3YXJlLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCI7IH0pKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZWFjaCBtaWRkbGV3YXJlIHByb3ZpZGVkIHRvIGNvbmZpZ3VyZVN0b3JlIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcclxuICAgIH1cclxuICAgIHZhciBtaWRkbGV3YXJlRW5oYW5jZXIgPSBhcHBseU1pZGRsZXdhcmUuYXBwbHkodm9pZCAwLCBmaW5hbE1pZGRsZXdhcmUpO1xyXG4gICAgdmFyIGZpbmFsQ29tcG9zZSA9IGNvbXBvc2UyO1xyXG4gICAgaWYgKGRldlRvb2xzKSB7XHJcbiAgICAgICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyhfX3NwcmVhZFZhbHVlcyh7XHJcbiAgICAgICAgICAgIHRyYWNlOiAhSVNfUFJPRFVDVElPTlxyXG4gICAgICAgIH0sIHR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29scykpO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0b3JlRW5oYW5jZXJzID0gW21pZGRsZXdhcmVFbmhhbmNlcl07XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbmhhbmNlcnMpKSB7XHJcbiAgICAgICAgc3RvcmVFbmhhbmNlcnMgPSBfX3NwcmVhZEFycmF5KFttaWRkbGV3YXJlRW5oYW5jZXJdLCBlbmhhbmNlcnMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgc3RvcmVFbmhhbmNlcnMgPSBlbmhhbmNlcnMoc3RvcmVFbmhhbmNlcnMpO1xyXG4gICAgfVxyXG4gICAgdmFyIGNvbXBvc2VkRW5oYW5jZXIgPSBmaW5hbENvbXBvc2UuYXBwbHkodm9pZCAwLCBzdG9yZUVuaGFuY2Vycyk7XHJcbiAgICByZXR1cm4gY3JlYXRlU3RvcmUocm9vdFJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBjb21wb3NlZEVuaGFuY2VyKTtcclxufVxyXG4vLyBzcmMvY3JlYXRlQWN0aW9uLnRzXHJcbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQWN0aW9uKSB7XHJcbiAgICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJlcGFyZUFjdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgcHJlcGFyZWQgPSBwcmVwYXJlQWN0aW9uLmFwcGx5KHZvaWQgMCwgYXJncyk7XHJcbiAgICAgICAgICAgIGlmICghcHJlcGFyZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByZXBhcmVBY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogcHJlcGFyZWQucGF5bG9hZFxyXG4gICAgICAgICAgICB9LCBcIm1ldGFcIiBpbiBwcmVwYXJlZCAmJiB7IG1ldGE6IHByZXBhcmVkLm1ldGEgfSksIFwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7IGVycm9yOiBwcmVwYXJlZC5lcnJvciB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSwgcGF5bG9hZDogYXJnc1swXSB9O1xyXG4gICAgfVxyXG4gICAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiXCIgKyB0eXBlOyB9O1xyXG4gICAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcclxuICAgIGFjdGlvbkNyZWF0b3IubWF0Y2ggPSBmdW5jdGlvbiAoYWN0aW9uKSB7IHJldHVybiBhY3Rpb24udHlwZSA9PT0gdHlwZTsgfTtcclxuICAgIHJldHVybiBhY3Rpb25DcmVhdG9yO1xyXG59XHJcbmZ1bmN0aW9uIGlzRlNBKGFjdGlvbikge1xyXG4gICAgcmV0dXJuIGlzUGxhaW5PYmplY3QoYWN0aW9uKSAmJiB0eXBlb2YgYWN0aW9uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgT2JqZWN0LmtleXMoYWN0aW9uKS5ldmVyeShpc1ZhbGlkS2V5KTtcclxufVxyXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xyXG4gICAgcmV0dXJuIFtcInR5cGVcIiwgXCJwYXlsb2FkXCIsIFwiZXJyb3JcIiwgXCJtZXRhXCJdLmluZGV4T2Yoa2V5KSA+IC0xO1xyXG59XHJcbmZ1bmN0aW9uIGdldFR5cGUoYWN0aW9uQ3JlYXRvcikge1xyXG4gICAgcmV0dXJuIFwiXCIgKyBhY3Rpb25DcmVhdG9yO1xyXG59XHJcbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXHJcbmltcG9ydCBjcmVhdGVOZXh0U3RhdGUsIHsgaXNEcmFmdCBhcyBpc0RyYWZ0MiwgaXNEcmFmdGFibGUgfSBmcm9tIFwiaW1tZXJcIjtcclxuLy8gc3JjL21hcEJ1aWxkZXJzLnRzXHJcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xyXG4gICAgdmFyIGFjdGlvbnNNYXAgPSB7fTtcclxuICAgIHZhciBhY3Rpb25NYXRjaGVycyA9IFtdO1xyXG4gICAgdmFyIGRlZmF1bHRDYXNlUmVkdWNlcjtcclxuICAgIHZhciBidWlsZGVyID0ge1xyXG4gICAgICAgIGFkZENhc2U6IGZ1bmN0aW9uICh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZE1hdGNoZXJgXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gXCJzdHJpbmdcIiA/IHR5cGVPckFjdGlvbkNyZWF0b3IgOiB0eXBlT3JBY3Rpb25DcmVhdG9yLnR5cGU7XHJcbiAgICAgICAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZENhc2UgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0aW9uc01hcFt0eXBlXSA9IHJlZHVjZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkTWF0Y2hlcjogZnVuY3Rpb24gKG1hdGNoZXIsIHJlZHVjZXIpIHtcclxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBidWlsZGVyLmFkZE1hdGNoZXJgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWBcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7IG1hdGNoZXI6IG1hdGNoZXIsIHJlZHVjZXI6IHJlZHVjZXIgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkRGVmYXVsdENhc2U6IGZ1bmN0aW9uIChyZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgYnVpbGRlci5hZGREZWZhdWx0Q2FzZWAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2VcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcclxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIGJ1aWxkZXJDYWxsYmFjayhidWlsZGVyKTtcclxuICAgIHJldHVybiBbYWN0aW9uc01hcCwgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcl07XHJcbn1cclxuLy8gc3JjL2NyZWF0ZVJlZHVjZXIudHNcclxuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBtYXBPckJ1aWxkZXJDYWxsYmFjaywgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcikge1xyXG4gICAgaWYgKGFjdGlvbk1hdGNoZXJzID09PSB2b2lkIDApIHsgYWN0aW9uTWF0Y2hlcnMgPSBbXTsgfVxyXG4gICAgdmFyIF9jID0gdHlwZW9mIG1hcE9yQnVpbGRlckNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhtYXBPckJ1aWxkZXJDYWxsYmFjaykgOiBbbWFwT3JCdWlsZGVyQ2FsbGJhY2ssIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdLCBhY3Rpb25zTWFwID0gX2NbMF0sIGZpbmFsQWN0aW9uTWF0Y2hlcnMgPSBfY1sxXSwgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXIgPSBfY1syXTtcclxuICAgIHZhciBnZXRJbml0aWFsU3RhdGU7XHJcbiAgICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcclxuICAgICAgICBnZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjcmVhdGVOZXh0U3RhdGUoaW5pdGlhbFN0YXRlKCksIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB9KTsgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBmcm96ZW5Jbml0aWFsU3RhdGVfMSA9IGNyZWF0ZU5leHRTdGF0ZShpbml0aWFsU3RhdGUsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB9KTtcclxuICAgICAgICBnZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm96ZW5Jbml0aWFsU3RhdGVfMTsgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xyXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7IHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCk7IH1cclxuICAgICAgICB2YXIgY2FzZVJlZHVjZXJzID0gX19zcHJlYWRBcnJheShbXHJcbiAgICAgICAgICAgIGFjdGlvbnNNYXBbYWN0aW9uLnR5cGVdXHJcbiAgICAgICAgXSwgZmluYWxBY3Rpb25NYXRjaGVycy5maWx0ZXIoZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHZhciBtYXRjaGVyID0gX2MubWF0Y2hlcjtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcclxuICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKF9jKSB7XHJcbiAgICAgICAgICAgIHZhciByZWR1Y2VyMiA9IF9jLnJlZHVjZXI7XHJcbiAgICAgICAgICAgIHJldHVybiByZWR1Y2VyMjtcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgaWYgKGNhc2VSZWR1Y2Vycy5maWx0ZXIoZnVuY3Rpb24gKGNyKSB7IHJldHVybiAhIWNyOyB9KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChjYXNlUmVkdWNlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRHJhZnQyKHByZXZpb3VzU3RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyYWZ0ID0gcHJldmlvdXNTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNEcmFmdGFibGUocHJldmlvdXNTdGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FzZVJlZHVjZXIocHJldmlvdXNTdGF0ZSwgYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUocHJldmlvdXNTdGF0ZSwgZnVuY3Rpb24gKGRyYWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcclxuICAgICAgICB9LCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcclxuICAgIHJldHVybiByZWR1Y2VyO1xyXG59XHJcbi8vIHNyYy9jcmVhdGVTbGljZS50c1xyXG5mdW5jdGlvbiBnZXRUeXBlMihzbGljZSwgYWN0aW9uS2V5KSB7XHJcbiAgICByZXR1cm4gc2xpY2UgKyBcIi9cIiArIGFjdGlvbktleTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVTbGljZShvcHRpb25zKSB7XHJcbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImBuYW1lYCBpcyBhIHJlcXVpcmVkIG9wdGlvbiBmb3IgY3JlYXRlU2xpY2VcIik7XHJcbiAgICB9XHJcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gdHlwZW9mIG9wdGlvbnMuaW5pdGlhbFN0YXRlID09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW5pdGlhbFN0YXRlIDogZGVmYXVsdDIob3B0aW9ucy5pbml0aWFsU3RhdGUsIGZ1bmN0aW9uICgpIHtcclxuICAgIH0pO1xyXG4gICAgdmFyIHJlZHVjZXJzID0gb3B0aW9ucy5yZWR1Y2VycyB8fCB7fTtcclxuICAgIHZhciByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XHJcbiAgICB2YXIgc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWUgPSB7fTtcclxuICAgIHZhciBzbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSA9IHt9O1xyXG4gICAgdmFyIGFjdGlvbkNyZWF0b3JzID0ge307XHJcbiAgICByZWR1Y2VyTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocmVkdWNlck5hbWUpIHtcclxuICAgICAgICB2YXIgbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUgPSByZWR1Y2Vyc1tyZWR1Y2VyTmFtZV07XHJcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlMihuYW1lLCByZWR1Y2VyTmFtZSk7XHJcbiAgICAgICAgdmFyIGNhc2VSZWR1Y2VyO1xyXG4gICAgICAgIHZhciBwcmVwYXJlQ2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XHJcbiAgICAgICAgICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcclxuICAgICAgICAgICAgcHJlcGFyZUNhbGxiYWNrID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucHJlcGFyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lW3JlZHVjZXJOYW1lXSA9IGNhc2VSZWR1Y2VyO1xyXG4gICAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlW3R5cGVdID0gY2FzZVJlZHVjZXI7XHJcbiAgICAgICAgYWN0aW9uQ3JlYXRvcnNbcmVkdWNlck5hbWVdID0gcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSk7XHJcbiAgICB9KTtcclxuICAgIGZ1bmN0aW9uIGJ1aWxkUmVkdWNlcigpIHtcclxuICAgICAgICB2YXIgX2MgPSB0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhvcHRpb25zLmV4dHJhUmVkdWNlcnMpIDogW29wdGlvbnMuZXh0cmFSZWR1Y2Vyc10sIF9kID0gX2NbMF0sIGV4dHJhUmVkdWNlcnMgPSBfZCA9PT0gdm9pZCAwID8ge30gOiBfZCwgX2UgPSBfY1sxXSwgYWN0aW9uTWF0Y2hlcnMgPSBfZSA9PT0gdm9pZCAwID8gW10gOiBfZSwgX2YgPSBfY1syXSwgZGVmYXVsdENhc2VSZWR1Y2VyID0gX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mO1xyXG4gICAgICAgIHZhciBmaW5hbENhc2VSZWR1Y2VycyA9IF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBleHRyYVJlZHVjZXJzKSwgc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGUpO1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgZmluYWxDYXNlUmVkdWNlcnMsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXIpO1xyXG4gICAgfVxyXG4gICAgdmFyIF9yZWR1Y2VyO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHJlZHVjZXI6IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghX3JlZHVjZXIpXHJcbiAgICAgICAgICAgICAgICBfcmVkdWNlciA9IGJ1aWxkUmVkdWNlcigpO1xyXG4gICAgICAgICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY3Rpb25zOiBhY3Rpb25DcmVhdG9ycyxcclxuICAgICAgICBjYXNlUmVkdWNlcnM6IHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lLFxyXG4gICAgICAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIV9yZWR1Y2VyKVxyXG4gICAgICAgICAgICAgICAgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2VyLmdldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuLy8gc3JjL2VudGl0aWVzL2VudGl0eV9zdGF0ZS50c1xyXG5mdW5jdGlvbiBnZXRJbml0aWFsRW50aXR5U3RhdGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkczogW10sXHJcbiAgICAgICAgZW50aXRpZXM6IHt9XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3RvcnkoKSB7XHJcbiAgICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoYWRkaXRpb25hbFN0YXRlKSB7XHJcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxTdGF0ZSA9PT0gdm9pZCAwKSB7IGFkZGl0aW9uYWxTdGF0ZSA9IHt9OyB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCksIGFkZGl0aW9uYWxTdGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBnZXRJbml0aWFsU3RhdGU6IGdldEluaXRpYWxTdGF0ZSB9O1xyXG59XHJcbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9zZWxlY3RvcnMudHNcclxuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JzRmFjdG9yeSgpIHtcclxuICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSkge1xyXG4gICAgICAgIHZhciBzZWxlY3RJZHMgPSBmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmlkczsgfTtcclxuICAgICAgICB2YXIgc2VsZWN0RW50aXRpZXMgPSBmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmVudGl0aWVzOyB9O1xyXG4gICAgICAgIHZhciBzZWxlY3RBbGwgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcihzZWxlY3RJZHMsIHNlbGVjdEVudGl0aWVzLCBmdW5jdGlvbiAoaWRzLCBlbnRpdGllcykgeyByZXR1cm4gaWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIGVudGl0aWVzW2lkXTsgfSk7IH0pO1xyXG4gICAgICAgIHZhciBzZWxlY3RJZCA9IGZ1bmN0aW9uIChfLCBpZCkgeyByZXR1cm4gaWQ7IH07XHJcbiAgICAgICAgdmFyIHNlbGVjdEJ5SWQgPSBmdW5jdGlvbiAoZW50aXRpZXMsIGlkKSB7IHJldHVybiBlbnRpdGllc1tpZF07IH07XHJcbiAgICAgICAgdmFyIHNlbGVjdFRvdGFsID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0SWRzLCBmdW5jdGlvbiAoaWRzKSB7IHJldHVybiBpZHMubGVuZ3RoOyB9KTtcclxuICAgICAgICBpZiAoIXNlbGVjdFN0YXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RJZHM6IHNlbGVjdElkcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdEVudGl0aWVzOiBzZWxlY3RFbnRpdGllcyxcclxuICAgICAgICAgICAgICAgIHNlbGVjdEFsbDogc2VsZWN0QWxsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0VG90YWw6IHNlbGVjdFRvdGFsLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0RW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzID0gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzZWxlY3RJZHM6IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yKHNlbGVjdFN0YXRlLCBzZWxlY3RJZHMpLFxyXG4gICAgICAgICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxyXG4gICAgICAgICAgICBzZWxlY3RBbGw6IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yKHNlbGVjdFN0YXRlLCBzZWxlY3RBbGwpLFxyXG4gICAgICAgICAgICBzZWxlY3RUb3RhbDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0U3RhdGUsIHNlbGVjdFRvdGFsKSxcclxuICAgICAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3Ioc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZ2V0U2VsZWN0b3JzOiBnZXRTZWxlY3RvcnMgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfYWRhcHRlci50c1xyXG5pbXBvcnQgY3JlYXRlTmV4dFN0YXRlMiwgeyBpc0RyYWZ0IGFzIGlzRHJhZnQzIH0gZnJvbSBcImltbWVyXCI7XHJcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XHJcbiAgICB2YXIgb3BlcmF0b3IgPSBjcmVhdGVTdGF0ZU9wZXJhdG9yKGZ1bmN0aW9uIChfLCBzdGF0ZSkgeyByZXR1cm4gbXV0YXRvcihzdGF0ZSk7IH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gY3JlYXRlU3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcclxuICAgICAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc0ZTQShhcmcyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJ1bk11dGF0b3IgPSBmdW5jdGlvbiAoZHJhZnQpIHtcclxuICAgICAgICAgICAgaWYgKGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZykpIHtcclxuICAgICAgICAgICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpc0RyYWZ0MyhzdGF0ZSkpIHtcclxuICAgICAgICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUyKHN0YXRlLCBydW5NdXRhdG9yKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbi8vIHNyYy9lbnRpdGllcy91dGlscy50c1xyXG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcclxuICAgIHZhciBrZXkgPSBzZWxlY3RJZChlbnRpdHkpO1xyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBrZXk7XHJcbn1cclxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xyXG4gICAgICAgIGVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhlbnRpdGllcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZW50aXRpZXM7XHJcbn1cclxuZnVuY3Rpb24gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSB7XHJcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgdmFyIGFkZGVkID0gW107XHJcbiAgICB2YXIgdXBkYXRlZCA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwLCBuZXdFbnRpdGllc18xID0gbmV3RW50aXRpZXM7IF9pIDwgbmV3RW50aXRpZXNfMS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICB2YXIgZW50aXR5ID0gbmV3RW50aXRpZXNfMVtfaV07XHJcbiAgICAgICAgdmFyIGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuICAgICAgICBpZiAoaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgICAgICAgdXBkYXRlZC5wdXNoKHsgaWQ6IGlkLCBjaGFuZ2VzOiBlbnRpdHkgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGVudGl0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZF07XHJcbn1cclxuLy8gc3JjL2VudGl0aWVzL3Vuc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpIHtcclxuICAgIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xyXG4gICAgICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGF0ZS5pZHMucHVzaChrZXkpO1xyXG4gICAgICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcclxuICAgICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RW50aXRpZXNfMiA9IG5ld0VudGl0aWVzOyBfaSA8IG5ld0VudGl0aWVzXzIubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXdFbnRpdGllc18yW19pXTtcclxuICAgICAgICAgICAgYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcclxuICAgICAgICB2YXIga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuICAgICAgICBpZiAoIShrZXkgaW4gc3RhdGUuZW50aXRpZXMpKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcclxuICAgICAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RW50aXRpZXNfMyA9IG5ld0VudGl0aWVzOyBfaSA8IG5ld0VudGl0aWVzXzMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBuZXdFbnRpdGllc18zW19pXTtcclxuICAgICAgICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xyXG4gICAgICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XHJcbiAgICAgICAgc3RhdGUuaWRzID0gW107XHJcbiAgICAgICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlT25lTXV0YWJseShrZXksIHN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtrZXldLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBkaWRNdXRhdGUgPSBmYWxzZTtcclxuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGRpZE11dGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoZGlkTXV0YXRlKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcyA9IHN0YXRlLmlkcy5maWx0ZXIoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpZCBpbiBzdGF0ZS5lbnRpdGllczsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTXV0YWJseShzdGF0ZSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHtcclxuICAgICAgICAgICAgaWRzOiBbXSxcclxuICAgICAgICAgICAgZW50aXRpZXM6IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB0YWtlTmV3S2V5KGtleXMsIHVwZGF0ZSwgc3RhdGUpIHtcclxuICAgICAgICB2YXIgb3JpZ2luYWwyID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcclxuICAgICAgICB2YXIgdXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsMiwgdXBkYXRlLmNoYW5nZXMpO1xyXG4gICAgICAgIHZhciBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcclxuICAgICAgICB2YXIgaGFzTmV3S2V5ID0gbmV3S2V5ICE9PSB1cGRhdGUuaWQ7XHJcbiAgICAgICAgaWYgKGhhc05ld0tleSkge1xyXG4gICAgICAgICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGF0ZS5lbnRpdGllc1tuZXdLZXldID0gdXBkYXRlZDtcclxuICAgICAgICByZXR1cm4gaGFzTmV3S2V5O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xyXG4gICAgICAgIHZhciBuZXdLZXlzID0ge307XHJcbiAgICAgICAgdmFyIHVwZGF0ZXNQZXJFbnRpdHkgPSB7fTtcclxuICAgICAgICB1cGRhdGVzLmZvckVhY2goZnVuY3Rpb24gKHVwZGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHVwZGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdID8gdXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdLmNoYW5nZXMgOiBudWxsKSwgdXBkYXRlLmNoYW5nZXMpXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdXBkYXRlcyA9IE9iamVjdC52YWx1ZXModXBkYXRlc1BlckVudGl0eSk7XHJcbiAgICAgICAgdmFyIGRpZE11dGF0ZUVudGl0aWVzID0gdXBkYXRlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIGlmIChkaWRNdXRhdGVFbnRpdGllcykge1xyXG4gICAgICAgICAgICB2YXIgZGlkTXV0YXRlSWRzID0gdXBkYXRlcy5maWx0ZXIoZnVuY3Rpb24gKHVwZGF0ZSkgeyByZXR1cm4gdGFrZU5ld0tleShuZXdLZXlzLCB1cGRhdGUsIHN0YXRlKTsgfSkubGVuZ3RoID4gMDtcclxuICAgICAgICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xyXG4gICAgICAgICAgICAgICAgc3RhdGUuaWRzID0gc3RhdGUuaWRzLm1hcChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIG5ld0tleXNbaWRdIHx8IGlkOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIF9jID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSwgYWRkZWQgPSBfY1swXSwgdXBkYXRlZCA9IF9jWzFdO1xyXG4gICAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZW1vdmVBbGw6IGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihyZW1vdmVBbGxNdXRhYmx5KSxcclxuICAgICAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXHJcbiAgICAgICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXHJcbiAgICAgICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxyXG4gICAgICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcclxuICAgICAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXHJcbiAgICAgICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXHJcbiAgICAgICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxyXG4gICAgICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHJlbW92ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVPbmVNdXRhYmx5KSxcclxuICAgICAgICByZW1vdmVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU1hbnlNdXRhYmx5KVxyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0KSB7XHJcbiAgICB2YXIgX2MgPSBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCksIHJlbW92ZU9uZSA9IF9jLnJlbW92ZU9uZSwgcmVtb3ZlTWFueSA9IF9jLnJlbW92ZU1hbnksIHJlbW92ZUFsbCA9IF9jLnJlbW92ZUFsbDtcclxuICAgIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBhZGRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcclxuICAgICAgICB2YXIgbW9kZWxzID0gbmV3RW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChtb2RlbCkgeyByZXR1cm4gIShzZWxlY3RJZFZhbHVlKG1vZGVsLCBzZWxlY3RJZCkgaW4gc3RhdGUuZW50aXRpZXMpOyB9KTtcclxuICAgICAgICBpZiAobW9kZWxzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICBtZXJnZShtb2RlbHMsIHN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gc2V0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xyXG4gICAgICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XHJcbiAgICAgICAgaWYgKG5ld0VudGl0aWVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICBtZXJnZShuZXdFbnRpdGllcywgc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcclxuICAgICAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xyXG4gICAgICAgIHN0YXRlLmlkcyA9IFtdO1xyXG4gICAgICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRha2VVcGRhdGVkTW9kZWwobW9kZWxzLCB1cGRhdGUsIHN0YXRlKSB7XHJcbiAgICAgICAgaWYgKCEodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvcmlnaW5hbDIgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIHZhciB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWwyLCB1cGRhdGUuY2hhbmdlcyk7XHJcbiAgICAgICAgdmFyIG5ld0tleSA9IHNlbGVjdElkVmFsdWUodXBkYXRlZCwgc2VsZWN0SWQpO1xyXG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xyXG4gICAgICAgIG1vZGVscy5wdXNoKHVwZGF0ZWQpO1xyXG4gICAgICAgIHJldHVybiBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIG1vZGVscyA9IFtdO1xyXG4gICAgICAgIHVwZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAodXBkYXRlKSB7IHJldHVybiB0YWtlVXBkYXRlZE1vZGVsKG1vZGVscywgdXBkYXRlLCBzdGF0ZSk7IH0pO1xyXG4gICAgICAgIGlmIChtb2RlbHMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgIG1lcmdlKG1vZGVscywgc3RhdGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XHJcbiAgICAgICAgdmFyIF9jID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSwgYWRkZWQgPSBfY1swXSwgdXBkYXRlZCA9IF9jWzFdO1xyXG4gICAgICAgIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcclxuICAgICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoYSwgYikge1xyXG4gICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoICYmIGkgPCBiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhW2ldID09PSBiW2ldKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbWVyZ2UobW9kZWxzLCBzdGF0ZSkge1xyXG4gICAgICAgIG1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xyXG4gICAgICAgICAgICBzdGF0ZS5lbnRpdGllc1tzZWxlY3RJZChtb2RlbCldID0gbW9kZWw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIGFsbEVudGl0aWVzID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5lbnRpdGllcyk7XHJcbiAgICAgICAgYWxsRW50aXRpZXMuc29ydChzb3J0KTtcclxuICAgICAgICB2YXIgbmV3U29ydGVkSWRzID0gYWxsRW50aXRpZXMubWFwKHNlbGVjdElkKTtcclxuICAgICAgICB2YXIgaWRzID0gc3RhdGUuaWRzO1xyXG4gICAgICAgIGlmICghYXJlQXJyYXlzRXF1YWwoaWRzLCBuZXdTb3J0ZWRJZHMpKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmlkcyA9IG5ld1NvcnRlZElkcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlbW92ZU9uZTogcmVtb3ZlT25lLFxyXG4gICAgICAgIHJlbW92ZU1hbnk6IHJlbW92ZU1hbnksXHJcbiAgICAgICAgcmVtb3ZlQWxsOiByZW1vdmVBbGwsXHJcbiAgICAgICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxyXG4gICAgICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcclxuICAgICAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXHJcbiAgICAgICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxyXG4gICAgICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxyXG4gICAgICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcclxuICAgICAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcclxuICAgICAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcclxuICAgICAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KVxyXG4gICAgfTtcclxufVxyXG4vLyBzcmMvZW50aXRpZXMvY3JlYXRlX2FkYXB0ZXIudHNcclxuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxyXG4gICAgdmFyIF9jID0gX19zcHJlYWRWYWx1ZXMoe1xyXG4gICAgICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXHJcbiAgICAgICAgc2VsZWN0SWQ6IGZ1bmN0aW9uIChpbnN0YW5jZSkgeyByZXR1cm4gaW5zdGFuY2UuaWQ7IH1cclxuICAgIH0sIG9wdGlvbnMpLCBzZWxlY3RJZCA9IF9jLnNlbGVjdElkLCBzb3J0Q29tcGFyZXIgPSBfYy5zb3J0Q29tcGFyZXI7XHJcbiAgICB2YXIgc3RhdGVGYWN0b3J5ID0gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeSgpO1xyXG4gICAgdmFyIHNlbGVjdG9yc0ZhY3RvcnkgPSBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCk7XHJcbiAgICB2YXIgc3RhdGVBZGFwdGVyID0gc29ydENvbXBhcmVyID8gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0Q29tcGFyZXIpIDogY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xyXG4gICAgcmV0dXJuIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHtcclxuICAgICAgICBzZWxlY3RJZDogc2VsZWN0SWQsXHJcbiAgICAgICAgc29ydENvbXBhcmVyOiBzb3J0Q29tcGFyZXJcclxuICAgIH0sIHN0YXRlRmFjdG9yeSksIHNlbGVjdG9yc0ZhY3RvcnkpLCBzdGF0ZUFkYXB0ZXIpO1xyXG59XHJcbi8vIHNyYy9uYW5vaWQudHNcclxudmFyIHVybEFscGhhYmV0ID0gXCJNb2R1bGVTeW1iaGFzT3duUHItMDEyMzQ1Njc4OUFCQ0RFRkdITlJWZmdjdGlVdnpfS3FZVEprTHhwWlhJalFXXCI7XHJcbnZhciBuYW5vaWQgPSBmdW5jdGlvbiAoc2l6ZSkge1xyXG4gICAgaWYgKHNpemUgPT09IHZvaWQgMCkgeyBzaXplID0gMjE7IH1cclxuICAgIHZhciBpZCA9IFwiXCI7XHJcbiAgICB2YXIgaSA9IHNpemU7XHJcbiAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgICAgaWQgKz0gdXJsQWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIDY0IHwgMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaWQ7XHJcbn07XHJcbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXHJcbnZhciBjb21tb25Qcm9wZXJ0aWVzID0gW1xyXG4gICAgXCJuYW1lXCIsXHJcbiAgICBcIm1lc3NhZ2VcIixcclxuICAgIFwic3RhY2tcIixcclxuICAgIFwiY29kZVwiXHJcbl07XHJcbnZhciBSZWplY3RXaXRoVmFsdWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBSZWplY3RXaXRoVmFsdWUocGF5bG9hZCwgbWV0YSkge1xyXG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBSZWplY3RXaXRoVmFsdWU7XHJcbn0oKSk7XHJcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBGdWxmaWxsV2l0aE1ldGEocGF5bG9hZCwgbWV0YSkge1xyXG4gICAgICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XHJcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcclxuICAgIH1cclxuICAgIHJldHVybiBGdWxmaWxsV2l0aE1ldGE7XHJcbn0oKSk7XHJcbnZhciBtaW5pU2VyaWFsaXplRXJyb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICB2YXIgc2ltcGxlRXJyb3IgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGNvbW1vblByb3BlcnRpZXNfMSA9IGNvbW1vblByb3BlcnRpZXM7IF9pIDwgY29tbW9uUHJvcGVydGllc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb21tb25Qcm9wZXJ0aWVzXzFbX2ldO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlW3Byb3BlcnR5XSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaW1wbGVFcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiB7IG1lc3NhZ2U6IFN0cmluZyh2YWx1ZSkgfTtcclxufTtcclxuZnVuY3Rpb24gY3JlYXRlQXN5bmNUaHVuayh0eXBlUHJlZml4LCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucykge1xyXG4gICAgdmFyIGZ1bGZpbGxlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvZnVsZmlsbGVkXCIsIGZ1bmN0aW9uIChwYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgbWV0YSkgeyByZXR1cm4gKHtcclxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9KTsgfSk7XHJcbiAgICB2YXIgcGVuZGluZyA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvcGVuZGluZ1wiLCBmdW5jdGlvbiAocmVxdWVzdElkLCBhcmcsIG1ldGEpIHsgcmV0dXJuICh7XHJcbiAgICAgICAgcGF5bG9hZDogdm9pZCAwLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJwZW5kaW5nXCJcclxuICAgICAgICB9KVxyXG4gICAgfSk7IH0pO1xyXG4gICAgdmFyIHJlamVjdGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9yZWplY3RlZFwiLCBmdW5jdGlvbiAoZXJyb3IsIHJlcXVlc3RJZCwgYXJnLCBwYXlsb2FkLCBtZXRhKSB7IHJldHVybiAoe1xyXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXHJcbiAgICAgICAgZXJyb3I6IChvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplRXJyb3IgfHwgbWluaVNlcmlhbGl6ZUVycm9yKShlcnJvciB8fCBcIlJlamVjdGVkXCIpLFxyXG4gICAgICAgIG1ldGE6IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG1ldGEgfHwge30pLCB7XHJcbiAgICAgICAgICAgIGFyZzogYXJnLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWU6ICEhcGF5bG9hZCxcclxuICAgICAgICAgICAgcmVxdWVzdFN0YXR1czogXCJyZWplY3RlZFwiLFxyXG4gICAgICAgICAgICBhYm9ydGVkOiAoZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yLm5hbWUpID09PSBcIkFib3J0RXJyb3JcIixcclxuICAgICAgICAgICAgY29uZGl0aW9uOiAoZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGVycm9yLm5hbWUpID09PSBcIkNvbmRpdGlvbkVycm9yXCJcclxuICAgICAgICB9KVxyXG4gICAgfSk7IH0pO1xyXG4gICAgdmFyIGRpc3BsYXllZFdhcm5pbmcgPSBmYWxzZTtcclxuICAgIHZhciBBQyA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgIT09IFwidW5kZWZpbmVkXCIgPyBBYm9ydENvbnRyb2xsZXIgOiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gY2xhc3NfMSgpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWduYWwgPSB7XHJcbiAgICAgICAgICAgICAgICBhYm9ydGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uYWJvcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRpc3BsYXllZFdhcm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRXYXJuaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJUaGlzIHBsYXRmb3JtIGRvZXMgbm90IGltcGxlbWVudCBBYm9ydENvbnRyb2xsZXIuIFxcbklmIHlvdSB3YW50IHRvIHVzZSB0aGUgQWJvcnRDb250cm9sbGVyIHRvIHJlYWN0IHRvIGBhYm9ydGAgZXZlbnRzLCBwbGVhc2UgY29uc2lkZXIgaW1wb3J0aW5nIGEgcG9seWZpbGwgbGlrZSAnYWJvcnRjb250cm9sbGVyLXBvbHlmaWxsL2Rpc3QvYWJvcnRjb250cm9sbGVyLXBvbHlmaWxsLW9ubHknLlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzXzE7XHJcbiAgICB9KCkpO1xyXG4gICAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvcihhcmcpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmEpIHtcclxuICAgICAgICAgICAgdmFyIHJlcXVlc3RJZCA9IChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmlkR2VuZXJhdG9yKSA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xyXG4gICAgICAgICAgICB2YXIgYWJvcnRDb250cm9sbGVyID0gbmV3IEFDKCk7XHJcbiAgICAgICAgICAgIHZhciBhYm9ydFJlYXNvbjtcclxuICAgICAgICAgICAgdmFyIGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKF8sIHJlamVjdCkgeyByZXR1cm4gYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVqZWN0KHsgbmFtZTogXCJBYm9ydEVycm9yXCIsIG1lc3NhZ2U6IGFib3J0UmVhc29uIHx8IFwiQWJvcnRlZFwiIH0pOyB9KTsgfSk7XHJcbiAgICAgICAgICAgIHZhciBzdGFydGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhYm9ydFJlYXNvbiA9IHJlYXNvbjtcclxuICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfX2FzeW5jKHRoaXMsIG51bGwsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBmaW5hbEFjdGlvbiwgY29uZGl0aW9uUmVzdWx0LCBlcnJfMSwgc2tpcERpc3BhdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMCwgNCwgLCA1XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUmVzdWx0ID0gKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jb25kaXRpb24pID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIGFyZywgeyBnZXRTdGF0ZTogZ2V0U3RhdGUsIGV4dHJhOiBleHRyYSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY29uZGl0aW9uUmVzdWx0XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBfYy5zZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQWJvcnRlZCBkdWUgdG8gY29uZGl0aW9uIGNhbGxiYWNrIHJldHVybmluZyBmYWxzZS5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChwZW5kaW5nKHJlcXVlc3RJZCwgYXJnLCAoX2IgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdldFBlbmRpbmdNZXRhKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChvcHRpb25zLCB7IHJlcXVlc3RJZDogcmVxdWVzdElkLCBhcmc6IGFyZyB9LCB7IGdldFN0YXRlOiBnZXRTdGF0ZSwgZXh0cmE6IGV4dHJhIH0pKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWRQcm9taXNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGV4dHJhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXaXRoVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgbWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlamVjdFdpdGhWYWx1ZSh2YWx1ZSwgbWV0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIG1ldGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdWxmaWxsV2l0aE1ldGEodmFsdWUsIG1ldGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEZ1bGZpbGxXaXRoTWV0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdC5wYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgcmVzdWx0Lm1ldGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Muc2VudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyXzEgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUgPyByZWplY3RlZChudWxsLCByZXF1ZXN0SWQsIGFyZywgZXJyXzEucGF5bG9hZCwgZXJyXzEubWV0YSkgOiByZWplY3RlZChlcnJfMSwgcmVxdWVzdElkLCBhcmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBEaXNwYXRjaCA9IG9wdGlvbnMgJiYgIW9wdGlvbnMuZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb24gJiYgcmVqZWN0ZWQubWF0Y2goZmluYWxBY3Rpb24pICYmIGZpbmFsQWN0aW9uLm1ldGEuY29uZGl0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcERpc3BhdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGZpbmFsQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGZpbmFsQWN0aW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0oKTtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xyXG4gICAgICAgICAgICAgICAgYWJvcnQ6IGFib3J0LFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICBhcmc6IGFyZyxcclxuICAgICAgICAgICAgICAgIHVud3JhcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odW53cmFwUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvbkNyZWF0b3IsIHtcclxuICAgICAgICBwZW5kaW5nOiBwZW5kaW5nLFxyXG4gICAgICAgIHJlamVjdGVkOiByZWplY3RlZCxcclxuICAgICAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcclxuICAgICAgICB0eXBlUHJlZml4OiB0eXBlUHJlZml4XHJcbiAgICB9KTtcclxufVxyXG5mdW5jdGlvbiB1bndyYXBSZXN1bHQoYWN0aW9uKSB7XHJcbiAgICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcclxuICAgICAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH1cclxuICAgIGlmIChhY3Rpb24uZXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBhY3Rpb24uZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XHJcbn1cclxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xyXG59XHJcbi8vIHNyYy90c0hlbHBlcnMudHNcclxudmFyIGhhc01hdGNoRnVuY3Rpb24gPSBmdW5jdGlvbiAodikge1xyXG4gICAgcmV0dXJuIHYgJiYgdHlwZW9mIHYubWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcclxufTtcclxuLy8gc3JjL21hdGNoZXJzLnRzXHJcbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gKG1hdGNoZXIsIGFjdGlvbikge1xyXG4gICAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcclxuICAgIH1cclxufTtcclxuZnVuY3Rpb24gaXNBbnlPZigpIHtcclxuICAgIHZhciBtYXRjaGVycyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBtYXRjaGVyc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlcnMuc29tZShmdW5jdGlvbiAobWF0Y2hlcikgeyByZXR1cm4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pOyB9KTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gaXNBbGxPZigpIHtcclxuICAgIHZhciBtYXRjaGVycyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBtYXRjaGVyc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hlcnMuZXZlcnkoZnVuY3Rpb24gKG1hdGNoZXIpIHsgcmV0dXJuIG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKTsgfSk7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgdmFsaWRTdGF0dXMpIHtcclxuICAgIGlmICghYWN0aW9uIHx8ICFhY3Rpb24ubWV0YSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB2YXIgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xyXG4gICAgdmFyIGhhc1ZhbGlkUmVxdWVzdFN0YXR1cyA9IHZhbGlkU3RhdHVzLmluZGV4T2YoYWN0aW9uLm1ldGEucmVxdWVzdFN0YXR1cykgPiAtMTtcclxuICAgIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XHJcbn1cclxuZnVuY3Rpb24gaXNBc3luY1RodW5rQXJyYXkoYSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBhWzBdID09PSBcImZ1bmN0aW9uXCIgJiYgXCJwZW5kaW5nXCIgaW4gYVswXSAmJiBcImZ1bGZpbGxlZFwiIGluIGFbMF0gJiYgXCJyZWplY3RlZFwiIGluIGFbMF07XHJcbn1cclxuZnVuY3Rpb24gaXNQZW5kaW5nKCkge1xyXG4gICAgdmFyIGFzeW5jVGh1bmtzID0gW107XHJcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgIGFzeW5jVGh1bmtzW19pXSA9IGFyZ3VtZW50c1tfaV07XHJcbiAgICB9XHJcbiAgICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHsgcmV0dXJuIGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xyXG4gICAgICAgIHZhciBtYXRjaGVycyA9IGFzeW5jVGh1bmtzLm1hcChmdW5jdGlvbiAoYXN5bmNUaHVuaykgeyByZXR1cm4gYXN5bmNUaHVuay5wZW5kaW5nOyB9KTtcclxuICAgICAgICB2YXIgY29tYmluZWRNYXRjaGVyID0gaXNBbnlPZi5hcHBseSh2b2lkIDAsIG1hdGNoZXJzKTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWRNYXRjaGVyKGFjdGlvbik7XHJcbiAgICB9O1xyXG59XHJcbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoKSB7XHJcbiAgICB2YXIgYXN5bmNUaHVua3MgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgYXN5bmNUaHVua3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJyZWplY3RlZFwiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICB2YXIgbWF0Y2hlcnMgPSBhc3luY1RodW5rcy5tYXAoZnVuY3Rpb24gKGFzeW5jVGh1bmspIHsgcmV0dXJuIGFzeW5jVGh1bmsucmVqZWN0ZWQ7IH0pO1xyXG4gICAgICAgIHZhciBjb21iaW5lZE1hdGNoZXIgPSBpc0FueU9mLmFwcGx5KHZvaWQgMCwgbWF0Y2hlcnMpO1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lZE1hdGNoZXIoYWN0aW9uKTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSgpIHtcclxuICAgIHZhciBhc3luY1RodW5rcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhc3luY1RodW5rc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgdmFyIGhhc0ZsYWcgPSBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIGFjdGlvbiAmJiBhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZTtcclxuICAgIH07XHJcbiAgICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQWxsT2YoaXNSZWplY3RlZC5hcHBseSh2b2lkIDAsIGFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lZE1hdGNoZXIoYWN0aW9uKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcclxuICAgICAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQWxsT2YoaXNSZWplY3RlZC5hcHBseSh2b2lkIDAsIGFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWF0Y2hlcihhY3Rpb24pO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCgpIHtcclxuICAgIHZhciBhc3luY1RodW5rcyA9IFtdO1xyXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICBhc3luY1RodW5rc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgfVxyXG4gICAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7IHJldHVybiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcImZ1bGZpbGxlZFwiXSk7IH07XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xyXG4gICAgICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmdW5jdGlvbiAoYWN0aW9uKSB7XHJcbiAgICAgICAgdmFyIG1hdGNoZXJzID0gYXN5bmNUaHVua3MubWFwKGZ1bmN0aW9uIChhc3luY1RodW5rKSB7IHJldHVybiBhc3luY1RodW5rLmZ1bGZpbGxlZDsgfSk7XHJcbiAgICAgICAgdmFyIGNvbWJpbmVkTWF0Y2hlciA9IGlzQW55T2YuYXBwbHkodm9pZCAwLCBtYXRjaGVycyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkTWF0Y2hlcihhY3Rpb24pO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oKSB7XHJcbiAgICB2YXIgYXN5bmNUaHVua3MgPSBbXTtcclxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgYXN5bmNUaHVua3NbX2ldID0gYXJndW1lbnRzW19pXTtcclxuICAgIH1cclxuICAgIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikgeyByZXR1cm4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCIsIFwiZnVsZmlsbGVkXCIsIFwicmVqZWN0ZWRcIl0pOyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcclxuICAgICAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcclxuICAgICAgICB2YXIgbWF0Y2hlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGFzeW5jVGh1bmtzXzEgPSBhc3luY1RodW5rczsgX2kgPCBhc3luY1RodW5rc18xLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB2YXIgYXN5bmNUaHVuayA9IGFzeW5jVGh1bmtzXzFbX2ldO1xyXG4gICAgICAgICAgICBtYXRjaGVycy5wdXNoKGFzeW5jVGh1bmsucGVuZGluZywgYXN5bmNUaHVuay5yZWplY3RlZCwgYXN5bmNUaHVuay5mdWxmaWxsZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29tYmluZWRNYXRjaGVyID0gaXNBbnlPZi5hcHBseSh2b2lkIDAsIG1hdGNoZXJzKTtcclxuICAgICAgICByZXR1cm4gY29tYmluZWRNYXRjaGVyKGFjdGlvbik7XHJcbiAgICB9O1xyXG59XHJcbi8vIHNyYy9pbmRleC50c1xyXG5lbmFibGVFUzUoKTtcclxuZXhwb3J0IHsgTWlkZGxld2FyZUFycmF5LCBjb25maWd1cmVTdG9yZSwgY3JlYXRlQWN0aW9uLCBjcmVhdGVBc3luY1RodW5rLCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvciwgY3JlYXRlRW50aXR5QWRhcHRlciwgY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLCBkZWZhdWx0MiBhcyBjcmVhdGVOZXh0U3RhdGUsIGNyZWF0ZVJlZHVjZXIsIGNyZWF0ZVNlbGVjdG9yMiBhcyBjcmVhdGVTZWxlY3RvciwgY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLCBjcmVhdGVTbGljZSwgY3VycmVudDIgYXMgY3VycmVudCwgZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlLCBmcmVlemUsIGdldERlZmF1bHRNaWRkbGV3YXJlLCBnZXRUeXBlLCBpc0FsbE9mLCBpc0FueU9mLCBpc0FzeW5jVGh1bmtBY3Rpb24sIGlzRHJhZnQ0IGFzIGlzRHJhZnQsIGlzRnVsZmlsbGVkLCBpc0ltbXV0YWJsZURlZmF1bHQsIGlzUGVuZGluZywgaXNQbGFpbiwgaXNQbGFpbk9iamVjdCwgaXNSZWplY3RlZCwgaXNSZWplY3RlZFdpdGhWYWx1ZSwgbWluaVNlcmlhbGl6ZUVycm9yLCBuYW5vaWQsIG9yaWdpbmFsLCB1bndyYXBSZXN1bHQgfTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5lc20uanMubWFwIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEEgY29udmVuaWVuY2UgaG9vayBhcm91bmQgYHVzZVN0YXRlYCBkZXNpZ25lZCB0byBiZSBwYWlyZWQgd2l0aFxuICogdGhlIGNvbXBvbmVudCBbY2FsbGJhY2sgcmVmXShodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVmcy1hbmQtdGhlLWRvbS5odG1sI2NhbGxiYWNrLXJlZnMpIGFwaS5cbiAqIENhbGxiYWNrIHJlZnMgYXJlIHVzZWZ1bCBvdmVyIGB1c2VSZWYoKWAgd2hlbiB5b3UgbmVlZCB0byByZXNwb25kIHRvIHRoZSByZWYgYmVpbmcgc2V0XG4gKiBpbnN0ZWFkIG9mIGxhemlseSBhY2Nlc3NpbmcgaXQgaW4gYW4gZWZmZWN0LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxEaXZFbGVtZW50PigpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgaWYgKCFlbGVtZW50KSByZXR1cm5cbiAqXG4gKiAgIGNvbnN0IGNhbGVuZGFyID0gbmV3IEZ1bGxDYWxlbmRhci5DYWxlbmRhcihlbGVtZW50KVxuICpcbiAqICAgcmV0dXJuICgpID0+IHtcbiAqICAgICBjYWxlbmRhci5kZXN0cm95KClcbiAqICAgfVxuICogfSwgW2VsZW1lbnRdKVxuICpcbiAqIHJldHVybiA8ZGl2IHJlZj17YXR0YWNoUmVmfSAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDYWxsYmFja1JlZigpIHtcbiAgcmV0dXJuIHVzZVN0YXRlKG51bGwpO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYFJlZmAgd2hvc2UgdmFsdWUgaXMgdXBkYXRlZCBpbiBhbiBlZmZlY3QsIGVuc3VyaW5nIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWUgaXMgdGhlIG9uZSByZW5kZXJlZCB3aXRoLiBHZW5lcmFsbHkgb25seSByZXF1aXJlZCBmb3IgQ29uY3VycmVudCBtb2RlIHVzYWdlXG4gKiB3aGVyZSBwcmV2aW91cyB3b3JrIGluIGByZW5kZXIoKWAgbWF5IGJlIGRpc2NhcmRlZCBiZWZvciBiZWluZyB1c2VkLlxuICpcbiAqIFRoaXMgaXMgc2FmZSB0byBhY2Nlc3MgaW4gYW4gZXZlbnQgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGBSZWZgIHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29tbWl0dGVkUmVmKHZhbHVlKSB7XG4gIHZhciByZWYgPSB1c2VSZWYodmFsdWUpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcmVmO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb21taXR0ZWRSZWY7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50Q2FsbGJhY2soZm4pIHtcbiAgdmFyIHJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7XG4gIHJldHVybiB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ICYmIHJlZi5jdXJyZW50LmFwcGx5KHJlZiwgYXJndW1lbnRzKTtcbiAgfSwgW3JlZl0pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnO1xudmFyIGlzUmVhY3ROYXRpdmUgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiAvLyBAdHMtaWdub3JlXG5nbG9iYWwubmF2aWdhdG9yICYmIC8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJztcbnZhciBpc0RPTSA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG4vKipcbiAqIElzIGB1c2VMYXlvdXRFZmZlY3RgIGluIGEgRE9NIG9yIFJlYWN0IE5hdGl2ZSBlbnZpcm9ubWVudCwgb3RoZXJ3aXNlIHJlc29sdmVzIHRvIHVzZUVmZmVjdFxuICogT25seSB1c2VmdWwgdG8gYXZvaWQgdGhlIGNvbnNvbGUgd2FybmluZy5cbiAqXG4gKiBQUkVGRVIgYHVzZUVmZmVjdGAgVU5MRVNTIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORy5cbiAqXG4gKiBAY2F0ZWdvcnkgZWZmZWN0c1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGlzRE9NIHx8IGlzUmVhY3ROYXRpdmUgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7IiwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxudmFyIHRvRm5SZWYgPSBmdW5jdGlvbiB0b0ZuUmVmKHJlZikge1xuICByZXR1cm4gIXJlZiB8fCB0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nID8gcmVmIDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlZnMocmVmQSwgcmVmQikge1xuICB2YXIgYSA9IHRvRm5SZWYocmVmQSk7XG4gIHZhciBiID0gdG9GblJlZihyZWZCKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChhKSBhKHZhbHVlKTtcbiAgICBpZiAoYikgYih2YWx1ZSk7XG4gIH07XG59XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJucyBhIHNpbmdsZSBjYWxsYmFjayByZWYgY29tcG9zZWQgZnJvbSB0d28gb3RoZXIgUmVmcy5cbiAqXG4gKiBgYGB0c3hcbiAqIGNvbnN0IEJ1dHRvbiA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAqICAgY29uc3QgW2VsZW1lbnQsIGF0dGFjaFJlZl0gPSB1c2VDYWxsYmFja1JlZjxIVE1MQnV0dG9uRWxlbWVudD4oKTtcbiAqICAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhyZWYsIGF0dGFjaFJlZik7XG4gKlxuICogICByZXR1cm4gPGJ1dHRvbiByZWY9e21lcmdlZFJlZn0gey4uLnByb3BzfS8+XG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIHJlZkEgQSBDYWxsYmFjayBvciBtdXRhYmxlIFJlZlxuICogQHBhcmFtIHJlZkIgQSBDYWxsYmFjayBvciBtdXRhYmxlIFJlZlxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VNZXJnZWRSZWZzKHJlZkEsIHJlZkIpIHtcbiAgcmV0dXJuIHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXJnZVJlZnMocmVmQSwgcmVmQik7XG4gIH0sIFtyZWZBLCByZWZCXSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZU1lcmdlZFJlZnM7IiwiaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFRyYWNrIHdoZXRoZXIgYSBjb21wb25lbnQgaXMgY3VycmVudCBtb3VudGVkLiBHZW5lcmFsbHkgbGVzcyBwcmVmZXJhYmxlIHRoYW5cbiAqIHByb3BlcmxseSBjYW5jZWxpbmcgZWZmZWN0cyBzbyB0aGV5IGRvbid0IHJ1biBhZnRlciBhIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQsXG4gKiBidXQgaGVscGZ1bCBpbiBjYXNlcyB3aGVyZSB0aGF0IGlzbid0IGZlYXNpYmxlLCBzdWNoIGFzIGEgYFByb21pc2VgIHJlc29sdXRpb24uXG4gKlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgaXNNb3VudGVkIHN0YXRlIG9mIHRoZSBjb21wb25lbnRcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGUobnVsbClcbiAqIGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKVxuICpcbiAqIHVzZUVmZmVjdCgoKSA9PiB7XG4gKiAgIGZldGNoZGF0YSgpLnRoZW4oKG5ld0RhdGEpID0+IHtcbiAqICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gKiAgICAgICAgc2V0RGF0YShuZXdEYXRhKTtcbiAqICAgICAgfVxuICogICB9KVxuICogfSlcbiAqIGBgYFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG4gIHZhciBtb3VudGVkID0gdXNlUmVmKHRydWUpO1xuICB2YXIgaXNNb3VudGVkID0gdXNlUmVmKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbW91bnRlZC5jdXJyZW50O1xuICB9KTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gaXNNb3VudGVkLmN1cnJlbnQ7XG59IiwiaW1wb3J0IHsgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcbmltcG9ydCB1c2VXaWxsVW5tb3VudCBmcm9tICcuL3VzZVdpbGxVbm1vdW50Jztcbi8qXG4gKiBCcm93c2VycyBpbmNsdWRpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIENocm9tZSwgU2FmYXJpLCBhbmQgRmlyZWZveCBzdG9yZSB0aGVcbiAqIGRlbGF5IGFzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGludGVybmFsbHkuIFRoaXMgY2F1c2VzIGFuIGludGVnZXIgb3ZlcmZsb3dcbiAqIHdoZW4gdXNpbmcgZGVsYXlzIGxhcmdlciB0aGFuIDIsMTQ3LDQ4Myw2NDcgbXMgKGFib3V0IDI0LjggZGF5cyksXG4gKiByZXN1bHRpbmcgaW4gdGhlIHRpbWVvdXQgYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXG4gKlxuICogdmlhOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZS9zZXRUaW1lb3V0XG4gKi9cblxudmFyIE1BWF9ERUxBWV9NUyA9IE1hdGgucG93KDIsIDMxKSAtIDE7XG5cbmZ1bmN0aW9uIHNldENoYWluZWRUaW1lb3V0KGhhbmRsZVJlZiwgZm4sIHRpbWVvdXRBdE1zKSB7XG4gIHZhciBkZWxheU1zID0gdGltZW91dEF0TXMgLSBEYXRlLm5vdygpO1xuICBoYW5kbGVSZWYuY3VycmVudCA9IGRlbGF5TXMgPD0gTUFYX0RFTEFZX01TID8gc2V0VGltZW91dChmbiwgZGVsYXlNcykgOiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2V0Q2hhaW5lZFRpbWVvdXQoaGFuZGxlUmVmLCBmbiwgdGltZW91dEF0TXMpO1xuICB9LCBNQVhfREVMQVlfTVMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlciBvYmplY3QgZm9yIHNldHRpbmcgYSB0aW1lb3V0IHRoYXQgaXMgcHJvcGVybHkgY2xlYW5lZCB1cFxuICogb25jZSB0aGUgY29tcG9uZW50IHVubW91bnRzLiBOZXcgdGltZW91dHMgY2FuY2VsIGFuZCByZXBsYWNlIGV4aXN0aW5nIG9uZXMuXG4gKlxuICpcbiAqXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc2V0LCBjbGVhciB9ID0gdXNlVGltZW91dCgpO1xuICogY29uc3QgW2hlbGxvLCBzaG93SGVsbG9dID0gdXNlU3RhdGUoZmFsc2UpO1xuICogLy9EaXNwbGF5IGhlbGxvIGFmdGVyIDUgc2Vjb25kc1xuICogc2V0KCgpID0+IHNob3dIZWxsbyh0cnVlKSwgNTAwMCk7XG4gKiByZXR1cm4gKFxuICogICA8ZGl2IGNsYXNzTmFtZT1cIkFwcFwiPlxuICogICAgIHtoZWxsbyA/IDxoMz5IZWxsbzwvaDM+IDogbnVsbH1cbiAqICAgPC9kaXY+XG4gKiApO1xuICogYGBgXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUaW1lb3V0KCkge1xuICB2YXIgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpOyAvLyB0eXBlcyBhcmUgY29uZnVzZWQgYmV0d2VlbiBub2RlIGFuZCB3ZWIgaGVyZSBJREtcblxuICB2YXIgaGFuZGxlUmVmID0gdXNlUmVmKCk7XG4gIHVzZVdpbGxVbm1vdW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGhhbmRsZVJlZi5jdXJyZW50KTtcbiAgfSk7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoaGFuZGxlUmVmLmN1cnJlbnQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzZXQoZm4sIGRlbGF5TXMpIHtcbiAgICAgIGlmIChkZWxheU1zID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVsYXlNcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNNb3VudGVkKCkpIHJldHVybjtcbiAgICAgIGNsZWFyKCk7XG5cbiAgICAgIGlmIChkZWxheU1zIDw9IE1BWF9ERUxBWV9NUykge1xuICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgaWYgdGhlIHRpbWVvdXQgaXMgc2hvcnQsIGp1c3Qgc2V0IGEgbm9ybWFsIHRpbWVvdXQuXG4gICAgICAgIGhhbmRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmbiwgZGVsYXlNcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDaGFpbmVkVGltZW91dChoYW5kbGVSZWYsIGZuLCBEYXRlLm5vdygpICsgZGVsYXlNcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldDogc2V0LFxuICAgICAgY2xlYXI6IGNsZWFyXG4gICAgfTtcbiAgfSwgW10pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSdW5zIGFuIGVmZmVjdCBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQsIHNraXBwaW5nIHRoZVxuICogaW5pdGlhbCBcIm9uIG1vdW50XCIgcnVuLiBDYXV0aW9uLCBpZiB0aGUgZGVwZW5kZW5jeSBsaXN0IG5ldmVyIGNoYW5nZXMsXG4gKiB0aGUgZWZmZWN0IGlzICoqbmV2ZXIgcnVuKipcbiAqXG4gKiBgYGB0c1xuICogIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MSW5wdXQ+KG51bGwpO1xuICpcbiAqICAvLyBmb2N1c2VzIGFuIGVsZW1lbnQgb25seSBpZiB0aGUgZm9jdXMgY2hhbmdlcywgYW5kIG5vdCBvbiBtb3VudFxuICogIHVzZVVwZGF0ZUVmZmVjdCgoKSA9PiB7XG4gKiAgICBjb25zdCBlbGVtZW50ID0gcmVmLmN1cnJlbnQ/LmNoaWxkcmVuW2ZvY3VzZWRJZHhdIGFzIEhUTUxFbGVtZW50XG4gKlxuICogICAgZWxlbWVudD8uZm9jdXMoKVxuICpcbiAqICB9LCBbZm9jdXNlZEluZGV4XSlcbiAqIGBgYFxuICogQHBhcmFtIGVmZmVjdCBBbiBlZmZlY3QgdG8gcnVuIG9uIG1vdW50XG4gKlxuICogQGNhdGVnb3J5IGVmZmVjdHNcbiAqL1xuXG5mdW5jdGlvbiB1c2VVcGRhdGVFZmZlY3QoZm4sIGRlcHMpIHtcbiAgdmFyIGlzRmlyc3QgPSB1c2VSZWYodHJ1ZSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRmlyc3QuY3VycmVudCkge1xuICAgICAgaXNGaXJzdC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH0sIGRlcHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VVcGRhdGVFZmZlY3Q7IiwiaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBSZXR1cm5zIGEgcmVmIHRoYXQgaXMgaW1tZWRpYXRlbHkgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWVcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIFJlZiB2YWx1ZVxuICogQGNhdGVnb3J5IHJlZnNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVcGRhdGVkUmVmKHZhbHVlKSB7XG4gIHZhciB2YWx1ZVJlZiA9IHVzZVJlZih2YWx1ZSk7XG4gIHZhbHVlUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlUmVmO1xufSIsImltcG9ydCB1c2VVcGRhdGVkUmVmIGZyb20gJy4vdXNlVXBkYXRlZFJlZic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEF0dGFjaCBhIGNhbGxiYWNrIHRoYXQgZmlyZXMgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50c1xuICpcbiAqIEBwYXJhbSBmbiBIYW5kbGVyIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAqIEBjYXRlZ29yeSBlZmZlY3RzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV2lsbFVubW91bnQoZm4pIHtcbiAgdmFyIG9uVW5tb3VudCA9IHVzZVVwZGF0ZWRSZWYoZm4pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25Vbm1vdW50LmN1cnJlbnQoKTtcbiAgICB9O1xuICB9LCBbXSk7XG59IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wib25LZXlEb3duXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9hbmNob3ItaGFzLWNvbnRlbnQgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUV2ZW50Q2FsbGJhY2sgfSBmcm9tICdAcmVzdGFydC9ob29rcyc7XG5pbXBvcnQgeyB1c2VCdXR0b25Qcm9wcyB9IGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNUcml2aWFsSHJlZihocmVmKSB7XG4gIHJldHVybiAhaHJlZiB8fCBocmVmLnRyaW0oKSA9PT0gJyMnO1xufVxuXG4vKipcbiAqIEFuIGdlbmVyaWMgYDxhPmAgY29tcG9uZW50IHRoYXQgY292ZXJzIGEgZmV3IEExMXkgY2FzZXMsIGVuc3VyaW5nIHRoYXRcbiAqIGNhc2VzIHdoZXJlIHRoZSBgaHJlZmAgaXMgbWlzc2luZyBvciB0cml2aWFsIGxpa2UgXCIjXCIgYXJlIHRyZWF0ZWQgbGlrZSBidXR0b25zLlxuICovXG5jb25zdCBBbmNob3IgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgb25LZXlEb3duXG4gIH0gPSBfcmVmLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IFtidXR0b25Qcm9wc10gPSB1c2VCdXR0b25Qcm9wcyhPYmplY3QuYXNzaWduKHtcbiAgICB0YWdOYW1lOiAnYSdcbiAgfSwgcHJvcHMpKTtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgYnV0dG9uUHJvcHMub25LZXlEb3duKGUpO1xuICAgIG9uS2V5RG93biA9PSBudWxsID8gdm9pZCAwIDogb25LZXlEb3duKGUpO1xuICB9KTtcblxuICBpZiAoaXNUcml2aWFsSHJlZihwcm9wcy5ocmVmKSAmJiAhcHJvcHMucm9sZSB8fCBwcm9wcy5yb2xlID09PSAnYnV0dG9uJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImFcIiwgT2JqZWN0LmFzc2lnbih7XG4gICAgICByZWY6IHJlZlxuICAgIH0sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiYVwiLCBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHJlZlxuICB9LCBwcm9wcywge1xuICAgIG9uS2V5RG93bjogb25LZXlEb3duXG4gIH0pKTtcbn0pO1xuQW5jaG9yLmRpc3BsYXlOYW1lID0gJ0FuY2hvcic7XG5leHBvcnQgZGVmYXVsdCBBbmNob3I7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJkaXNhYmxlZFwiXTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJpdmlhbEhyZWYoaHJlZikge1xuICByZXR1cm4gIWhyZWYgfHwgaHJlZi50cmltKCkgPT09ICcjJztcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VCdXR0b25Qcm9wcyh7XG4gIHRhZ05hbWUsXG4gIGRpc2FibGVkLFxuICBocmVmLFxuICB0YXJnZXQsXG4gIHJlbCxcbiAgb25DbGljayxcbiAgdGFiSW5kZXggPSAwLFxuICB0eXBlXG59KSB7XG4gIGlmICghdGFnTmFtZSkge1xuICAgIGlmIChocmVmICE9IG51bGwgfHwgdGFyZ2V0ICE9IG51bGwgfHwgcmVsICE9IG51bGwpIHtcbiAgICAgIHRhZ05hbWUgPSAnYSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZ05hbWUgPSAnYnV0dG9uJztcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXRhID0ge1xuICAgIHRhZ05hbWVcbiAgfTtcblxuICBpZiAodGFnTmFtZSA9PT0gJ2J1dHRvbicpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHR5cGU6IHR5cGUgfHwgJ2J1dHRvbicsXG4gICAgICBkaXNhYmxlZFxuICAgIH0sIG1ldGFdO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSBldmVudCA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8IHRhZ05hbWUgPT09ICdhJyAmJiBpc1RyaXZpYWxIcmVmKGhyZWYpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25DbGljayA9PSBudWxsID8gdm9pZCAwIDogb25DbGljayhldmVudCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBoYW5kbGVDbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBbe1xuICAgIHJvbGU6ICdidXR0b24nLFxuICAgIC8vIGV4cGxpY2l0bHkgdW5kZWZpbmVkIHNvIHRoYXQgaXQgb3ZlcnJpZGVzIHRoZSBwcm9wcyBkaXNhYmxlZCBpbiBhIHNwcmVhZFxuICAgIC8vIGUuZy4gPFRhZyB7Li4ucHJvcHN9IHsuLi5ob29rUHJvcHN9IC8+XG4gICAgZGlzYWJsZWQ6IHVuZGVmaW5lZCxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyB1bmRlZmluZWQgOiB0YWJJbmRleCxcbiAgICBocmVmOiB0YWdOYW1lID09PSAnYScgJiYgZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBocmVmLFxuICAgIHRhcmdldDogdGFnTmFtZSA9PT0gJ2EnID8gdGFyZ2V0IDogdW5kZWZpbmVkLFxuICAgICdhcmlhLWRpc2FibGVkJzogIWRpc2FibGVkID8gdW5kZWZpbmVkIDogZGlzYWJsZWQsXG4gICAgcmVsOiB0YWdOYW1lID09PSAnYScgPyByZWwgOiB1bmRlZmluZWQsXG4gICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duXG4gIH0sIG1ldGFdO1xufVxuY29uc3QgQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIGFzOiBhc1Byb3AsXG4gICAgZGlzYWJsZWRcbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZTogQ29tcG9uZW50XG4gIH1dID0gdXNlQnV0dG9uUHJvcHMoT2JqZWN0LmFzc2lnbih7XG4gICAgdGFnTmFtZTogYXNQcm9wLFxuICAgIGRpc2FibGVkXG4gIH0sIHByb3BzKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0pKTtcbn0pO1xuQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0J1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwiZXhwb3J0IGNvbnN0IEFUVFJJQlVURV9QUkVGSVggPSBgZGF0YS1yci11aS1gO1xuZXhwb3J0IGNvbnN0IFBST1BFUlRZX1BSRUZJWCA9IGByclVpYDtcbmV4cG9ydCBmdW5jdGlvbiBkYXRhQXR0cihwcm9wZXJ0eSkge1xuICByZXR1cm4gYCR7QVRUUklCVVRFX1BSRUZJWH0ke3Byb3BlcnR5fWA7XG59XG5leHBvcnQgZnVuY3Rpb24gZGF0YVByb3AocHJvcGVydHkpIHtcbiAgcmV0dXJuIGAke1BST1BFUlRZX1BSRUZJWH0ke3Byb3BlcnR5fWA7XG59IiwiaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCBhZGRFdmVudExpc3RlbmVyIGZyb20gJ2RvbS1oZWxwZXJzL2FkZEV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VQcmV2aW91cyc7XG5pbXBvcnQgdXNlRm9yY2VVcGRhdGUgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRm9yY2VVcGRhdGUnO1xuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRMaXN0ZW5lcic7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IERyb3Bkb3duTWVudSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgRHJvcGRvd25Ub2dnbGUsIHsgaXNSb2xlTWVudSB9IGZyb20gJy4vRHJvcGRvd25Ub2dnbGUnO1xuaW1wb3J0IERyb3Bkb3duSXRlbSBmcm9tICcuL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQgZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBkYXRhQXR0ciB9IGZyb20gJy4vRGF0YUtleSc7XG5pbXBvcnQgdXNlV2luZG93IGZyb20gJy4vdXNlV2luZG93JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbmZ1bmN0aW9uIHVzZVJlZldpdGhVcGRhdGUoKSB7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgcmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBhdHRhY2hSZWYgPSB1c2VDYWxsYmFjayhlbGVtZW50ID0+IHtcbiAgICByZWYuY3VycmVudCA9IGVsZW1lbnQ7IC8vIGVuc3VyZSB0aGF0IGEgbWVudSBzZXQgdHJpZ2dlcnMgYW4gdXBkYXRlIGZvciBjb25zdW1lcnNcblxuICAgIGZvcmNlVXBkYXRlKCk7XG4gIH0sIFtmb3JjZVVwZGF0ZV0pO1xuICByZXR1cm4gW3JlZiwgYXR0YWNoUmVmXTtcbn1cbi8qKlxuICogQGRpc3BsYXlOYW1lIERyb3Bkb3duXG4gKiBAcHVibGljXG4gKi9cblxuXG5mdW5jdGlvbiBEcm9wZG93bih7XG4gIGRlZmF1bHRTaG93LFxuICBzaG93OiByYXdTaG93LFxuICBvblNlbGVjdCxcbiAgb25Ub2dnbGU6IHJhd09uVG9nZ2xlLFxuICBpdGVtU2VsZWN0b3IgPSBgKiBbJHtkYXRhQXR0cignZHJvcGRvd24taXRlbScpfV1gLFxuICBmb2N1c0ZpcnN0SXRlbU9uU2hvdyxcbiAgcGxhY2VtZW50ID0gJ2JvdHRvbS1zdGFydCcsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHdpbmRvdyA9IHVzZVdpbmRvdygpO1xuICBjb25zdCBbc2hvdywgb25Ub2dnbGVdID0gdXNlVW5jb250cm9sbGVkUHJvcChyYXdTaG93LCBkZWZhdWx0U2hvdywgcmF3T25Ub2dnbGUpOyAvLyBXZSB1c2Ugbm9ybWFsIHJlZnMgaW5zdGVhZCBvZiB1c2VDYWxsYmFja1JlZiBpbiBvcmRlciB0byBwb3B1bGF0ZSB0aGVcbiAgLy8gdGhlIHZhbHVlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgZWZmZWN0IHRvIGZvY3VzIHRoZSBlbGVtZW50XG4gIC8vIG1heSBydW4gYmVmb3JlIHRoZSBzdGF0ZSB2YWx1ZSBpcyBzZXRcblxuICBjb25zdCBbbWVudVJlZiwgc2V0TWVudV0gPSB1c2VSZWZXaXRoVXBkYXRlKCk7XG4gIGNvbnN0IG1lbnVFbGVtZW50ID0gbWVudVJlZi5jdXJyZW50O1xuICBjb25zdCBbdG9nZ2xlUmVmLCBzZXRUb2dnbGVdID0gdXNlUmVmV2l0aFVwZGF0ZSgpO1xuICBjb25zdCB0b2dnbGVFbGVtZW50ID0gdG9nZ2xlUmVmLmN1cnJlbnQ7XG4gIGNvbnN0IGxhc3RTaG93ID0gdXNlUHJldmlvdXMoc2hvdyk7XG4gIGNvbnN0IGxhc3RTb3VyY2VFdmVudCA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZm9jdXNJbkRyb3Bkb3duID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qgb25TZWxlY3RDdHggPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdG9nZ2xlID0gdXNlQ2FsbGJhY2soKG5leHRTaG93LCBldmVudCwgc291cmNlID0gZXZlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGV2ZW50LnR5cGUpID0+IHtcbiAgICBvblRvZ2dsZShuZXh0U2hvdywge1xuICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgfSwgW29uVG9nZ2xlXSk7XG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUV2ZW50Q2FsbGJhY2soKGtleSwgZXZlbnQpID0+IHtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3Qoa2V5LCBldmVudCk7XG4gICAgdG9nZ2xlKGZhbHNlLCBldmVudCwgJ3NlbGVjdCcpO1xuXG4gICAgaWYgKCFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICBvblNlbGVjdEN0eCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3RDdHgoa2V5LCBldmVudCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICB0b2dnbGUsXG4gICAgcGxhY2VtZW50LFxuICAgIHNob3csXG4gICAgbWVudUVsZW1lbnQsXG4gICAgdG9nZ2xlRWxlbWVudCxcbiAgICBzZXRNZW51LFxuICAgIHNldFRvZ2dsZVxuICB9KSwgW3RvZ2dsZSwgcGxhY2VtZW50LCBzaG93LCBtZW51RWxlbWVudCwgdG9nZ2xlRWxlbWVudCwgc2V0TWVudSwgc2V0VG9nZ2xlXSk7XG5cbiAgaWYgKG1lbnVFbGVtZW50ICYmIGxhc3RTaG93ICYmICFzaG93KSB7XG4gICAgZm9jdXNJbkRyb3Bkb3duLmN1cnJlbnQgPSBtZW51RWxlbWVudC5jb250YWlucyhtZW51RWxlbWVudC5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgY29uc3QgZm9jdXNUb2dnbGUgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodG9nZ2xlRWxlbWVudCAmJiB0b2dnbGVFbGVtZW50LmZvY3VzKSB7XG4gICAgICB0b2dnbGVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbWF5YmVGb2N1c0ZpcnN0ID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGxhc3RTb3VyY2VFdmVudC5jdXJyZW50O1xuICAgIGxldCBmb2N1c1R5cGUgPSBmb2N1c0ZpcnN0SXRlbU9uU2hvdztcblxuICAgIGlmIChmb2N1c1R5cGUgPT0gbnVsbCkge1xuICAgICAgZm9jdXNUeXBlID0gbWVudVJlZi5jdXJyZW50ICYmIGlzUm9sZU1lbnUobWVudVJlZi5jdXJyZW50KSA/ICdrZXlib2FyZCcgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXNUeXBlID09PSBmYWxzZSB8fCBmb2N1c1R5cGUgPT09ICdrZXlib2FyZCcgJiYgIS9ea2V5LiskLy50ZXN0KHR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3QgPSBxc2EobWVudVJlZi5jdXJyZW50LCBpdGVtU2VsZWN0b3IpWzBdO1xuICAgIGlmIChmaXJzdCAmJiBmaXJzdC5mb2N1cykgZmlyc3QuZm9jdXMoKTtcbiAgfSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3cpIG1heWJlRm9jdXNGaXJzdCgpO2Vsc2UgaWYgKGZvY3VzSW5Ecm9wZG93bi5jdXJyZW50KSB7XG4gICAgICBmb2N1c0luRHJvcGRvd24uY3VycmVudCA9IGZhbHNlO1xuICAgICAgZm9jdXNUb2dnbGUoKTtcbiAgICB9IC8vIG9ubHkgYHNob3dgIHNob3VsZCBiZSBjaGFuZ2luZ1xuICB9LCBbc2hvdywgZm9jdXNJbkRyb3Bkb3duLCBmb2N1c1RvZ2dsZSwgbWF5YmVGb2N1c0ZpcnN0XSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGFzdFNvdXJjZUV2ZW50LmN1cnJlbnQgPSBudWxsO1xuICB9KTtcblxuICBjb25zdCBnZXROZXh0Rm9jdXNlZENoaWxkID0gKGN1cnJlbnQsIG9mZnNldCkgPT4ge1xuICAgIGlmICghbWVudVJlZi5jdXJyZW50KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpdGVtcyA9IHFzYShtZW51UmVmLmN1cnJlbnQsIGl0ZW1TZWxlY3Rvcik7XG4gICAgbGV0IGluZGV4ID0gaXRlbXMuaW5kZXhPZihjdXJyZW50KSArIG9mZnNldDtcbiAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBpdGVtcy5sZW5ndGgpKTtcbiAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICB9O1xuXG4gIHVzZUV2ZW50TGlzdGVuZXIodXNlQ2FsbGJhY2soKCkgPT4gd2luZG93LmRvY3VtZW50LCBbd2luZG93XSksICdrZXlkb3duJywgZXZlbnQgPT4ge1xuICAgIHZhciBfbWVudVJlZiRjdXJyZW50LCBfdG9nZ2xlUmVmJGN1cnJlbnQ7XG5cbiAgICBjb25zdCB7XG4gICAgICBrZXlcbiAgICB9ID0gZXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IGZyb21NZW51ID0gKF9tZW51UmVmJGN1cnJlbnQgPSBtZW51UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWVudVJlZiRjdXJyZW50LmNvbnRhaW5zKHRhcmdldCk7XG4gICAgY29uc3QgZnJvbVRvZ2dsZSA9IChfdG9nZ2xlUmVmJGN1cnJlbnQgPSB0b2dnbGVSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2dnbGVSZWYkY3VycmVudC5jb250YWlucyh0YXJnZXQpOyAvLyBTZWNvbmQgb25seSB0byBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi84Y2ZiZjY5MzNiOGEwMTQ2YWMzZmJjMzY5ZjE5ZTUyMGJkMWViZGFjL2pzL3NyYy9kcm9wZG93bi5qcyNMNDAwXG4gICAgLy8gaW4gaW5zY3J1dGFiaWxpdHlcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHRhcmdldC50YWdOYW1lKTtcblxuICAgIGlmIChpc0lucHV0ICYmIChrZXkgPT09ICcgJyB8fCBrZXkgIT09ICdFc2NhcGUnICYmIGZyb21NZW51KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZnJvbU1lbnUgJiYgIWZyb21Ub2dnbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnVGFiJyAmJiAoIW1lbnVSZWYuY3VycmVudCB8fCAhc2hvdykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsYXN0U291cmNlRXZlbnQuY3VycmVudCA9IGV2ZW50LnR5cGU7XG4gICAgY29uc3QgbWV0YSA9IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxuICAgICAgc291cmNlOiBldmVudC50eXBlXG4gICAgfTtcblxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0Rm9jdXNlZENoaWxkKHRhcmdldCwgLTEpO1xuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQuZm9jdXMpIG5leHQuZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICghc2hvdykge1xuICAgICAgICAgIG9uVG9nZ2xlKHRydWUsIG1ldGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBnZXROZXh0Rm9jdXNlZENoaWxkKHRhcmdldCwgMSk7XG4gICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5mb2N1cykgbmV4dC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICAvLyBvbiBrZXlkb3duIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgYmVpbmcgdGFiYmVkIEZST00sIHdlIG5lZWQgdGhhdFxuICAgICAgICAvLyB0byBrbm93IGlmIHRoaXMgZXZlbnQgaXMgcmVsZXZhbnQgdG8gdGhpcyBkcm9wZG93biAoZS5nLiBpbiB0aGlzIG1lbnUpLlxuICAgICAgICAvLyBPbiBga2V5dXBgIHRoZSB0YXJnZXQgaXMgdGhlIGVsZW1lbnQgYmVpbmcgdGFnZ2VkIFRPIHdoaWNoIHdlIHVzZSB0byBjaGVja1xuICAgICAgICAvLyBpZiBmb2N1cyBoYXMgbGVmdCB0aGUgbWVudVxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKHRhcmdldC5vd25lckRvY3VtZW50LCAna2V5dXAnLCBlID0+IHtcbiAgICAgICAgICB2YXIgX21lbnVSZWYkY3VycmVudDI7XG5cbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdUYWInICYmICFlLnRhcmdldCB8fCAhKChfbWVudVJlZiRjdXJyZW50MiA9IG1lbnVSZWYuY3VycmVudCkgIT0gbnVsbCAmJiBfbWVudVJlZiRjdXJyZW50Mi5jb250YWlucyhlLnRhcmdldCkpKSB7XG4gICAgICAgICAgICBvblRvZ2dsZShmYWxzZSwgbWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uVG9nZ2xlKGZhbHNlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGhhbmRsZVNlbGVjdCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRHJvcGRvd25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogY29udGV4dCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufVxuXG5Ecm9wZG93bi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bic7XG5Ecm9wZG93bi5NZW51ID0gRHJvcGRvd25NZW51O1xuRHJvcGRvd24uVG9nZ2xlID0gRHJvcGRvd25Ub2dnbGU7XG5Ecm9wZG93bi5JdGVtID0gRHJvcGRvd25JdGVtO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd247IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgRHJvcGRvd25Db250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkNvbnRleHQ7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZXZlbnRLZXlcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJhY3RpdmVcIiwgXCJhc1wiXTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQsIHsgbWFrZUV2ZW50S2V5IH0gZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgTmF2Q29udGV4dCBmcm9tICcuL05hdkNvbnRleHQnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgeyBkYXRhQXR0ciB9IGZyb20gJy4vRGF0YUtleSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIGRyb3Bkb3duIGl0ZW0uIFJldHVybnMgYSBzZXQgb2YgcHJvcHMgZm9yIHRoZSBkcm9wZG93biBpdGVtIGNvbXBvbmVudFxuICogaW5jbHVkaW5nIGFuIGBvbkNsaWNrYCBoYW5kbGVyIHRoYXQgcHJldmVudHMgc2VsZWN0aW9uIHdoZW4gdGhlIGl0ZW0gaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duSXRlbSh7XG4gIGtleSxcbiAgaHJlZixcbiAgYWN0aXZlLFxuICBkaXNhYmxlZCxcbiAgb25DbGlja1xufSkge1xuICBjb25zdCBvblNlbGVjdEN0eCA9IHVzZUNvbnRleHQoU2VsZWN0YWJsZUNvbnRleHQpO1xuICBjb25zdCBuYXZDb250ZXh0ID0gdXNlQ29udGV4dChOYXZDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUtleVxuICB9ID0gbmF2Q29udGV4dCB8fCB7fTtcbiAgY29uc3QgZXZlbnRLZXkgPSBtYWtlRXZlbnRLZXkoa2V5LCBocmVmKTtcbiAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG1ha2VFdmVudEtleShhY3RpdmVLZXkpID09PSBldmVudEtleSA6IGFjdGl2ZTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGV2ZW50KTtcblxuICAgIGlmIChvblNlbGVjdEN0eCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgb25TZWxlY3RDdHgoZXZlbnRLZXksIGV2ZW50KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW3tcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICAnYXJpYS1kaXNhYmxlZCc6IGRpc2FibGVkIHx8IHVuZGVmaW5lZCxcbiAgICAnYXJpYS1zZWxlY3RlZCc6IGlzQWN0aXZlLFxuICAgIFtkYXRhQXR0cignZHJvcGRvd24taXRlbScpXTogJydcbiAgfSwge1xuICAgIGlzQWN0aXZlXG4gIH1dO1xufVxuY29uc3QgRHJvcGRvd25JdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIGV2ZW50S2V5LFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2xpY2ssXG4gICAgYWN0aXZlLFxuICAgIGFzOiBDb21wb25lbnQgPSBCdXR0b25cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgW2Ryb3Bkb3duSXRlbVByb3BzXSA9IHVzZURyb3Bkb3duSXRlbSh7XG4gICAga2V5OiBldmVudEtleSxcbiAgICBocmVmOiBwcm9wcy5ocmVmLFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2xpY2ssXG4gICAgYWN0aXZlXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmXG4gIH0sIGRyb3Bkb3duSXRlbVByb3BzKSk7XG59KTtcbkRyb3Bkb3duSXRlbS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25JdGVtOyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZiBmcm9tICdAcmVzdGFydC9ob29rcy91c2VDYWxsYmFja1JlZic7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB1c2VQb3BwZXIgZnJvbSAnLi91c2VQb3BwZXInO1xuaW1wb3J0IHVzZVJvb3RDbG9zZSBmcm9tICcuL3VzZVJvb3RDbG9zZSc7XG5pbXBvcnQgbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZyBmcm9tICcuL21lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG4vKipcbiAqIEBtZW1iZXJPZiBEcm9wZG93blxuICogQHBhcmFtIHtvYmplY3R9ICBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZmxpcCBBdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgbWVudSBgZHJvcGAgcG9zaXRpb24gYmFzZWQgb24gdmlld3BvcnQgZWRnZSBkZXRlY3Rpb25cbiAqIEBwYXJhbSB7W251bWJlciwgbnVtYmVyXX0gb3B0aW9ucy5vZmZzZXQgRGVmaW5lIGFuIG9mZnNldCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBNZW51IGFuZCB0aGUgVG9nZ2xlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuc2hvdyBEaXNwbGF5IHRoZSBtZW51IG1hbnVhbGx5LCBpZ25vcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgYERyb3Bkb3duYFxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnVzZVBvcHBlciBvcHQgaW4vb3V0IG9mIHVzaW5nIFBvcHBlckpTIHRvIHBvc2l0aW9uIG1lbnVzLiBXaGVuIGRpc2FibGVkIHlvdSBtdXN0IHBvc2l0aW9uIGl0IHlvdXJzZWxmLlxuICogQHBhcmFtIHtzdHJpbmd9ICBvcHRpb25zLnJvb3RDbG9zZUV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IHRvIGxpc3RlbiBmb3Igd2hlbiBkZXRlcm1pbmluZyBcImNsaWNrcyBvdXRzaWRlXCIgdGhlIG1lbnUgZm9yIHRyaWdnZXJpbmcgYSBjbG9zZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgb3B0aW9ucy5wb3BwZXJDb25maWcgT3B0aW9ucyBwYXNzZWQgdG8gdGhlIFtgdXNlUG9wcGVyYF0oL2FwaS91c2VQb3BwZXIpIGhvb2suXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcGRvd25NZW51KG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChEcm9wZG93bkNvbnRleHQpO1xuICBjb25zdCBbYXJyb3dFbGVtZW50LCBhdHRhY2hBcnJvd1JlZl0gPSB1c2VDYWxsYmFja1JlZigpO1xuICBjb25zdCBoYXNTaG93blJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHtcbiAgICBmbGlwLFxuICAgIG9mZnNldCxcbiAgICByb290Q2xvc2VFdmVudCxcbiAgICBmaXhlZCA9IGZhbHNlLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50T3ZlcnJpZGUsXG4gICAgcG9wcGVyQ29uZmlnID0ge30sXG4gICAgZW5hYmxlRXZlbnRMaXN0ZW5lcnMgPSB0cnVlLFxuICAgIHVzZVBvcHBlcjogc2hvdWxkVXNlUG9wcGVyID0gISFjb250ZXh0XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzaG93ID0gKGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQuc2hvdykgPT0gbnVsbCA/ICEhb3B0aW9ucy5zaG93IDogY29udGV4dC5zaG93O1xuXG4gIGlmIChzaG93ICYmICFoYXNTaG93blJlZi5jdXJyZW50KSB7XG4gICAgaGFzU2hvd25SZWYuY3VycmVudCA9IHRydWU7XG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZSA9IGUgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQudG9nZ2xlKGZhbHNlLCBlKTtcbiAgfTtcblxuICBjb25zdCB7XG4gICAgcGxhY2VtZW50LFxuICAgIHNldE1lbnUsXG4gICAgbWVudUVsZW1lbnQsXG4gICAgdG9nZ2xlRWxlbWVudFxuICB9ID0gY29udGV4dCB8fCB7fTtcbiAgY29uc3QgcG9wcGVyID0gdXNlUG9wcGVyKHRvZ2dsZUVsZW1lbnQsIG1lbnVFbGVtZW50LCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnKHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudE92ZXJyaWRlIHx8IHBsYWNlbWVudCB8fCAnYm90dG9tLXN0YXJ0JyxcbiAgICBlbmFibGVkOiBzaG91bGRVc2VQb3BwZXIsXG4gICAgZW5hYmxlRXZlbnRzOiBlbmFibGVFdmVudExpc3RlbmVycyA9PSBudWxsID8gc2hvdyA6IGVuYWJsZUV2ZW50TGlzdGVuZXJzLFxuICAgIG9mZnNldCxcbiAgICBmbGlwLFxuICAgIGZpeGVkLFxuICAgIGFycm93RWxlbWVudCxcbiAgICBwb3BwZXJDb25maWdcbiAgfSkpO1xuICBjb25zdCBtZW51UHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZWY6IHNldE1lbnUgfHwgbm9vcCxcbiAgICAnYXJpYS1sYWJlbGxlZGJ5JzogdG9nZ2xlRWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogdG9nZ2xlRWxlbWVudC5pZFxuICB9LCBwb3BwZXIuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5wb3BwZXJcbiAgfSk7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIHNob3csXG4gICAgcGxhY2VtZW50LFxuICAgIGhhc1Nob3duOiBoYXNTaG93blJlZi5jdXJyZW50LFxuICAgIHRvZ2dsZTogY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC50b2dnbGUsXG4gICAgcG9wcGVyOiBzaG91bGRVc2VQb3BwZXIgPyBwb3BwZXIgOiBudWxsLFxuICAgIGFycm93UHJvcHM6IHNob3VsZFVzZVBvcHBlciA/IE9iamVjdC5hc3NpZ24oe1xuICAgICAgcmVmOiBhdHRhY2hBcnJvd1JlZlxuICAgIH0sIHBvcHBlci5hdHRyaWJ1dGVzLmFycm93LCB7XG4gICAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5hcnJvd1xuICAgIH0pIDoge31cbiAgfTtcbiAgdXNlUm9vdENsb3NlKG1lbnVFbGVtZW50LCBoYW5kbGVDbG9zZSwge1xuICAgIGNsaWNrVHJpZ2dlcjogcm9vdENsb3NlRXZlbnQsXG4gICAgZGlzYWJsZWQ6ICFzaG93XG4gIH0pO1xuICByZXR1cm4gW21lbnVQcm9wcywgbWV0YWRhdGFdO1xufVxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB1c2VQb3BwZXI6IHRydWVcbn07XG5cbi8qKlxuICogQWxzbyBleHBvcnRlZCBhcyBgPERyb3Bkb3duLk1lbnU+YCBmcm9tIGBEcm9wZG93bmAuXG4gKlxuICogQGRpc3BsYXlOYW1lIERyb3Bkb3duTWVudVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duTWVudShfcmVmKSB7XG4gIGxldCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBbcHJvcHMsIG1ldGFdID0gdXNlRHJvcGRvd25NZW51KG9wdGlvbnMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IGNoaWxkcmVuKHByb3BzLCBtZXRhKVxuICB9KTtcbn1cblxuRHJvcGRvd25NZW51LmRpc3BsYXlOYW1lID0gJ0Ryb3Bkb3duTWVudSc7XG5Ecm9wZG93bk1lbnUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuLyoqIEBjb21wb25lbnQgKi9cblxuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25NZW51OyIsImltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU1NSU2FmZUlkIH0gZnJvbSAnLi9zc3InO1xuaW1wb3J0IERyb3Bkb3duQ29udGV4dCBmcm9tICcuL0Ryb3Bkb3duQ29udGV4dCc7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgY29uc3QgaXNSb2xlTWVudSA9IGVsID0+IHtcbiAgdmFyIF9lbCRnZXRBdHRyaWJ1dGU7XG5cbiAgcmV0dXJuICgoX2VsJGdldEF0dHJpYnV0ZSA9IGVsLmdldEF0dHJpYnV0ZSgncm9sZScpKSA9PSBudWxsID8gdm9pZCAwIDogX2VsJGdldEF0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpKSA9PT0gJ21lbnUnO1xufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuLyoqXG4gKiBXaXJlcyB1cCBEcm9wZG93biB0b2dnbGUgZnVuY3Rpb25hbGl0eSwgcmV0dXJuaW5nIGEgc2V0IGEgcHJvcHMgdG8gYXR0YWNoXG4gKiB0byB0aGUgZWxlbWVudCB0aGF0IGZ1bmN0aW9ucyBhcyB0aGUgZHJvcGRvd24gdG9nZ2xlIChnZW5lcmFsbHkgYSBidXR0b24pLlxuICpcbiAqIEBtZW1iZXJPZiBEcm9wZG93blxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duVG9nZ2xlKCkge1xuICBjb25zdCBpZCA9IHVzZVNTUlNhZmVJZCgpO1xuICBjb25zdCB7XG4gICAgc2hvdyA9IGZhbHNlLFxuICAgIHRvZ2dsZSA9IG5vb3AsXG4gICAgc2V0VG9nZ2xlLFxuICAgIG1lbnVFbGVtZW50XG4gIH0gPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgdG9nZ2xlKCFzaG93LCBlKTtcbiAgfSwgW3Nob3csIHRvZ2dsZV0pO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBpZCxcbiAgICByZWY6IHNldFRvZ2dsZSB8fCBub29wLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICdhcmlhLWV4cGFuZGVkJzogISFzaG93XG4gIH07IC8vIFRoaXMgaXMgbWF5YmUgYmV0dGVyIGRvd24gaW4gYW4gZWZmZWN0LCBidXRcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyBnb2luZyB0byB1cGRhdGUgYW55d2F5IHdoZW4gdGhlIG1lbnUgZWxlbWVudFxuICAvLyBpcyBzZXQgc28gbWlnaHQgcmV0dXJuIG5ldyBwcm9wcy5cblxuICBpZiAobWVudUVsZW1lbnQgJiYgaXNSb2xlTWVudShtZW51RWxlbWVudCkpIHtcbiAgICBwcm9wc1snYXJpYS1oYXNwb3B1cCddID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBbcHJvcHMsIHtcbiAgICBzaG93LFxuICAgIHRvZ2dsZVxuICB9XTtcbn1cblxuLyoqXG4gKiBBbHNvIGV4cG9ydGVkIGFzIGA8RHJvcGRvd24uVG9nZ2xlPmAgZnJvbSBgRHJvcGRvd25gLlxuICpcbiAqIEBkaXNwbGF5TmFtZSBEcm9wZG93blRvZ2dsZVxuICogQG1lbWJlck9mIERyb3Bkb3duXG4gKi9cbmZ1bmN0aW9uIERyb3Bkb3duVG9nZ2xlKHtcbiAgY2hpbGRyZW5cbn0pIHtcbiAgY29uc3QgW3Byb3BzLCBtZXRhXSA9IHVzZURyb3Bkb3duVG9nZ2xlKCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4ocHJvcHMsIG1ldGEpXG4gIH0pO1xufVxuXG5Ecm9wZG93blRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93blRvZ2dsZSc7XG4vKiogQGNvbXBvbmVudCAqL1xuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blRvZ2dsZTsiLCJjb25zdCBfZXhjbHVkZWQgPSBbXCJzaG93XCIsIFwicm9sZVwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJiYWNrZHJvcFwiLCBcImtleWJvYXJkXCIsIFwib25CYWNrZHJvcENsaWNrXCIsIFwib25Fc2NhcGVLZXlEb3duXCIsIFwidHJhbnNpdGlvblwiLCBcImJhY2tkcm9wVHJhbnNpdGlvblwiLCBcImF1dG9Gb2N1c1wiLCBcImVuZm9yY2VGb2N1c1wiLCBcInJlc3RvcmVGb2N1c1wiLCBcInJlc3RvcmVGb2N1c09wdGlvbnNcIiwgXCJyZW5kZXJEaWFsb2dcIiwgXCJyZW5kZXJCYWNrZHJvcFwiLCBcIm1hbmFnZXJcIiwgXCJjb250YWluZXJcIiwgXCJvblNob3dcIiwgXCJvbkhpZGVcIiwgXCJvbkV4aXRcIiwgXCJvbkV4aXRlZFwiLCBcIm9uRXhpdGluZ1wiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FbnRlcmVkXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSwgcmVhY3QvcHJvcC10eXBlcyAqL1xuaW1wb3J0IGFjdGl2ZUVsZW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvYWN0aXZlRWxlbWVudCc7XG5pbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0IGNhblVzZURPTSBmcm9tICdkb20taGVscGVycy9jYW5Vc2VET00nO1xuaW1wb3J0IGxpc3RlbiBmcm9tICdkb20taGVscGVycy9saXN0ZW4nO1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZUltcGVyYXRpdmVIYW5kbGUsIGZvcndhcmRSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTW91bnRlZCc7XG5pbXBvcnQgdXNlV2lsbFVubW91bnQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlV2lsbFVubW91bnQnO1xuaW1wb3J0IHVzZVByZXZpb3VzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVByZXZpb3VzJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IE1vZGFsTWFuYWdlciBmcm9tICcuL01vZGFsTWFuYWdlcic7XG5pbXBvcnQgdXNlV2FpdEZvckRPTVJlZiBmcm9tICcuL3VzZVdhaXRGb3JET01SZWYnO1xuaW1wb3J0IHVzZVdpbmRvdyBmcm9tICcuL3VzZVdpbmRvdyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5sZXQgbWFuYWdlcjtcblxuZnVuY3Rpb24gZ2V0TWFuYWdlcih3aW5kb3cpIHtcbiAgaWYgKCFtYW5hZ2VyKSBtYW5hZ2VyID0gbmV3IE1vZGFsTWFuYWdlcih7XG4gICAgb3duZXJEb2N1bWVudDogd2luZG93ID09IG51bGwgPyB2b2lkIDAgOiB3aW5kb3cuZG9jdW1lbnRcbiAgfSk7XG4gIHJldHVybiBtYW5hZ2VyO1xufVxuXG5mdW5jdGlvbiB1c2VNb2RhbE1hbmFnZXIocHJvdmlkZWQpIHtcbiAgY29uc3Qgd2luZG93ID0gdXNlV2luZG93KCk7XG4gIGNvbnN0IG1vZGFsTWFuYWdlciA9IHByb3ZpZGVkIHx8IGdldE1hbmFnZXIod2luZG93KTtcbiAgY29uc3QgbW9kYWwgPSB1c2VSZWYoe1xuICAgIGRpYWxvZzogbnVsbCxcbiAgICBiYWNrZHJvcDogbnVsbFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obW9kYWwuY3VycmVudCwge1xuICAgIGFkZDogKCkgPT4gbW9kYWxNYW5hZ2VyLmFkZChtb2RhbC5jdXJyZW50KSxcbiAgICByZW1vdmU6ICgpID0+IG1vZGFsTWFuYWdlci5yZW1vdmUobW9kYWwuY3VycmVudCksXG4gICAgaXNUb3BNb2RhbDogKCkgPT4gbW9kYWxNYW5hZ2VyLmlzVG9wTW9kYWwobW9kYWwuY3VycmVudCksXG4gICAgc2V0RGlhbG9nUmVmOiB1c2VDYWxsYmFjayhyZWYgPT4ge1xuICAgICAgbW9kYWwuY3VycmVudC5kaWFsb2cgPSByZWY7XG4gICAgfSwgW10pLFxuICAgIHNldEJhY2tkcm9wUmVmOiB1c2VDYWxsYmFjayhyZWYgPT4ge1xuICAgICAgbW9kYWwuY3VycmVudC5iYWNrZHJvcCA9IHJlZjtcbiAgICB9LCBbXSlcbiAgfSk7XG59XG5cbmNvbnN0IE1vZGFsID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoKF9yZWYsIHJlZikgPT4ge1xuICBsZXQge1xuICAgIHNob3cgPSBmYWxzZSxcbiAgICByb2xlID0gJ2RpYWxvZycsXG4gICAgY2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIGNoaWxkcmVuLFxuICAgIGJhY2tkcm9wID0gdHJ1ZSxcbiAgICBrZXlib2FyZCA9IHRydWUsXG4gICAgb25CYWNrZHJvcENsaWNrLFxuICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICB0cmFuc2l0aW9uLFxuICAgIGJhY2tkcm9wVHJhbnNpdGlvbixcbiAgICBhdXRvRm9jdXMgPSB0cnVlLFxuICAgIGVuZm9yY2VGb2N1cyA9IHRydWUsXG4gICAgcmVzdG9yZUZvY3VzID0gdHJ1ZSxcbiAgICByZXN0b3JlRm9jdXNPcHRpb25zLFxuICAgIHJlbmRlckRpYWxvZyxcbiAgICByZW5kZXJCYWNrZHJvcCA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSksXG4gICAgbWFuYWdlcjogcHJvdmlkZWRNYW5hZ2VyLFxuICAgIGNvbnRhaW5lcjogY29udGFpbmVyUmVmLFxuICAgIG9uU2hvdyxcbiAgICBvbkhpZGUgPSAoKSA9PiB7fSxcbiAgICBvbkV4aXQsXG4gICAgb25FeGl0ZWQsXG4gICAgb25FeGl0aW5nLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlcmluZyxcbiAgICBvbkVudGVyZWRcbiAgfSA9IF9yZWYsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBjb250YWluZXIgPSB1c2VXYWl0Rm9yRE9NUmVmKGNvbnRhaW5lclJlZik7XG4gIGNvbnN0IG1vZGFsID0gdXNlTW9kYWxNYW5hZ2VyKHByb3ZpZGVkTWFuYWdlcik7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKTtcbiAgY29uc3QgcHJldlNob3cgPSB1c2VQcmV2aW91cyhzaG93KTtcbiAgY29uc3QgW2V4aXRlZCwgc2V0RXhpdGVkXSA9IHVzZVN0YXRlKCFzaG93KTtcbiAgY29uc3QgbGFzdEZvY3VzUmVmID0gdXNlUmVmKG51bGwpO1xuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gbW9kYWwsIFttb2RhbF0pO1xuXG4gIGlmIChjYW5Vc2VET00gJiYgIXByZXZTaG93ICYmIHNob3cpIHtcbiAgICBsYXN0Rm9jdXNSZWYuY3VycmVudCA9IGFjdGl2ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIGlmICghdHJhbnNpdGlvbiAmJiAhc2hvdyAmJiAhZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKHRydWUpO1xuICB9IGVsc2UgaWYgKHNob3cgJiYgZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNob3cgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBtb2RhbC5hZGQoKTtcbiAgICByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2tleWRvd24nLCBoYW5kbGVEb2N1bWVudEtleURvd24pO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9IGxpc3Rlbihkb2N1bWVudCwgJ2ZvY3VzJywgLy8gdGhlIHRpbWVvdXQgaXMgbmVjZXNzYXJ5IGIvYyB0aGlzIHdpbGwgcnVuIGJlZm9yZSB0aGUgbmV3IG1vZGFsIGlzIG1vdW50ZWRcbiAgICAvLyBhbmQgc28gc3RlYWxzIGZvY3VzIGZyb20gaXRcbiAgICAoKSA9PiBzZXRUaW1lb3V0KGhhbmRsZUVuZm9yY2VGb2N1cyksIHRydWUpO1xuXG4gICAgaWYgKG9uU2hvdykge1xuICAgICAgb25TaG93KCk7XG4gICAgfSAvLyBhdXRvZm9jdXMgYWZ0ZXIgb25TaG93IHRvIG5vdCB0cmlnZ2VyIGEgZm9jdXMgZXZlbnQgZm9yIHByZXZpb3VzXG4gICAgLy8gbW9kYWxzIGJlZm9yZSB0aGlzIG9uZSBpcyBzaG93bi5cblxuXG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgY29uc3QgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KGRvY3VtZW50KTtcblxuICAgICAgaWYgKG1vZGFsLmRpYWxvZyAmJiBjdXJyZW50QWN0aXZlRWxlbWVudCAmJiAhY29udGFpbnMobW9kYWwuZGlhbG9nLCBjdXJyZW50QWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgbGFzdEZvY3VzUmVmLmN1cnJlbnQgPSBjdXJyZW50QWN0aXZlRWxlbWVudDtcbiAgICAgICAgbW9kYWwuZGlhbG9nLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG1vZGFsLnJlbW92ZSgpO1xuICAgIHJlbW92ZUtleWRvd25MaXN0ZW5lclJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYuY3VycmVudCgpO1xuICAgIHJlbW92ZUZvY3VzTGlzdGVuZXJSZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlRm9jdXNMaXN0ZW5lclJlZi5jdXJyZW50KCk7XG5cbiAgICBpZiAocmVzdG9yZUZvY3VzKSB7XG4gICAgICB2YXIgX2xhc3RGb2N1c1JlZiRjdXJyZW50O1xuXG4gICAgICAvLyBTdXBwb3J0OiA8PUlFMTEgZG9lc24ndCBzdXBwb3J0IGBmb2N1cygpYCBvbiBzdmcgZWxlbWVudHMgKFJCOiAjOTE3KVxuICAgICAgKF9sYXN0Rm9jdXNSZWYkY3VycmVudCA9IGxhc3RGb2N1c1JlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2xhc3RGb2N1c1JlZiRjdXJyZW50LmZvY3VzID09IG51bGwgPyB2b2lkIDAgOiBfbGFzdEZvY3VzUmVmJGN1cnJlbnQuZm9jdXMocmVzdG9yZUZvY3VzT3B0aW9ucyk7XG4gICAgICBsYXN0Rm9jdXNSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9KTsgLy8gVE9ETzogdHJ5IGFuZCBjb21iaW5lIHRoZXNlIGVmZmVjdHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3Qtb3ZlcmxheXMvcHVsbC83OTQjZGlzY3Vzc2lvbl9yNDA5OTU0MTIwXG4gIC8vIFNob3cgbG9naWMgd2hlbjpcbiAgLy8gIC0gc2hvdyBpcyBgdHJ1ZWAgX2FuZF8gYGNvbnRhaW5lcmAgaGFzIHJlc29sdmVkXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3cgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGhhbmRsZVNob3coKTtcbiAgfSwgW3Nob3csIGNvbnRhaW5lcixcbiAgLyogc2hvdWxkIG5ldmVyIGNoYW5nZTogKi9cbiAgaGFuZGxlU2hvd10pOyAvLyBIaWRlIGNsZWFudXAgbG9naWMgd2hlbjpcbiAgLy8gIC0gYGV4aXRlZGAgc3dpdGNoZXMgdG8gdHJ1ZVxuICAvLyAgLSBjb21wb25lbnQgdW5tb3VudHM7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWV4aXRlZCkgcmV0dXJuO1xuICAgIGhhbmRsZUhpZGUoKTtcbiAgfSwgW2V4aXRlZCwgaGFuZGxlSGlkZV0pO1xuICB1c2VXaWxsVW5tb3VudCgoKSA9PiB7XG4gICAgaGFuZGxlSGlkZSgpO1xuICB9KTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb25zdCBoYW5kbGVFbmZvcmNlRm9jdXMgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIWVuZm9yY2VGb2N1cyB8fCAhaXNNb3VudGVkKCkgfHwgIW1vZGFsLmlzVG9wTW9kYWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudCgpO1xuXG4gICAgaWYgKG1vZGFsLmRpYWxvZyAmJiBjdXJyZW50QWN0aXZlRWxlbWVudCAmJiAhY29udGFpbnMobW9kYWwuZGlhbG9nLCBjdXJyZW50QWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIG1vZGFsLmRpYWxvZy5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25CYWNrZHJvcENsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkJhY2tkcm9wQ2xpY2soZSk7XG5cbiAgICBpZiAoYmFja2Ryb3AgPT09IHRydWUpIHtcbiAgICAgIG9uSGlkZSgpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGhhbmRsZURvY3VtZW50S2V5RG93biA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKGtleWJvYXJkICYmIGUua2V5Q29kZSA9PT0gMjcgJiYgbW9kYWwuaXNUb3BNb2RhbCgpKSB7XG4gICAgICBvbkVzY2FwZUtleURvd24gPT0gbnVsbCA/IHZvaWQgMCA6IG9uRXNjYXBlS2V5RG93bihlKTtcblxuICAgICAgaWYgKCFlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgb25IaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVtb3ZlRm9jdXNMaXN0ZW5lclJlZiA9IHVzZVJlZigpO1xuICBjb25zdCByZW1vdmVLZXlkb3duTGlzdGVuZXJSZWYgPSB1c2VSZWYoKTtcblxuICBjb25zdCBoYW5kbGVIaWRkZW4gPSAoLi4uYXJncykgPT4ge1xuICAgIHNldEV4aXRlZCh0cnVlKTtcbiAgICBvbkV4aXRlZCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0ZWQoLi4uYXJncyk7XG4gIH07XG5cbiAgY29uc3QgVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG5cbiAgaWYgKCFjb250YWluZXIgfHwgIShzaG93IHx8IFRyYW5zaXRpb24gJiYgIWV4aXRlZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRpYWxvZ1Byb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcm9sZSxcbiAgICByZWY6IG1vZGFsLnNldERpYWxvZ1JlZixcbiAgICAvLyBhcHBhcmVudGx5IG9ubHkgd29ya3Mgb24gdGhlIGRpYWxvZyByb2xlIGVsZW1lbnRcbiAgICAnYXJpYS1tb2RhbCc6IHJvbGUgPT09ICdkaWFsb2cnID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9LCByZXN0LCB7XG4gICAgc3R5bGUsXG4gICAgY2xhc3NOYW1lLFxuICAgIHRhYkluZGV4OiAtMVxuICB9KTtcbiAgbGV0IGRpYWxvZyA9IHJlbmRlckRpYWxvZyA/IHJlbmRlckRpYWxvZyhkaWFsb2dQcm9wcykgOiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBkaWFsb2dQcm9wcywge1xuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByb2xlOiAnZG9jdW1lbnQnXG4gICAgfSlcbiAgfSkpO1xuXG4gIGlmIChUcmFuc2l0aW9uKSB7XG4gICAgZGlhbG9nID0gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgYXBwZWFyOiB0cnVlLFxuICAgICAgdW5tb3VudE9uRXhpdDogdHJ1ZSxcbiAgICAgIGluOiAhIXNob3csXG4gICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgb25FeGl0ZWQ6IGhhbmRsZUhpZGRlbixcbiAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBjaGlsZHJlbjogZGlhbG9nXG4gICAgfSk7XG4gIH1cblxuICBsZXQgYmFja2Ryb3BFbGVtZW50ID0gbnVsbDtcblxuICBpZiAoYmFja2Ryb3ApIHtcbiAgICBjb25zdCBCYWNrZHJvcFRyYW5zaXRpb24gPSBiYWNrZHJvcFRyYW5zaXRpb247XG4gICAgYmFja2Ryb3BFbGVtZW50ID0gcmVuZGVyQmFja2Ryb3Aoe1xuICAgICAgcmVmOiBtb2RhbC5zZXRCYWNrZHJvcFJlZixcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUJhY2tkcm9wQ2xpY2tcbiAgICB9KTtcblxuICAgIGlmIChCYWNrZHJvcFRyYW5zaXRpb24pIHtcbiAgICAgIGJhY2tkcm9wRWxlbWVudCA9IC8qI19fUFVSRV9fKi9fanN4KEJhY2tkcm9wVHJhbnNpdGlvbiwge1xuICAgICAgICBhcHBlYXI6IHRydWUsXG4gICAgICAgIGluOiAhIXNob3csXG4gICAgICAgIGNoaWxkcmVuOiBiYWNrZHJvcEVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChfRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL1JlYWN0RE9NLmNyZWF0ZVBvcnRhbCggLyojX19QVVJFX18qL19qc3hzKF9GcmFnbWVudCwge1xuICAgICAgY2hpbGRyZW46IFtiYWNrZHJvcEVsZW1lbnQsIGRpYWxvZ11cbiAgICB9KSwgY29udGFpbmVyKVxuICB9KTtcbn0pO1xuTW9kYWwuZGlzcGxheU5hbWUgPSAnTW9kYWwnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihNb2RhbCwge1xuICBNYW5hZ2VyOiBNb2RhbE1hbmFnZXJcbn0pOyIsImltcG9ydCBjc3MgZnJvbSAnZG9tLWhlbHBlcnMvY3NzJztcbmltcG9ydCB7IGRhdGFBdHRyIH0gZnJvbSAnLi9EYXRhS2V5JztcbmltcG9ydCBnZXRCb2R5U2Nyb2xsYmFyV2lkdGggZnJvbSAnLi9nZXRTY3JvbGxiYXJXaWR0aCc7XG5leHBvcnQgY29uc3QgT1BFTl9EQVRBX0FUVFJJQlVURSA9IGRhdGFBdHRyKCdtb2RhbC1vcGVuJyk7XG4vKipcbiAqIE1hbmFnZXMgYSBzdGFjayBvZiBNb2RhbHMgYXMgd2VsbCBhcyBlbnN1cmluZ1xuICogYm9keSBzY3JvbGxpbmcgaXMgaXMgZGlzYWJsZWQgYW5kIHBhZGRpbmcgYWNjb3VudGVkIGZvclxuICovXG5cbmNsYXNzIE1vZGFsTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50LFxuICAgIGhhbmRsZUNvbnRhaW5lck92ZXJmbG93ID0gdHJ1ZSxcbiAgICBpc1JUTCA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cgPSBoYW5kbGVDb250YWluZXJPdmVyZmxvdztcbiAgICB0aGlzLmlzUlRMID0gaXNSVEw7XG4gICAgdGhpcy5tb2RhbHMgPSBbXTtcbiAgICB0aGlzLm93bmVyRG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG5cbiAgZ2V0U2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgcmV0dXJuIGdldEJvZHlTY3JvbGxiYXJXaWR0aCh0aGlzLm93bmVyRG9jdW1lbnQpO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gKHRoaXMub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuYm9keTtcbiAgfVxuXG4gIHNldE1vZGFsQXR0cmlidXRlcyhfbW9kYWwpIHsvLyBGb3Igb3ZlcnJpZGluZ1xuICB9XG5cbiAgcmVtb3ZlTW9kYWxBdHRyaWJ1dGVzKF9tb2RhbCkgey8vIEZvciBvdmVycmlkaW5nXG4gIH1cblxuICBzZXRDb250YWluZXJTdHlsZShjb250YWluZXJTdGF0ZSkge1xuICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTsgLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgYWN0dWFsIGBzdHlsZWAgaGVyZVxuICAgIC8vIGJlY2F1c2Ugd2Ugd2lsbCBvdmVycmlkZSBpdFxuXG4gICAgY29uc3QgcGFkZGluZ1Byb3AgPSB0aGlzLmlzUlRMID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIGNvbnRhaW5lclN0YXRlLnN0eWxlID0ge1xuICAgICAgb3ZlcmZsb3c6IGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyxcbiAgICAgIFtwYWRkaW5nUHJvcF06IGNvbnRhaW5lci5zdHlsZVtwYWRkaW5nUHJvcF1cbiAgICB9O1xuXG4gICAgaWYgKGNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSB7XG4gICAgICAvLyB1c2UgY29tcHV0ZWQgc3R5bGUsIGhlcmUgdG8gZ2V0IHRoZSByZWFsIHBhZGRpbmdcbiAgICAgIC8vIHRvIGFkZCBvdXIgc2Nyb2xsYmFyIHdpZHRoXG4gICAgICBzdHlsZVtwYWRkaW5nUHJvcF0gPSBgJHtwYXJzZUludChjc3MoY29udGFpbmVyLCBwYWRkaW5nUHJvcCkgfHwgJzAnLCAxMCkgKyBjb250YWluZXJTdGF0ZS5zY3JvbGxCYXJXaWR0aH1weGA7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShPUEVOX0RBVEFfQVRUUklCVVRFLCAnJyk7XG4gICAgY3NzKGNvbnRhaW5lciwgc3R5bGUpO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgWy4uLnRoaXMubW9kYWxzXS5mb3JFYWNoKG0gPT4gdGhpcy5yZW1vdmUobSkpO1xuICB9XG5cbiAgcmVtb3ZlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKE9QRU5fREFUQV9BVFRSSUJVVEUpO1xuICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyLnN0eWxlLCBjb250YWluZXJTdGF0ZS5zdHlsZSk7XG4gIH1cblxuICBhZGQobW9kYWwpIHtcbiAgICBsZXQgbW9kYWxJZHggPSB0aGlzLm1vZGFscy5pbmRleE9mKG1vZGFsKTtcblxuICAgIGlmIChtb2RhbElkeCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmxlbmd0aDtcbiAgICB0aGlzLm1vZGFscy5wdXNoKG1vZGFsKTtcbiAgICB0aGlzLnNldE1vZGFsQXR0cmlidXRlcyhtb2RhbCk7XG5cbiAgICBpZiAobW9kYWxJZHggIT09IDApIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgc2Nyb2xsQmFyV2lkdGg6IHRoaXMuZ2V0U2Nyb2xsYmFyV2lkdGgoKSxcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdykge1xuICAgICAgdGhpcy5zZXRDb250YWluZXJTdHlsZSh0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kYWxJZHg7XG4gIH1cblxuICByZW1vdmUobW9kYWwpIHtcbiAgICBjb25zdCBtb2RhbElkeCA9IHRoaXMubW9kYWxzLmluZGV4T2YobW9kYWwpO1xuXG4gICAgaWYgKG1vZGFsSWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubW9kYWxzLnNwbGljZShtb2RhbElkeCwgMSk7IC8vIGlmIHRoYXQgd2FzIHRoZSBsYXN0IG1vZGFsIGluIGEgY29udGFpbmVyLFxuICAgIC8vIGNsZWFuIHVwIHRoZSBjb250YWluZXJcblxuICAgIGlmICghdGhpcy5tb2RhbHMubGVuZ3RoICYmIHRoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMucmVtb3ZlQ29udGFpbmVyU3R5bGUodGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVNb2RhbEF0dHJpYnV0ZXMobW9kYWwpO1xuICB9XG5cbiAgaXNUb3BNb2RhbChtb2RhbCkge1xuICAgIHJldHVybiAhIXRoaXMubW9kYWxzLmxlbmd0aCAmJiB0aGlzLm1vZGFsc1t0aGlzLm1vZGFscy5sZW5ndGggLSAxXSA9PT0gbW9kYWw7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNb2RhbE1hbmFnZXI7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiYXNcIiwgXCJvblNlbGVjdFwiLCBcImFjdGl2ZUtleVwiLCBcInJvbGVcIiwgXCJvbktleURvd25cIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHFzYSBmcm9tICdkb20taGVscGVycy9xdWVyeVNlbGVjdG9yQWxsJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUZvcmNlVXBkYXRlIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUZvcmNlVXBkYXRlJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IE5hdkNvbnRleHQgZnJvbSAnLi9OYXZDb250ZXh0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgeyBkYXRhQXR0ciwgZGF0YVByb3AgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuY29uc3QgRVZFTlRfS0VZX0FUVFIgPSBkYXRhQXR0cignZXZlbnQta2V5Jyk7XG5jb25zdCBOYXYgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoX3JlZiwgcmVmKSA9PiB7XG4gIGxldCB7XG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBvblNlbGVjdCxcbiAgICBhY3RpdmVLZXksXG4gICAgcm9sZSxcbiAgICBvbktleURvd25cbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgLy8gQSByZWYgYW5kIGZvcmNlVXBkYXRlIGZvciByZWZvY3VzLCBiL2Mgd2Ugb25seSB3YW50IHRvIHRyaWdnZXIgd2hlbiBuZWVkZWRcbiAgLy8gYW5kIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIHNldCBpbiB0aGUgZWZmZWN0XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgbmVlZHNSZWZvY3VzUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcGFyZW50T25TZWxlY3QgPSB1c2VDb250ZXh0KFNlbGVjdGFibGVDb250ZXh0KTtcbiAgY29uc3QgdGFiQ29udGV4dCA9IHVzZUNvbnRleHQoVGFiQ29udGV4dCk7XG4gIGxldCBnZXRDb250cm9sbGVkSWQsIGdldENvbnRyb2xsZXJJZDtcblxuICBpZiAodGFiQ29udGV4dCkge1xuICAgIHJvbGUgPSByb2xlIHx8ICd0YWJsaXN0JztcbiAgICBhY3RpdmVLZXkgPSB0YWJDb250ZXh0LmFjdGl2ZUtleTsgLy8gVE9ETzogZG8gd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlc2U/XG5cbiAgICBnZXRDb250cm9sbGVkSWQgPSB0YWJDb250ZXh0LmdldENvbnRyb2xsZWRJZDtcbiAgICBnZXRDb250cm9sbGVySWQgPSB0YWJDb250ZXh0LmdldENvbnRyb2xsZXJJZDtcbiAgfVxuXG4gIGNvbnN0IGxpc3ROb2RlID0gdXNlUmVmKG51bGwpO1xuXG4gIGNvbnN0IGdldE5leHRBY3RpdmVUYWIgPSBvZmZzZXQgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRMaXN0Tm9kZSA9IGxpc3ROb2RlLmN1cnJlbnQ7XG4gICAgaWYgKCFjdXJyZW50TGlzdE5vZGUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGl0ZW1zID0gcXNhKGN1cnJlbnRMaXN0Tm9kZSwgYFske0VWRU5UX0tFWV9BVFRSfV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKWApO1xuICAgIGNvbnN0IGFjdGl2ZUNoaWxkID0gY3VycmVudExpc3ROb2RlLnF1ZXJ5U2VsZWN0b3IoJ1thcmlhLXNlbGVjdGVkPXRydWVdJyk7XG4gICAgaWYgKCFhY3RpdmVDaGlsZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaW5kZXggPSBpdGVtcy5pbmRleE9mKGFjdGl2ZUNoaWxkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgbmV4dEluZGV4ID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgaWYgKG5leHRJbmRleCA+PSBpdGVtcy5sZW5ndGgpIG5leHRJbmRleCA9IDA7XG4gICAgaWYgKG5leHRJbmRleCA8IDApIG5leHRJbmRleCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIGl0ZW1zW25leHRJbmRleF07XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKGtleSwgZXZlbnQpID0+IHtcbiAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybjtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3Qoa2V5LCBldmVudCk7XG4gICAgcGFyZW50T25TZWxlY3QgPT0gbnVsbCA/IHZvaWQgMCA6IHBhcmVudE9uU2VsZWN0KGtleSwgZXZlbnQpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSBldmVudCA9PiB7XG4gICAgb25LZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbktleURvd24oZXZlbnQpO1xuXG4gICAgaWYgKCF0YWJDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5leHRBY3RpdmVDaGlsZDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIG5leHRBY3RpdmVDaGlsZCA9IGdldE5leHRBY3RpdmVUYWIoLTEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICBuZXh0QWN0aXZlQ2hpbGQgPSBnZXROZXh0QWN0aXZlVGFiKDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbmV4dEFjdGl2ZUNoaWxkKSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBoYW5kbGVTZWxlY3QobmV4dEFjdGl2ZUNoaWxkLmRhdGFzZXRbZGF0YVByb3AoJ0V2ZW50S2V5JyldIHx8IG51bGwsIGV2ZW50KTtcbiAgICBuZWVkc1JlZm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgZm9yY2VVcGRhdGUoKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsaXN0Tm9kZS5jdXJyZW50ICYmIG5lZWRzUmVmb2N1c1JlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBhY3RpdmVDaGlsZCA9IGxpc3ROb2RlLmN1cnJlbnQucXVlcnlTZWxlY3RvcihgWyR7RVZFTlRfS0VZX0FUVFJ9XVthcmlhLXNlbGVjdGVkPXRydWVdYCk7XG4gICAgICBhY3RpdmVDaGlsZCA9PSBudWxsID8gdm9pZCAwIDogYWN0aXZlQ2hpbGQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBuZWVkc1JlZm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhyZWYsIGxpc3ROb2RlKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGhhbmRsZVNlbGVjdCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goTmF2Q29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgcm9sZSxcbiAgICAgICAgLy8gdXNlZCBieSBOYXZMaW5rIHRvIGRldGVybWluZSBpdCdzIHJvbGVcbiAgICAgICAgYWN0aXZlS2V5OiBtYWtlRXZlbnRLZXkoYWN0aXZlS2V5KSxcbiAgICAgICAgZ2V0Q29udHJvbGxlZElkOiBnZXRDb250cm9sbGVkSWQgfHwgbm9vcCxcbiAgICAgICAgZ2V0Q29udHJvbGxlcklkOiBnZXRDb250cm9sbGVySWQgfHwgbm9vcFxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgICAgIHJvbGU6IHJvbGVcbiAgICAgIH0pKVxuICAgIH0pXG4gIH0pO1xufSk7XG5OYXYuZGlzcGxheU5hbWUgPSAnTmF2JztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2LCB7XG4gIEl0ZW06IE5hdkl0ZW1cbn0pOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IE5hdkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbk5hdkNvbnRleHQuZGlzcGxheU5hbWUgPSAnTmF2Q29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBOYXZDb250ZXh0OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImFzXCIsIFwiYWN0aXZlXCIsIFwiZXZlbnRLZXlcIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IE5hdkNvbnRleHQgZnJvbSAnLi9OYXZDb250ZXh0JztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCwgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICcuL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IHsgZGF0YUF0dHIgfSBmcm9tICcuL0RhdGFLZXknO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VOYXZJdGVtKHtcbiAga2V5LFxuICBvbkNsaWNrLFxuICBhY3RpdmUsXG4gIGlkLFxuICByb2xlLFxuICBkaXNhYmxlZFxufSkge1xuICBjb25zdCBwYXJlbnRPblNlbGVjdCA9IHVzZUNvbnRleHQoU2VsZWN0YWJsZUNvbnRleHQpO1xuICBjb25zdCBuYXZDb250ZXh0ID0gdXNlQ29udGV4dChOYXZDb250ZXh0KTtcbiAgbGV0IGlzQWN0aXZlID0gYWN0aXZlO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICByb2xlXG4gIH07XG5cbiAgaWYgKG5hdkNvbnRleHQpIHtcbiAgICBpZiAoIXJvbGUgJiYgbmF2Q29udGV4dC5yb2xlID09PSAndGFibGlzdCcpIHByb3BzLnJvbGUgPSAndGFiJztcbiAgICBjb25zdCBjb250ZXh0Q29udHJvbGxlcklkID0gbmF2Q29udGV4dC5nZXRDb250cm9sbGVySWQoa2V5ICE9IG51bGwgPyBrZXkgOiBudWxsKTtcbiAgICBjb25zdCBjb250ZXh0Q29udHJvbGxlZElkID0gbmF2Q29udGV4dC5nZXRDb250cm9sbGVkSWQoa2V5ICE9IG51bGwgPyBrZXkgOiBudWxsKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcHJvcHNbZGF0YUF0dHIoJ2V2ZW50LWtleScpXSA9IGtleTtcbiAgICBwcm9wcy5pZCA9IGNvbnRleHRDb250cm9sbGVySWQgfHwgaWQ7XG4gICAgcHJvcHNbJ2FyaWEtY29udHJvbHMnXSA9IGNvbnRleHRDb250cm9sbGVkSWQ7XG4gICAgaXNBY3RpdmUgPSBhY3RpdmUgPT0gbnVsbCAmJiBrZXkgIT0gbnVsbCA/IG5hdkNvbnRleHQuYWN0aXZlS2V5ID09PSBrZXkgOiBhY3RpdmU7XG4gIH1cblxuICBpZiAocHJvcHMucm9sZSA9PT0gJ3RhYicpIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHByb3BzLnRhYkluZGV4ID0gLTE7XG4gICAgICBwcm9wc1snYXJpYS1kaXNhYmxlZCddID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIHByb3BzWydhcmlhLXNlbGVjdGVkJ10gPSBpc0FjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gIH1cblxuICBwcm9wcy5vbkNsaWNrID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKGUpO1xuXG4gICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudE9uU2VsZWN0ICYmICFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHBhcmVudE9uU2VsZWN0KGtleSwgZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFtwcm9wcywge1xuICAgIGlzQWN0aXZlXG4gIH1dO1xufVxuY29uc3QgTmF2SXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChfcmVmLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICBhczogQ29tcG9uZW50ID0gQnV0dG9uLFxuICAgIGFjdGl2ZSxcbiAgICBldmVudEtleVxuICB9ID0gX3JlZixcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IFtwcm9wcywgbWV0YV0gPSB1c2VOYXZJdGVtKE9iamVjdC5hc3NpZ24oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBvcHRpb25zLmhyZWYpLFxuICAgIGFjdGl2ZVxuICB9LCBvcHRpb25zKSk7IC8vIEB0cy1pZ25vcmVcblxuICBwcm9wc1tkYXRhQXR0cignYWN0aXZlJyldID0gbWV0YS5pc0FjdGl2ZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgcHJvcHMsIHtcbiAgICByZWY6IHJlZlxuICB9KSk7XG59KTtcbk5hdkl0ZW0uZGlzcGxheU5hbWUgPSAnTmF2SXRlbSc7XG5leHBvcnQgZGVmYXVsdCBOYXZJdGVtOyIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiBOb29wVHJhbnNpdGlvbih7XG4gIGNoaWxkcmVuLFxuICBpbjogaW5Qcm9wLFxuICBtb3VudE9uRW50ZXIsXG4gIHVubW91bnRPbkV4aXRcbn0pIHtcbiAgY29uc3QgaGFzRW50ZXJlZFJlZiA9IHVzZVJlZihpblByb3ApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpblByb3ApIGhhc0VudGVyZWRSZWYuY3VycmVudCA9IHRydWU7XG4gIH0sIFtpblByb3BdKTtcbiAgaWYgKGluUHJvcCkgcmV0dXJuIGNoaWxkcmVuOyAvLyBub3QgaW5cbiAgLy9cbiAgLy8gaWYgKCFtb3VudE9uRW50ZXIgJiYgIXVubW91bnRPbkV4aXQpIHtcbiAgLy8gICByZXR1cm4gY2hpbGRyZW47XG4gIC8vIH1cblxuICBpZiAodW5tb3VudE9uRXhpdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKCFoYXNFbnRlcmVkUmVmLmN1cnJlbnQgJiYgbW91bnRPbkVudGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5vb3BUcmFuc2l0aW9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHVzZUNhbGxiYWNrUmVmIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUNhbGxiYWNrUmVmJztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlUG9wcGVyIGZyb20gJy4vdXNlUG9wcGVyJztcbmltcG9ydCB1c2VSb290Q2xvc2UgZnJvbSAnLi91c2VSb290Q2xvc2UnO1xuaW1wb3J0IHVzZVdhaXRGb3JET01SZWYgZnJvbSAnLi91c2VXYWl0Rm9yRE9NUmVmJztcbmltcG9ydCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnIGZyb20gJy4vbWVyZ2VPcHRpb25zV2l0aFBvcHBlckNvbmZpZyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKipcbiAqIEJ1aWx0IG9uIHRvcCBvZiBgUG9wcGVyLmpzYCwgdGhlIG92ZXJsYXkgY29tcG9uZW50IGlzXG4gKiBncmVhdCBmb3IgY3VzdG9tIHRvb2x0aXAgb3ZlcmxheXMuXG4gKi9cbmNvbnN0IE92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIG91dGVyUmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmbGlwLFxuICAgIG9mZnNldCxcbiAgICBwbGFjZW1lbnQsXG4gICAgY29udGFpbmVyUGFkZGluZyxcbiAgICBwb3BwZXJDb25maWcgPSB7fSxcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW3Jvb3RFbGVtZW50LCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWYoKTtcbiAgY29uc3QgW2Fycm93RWxlbWVudCwgYXR0YWNoQXJyb3dSZWZdID0gdXNlQ2FsbGJhY2tSZWYoKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyhhdHRhY2hSZWYsIG91dGVyUmVmKTtcbiAgY29uc3QgY29udGFpbmVyID0gdXNlV2FpdEZvckRPTVJlZihwcm9wcy5jb250YWluZXIpO1xuICBjb25zdCB0YXJnZXQgPSB1c2VXYWl0Rm9yRE9NUmVmKHByb3BzLnRhcmdldCk7XG4gIGNvbnN0IFtleGl0ZWQsIHNldEV4aXRlZF0gPSB1c2VTdGF0ZSghcHJvcHMuc2hvdyk7XG4gIGNvbnN0IHBvcHBlciA9IHVzZVBvcHBlcih0YXJnZXQsIHJvb3RFbGVtZW50LCBtZXJnZU9wdGlvbnNXaXRoUG9wcGVyQ29uZmlnKHtcbiAgICBwbGFjZW1lbnQsXG4gICAgZW5hYmxlRXZlbnRzOiAhIXByb3BzLnNob3csXG4gICAgY29udGFpbmVyUGFkZGluZzogY29udGFpbmVyUGFkZGluZyB8fCA1LFxuICAgIGZsaXAsXG4gICAgb2Zmc2V0LFxuICAgIGFycm93RWxlbWVudCxcbiAgICBwb3BwZXJDb25maWdcbiAgfSkpO1xuXG4gIGlmIChwcm9wcy5zaG93KSB7XG4gICAgaWYgKGV4aXRlZCkgc2V0RXhpdGVkKGZhbHNlKTtcbiAgfSBlbHNlIGlmICghcHJvcHMudHJhbnNpdGlvbiAmJiAhZXhpdGVkKSB7XG4gICAgc2V0RXhpdGVkKHRydWUpO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlSGlkZGVuID0gKC4uLmFyZ3MpID0+IHtcbiAgICBzZXRFeGl0ZWQodHJ1ZSk7XG5cbiAgICBpZiAocHJvcHMub25FeGl0ZWQpIHtcbiAgICAgIHByb3BzLm9uRXhpdGVkKC4uLmFyZ3MpO1xuICAgIH1cbiAgfTsgLy8gRG9uJ3QgdW4tcmVuZGVyIHRoZSBvdmVybGF5IHdoaWxlIGl0J3MgdHJhbnNpdGlvbmluZyBvdXQuXG5cblxuICBjb25zdCBtb3VudE92ZXJsYXkgPSBwcm9wcy5zaG93IHx8IFRyYW5zaXRpb24gJiYgIWV4aXRlZDtcbiAgdXNlUm9vdENsb3NlKHJvb3RFbGVtZW50LCBwcm9wcy5vbkhpZGUsIHtcbiAgICBkaXNhYmxlZDogIXByb3BzLnJvb3RDbG9zZSB8fCBwcm9wcy5yb290Q2xvc2VEaXNhYmxlZCxcbiAgICBjbGlja1RyaWdnZXI6IHByb3BzLnJvb3RDbG9zZUV2ZW50XG4gIH0pO1xuXG4gIGlmICghbW91bnRPdmVybGF5KSB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIHNob3dpbmcgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSB0by5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjaGlsZCA9IHByb3BzLmNoaWxkcmVuKE9iamVjdC5hc3NpZ24oe30sIHBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgIHN0eWxlOiBwb3BwZXIuc3R5bGVzLnBvcHBlcixcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9KSwge1xuICAgIHBvcHBlcixcbiAgICBwbGFjZW1lbnQsXG4gICAgc2hvdzogISFwcm9wcy5zaG93LFxuICAgIGFycm93UHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHBvcHBlci5hdHRyaWJ1dGVzLmFycm93LCB7XG4gICAgICBzdHlsZTogcG9wcGVyLnN0eWxlcy5hcnJvdyxcbiAgICAgIHJlZjogYXR0YWNoQXJyb3dSZWZcbiAgICB9KVxuICB9KTtcblxuICBpZiAoVHJhbnNpdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZyxcbiAgICAgIG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkXG4gICAgfSA9IHByb3BzO1xuICAgIGNoaWxkID0gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgaW46IHByb3BzLnNob3csXG4gICAgICBhcHBlYXI6IHRydWUsXG4gICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgb25FeGl0ZWQ6IGhhbmRsZUhpZGRlbixcbiAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBjaGlsZHJlbjogY2hpbGRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250YWluZXIgPyAvKiNfX1BVUkVfXyovUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkLCBjb250YWluZXIpIDogbnVsbDtcbn0pO1xuT3ZlcmxheS5kaXNwbGF5TmFtZSA9ICdPdmVybGF5JztcbmV4cG9ydCBkZWZhdWx0IE92ZXJsYXk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgU2VsZWN0YWJsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBjb25zdCBtYWtlRXZlbnRLZXkgPSAoZXZlbnRLZXksIGhyZWYgPSBudWxsKSA9PiB7XG4gIGlmIChldmVudEtleSAhPSBudWxsKSByZXR1cm4gU3RyaW5nKGV2ZW50S2V5KTtcbiAgcmV0dXJuIGhyZWYgfHwgbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBTZWxlY3RhYmxlQ29udGV4dDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUYWJDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5leHBvcnQgZGVmYXVsdCBUYWJDb250ZXh0OyIsImNvbnN0IF9leGNsdWRlZCA9IFtcImFjdGl2ZVwiLCBcImV2ZW50S2V5XCIsIFwibW91bnRPbkVudGVyXCIsIFwidHJhbnNpdGlvblwiLCBcInVubW91bnRPbkV4aXRcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiYWN0aXZlS2V5XCIsIFwiZ2V0Q29udHJvbGxlZElkXCIsIFwiZ2V0Q29udHJvbGxlcklkXCJdLFxuICAgICAgX2V4Y2x1ZGVkMyA9IFtcImFzXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tICcuL1RhYkNvbnRleHQnO1xuaW1wb3J0IFNlbGVjdGFibGVDb250ZXh0LCB7IG1ha2VFdmVudEtleSB9IGZyb20gJy4vU2VsZWN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IE5vb3BUcmFuc2l0aW9uIGZyb20gJy4vTm9vcFRyYW5zaXRpb24nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUYWJQYW5lbChfcmVmKSB7XG4gIGxldCB7XG4gICAgYWN0aXZlLFxuICAgIGV2ZW50S2V5LFxuICAgIG1vdW50T25FbnRlcixcbiAgICB0cmFuc2l0aW9uLFxuICAgIHVubW91bnRPbkV4aXRcbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVGFiQ29udGV4dCk7XG4gIGlmICghY29udGV4dCkgcmV0dXJuIFtwcm9wcywge1xuICAgIGV2ZW50S2V5LFxuICAgIGlzQWN0aXZlOiBhY3RpdmUsXG4gICAgbW91bnRPbkVudGVyLFxuICAgIHRyYW5zaXRpb24sXG4gICAgdW5tb3VudE9uRXhpdFxuICB9XTtcblxuICBjb25zdCB7XG4gICAgYWN0aXZlS2V5LFxuICAgIGdldENvbnRyb2xsZWRJZCxcbiAgICBnZXRDb250cm9sbGVySWRcbiAgfSA9IGNvbnRleHQsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShjb250ZXh0LCBfZXhjbHVkZWQyKTtcblxuICBjb25zdCBrZXkgPSBtYWtlRXZlbnRLZXkoZXZlbnRLZXkpO1xuICByZXR1cm4gW09iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgaWQ6IGdldENvbnRyb2xsZWRJZChldmVudEtleSksXG4gICAgJ2FyaWEtbGFiZWxsZWRieSc6IGdldENvbnRyb2xsZXJJZChldmVudEtleSlcbiAgfSksIHtcbiAgICBldmVudEtleSxcbiAgICBpc0FjdGl2ZTogYWN0aXZlID09IG51bGwgJiYga2V5ICE9IG51bGwgPyBtYWtlRXZlbnRLZXkoYWN0aXZlS2V5KSA9PT0ga2V5IDogYWN0aXZlLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24gfHwgcmVzdC50cmFuc2l0aW9uLFxuICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyICE9IG51bGwgPyBtb3VudE9uRW50ZXIgOiByZXN0Lm1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0ICE9IG51bGwgPyB1bm1vdW50T25FeGl0IDogcmVzdC51bm1vdW50T25FeGl0XG4gIH1dO1xufVxuY29uc3QgVGFiUGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKF9yZWYyLCByZWYpID0+IHtcbiAgbGV0IHtcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdidcbiAgfSA9IF9yZWYyLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMiwgX2V4Y2x1ZGVkMyk7XG5cbiAgY29uc3QgW3RhYlBhbmVsUHJvcHMsIHtcbiAgICBpc0FjdGl2ZSxcbiAgICBvbkVudGVyLFxuICAgIG9uRW50ZXJpbmcsXG4gICAgb25FbnRlcmVkLFxuICAgIG9uRXhpdCxcbiAgICBvbkV4aXRpbmcsXG4gICAgb25FeGl0ZWQsXG4gICAgbW91bnRPbkVudGVyLFxuICAgIHVubW91bnRPbkV4aXQsXG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvbiA9IE5vb3BUcmFuc2l0aW9uXG4gIH1dID0gdXNlVGFiUGFuZWwocHJvcHMpOyAvLyBXZSBwcm92aWRlIGFuIGVtcHR5IHRoZSBUYWJDb250ZXh0IHNvIGA8TmF2PmBzIGluIGA8VGFiUGFuZWw+YHMgZG9uJ3RcbiAgLy8gY29uZmxpY3Qgd2l0aCB0aGUgdG9wIGxldmVsIG9uZS5cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVGFiQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChTZWxlY3RhYmxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgICAgICBpbjogaXNBY3RpdmUsXG4gICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICAgIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsXG4gICAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkLFxuICAgICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgICAgb25FeGl0aW5nOiBvbkV4aXRpbmcsXG4gICAgICAgIG9uRXhpdGVkOiBvbkV4aXRlZCxcbiAgICAgICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIsXG4gICAgICAgIHVubW91bnRPbkV4aXQ6IHVubW91bnRPbkV4aXQsXG4gICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHRhYlBhbmVsUHJvcHMsIHtcbiAgICAgICAgICByZWY6IHJlZixcbiAgICAgICAgICByb2xlOiBcInRhYnBhbmVsXCIsXG4gICAgICAgICAgaGlkZGVuOiAhaXNBY3RpdmUsXG4gICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAhaXNBY3RpdmVcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5UYWJQYW5lbC5kaXNwbGF5TmFtZSA9ICdUYWJQYW5lbCc7XG5leHBvcnQgZGVmYXVsdCBUYWJQYW5lbDsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkUHJvcCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB7IHVzZVNTUlNhZmVJZCB9IGZyb20gJy4vc3NyJztcbmltcG9ydCBUYWJDb250ZXh0IGZyb20gJy4vVGFiQ29udGV4dCc7XG5pbXBvcnQgU2VsZWN0YWJsZUNvbnRleHQgZnJvbSAnLi9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgVGFiUGFuZWwgZnJvbSAnLi9UYWJQYW5lbCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBUYWJzID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgaWQ6IHVzZXJJZCxcbiAgICBnZW5lcmF0ZUNoaWxkSWQ6IGdlbmVyYXRlQ3VzdG9tQ2hpbGRJZCxcbiAgICBvblNlbGVjdDogcHJvcHNPblNlbGVjdCxcbiAgICBhY3RpdmVLZXk6IHByb3BzQWN0aXZlS2V5LFxuICAgIGRlZmF1bHRBY3RpdmVLZXksXG4gICAgdHJhbnNpdGlvbixcbiAgICBtb3VudE9uRW50ZXIsXG4gICAgdW5tb3VudE9uRXhpdCxcbiAgICBjaGlsZHJlblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFthY3RpdmVLZXksIG9uU2VsZWN0XSA9IHVzZVVuY29udHJvbGxlZFByb3AocHJvcHNBY3RpdmVLZXksIGRlZmF1bHRBY3RpdmVLZXksIHByb3BzT25TZWxlY3QpO1xuICBjb25zdCBpZCA9IHVzZVNTUlNhZmVJZCh1c2VySWQpO1xuICBjb25zdCBnZW5lcmF0ZUNoaWxkSWQgPSB1c2VNZW1vKCgpID0+IGdlbmVyYXRlQ3VzdG9tQ2hpbGRJZCB8fCAoKGtleSwgdHlwZSkgPT4gaWQgPyBgJHtpZH0tJHt0eXBlfS0ke2tleX1gIDogbnVsbCksIFtpZCwgZ2VuZXJhdGVDdXN0b21DaGlsZElkXSk7XG4gIGNvbnN0IHRhYkNvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgb25TZWxlY3QsXG4gICAgYWN0aXZlS2V5LFxuICAgIHRyYW5zaXRpb24sXG4gICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIgfHwgZmFsc2UsXG4gICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdCB8fCBmYWxzZSxcbiAgICBnZXRDb250cm9sbGVkSWQ6IGtleSA9PiBnZW5lcmF0ZUNoaWxkSWQoa2V5LCAndGFicGFuZScpLFxuICAgIGdldENvbnRyb2xsZXJJZDoga2V5ID0+IGdlbmVyYXRlQ2hpbGRJZChrZXksICd0YWInKVxuICB9KSwgW29uU2VsZWN0LCBhY3RpdmVLZXksIHRyYW5zaXRpb24sIG1vdW50T25FbnRlciwgdW5tb3VudE9uRXhpdCwgZ2VuZXJhdGVDaGlsZElkXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUYWJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRhYkNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogb25TZWxlY3QgfHwgbnVsbCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufTtcblxuVGFicy5QYW5lbCA9IFRhYlBhbmVsO1xuZXhwb3J0IGRlZmF1bHQgVGFiczsiLCIvKipcbiAqIEdldCB0aGUgd2lkdGggb2YgdGhlIHZlcnRpY2FsIHdpbmRvdyBzY3JvbGxiYXIgaWYgaXQncyB2aXNpYmxlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvZHlTY3JvbGxiYXJXaWR0aChvd25lckRvY3VtZW50ID0gZG9jdW1lbnQpIHtcbiAgY29uc3Qgd2luZG93ID0gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoIC0gb3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO1xufSIsImV4cG9ydCBmdW5jdGlvbiB0b01vZGlmaWVyTWFwKG1vZGlmaWVycykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXJzKSkge1xuICAgIHJldHVybiBtb2RpZmllcnMgfHwgcmVzdWx0O1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuXG4gIG1vZGlmaWVycyA9PSBudWxsID8gdm9pZCAwIDogbW9kaWZpZXJzLmZvckVhY2gobSA9PiB7XG4gICAgcmVzdWx0W20ubmFtZV0gPSBtO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b01vZGlmaWVyQXJyYXkobWFwID0ge30pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobWFwKSkgcmV0dXJuIG1hcDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCkubWFwKGsgPT4ge1xuICAgIG1hcFtrXS5uYW1lID0gaztcbiAgICByZXR1cm4gbWFwW2tdO1xuICB9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlT3B0aW9uc1dpdGhQb3BwZXJDb25maWcoe1xuICBlbmFibGVkLFxuICBlbmFibGVFdmVudHMsXG4gIHBsYWNlbWVudCxcbiAgZmxpcCxcbiAgb2Zmc2V0LFxuICBmaXhlZCxcbiAgY29udGFpbmVyUGFkZGluZyxcbiAgYXJyb3dFbGVtZW50LFxuICBwb3BwZXJDb25maWcgPSB7fVxufSkge1xuICB2YXIgX21vZGlmaWVycyRwcmV2ZW50T3ZlLCBfbW9kaWZpZXJzJHByZXZlbnRPdmUyLCBfbW9kaWZpZXJzJG9mZnNldCwgX21vZGlmaWVycyRhcnJvdztcblxuICBjb25zdCBtb2RpZmllcnMgPSB0b01vZGlmaWVyTWFwKHBvcHBlckNvbmZpZy5tb2RpZmllcnMpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyQ29uZmlnLCB7XG4gICAgcGxhY2VtZW50LFxuICAgIGVuYWJsZWQsXG4gICAgc3RyYXRlZ3k6IGZpeGVkID8gJ2ZpeGVkJyA6IHBvcHBlckNvbmZpZy5zdHJhdGVneSxcbiAgICBtb2RpZmllcnM6IHRvTW9kaWZpZXJBcnJheShPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllcnMsIHtcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IGVuYWJsZUV2ZW50c1xuICAgICAgfSxcbiAgICAgIHByZXZlbnRPdmVyZmxvdzogT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdywge1xuICAgICAgICBvcHRpb25zOiBjb250YWluZXJQYWRkaW5nID8gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgcGFkZGluZzogY29udGFpbmVyUGFkZGluZ1xuICAgICAgICB9LCAoX21vZGlmaWVycyRwcmV2ZW50T3ZlID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZS5vcHRpb25zKSA6IChfbW9kaWZpZXJzJHByZXZlbnRPdmUyID0gbW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykgPT0gbnVsbCA/IHZvaWQgMCA6IF9tb2RpZmllcnMkcHJldmVudE92ZTIub3B0aW9uc1xuICAgICAgfSksXG4gICAgICBvZmZzZXQ6IHtcbiAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIChfbW9kaWZpZXJzJG9mZnNldCA9IG1vZGlmaWVycy5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbW9kaWZpZXJzJG9mZnNldC5vcHRpb25zKVxuICAgICAgfSxcbiAgICAgIGFycm93OiBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllcnMuYXJyb3csIHtcbiAgICAgICAgZW5hYmxlZDogISFhcnJvd0VsZW1lbnQsXG4gICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIChfbW9kaWZpZXJzJGFycm93ID0gbW9kaWZpZXJzLmFycm93KSA9PSBudWxsID8gdm9pZCAwIDogX21vZGlmaWVycyRhcnJvdy5vcHRpb25zLCB7XG4gICAgICAgICAgZWxlbWVudDogYXJyb3dFbGVtZW50XG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIGZsaXA6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBlbmFibGVkOiAhIWZsaXBcbiAgICAgIH0sIG1vZGlmaWVycy5mbGlwKVxuICAgIH0pKVxuICB9KTtcbn0iLCJpbXBvcnQgYXJyb3cgZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdyc7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMnO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMnO1xuaW1wb3J0IGZsaXAgZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwJztcbmltcG9ydCBoaWRlIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZSc7XG5pbXBvcnQgb2Zmc2V0IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0JztcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cyc7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gJ0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93JztcbmltcG9ydCB7IHBsYWNlbWVudHMgfSBmcm9tICdAcG9wcGVyanMvY29yZS9saWIvZW51bXMnO1xuaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1iYXNlJzsgLy8gRm9yIHRoZSBjb21tb24gSlMgYnVpbGQgd2Ugd2lsbCB0dXJuIHRoaXMgZmlsZSBpbnRvIGEgYnVuZGxlIHdpdGggbm8gaW1wb3J0cy5cbi8vIFRoaXMgaXMgYi9jIHRoZSBQb3BwZXIgbGliIGlzIGFsbCBlc20gZmlsZXMsIGFuZCB3b3VsZCBicmVhayBpbiBhIGNvbW1vbiBqcyBvbmx5IGVudmlyb25tZW50XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQb3BwZXIgPSBwb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBbaGlkZSwgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgZXZlbnRMaXN0ZW5lcnMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvd11cbn0pO1xuZXhwb3J0IHsgcGxhY2VtZW50cyB9OyIsImltcG9ydCB7IHVzZVNTUlNhZmVJZCwgdXNlSXNTU1IsIFNTUlByb3ZpZGVyIH0gZnJvbSAnQHJlYWN0LWFyaWEvc3NyJztcbmV4cG9ydCB7IHVzZVNTUlNhZmVJZCwgdXNlSXNTU1IsIFNTUlByb3ZpZGVyIH07IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1wiZW5hYmxlZFwiLCBcInBsYWNlbWVudFwiLCBcInN0cmF0ZWd5XCIsIFwibW9kaWZpZXJzXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBkZXF1YWwgfSBmcm9tICdkZXF1YWwnO1xuaW1wb3J0IHVzZVNhZmVTdGF0ZSBmcm9tICdAcmVzdGFydC9ob29rcy91c2VTYWZlU3RhdGUnO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSAnLi9wb3BwZXInO1xuY29uc3QgZGlzYWJsZWRBcHBseVN0eWxlc01vZGlmaWVyID0ge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiBmYWxzZSxcbiAgcGhhc2U6ICdhZnRlcldyaXRlJyxcbiAgZm46ICgpID0+IHVuZGVmaW5lZFxufTsgLy8gdW50aWwgZG9janMgc3VwcG9ydHMgdHlwZSBleHBvcnRzLi4uXG5cbmNvbnN0IGFyaWFEZXNjcmliZWRCeU1vZGlmaWVyID0ge1xuICBuYW1lOiAnYXJpYURlc2NyaWJlZEJ5JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdhZnRlcldyaXRlJyxcbiAgZWZmZWN0OiAoe1xuICAgIHN0YXRlXG4gIH0pID0+ICgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICByZWZlcmVuY2UsXG4gICAgICBwb3BwZXJcbiAgICB9ID0gc3RhdGUuZWxlbWVudHM7XG5cbiAgICBpZiAoJ3JlbW92ZUF0dHJpYnV0ZScgaW4gcmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCBpZHMgPSAocmVmZXJlbmNlLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpIHx8ICcnKS5zcGxpdCgnLCcpLmZpbHRlcihpZCA9PiBpZC50cmltKCkgIT09IHBvcHBlci5pZCk7XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHJlZmVyZW5jZS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtlbHNlIHJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMuam9pbignLCcpKTtcbiAgICB9XG4gIH0sXG4gIGZuOiAoe1xuICAgIHN0YXRlXG4gIH0pID0+IHtcbiAgICB2YXIgX3BvcHBlciRnZXRBdHRyaWJ1dGU7XG5cbiAgICBjb25zdCB7XG4gICAgICBwb3BwZXIsXG4gICAgICByZWZlcmVuY2VcbiAgICB9ID0gc3RhdGUuZWxlbWVudHM7XG4gICAgY29uc3Qgcm9sZSA9IChfcG9wcGVyJGdldEF0dHJpYnV0ZSA9IHBvcHBlci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wb3BwZXIkZ2V0QXR0cmlidXRlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAocG9wcGVyLmlkICYmIHJvbGUgPT09ICd0b29sdGlwJyAmJiAnc2V0QXR0cmlidXRlJyBpbiByZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IGlkcyA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcblxuICAgICAgaWYgKGlkcyAmJiBpZHMuc3BsaXQoJywnKS5pbmRleE9mKHBvcHBlci5pZCkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVmZXJlbmNlLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcyA/IGAke2lkc30sJHtwb3BwZXIuaWR9YCA6IHBvcHBlci5pZCk7XG4gICAgfVxuICB9XG59O1xuY29uc3QgRU1QVFlfTU9ESUZJRVJTID0gW107XG4vKipcbiAqIFBvc2l0aW9uIGFuIGVsZW1lbnQgcmVsYXRpdmUgc29tZSByZWZlcmVuY2UgZWxlbWVudCB1c2luZyBQb3BwZXIuanNcbiAqXG4gKiBAcGFyYW0gcmVmZXJlbmNlRWxlbWVudFxuICogQHBhcmFtIHBvcHBlckVsZW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgIG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0PX0gICAgIG9wdGlvbnMubW9kaWZpZXJzIFBvcHBlci5qcyBtb2RpZmllcnNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19ICAgIG9wdGlvbnMuZW5hYmxlZCB0b2dnbGUgdGhlIHBvcHBlciBmdW5jdGlvbmFsaXR5IG9uL29mZlxuICogQHBhcmFtIHtzdHJpbmc9fSAgICAgb3B0aW9ucy5wbGFjZW1lbnQgVGhlIHBvcHBlciBlbGVtZW50IHBsYWNlbWVudCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gICAgIG9wdGlvbnMuc3RyYXRlZ3kgdGhlIHBvc2l0aW9uaW5nIHN0cmF0ZWd5XG4gKiBAcGFyYW0ge2Z1bmN0aW9uPX0gICBvcHRpb25zLm9uQ3JlYXRlIGNhbGxlZCB3aGVuIHRoZSBwb3BwZXIgaXMgY3JlYXRlZFxuICogQHBhcmFtIHtmdW5jdGlvbj19ICAgb3B0aW9ucy5vblVwZGF0ZSBjYWxsZWQgd2hlbiB0aGUgcG9wcGVyIGlzIHVwZGF0ZWRcbiAqXG4gKiBAcmV0dXJucyB7VXNlUG9wcGVyU3RhdGV9IFRoZSBwb3BwZXIgc3RhdGVcbiAqL1xuXG5mdW5jdGlvbiB1c2VQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgX3JlZiA9IHt9KSB7XG4gIGxldCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1vZGlmaWVycyA9IEVNUFRZX01PRElGSUVSU1xuICB9ID0gX3JlZixcbiAgICAgIGNvbmZpZyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgY29uc3QgcHJldk1vZGlmaWVycyA9IHVzZVJlZihtb2RpZmllcnMpO1xuICBjb25zdCBwb3BwZXJJbnN0YW5jZVJlZiA9IHVzZVJlZigpO1xuICBjb25zdCB1cGRhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgdmFyIF9wb3BwZXJJbnN0YW5jZVJlZiRjdTtcblxuICAgIChfcG9wcGVySW5zdGFuY2VSZWYkY3UgPSBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3BvcHBlckluc3RhbmNlUmVmJGN1LnVwZGF0ZSgpO1xuICB9LCBbXSk7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZhciBfcG9wcGVySW5zdGFuY2VSZWYkY3UyO1xuXG4gICAgKF9wb3BwZXJJbnN0YW5jZVJlZiRjdTIgPSBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3BvcHBlckluc3RhbmNlUmVmJGN1Mi5mb3JjZVVwZGF0ZSgpO1xuICB9LCBbXSk7XG4gIGNvbnN0IFtwb3BwZXJTdGF0ZSwgc2V0U3RhdGVdID0gdXNlU2FmZVN0YXRlKHVzZVN0YXRlKHtcbiAgICBwbGFjZW1lbnQsXG4gICAgdXBkYXRlLFxuICAgIGZvcmNlVXBkYXRlLFxuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIHN0eWxlczoge1xuICAgICAgcG9wcGVyOiB7fSxcbiAgICAgIGFycm93OiB7fVxuICAgIH1cbiAgfSkpO1xuICBjb25zdCB1cGRhdGVNb2RpZmllciA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBuYW1lOiAndXBkYXRlU3RhdGVNb2RpZmllcicsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBwaGFzZTogJ3dyaXRlJyxcbiAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ10sXG4gICAgZm46ICh7XG4gICAgICBzdGF0ZVxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIHN0eWxlc1tlbGVtZW50XSA9IHN0YXRlLnN0eWxlc1tlbGVtZW50XTtcbiAgICAgICAgYXR0cmlidXRlc1tlbGVtZW50XSA9IHN0YXRlLmF0dHJpYnV0ZXNbZWxlbWVudF07XG4gICAgICB9KTtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHN0eWxlcyxcbiAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgdXBkYXRlLFxuICAgICAgICBmb3JjZVVwZGF0ZSxcbiAgICAgICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIFt1cGRhdGUsIGZvcmNlVXBkYXRlLCBzZXRTdGF0ZV0pO1xuICBjb25zdCBuZXh0TW9kaWZpZXJzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFkZXF1YWwocHJldk1vZGlmaWVycy5jdXJyZW50LCBtb2RpZmllcnMpKSB7XG4gICAgICBwcmV2TW9kaWZpZXJzLmN1cnJlbnQgPSBtb2RpZmllcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZNb2RpZmllcnMuY3VycmVudDtcbiAgfSwgW21vZGlmaWVyc10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCB8fCAhZW5hYmxlZCkgcmV0dXJuO1xuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc2V0T3B0aW9ucyh7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogWy4uLm5leHRNb2RpZmllcnMsIHVwZGF0ZU1vZGlmaWVyLCBkaXNhYmxlZEFwcGx5U3R5bGVzTW9kaWZpZXJdXG4gICAgfSk7XG4gIH0sIFtzdHJhdGVneSwgcGxhY2VtZW50LCB1cGRhdGVNb2RpZmllciwgZW5hYmxlZCwgbmV4dE1vZGlmaWVyc10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCB8fCByZWZlcmVuY2VFbGVtZW50ID09IG51bGwgfHwgcG9wcGVyRWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLCB7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogWy4uLm5leHRNb2RpZmllcnMsIGFyaWFEZXNjcmliZWRCeU1vZGlmaWVyLCB1cGRhdGVNb2RpZmllcl1cbiAgICB9KSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5kZXN0cm95KCk7XG4gICAgICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHNldFN0YXRlKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcywge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgcG9wcGVyOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07IC8vIFRoaXMgaXMgb25seSBydW4gb25jZSB0byBfY3JlYXRlXyB0aGUgcG9wcGVyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZW5hYmxlZCwgcmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudF0pO1xuICByZXR1cm4gcG9wcGVyU3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVBvcHBlcjsiLCJpbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0IGxpc3RlbiBmcm9tICdkb20taGVscGVycy9saXN0ZW4nO1xuaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAcmVzdGFydC9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuY29uc3QgZXNjYXBlS2V5Q29kZSA9IDI3O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmZ1bmN0aW9uIGlzTGVmdENsaWNrRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PT0gMDtcbn1cblxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cblxuY29uc3QgZ2V0UmVmVGFyZ2V0ID0gcmVmID0+IHJlZiAmJiAoJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmKTtcblxuLyoqXG4gKiBUaGUgYHVzZVJvb3RDbG9zZWAgaG9vayByZWdpc3RlcnMgeW91ciBjYWxsYmFjayBvbiB0aGUgZG9jdW1lbnRcbiAqIHdoZW4gcmVuZGVyZWQuIFBvd2VycyB0aGUgYDxPdmVybGF5Lz5gIGNvbXBvbmVudC4gVGhpcyBpcyB1c2VkIGFjaGlldmUgbW9kYWxcbiAqIHN0eWxlIGJlaGF2aW9yIHdoZXJlIHlvdXIgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG9cbiAqIGludGVyYWN0IHdpdGggdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50IG9yIGhpdHMgdGhlIGBlc2NgIGtleS5cbiAqXG4gKiBAcGFyYW0ge1JlZjxIVE1MRWxlbWVudD58IEhUTUxFbGVtZW50fSByZWYgIFRoZSBlbGVtZW50IGJvdW5kYXJ5XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvblJvb3RDbG9zZVxuICogQHBhcmFtIHtvYmplY3Q9fSAgb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFuPX0gb3B0aW9ucy5kaXNhYmxlZFxuICogQHBhcmFtIHtzdHJpbmc9fSAgb3B0aW9ucy5jbGlja1RyaWdnZXIgVGhlIERPTSBldmVudCBuYW1lIChjbGljaywgbW91c2Vkb3duLCBldGMpIHRvIGF0dGFjaCBsaXN0ZW5lcnMgb25cbiAqL1xuZnVuY3Rpb24gdXNlUm9vdENsb3NlKHJlZiwgb25Sb290Q2xvc2UsIHtcbiAgZGlzYWJsZWQsXG4gIGNsaWNrVHJpZ2dlciA9ICdjbGljaydcbn0gPSB7fSkge1xuICBjb25zdCBwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBvbkNsb3NlID0gb25Sb290Q2xvc2UgfHwgbm9vcDtcbiAgY29uc3QgaGFuZGxlTW91c2VDYXB0dXJlID0gdXNlQ2FsbGJhY2soZSA9PiB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGdldFJlZlRhcmdldChyZWYpO1xuICAgIHdhcm5pbmcoISFjdXJyZW50VGFyZ2V0LCAnUm9vdENsb3NlIGNhcHR1cmVkIGEgY2xvc2UgZXZlbnQgYnV0IGRvZXMgbm90IGhhdmUgYSByZWYgdG8gY29tcGFyZSBpdCB0by4gJyArICd1c2VSb290Q2xvc2UoKSwgc2hvdWxkIGJlIHBhc3NlZCBhIHJlZiB0aGF0IHJlc29sdmVzIHRvIGEgRE9NIG5vZGUnKTtcbiAgICBwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYuY3VycmVudCA9ICFjdXJyZW50VGFyZ2V0IHx8IGlzTW9kaWZpZWRFdmVudChlKSB8fCAhaXNMZWZ0Q2xpY2tFdmVudChlKSB8fCAhIWNvbnRhaW5zKGN1cnJlbnRUYXJnZXQsIGUudGFyZ2V0KTtcbiAgfSwgW3JlZl0pO1xuICBjb25zdCBoYW5kbGVNb3VzZSA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKCFwcmV2ZW50TW91c2VSb290Q2xvc2VSZWYuY3VycmVudCkge1xuICAgICAgb25DbG9zZShlKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBoYW5kbGVLZXlVcCA9IHVzZUV2ZW50Q2FsbGJhY2soZSA9PiB7XG4gICAgaWYgKGUua2V5Q29kZSA9PT0gZXNjYXBlS2V5Q29kZSkge1xuICAgICAgb25DbG9zZShlKTtcbiAgICB9XG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCByZWYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBkb2MgPSBvd25lckRvY3VtZW50KGdldFJlZlRhcmdldChyZWYpKTsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgZXZlbnQgdG8gYXZvaWQgdHJpZ2dlcmluZyBoYW5kbGVycyBpbW1lZGlhdGVseVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjAwNzRcblxuICAgIGxldCBjdXJyZW50RXZlbnQgPSAoZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdykuZXZlbnQ7IC8vIFVzZSBjYXB0dXJlIGZvciB0aGlzIGxpc3RlbmVyIHNvIGl0IGZpcmVzIGJlZm9yZSBSZWFjdCdzIGxpc3RlbmVyLCB0b1xuICAgIC8vIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgY29udGFpbnMoKSBjaGVjayBiZWxvdyBpZiB0aGUgdGFyZ2V0IERPTVxuICAgIC8vIGVsZW1lbnQgaXMgcmVtb3ZlZCBpbiB0aGUgUmVhY3QgbW91c2UgY2FsbGJhY2suXG5cbiAgICBjb25zdCByZW1vdmVNb3VzZUNhcHR1cmVMaXN0ZW5lciA9IGxpc3Rlbihkb2MsIGNsaWNrVHJpZ2dlciwgaGFuZGxlTW91c2VDYXB0dXJlLCB0cnVlKTtcbiAgICBjb25zdCByZW1vdmVNb3VzZUxpc3RlbmVyID0gbGlzdGVuKGRvYywgY2xpY2tUcmlnZ2VyLCBlID0+IHtcbiAgICAgIC8vIHNraXAgaWYgdGhpcyBldmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJ1bm5pbmcgd2hlbiB3ZSBhZGRlZCB0aGUgaGFuZGxlcnNcbiAgICAgIGlmIChlID09PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgY3VycmVudEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZU1vdXNlKGUpO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlbW92ZUtleXVwTGlzdGVuZXIgPSBsaXN0ZW4oZG9jLCAna2V5dXAnLCBlID0+IHtcbiAgICAgIC8vIHNraXAgaWYgdGhpcyBldmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJ1bm5pbmcgd2hlbiB3ZSBhZGRlZCB0aGUgaGFuZGxlcnNcbiAgICAgIGlmIChlID09PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgY3VycmVudEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZUtleVVwKGUpO1xuICAgIH0pO1xuICAgIGxldCBtb2JpbGVTYWZhcmlIYWNrTGlzdGVuZXJzID0gW107XG5cbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgbW9iaWxlU2FmYXJpSGFja0xpc3RlbmVycyA9IFtdLnNsaWNlLmNhbGwoZG9jLmJvZHkuY2hpbGRyZW4pLm1hcChlbCA9PiBsaXN0ZW4oZWwsICdtb3VzZW1vdmUnLCBub29wKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlbW92ZU1vdXNlQ2FwdHVyZUxpc3RlbmVyKCk7XG4gICAgICByZW1vdmVNb3VzZUxpc3RlbmVyKCk7XG4gICAgICByZW1vdmVLZXl1cExpc3RlbmVyKCk7XG4gICAgICBtb2JpbGVTYWZhcmlIYWNrTGlzdGVuZXJzLmZvckVhY2gocmVtb3ZlID0+IHJlbW92ZSgpKTtcbiAgICB9O1xuICB9LCBbcmVmLCBkaXNhYmxlZCwgY2xpY2tUcmlnZ2VyLCBoYW5kbGVNb3VzZUNhcHR1cmUsIGhhbmRsZU1vdXNlLCBoYW5kbGVLZXlVcF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VSb290Q2xvc2U7IiwiaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVdpbmRvdyBmcm9tICcuL3VzZVdpbmRvdyc7XG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRhaW5lclJlZiA9IChyZWYsIGRvY3VtZW50KSA9PiB7XG4gIHZhciBfcmVmO1xuXG4gIGlmICghY2FuVXNlRE9NKSByZXR1cm4gbnVsbDtcbiAgaWYgKHJlZiA9PSBudWxsKSByZXR1cm4gKGRvY3VtZW50IHx8IG93bmVyRG9jdW1lbnQoKSkuYm9keTtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHJlZiA9IHJlZigpO1xuICBpZiAocmVmICYmICdjdXJyZW50JyBpbiByZWYpIHJlZiA9IHJlZi5jdXJyZW50O1xuICBpZiAoKF9yZWYgPSByZWYpICE9IG51bGwgJiYgX3JlZi5ub2RlVHlwZSkgcmV0dXJuIHJlZiB8fCBudWxsO1xuICByZXR1cm4gbnVsbDtcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VXYWl0Rm9yRE9NUmVmKHJlZiwgb25SZXNvbHZlZCkge1xuICBjb25zdCB3aW5kb3cgPSB1c2VXaW5kb3coKTtcbiAgY29uc3QgW3Jlc29sdmVkUmVmLCBzZXRSZWZdID0gdXNlU3RhdGUoKCkgPT4gcmVzb2x2ZUNvbnRhaW5lclJlZihyZWYsIHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LmRvY3VtZW50KSk7XG5cbiAgaWYgKCFyZXNvbHZlZFJlZikge1xuICAgIGNvbnN0IGVhcmx5UmVmID0gcmVzb2x2ZUNvbnRhaW5lclJlZihyZWYpO1xuICAgIGlmIChlYXJseVJlZikgc2V0UmVmKGVhcmx5UmVmKTtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9uUmVzb2x2ZWQgJiYgcmVzb2x2ZWRSZWYpIHtcbiAgICAgIG9uUmVzb2x2ZWQocmVzb2x2ZWRSZWYpO1xuICAgIH1cbiAgfSwgW29uUmVzb2x2ZWQsIHJlc29sdmVkUmVmXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbmV4dFJlZiA9IHJlc29sdmVDb250YWluZXJSZWYocmVmKTtcblxuICAgIGlmIChuZXh0UmVmICE9PSByZXNvbHZlZFJlZikge1xuICAgICAgc2V0UmVmKG5leHRSZWYpO1xuICAgIH1cbiAgfSwgW3JlZiwgcmVzb2x2ZWRSZWZdKTtcbiAgcmV0dXJuIHJlc29sdmVkUmVmO1xufSIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5jb25zdCBDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQoY2FuVXNlRE9NID8gd2luZG93IDogdW5kZWZpbmVkKTtcbmV4cG9ydCBjb25zdCBXaW5kb3dQcm92aWRlciA9IENvbnRleHQuUHJvdmlkZXI7XG4vKipcbiAqIFRoZSBkb2N1bWVudCBcIndpbmRvd1wiIHBsYWNlZCBpbiBSZWFjdCBjb250ZXh0LiBIZWxwZnVsIGZvciBkZXRlcm1pbmluZ1xuICogU1NSIGNvbnRleHQsIG9yIHdoZW4gcmVuZGVyaW5nIGludG8gYW4gaWZyYW1lLlxuICpcbiAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHdpbmRvd1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdpbmRvdygpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoQ29udGV4dCk7XG59IiwiaW1wb3J0IHVzZUNhbGxiYWNrUmVmIGZyb20gJy4vdXNlQ2FsbGJhY2tSZWYnO1xuaW1wb3J0IHVzZUNvbW1pdHRlZFJlZiBmcm9tICcuL3VzZUNvbW1pdHRlZFJlZic7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICcuL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmltcG9ydCB1c2VHbG9iYWxMaXN0ZW5lciBmcm9tICcuL3VzZUdsb2JhbExpc3RlbmVyJztcbmltcG9ydCB1c2VJbnRlcnZhbCBmcm9tICcuL3VzZUludGVydmFsJztcbmltcG9ydCB1c2VSYWZJbnRlcnZhbCBmcm9tICcuL3VzZVJhZkludGVydmFsJztcbmltcG9ydCB1c2VNZXJnZVN0YXRlIGZyb20gJy4vdXNlTWVyZ2VTdGF0ZSc7XG5pbXBvcnQgdXNlTWVyZ2VTdGF0ZUZyb21Qcm9wcyBmcm9tICcuL3VzZU1lcmdlU3RhdGVGcm9tUHJvcHMnO1xuaW1wb3J0IHVzZU1vdW50ZWQgZnJvbSAnLi91c2VNb3VudGVkJztcbmltcG9ydCB1c2VQcmV2aW91cyBmcm9tICcuL3VzZVByZXZpb3VzJztcbmltcG9ydCB1c2VJbWFnZSBmcm9tICcuL3VzZUltYWdlJztcbmltcG9ydCB1c2VSZXNpemVPYnNlcnZlciBmcm9tICcuL3VzZVJlc2l6ZU9ic2VydmVyJztcbmV4cG9ydCB7IHVzZUNhbGxiYWNrUmVmLCB1c2VDb21taXR0ZWRSZWYsIHVzZUV2ZW50Q2FsbGJhY2ssIHVzZUV2ZW50TGlzdGVuZXIsIHVzZUdsb2JhbExpc3RlbmVyLCB1c2VJbnRlcnZhbCwgdXNlUmFmSW50ZXJ2YWwsIHVzZU1lcmdlU3RhdGUsIHVzZU1lcmdlU3RhdGVGcm9tUHJvcHMsIHVzZU1vdW50ZWQsIHVzZVByZXZpb3VzLCB1c2VJbWFnZSwgdXNlUmVzaXplT2JzZXJ2ZXIgfTsiLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQSBjb252ZW5pZW5jZSBob29rIGFyb3VuZCBgdXNlU3RhdGVgIGRlc2lnbmVkIHRvIGJlIHBhaXJlZCB3aXRoXG4gKiB0aGUgY29tcG9uZW50IFtjYWxsYmFjayByZWZdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwjY2FsbGJhY2stcmVmcykgYXBpLlxuICogQ2FsbGJhY2sgcmVmcyBhcmUgdXNlZnVsIG92ZXIgYHVzZVJlZigpYCB3aGVuIHlvdSBuZWVkIHRvIHJlc3BvbmQgdG8gdGhlIHJlZiBiZWluZyBzZXRcbiAqIGluc3RlYWQgb2YgbGF6aWx5IGFjY2Vzc2luZyBpdCBpbiBhbiBlZmZlY3QuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtlbGVtZW50LCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWY8SFRNTERpdkVsZW1lbnQ+KClcbiAqXG4gKiB1c2VFZmZlY3QoKCkgPT4ge1xuICogICBpZiAoIWVsZW1lbnQpIHJldHVyblxuICpcbiAqICAgY29uc3QgY2FsZW5kYXIgPSBuZXcgRnVsbENhbGVuZGFyLkNhbGVuZGFyKGVsZW1lbnQpXG4gKlxuICogICByZXR1cm4gKCkgPT4ge1xuICogICAgIGNhbGVuZGFyLmRlc3Ryb3koKVxuICogICB9XG4gKiB9LCBbZWxlbWVudF0pXG4gKlxuICogcmV0dXJuIDxkaXYgcmVmPXthdHRhY2hSZWZ9IC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgcmVmc1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKCkge1xuICByZXR1cm4gdXNlU3RhdGUobnVsbCk7XG59IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIENyZWF0ZXMgYSBgUmVmYCB3aG9zZSB2YWx1ZSBpcyB1cGRhdGVkIGluIGFuIGVmZmVjdCwgZW5zdXJpbmcgdGhlIG1vc3QgcmVjZW50XG4gKiB2YWx1ZSBpcyB0aGUgb25lIHJlbmRlcmVkIHdpdGguIEdlbmVyYWxseSBvbmx5IHJlcXVpcmVkIGZvciBDb25jdXJyZW50IG1vZGUgdXNhZ2VcbiAqIHdoZXJlIHByZXZpb3VzIHdvcmsgaW4gYHJlbmRlcigpYCBtYXkgYmUgZGlzY2FyZGVkIGJlZm9yZSBiZWluZyB1c2VkLlxuICpcbiAqIFRoaXMgaXMgc2FmZSB0byBhY2Nlc3MgaW4gYW4gZXZlbnQgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGBSZWZgIHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29tbWl0dGVkUmVmKHZhbHVlKSB7XG4gIHZhciByZWYgPSB1c2VSZWYodmFsdWUpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcmVmO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb21taXR0ZWRSZWY7IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJy4vdXNlQ29tbWl0dGVkUmVmJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUV2ZW50Q2FsbGJhY2soZm4pIHtcbiAgdmFyIHJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7XG4gIHJldHVybiB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ICYmIHJlZi5jdXJyZW50LmFwcGx5KHJlZiwgYXJndW1lbnRzKTtcbiAgfSwgW3JlZl0pO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJy4vdXNlRXZlbnRDYWxsYmFjayc7XG5cbi8qKlxuICogQXR0YWNoZXMgYW4gZXZlbnQgaGFuZGxlciBvdXRzaWRlIGRpcmVjdGx5IHRvIHNwZWNpZmllZCBET00gZWxlbWVudFxuICogYnlwYXNzaW5nIHRoZSByZWFjdCBzeW50aGV0aWMgZXZlbnQgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSB0YXJnZXQgdG8gbGlzdGVuIGZvciBldmVudHMgb25cbiAqIEBwYXJhbSBldmVudCBUaGUgRE9NIGV2ZW50IG5hbWVcbiAqIEBwYXJhbSBoYW5kbGVyIEFuIGV2ZW50IGhhbmRsZXJcbiAqIEBwYXJhbSBjYXB0dXJlIFdoZXRoZXIgb3Igbm90IHRvIGxpc3RlbiBkdXJpbmcgdGhlIGNhcHR1cmUgZXZlbnQgcGhhc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lcihldmVudFRhcmdldCwgZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG4gIGlmIChjYXB0dXJlID09PSB2b2lkIDApIHtcbiAgICBjYXB0dXJlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IHVzZUV2ZW50Q2FsbGJhY2sobGlzdGVuZXIpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSB0eXBlb2YgZXZlbnRUYXJnZXQgPT09ICdmdW5jdGlvbicgPyBldmVudFRhcmdldCgpIDogZXZlbnRUYXJnZXQ7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIH07XG4gIH0sIFtldmVudFRhcmdldF0pO1xufSIsImltcG9ydCB7IHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIGEgY29tcG9uZW50IHVwZGF0ZS4gdGhlIGhvb2sgZXF1aXZhbGVudCB0b1xuICogYHRoaXMuZm9yY2VVcGRhdGUoKWAgaW4gYSBjbGFzcyBjb21wb25lbnQuIEluIG1vc3QgY2FzZXMgdXNpbmcgYSBzdGF0ZSB2YWx1ZSBkaXJlY3RseVxuICogaXMgcHJlZmVyYWJsZSBidXQgbWF5IGJlIHJlcXVpcmVkIGluIHNvbWUgYWR2YW5jZWQgdXNhZ2VzIG9mIHJlZnMgZm9yIGludGVyb3Agb3JcbiAqIHdoZW4gZGlyZWN0IERPTSBtYW5pcHVsYXRpb24gaXMgcmVxdWlyZWQuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGZvcmNlVXBkYXRlID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAqXG4gKiBjb25zdCB1cGRhdGVPbkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICogIGZvcmNlVXBkYXRlKClcbiAqIH0sIFtmb3JjZVVwZGF0ZV0pXG4gKlxuICogcmV0dXJuIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3VwZGF0ZU9uQ2xpY2t9PkhpIHRoZXJlPC9idXR0b24+XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgLy8gVGhlIHRvZ2dsaW5nIHN0YXRlIHZhbHVlIGlzIGRlc2lnbmVkIHRvIGRlZmVhdCBSZWFjdCBvcHRpbWl6YXRpb25zIGZvciBza2lwcGluZ1xuICAvLyB1cGRhdGVzIHdoZW4gdGhleSBhcmUgc3RyaWN0aW5nIGVxdWFsIHRvIHRoZSBsYXN0IHN0YXRlIHZhbHVlXG4gIHZhciBfdXNlUmVkdWNlciA9IHVzZVJlZHVjZXIoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgcmV0dXJuICFzdGF0ZTtcbiAgfSwgZmFsc2UpLFxuICAgICAgZGlzcGF0Y2ggPSBfdXNlUmVkdWNlclsxXTtcblxuICByZXR1cm4gZGlzcGF0Y2g7XG59IiwiaW1wb3J0IHVzZUV2ZW50TGlzdGVuZXIgZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIEF0dGFjaGVzIGFuIGV2ZW50IGhhbmRsZXIgb3V0c2lkZSBkaXJlY3RseSB0byB0aGUgYGRvY3VtZW50YCxcbiAqIGJ5cGFzc2luZyB0aGUgcmVhY3Qgc3ludGhldGljIGV2ZW50IHN5c3RlbS5cbiAqXG4gKiBgYGB0c1xuICogdXNlR2xvYmFsTGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAqICBjb25zb2xlLmxvZyhldmVudC5rZXkpXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBET00gZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZXIgQW4gZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIGNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gbGlzdGVuIGR1cmluZyB0aGUgY2FwdHVyZSBldmVudCBwaGFzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VHbG9iYWxMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgY2FwdHVyZSkge1xuICBpZiAoY2FwdHVyZSA9PT0gdm9pZCAwKSB7XG4gICAgY2FwdHVyZSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGRvY3VtZW50VGFyZ2V0ID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfSwgW10pO1xuICByZXR1cm4gdXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudFRhcmdldCwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xufSIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogRmV0Y2ggYW5kIGxvYWQgYW4gaW1hZ2UgZm9yIHByb2dyYW1hdGljIHVzZSBzdWNoIGFzIGluIGEgYDxjYW52YXM+YCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBpbWFnZU9yVXJsIFRoZSBgSHRtbEltYWdlRWxlbWVudGAgb3IgaW1hZ2UgdXJsIHRvIGxvYWRcbiAqIEBwYXJhbSBjcm9zc09yaWdpbiBUaGUgYGNyb3Nzb3JpZ2luYCBhdHRyaWJ1dGUgdG8gc2V0XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgaW1hZ2UsIGVycm9yIH0gPSB1c2VJbWFnZSgnL3N0YXRpYy9raXR0ZW5zLnBuZycpXG4gKiBjb25zdCByZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KClcbiAqXG4gKiB1c2VFZmZlY3QoKCkgPT4ge1xuICogICBjb25zdCBjdHggPSByZWYuY3VycmVudC5nZXRDb250ZXh0KCcyZCcpXG4gKlxuICogICBpZiAoaW1hZ2UpIHtcbiAqICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKVxuICogICB9XG4gKiB9LCBbcmVmLCBpbWFnZV0pXG4gKlxuICogcmV0dXJuIChcbiAqICAgPD5cbiAqICAgICB7ZXJyb3IgJiYgXCJ0aGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIGltYWdlXCJ9XG4gKiAgICAgPGNhbnZhcyByZWY9e3JlZn0gLz5cbiAqICAgPC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlSW1hZ2UoaW1hZ2VPclVybCwgY3Jvc3NPcmlnaW4pIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHtcbiAgICBpbWFnZTogbnVsbCxcbiAgICBlcnJvcjogbnVsbFxuICB9KSxcbiAgICAgIHN0YXRlID0gX3VzZVN0YXRlWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfdXNlU3RhdGVbMV07XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWltYWdlT3JVcmwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmFyIGltYWdlO1xuXG4gICAgaWYgKHR5cGVvZiBpbWFnZU9yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGlmIChjcm9zc09yaWdpbikgaW1hZ2UuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcbiAgICAgIGltYWdlLnNyYyA9IGltYWdlT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGltYWdlID0gaW1hZ2VPclVybDtcblxuICAgICAgaWYgKGltYWdlLmNvbXBsZXRlICYmIGltYWdlLm5hdHVyYWxIZWlnaHQgPiAwKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZTogaW1hZ2UsXG4gICAgICAgICAgZXJyb3I6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkxvYWQoKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGltYWdlOiBpbWFnZSxcbiAgICAgICAgZXJyb3I6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgaW1hZ2U6IGltYWdlLFxuICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICB9O1xuICB9LCBbaW1hZ2VPclVybCwgY3Jvc3NPcmlnaW5dKTtcbiAgcmV0dXJuIHN0YXRlO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb21taXR0ZWRSZWYgZnJvbSAnLi91c2VDb21taXR0ZWRSZWYnO1xuLyoqXG4gKiBDcmVhdGVzIGEgYHNldEludGVydmFsYCB0aGF0IGlzIHByb3Blcmx5IGNsZWFuZWQgdXAgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50ZWRcbiAqXG4gKiBgYGB0c3hcbiAqICBmdW5jdGlvbiBUaW1lcigpIHtcbiAqICAgIGNvbnN0IFt0aW1lciwgc2V0VGltZXJdID0gdXNlU3RhdGUoMClcbiAqICAgIHVzZUludGVydmFsKCgpID0+IHNldFRpbWVyKGkgPT4gaSArIDEpLCAxMDAwKVxuICpcbiAqICAgIHJldHVybiA8c3Bhbj57dGltZXJ9IHNlY29uZHMgcGFzdDwvc3Bhbj5cbiAqICB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZm4gYW4gZnVuY3Rpb24gcnVuIG9uIGVhY2ggaW50ZXJ2YWxcbiAqIEBwYXJhbSBtcyBUaGUgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIG9mIHRoZSBpbnRlcnZhbFxuICovXG5cbmZ1bmN0aW9uIHVzZUludGVydmFsKGZuLCBtcywgcGF1c2VkLCBydW5JbW1lZGlhdGVseSkge1xuICBpZiAocGF1c2VkID09PSB2b2lkIDApIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChydW5JbW1lZGlhdGVseSA9PT0gdm9pZCAwKSB7XG4gICAgcnVuSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBoYW5kbGU7XG4gIHZhciBmblJlZiA9IHVzZUNvbW1pdHRlZFJlZihmbik7IC8vIHRoaXMgcmVmIGlzIG5lY2Vzc2FyeSBiL2MgdXNlRWZmZWN0IHdpbGwgc29tZXRpbWVzIG1pc3MgYSBwYXVzZWQgdG9nZ2xlXG4gIC8vIG9ycGhhbmluZyBhIHNldFRpbWVvdXQgY2hhaW4gaW4gdGhlIGFldGhlciwgc28gcmVseWluZyBvbiBpdCdzIHJlZnJlc2ggbG9naWMgaXMgbm90IHJlbGlhYmxlLlxuXG4gIHZhciBwYXVzZWRSZWYgPSB1c2VDb21taXR0ZWRSZWYocGF1c2VkKTtcblxuICB2YXIgdGljayA9IGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgaWYgKHBhdXNlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgZm5SZWYuY3VycmVudCgpO1xuICAgIHNjaGVkdWxlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgfTtcblxuICB2YXIgc2NoZWR1bGUgPSBmdW5jdGlvbiBzY2hlZHVsZSgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSBzZXRUaW1lb3V0KHRpY2ssIG1zKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChydW5JbW1lZGlhdGVseSkge1xuICAgICAgdGljaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgfTtcbiAgfSwgW3BhdXNlZCwgcnVuSW1tZWRpYXRlbHldKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlSW50ZXJ2YWw7IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG52YXIgaXNSZWFjdE5hdGl2ZSA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIC8vIEB0cy1pZ25vcmVcbmdsb2JhbC5uYXZpZ2F0b3IgJiYgLy8gQHRzLWlnbm9yZVxuZ2xvYmFsLm5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnO1xudmFyIGlzRE9NID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbi8qKlxuICogSXMgYHVzZUxheW91dEVmZmVjdGAgaW4gYSBET00gb3IgUmVhY3QgTmF0aXZlIGVudmlyb25tZW50LCBvdGhlcndpc2UgcmVzb2x2ZXMgdG8gdXNlRWZmZWN0XG4gKiBPbmx5IHVzZWZ1bCB0byBhdm9pZCB0aGUgY29uc29sZSB3YXJuaW5nLlxuICpcbiAqIFBSRUZFUiBgdXNlRWZmZWN0YCBVTkxFU1MgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HLlxuICpcbiAqIEBjYXRlZ29yeSBlZmZlY3RzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgaXNET00gfHwgaXNSZWFjdE5hdGl2ZSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogTWltaWNzIGEgUmVhY3QgY2xhc3MgY29tcG9uZW50J3Mgc3RhdGUgbW9kZWwsIG9mIGhhdmluZyBhIHNpbmdsZSB1bmlmaWVkXG4gKiBgc3RhdGVgIG9iamVjdCBhbmQgYW4gdXBkYXRlciB0aGF0IG1lcmdlcyB1cGRhdGVzIGludG8gdGhlIGV4aXN0aW5nIHN0YXRlLCBhc1xuICogb3Bwb3NlZCB0byByZXBsYWNpbmcgaXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlTWVyZ2VTdGF0ZSh7IG5hbWU6ICdCZXRzeScsIGFnZTogMjQgfSlcbiAqXG4gKiBzZXRTdGF0ZSh7IG5hbWU6ICdKb2hhbicgfSkgLy8geyBuYW1lOiAnSm9oYW4nLCBhZ2U6IDI0IH1cbiAqXG4gKiBzZXRTdGF0ZShzdGF0ZSA9PiAoeyBhZ2U6IHN0YXRlLmFnZSArIDEwIH0pKSAvLyB7IG5hbWU6ICdKb2hhbicsIGFnZTogMzQgfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGluaXRpYWxTdGF0ZSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTWVyZ2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgICBzdGF0ZSA9IF91c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX3VzZVN0YXRlWzFdO1xuXG4gIHZhciB1cGRhdGVyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHJldHVybjtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHVwZGF0ZShzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXh0U3RhdGUgPT0gbnVsbCA/IHN0YXRlIDogX2V4dGVuZHMoe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB1cGRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2V0U3RhdGVdKTtcbiAgcmV0dXJuIFtzdGF0ZSwgdXBkYXRlcl07XG59IiwiaW1wb3J0IHVzZU1lcmdlU3RhdGUgZnJvbSAnLi91c2VNZXJnZVN0YXRlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU1lcmdlU3RhdGVGcm9tUHJvcHMocHJvcHMsIGdEU0ZQLCBpbml0aWFsU3RhdGUpIHtcbiAgdmFyIF91c2VNZXJnZVN0YXRlID0gdXNlTWVyZ2VTdGF0ZShpbml0aWFsU3RhdGUpLFxuICAgICAgc3RhdGUgPSBfdXNlTWVyZ2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX3VzZU1lcmdlU3RhdGVbMV07XG5cbiAgdmFyIG5leHRTdGF0ZSA9IGdEU0ZQKHByb3BzLCBzdGF0ZSk7XG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHNldFN0YXRlKG5leHRTdGF0ZSk7XG4gIHJldHVybiBbc3RhdGUsIHNldFN0YXRlXTtcbn0iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG52YXIgdG9GblJlZiA9IGZ1bmN0aW9uIHRvRm5SZWYocmVmKSB7XG4gIHJldHVybiAhcmVmIHx8IHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicgPyByZWYgOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUmVmcyhyZWZBLCByZWZCKSB7XG4gIHZhciBhID0gdG9GblJlZihyZWZBKTtcbiAgdmFyIGIgPSB0b0ZuUmVmKHJlZkIpO1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKGEpIGEodmFsdWUpO1xuICAgIGlmIChiKSBiKHZhbHVlKTtcbiAgfTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm5zIGEgc2luZ2xlIGNhbGxiYWNrIHJlZiBjb21wb3NlZCBmcm9tIHR3byBvdGhlciBSZWZzLlxuICpcbiAqIGBgYHRzeFxuICogY29uc3QgQnV0dG9uID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICogICBjb25zdCBbZWxlbWVudCwgYXR0YWNoUmVmXSA9IHVzZUNhbGxiYWNrUmVmPEhUTUxCdXR0b25FbGVtZW50PigpO1xuICogICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWZzKHJlZiwgYXR0YWNoUmVmKTtcbiAqXG4gKiAgIHJldHVybiA8YnV0dG9uIHJlZj17bWVyZ2VkUmVmfSB7Li4ucHJvcHN9Lz5cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVmQSBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAcGFyYW0gcmVmQiBBIENhbGxiYWNrIG9yIG11dGFibGUgUmVmXG4gKiBAY2F0ZWdvcnkgcmVmc1xuICovXG5cbmZ1bmN0aW9uIHVzZU1lcmdlZFJlZnMocmVmQSwgcmVmQikge1xuICByZXR1cm4gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG1lcmdlUmVmcyhyZWZBLCByZWZCKTtcbiAgfSwgW3JlZkEsIHJlZkJdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlTWVyZ2VkUmVmczsiLCJpbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogVHJhY2sgd2hldGhlciBhIGNvbXBvbmVudCBpcyBjdXJyZW50IG1vdW50ZWQuIEdlbmVyYWxseSBsZXNzIHByZWZlcmFibGUgdGhhblxuICogcHJvcGVybGx5IGNhbmNlbGluZyBlZmZlY3RzIHNvIHRoZXkgZG9uJ3QgcnVuIGFmdGVyIGEgY29tcG9uZW50IGlzIHVubW91bnRlZCxcbiAqIGJ1dCBoZWxwZnVsIGluIGNhc2VzIHdoZXJlIHRoYXQgaXNuJ3QgZmVhc2libGUsIHN1Y2ggYXMgYSBgUHJvbWlzZWAgcmVzb2x1dGlvbi5cbiAqXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpc01vdW50ZWQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudFxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSB1c2VTdGF0ZShudWxsKVxuICogY29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpXG4gKlxuICogdXNlRWZmZWN0KCgpID0+IHtcbiAqICAgZmV0Y2hkYXRhKCkudGhlbigobmV3RGF0YSkgPT4ge1xuICogICAgICBpZiAoaXNNb3VudGVkKCkpIHtcbiAqICAgICAgICBzZXREYXRhKG5ld0RhdGEpO1xuICogICAgICB9XG4gKiAgIH0pXG4gKiB9KVxuICogYGBgXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW91bnRlZCgpIHtcbiAgdmFyIG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG4gIHZhciBpc01vdW50ZWQgPSB1c2VSZWYoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtb3VudGVkLmN1cnJlbnQ7XG4gIH0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBpc01vdW50ZWQuY3VycmVudDtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogU3RvcmUgdGhlIGxhc3Qgb2Ygc29tZSB2YWx1ZS4gVHJhY2tlZCB2aWEgYSBgUmVmYCBvbmx5IHVwZGF0aW5nIGl0XG4gKiBhZnRlciB0aGUgY29tcG9uZW50IHJlbmRlcnMuXG4gKlxuICogSGVscGZ1bCBpZiB5b3UgbmVlZCB0byBjb21wYXJlIGEgcHJvcCB2YWx1ZSB0byBpdCdzIHByZXZpb3VzIHZhbHVlIGR1cmluZyByZW5kZXIuXG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcykge1xuICogICBjb25zdCBsYXN0UHJvcHMgPSB1c2VQcmV2aW91cyhwcm9wcylcbiAqXG4gKiAgIGlmIChsYXN0UHJvcHMuZm9vICE9PSBwcm9wcy5mb28pXG4gKiAgICAgcmVzZXRWYWx1ZUZyb21Qcm9wcyhwcm9wcy5mb28pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHRyYWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUHJldmlvdXModmFsdWUpIHtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZi5jdXJyZW50O1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VDb21taXR0ZWRSZWYgZnJvbSAnLi91c2VDb21taXR0ZWRSZWYnO1xuXG5mdW5jdGlvbiB1c2VSYWZJbnRlcnZhbChmbiwgbXMsIHBhdXNlZCkge1xuICBpZiAocGF1c2VkID09PSB2b2lkIDApIHtcbiAgICBwYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBoYW5kbGU7XG4gIHZhciBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB2YXIgZm5SZWYgPSB1c2VDb21taXR0ZWRSZWYoZm4pOyAvLyB0aGlzIHJlZiBpcyBuZWNlc3NhcnkgYi9jIHVzZUVmZmVjdCB3aWxsIHNvbWV0aW1lcyBtaXNzIGEgcGF1c2VkIHRvZ2dsZVxuICAvLyBvcnBoYW5pbmcgYSBzZXRUaW1lb3V0IGNoYWluIGluIHRoZSBhZXRoZXIsIHNvIHJlbHlpbmcgb24gaXQncyByZWZyZXNoIGxvZ2ljIGlzIG5vdCByZWxpYWJsZS5cblxuICB2YXIgcGF1c2VkUmVmID0gdXNlQ29tbWl0dGVkUmVmKHBhdXNlZCk7XG5cbiAgZnVuY3Rpb24gbG9vcCgpIHtcbiAgICB2YXIgY3VycmVudCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHZhciBkZWx0YSA9IGN1cnJlbnQgLSBzdGFydDtcbiAgICBpZiAocGF1c2VkUmVmLmN1cnJlbnQpIHJldHVybjtcblxuICAgIGlmIChkZWx0YSA+PSBtcyAmJiBmblJlZi5jdXJyZW50KSB7XG4gICAgICBmblJlZi5jdXJyZW50KCk7XG4gICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7XG4gICAgaGFuZGxlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApO1xuICB9XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBoYW5kbGUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpO1xuICAgIH07XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlUmFmSW50ZXJ2YWw7IiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRWZmZWN0IGZyb20gJy4vdXNlSXNvbW9ycGhpY0VmZmVjdCc7XG52YXIgdGFyZ2V0TWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciByZXNpemVPYnNlcnZlcjtcblxuZnVuY3Rpb24gZ2V0UmVzaXplT2JzZXJ2ZXIoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXR1cm4tYXNzaWduXG4gIHJldHVybiByZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyIHx8IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICB2YXIgaGFuZGxlciA9IHRhcmdldE1hcC5nZXQoZW50cnkudGFyZ2V0KTtcbiAgICAgIGlmIChoYW5kbGVyKSBoYW5kbGVyKGVudHJ5LmNvbnRlbnRSZWN0KTtcbiAgICB9KTtcbiAgfSk7XG59XG4vKipcbiAqIEVmZmljaWVudGx5IG9ic2VydmUgc2l6ZSBjaGFuZ2VzIG9uIGFuIGVsZW1lbnQuIERlcGVuZHMgb24gdGhlIGBSZXNpemVPYnNlcnZlcmAgYXBpLFxuICogYW5kIHBvbHlmaWxscyBhcmUgbmVlZGVkIGluIG9sZGVyIGJyb3dzZXJzLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBbcmVmLCBhdHRhY2hSZWZdID0gdXNlQ2FsbGJhY2tSZWYobnVsbCk7XG4gKlxuICogY29uc3QgcmVjdCA9IHVzZVJlc2l6ZU9ic2VydmVyKHJlZik7XG4gKlxuICogcmV0dXJuIChcbiAqICA8ZGl2IHJlZj17YXR0YWNoUmVmfT5cbiAqICAgIHtKU09OLnN0cmluZ2lmeShyZWN0KX1cbiAqICA8L2Rpdj5cbiAqIClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZXNpemVPYnNlcnZlcihlbGVtZW50KSB7XG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZShudWxsKSxcbiAgICAgIHJlY3QgPSBfdXNlU3RhdGVbMF0sXG4gICAgICBzZXRSZWN0ID0gX3VzZVN0YXRlWzFdO1xuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgZ2V0UmVzaXplT2JzZXJ2ZXIoKS5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIHNldFJlY3QoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgdGFyZ2V0TWFwLnNldChlbGVtZW50LCBmdW5jdGlvbiAocmVjdCkge1xuICAgICAgc2V0UmVjdChyZWN0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdGFyZ2V0TWFwLmRlbGV0ZShlbGVtZW50KTtcbiAgICB9O1xuICB9LCBbZWxlbWVudF0pO1xuICByZXR1cm4gcmVjdDtcbn0iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNb3VudGVkIGZyb20gJy4vdXNlTW91bnRlZCc7XG5cbmZ1bmN0aW9uIHVzZVNhZmVTdGF0ZShzdGF0ZSkge1xuICB2YXIgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuICByZXR1cm4gW3N0YXRlWzBdLCB1c2VDYWxsYmFjayhmdW5jdGlvbiAobmV4dFN0YXRlKSB7XG4gICAgaWYgKCFpc01vdW50ZWQoKSkgcmV0dXJuO1xuICAgIHJldHVybiBzdGF0ZVsxXShuZXh0U3RhdGUpO1xuICB9LCBbaXNNb3VudGVkLCBzdGF0ZVsxXV0pXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlU2FmZVN0YXRlOyIsImltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmV0dXJucyBhIHJlZiB0aGF0IGlzIGltbWVkaWF0ZWx5IHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHZhbHVlXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBSZWYgdmFsdWVcbiAqIEBjYXRlZ29yeSByZWZzXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVXBkYXRlZFJlZih2YWx1ZSkge1xuICB2YXIgdmFsdWVSZWYgPSB1c2VSZWYodmFsdWUpO1xuICB2YWx1ZVJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZVJlZjtcbn0iLCJpbXBvcnQgdXNlVXBkYXRlZFJlZiBmcm9tICcuL3VzZVVwZGF0ZWRSZWYnO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBBdHRhY2ggYSBjYWxsYmFjayB0aGF0IGZpcmVzIHdoZW4gYSBjb21wb25lbnQgdW5tb3VudHNcbiAqXG4gKiBAcGFyYW0gZm4gSGFuZGxlciB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXG4gKiBAY2F0ZWdvcnkgZWZmZWN0c1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVdpbGxVbm1vdW50KGZuKSB7XG4gIHZhciBvblVubW91bnQgPSB1c2VVcGRhdGVkUmVmKGZuKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uVW5tb3VudC5jdXJyZW50KCk7XG4gICAgfTtcbiAgfSwgW10pO1xufSIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiLyohXG4gIENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iLCJleHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvRGVlcExpbmtzL0RlZXBMaW5rSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvRGVlcExpbmtzL1JvdXRlRGVlcExpbmtIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2xpZW50L0FwcC9Ib29rcyc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZUFuaW1hdGlvbi9DbGFzc1NpdGVBbmltYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vRGVmYXVsdFNpdGVBbmltYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvQXBwL1NpdGVBbmltYXRpb24vU2l0ZUFuaW1hdGlvbkludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZUlkQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9BcHAvU2l0ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvRGV2aWNlUmVhZHknO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvTmF0aXZlU3RvcmFnZVByb21pc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9GaW5pc2hTaXRlTGluayc7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9TaXRlL1NpdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9TaXRlQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2xpZW50L1NpdGUvU2l0ZUxpbmsnO1xuZXhwb3J0ICogZnJvbSAnLi9jbGllbnQvU2l0ZS9Ub3BCYXIvQmFja0J1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL2NsaWVudC9TaXRlL1RvcEJhci9Ub3BCYXInO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZXBMaW5rSGFuZGxlci5qcy5tYXAiLCJ2YXIgUm91dGVEZWVwTGlua0hhbmRsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUm91dGVEZWVwTGlua0hhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuZGVlcExpbmtzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJldmVyc2VEZWVwTGlua3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSAnJztcbiAgICB9XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlTWF0Y2ggPSBmdW5jdGlvbiAoZGVlcExpbmssIGxpbmtQYXJ0cykge1xuICAgICAgICB2YXIgZGVlcExpbmtQYXJ0cyA9IGRlZXBMaW5rLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChkZWVwTGlua1BhcnRzLmxlbmd0aCA+IGxpbmtQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWF0Y2hlcyA9IGRlZXBMaW5rUGFydHMuZXZlcnkoZnVuY3Rpb24gKHBhcnQsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydC5zdGFydHNXaXRoKCc6JykgfHwgcGFydCA9PT0gbGlua1BhcnRzW2luZGV4XTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGlua1BhcnRzLmxlbmd0aCAtIGRlZXBMaW5rUGFydHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLmV4dHJhY3RQYXJhbXMgPSBmdW5jdGlvbiAoZGVlcExpbmtQYXJ0cywgbGlua1BhcnRzLCBxdWVyeSkge1xuICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydHMgPSBxdWVyeS5zcGxpdCgnJicpO1xuICAgICAgICAgICAgcXVlcnlQYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeVBhcnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBxdWVyeVBhcnQuc3BsaXQoJz0nKSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICAgICAga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWVwTGlua1BhcnRzLnJlZHVjZShmdW5jdGlvbiAocGFyYW1PYmplY3QsIHBhcnQsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBwYXJhbU9iamVjdFtwYXJ0LnN1YnN0cigxKV0gPSBsaW5rUGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtT2JqZWN0O1xuICAgICAgICB9LCBwYXJhbXMpO1xuICAgIH07XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIucHJvdG90eXBlLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZSA9IGZ1bmN0aW9uIChzaXRlLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJldmVyc2VEZWVwTGlua3MuaGFzKHNpdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZ1bGxMaW5rID0gdGhpcy5yZXZlcnNlRGVlcExpbmtzLmdldChzaXRlKTtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gZnVsbExpbmsuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIHZhciBwYXJhbUtleXNfMSA9IE9iamVjdC5rZXlzKHBhcmFtcyk7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhcnRzLnJlZHVjZShmdW5jdGlvbiAobGluaywgcGFydCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsTmFtZSA9IHBhcnQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5SW5kZXggPSBwYXJhbUtleXNfMS5pbmRleE9mKHZhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUtleXNfMS5zcGxpY2Uoa2V5SW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsgKyBcIi9cIiArIHBhcmFtc1t2YWxOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rICsgXCIvXCIgKyBwYXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBhcmFtS2V5c18xLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIHRoaXMuYmFzZVBhdGggKyBwYXRoICsgXCI/XCIgKyBwYXJhbUtleXNfMVxuICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXNba2V5XSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zW2tleV0gPyBlbmNvZGVVUklDb21wb25lbnQoa2V5KSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trZXldKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVBhdGggKyBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VQYXRoICsgZnVsbExpbms7XG4gICAgfTtcbiAgICBSb3V0ZURlZXBMaW5rSGFuZGxlci5wcm90b3R5cGUuY2FsY3VsYXRlU2l0ZSA9IGZ1bmN0aW9uIChmdWxsTGluaykge1xuICAgICAgICB2YXIgbGluayA9IGZ1bGxMaW5rO1xuICAgICAgICBpZiAoZnVsbExpbmsuc3RhcnRzV2l0aCh0aGlzLmJhc2VQYXRoKSkge1xuICAgICAgICAgICAgbGluayA9IGZ1bGxMaW5rLnN1YnN0cih0aGlzLmJhc2VQYXRoLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gbGluay5zcGxpdCgnPycpLCBwYXRoUGFydCA9IF9hWzBdLCBxdWVyeVBhcnQgPSBfYVsxXTtcbiAgICAgICAgdmFyIHBhcnRzID0gcGF0aFBhcnQuc3BsaXQoJy8nKTtcbiAgICAgICAgdmFyIGNsb3Nlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIHNjb3JlOiBJbmZpbml0eSxcbiAgICAgICAgICAgIGxpbms6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWVwTGlua3MuZm9yRWFjaChmdW5jdGlvbiAoX3NpdGUsIGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgICB2YXIgbGlua1Njb3JlID0gUm91dGVEZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlTWF0Y2goY3VycmVudExpbmssIHBhcnRzKTtcbiAgICAgICAgICAgIGlmIChsaW5rU2NvcmUgPj0gMCAmJiBsaW5rU2NvcmUgPCBjbG9zZXN0TWF0Y2guc2NvcmUpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0TWF0Y2guc2NvcmUgPSBsaW5rU2NvcmU7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE1hdGNoLmxpbmsgPSBjdXJyZW50TGluaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgY2xvc2VzdE1hdGNoLmxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgc2l0ZSA9IHRoaXMuZGVlcExpbmtzLmdldChjbG9zZXN0TWF0Y2gubGluayk7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gUm91dGVEZWVwTGlua0hhbmRsZXIuZXh0cmFjdFBhcmFtcyhjbG9zZXN0TWF0Y2gubGluay5zcGxpdCgnLycpLCBwYXJ0cywgcXVlcnlQYXJ0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2l0ZTogc2l0ZSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgICB2YXIgcGFydHMgPSBsaW5rLnNwbGl0KCcvJyk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGVlcExpbmtzLmtleXMoKSkuc29tZShmdW5jdGlvbiAoY3VycmVudExpbmspIHtcbiAgICAgICAgICAgIHJldHVybiBSb3V0ZURlZXBMaW5rSGFuZGxlci5jYWxjdWxhdGVNYXRjaChjdXJyZW50TGluaywgcGFydHMpID09PSAwO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJvdXRlRGVlcExpbmtIYW5kbGVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobGluaywgc2l0ZSkge1xuICAgICAgICBpZiAodGhpcy5oYXMobGluaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZXAgTGluayBcXFwiXCIgKyBsaW5rICsgXCJcXFwiIGFscmVhZHkgZXhpc3RzIGZvciBzaXRlIFxcXCJcIiArIHNpdGUgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWVwTGlua3Muc2V0KGxpbmssIHNpdGUpO1xuICAgICAgICB0aGlzLnJldmVyc2VEZWVwTGlua3Muc2V0KHNpdGUsIGxpbmspO1xuICAgIH07XG4gICAgUm91dGVEZWVwTGlua0hhbmRsZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZXBMaW5rcy5nZXQobGluayk7XG4gICAgfTtcbiAgICBSb3V0ZURlZXBMaW5rSGFuZGxlci5wcm90b3R5cGUuc2V0QmFzZVBhdGggPSBmdW5jdGlvbiAoYmFzZVBhdGgpIHtcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgIH07XG4gICAgcmV0dXJuIFJvdXRlRGVlcExpbmtIYW5kbGVyO1xufSgpKTtcbmV4cG9ydCB7IFJvdXRlRGVlcExpbmtIYW5kbGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3V0ZURlZXBMaW5rSGFuZGxlci5qcy5tYXAiLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIFNpdGVzQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcblNpdGVzQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdTaXRlcyc7XG5leHBvcnQgdmFyIFNpdGVDb250YWluZXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuU2l0ZUNvbnRhaW5lckNvbnRleHQuZGlzcGxheU5hbWUgPSAnU2l0ZUNvbnRhaW5lcic7XG5leHBvcnQgZnVuY3Rpb24gdXNlU2l0ZXMoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoU2l0ZXNDb250ZXh0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVEZWVwTGluayhzaXRlLCBwYXJhbXMpIHtcbiAgICB2YXIgYXBwID0gdXNlU2l0ZXMoKTtcbiAgICByZXR1cm4gYXBwID09PSBudWxsIHx8IGFwcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXBwLmdldERlZXBMaW5rSGFuZGxlcigpLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZShzaXRlLCBwYXJhbXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNpdGVDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoU2l0ZUNvbnRhaW5lckNvbnRleHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvcEJhcihvcHRpb25zKSB7XG4gICAgdmFyIHNpdGVDb250YWluZXIgPSB1c2VTaXRlQ29udGFpbmVyKCk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2l0ZUNvbnRhaW5lciA9PT0gbnVsbCB8fCBzaXRlQ29udGFpbmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlQ29udGFpbmVyLnVwZGF0ZVRvcEJhck9wdGlvbnMob3B0aW9ucyk7XG4gICAgfSwgW29wdGlvbnMsIHNpdGVDb250YWluZXJdKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhvb2tzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICdqcy1oZWxwZXInO1xudmFyIENsYXNzU2l0ZUFuaW1hdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDbGFzc1NpdGVBbmltYXRpb24oc2l0ZVN0YXJ0Q2xhc3MsIHNpdGVFbmRDbGFzcywgZHVyYXRpb24sIHJlbW92ZUNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHJlbW92ZUNsYXNzZXMgPT09IHZvaWQgMCkgeyByZW1vdmVDbGFzc2VzID0gdHJ1ZTsgfVxuICAgICAgICB0aGlzLnNpdGVTdGFydENsYXNzID0gc2l0ZVN0YXJ0Q2xhc3M7XG4gICAgICAgIHRoaXMuc2l0ZUVuZENsYXNzID0gc2l0ZUVuZENsYXNzO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3NlcyA9IHJlbW92ZUNsYXNzZXM7XG4gICAgfVxuICAgIENsYXNzU2l0ZUFuaW1hdGlvbi5wcm90b3R5cGUuYW5pbWF0ZVNpdGVFbmQgPSBmdW5jdGlvbiAoZnJvbVNpdGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNpdGUuY2xhc3NMaXN0LmFkZCh0aGlzLnNpdGVFbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBIZWxwZXIuZGVsYXkodGhpcy5kdXJhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVDbGFzc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNpdGUuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNpdGVFbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2xhc3NTaXRlQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlU2l0ZVBvcFRvRnJvbnQgPSBmdW5jdGlvbiAoZnJvbVNpdGUsIHRvU2l0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlU2l0ZVN0YXJ0KGZyb21TaXRlLCB0b1NpdGUpO1xuICAgIH07XG4gICAgQ2xhc3NTaXRlQW5pbWF0aW9uLnByb3RvdHlwZS5hbmltYXRlU2l0ZVN0YXJ0ID0gZnVuY3Rpb24gKF9mcm9tU2l0ZSwgdG9TaXRlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU2l0ZS5jbGFzc0xpc3QuYWRkKHRoaXMuc2l0ZVN0YXJ0Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgSGVscGVyLmRlbGF5KHRoaXMuZHVyYXRpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU2l0ZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2l0ZVN0YXJ0Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDbGFzc1NpdGVBbmltYXRpb247XG59KCkpO1xuZXhwb3J0IHsgQ2xhc3NTaXRlQW5pbWF0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGFzc1NpdGVBbmltYXRpb24uanMubWFwIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbmltcG9ydCB7IENsYXNzU2l0ZUFuaW1hdGlvbiB9IGZyb20gJy4vQ2xhc3NTaXRlQW5pbWF0aW9uJztcbnZhciBEZWZhdWx0U2l0ZUFuaW1hdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRGVmYXVsdFNpdGVBbmltYXRpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVmYXVsdFNpdGVBbmltYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAnYW5pbWF0aW9uLW5ldy1zaXRlJywgJ2FuaW1hdGlvbi1lbmQtc2l0ZScsIDMwMCwgdHJ1ZSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIERlZmF1bHRTaXRlQW5pbWF0aW9uO1xufShDbGFzc1NpdGVBbmltYXRpb24pKTtcbmV4cG9ydCB7IERlZmF1bHRTaXRlQW5pbWF0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWZhdWx0U2l0ZUFuaW1hdGlvbi5qcy5tYXAiLCJleHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlQW5pbWF0aW9uSW50ZXJmYWNlLmpzLm1hcCIsImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBTaXRlSWRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCgtMSk7XG5TaXRlSWRDb250ZXh0LmRpc3BsYXlOYW1lID0gJ1NpdGVJZENvbnRleHQnO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNpdGVJZCgpIHtcbiAgICByZXR1cm4gdXNlQ29udGV4dChTaXRlSWRDb250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNpdGVJZENvbnRleHQuanMubWFwIiwidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2l0ZUNvbnRhaW5lciB9IGZyb20gJy4uL1NpdGUvU2l0ZUNvbnRhaW5lcic7XG5pbXBvcnQgeyBIZWxwZXIsIFByb21pc2VXaXRoSGFuZGxlcnMgfSBmcm9tICdqcy1oZWxwZXInO1xuaW1wb3J0IHsgUm91dGVEZWVwTGlua0hhbmRsZXIgfSBmcm9tICcuL0RlZXBMaW5rcy9Sb3V0ZURlZXBMaW5rSGFuZGxlcic7XG5pbXBvcnQgeyBEZWZhdWx0U2l0ZUFuaW1hdGlvbiB9IGZyb20gJy4vU2l0ZUFuaW1hdGlvbi9EZWZhdWx0U2l0ZUFuaW1hdGlvbic7XG5pbXBvcnQgeyBTaXRlc0NvbnRleHQgfSBmcm9tICcuL0hvb2tzJztcbnZhciBpbml0aWFsU3RhdGUgPSB7XG4gICAgaXNJbml0aWFsaXplZDogZmFsc2UsXG4gICAgdmlzaWJsZVNpdGU6IC0xLFxuICAgIHNpdGVzOiBbXSxcbiAgICBhbmltYXRpb246IG51bGwsXG59O1xudmFyIFNpdGVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTaXRlcyhwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIF90aGlzLnNpdGVzID0gbmV3IE1hcCgpO1xuICAgICAgICBfdGhpcy5sYXN0U2l0ZUlkID0gMDtcbiAgICAgICAgX3RoaXMub3JkZXIgPSBbXTtcbiAgICAgICAgX3RoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICAgICAgX3RoaXMudGl0bGUgPSAnVGVzdCc7XG4gICAgICAgIF90aGlzLnVybCA9ICcnO1xuICAgICAgICBfdGhpcy5zZXRDb250YWluZXJGb3JTaXRlID0gZnVuY3Rpb24gKGlkLCBjb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5zaXRlcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2l0ZXMuZ2V0KGlkKS5jb250YWluZXJSZWZQcm9taXNlLnJlc29sdmUoY29udGFpbmVyUmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFNpdGVzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcigndGhlcmUgY2FuIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MhIElmIHJlYWN0IHVubW91bnRzIHByZXZpb3VzIGluc3RhbmNlLCBjaGVjayB5b3VyIGNvZGUuIFRoaXMgc2hvdWxkIG5vdCBiZSBoYXBwZW5pbmchJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmRlZXBMaW5rSGFuZGxlcikge1xuICAgICAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyID0gcHJvcHMuZGVlcExpbmtIYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyID0gbmV3IFJvdXRlRGVlcExpbmtIYW5kbGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmFuaW1hdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIF90aGlzLmFuaW1hdGlvbkhhbmRsZXIgPSBwcm9wcy5hbmltYXRpb25IYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuYW5pbWF0aW9uSGFuZGxlciA9IG5ldyBEZWZhdWx0U2l0ZUFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmJhc2VQYXRoID0gSGVscGVyLm5vbk51bGwocHJvcHMuYmFzZVBhdGgsICcnKTtcbiAgICAgICAgX3RoaXMuZGVlcExpbmtIYW5kbGVyLnNldEJhc2VQYXRoKF90aGlzLmJhc2VQYXRoKTtcbiAgICAgICAgX3RoaXMudXJsID0gX3RoaXMuYmFzZVBhdGg7XG4gICAgICAgIFNpdGVzLmluc3RhbmNlID0gX3RoaXM7XG4gICAgICAgIC8vIFB1c2ggc3RhdGUgaW4gb3JkZXIgdG8gYWxsb3cgYmFja3dhcmQgbmF2aWdhdGlvblxuICAgICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5vblBvcFN0YXRlKGUpOyB9O1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgX3RoaXMudGl0bGUsIF90aGlzLnVybCk7XG4gICAgICAgIF90aGlzLnN0YXJ0Rmlyc3RTaXRlKCk7XG4gICAgICAgIF90aGlzLnJlc29sdmVJbml0aWFsaXNhdGlvblByb21pc2UoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTaXRlcy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfTtcbiAgICBTaXRlcy5hZGRJbml0aWFsaXphdGlvbiA9IGZ1bmN0aW9uIChpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcy5wdXNoKHRoaXMuYXBwQ3JlYXRlZFByb21pc2UudGhlbihpbml0aWFsaXphdGlvbkZ1bmNPclByb21pc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcy5wdXNoKGluaXRpYWxpemF0aW9uRnVuY09yUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoX3ByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBfYyA9IHRoaXMuc3RhdGUsIHZpc2libGVTaXRlID0gX2MudmlzaWJsZVNpdGUsIGFuaW1hdGlvbiA9IF9jLmFuaW1hdGlvbjtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS52aXNpYmxlU2l0ZSAhPT0gdmlzaWJsZVNpdGUpIHtcbiAgICAgICAgICAgIHZhciBzaXRlQ29udGFpbmVyID0gdGhpcy5zaXRlcy5nZXQodmlzaWJsZVNpdGUpO1xuICAgICAgICAgICAgaWYgKHNpdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVybCA9IHRoaXMuZGVlcExpbmtIYW5kbGVyLmNyZWF0ZURlZXBMaW5rRm9yU2l0ZShzaXRlQ29udGFpbmVyLnNpdGUsIHNpdGVDb250YWluZXIucHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSB0aGlzLmJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIHRoaXMudGl0bGUsIHRoaXMudXJsKTtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnNpdGVzLmdldChhbmltYXRpb24ubGVhdmluZ1NpdGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGFpbmVyUmVmUHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5zaXRlcy5nZXQodmlzaWJsZVNpdGUpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY29udGFpbmVyUmVmUHJvbWlzZSxcbiAgICAgICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRWxlbWVudFJlZiA9IF9hWzBdLCBuZXdFbGVtZW50UmVmID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkRWxlbWVudCwgbmV3RWxlbWVudCwgX2IsIG5ld0FuaW1hdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEVsZW1lbnQgPSBvbGRFbGVtZW50UmVmID09PSBudWxsIHx8IG9sZEVsZW1lbnRSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZEVsZW1lbnRSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBuZXdFbGVtZW50UmVmID09PSBudWxsIHx8IG5ld0VsZW1lbnRSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5ld0VsZW1lbnRSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9sZEVsZW1lbnQgJiYgbmV3RWxlbWVudCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBhbmltYXRpb24udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BvcC10by1mcm9udCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hbmltYXRpb25IYW5kbGVyLmFuaW1hdGVTaXRlU3RhcnQob2xkRWxlbWVudCwgbmV3RWxlbWVudCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFuaW1hdGlvbkhhbmRsZXIuYW5pbWF0ZVNpdGVQb3BUb0Zyb250KG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5hbmltYXRpb25IYW5kbGVyLmFuaW1hdGVTaXRlRW5kKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXRlcy5kZWxldGUoYW5pbWF0aW9uLmxlYXZpbmdTaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGFwcCBlbmRlZCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvIGJhY2sgMiwgYmVjYXVzZSBmaXJzdCBvbmUgaXMgb3duIHB1c2hlZCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlbmRpbmcgc2l0ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LmdvKC0yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QW5pbWF0aW9uID0gdGhpcy5zdGF0ZS5hbmltYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGFuaW1hdGlvbiA9PT0gbmV3QW5pbWF0aW9uID8gbnVsbCA6IG5ld0FuaW1hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlczogQXJyYXkuZnJvbSh0aGlzLnNpdGVzLnZhbHVlcygpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuc3RhdGUsIGlzSW5pdGlhbGl6ZWQgPSBfYS5pc0luaXRpYWxpemVkLCBzaXRlcyA9IF9hLnNpdGVzLCB2aXNpYmxlU2l0ZSA9IF9hLnZpc2libGVTaXRlLCBhbmltYXRpb24gPSBfYS5hbmltYXRpb247XG4gICAgICAgIHZhciBfYiA9IHRoaXMucHJvcHMsIHN0eWxlID0gX2Iuc3R5bGUsIGNsYXNzTmFtZSA9IF9iLmNsYXNzTmFtZSwgc2l0ZUNvbnRhaW5lckNsYXNzID0gX2Iuc2l0ZUNvbnRhaW5lckNsYXNzLCBjb250ZW50V3JhcHBlciA9IF9iLmNvbnRlbnRXcmFwcGVyO1xuICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50ID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lIHx8ICdzaXRlQ29udGFpbmVyJyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTaXRlc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMgfSwgc2l0ZXMubWFwKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNpdGVDb250YWluZXIsIHsgdmlzaWJsZTogZGF0YS5pZCA9PT0gdmlzaWJsZVNpdGUgfHwgZGF0YS5pZCA9PT0gKGFuaW1hdGlvbiA9PT0gbnVsbCB8fCBhbmltYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFuaW1hdGlvbi5sZWF2aW5nU2l0ZSksIGxlYXZpbmc6IGRhdGEuaWQgPT09IChhbmltYXRpb24gPT09IG51bGwgfHwgYW5pbWF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbmltYXRpb24ubGVhdmluZ1NpdGUpLCBzaXRlQ29tcG9uZW50OiBkYXRhLnNpdGUsIGtleTogZGF0YS5pZCwgaWQ6IGRhdGEuaWQsIHNpdGVQcm9wczogZGF0YS5wcm9wcywgc2l0ZUNvbnRhaW5lckNsYXNzOiBzaXRlQ29udGFpbmVyQ2xhc3MsIG9uQ29udGFpbmVyTGlzdGVuZXI6IF90aGlzLnNldENvbnRhaW5lckZvclNpdGUgfSkpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgIGlmIChjb250ZW50V3JhcHBlcikge1xuICAgICAgICAgICAgdmFyIFdyYXBwZXIgPSBjb250ZW50V3JhcHBlcjtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIG51bGwsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnN0YXJ0Rmlyc3RTaXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRTaXRlLCB1cmxQYXRoLCBkZWVwTGlua1NpdGVEYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTaXRlID0gdGhpcy5wcm9wcy5zdGFydFNpdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWVwTGlua1NpdGVEYXRhID0gdGhpcy5kZWVwTGlua0hhbmRsZXIuY2FsY3VsYXRlU2l0ZSh1cmxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVlcExpbmtTaXRlRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U2l0ZShkZWVwTGlua1NpdGVEYXRhLnNpdGUsIGRlZXBMaW5rU2l0ZURhdGEucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTaXRlKHN0YXJ0U2l0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnJlc29sdmVJbml0aWFsaXNhdGlvblByb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXRlcy5hcHBDcmVhdGVkUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKFNpdGVzLmluaXRpYWxpc2F0aW9uUHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNJbml0aWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUub25Qb3BTdGF0ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdwb3BTdGF0ZSBmaXJlZCcpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIHB1c2hTdGF0ZSBzbyB0aGF0IHlvdSBjYW4gZ28gYmFjayBhZ2FpblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgdGhpcy50aXRsZSwgdGhpcy51cmwpO1xuICAgICAgICB0aGlzLmdvQmFjaygpO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLmNhbkdvQmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXIubGVuZ3RoID4gMTtcbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5nb0JhY2sgPSBmdW5jdGlvbiAoY2FsbE9uQmFja0xpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGNhbGxPbkJhY2tMaXN0ZW5lciA9PT0gdm9pZCAwKSB7IGNhbGxPbkJhY2tMaXN0ZW5lciA9IHRydWU7IH1cbiAgICAgICAgdmFyIGN1cnJlbnRTaXRlSWQgPSB0aGlzLm9yZGVyW3RoaXMub3JkZXIubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjYWxsT25CYWNrTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IChfYSA9IHRoaXMuc2l0ZXMuZ2V0KGN1cnJlbnRTaXRlSWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25CYWNrTGlzdGVuZXI7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIgJiYgbGlzdGVuZXIoKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNpdGUoY3VycmVudFNpdGVJZCk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuZ2V0RGVlcExpbmtIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWVwTGlua0hhbmRsZXI7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuYWRkRGVlcExpbmsgPSBmdW5jdGlvbiAobGluaywgc2l0ZSkge1xuICAgICAgICB0aGlzLmRlZXBMaW5rSGFuZGxlci5zZXQobGluaywgc2l0ZSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuc3RhcnRTaXRlID0gZnVuY3Rpb24gKHNpdGUsIHByb3BzKSB7XG4gICAgICAgIHZhciB2aXNpYmxlU2l0ZSA9IHRoaXMuc3RhdGUudmlzaWJsZVNpdGU7XG4gICAgICAgIHZhciBuZXh0SWQgPSArK3RoaXMubGFzdFNpdGVJZDtcbiAgICAgICAgdGhpcy5zaXRlcy5zZXQobmV4dElkLCB7XG4gICAgICAgICAgICBzaXRlOiBzaXRlLFxuICAgICAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICAgICAgaWQ6IG5leHRJZCxcbiAgICAgICAgICAgIGNvbnRhaW5lclJlZlByb21pc2U6IG5ldyBQcm9taXNlV2l0aEhhbmRsZXJzKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9yZGVyLnB1c2gobmV4dElkKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB2aXNpYmxlU2l0ZTogbmV4dElkLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHZpc2libGVTaXRlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2l0ZXM6IEFycmF5LmZyb20odGhpcy5zaXRlcy52YWx1ZXMoKSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2l0ZXMucHJvdG90eXBlLnNob3dTaXRlID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICBpZiAodGhpcy5zaXRlcy5oYXMoc2l0ZUlkKSkge1xuICAgICAgICAgICAgdmFyIHZpc2libGVTaXRlID0gdGhpcy5zdGF0ZS52aXNpYmxlU2l0ZTtcbiAgICAgICAgICAgIHZhciBvcmRlckluZGV4ID0gdGhpcy5vcmRlci5pbmRleE9mKHNpdGVJZCk7XG4gICAgICAgICAgICBpZiAob3JkZXJJbmRleCAhPT0gdGhpcy5vcmRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9yZGVySW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyLnNwbGljZShvcmRlckluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXIucHVzaChzaXRlSWQpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmlzaWJsZVNpdGU6IHNpdGVJZCxcbiAgICAgICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHZpc2libGVTaXRlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncG9wLXRvLWZyb250JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5yZW1vdmVTaXRlID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3JkZXJJbmRleCwgdmlzaWJsZVNpdGVJbmRleCwgdmlzaWJsZVNpdGVJZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaXRlcy5oYXMoc2l0ZUlkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlckluZGV4ID0gdGhpcy5vcmRlci5pbmRleE9mKHNpdGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUluZGV4ID0gdGhpcy5vcmRlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlci5zcGxpY2Uob3JkZXJJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcmRlckluZGV4ID09PSB2aXNpYmxlU2l0ZUluZGV4KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlU2l0ZUlkID0gdmlzaWJsZVNpdGVJbmRleCA+PSAwID8gdGhpcy5vcmRlclt2aXNpYmxlU2l0ZUluZGV4XSA6IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVTaXRlOiB2aXNpYmxlU2l0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmluZ1NpdGU6IHNpdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNpdGVzLmRlbGV0ZShzaXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNpdGVzOiBBcnJheS5mcm9tKHRoaXMuc2l0ZXMudmFsdWVzKCkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaXRlcy5wcm90b3R5cGUuZ2V0U2l0ZURhdGFCeUlkID0gZnVuY3Rpb24gKHNpdGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXRlcy5nZXQoc2l0ZUlkKTtcbiAgICB9O1xuICAgIFNpdGVzLnByb3RvdHlwZS5zZXRPbkJhY2tMaXN0ZW5lciA9IGZ1bmN0aW9uIChzaXRlSWQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBzaXRlQ29udGFpbmVyID0gdGhpcy5zaXRlcy5nZXQoc2l0ZUlkKTtcbiAgICAgICAgaWYgKHNpdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgIHNpdGVDb250YWluZXIub25CYWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2l0ZXMuaW5pdGlhbGlzYXRpb25Qcm9taXNlcyA9IFtdO1xuICAgIFNpdGVzLmFwcENyZWF0ZWRQcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICByZXR1cm4gU2l0ZXM7XG59KFB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFNpdGVzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlcy5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBEZXZpY2VSZWFkeSA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHN0eWxlID0gX2Euc3R5bGUsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgX2IgPSB1c2VTdGF0ZShmYWxzZSksIGlzUmVhZHkgPSBfYlswXSwgc2V0SXNSZWFkeSA9IF9iWzFdO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc2V0SXNSZWFkeSh0cnVlKTsgfSk7XG4gICAgfSwgW10pO1xuICAgIGlmIChpc1JlYWR5KSB7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lIH0sIGNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXZpY2VSZWFkeS5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xuLyoqXG4gKiBQcm9taXNlLVdyYXBwZXItS2xhc3NlIGbDvHIgTmF0aXZlLVN0b3JhZ2VcbiAqL1xuaW1wb3J0IHsgSGVscGVyIH0gZnJvbSAnanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0hlbHBlcic7XG5pbXBvcnQgeyBKc29uSGVscGVyIH0gZnJvbSAnanMtaGVscGVyL2Rpc3Qvc2hhcmVkL0pzb25IZWxwZXInO1xuaW1wb3J0IHsgQXJyYXlIZWxwZXIsIFByb21pc2VXaXRoSGFuZGxlcnMgfSBmcm9tICdqcy1oZWxwZXInO1xuaW1wb3J0IHsgU2l0ZXMgfSBmcm9tICcuL0FwcC9TaXRlcyc7XG52YXIgTmF0aXZlU3RvcmFnZVByb21pc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmF0aXZlU3RvcmFnZVByb21pc2UoKSB7XG4gICAgfVxuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmlzRWxlY3Ryb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFbGVjdHJvbicpID49IDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0enQgZWluIEl0ZW0gZsO8ciBOYXRpdmVTdG9yYWdlXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2Uuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZWN0cm9uU3RvcmFnZS5zZXQoX3RoaXMucHJlZml4ICsga2V5LCB2YWx1ZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgcmV0dXJuIE5hdGl2ZVN0b3JhZ2Uuc2V0SXRlbShfdGhpcy5wcmVmaXggKyBrZXksIHZhbHVlLCByZXMsIHJlaik7IH0pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5wcmVmaXggKyBrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJla29tbWUgZWluIEl0ZW0gdm9uIE5hdGl2ZVN0b3JhZ2VcbiAgICAgKi9cbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5nZXRJdGVtID0gZnVuY3Rpb24gKGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZWxlY3Ryb25TdG9yYWdlLmdldChfdGhpcy5wcmVmaXggKyBrZXksIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKEhlbHBlci5ub25OdWxsKF90aGlzLmNhY2hlW190aGlzLnByZWZpeCArIGtleV0sIGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKEpzb25IZWxwZXIuZGVlcEVxdWFsKGRhdGEsIHt9KSA/IGRlZmF1bHRWYWx1ZSA6IGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlU3RvcmFnZS5nZXRJdGVtKF90aGlzLnByZWZpeCArIGtleSwgZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHJlcyhIZWxwZXIubm9uTnVsbChkYXRhLCBkZWZhdWx0VmFsdWUpKTsgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhIZWxwZXIubm9uTnVsbChfdGhpcy5jYWNoZVtfdGhpcy5wcmVmaXggKyBrZXldLCBkZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJla29tbWUgZGllIEtleXMgdm9tIE5hdGl2ZVN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmdldEFsbEtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGVyc2lzdGVudCkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNFbGVjdHJvbigpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZWxlY3Ryb25TdG9yYWdlLmtleXMoZnVuY3Rpb24gKGVyciwgZWxlY3Ryb25LZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZWxlY3Ryb25LZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHJldHVybiBOYXRpdmVTdG9yYWdlLmtleXMocmVzLCByZWopOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qLywga2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoX3RoaXMucHJlZml4KTsgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5yZW1vdmUoa2V5KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbnRmZXJudCBlaW4gT2JqZWN0IGF1cyBkZW0gTmF0aXZlU3RvcmFnZVxuICAgICAqXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UucmVtb3ZlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW3RoaXMucHJlZml4ICsga2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWxlY3Ryb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVjdHJvblN0b3JhZ2UucmVtb3ZlKF90aGlzLnByZWZpeCArIGtleSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyByZXR1cm4gTmF0aXZlU3RvcmFnZS5yZW1vdmUoX3RoaXMucHJlZml4ICsga2V5LCByZXMsIHJlaik7IH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbnRmZXJudCBhbGxlIE9iamVjdHMgYXVzIGRlbSBOYXRpdmVTdG9yYWdlXG4gICAgICovXG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2VdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEFsbEtleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlbW92ZShrZXkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSwgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UubWFrZVBlcnNpc3RlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5wZXJzaXN0ZW50KSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goT2JqZWN0LmtleXModGhpcy5jYWNoZSksIGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZXRJdGVtKGtleSwgdGhpcy5jYWNoZVtrZXldKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0sIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5tYWtlVW5wZXJzaXN0ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIga2V5cywgdmFsdWVzXzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wZXJzaXN0ZW50KSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0QWxsS2V5cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc18xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBBcnJheUhlbHBlci5hc3luY0ZvckVhY2goa2V5cywgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHZhbHVlc18xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRJdGVtKGtleSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FbX2JdID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xlYXIoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZSA9IHZhbHVlc18xO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBOYXRpdmVTdG9yYWdlUHJvbWlzZS5jYWNoZSA9IHt9O1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnByZWZpeCA9ICcnO1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnBlcnNpc3RlbnQgPSB0cnVlO1xuICAgIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmVsZWN0cm9uU3RvcmFnZSA9IG51bGw7XG4gICAgTmF0aXZlU3RvcmFnZVByb21pc2UuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2VXaXRoSGFuZGxlcnMoKTtcbiAgICByZXR1cm4gTmF0aXZlU3RvcmFnZVByb21pc2U7XG59KCkpO1xuZXhwb3J0IHsgTmF0aXZlU3RvcmFnZVByb21pc2UgfTtcblNpdGVzLmFkZEluaXRpYWxpemF0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5hdGl2ZVN0b3JhZ2VQcm9taXNlLmluaXRpYWxpemF0aW9uUHJvbWlzZS5yZXNvbHZlKCk7IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlU3RvcmFnZVByb21pc2UuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTaXRlSWQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTaXRlcyB9IGZyb20gJy4uL0FwcC9Ib29rcyc7XG5leHBvcnQgdmFyIEZpbmlzaFNpdGVMaW5rID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc3R5bGUgPSBfYS5zdHlsZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lO1xuICAgIHZhciBpZCA9IHVzZVNpdGVJZCgpO1xuICAgIHZhciBzaXRlcyA9IHVzZVNpdGVzKCk7XG4gICAgdmFyIG9uQ2xpY2tIYW5kbGVyID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHNpdGVzID09PSBudWxsIHx8IHNpdGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlcy5yZW1vdmVTaXRlKGlkKTtcbiAgICAgICAgfVxuICAgIH0sIFtpZCwgc2l0ZXNdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyBzdHlsZTogc3R5bGUsIG9uQ2xpY2s6IG9uQ2xpY2tIYW5kbGVyLCBjbGFzc05hbWU6IGNsYXNzTmFtZSwgdHlwZTogXCJidXR0b25cIiB9LCBjaGlsZHJlbikpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5pc2hTaXRlTGluay5qcy5tYXAiLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuaW1wb3J0IHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbnZhciBkZWZhdWx0U3RhdGUgPSB7fTtcbnZhciBTaXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNpdGUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIERpcmVjdGlvbiwgY2FsbCBjb21wb25lbnREaWRBcHBlYXIgYWZ0ZXIgZGlkTW91bnRcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jb21wb25lbnREaWRBcHBlYXIoKTsgfSwgMSk7XG4gICAgfTtcbiAgICBTaXRlLnByb3RvdHlwZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIHZpc2libGUgPSB0aGlzLnByb3BzLnZpc2libGU7XG4gICAgICAgIGlmIChwcmV2UHJvcHMudmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFdpbGxBcHBlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50V2lsbERpc2FwcGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcykge1xuICAgICAgICB2YXIgdmlzaWJsZSA9IHRoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgICAgaWYgKHByZXZQcm9wcy52aXNpYmxlICE9PSB2aXNpYmxlKSB7XG4gICAgICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RGlkQXBwZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudERpZERpc2FwcGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTaXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRXaWxsRGlzYXBwZWFyKCk7XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBTaXRlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsQXBwZWFyID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIFNpdGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxEaXNhcHBlYXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgU2l0ZS5wcm90b3R5cGUuY29tcG9uZW50RGlkQXBwZWFyID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIFNpdGUucHJvdG90eXBlLmNvbXBvbmVudERpZERpc2FwcGVhciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICByZXR1cm4gU2l0ZTtcbn0oUHVyZUNvbXBvbmVudCkpO1xuZXhwb3J0IHsgU2l0ZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2l0ZS5qcy5tYXAiLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNpdGVJZENvbnRleHQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5pbXBvcnQgeyBUb3BCYXIgfSBmcm9tICcuL1RvcEJhci9Ub3BCYXInO1xuaW1wb3J0IHsgU2l0ZUNvbnRhaW5lckNvbnRleHQgfSBmcm9tICcuLi9BcHAvSG9va3MnO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJztcbnZhciBpbml0aWFsVG9wQmFyT3B0aW9ucyA9IHtcbiAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgIGxlZnRCdXR0b25zOiBbXSxcbiAgICByaWdodEJ1dHRvbnM6IFtdLFxuICAgIGJhY2tCdXR0b246IHVuZGVmaW5lZCxcbn07XG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICAgIHRvcEJhck9wdGlvbnM6IGluaXRpYWxUb3BCYXJPcHRpb25zLFxufTtcbnZhciBTaXRlQ29udGFpbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaXRlQ29udGFpbmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNpdGVDb250YWluZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgX3RoaXMuY29udGFpbmVyID0gY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLmNoaWxkID0gY3JlYXRlUmVmKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgU2l0ZUNvbnRhaW5lci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIHZpc2libGUgPSBfYS52aXNpYmxlLCBvbkNvbnRhaW5lckxpc3RlbmVyID0gX2Eub25Db250YWluZXJMaXN0ZW5lciwgaWQgPSBfYS5pZDtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGQuY3VycmVudCAmJiAhdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZC5jdXJyZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNvbnRhaW5lckxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvbkNvbnRhaW5lckxpc3RlbmVyKGlkLCB0aGlzLmNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcykge1xuICAgICAgICB2YXIgdmlzaWJsZSA9IHRoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgICAgaWYgKCFwcmV2UHJvcHMudmlzaWJsZSAmJiB2aXNpYmxlICYmIHRoaXMuY29udGFpbmVyLmN1cnJlbnQgJiYgdGhpcy5jaGlsZC5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jdXJyZW50LmFwcGVuZENoaWxkKHRoaXMuY2hpbGQuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTaXRlQ29udGFpbmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzKSB7XG4gICAgICAgIHZhciB2aXNpYmxlID0gdGhpcy5wcm9wcy52aXNpYmxlO1xuICAgICAgICBpZiAoIXZpc2libGUgJiYgcHJldlByb3BzLnZpc2libGUgJiYgdGhpcy5jaGlsZC5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmN1cnJlbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgc2l0ZUNvbXBvbmVudCA9IF9hLnNpdGVDb21wb25lbnQsIHNpdGVDb250YWluZXJTdHlsZSA9IF9hLnNpdGVDb250YWluZXJTdHlsZSwgc2l0ZVByb3BzID0gX2Euc2l0ZVByb3BzLCB2aXNpYmxlID0gX2EudmlzaWJsZSwgaWQgPSBfYS5pZCwgbGVhdmluZyA9IF9hLmxlYXZpbmcsIHNpdGVDb250YWluZXJDbGFzcyA9IF9hLnNpdGVDb250YWluZXJDbGFzcztcbiAgICAgICAgdmFyIEJhc2UgPSBzaXRlQ29tcG9uZW50O1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLnRvcEJhck9wdGlvbnMsIHRpdGxlID0gX2IudGl0bGUsIHJpZ2h0QnV0dG9ucyA9IF9iLnJpZ2h0QnV0dG9ucywgbGVmdEJ1dHRvbnMgPSBfYi5sZWZ0QnV0dG9ucywgYmFja0J1dHRvbiA9IF9iLmJhY2tCdXR0b247XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogdGhpcy5jb250YWluZXIsIHN0eWxlOiBzaXRlQ29udGFpbmVyU3R5bGUsIGNsYXNzTmFtZTogc2l0ZUNvbnRhaW5lckNsYXNzIHx8ICdzaXRlJyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogdGhpcy5jaGlsZCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2l0ZUNvbnRhaW5lckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHRoaXMgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTaXRlSWRDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBpZCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChUb3BCYXIsIHsgdGl0bGU6IHRpdGxlLCByaWdodEJ1dHRvbnM6IHJpZ2h0QnV0dG9ucywgbGVmdEJ1dHRvbnM6IGxlZnRCdXR0b25zLCBiYWNrQnV0dG9uOiBiYWNrQnV0dG9uIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIHsgZmx1aWQ6IFwieHhsXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2UsIF9fYXNzaWduKHsgdmlzaWJsZTogdmlzaWJsZSwgbGVhdmluZzogbGVhdmluZyB9LCBzaXRlUHJvcHMsIHsgaWQ6IGlkIH0pKSkpKSkpKTtcbiAgICB9O1xuICAgIFNpdGVDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZVRvcEJhck9wdGlvbnMgPSBmdW5jdGlvbiAobmV3T3B0aW9ucykge1xuICAgICAgICB2YXIgdG9wQmFyT3B0aW9ucyA9IHRoaXMuc3RhdGUudG9wQmFyT3B0aW9ucztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB0b3BCYXJPcHRpb25zOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdG9wQmFyT3B0aW9ucyksIG5ld09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBTaXRlQ29udGFpbmVyO1xufShSZWFjdC5QdXJlQ29tcG9uZW50KSk7XG5leHBvcnQgeyBTaXRlQ29udGFpbmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlQ29udGFpbmVyLmpzLm1hcCIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNyZWF0ZURlZXBMaW5rLCB1c2VTaXRlcyB9IGZyb20gJy4uL0FwcC9Ib29rcyc7XG5pbXBvcnQgeyB1c2VTaXRlSWQgfSBmcm9tICcuLi9BcHAvU2l0ZUlkQ29udGV4dCc7XG5mdW5jdGlvbiBjcmVhdGVTaXRlTGlua0Z1bmMoKSB7XG4gICAgdmFyIFNpdGVMaW5rID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHNpdGVJZCA9IF9hLnNpdGVJZCwgc2l0ZSA9IF9hLnNpdGUsIHNpdGVQcm9wcyA9IF9hLnNpdGVQcm9wcywgc3R5bGUgPSBfYS5zdHlsZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2IgPSBfYS5maW5pc2hDdXJyZW50LCBmaW5pc2hDdXJyZW50ID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgICAgIHZhciBzaXRlcyA9IHVzZVNpdGVzKCk7XG4gICAgICAgIHZhciBjdXJyZW50U2l0ZUlkID0gdXNlU2l0ZUlkKCk7XG4gICAgICAgIHZhciBvbkNsaWNrSGFuZGxlciA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoc2l0ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuc2hvd1NpdGUoc2l0ZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpdGUpIHtcbiAgICAgICAgICAgICAgICBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuc3RhcnRTaXRlKHNpdGUsIHNpdGVQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmluaXNoQ3VycmVudCkge1xuICAgICAgICAgICAgICAgIHNpdGVzID09PSBudWxsIHx8IHNpdGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXRlcy5yZW1vdmVTaXRlKGN1cnJlbnRTaXRlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBbc2l0ZSwgc2l0ZVByb3BzLCBzaXRlSWQsIHNpdGVzLCBmaW5pc2hDdXJyZW50LCBjdXJyZW50U2l0ZUlkXSk7XG4gICAgICAgIGlmICghc2l0ZSAmJiB0eXBlb2Ygc2l0ZUlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuZ2V0U2l0ZURhdGFCeUlkKHNpdGVJZCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICAgICAgICAgICAgICBzaXRlUHJvcHMgPSBkYXRhLnByb3BzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNpdGUgaXMgdW5kZWZpbmVkIHdpdGggaWQgXCIgKyBzaXRlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaW5rID0gdXNlQ3JlYXRlRGVlcExpbmsoc2l0ZSwgc2l0ZVByb3BzKTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7IHJvbGU6IFwiYnV0dG9uXCIsIHN0eWxlOiBzdHlsZSwgb25DbGljazogb25DbGlja0hhbmRsZXIsIGhyZWY6IGxpbmsgfSwgY2hpbGRyZW4pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gU2l0ZUxpbms7XG59XG5leHBvcnQgdmFyIFNpdGVMaW5rID0gY3JlYXRlU2l0ZUxpbmtGdW5jKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXRlTGluay5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRvcEJhckJ1dHRvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcC1tb2JpbGUnO1xuaW1wb3J0IHsgdXNlU2l0ZXMgfSBmcm9tICcuLi8uLi9BcHAvSG9va3MnO1xuZXhwb3J0IHZhciBCYWNrQnV0dG9uID0gUmVhY3QubWVtbyhmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2l0ZXMgPSB1c2VTaXRlcygpO1xuICAgIHZhciBnb0JhY2sgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiBzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuZ29CYWNrKCk7IH0sIFtzaXRlc10pO1xuICAgIGlmIChzaXRlcyA9PT0gbnVsbCB8fCBzaXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2l0ZXMuY2FuR29CYWNrKCkpIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFRvcEJhckJ1dHRvbiwgeyBvbkNsaWNrOiBnb0JhY2sgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBcImJhY2stYnV0dG9uLWltZ1wiIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYWNrQnV0dG9uLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJhY2tCdXR0b24gfSBmcm9tICcuL0JhY2tCdXR0b24nO1xuaW1wb3J0IHsgVG9wQmFyIGFzIEJNVG9wQmFyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5leHBvcnQgdmFyIFRvcEJhciA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EuYmFja0J1dHRvbiwgYmFja0J1dHRvbiA9IF9iID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfYiwgX2MgPSBfYS50aXRsZSwgdGl0bGUgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5yaWdodEJ1dHRvbnMsIHJpZ2h0QnV0dG9ucyA9IF9kID09PSB2b2lkIDAgPyBbXSA6IF9kLCBfZSA9IF9hLmxlZnRCdXR0b25zLCBsZWZ0QnV0dG9ucyA9IF9lID09PSB2b2lkIDAgPyBbXSA6IF9lO1xuICAgIGlmIChiYWNrQnV0dG9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYmFja0J1dHRvbiA9IHsgY29tcG9uZW50OiBCYWNrQnV0dG9uIH07XG4gICAgfVxuICAgIGlmIChiYWNrQnV0dG9uICE9PSBmYWxzZSkge1xuICAgICAgICBsZWZ0QnV0dG9ucyA9IGxlZnRCdXR0b25zLnNsaWNlKDAsIGxlZnRCdXR0b25zLmxlbmd0aCk7XG4gICAgICAgIGxlZnRCdXR0b25zLnVuc2hpZnQoYmFja0J1dHRvbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEJNVG9wQmFyLCB7IHRpdGxlOiB0aXRsZSwgcmlnaHRCdXR0b25zOiByaWdodEJ1dHRvbnMsIGxlZnRCdXR0b25zOiBsZWZ0QnV0dG9ucyB9KTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyLmpzLm1hcCIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsInZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBmaW5kKGl0ZXIsIHRhciwga2V5KSB7XG5cdGZvciAoa2V5IG9mIGl0ZXIua2V5cygpKSB7XG5cdFx0aWYgKGRlcXVhbChrZXksIHRhcikpIHJldHVybiBrZXk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcXVhbChmb28sIGJhcikge1xuXHR2YXIgY3RvciwgbGVuLCB0bXA7XG5cdGlmIChmb28gPT09IGJhcikgcmV0dXJuIHRydWU7XG5cblx0aWYgKGZvbyAmJiBiYXIgJiYgKGN0b3I9Zm9vLmNvbnN0cnVjdG9yKSA9PT0gYmFyLmNvbnN0cnVjdG9yKSB7XG5cdFx0aWYgKGN0b3IgPT09IERhdGUpIHJldHVybiBmb28uZ2V0VGltZSgpID09PSBiYXIuZ2V0VGltZSgpO1xuXHRcdGlmIChjdG9yID09PSBSZWdFeHApIHJldHVybiBmb28udG9TdHJpbmcoKSA9PT0gYmFyLnRvU3RyaW5nKCk7XG5cblx0XHRpZiAoY3RvciA9PT0gQXJyYXkpIHtcblx0XHRcdGlmICgobGVuPWZvby5sZW5ndGgpID09PSBiYXIubGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBkZXF1YWwoZm9vW2xlbl0sIGJhcltsZW5dKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gU2V0KSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW47XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYmFyLmhhcyh0bXApKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gTWFwKSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW5bMF07XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZGVxdWFsKGxlblsxXSwgYmFyLmdldCh0bXApKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG5cdFx0XHRmb28gPSBuZXcgVWludDhBcnJheShmb28pO1xuXHRcdFx0YmFyID0gbmV3IFVpbnQ4QXJyYXkoYmFyKTtcblx0XHR9IGVsc2UgaWYgKGN0b3IgPT09IERhdGFWaWV3KSB7XG5cdFx0XHRpZiAoKGxlbj1mb28uYnl0ZUxlbmd0aCkgPT09IGJhci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBmb28uZ2V0SW50OChsZW4pID09PSBiYXIuZ2V0SW50OChsZW4pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZm9vKSkge1xuXHRcdFx0aWYgKChsZW49Zm9vLmJ5dGVMZW5ndGgpID09PSBiYXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZm9vW2xlbl0gPT09IGJhcltsZW5dKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmICghY3RvciB8fCB0eXBlb2YgZm9vID09PSAnb2JqZWN0Jykge1xuXHRcdFx0bGVuID0gMDtcblx0XHRcdGZvciAoY3RvciBpbiBmb28pIHtcblx0XHRcdFx0aWYgKGhhcy5jYWxsKGZvbywgY3RvcikgJiYgKytsZW4gJiYgIWhhcy5jYWxsKGJhciwgY3RvcikpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYgKCEoY3RvciBpbiBiYXIpIHx8ICFkZXF1YWwoZm9vW2N0b3JdLCBiYXJbY3Rvcl0pKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoYmFyKS5sZW5ndGggPT09IGxlbjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9vICE9PSBmb28gJiYgYmFyICE9PSBiYXI7XG59XG4iLCJpbXBvcnQgb3duZXJEb2N1bWVudCBmcm9tICcuL293bmVyRG9jdW1lbnQnO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmVseSBmb2N1c2VkIGVsZW1lbnQgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBkb2MgdGhlIGRvY3VtZW50IHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWN0aXZlRWxlbWVudChkb2MpIHtcbiAgaWYgKGRvYyA9PT0gdm9pZCAwKSB7XG4gICAgZG9jID0gb3duZXJEb2N1bWVudCgpO1xuICB9XG5cbiAgLy8gU3VwcG9ydDogSUUgOSBvbmx5XG4gIC8vIElFOSB0aHJvd3MgYW4gXCJVbnNwZWNpZmllZCBlcnJvclwiIGFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGZyb20gYW4gPGlmcmFtZT5cbiAgdHJ5IHtcbiAgICB2YXIgYWN0aXZlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7IC8vIElFMTEgcmV0dXJucyBhIHNlZW1pbmdseSBlbXB0eSBvYmplY3QgaW4gc29tZSBjYXNlcyB3aGVuIGFjY2Vzc2luZ1xuICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgZnJvbSBhbiA8aWZyYW1lPlxuXG4gICAgaWYgKCFhY3RpdmUgfHwgIWFjdGl2ZS5ub2RlTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFjdGl2ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIGllIHRocm93cyBpZiBubyBhY3RpdmUgZWxlbWVudCAqL1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufSIsImltcG9ydCBoYXNDbGFzcyBmcm9tICcuL2hhc0NsYXNzJztcbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBDU1MgY2xhc3MgbmFtZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO2Vsc2UgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJykgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArIFwiIFwiICsgY2xhc3NOYW1lO2Vsc2UgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKGVsZW1lbnQuY2xhc3NOYW1lICYmIGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgJycpICsgXCIgXCIgKyBjbGFzc05hbWUpO1xufSIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXJldHVybi1hc3NpZ24gKi9cbmltcG9ydCBjYW5Vc2VET00gZnJvbSAnLi9jYW5Vc2VET00nO1xuZXhwb3J0IHZhciBvcHRpb25zU3VwcG9ydGVkID0gZmFsc2U7XG5leHBvcnQgdmFyIG9uY2VTdXBwb3J0ZWQgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgZ2V0IHBhc3NpdmUoKSB7XG4gICAgICByZXR1cm4gb3B0aW9uc1N1cHBvcnRlZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGdldCBvbmNlKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuICAgICAgcmV0dXJuIG9uY2VTdXBwb3J0ZWQgPSBvcHRpb25zU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgfTtcblxuICBpZiAoY2FuVXNlRE9NKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIHRydWUpO1xuICB9XG59IGNhdGNoIChlKSB7XG4gIC8qICovXG59XG5cbi8qKlxuICogQW4gYGFkZEV2ZW50TGlzdGVuZXJgIHBvbnlmaWxsLCBzdXBwb3J0cyB0aGUgYG9uY2VgIG9wdGlvblxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICogQHBhcmFtIGV2ZW50TmFtZSB0aGUgZXZlbnQgbmFtZVxuICogQHBhcmFtIGhhbmRsZSB0aGUgaGFuZGxlclxuICogQHBhcmFtIG9wdGlvbnMgZXZlbnQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmICFvbmNlU3VwcG9ydGVkKSB7XG4gICAgdmFyIG9uY2UgPSBvcHRpb25zLm9uY2UsXG4gICAgICAgIGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmU7XG4gICAgdmFyIHdyYXBwZWRIYW5kbGVyID0gaGFuZGxlcjtcblxuICAgIGlmICghb25jZVN1cHBvcnRlZCAmJiBvbmNlKSB7XG4gICAgICB3cmFwcGVkSGFuZGxlciA9IGhhbmRsZXIuX19vbmNlIHx8IGZ1bmN0aW9uIG9uY2VIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIG9uY2VIYW5kbGVyLCBjYXB0dXJlKTtcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZXIuX19vbmNlID0gd3JhcHBlZEhhbmRsZXI7XG4gICAgfVxuXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgd3JhcHBlZEhhbmRsZXIsIG9wdGlvbnNTdXBwb3J0ZWQgPyBvcHRpb25zIDogY2FwdHVyZSk7XG4gIH1cblxuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYWRkRXZlbnRMaXN0ZW5lcjsiLCJ2YXIgckh5cGhlbiA9IC8tKC4pL2c7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJIeXBoZW4sIGZ1bmN0aW9uIChfLCBjaHIpIHtcbiAgICByZXR1cm4gY2hyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufSIsImV4cG9ydCBkZWZhdWx0ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSwgbm8tY29uZC1hc3NpZ24gKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZWxlbWVudCBjb250YWlucyBhbm90aGVyIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IGVsZW1lbnRcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbnRleHQsIG5vZGUpIHtcbiAgLy8gSFRNTCBET00gYW5kIFNWRyBET00gbWF5IGhhdmUgZGlmZmVyZW50IHN1cHBvcnQgbGV2ZWxzLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIG9uIGNvbnRleHQgaW5zdGVhZCBvZiBhIGRvY3VtZW50IHJvb3QgZWxlbWVudC5cbiAgaWYgKGNvbnRleHQuY29udGFpbnMpIHJldHVybiBjb250ZXh0LmNvbnRhaW5zKG5vZGUpO1xuICBpZiAoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikgcmV0dXJuIGNvbnRleHQgPT09IG5vZGUgfHwgISEoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tICcuL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IGh5cGhlbmF0ZSBmcm9tICcuL2h5cGhlbmF0ZVN0eWxlJztcbmltcG9ydCBpc1RyYW5zZm9ybSBmcm9tICcuL2lzVHJhbnNmb3JtJztcblxuZnVuY3Rpb24gc3R5bGUobm9kZSwgcHJvcGVydHkpIHtcbiAgdmFyIGNzcyA9ICcnO1xuICB2YXIgdHJhbnNmb3JtcyA9ICcnO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShoeXBoZW5hdGUocHJvcGVydHkpKSB8fCBnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmdldFByb3BlcnR5VmFsdWUoaHlwaGVuYXRlKHByb3BlcnR5KSk7XG4gIH1cblxuICBPYmplY3Qua2V5cyhwcm9wZXJ0eSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcGVydHlba2V5XTtcblxuICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgIG5vZGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoaHlwaGVuYXRlKGtleSkpO1xuICAgIH0gZWxzZSBpZiAoaXNUcmFuc2Zvcm0oa2V5KSkge1xuICAgICAgdHJhbnNmb3JtcyArPSBrZXkgKyBcIihcIiArIHZhbHVlICsgXCIpIFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3MgKz0gaHlwaGVuYXRlKGtleSkgKyBcIjogXCIgKyB2YWx1ZSArIFwiO1wiO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRyYW5zZm9ybXMpIHtcbiAgICBjc3MgKz0gXCJ0cmFuc2Zvcm06IFwiICsgdHJhbnNmb3JtcyArIFwiO1wiO1xuICB9XG5cbiAgbm9kZS5zdHlsZS5jc3NUZXh0ICs9IFwiO1wiICsgY3NzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHlsZTsiLCJpbXBvcnQgb3duZXJXaW5kb3cgZnJvbSAnLi9vd25lcldpbmRvdyc7XG4vKipcbiAqIFJldHVybnMgb25lIG9yIGFsbCBjb21wdXRlZCBzdHlsZSBwcm9wZXJ0aWVzIG9mIGFuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gcHN1ZWRvRWxlbWVudCB0aGUgc3R5bGUgcHJvcGVydHlcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKG5vZGUsIHBzdWVkb0VsZW1lbnQpIHtcbiAgcmV0dXJuIG93bmVyV2luZG93KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgcHN1ZWRvRWxlbWVudCk7XG59IiwiLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBlbGVtZW50IGhhcyBhIENTUyBjbGFzcy5cbiAqIFxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyBuYW1lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybiAhIWNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO1xuICByZXR1cm4gKFwiIFwiICsgKGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwgfHwgZWxlbWVudC5jbGFzc05hbWUpICsgXCIgXCIpLmluZGV4T2YoXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIikgIT09IC0xO1xufSIsInZhciByVXBwZXIgPSAvKFtBLVpdKS9nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHlwaGVuYXRlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoclVwcGVyLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbn0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvMmFlYjhhMmE2YmViMDA2MTdhNDIxN2Y3ZjgyODQ5MjRmYTJhZDgxOS9zcmMvdmVuZG9yL2NvcmUvaHlwaGVuYXRlU3R5bGVOYW1lLmpzXG4gKi9cbmltcG9ydCBoeXBoZW5hdGUgZnJvbSAnLi9oeXBoZW5hdGUnO1xudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGh5cGhlbmF0ZShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufSIsInZhciBzdXBwb3J0ZWRUcmFuc2Zvcm1zID0gL14oKHRyYW5zbGF0ZXxyb3RhdGV8c2NhbGUpKFh8WXxafDNkKT98bWF0cml4KDNkKT98cGVyc3BlY3RpdmV8c2tldyhYfFkpPykkL2k7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RyYW5zZm9ybSh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgc3VwcG9ydGVkVHJhbnNmb3Jtcy50ZXN0KHZhbHVlKSk7XG59IiwiaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSAnLi9hZGRFdmVudExpc3RlbmVyJztcbmltcG9ydCByZW1vdmVFdmVudExpc3RlbmVyIGZyb20gJy4vcmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdGVuOyIsIi8qKlxuICogUmV0dXJucyB0aGUgb3duZXIgZG9jdW1lbnQgb2YgYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvd25lckRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xufSIsImltcG9ydCBvd25lckRvY3VtZW50IGZyb20gJy4vb3duZXJEb2N1bWVudCc7XG4vKipcbiAqIFJldHVybnMgdGhlIG93bmVyIHdpbmRvdyBvZiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3duZXJXaW5kb3cobm9kZSkge1xuICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlKTtcbiAgcmV0dXJuIGRvYyAmJiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xufSIsInZhciB0b0FycmF5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgW10uc2xpY2UpO1xuLyoqXG4gKiBSdW5zIGBxdWVyeVNlbGVjdG9yQWxsYCBvbiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXNhKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHJldHVybiB0b0FycmF5KGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpO1xufSIsImZ1bmN0aW9uIHJlcGxhY2VDbGFzc05hbWUob3JpZ0NsYXNzLCBjbGFzc1RvUmVtb3ZlKSB7XG4gIHJldHVybiBvcmlnQ2xhc3MucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIgKyBjbGFzc1RvUmVtb3ZlICsgXCIoPzpcXFxcc3wkKVwiLCAnZycpLCAnJDEnKS5yZXBsYWNlKC9cXHMrL2csICcgJykucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuLyoqXG4gKiBSZW1vdmVzIGEgQ1NTIGNsYXNzIGZyb20gYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudFxuICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzIG5hbWVcbiAqL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSByZXBsYWNlQ2xhc3NOYW1lKGVsZW1lbnQuY2xhc3NOYW1lLCBjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHJlcGxhY2VDbGFzc05hbWUoZWxlbWVudC5jbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCB8fCAnJywgY2xhc3NOYW1lKSk7XG4gIH1cbn0iLCIvKipcbiAqIEEgYHJlbW92ZUV2ZW50TGlzdGVuZXJgIHBvbnlmaWxsXG4gKiBcbiAqIEBwYXJhbSBub2RlIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lXG4gKiBAcGFyYW0gaGFuZGxlIHRoZSBoYW5kbGVyXG4gKiBAcGFyYW0gb3B0aW9ucyBldmVudCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIHZhciBjYXB0dXJlID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5jYXB0dXJlIDogb3B0aW9ucztcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSk7XG5cbiAgaWYgKGhhbmRsZXIuX19vbmNlKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlci5fX29uY2UsIGNhcHR1cmUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJlbW92ZUV2ZW50TGlzdGVuZXI7IiwiaW1wb3J0IGNhblVzZURPTSBmcm9tICcuL2NhblVzZURPTSc7XG52YXIgc2l6ZTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNjcm9sbGJhclNpemUocmVjYWxjKSB7XG4gIGlmICghc2l6ZSAmJiBzaXplICE9PSAwIHx8IHJlY2FsYykge1xuICAgIGlmIChjYW5Vc2VET00pIHtcbiAgICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLndpZHRoID0gJzUwcHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLmhlaWdodCA9ICc1MHB4JztcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xuICAgICAgc2l6ZSA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2l6ZTtcbn0iLCJpbXBvcnQgY3NzIGZyb20gJy4vY3NzJztcbmltcG9ydCBsaXN0ZW4gZnJvbSAnLi9saXN0ZW4nO1xuaW1wb3J0IHRyaWdnZXJFdmVudCBmcm9tICcuL3RyaWdnZXJFdmVudCc7XG5cbmZ1bmN0aW9uIHBhcnNlRHVyYXRpb24obm9kZSkge1xuICB2YXIgc3RyID0gY3NzKG5vZGUsICd0cmFuc2l0aW9uRHVyYXRpb24nKSB8fCAnJztcbiAgdmFyIG11bHQgPSBzdHIuaW5kZXhPZignbXMnKSA9PT0gLTEgPyAxMDAwIDogMTtcbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKSAqIG11bHQ7XG59XG5cbmZ1bmN0aW9uIGVtdWxhdGVUcmFuc2l0aW9uRW5kKGVsZW1lbnQsIGR1cmF0aW9uLCBwYWRkaW5nKSB7XG4gIGlmIChwYWRkaW5nID09PSB2b2lkIDApIHtcbiAgICBwYWRkaW5nID0gNTtcbiAgfVxuXG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgdmFyIGhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGlmICghY2FsbGVkKSB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCB0cnVlKTtcbiAgfSwgZHVyYXRpb24gKyBwYWRkaW5nKTtcbiAgdmFyIHJlbW92ZSA9IGxpc3RlbihlbGVtZW50LCAndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICB9LCB7XG4gICAgb25jZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICByZW1vdmUoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZChlbGVtZW50LCBoYW5kbGVyLCBkdXJhdGlvbiwgcGFkZGluZykge1xuICBpZiAoZHVyYXRpb24gPT0gbnVsbCkgZHVyYXRpb24gPSBwYXJzZUR1cmF0aW9uKGVsZW1lbnQpIHx8IDA7XG4gIHZhciByZW1vdmVFbXVsYXRlID0gZW11bGF0ZVRyYW5zaXRpb25FbmQoZWxlbWVudCwgZHVyYXRpb24sIHBhZGRpbmcpO1xuICB2YXIgcmVtb3ZlID0gbGlzdGVuKGVsZW1lbnQsICd0cmFuc2l0aW9uZW5kJywgaGFuZGxlcik7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmVtb3ZlRW11bGF0ZSgpO1xuICAgIHJlbW92ZSgpO1xuICB9O1xufSIsIi8qKlxuICogVHJpZ2dlcnMgYW4gZXZlbnQgb24gYSBnaXZlbiBlbGVtZW50LlxuICogXG4gKiBAcGFyYW0gbm9kZSB0aGUgZWxlbWVudFxuICogQHBhcmFtIGV2ZW50TmFtZSB0aGUgZXZlbnQgbmFtZSB0byB0cmlnZ2VyXG4gKiBAcGFyYW0gYnViYmxlcyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYnViYmxlIHVwXG4gKiBAcGFyYW0gY2FuY2VsYWJsZSB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsYWJsZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQobm9kZSwgZXZlbnROYW1lLCBidWJibGVzLCBjYW5jZWxhYmxlKSB7XG4gIGlmIChidWJibGVzID09PSB2b2lkIDApIHtcbiAgICBidWJibGVzID0gZmFsc2U7XG4gIH1cblxuICBpZiAoY2FuY2VsYWJsZSA9PT0gdm9pZCAwKSB7XG4gICAgY2FuY2VsYWJsZSA9IHRydWU7XG4gIH1cblxuICBpZiAobm9kZSkge1xuICAgIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50TmFtZSwgYnViYmxlcywgY2FuY2VsYWJsZSk7XG4gICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7fTtcblRZUEVfU1RBVElDU1tyZWFjdElzLkZvcndhcmRSZWZdID0gRk9SV0FSRF9SRUZfU1RBVElDUztcblRZUEVfU1RBVElDU1tyZWFjdElzLk1lbW9dID0gTUVNT19TVEFUSUNTO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICAvLyBSZWFjdCB2MTYuMTEgYW5kIGJlbG93XG4gIGlmIChyZWFjdElzLmlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfSAvLyBSZWFjdCB2MTYuMTIgYW5kIGFib3ZlXG5cblxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFsnJCR0eXBlb2YnXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImZ1bmN0aW9uIG4obil7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheSh0PjE/dC0xOjApLGU9MTtlPHQ7ZSsrKXJbZS0xXT1hcmd1bWVudHNbZV07aWYoXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVil7dmFyIGk9WVtuXSxvPWk/XCJmdW5jdGlvblwiPT10eXBlb2YgaT9pLmFwcGx5KG51bGwscik6aTpcInVua25vd24gZXJyb3IgbnI6IFwiK247dGhyb3cgRXJyb3IoXCJbSW1tZXJdIFwiK28pfXRocm93IEVycm9yKFwiW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogXCIrbisoci5sZW5ndGg/XCIgXCIrci5tYXAoKGZ1bmN0aW9uKG4pe3JldHVyblwiJ1wiK24rXCInXCJ9KSkuam9pbihcIixcIik6XCJcIikrXCIuIEZpbmQgdGhlIGZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZcIil9ZnVuY3Rpb24gdChuKXtyZXR1cm4hIW4mJiEhbltRXX1mdW5jdGlvbiByKG4pe3JldHVybiEhbiYmKGZ1bmN0aW9uKG4pe2lmKCFufHxcIm9iamVjdFwiIT10eXBlb2YgbilyZXR1cm4hMTt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7aWYobnVsbD09PXQpcmV0dXJuITA7dmFyIHI9T2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxcImNvbnN0cnVjdG9yXCIpJiZ0LmNvbnN0cnVjdG9yO3JldHVybiByPT09T2JqZWN0fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZGdW5jdGlvbi50b1N0cmluZy5jYWxsKHIpPT09Wn0obil8fEFycmF5LmlzQXJyYXkobil8fCEhbltMXXx8ISFuLmNvbnN0cnVjdG9yW0xdfHxzKG4pfHx2KG4pKX1mdW5jdGlvbiBlKHIpe3JldHVybiB0KHIpfHxuKDIzLHIpLHJbUV0udH1mdW5jdGlvbiBpKG4sdCxyKXt2b2lkIDA9PT1yJiYocj0hMSksMD09PW8obik/KHI/T2JqZWN0LmtleXM6bm4pKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ImJlwic3ltYm9sXCI9PXR5cGVvZiBlfHx0KGUsbltlXSxuKX0pKTpuLmZvckVhY2goKGZ1bmN0aW9uKHIsZSl7cmV0dXJuIHQoZSxyLG4pfSkpfWZ1bmN0aW9uIG8obil7dmFyIHQ9bltRXTtyZXR1cm4gdD90Lmk+Mz90LmktNDp0Lmk6QXJyYXkuaXNBcnJheShuKT8xOnMobik/Mjp2KG4pPzM6MH1mdW5jdGlvbiB1KG4sdCl7cmV0dXJuIDI9PT1vKG4pP24uaGFzKHQpOk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHQpfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4gMj09PW8obik/bi5nZXQodCk6blt0XX1mdW5jdGlvbiBmKG4sdCxyKXt2YXIgZT1vKG4pOzI9PT1lP24uc2V0KHQscik6Mz09PWU/KG4uZGVsZXRlKHQpLG4uYWRkKHIpKTpuW3RdPXJ9ZnVuY3Rpb24gYyhuLHQpe3JldHVybiBuPT09dD8wIT09bnx8MS9uPT0xL3Q6biE9biYmdCE9dH1mdW5jdGlvbiBzKG4pe3JldHVybiBYJiZuIGluc3RhbmNlb2YgTWFwfWZ1bmN0aW9uIHYobil7cmV0dXJuIHEmJm4gaW5zdGFuY2VvZiBTZXR9ZnVuY3Rpb24gcChuKXtyZXR1cm4gbi5vfHxuLnR9ZnVuY3Rpb24gbChuKXtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKTt2YXIgdD10bihuKTtkZWxldGUgdFtRXTtmb3IodmFyIHI9bm4odCksZT0wO2U8ci5sZW5ndGg7ZSsrKXt2YXIgaT1yW2VdLG89dFtpXTshMT09PW8ud3JpdGFibGUmJihvLndyaXRhYmxlPSEwLG8uY29uZmlndXJhYmxlPSEwKSwoby5nZXR8fG8uc2V0KSYmKHRbaV09e2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOm8uZW51bWVyYWJsZSx2YWx1ZTpuW2ldfSl9cmV0dXJuIE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG4pLHQpfWZ1bmN0aW9uIGQobixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLHkobil8fHQobil8fCFyKG4pP246KG8obik+MSYmKG4uc2V0PW4uYWRkPW4uY2xlYXI9bi5kZWxldGU9aCksT2JqZWN0LmZyZWV6ZShuKSxlJiZpKG4sKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGQodCwhMCl9KSwhMCksbil9ZnVuY3Rpb24gaCgpe24oMil9ZnVuY3Rpb24geShuKXtyZXR1cm4gbnVsbD09bnx8XCJvYmplY3RcIiE9dHlwZW9mIG58fE9iamVjdC5pc0Zyb3plbihuKX1mdW5jdGlvbiBiKHQpe3ZhciByPXJuW3RdO3JldHVybiByfHxuKDE4LHQpLHJ9ZnVuY3Rpb24gbShuLHQpe3JuW25dfHwocm5bbl09dCl9ZnVuY3Rpb24gXygpe3JldHVyblwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fFV8fG4oMCksVX1mdW5jdGlvbiBqKG4sdCl7dCYmKGIoXCJQYXRjaGVzXCIpLG4udT1bXSxuLnM9W10sbi52PXQpfWZ1bmN0aW9uIE8obil7ZyhuKSxuLnAuZm9yRWFjaChTKSxuLnA9bnVsbH1mdW5jdGlvbiBnKG4pe249PT1VJiYoVT1uLmwpfWZ1bmN0aW9uIHcobil7cmV0dXJuIFU9e3A6W10sbDpVLGg6bixtOiEwLF86MH19ZnVuY3Rpb24gUyhuKXt2YXIgdD1uW1FdOzA9PT10Lml8fDE9PT10Lmk/dC5qKCk6dC5PPSEwfWZ1bmN0aW9uIFAodCxlKXtlLl89ZS5wLmxlbmd0aDt2YXIgaT1lLnBbMF0sbz12b2lkIDAhPT10JiZ0IT09aTtyZXR1cm4gZS5oLmd8fGIoXCJFUzVcIikuUyhlLHQsbyksbz8oaVtRXS5QJiYoTyhlKSxuKDQpKSxyKHQpJiYodD1NKGUsdCksZS5sfHx4KGUsdCkpLGUudSYmYihcIlBhdGNoZXNcIikuTShpW1FdLHQsZS51LGUucykpOnQ9TShlLGksW10pLE8oZSksZS51JiZlLnYoZS51LGUucyksdCE9PUg/dDp2b2lkIDB9ZnVuY3Rpb24gTShuLHQscil7aWYoeSh0KSlyZXR1cm4gdDt2YXIgZT10W1FdO2lmKCFlKXJldHVybiBpKHQsKGZ1bmN0aW9uKGksbyl7cmV0dXJuIEEobixlLHQsaSxvLHIpfSksITApLHQ7aWYoZS5BIT09bilyZXR1cm4gdDtpZighZS5QKXJldHVybiB4KG4sZS50LCEwKSxlLnQ7aWYoIWUuSSl7ZS5JPSEwLGUuQS5fLS07dmFyIG89ND09PWUuaXx8NT09PWUuaT9lLm89bChlLmspOmUubztpKDM9PT1lLmk/bmV3IFNldChvKTpvLChmdW5jdGlvbih0LGkpe3JldHVybiBBKG4sZSxvLHQsaSxyKX0pKSx4KG4sbywhMSksciYmbi51JiZiKFwiUGF0Y2hlc1wiKS5SKGUscixuLnUsbi5zKX1yZXR1cm4gZS5vfWZ1bmN0aW9uIEEoZSxpLG8sYSxjLHMpe2lmKFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmM9PT1vJiZuKDUpLHQoYykpe3ZhciB2PU0oZSxjLHMmJmkmJjMhPT1pLmkmJiF1KGkuRCxhKT9zLmNvbmNhdChhKTp2b2lkIDApO2lmKGYobyxhLHYpLCF0KHYpKXJldHVybjtlLm09ITF9aWYocihjKSYmIXkoYykpe2lmKCFlLmguRiYmZS5fPDEpcmV0dXJuO00oZSxjKSxpJiZpLkEubHx8eChlLGMpfX1mdW5jdGlvbiB4KG4sdCxyKXt2b2lkIDA9PT1yJiYocj0hMSksbi5oLkYmJm4ubSYmZCh0LHIpfWZ1bmN0aW9uIHoobix0KXt2YXIgcj1uW1FdO3JldHVybihyP3Aocik6bilbdF19ZnVuY3Rpb24gSShuLHQpe2lmKHQgaW4gbilmb3IodmFyIHI9T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO3I7KXt2YXIgZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsdCk7aWYoZSlyZXR1cm4gZTtyPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKX19ZnVuY3Rpb24gayhuKXtuLlB8fChuLlA9ITAsbi5sJiZrKG4ubCkpfWZ1bmN0aW9uIEUobil7bi5vfHwobi5vPWwobi50KSl9ZnVuY3Rpb24gUihuLHQscil7dmFyIGU9cyh0KT9iKFwiTWFwU2V0XCIpLk4odCxyKTp2KHQpP2IoXCJNYXBTZXRcIikuVCh0LHIpOm4uZz9mdW5jdGlvbihuLHQpe3ZhciByPUFycmF5LmlzQXJyYXkobiksZT17aTpyPzE6MCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsRDp7fSxsOnQsdDpuLGs6bnVsbCxvOm51bGwsajpudWxsLEM6ITF9LGk9ZSxvPWVuO3ImJihpPVtlXSxvPW9uKTt2YXIgdT1Qcm94eS5yZXZvY2FibGUoaSxvKSxhPXUucmV2b2tlLGY9dS5wcm94eTtyZXR1cm4gZS5rPWYsZS5qPWEsZn0odCxyKTpiKFwiRVM1XCIpLkoodCxyKTtyZXR1cm4ocj9yLkE6XygpKS5wLnB1c2goZSksZX1mdW5jdGlvbiBEKGUpe3JldHVybiB0KGUpfHxuKDIyLGUpLGZ1bmN0aW9uIG4odCl7aWYoIXIodCkpcmV0dXJuIHQ7dmFyIGUsdT10W1FdLGM9byh0KTtpZih1KXtpZighdS5QJiYodS5pPDR8fCFiKFwiRVM1XCIpLksodSkpKXJldHVybiB1LnQ7dS5JPSEwLGU9Rih0LGMpLHUuST0hMX1lbHNlIGU9Rih0LGMpO3JldHVybiBpKGUsKGZ1bmN0aW9uKHQscil7dSYmYSh1LnQsdCk9PT1yfHxmKGUsdCxuKHIpKX0pKSwzPT09Yz9uZXcgU2V0KGUpOmV9KGUpfWZ1bmN0aW9uIEYobix0KXtzd2l0Y2godCl7Y2FzZSAyOnJldHVybiBuZXcgTWFwKG4pO2Nhc2UgMzpyZXR1cm4gQXJyYXkuZnJvbShuKX1yZXR1cm4gbChuKX1mdW5jdGlvbiBOKCl7ZnVuY3Rpb24gcihuLHQpe3ZhciByPXNbbl07cmV0dXJuIHI/ci5lbnVtZXJhYmxlPXQ6c1tuXT1yPXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTp0LGdldDpmdW5jdGlvbigpe3ZhciB0PXRoaXNbUV07cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmZih0KSxlbi5nZXQodCxuKX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciByPXRoaXNbUV07XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmZihyKSxlbi5zZXQocixuLHQpfX0scn1mdW5jdGlvbiBlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgcj1uW3RdW1FdO2lmKCFyLlApc3dpdGNoKHIuaSl7Y2FzZSA1OmEocikmJmsocik7YnJlYWs7Y2FzZSA0Om8ocikmJmsocil9fX1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgdD1uLnQscj1uLmssZT1ubihyKSxpPWUubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBvPWVbaV07aWYobyE9PVEpe3ZhciBhPXRbb107aWYodm9pZCAwPT09YSYmIXUodCxvKSlyZXR1cm4hMDt2YXIgZj1yW29dLHM9ZiYmZltRXTtpZihzP3MudCE9PWE6IWMoZixhKSlyZXR1cm4hMH19dmFyIHY9ISF0W1FdO3JldHVybiBlLmxlbmd0aCE9PW5uKHQpLmxlbmd0aCsodj8wOjEpfWZ1bmN0aW9uIGEobil7dmFyIHQ9bi5rO2lmKHQubGVuZ3RoIT09bi50Lmxlbmd0aClyZXR1cm4hMDt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsdC5sZW5ndGgtMSk7cmV0dXJuISghcnx8ci5nZXQpfWZ1bmN0aW9uIGYodCl7dC5PJiZuKDMsSlNPTi5zdHJpbmdpZnkocCh0KSkpfXZhciBzPXt9O20oXCJFUzVcIix7SjpmdW5jdGlvbihuLHQpe3ZhciBlPUFycmF5LmlzQXJyYXkobiksaT1mdW5jdGlvbihuLHQpe2lmKG4pe2Zvcih2YXIgZT1BcnJheSh0Lmxlbmd0aCksaT0wO2k8dC5sZW5ndGg7aSsrKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiXCIraSxyKGksITApKTtyZXR1cm4gZX12YXIgbz10bih0KTtkZWxldGUgb1tRXTtmb3IodmFyIHU9bm4obyksYT0wO2E8dS5sZW5ndGg7YSsrKXt2YXIgZj11W2FdO29bZl09cihmLG58fCEhb1tmXS5lbnVtZXJhYmxlKX1yZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksbyl9KGUsbiksbz17aTplPzU6NCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsRDp7fSxsOnQsdDpuLGs6aSxvOm51bGwsTzohMSxDOiExfTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksUSx7dmFsdWU6byx3cml0YWJsZTohMH0pLGl9LFM6ZnVuY3Rpb24obixyLG8pe28/dChyKSYmcltRXS5BPT09biYmZShuLnApOihuLnUmJmZ1bmN0aW9uIG4odCl7aWYodCYmXCJvYmplY3RcIj09dHlwZW9mIHQpe3ZhciByPXRbUV07aWYocil7dmFyIGU9ci50LG89ci5rLGY9ci5ELGM9ci5pO2lmKDQ9PT1jKWkobywoZnVuY3Rpb24odCl7dCE9PVEmJih2b2lkIDAhPT1lW3RdfHx1KGUsdCk/Zlt0XXx8bihvW3RdKTooZlt0XT0hMCxrKHIpKSl9KSksaShlLChmdW5jdGlvbihuKXt2b2lkIDAhPT1vW25dfHx1KG8sbil8fChmW25dPSExLGsocikpfSkpO2Vsc2UgaWYoNT09PWMpe2lmKGEocikmJihrKHIpLGYubGVuZ3RoPSEwKSxvLmxlbmd0aDxlLmxlbmd0aClmb3IodmFyIHM9by5sZW5ndGg7czxlLmxlbmd0aDtzKyspZltzXT0hMTtlbHNlIGZvcih2YXIgdj1lLmxlbmd0aDt2PG8ubGVuZ3RoO3YrKylmW3ZdPSEwO2Zvcih2YXIgcD1NYXRoLm1pbihvLmxlbmd0aCxlLmxlbmd0aCksbD0wO2w8cDtsKyspdm9pZCAwPT09ZltsXSYmbihvW2xdKX19fX0obi5wWzBdKSxlKG4ucCkpfSxLOmZ1bmN0aW9uKG4pe3JldHVybiA0PT09bi5pP28obik6YShuKX19KX1mdW5jdGlvbiBUKCl7ZnVuY3Rpb24gZShuKXtpZighcihuKSlyZXR1cm4gbjtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuLm1hcChlKTtpZihzKG4pKXJldHVybiBuZXcgTWFwKEFycmF5LmZyb20obi5lbnRyaWVzKCkpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuW25bMF0sZShuWzFdKV19KSkpO2lmKHYobikpcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShuKS5tYXAoZSkpO3ZhciB0PU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKG4pKTtmb3IodmFyIGkgaW4gbil0W2ldPWUobltpXSk7cmV0dXJuIHUobixMKSYmKHRbTF09bltMXSksdH1mdW5jdGlvbiBmKG4pe3JldHVybiB0KG4pP2Uobik6bn12YXIgYz1cImFkZFwiO20oXCJQYXRjaGVzXCIseyQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihyKXtmb3IodmFyIGk9ci5wYXRoLHU9ci5vcCxmPXQscz0wO3M8aS5sZW5ndGgtMTtzKyspe3ZhciB2PW8oZikscD1cIlwiK2lbc107MCE9PXYmJjEhPT12fHxcIl9fcHJvdG9fX1wiIT09cCYmXCJjb25zdHJ1Y3RvclwiIT09cHx8bigyNCksXCJmdW5jdGlvblwiPT10eXBlb2YgZiYmXCJwcm90b3R5cGVcIj09PXAmJm4oMjQpLFwib2JqZWN0XCIhPXR5cGVvZihmPWEoZixwKSkmJm4oMTUsaS5qb2luKFwiL1wiKSl9dmFyIGw9byhmKSxkPWUoci52YWx1ZSksaD1pW2kubGVuZ3RoLTFdO3N3aXRjaCh1KXtjYXNlXCJyZXBsYWNlXCI6c3dpdGNoKGwpe2Nhc2UgMjpyZXR1cm4gZi5zZXQoaCxkKTtjYXNlIDM6bigxNik7ZGVmYXVsdDpyZXR1cm4gZltoXT1kfWNhc2UgYzpzd2l0Y2gobCl7Y2FzZSAxOnJldHVyblwiLVwiPT09aD9mLnB1c2goZCk6Zi5zcGxpY2UoaCwwLGQpO2Nhc2UgMjpyZXR1cm4gZi5zZXQoaCxkKTtjYXNlIDM6cmV0dXJuIGYuYWRkKGQpO2RlZmF1bHQ6cmV0dXJuIGZbaF09ZH1jYXNlXCJyZW1vdmVcIjpzd2l0Y2gobCl7Y2FzZSAxOnJldHVybiBmLnNwbGljZShoLDEpO2Nhc2UgMjpyZXR1cm4gZi5kZWxldGUoaCk7Y2FzZSAzOnJldHVybiBmLmRlbGV0ZShyLnZhbHVlKTtkZWZhdWx0OnJldHVybiBkZWxldGUgZltoXX1kZWZhdWx0Om4oMTcsdSl9fSkpLHR9LFI6ZnVuY3Rpb24obix0LHIsZSl7c3dpdGNoKG4uaSl7Y2FzZSAwOmNhc2UgNDpjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKG4sdCxyLGUpe3ZhciBvPW4udCxzPW4ubztpKG4uRCwoZnVuY3Rpb24obixpKXt2YXIgdj1hKG8sbikscD1hKHMsbiksbD1pP3UobyxuKT9cInJlcGxhY2VcIjpjOlwicmVtb3ZlXCI7aWYodiE9PXB8fFwicmVwbGFjZVwiIT09bCl7dmFyIGQ9dC5jb25jYXQobik7ci5wdXNoKFwicmVtb3ZlXCI9PT1sP3tvcDpsLHBhdGg6ZH06e29wOmwscGF0aDpkLHZhbHVlOnB9KSxlLnB1c2gobD09PWM/e29wOlwicmVtb3ZlXCIscGF0aDpkfTpcInJlbW92ZVwiPT09bD97b3A6YyxwYXRoOmQsdmFsdWU6Zih2KX06e29wOlwicmVwbGFjZVwiLHBhdGg6ZCx2YWx1ZTpmKHYpfSl9fSkpfShuLHQscixlKTtjYXNlIDU6Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuLHQscixlKXt2YXIgaT1uLnQsbz1uLkQsdT1uLm87aWYodS5sZW5ndGg8aS5sZW5ndGgpe3ZhciBhPVt1LGldO2k9YVswXSx1PWFbMV07dmFyIHM9W2Uscl07cj1zWzBdLGU9c1sxXX1mb3IodmFyIHY9MDt2PGkubGVuZ3RoO3YrKylpZihvW3ZdJiZ1W3ZdIT09aVt2XSl7dmFyIHA9dC5jb25jYXQoW3ZdKTtyLnB1c2goe29wOlwicmVwbGFjZVwiLHBhdGg6cCx2YWx1ZTpmKHVbdl0pfSksZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOnAsdmFsdWU6ZihpW3ZdKX0pfWZvcih2YXIgbD1pLmxlbmd0aDtsPHUubGVuZ3RoO2wrKyl7dmFyIGQ9dC5jb25jYXQoW2xdKTtyLnB1c2goe29wOmMscGF0aDpkLHZhbHVlOmYodVtsXSl9KX1pLmxlbmd0aDx1Lmxlbmd0aCYmZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOnQuY29uY2F0KFtcImxlbmd0aFwiXSksdmFsdWU6aS5sZW5ndGh9KX0obix0LHIsZSk7Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHQscixlKXt2YXIgaT1uLnQsbz1uLm8sdT0wO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIW8uaGFzKG4pKXt2YXIgaT10LmNvbmNhdChbdV0pO3IucHVzaCh7b3A6XCJyZW1vdmVcIixwYXRoOmksdmFsdWU6bn0pLGUudW5zaGlmdCh7b3A6YyxwYXRoOmksdmFsdWU6bn0pfXUrK30pKSx1PTAsby5mb3JFYWNoKChmdW5jdGlvbihuKXtpZighaS5oYXMobikpe3ZhciBvPXQuY29uY2F0KFt1XSk7ci5wdXNoKHtvcDpjLHBhdGg6byx2YWx1ZTpufSksZS51bnNoaWZ0KHtvcDpcInJlbW92ZVwiLHBhdGg6byx2YWx1ZTpufSl9dSsrfSkpfShuLHQscixlKX19LE06ZnVuY3Rpb24obix0LHIsZSl7ci5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOltdLHZhbHVlOnQ9PT1IP3ZvaWQgMDp0fSksZS5wdXNoKHtvcDpcInJlcGxhY2VcIixwYXRoOltdLHZhbHVlOm4udH0pfX0pfWZ1bmN0aW9uIEMoKXtmdW5jdGlvbiB0KG4sdCl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9bn1hKG4sdCksbi5wcm90b3R5cGU9KHIucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyByKX1mdW5jdGlvbiBlKG4pe24ub3x8KG4uRD1uZXcgTWFwLG4ubz1uZXcgTWFwKG4udCkpfWZ1bmN0aW9uIG8obil7bi5vfHwobi5vPW5ldyBTZXQsbi50LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHIodCkpe3ZhciBlPVIobi5BLmgsdCxuKTtuLnAuc2V0KHQsZSksbi5vLmFkZChlKX1lbHNlIG4uby5hZGQodCl9KSkpfWZ1bmN0aW9uIHUodCl7dC5PJiZuKDMsSlNPTi5zdHJpbmdpZnkocCh0KSkpfXZhciBhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuKGE9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH18fGZ1bmN0aW9uKG4sdCl7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09dFtyXSl9KShuLHQpfSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0aGlzW1FdPXtpOjIsbDp0LEE6dD90LkE6XygpLFA6ITEsSTohMSxvOnZvaWQgMCxEOnZvaWQgMCx0Om4sazp0aGlzLEM6ITEsTzohMX0sdGhpc310KG4sTWFwKTt2YXIgbz1uLnByb3RvdHlwZTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sXCJzaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBwKHRoaXNbUV0pLnNpemV9fSksby5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIHAodGhpc1tRXSkuaGFzKG4pfSxvLnNldD1mdW5jdGlvbihuLHQpe3ZhciByPXRoaXNbUV07cmV0dXJuIHUocikscChyKS5oYXMobikmJnAocikuZ2V0KG4pPT09dHx8KGUociksayhyKSxyLkQuc2V0KG4sITApLHIuby5zZXQobix0KSxyLkQuc2V0KG4sITApKSx0aGlzfSxvLmRlbGV0ZT1mdW5jdGlvbihuKXtpZighdGhpcy5oYXMobikpcmV0dXJuITE7dmFyIHQ9dGhpc1tRXTtyZXR1cm4gdSh0KSxlKHQpLGsodCksdC5ELnNldChuLCExKSx0Lm8uZGVsZXRlKG4pLCEwfSxvLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIG49dGhpc1tRXTt1KG4pLHAobikuc2l6ZSYmKGUobiksayhuKSxuLkQ9bmV3IE1hcCxpKG4udCwoZnVuY3Rpb24odCl7bi5ELnNldCh0LCExKX0pKSxuLm8uY2xlYXIoKSl9LG8uZm9yRWFjaD1mdW5jdGlvbihuLHQpe3ZhciByPXRoaXM7cCh0aGlzW1FdKS5mb3JFYWNoKChmdW5jdGlvbihlLGkpe24uY2FsbCh0LHIuZ2V0KGkpLGkscil9KSl9LG8uZ2V0PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXNbUV07dSh0KTt2YXIgaT1wKHQpLmdldChuKTtpZih0Lkl8fCFyKGkpKXJldHVybiBpO2lmKGkhPT10LnQuZ2V0KG4pKXJldHVybiBpO3ZhciBvPVIodC5BLmgsaSx0KTtyZXR1cm4gZSh0KSx0Lm8uc2V0KG4sbyksb30sby5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpc1tRXSkua2V5cygpfSxvLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBuLHQ9dGhpcyxyPXRoaXMua2V5cygpO3JldHVybihuPXt9KVtWXT1mdW5jdGlvbigpe3JldHVybiB0LnZhbHVlcygpfSxuLm5leHQ9ZnVuY3Rpb24oKXt2YXIgbj1yLm5leHQoKTtyZXR1cm4gbi5kb25lP246e2RvbmU6ITEsdmFsdWU6dC5nZXQobi52YWx1ZSl9fSxufSxvLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbix0PXRoaXMscj10aGlzLmtleXMoKTtyZXR1cm4obj17fSlbVl09ZnVuY3Rpb24oKXtyZXR1cm4gdC5lbnRyaWVzKCl9LG4ubmV4dD1mdW5jdGlvbigpe3ZhciBuPXIubmV4dCgpO2lmKG4uZG9uZSlyZXR1cm4gbjt2YXIgZT10LmdldChuLnZhbHVlKTtyZXR1cm57ZG9uZTohMSx2YWx1ZTpbbi52YWx1ZSxlXX19LG59LG9bVl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9LG59KCksYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtyZXR1cm4gdGhpc1tRXT17aTozLGw6dCxBOnQ/dC5BOl8oKSxQOiExLEk6ITEsbzp2b2lkIDAsdDpuLGs6dGhpcyxwOm5ldyBNYXAsTzohMSxDOiExfSx0aGlzfXQobixTZXQpO3ZhciByPW4ucHJvdG90eXBlO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocixcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHAodGhpc1tRXSkuc2l6ZX19KSxyLmhhcz1mdW5jdGlvbihuKXt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLHQubz8hIXQuby5oYXMobil8fCEoIXQucC5oYXMobil8fCF0Lm8uaGFzKHQucC5nZXQobikpKTp0LnQuaGFzKG4pfSxyLmFkZD1mdW5jdGlvbihuKXt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLHRoaXMuaGFzKG4pfHwobyh0KSxrKHQpLHQuby5hZGQobikpLHRoaXN9LHIuZGVsZXRlPWZ1bmN0aW9uKG4pe2lmKCF0aGlzLmhhcyhuKSlyZXR1cm4hMTt2YXIgdD10aGlzW1FdO3JldHVybiB1KHQpLG8odCksayh0KSx0Lm8uZGVsZXRlKG4pfHwhIXQucC5oYXMobikmJnQuby5kZWxldGUodC5wLmdldChuKSl9LHIuY2xlYXI9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3UobikscChuKS5zaXplJiYobyhuKSxrKG4pLG4uby5jbGVhcigpKX0sci52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3JldHVybiB1KG4pLG8obiksbi5vLnZhbHVlcygpfSxyLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzW1FdO3JldHVybiB1KG4pLG8obiksbi5vLmVudHJpZXMoKX0sci5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzKCl9LHJbVl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZXMoKX0sci5mb3JFYWNoPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciByPXRoaXMudmFsdWVzKCksZT1yLm5leHQoKTshZS5kb25lOyluLmNhbGwodCxlLnZhbHVlLGUudmFsdWUsdGhpcyksZT1yLm5leHQoKX0sbn0oKTttKFwiTWFwU2V0XCIse046ZnVuY3Rpb24obix0KXtyZXR1cm4gbmV3IGYobix0KX0sVDpmdW5jdGlvbihuLHQpe3JldHVybiBuZXcgYyhuLHQpfX0pfWZ1bmN0aW9uIEooKXtOKCksQygpLFQoKX1mdW5jdGlvbiBLKG4pe3JldHVybiBufWZ1bmN0aW9uICQobil7cmV0dXJuIG59dmFyIEcsVSxXPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2woXCJ4XCIpLFg9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1hcCxxPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTZXQsQj1cInVuZGVmaW5lZFwiIT10eXBlb2YgUHJveHkmJnZvaWQgMCE9PVByb3h5LnJldm9jYWJsZSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QsSD1XP1N5bWJvbC5mb3IoXCJpbW1lci1ub3RoaW5nXCIpOigoRz17fSlbXCJpbW1lci1ub3RoaW5nXCJdPSEwLEcpLEw9Vz9TeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpOlwiX18kaW1tZXJfZHJhZnRhYmxlXCIsUT1XP1N5bWJvbC5mb3IoXCJpbW1lci1zdGF0ZVwiKTpcIl9fJGltbWVyX3N0YXRlXCIsVj1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3J8fFwiQEBpdGVyYXRvclwiLFk9ezA6XCJJbGxlZ2FsIHN0YXRlXCIsMTpcIkltbWVyIGRyYWZ0cyBjYW5ub3QgaGF2ZSBjb21wdXRlZCBwcm9wZXJ0aWVzXCIsMjpcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyb3plbiBhbmQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkXCIsMzpmdW5jdGlvbihuKXtyZXR1cm5cIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIrbn0sNDpcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsNTpcIkltbWVyIGZvcmJpZHMgY2lyY3VsYXIgcmVmZXJlbmNlc1wiLDY6XCJUaGUgZmlyc3Qgb3Igc2Vjb25kIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIiw3OlwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsODpcIkZpcnN0IGFyZ3VtZW50IHRvIGBjcmVhdGVEcmFmdGAgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgYW4gYXJyYXksIG9yIGFuIGltbWVyYWJsZSBvYmplY3RcIiw5OlwiRmlyc3QgYXJndW1lbnQgdG8gYGZpbmlzaERyYWZ0YCBtdXN0IGJlIGEgZHJhZnQgcmV0dXJuZWQgYnkgYGNyZWF0ZURyYWZ0YFwiLDEwOlwiVGhlIGdpdmVuIGRyYWZ0IGlzIGFscmVhZHkgZmluYWxpemVkXCIsMTE6XCJPYmplY3QuZGVmaW5lUHJvcGVydHkoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLDEyOlwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIiwxMzpcIkltbWVyIG9ubHkgc3VwcG9ydHMgZGVsZXRpbmcgYXJyYXkgaW5kaWNlc1wiLDE0OlwiSW1tZXIgb25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eVwiLDE1OmZ1bmN0aW9uKG4pe3JldHVyblwiQ2Fubm90IGFwcGx5IHBhdGNoLCBwYXRoIGRvZXNuJ3QgcmVzb2x2ZTogXCIrbn0sMTY6J1NldHMgY2Fubm90IGhhdmUgXCJyZXBsYWNlXCIgcGF0Y2hlcy4nLDE3OmZ1bmN0aW9uKG4pe3JldHVyblwiVW5zdXBwb3J0ZWQgcGF0Y2ggb3BlcmF0aW9uOiBcIitufSwxODpmdW5jdGlvbihuKXtyZXR1cm5cIlRoZSBwbHVnaW4gZm9yICdcIituK1wiJyBoYXMgbm90IGJlZW4gbG9hZGVkIGludG8gSW1tZXIuIFRvIGVuYWJsZSB0aGUgcGx1Z2luLCBpbXBvcnQgYW5kIGNhbGwgYGVuYWJsZVwiK24rXCIoKWAgd2hlbiBpbml0aWFsaXppbmcgeW91ciBhcHBsaWNhdGlvbi5cIn0sMjA6XCJDYW5ub3QgdXNlIHByb3hpZXMgaWYgUHJveHksIFByb3h5LnJldm9jYWJsZSBvciBSZWZsZWN0IGFyZSBub3QgYXZhaWxhYmxlXCIsMjE6ZnVuY3Rpb24obil7cmV0dXJuXCJwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICdcIituK1wiJ1wifSwyMjpmdW5jdGlvbihuKXtyZXR1cm5cIidjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogXCIrbn0sMjM6ZnVuY3Rpb24obil7cmV0dXJuXCInb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiBcIitufSwyNDpcIlBhdGNoaW5nIHJlc2VydmVkIGF0dHJpYnV0ZXMgbGlrZSBfX3Byb3RvX18sIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgaXMgbm90IGFsbG93ZWRcIn0sWj1cIlwiK09iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3Isbm49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3Qub3duS2V5cz9SZWZsZWN0Lm93bktleXM6dm9pZCAwIT09T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9mdW5jdGlvbihuKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikpfTpPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyx0bj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc3x8ZnVuY3Rpb24obil7dmFyIHQ9e307cmV0dXJuIG5uKG4pLmZvckVhY2goKGZ1bmN0aW9uKHIpe3Rbcl09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpfSkpLHR9LHJuPXt9LGVuPXtnZXQ6ZnVuY3Rpb24obix0KXtpZih0PT09USlyZXR1cm4gbjt2YXIgZT1wKG4pO2lmKCF1KGUsdCkpcmV0dXJuIGZ1bmN0aW9uKG4sdCxyKXt2YXIgZSxpPUkodCxyKTtyZXR1cm4gaT9cInZhbHVlXCJpbiBpP2kudmFsdWU6bnVsbD09PShlPWkuZ2V0KXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jYWxsKG4uayk6dm9pZCAwfShuLGUsdCk7dmFyIGk9ZVt0XTtyZXR1cm4gbi5JfHwhcihpKT9pOmk9PT16KG4udCx0KT8oRShuKSxuLm9bdF09UihuLkEuaCxpLG4pKTppfSxoYXM6ZnVuY3Rpb24obix0KXtyZXR1cm4gdCBpbiBwKG4pfSxvd25LZXlzOmZ1bmN0aW9uKG4pe3JldHVybiBSZWZsZWN0Lm93bktleXMocChuKSl9LHNldDpmdW5jdGlvbihuLHQscil7dmFyIGU9SShwKG4pLHQpO2lmKG51bGw9PWU/dm9pZCAwOmUuc2V0KXJldHVybiBlLnNldC5jYWxsKG4uayxyKSwhMDtpZighbi5QKXt2YXIgaT16KHAobiksdCksbz1udWxsPT1pP3ZvaWQgMDppW1FdO2lmKG8mJm8udD09PXIpcmV0dXJuIG4ub1t0XT1yLG4uRFt0XT0hMSwhMDtpZihjKHIsaSkmJih2b2lkIDAhPT1yfHx1KG4udCx0KSkpcmV0dXJuITA7RShuKSxrKG4pfXJldHVybiBuLm9bdF09PT1yJiZcIm51bWJlclwiIT10eXBlb2YgciYmKHZvaWQgMCE9PXJ8fHQgaW4gbi5vKXx8KG4ub1t0XT1yLG4uRFt0XT0hMCwhMCl9LGRlbGV0ZVByb3BlcnR5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHZvaWQgMCE9PXoobi50LHQpfHx0IGluIG4udD8obi5EW3RdPSExLEUobiksayhuKSk6ZGVsZXRlIG4uRFt0XSxuLm8mJmRlbGV0ZSBuLm9bdF0sITB9LGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbihuLHQpe3ZhciByPXAobiksZT1SZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLHQpO3JldHVybiBlP3t3cml0YWJsZTohMCxjb25maWd1cmFibGU6MSE9PW4uaXx8XCJsZW5ndGhcIiE9PXQsZW51bWVyYWJsZTplLmVudW1lcmFibGUsdmFsdWU6clt0XX06ZX0sZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oKXtuKDExKX0sZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuLnQpfSxzZXRQcm90b3R5cGVPZjpmdW5jdGlvbigpe24oMTIpfX0sb249e307aShlbiwoZnVuY3Rpb24obix0KXtvbltuXT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHNbMF09YXJndW1lbnRzWzBdWzBdLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pKSxvbi5kZWxldGVQcm9wZXJ0eT1mdW5jdGlvbih0LHIpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmlzTmFOKHBhcnNlSW50KHIpKSYmbigxMyksZW4uZGVsZXRlUHJvcGVydHkuY2FsbCh0aGlzLHRbMF0scil9LG9uLnNldD1mdW5jdGlvbih0LHIsZSl7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJsZW5ndGhcIiE9PXImJmlzTmFOKHBhcnNlSW50KHIpKSYmbigxNCksZW4uc2V0LmNhbGwodGhpcyx0WzBdLHIsZSx0WzBdKX07dmFyIHVuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT10aGlzO3RoaXMuZz1CLHRoaXMuRj0hMCx0aGlzLnByb2R1Y2U9ZnVuY3Rpb24odCxpLG8pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGkpe3ZhciB1PWk7aT10O3ZhciBhPWU7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXM7dm9pZCAwPT09biYmKG49dSk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsZT1BcnJheShyPjE/ci0xOjApLG89MTtvPHI7bysrKWVbby0xXT1hcmd1bWVudHNbb107cmV0dXJuIGEucHJvZHVjZShuLChmdW5jdGlvbihuKXt2YXIgcjtyZXR1cm4ocj1pKS5jYWxsLmFwcGx5KHIsW3Qsbl0uY29uY2F0KGUpKX0pKX19dmFyIGY7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgaSYmbig2KSx2b2lkIDAhPT1vJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBvJiZuKDcpLHIodCkpe3ZhciBjPXcoZSkscz1SKGUsdCx2b2lkIDApLHY9ITA7dHJ5e2Y9aShzKSx2PSExfWZpbmFsbHl7dj9PKGMpOmcoYyl9cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFByb21pc2UmJmYgaW5zdGFuY2VvZiBQcm9taXNlP2YudGhlbigoZnVuY3Rpb24obil7cmV0dXJuIGooYyxvKSxQKG4sYyl9KSwoZnVuY3Rpb24obil7dGhyb3cgTyhjKSxufSkpOihqKGMsbyksUChmLGMpKX1pZighdHx8XCJvYmplY3RcIiE9dHlwZW9mIHQpe2lmKChmPWkodCkpPT09SClyZXR1cm47cmV0dXJuIHZvaWQgMD09PWYmJihmPXQpLGUuRiYmZChmLCEwKSxmfW4oMjEsdCl9LHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2Ygbj9mdW5jdGlvbih0KXtmb3IodmFyIHI9YXJndW1lbnRzLmxlbmd0aCxpPUFycmF5KHI+MT9yLTE6MCksbz0xO288cjtvKyspaVtvLTFdPWFyZ3VtZW50c1tvXTtyZXR1cm4gZS5wcm9kdWNlV2l0aFBhdGNoZXModCwoZnVuY3Rpb24odCl7cmV0dXJuIG4uYXBwbHkodm9pZCAwLFt0XS5jb25jYXQoaSkpfSkpfTpbZS5wcm9kdWNlKG4sdCwoZnVuY3Rpb24obix0KXtyPW4saT10fSkpLHIsaV07dmFyIHIsaX0sXCJib29sZWFuXCI9PXR5cGVvZihudWxsPT10P3ZvaWQgMDp0LnVzZVByb3hpZXMpJiZ0aGlzLnNldFVzZVByb3hpZXModC51c2VQcm94aWVzKSxcImJvb2xlYW5cIj09dHlwZW9mKG51bGw9PXQ/dm9pZCAwOnQuYXV0b0ZyZWV6ZSkmJnRoaXMuc2V0QXV0b0ZyZWV6ZSh0LmF1dG9GcmVlemUpfXZhciBpPWUucHJvdG90eXBlO3JldHVybiBpLmNyZWF0ZURyYWZ0PWZ1bmN0aW9uKGUpe3IoZSl8fG4oOCksdChlKSYmKGU9RChlKSk7dmFyIGk9dyh0aGlzKSxvPVIodGhpcyxlLHZvaWQgMCk7cmV0dXJuIG9bUV0uQz0hMCxnKGkpLG99LGkuZmluaXNoRHJhZnQ9ZnVuY3Rpb24odCxyKXt2YXIgZT10JiZ0W1FdO1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihlJiZlLkN8fG4oOSksZS5JJiZuKDEwKSk7dmFyIGk9ZS5BO3JldHVybiBqKGksciksUCh2b2lkIDAsaSl9LGkuc2V0QXV0b0ZyZWV6ZT1mdW5jdGlvbihuKXt0aGlzLkY9bn0saS5zZXRVc2VQcm94aWVzPWZ1bmN0aW9uKHQpe3QmJiFCJiZuKDIwKSx0aGlzLmc9dH0saS5hcHBseVBhdGNoZXM9ZnVuY3Rpb24obixyKXt2YXIgZTtmb3IoZT1yLmxlbmd0aC0xO2U+PTA7ZS0tKXt2YXIgaT1yW2VdO2lmKDA9PT1pLnBhdGgubGVuZ3RoJiZcInJlcGxhY2VcIj09PWkub3Ape249aS52YWx1ZTticmVha319ZT4tMSYmKHI9ci5zbGljZShlKzEpKTt2YXIgbz1iKFwiUGF0Y2hlc1wiKS4kO3JldHVybiB0KG4pP28obixyKTp0aGlzLnByb2R1Y2UobiwoZnVuY3Rpb24obil7cmV0dXJuIG8obixyKX0pKX0sZX0oKSxhbj1uZXcgdW4sZm49YW4ucHJvZHVjZSxjbj1hbi5wcm9kdWNlV2l0aFBhdGNoZXMuYmluZChhbiksc249YW4uc2V0QXV0b0ZyZWV6ZS5iaW5kKGFuKSx2bj1hbi5zZXRVc2VQcm94aWVzLmJpbmQoYW4pLHBuPWFuLmFwcGx5UGF0Y2hlcy5iaW5kKGFuKSxsbj1hbi5jcmVhdGVEcmFmdC5iaW5kKGFuKSxkbj1hbi5maW5pc2hEcmFmdC5iaW5kKGFuKTtleHBvcnQgZGVmYXVsdCBmbjtleHBvcnR7dW4gYXMgSW1tZXIscG4gYXMgYXBwbHlQYXRjaGVzLEsgYXMgY2FzdERyYWZ0LCQgYXMgY2FzdEltbXV0YWJsZSxsbiBhcyBjcmVhdGVEcmFmdCxEIGFzIGN1cnJlbnQsSiBhcyBlbmFibGVBbGxQbHVnaW5zLE4gYXMgZW5hYmxlRVM1LEMgYXMgZW5hYmxlTWFwU2V0LFQgYXMgZW5hYmxlUGF0Y2hlcyxkbiBhcyBmaW5pc2hEcmFmdCxkIGFzIGZyZWV6ZSxMIGFzIGltbWVyYWJsZSx0IGFzIGlzRHJhZnQsciBhcyBpc0RyYWZ0YWJsZSxIIGFzIG5vdGhpbmcsZSBhcyBvcmlnaW5hbCxmbiBhcyBwcm9kdWNlLGNuIGFzIHByb2R1Y2VXaXRoUGF0Y2hlcyxzbiBhcyBzZXRBdXRvRnJlZXplLHZuIGFzIHNldFVzZVByb3hpZXN9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW1tZXIuZXNtLmpzLm1hcFxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NoYXJlZC9BcnJheUhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL0NvdW50ZXJcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NoYXJlZC9EYXRlSGVscGVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvSGVscGVyXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvSnNvbkhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL01pZ3JhdGlvbkhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL09iamVjdEhlbHBlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1ByaW9yaXRpemVkXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9zaGFyZWQvUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVyc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1JhbmRvbVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vc2hhcmVkL1hTU0hlbHBlclwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZWQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJyYXlIZWxwZXIgPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIEFycmF5SGVscGVyIHtcbiAgICBzdGF0aWMgcmV2ZXJzZUZpbmQoYXJyYXksIGNhbGxiYWNrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGFycmF5W2ldLCBpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUluZGV4T2YoYXJyYXksIGVsZW1lbnQsIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKGZyb21JbmRleCwgYXJyYXkubGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHN0YXRpYyByZXZlcnNlU29tZShhcnJheSwgY2FsbGJhY2spIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2soYXJyYXlbaV0sIGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUV2ZXJ5KGFycmF5LCBjYWxsYmFjaykge1xuICAgICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2soYXJyYXlbaV0sIGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzdGF0aWMgcmV2ZXJzZUZvckVhY2goYXJyYXksIGNhbGxiYWNrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY2FsbGJhY2soYXJyYXlbaV0sIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luY0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCBydW5Bc3luY2hyb25vdXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJ1bkFzeW5jaHJvbm91cyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHJ1bkFzeW5jaHJvbm91cywgZmFsc2UpO1xuICAgICAgICAgICAgbGV0IHZhbGlkUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjYWxsYmFjayhhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpO1xuICAgICAgICAgICAgICAgIGlmICghcnVuQXN5bmNocm9ub3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJlbnRQcm9taXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWxpZFByb21pc2VzLnB1c2goY3VycmVudFByb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHZhbGlkUHJvbWlzZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHNodWZmbGUoYXJyYXkpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRJbmRleCA9IGFycmF5Lmxlbmd0aCwgdGVtcG9yYXJ5VmFsdWUsIHJhbmRvbUluZGV4O1xuICAgICAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZS4uLlxuICAgICAgICB3aGlsZSAoMCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cbiAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCAtPSAxO1xuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSBhcnJheVtjdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgYXJyYXlbY3VycmVudEluZGV4XSA9IGFycmF5W3JhbmRvbUluZGV4XTtcbiAgICAgICAgICAgIGFycmF5W3JhbmRvbUluZGV4XSA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gICAgc3RhdGljIHJvdGF0ZShhcnJheSwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggJT0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBpbmRleCArPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyQ29weSA9IGFycmF5LnNsaWNlKDApO1xuICAgICAgICBjb25zdCByb3RhdGluZ1BhcnQgPSBhcnJDb3B5LnNwbGljZSgwLCBpbmRleCk7XG4gICAgICAgIGFyckNvcHkucHVzaCguLi5yb3RhdGluZ1BhcnQpO1xuICAgICAgICByZXR1cm4gYXJyQ29weTtcbiAgICB9XG59XG5leHBvcnRzLkFycmF5SGVscGVyID0gQXJyYXlIZWxwZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcnJheUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ291bnRlciA9IHZvaWQgMDtcbmNvbnN0IEhlbHBlcl8xID0gcmVxdWlyZShcIi4vSGVscGVyXCIpO1xuY2xhc3MgQ291bnRlciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb3VudGVyKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWUgPSBIZWxwZXJfMS5IZWxwZXIubm9uTnVsbCh2YWx1ZSwgMCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlKys7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuQ291bnRlciA9IENvdW50ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3VudGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EYXRlSGVscGVyID0gdm9pZCAwO1xuY29uc3QgSGVscGVyXzEgPSByZXF1aXJlKFwiLi9IZWxwZXJcIik7XG5jbGFzcyBEYXRlSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBGb3JtYXRpZXJ0IGVpbiBEYXRlLU9iamVjdCBuYWNoIGRlciBWb3JsYWdlIHZvbiBkZXIgQy1GdW5rdGlvbiBzdHJmdGltZVxuICAgICAqXG4gICAgICogQHBhcmFtIHNGb3JtYXRcbiAgICAgKiBAcGFyYW0gZGF0ZVxuICAgICAqIEBwYXJhbSB1c2VVVENcbiAgICAgKiBAcmV0dXJucyB7Knx2b2lkfHN0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgc3RyZnRpbWUoc0Zvcm1hdCwgZGF0ZSwgdXNlVVRDKSB7XG4gICAgICAgIHVzZVVUQyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHVzZVVUQywgZmFsc2UpO1xuICAgICAgICBkYXRlID0gSGVscGVyXzEuSGVscGVyLm5vbk51bGwoZGF0ZSwgbmV3IERhdGUoKSk7XG4gICAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSlcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgbGV0IG5EYXkgPSAodXNlVVRDKSA/IGRhdGUuZ2V0VVRDRGF5KCkgOiBkYXRlLmdldERheSgpLCBuRGF0ZSA9ICh1c2VVVEMpID8gZGF0ZS5nZXRVVENEYXRlKCkgOiBkYXRlLmdldERhdGUoKSwgbk1vbnRoID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ01vbnRoKCkgOiBkYXRlLmdldE1vbnRoKCksIG5ZZWFyID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgOiBkYXRlLmdldEZ1bGxZZWFyKCksIG5Ib3VyID0gKHVzZVVUQykgPyBkYXRlLmdldFVUQ0hvdXJzKCkgOiBkYXRlLmdldEhvdXJzKCksIGFEYXlzID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLCBhRGF5c1Nob3J0ID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSwgYU1vbnRocyA9IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLCBhRGF5Q291bnQgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzRdLCBpc0xlYXBZZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKChuWWVhciAmIDMpICE9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBuWWVhciAlIDEwMCAhPT0gMCB8fCBuWWVhciAlIDQwMCA9PT0gMDtcbiAgICAgICAgfSwgZ2V0VGh1cnNkYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0RGF0ZShuRGF0ZSAtICgobkRheSArIDYpICUgNykgKyAzKTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH0sIHplcm9QYWQgPSBmdW5jdGlvbiAobk51bSwgblBhZCkge1xuICAgICAgICAgICAgcmV0dXJuICgnJyArIChNYXRoLnBvdygxMCwgblBhZCkgKyBuTnVtKSkuc2xpY2UoMSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzRm9ybWF0LnJlcGxhY2UoLyVbYS16XS9naSwgKHNNYXRjaCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnJWEnOiB0aGlzLnRyYW5zbGF0ZShhRGF5c1Nob3J0W25EYXldKSxcbiAgICAgICAgICAgICAgICAnJUEnOiB0aGlzLnRyYW5zbGF0ZShhRGF5c1tuRGF5XSksXG4gICAgICAgICAgICAgICAgJyViJzogdGhpcy50cmFuc2xhdGUoYU1vbnRoc1tuTW9udGhdLnNsaWNlKDAsIDMpKSxcbiAgICAgICAgICAgICAgICAnJUInOiB0aGlzLnRyYW5zbGF0ZShhTW9udGhzW25Nb250aF0pLFxuICAgICAgICAgICAgICAgICclYyc6IGRhdGUudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAnJUMnOiBNYXRoLmZsb29yKG5ZZWFyIC8gMTAwKSxcbiAgICAgICAgICAgICAgICAnJWQnOiB6ZXJvUGFkKG5EYXRlLCAyKSxcbiAgICAgICAgICAgICAgICAnJWUnOiBuRGF0ZSxcbiAgICAgICAgICAgICAgICAnJWYnOiB6ZXJvUGFkKGRhdGUuZ2V0VGltZSgpICUgMTAwMCwgNCksXG4gICAgICAgICAgICAgICAgJyVGJzogZGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgICAgICAgICAgICAnJUcnOiBnZXRUaHVyc2RheSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgJyVnJzogKCcnICsgZ2V0VGh1cnNkYXkoKS5nZXRGdWxsWWVhcigpKS5zbGljZSgyKSxcbiAgICAgICAgICAgICAgICAnJUgnOiB6ZXJvUGFkKG5Ib3VyLCAyKSxcbiAgICAgICAgICAgICAgICAnJUknOiB6ZXJvUGFkKChuSG91ciArIDExKSAlIDEyICsgMSwgMiksXG4gICAgICAgICAgICAgICAgJyVqJzogemVyb1BhZChhRGF5Q291bnRbbk1vbnRoXSArIG5EYXRlICsgKChuTW9udGggPiAxICYmIGlzTGVhcFllYXIoKSkgPyAxIDogMCksIDMpLFxuICAgICAgICAgICAgICAgICclayc6ICcnICsgbkhvdXIsXG4gICAgICAgICAgICAgICAgJyVsJzogKG5Ib3VyICsgMTEpICUgMTIgKyAxLFxuICAgICAgICAgICAgICAgICclbSc6IHplcm9QYWQobk1vbnRoICsgMSwgMiksXG4gICAgICAgICAgICAgICAgJyVNJzogemVyb1BhZChkYXRlLmdldE1pbnV0ZXMoKSwgMiksXG4gICAgICAgICAgICAgICAgJyVwJzogKG5Ib3VyIDwgMTIpID8gJ0FNJyA6ICdQTScsXG4gICAgICAgICAgICAgICAgJyVQJzogKG5Ib3VyIDwgMTIpID8gJ2FtJyA6ICdwbScsXG4gICAgICAgICAgICAgICAgJyVzJzogTWF0aC5yb3VuZChkYXRlLmdldFRpbWUoKSAvIDEwMDApLFxuICAgICAgICAgICAgICAgICclUyc6IHplcm9QYWQoZGF0ZS5nZXRTZWNvbmRzKCksIDIpLFxuICAgICAgICAgICAgICAgICcldSc6IG5EYXkgfHwgNyxcbiAgICAgICAgICAgICAgICAnJXcnOiAnJyArIG5EYXksXG4gICAgICAgICAgICAgICAgJyV4JzogZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAnJVgnOiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZygpLFxuICAgICAgICAgICAgICAgICcleSc6ICgnJyArIG5ZZWFyKS5zbGljZSgyKSxcbiAgICAgICAgICAgICAgICAnJVknOiBuWWVhcixcbiAgICAgICAgICAgICAgICAnJXonOiBkYXRlLnRvVGltZVN0cmluZygpLnJlcGxhY2UoLy4rR01UKFsrLV1cXGQrKS4rLywgJyQxJyksXG4gICAgICAgICAgICAgICAgJyVaJzogZGF0ZS50b1RpbWVTdHJpbmcoKS5yZXBsYWNlKC8uK1xcKCguKz8pXFwpJC8sICckMScpXG4gICAgICAgICAgICB9W3NNYXRjaF0gfHwgc01hdGNoO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRyYW5zbGF0ZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRpb25DYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25DYWxsYmFjayhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHN0YXRpYyBzZXRUcmFuc2xhdGlvbkNhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICBzdGF0aWMgZHVyYXRpb24odGltZUluU2Vjb25kcywgbG9jYWxlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG5vblBhZGRlZEludGwgPSBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgbWluaW11bUludGVnZXJEaWdpdHM6IDEgfSk7XG4gICAgICAgIGNvbnN0IHBhZGRlZEludGwgPSBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgbWluaW11bUludGVnZXJEaWdpdHM6IDIgfSk7XG4gICAgICAgIGNvbnN0IFtkZWxpbWl0ZXJdID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLXVzJykubWF0Y2goL1xcYls6Ll1cXGIvKTtcbiAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRpbWVJblNlY29uZHMgLyAzNjAwKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IodGltZUluU2Vjb25kcyAvIDYwKSAlIDYwO1xuICAgICAgICBjb25zdCBzZWNvbmRzID0gdGltZUluU2Vjb25kcyAlIDYwO1xuICAgICAgICBjb25zdCBpbmRleFRvUGFkID0gaG91cnMgPyAwIDogMTtcbiAgICAgICAgcmV0dXJuIFtob3VycywgbWludXRlcywgc2Vjb25kc11cbiAgICAgICAgICAgIC5tYXAoKHZhbCwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh2YWwgPCAxMCAmJiBpID4gaW5kZXhUb1BhZCkgPyBwYWRkZWRJbnRsLmZvcm1hdCh2YWwpIDogbm9uUGFkZGVkSW50bC5mb3JtYXQodmFsKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gISh2YWwgPT09ICcwMCcgfHwgdmFsID09PSAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihkZWxpbWl0ZXIpO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0ZUhlbHBlciA9IERhdGVIZWxwZXI7XG5EYXRlSGVscGVyLkZPUk1BVCA9IHtcbiAgICBJU09fVElNRTogXCIlWS0lbS0lZFQlSDolTTolU1wiXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0ZUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IZWxwZXIgPSB2b2lkIDA7XG4vKipcbiAqIEVpbmUgS2xhc3NlIG1pdCBow6R1ZmlnIGdlbnV0enRlbiwgbsO8dHpsaWNoZW4gRnVua3Rpb25lblxuICovXG5jb25zdCBKc29uSGVscGVyXzEgPSByZXF1aXJlKFwiLi9Kc29uSGVscGVyXCIpO1xuY29uc3QgQXJyYXlIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0FycmF5SGVscGVyXCIpO1xuY29uc3QgUHJvbWlzZVdpdGhIYW5kbGVyc18xID0gcmVxdWlyZShcIi4vUHJvbWlzZXMvUHJvbWlzZVdpdGhIYW5kbGVyc1wiKTtcbmNvbnN0IE9iamVjdEhlbHBlcl8xID0gcmVxdWlyZShcIi4vT2JqZWN0SGVscGVyXCIpO1xuY2xhc3MgSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiBUZXN0ZXQsIG9iIGVpbmUgVmFyaWFibGUgbnVsbCBvZGVyIFVuZGVmaW5lZCBpc3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YXJpYWJsZVxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzTnVsbCh2YXJpYWJsZSwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gSGVscGVyLmlzQWxsTnVsbCguLi5hcmd1bWVudHMpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBbGxOdWxsKC4uLmFyZ3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIShhcmdzW2ldID09PSBudWxsIHx8IGFyZ3NbaV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHN0YXRpYyBpc0F0TGVhc3RPbmVOdWxsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuICFIZWxwZXIuaXNBbGxOdWxsKC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXN0ZXQsIG9iIGVpbmUgVmFyaWFibGUgbmljaHQgKG51bGwgb2RlciB1bmRlZmluZWQpIGlzdFxuICAgICAqXG4gICAgICogQHBhcmFtIHZhcmlhYmxlXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNOb3ROdWxsKHZhcmlhYmxlLCAuLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBIZWxwZXIuaXNBbGxOb3ROdWxsKC4uLmFyZ3VtZW50cyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0FsbE5vdE51bGwoLi4uYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoYXJnc1tpXSA9PT0gbnVsbCB8fCBhcmdzW2ldID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBdExlYXN0T25lTm90TnVsbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiAhSGVscGVyLmlzQWxsTnVsbCguLi5hcmdzKTtcbiAgICB9XG4gICAgc3RhdGljIGRlbGF5KGR1cmF0aW9uLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShhcmdzKSwgZHVyYXRpb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2lidCBkZW4gZXJzdGVuIMO8YmVyZ2ViZW5lbiBXZXJ0LCBkZXIgbmljaHQgKG51bGwgb2RlciB1bmRlZmluZWQpIGlzdCwgenVyw7xja1xuICAgICAqXG4gICAgICogQHBhcmFtIHZhbDFcbiAgICAgKiBAcGFyYW0gdmFsMlxuICAgICAqIEBwYXJhbSBhcmdzXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIG5vbk51bGwodmFsMSwgdmFsMiwgLi4uYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKEhlbHBlci5pc05vdE51bGwoYXJndW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3RldCwgb2IgZWluIFdlcnQgbnVsbCBvZGVyIExlZXJzdHJpbmcsIGJ6dyBudXIgYXVzIGxlZXJ6ZWljaGVuZCBiZXN0ZWhlbmRlciBTdHJpbmcgaXN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZW1wdHkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChIZWxwZXIuaXNOdWxsKHZhbHVlKSB8fCAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09IFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVzdGV0LCBvYiBlaW4gV2VydCBOSUNIVCAobnVsbCBvZGVyIExlZXJzdHJpbmcsIGJ6dyBudXIgYXVzIGxlZXJ6ZWljaGVuZCBiZXN0ZWhlbmRlciBTdHJpbmcgaXN0KVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIG5vdEVtcHR5KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhSGVscGVyLmVtcHR5KHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGFycmF5VG9PYmplY3QoYXJyYXksIGluZGV4RnVuY3Rpb24pIHtcbiAgICAgICAgbGV0IG9iaiA9IHt9O1xuICAgICAgICBhcnJheS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICBvYmpbaW5kZXhGdW5jdGlvbih2YWwpXSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVyc3RlbGx0IGVpbiBGb3JtRGF0YS1PYmplY3Qgdm9uIEpTT04tRGF0YS4gTsO8dHpsaWNoIGbDvHIgZmV0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmpcbiAgICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gICAgICovXG4gICAgc3RhdGljIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5zZXQoaywgb2JqW2tdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuICAgIHN0YXRpYyBwYWRaZXJvKG4sIHdpZHRoLCB6KSB7XG4gICAgICAgIHogPSBIZWxwZXIubm9uTnVsbCh6LCAnMCcpO1xuICAgICAgICBuID0gbiArICcnO1xuICAgICAgICB3aWR0aCA9IEhlbHBlci5ub25OdWxsKHdpZHRoLCAxKTtcbiAgICAgICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbih6KSArIG47XG4gICAgfVxuICAgIC8vw4RsdGVyZSBldnRsIG7DvHR6bGljaGUgRnVua3Rpb25lblxuICAgIHN0YXRpYyBodG1sc3BlY2lhbGNoYXJzRGVjb2RlKHRleHQpIHtcbiAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgJyZhbXA7JzogJyYnLFxuICAgICAgICAgICAgJyYjMDM4Oyc6IFwiJlwiLFxuICAgICAgICAgICAgJyZsdDsnOiAnPCcsXG4gICAgICAgICAgICAnJmd0Oyc6ICc+JyxcbiAgICAgICAgICAgICcmcXVvdDsnOiAnXCInLFxuICAgICAgICAgICAgJyYjMDM5Oyc6IFwiJ1wiLFxuICAgICAgICAgICAgJyYjODIxNzsnOiBcIuKAmVwiLFxuICAgICAgICAgICAgJyYjODIxNjsnOiBcIuKAmFwiLFxuICAgICAgICAgICAgJyYjODIxMTsnOiBcIuKAk1wiLFxuICAgICAgICAgICAgJyYjODIxMjsnOiBcIuKAlFwiLFxuICAgICAgICAgICAgJyYjODIzMDsnOiBcIuKAplwiLFxuICAgICAgICAgICAgJyYjODIyMTsnOiAn4oCdJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAoSGVscGVyLmlzTm90TnVsbCh0ZXh0KSAmJiB0eXBlb2YgdGV4dC5yZXBsYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcJltcXHdcXGRcXCNdezIsNX1cXDsvZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwW21dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHN0YXRpYyBlc2NhcGVSZWdFeHAoc3RyKSB7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcbiAgICB9XG4gICAgc3RhdGljIGltYWdlVXJsSXNFbXB0eSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIChIZWxwZXIuaXNOdWxsKHVybCkgfHwgdXJsLnRyaW0oKSA9PT0gXCJcIiB8fCB1cmwudHJpbSgpID09PSBcImRhdGE6XCIpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNNb2JpbGVBcHAoKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHdpbmRvd1tcImRldmljZVwiXSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3dbXCJkZXZpY2VcIl0ucGxhdGZvcm0gIT09IFwiYnJvd3NlclwiKTtcbiAgICB9XG4gICAgc3RhdGljIHRvU25ha2VDYXNlKGNhbWVsQ2FzZSkge1xuICAgICAgICByZXR1cm4gY2FtZWxDYXNlLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKGZpbmQsIHNvbWV0aGluZywgcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKHBvc2l0aW9uID4gMCkgPyBcIl9cIiA6IFwiXCIpICsgZmluZFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHdhaXQodGltZW91dCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UociA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHIocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRpbWVvdXQodGltZSwgb3RoZXJQcm9taXNlLCB0aW1lb3V0UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtvdGhlclByb21pc2UsIEhlbHBlci53YWl0KHRpbWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lb3V0UmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBleGVjTm9uVGhyb3coZm4pIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGZuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIEFycmF5SGVscGVyLnNodWZmbGUgaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBzaHVmZmxlQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyXzEuQXJyYXlIZWxwZXIuc2h1ZmZsZShhcnJheSk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgQXJyYXlIZWxwZXIucmV2ZXJzZUZvckVhY2ggaW5zdGVhZCAqL1xuICAgIHN0YXRpYyByZXZlcnNlRm9yRWFjaChhcnJheSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyXzEuQXJyYXlIZWxwZXIucmV2ZXJzZUZvckVhY2goYXJyYXksIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBBcnJheUhlbHBlci5hc3luY0ZvckVhY2ggaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBhc3luY0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCBydW5Bc3luY2hyb25vdXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheUhlbHBlcl8xLkFycmF5SGVscGVyLmFzeW5jRm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIHJ1bkFzeW5jaHJvbm91cyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIE9iamVjdEhlbHBlci5vYmplY3RGb3JFYWNoIGluc3RlYWQgKi9cbiAgICBzdGF0aWMgb2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBPYmplY3RIZWxwZXJfMS5PYmplY3RIZWxwZXIub2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBPYmplY3RIZWxwZXIudG9BcnJheSBpbnN0ZWFkICovXG4gICAgc3RhdGljIHRvQXJyYXkob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3RIZWxwZXJfMS5PYmplY3RIZWxwZXIudG9BcnJheShvYmplY3QpO1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5kZWVwRXF1YWwgaW5zdGVhZCAqL1xuICAgIHN0YXRpYyBkZWVwRXF1YWwoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0SGVscGVyXzEuT2JqZWN0SGVscGVyLmRlZXBFcXVhbChhLCBiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5pbnZlcnRLZXlWYWx1ZXMgaW5zdGVhZFxuICAgICAqXG4gICAgICogSW52ZXJ0cyB0aGUga2V5LVZhbHVlcyBmb3IgYW4gb2JqZWN0XG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgc3RhdGljIGludmVydEtleVZhbHVlcyhvYmopIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEhlbHBlcl8xLk9iamVjdEhlbHBlci5pbnZlcnRLZXlWYWx1ZXMob2JqKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIE9iamVjdEhlbHBlci5pc1NldCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBUZXN0ZXQsIG9iIGRlciDDvGJlcmdlYmVuZSBJbmRleCBhbSBPYmpla3QgZ2VzZXR6dCBpc3QuIFdlcmRlbiBtZWhyZXJlIEluZGV4ZXMgw7xiZXJnZWJlbiwgc28gd2lyZCBnZXRlc3RldCxcbiAgICAgKiBvYiBkaWUgXCJJbmRleC1LZXR0ZVwiIGdlc2V0enQgaXN0LlxuICAgICAqIEJzcC46XG4gICAgICogIEhlbHBlci5pc1NldCh7XCJpbmRleDFcIjp7XCJpbmRleDJcIjp2YWx1ZX19LCBcImluZGV4MVwiLCBcImluZGV4MlwiKSBpc3Qgd2FoclxuICAgICAqXG4gICAgICogQHBhcmFtIG9iamVjdFxuICAgICAqIEBwYXJhbSBpbmRleGVzXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIGlzU2V0KG9iamVjdCwgLi4uaW5kZXhlcykge1xuICAgICAgICByZXR1cm4gT2JqZWN0SGVscGVyXzEuT2JqZWN0SGVscGVyLmlzU2V0KG9iamVjdCwgLi4uaW5kZXhlcyk7XG4gICAgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgUHJvbWlzZVdpdGhIYW5kbGVycyBpbnN0ZWFkICovXG4gICAgc3RhdGljIG5ld1Byb21pc2VXaXRoUmVzb2x2ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlV2l0aEhhbmRsZXJzXzEuUHJvbWlzZVdpdGhIYW5kbGVycygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgSnNvbkhlbHBlci5kZWVwQ29weSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBEZWVwY29waWVzIEpTT05cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmpcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xvbmVKc29uKG9iaikge1xuICAgICAgICByZXR1cm4gSnNvbkhlbHBlcl8xLkpzb25IZWxwZXIuZGVlcENvcHkob2JqKTtcbiAgICB9XG59XG5leHBvcnRzLkhlbHBlciA9IEhlbHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhlbHBlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSnNvbkhlbHBlciA9IHZvaWQgMDtcbmNvbnN0IEhlbHBlcl8xID0gcmVxdWlyZShcIi4vSGVscGVyXCIpO1xuY2xhc3MgSnNvbkhlbHBlciB7XG4gICAgc3RhdGljIGRlZXBFcXVhbChhLCBiKSB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJyYXkgZGVlcEVxdWFsXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgQXJyYXkgJiYgYiBpbnN0YW5jZW9mIEFycmF5ICYmIGEubGVuZ3RoID09PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGFbXCJldmVyeVwiXSgob2JqLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpzb25IZWxwZXIuZGVlcEVxdWFsKG9iaiwgYltpXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvL2RhdGUgZGVlcEVxdWFsXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgZGVlcCBjb3B5XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgbGV0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgICAgICBsZXQgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgICAgICAgIHJldHVybiBhS2V5cy5sZW5ndGggPT09IGJLZXlzLmxlbmd0aCAmJiBhS2V5c1tcImV2ZXJ5XCJdKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSGVscGVyXzEuSGVscGVyLmlzTm90TnVsbChiW2tleV0pICYmIEpzb25IZWxwZXIuZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vZWxzZSBpcyBmYWxzZSAob3Igbm90IGhhbmRsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVlcGNvcGllcyBKU09OXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgc3RhdGljIGRlZXBDb3B5KG9iaikge1xuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTIwNDc1L2hvdy10by1jcmVhdGUtYW5kLWNsb25lLWEtanNvbi1vYmplY3QvMTc1MDI5OTAjMTc1MDI5OTBcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIC8vIGJhc2ljIHR5cGUgZGVlcCBjb3B5XG4gICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOdWxsKG9iaikgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJyYXkgZGVlcCBjb3B5XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgbGV0IGNsb25lQSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNsb25lQVtpXSA9IEpzb25IZWxwZXIuZGVlcENvcHkob2JqW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZUE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmouZ2V0VGltZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgZGVlcCBjb3B5XG4gICAgICAgIGxldCBjbG9uZU8gPSB7fTtcbiAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgY2xvbmVPW2ldID0gSnNvbkhlbHBlci5kZWVwQ29weShvYmpbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZU87XG4gICAgfVxuICAgIHN0YXRpYyBkZWVwQXNzaWduKC4uLm9iamVjdHMpIHtcbiAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KG9iamVjdHMpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIG9iamVjdHMuZm9yRWFjaChhcnIgPT4gcmVzdWx0LnB1c2goLi4uYXJyKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHt9O1xuICAgICAgICBvYmplY3RzLmZvckVhY2gob2JqID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdE9ialtpXSAmJiB0eXBlb2Ygb2JqW2ldID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZXN1bHRPYmpbaV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0T2JqW2ldID0gSnNvbkhlbHBlci5kZWVwQXNzaWduKHJlc3VsdE9ialtpXSwgb2JqW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdE9ialtpXSA9IG9ialtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0T2JqO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGlmZihhLCBiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGNoYW5nZWQ6IHt9LFxuICAgICAgICAgICAgYWRkZWQ6IHt9LFxuICAgICAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgIH07XG4gICAgICAgIC8vIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpe1xuICAgICAgICAvLyAgICAgY29uc3QgbGVuZ3RoQSA9IGEubGVuZ3RoO1xuICAgICAgICAvLyAgICAgY29uc3QgbGVuZ3RoQiA9IGIubGVuZ3RoO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4obGVuZ3RoQSwgbGVuZ3RoQik7XG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkxlbmd0aDsgaSsrKXtcbiAgICAgICAgLy8gICAgICAgICBjb25zdFxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmICgodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAmJiAoIUFycmF5LmlzQXJyYXkoYSkgJiYgIUFycmF5LmlzQXJyYXkoYikpKSB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzQWRkZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiBhKSB7XG4gICAgICAgICAgICBpZiAoaSBpbiBiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gSnNvbkhlbHBlci5nZXREaWZmKGFbaV0sIGJbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNoYW5nZWRbaV0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVkLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgaGFzUmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSBpbiBiKSB7XG4gICAgICAgICAgICBpZiAoIShpIGluIGEpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZGVkW2ldID0gYltpXTtcbiAgICAgICAgICAgICAgICBoYXNBZGRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1JlbW92ZWQgfHwgaGFzQWRkZWQgfHwgaGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhcHBseURpZmYob2JqLCBkaWZmKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkaWZmLnJlbW92ZWQpKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhkaWZmLmNoYW5nZWQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChcInZhbHVlXCIgaW4gZGlmZi5jaGFuZ2VkW2tleV0pIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XSA9IGRpZmYuY2hhbmdlZFtrZXldLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBKc29uSGVscGVyLmFwcGx5RGlmZihvYmpba2V5XSwgZGlmZi5jaGFuZ2VkW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5hZGRlZCkuZm9yRWFjaChrZXkgPT4gb2JqW2tleV0gPSBkaWZmLmFkZGVkW2tleV0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBkaWZmLnJlbW92ZWQuc29ydCgoYSwgYikgPT4gKHBhcnNlSW50KGIpIC0gcGFyc2VJbnQoYSkpKS5mb3JFYWNoKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgICBvYmouc3BsaWNlKHBhcnNlSW50KGluZGV4KSwgMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpZmYucmVtb3ZlZC5mb3JFYWNoKHJlbSA9PiBkZWxldGUgb2JqW3JlbV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxufVxuZXhwb3J0cy5Kc29uSGVscGVyID0gSnNvbkhlbHBlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpzb25IZWxwZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWlncmF0aW9uSGVscGVyID0gdm9pZCAwO1xuY29uc3QgdHlwZW9ybV8xID0gcmVxdWlyZShcInR5cGVvcm1cIik7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIE1pZ3JhdGlvbkhlbHBlciB7XG4gICAgc3RhdGljIGlzU2VydmVyKCkge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIik7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRUYWJsZUZyb21Nb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUodGhpcy5jcmVhdGVUYWJsZUZyb21Nb2RlbENsYXNzKG1vZGVsQ2xhc3MpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBhZGRNYW55VG9NYW55VGFibGUodGFibGVPbmUsIHRhYmxlVHdvLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRoaXMuY3JlYXRlTWFueVRvTWFueVRhYmxlKHRhYmxlT25lLCB0YWJsZVR3bykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZU1hbnlUb01hbnlUYWJsZSh0YWJsZU9uZSwgdGFibGVUd28pIHtcbiAgICAgICAgbGV0IGZpZWxkT25lID0gdGFibGVPbmUgKyBcIklkXCI7XG4gICAgICAgIGxldCBmaWVsZFR3byA9IHRhYmxlVHdvICsgXCJJZFwiO1xuICAgICAgICBsZXQgbmFtZSA9IHRhYmxlT25lICsgdGFibGVUd28uc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0YWJsZVR3by5zdWJzdHIoMSk7XG4gICAgICAgIGxldCBtYW55VG9NYW55VGFibGUgPSBuZXcgdHlwZW9ybV8xLlRhYmxlKHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZE9uZSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFR3byxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpbmRpY2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIklEWF9cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkT25lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkT25lXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIklEWF9cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkVHdvLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkVHdvXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJGS19cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkT25lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkT25lXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogdGFibGVPbmUucmVwbGFjZSgvKFtBLVpdKS8sIChtYXRjaCwgcDEpID0+IFwiX1wiICsgcDEudG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBcImNhc2NhZGVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJGS19cIiArIG5hbWUgKyBcIl9cIiArIGZpZWxkVHdvLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2ZpZWxkVHdvXSxcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogdGFibGVUd28ucmVwbGFjZSgvKFtBLVpdKS8sIChtYXRjaCwgcDEpID0+IFwiX1wiICsgcDEudG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl0sXG4gICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBcImNhc2NhZGVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hbnlUb01hbnlUYWJsZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVRhYmxlRnJvbU1vZGVsQ2xhc3MobW9kZWxDbGFzcywgcHJlZml4KSB7XG4gICAgICAgIHByZWZpeCA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHByZWZpeCwgXCJcIik7XG4gICAgICAgIGxldCBjb2x1bW5zID0gW107XG4gICAgICAgIGxldCBpbmRpY2VzID0gW107XG4gICAgICAgIGxldCBmb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICBsZXQgc2NoZW1hRGVmaW5pdGlvbiA9IG1vZGVsQ2xhc3MuZ2V0U2NoZW1hRGVmaW5pdGlvbigpO1xuICAgICAgICBsZXQgdGFibGVOYW1lID0gcHJlZml4ICsgSGVscGVyXzEuSGVscGVyLnRvU25ha2VDYXNlKHNjaGVtYURlZmluaXRpb24ubmFtZSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHNjaGVtYURlZmluaXRpb24uY29sdW1ucykuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgICAgbGV0IGNvbHVtbkNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdba2V5XSA9IHNjaGVtYURlZmluaXRpb24uY29sdW1uc1tjb2x1bW5dW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcIm5hbWVcIl0gPSBjb2x1bW47XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0ucHJpbWFyeSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImlzUHJpbWFyeVwiXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5jb2x1bW5zW2NvbHVtbl0ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJpc051bGxhYmxlXCJdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY2hlbWFEZWZpbml0aW9uLmNvbHVtbnNbY29sdW1uXS5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAvL0lmIGl0IGlzIG5vdCBFYXN5U3luY0Jhc2VNb2RlbCBvciBzZXJ2ZXJcbiAgICAgICAgICAgICAgICBpZiAoSGVscGVyXzEuSGVscGVyLmlzTnVsbChtb2RlbENsYXNzLkNBTl9CRV9TWU5DRUQpIHx8IHRoaXMuaXNTZXJ2ZXIoKSB8fCBjb2x1bW4gPT09IFwiY2xpZW50SWRcIikge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJpc0dlbmVyYXRlZFwiXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImdlbmVyYXRpb25TdHJhdGVneVwiXSA9IFwiaW5jcmVtZW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJ0eXBlXCJdID0gXCJJTlRFR0VSXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbkNvbmZpZ1tcImRlZmF1bHRcIl0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID0gXCInXCIgKyBjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdICsgXCInXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1wiZGVmYXVsdFwiXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5Db25maWdbXCJkZWZhdWx0XCJdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcImRlZmF1bHRcIl0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPT09IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5TSU1QTEVfSlNPTikge1xuICAgICAgICAgICAgICAgIGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPSBNaWdyYXRpb25IZWxwZXIuVFlQRVMuVEVYVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW5Db25maWdbXCJ0eXBlXCJdID09PSBNaWdyYXRpb25IZWxwZXIuVFlQRVMuTUVESVVNVEVYVCAmJiAhdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1widHlwZVwiXSA9IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5URVhUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbkNvbmZpZ1tcInR5cGVcIl0gPT09IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5TSU1QTEVfSlNPTiAmJiAhdGhpcy5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uQ29uZmlnW1widHlwZVwiXSA9IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5URVhUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbkNvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWFEZWZpbml0aW9uLnJlbGF0aW9ucykuZm9yRWFjaChyZWxhdGlvbiA9PiB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hRGVmaW5pdGlvbi5yZWxhdGlvbnNbcmVsYXRpb25dLnR5cGUgPT09IFwibWFueS10by1vbmVcIiB8fCBzY2hlbWFEZWZpbml0aW9uLnJlbGF0aW9uc1tyZWxhdGlvbl0uam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIC8vIGxldCBjb2x1bW5OYW1lID0gSGVscGVyLnRvU25ha2VDYXNlKHJlbGF0aW9uKSArIFwiSWRcIjtcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uTmFtZSA9IHJlbGF0aW9uLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgcmVsYXRpb24uc3Vic3RyKDEpICsgXCJJZFwiO1xuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE1pZ3JhdGlvbkhlbHBlci5UWVBFUy5JTlRFR0VSLFxuICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uQ29uZmlnKTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiSURYX1wiICsgdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2NvbHVtbk5hbWVdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCBmb3JlaWduS2V5Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkZLX1wiICsgdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2NvbHVtbk5hbWVdLFxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBIZWxwZXJfMS5IZWxwZXIudG9TbmFrZUNhc2Uoc2NoZW1hRGVmaW5pdGlvbi5yZWxhdGlvbnNbcmVsYXRpb25dLnRhcmdldCksXG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogW1wiaWRcIl1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzLnB1c2goZm9yZWlnbktleUNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IHR5cGVvcm1fMS5UYWJsZSh7XG4gICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgaW5kaWNlczogaW5kaWNlcyxcbiAgICAgICAgICAgIGZvcmVpZ25LZXlzOiBmb3JlaWduS2V5c1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHVwZGF0ZU1vZGVsKHF1ZXJ5UnVubmVyLCBuZXdNb2RlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IHNjaGVtYURlZmluaXRpb24gPSBuZXdNb2RlbC5nZXRTY2hlbWFEZWZpbml0aW9uKCk7XG4gICAgICAgICAgICBsZXQgdGFibGVOYW1lID0gSGVscGVyXzEuSGVscGVyLnRvU25ha2VDYXNlKHNjaGVtYURlZmluaXRpb24ubmFtZSk7XG4gICAgICAgICAgICBsZXQgbmV3VGFibGUgPSB0aGlzLmNyZWF0ZVRhYmxlRnJvbU1vZGVsQ2xhc3MobmV3TW9kZWwpO1xuICAgICAgICAgICAgbGV0IHRhYmxlID0geWllbGQgcXVlcnlSdW5uZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICAgIHRhYmxlLm5hbWUgPSBcIl9fdGVtcF9fXCIgKyB0YWJsZS5uYW1lO1xuICAgICAgICAgICAgdGFibGUuaW5kaWNlcy5mb3JFYWNoKGluZGV4ID0+IHtcbiAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gXCJfX3RlbXBfX1wiICsgaW5kZXgubmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGFibGUuZm9yZWlnbktleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGtleS5uYW1lID0gXCJfX3RlbXBfX1wiICsga2V5Lm5hbWU7XG4gICAgICAgICAgICAgICAga2V5LmNvbHVtbk5hbWVzID0gW2tleS5jb2x1bW5OYW1lc1swXV07XG4gICAgICAgICAgICAgICAga2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtrZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzWzBdXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKE1pZ3JhdGlvbkhlbHBlci5pc1NlcnZlcigpKSB7XG4gICAgICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZGVmYXVsdCAhPT0gbnVsbCAmJiB0eXBlb2YgY29sdW1uLmRlZmF1bHQgPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmRlZmF1bHQuc3RhcnRzV2l0aChcIidcIikgJiYgY29sdW1uLmRlZmF1bHQuZW5kc1dpdGgoXCInXCIpICYmIChjb2x1bW4udHlwZSAhPT0gXCJ2YXJjaGFyXCIgfHwgY29sdW1uLmRlZmF1bHQuc3RhcnRzV2l0aChcIicnXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHQgPSBjb2x1bW4uZGVmYXVsdC5zdWJzdHJpbmcoMSwgY29sdW1uLmRlZmF1bHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRhYmxlKTtcbiAgICAgICAgICAgIGxldCBuYW1lcyA9IFtdO1xuICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgbmFtZXMucHVzaChjb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiSU5TRVJUIElOVE8gXCIgKyB0YWJsZS5uYW1lICsgXCIoYFwiICsgbmFtZXMuam9pbihcImAsYFwiKSArIFwiYCkgU0VMRUNUIGBcIiArIG5hbWVzLmpvaW4oXCJgLGBcIikgKyBcImAgRlJPTSBcIiArIHRhYmxlTmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiRFJPUCBUQUJMRSBcIiArIHRhYmxlTmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKG5ld1RhYmxlKTtcbiAgICAgICAgICAgIGxldCBuZXdDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICAgICAgbmV3VGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiBuZXdDb2x1bW5OYW1lcy5wdXNoKGNvbHVtbi5uYW1lKSk7XG4gICAgICAgICAgICBuYW1lcyA9IFtdO1xuICAgICAgICAgICAgdGFibGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiSU5TRVJUIElOVE8gXCIgKyB0YWJsZU5hbWUgKyBcIihgXCIgKyBuYW1lcy5qb2luKFwiYCxgXCIpICsgXCJgKSBTRUxFQ1QgYFwiICsgbmFtZXMuam9pbihcImAsYFwiKSArIFwiYCBGUk9NIFwiICsgdGFibGUubmFtZSArIFwiO1wiKTtcbiAgICAgICAgICAgIHlpZWxkIHF1ZXJ5UnVubmVyLnF1ZXJ5KFwiRFJPUCBUQUJMRSBcIiArIHRhYmxlLm5hbWUgKyBcIjtcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuTWlncmF0aW9uSGVscGVyID0gTWlncmF0aW9uSGVscGVyO1xuTWlncmF0aW9uSGVscGVyLlRZUEVTID0ge1xuICAgIElOVEVHRVI6IFwiaW50XCIsXG4gICAgRkxPQVQ6IFwiZmxvYXRcIixcbiAgICBEQVRFOiBcImRhdGV0aW1lXCIsXG4gICAgU1RSSU5HOiBcInZhcmNoYXJcIixcbiAgICBURVhUOiBcInRleHRcIixcbiAgICBNRURJVU1URVhUOiBcIm1lZGl1bXRleHRcIixcbiAgICBCT09MRUFOOiBcImJvb2xlYW5cIixcbiAgICBKU09OOiBcImpzb25cIixcbiAgICBTSU1QTEVfSlNPTjogXCJzaW1wbGUtanNvblwiLFxuICAgIE1ZX0pTT046IFwibXktanNvblwiXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlncmF0aW9uSGVscGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PYmplY3RIZWxwZXIgPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIE9iamVjdEhlbHBlciB7XG4gICAgLyoqXG4gICAgICogSW52ZXJ0cyB0aGUga2V5LVZhbHVlcyBmb3IgYW4gb2JqZWN0XG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm4geyp9XG4gICAgICovXG4gICAgc3RhdGljIGludmVydEtleVZhbHVlcyhvYmopIHtcbiAgICAgICAgbGV0IG5ld19vYmogPSB7fTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBuZXdfb2JqW29ialtwcm9wXV0gPSBwcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdfb2JqO1xuICAgIH1cbiAgICBzdGF0aWMgdG9BcnJheShvYmplY3QpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBrIGluIG9iamVjdCkge1xuICAgICAgICAgICAgcmVzLnB1c2gob2JqZWN0W2tdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBzdGF0aWMgb2JqZWN0Rm9yRWFjaChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sob2JqZWN0W2tleV0sIGtleSwgb2JqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBkZWVwRXF1YWwoYSwgYikge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBiID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBsZXQga2V5c09mQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGVlcEVxdWFsID0gT2JqZWN0LmtleXMoYSkuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGtleXNPZkIuaW5kZXhPZihrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrZXlzT2ZCLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdEhlbHBlci5kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKGNoaWxkcmVuRGVlcEVxdWFsICYmIGtleXNPZkIubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlc3RldCwgb2IgZGVyIMO8YmVyZ2ViZW5lIEluZGV4IGFtIE9iamVrdCBnZXNldHp0IGlzdC4gV2VyZGVuIG1laHJlcmUgSW5kZXhlcyDDvGJlcmdlYmVuLCBzbyB3aXJkIGdldGVzdGV0LFxuICAgICAqIG9iIGRpZSBcIkluZGV4LUtldHRlXCIgZ2VzZXR6dCBpc3QuXG4gICAgICogQnNwLjpcbiAgICAgKiAgSGVscGVyLmlzU2V0KHtcImluZGV4MVwiOntcImluZGV4MlwiOnZhbHVlfX0sIFwiaW5kZXgxXCIsIFwiaW5kZXgyXCIpIGlzdCB3YWhyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqZWN0XG4gICAgICogQHBhcmFtIGluZGV4ZXNcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNTZXQob2JqZWN0LCAuLi5pbmRleGVzKSB7XG4gICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOb3ROdWxsKG9iamVjdCkpIHtcbiAgICAgICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChPYmplY3RIZWxwZXIuaXNTZXQuYXBwbHkobnVsbCwgW29iamVjdFtpbmRleGVzWzBdXV0uY29uY2F0KGluZGV4ZXMuc2xpY2UoMSkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuT2JqZWN0SGVscGVyID0gT2JqZWN0SGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0SGVscGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlByaW9yaXRpemVkID0gdm9pZCAwO1xuY29uc3QgSGVscGVyXzEgPSByZXF1aXJlKFwiLi9IZWxwZXJcIik7XG5jbGFzcyBQcmlvcml0aXplZCB7XG4gICAgY29uc3RydWN0b3IocHJvbWlzZXMpIHtcbiAgICAgICAgdGhpcy5fbGFzdFByaW9yaXR5ID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gMDtcbiAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1Y2Nlc3MgPSB7fTtcbiAgICAgICAgdGhpcy5faGlnaGVzdFByb21pc2UgPSBudWxsO1xuICAgICAgICBwcm9taXNlcyA9IEhlbHBlcl8xLkhlbHBlci5ub25OdWxsKHByb21pc2VzLCB7fSk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9taXNlcykpIHtcbiAgICAgICAgICAgIGxldCB0bXBQcm9taXNlcyA9IHt9O1xuICAgICAgICAgICAgcHJvbWlzZXMuZm9yRWFjaCgocHJvbWlzZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHRtcFByb21pc2VzWyhpICsgMSkgKiAxMF0gPSBwcm9taXNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm9taXNlcyA9IHRtcFByb21pc2VzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoaWdoZXN0UHJvbWlzZVJlc29sdmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5faGlnaGVzdFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGhpZ2hlc3RQcm9taXNlUmVzb2x2ZXIgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvbWlzZXMpLmZvckVhY2gocHJpb3JpdHkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VjY2Vzc1twcmlvcml0eV0gPSBudWxsO1xuICAgICAgICAgICAgcHJvbWlzZXNbcHJpb3JpdHldLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWNjZXNzW3ByaW9yaXR5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KHByaW9yaXR5KSA+IHRoaXMuX2xhc3RQcmlvcml0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UHJpb3JpdHkgPSBwYXJzZUludChwcmlvcml0eSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxDYWxsYmFja3MoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrSGlnaGVzdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFByb21pc2VSZXNvbHZlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1Y2Nlc3NbcHJpb3JpdHldID0gZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tIaWdoZXN0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gMjtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFByb21pc2VSZXNvbHZlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcHJvbWlzZXMgPSBwcm9taXNlcztcbiAgICB9XG4gICAgX2NhbGxDYWxsYmFja3MoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX2xhc3RSZXN1bHQsIHRoaXMuX2xhc3RQcmlvcml0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfY2hlY2tIaWdoZXN0KCkge1xuICAgICAgICBsZXQgaXNIaWdoZXN0UmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1Y2Nlc3MpLnJldmVyc2UoKS5zb21lKHByaW9yaXR5ID0+IHtcbiAgICAgICAgICAgIGlmIChIZWxwZXJfMS5IZWxwZXIuaXNOdWxsKHRoaXMuX3N1Y2Nlc3NbcHJpb3JpdHldKSkge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWUgYmVlbmRldCBzb21lLXNjaGxlaWZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zdWNjZXNzW3ByaW9yaXR5XSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlzSGlnaGVzdFJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaXNIaWdoZXN0UmVzdWx0O1xuICAgIH1cbiAgICBkbyhjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXMgPiAwKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLl9sYXN0UmVzdWx0LCB0aGlzLl9sYXN0UHJpb3JpdHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpZ2hlc3QoZnVuY09yUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5faGlnaGVzdFByb21pc2U7XG4gICAgICAgICAgICBpZiAoSGVscGVyXzEuSGVscGVyLmlzTm90TnVsbChmdW5jT3JQcm9taXNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFzdFJlc3VsdCkudGhlbihmdW5jT3JQcm9taXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFzdFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaXJzdChmdW5jT3JQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKEhlbHBlcl8xLkhlbHBlci5pc05vdE51bGwoZnVuY09yUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShPYmplY3RbXCJ2YWx1ZXNcIl0odGhpcy5fcHJvbWlzZXMpKS50aGVuKGZ1bmNPclByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShPYmplY3RbXCJ2YWx1ZXNcIl0odGhpcy5fcHJvbWlzZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2xhc3RSZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlByaW9yaXRpemVkID0gUHJpb3JpdGl6ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcmlvcml0aXplZC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvbWlzZVdpdGhIYW5kbGVycyA9IHZvaWQgMDtcbmNsYXNzIFByb21pc2VXaXRoSGFuZGxlcnMgZXh0ZW5kcyBQcm9taXNlIHtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgICAgICBsZXQgcmVzb2x2ZXIgPSBudWxsO1xuICAgICAgICBsZXQgcmVqZWN0ZXIgPSBudWxsO1xuICAgICAgICBzdXBlcigocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVyID0gcmVzO1xuICAgICAgICAgICAgcmVqZWN0ZXIgPSByZWo7XG4gICAgICAgICAgICBpZiAoZXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgICBleGVjdXRvcihyZXNvbHZlciwgcmVqZWN0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLnJlamVjdGVyID0gcmVqZWN0ZXI7XG4gICAgfVxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlamVjdChyZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMucmVqZWN0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ZXIocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUHJvbWlzZVdpdGhIYW5kbGVycyA9IFByb21pc2VXaXRoSGFuZGxlcnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlV2l0aEhhbmRsZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SYW5kb20gPSB2b2lkIDA7XG5jb25zdCBIZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0hlbHBlclwiKTtcbmNsYXNzIFJhbmRvbSB7XG4gICAgc3RhdGljIHNlZWRSYW5kb20oc2VlZCkge1xuICAgICAgICB0aGlzLl9zZWVkID0gc2VlZDtcbiAgICB9XG4gICAgc3RhdGljIGdldFJhbmRvbSgpIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLl9zZWVkICs9IDB4NkQyQjc5RjU7XG4gICAgICAgIHQgPSBNYXRoLmltdWwodCBeIHQgPj4+IDE1LCB0IHwgMSk7XG4gICAgICAgIHQgXj0gdCArIE1hdGguaW11bCh0IF4gdCA+Pj4gNywgdCB8IDYxKTtcbiAgICAgICAgcmV0dXJuICgodCBeIHQgPj4+IDE0KSA+Pj4gMCkgLyA0Mjk0OTY3Mjk2O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW50UmFuZG9tKG1heFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKFJhbmRvbS5nZXRSYW5kb20oKSAqIChtYXhWYWx1ZSArIDEpKTtcbiAgICB9XG4gICAgc3RhdGljIGdldFN0cmluZ1JhbmRvbShudW1TaWducywgYWxwaGFiZXQpIHtcbiAgICAgICAgYWxwaGFiZXQgPSBIZWxwZXJfMS5IZWxwZXIubm9uTnVsbChhbHBoYWJldCwgXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiKTtcbiAgICAgICAgbGV0IHJhbmRvbSA9IFwiXCI7XG4gICAgICAgIGNvbnN0IG51bUFscGhhYmV0ID0gYWxwaGFiZXQubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TaWduczsgaSsrKSB7XG4gICAgICAgICAgICByYW5kb20gKz0gYWxwaGFiZXRbUmFuZG9tLmdldEludFJhbmRvbShudW1BbHBoYWJldCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5kb207XG4gICAgfVxufVxuZXhwb3J0cy5SYW5kb20gPSBSYW5kb207XG5SYW5kb20uX3NlZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmRvbS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuWFNTSGVscGVyID0gdm9pZCAwO1xuY2xhc3MgWFNTSGVscGVyIHtcbiAgICBzdGF0aWMgZXNjYXBlSFRNTCh0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgTUFQID0ge1xuICAgICAgICAgICAgJyYnOiAnJmFtcDsnLFxuICAgICAgICAgICAgJzwnOiAnJmx0OycsXG4gICAgICAgICAgICAnPic6ICcmZ3Q7JyxcbiAgICAgICAgICAgICdcIic6ICcmcXVvdDsnLFxuICAgICAgICAgICAgXCInXCI6ICcmIzAzOTsnXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1smPD5cIiddL2csIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gTUFQW21dO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGVzY2FwZUpTKHRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bPF0oW1xcXFxzXSpcXFxcXFwvP1tcXFxcc10qKXNjcmlwdChbXjxdKilbPl0vZywgZnVuY3Rpb24gKG1hdGNoLCBwMSwgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIiZsdDtcIiArIHAxICsgXCJzYyZ6d25qO3JpcHRcIiArIHAyICsgXCImZ3Q7XCI7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWFNTSGVscGVyID0gWFNTSGVscGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WFNTSGVscGVyLmpzLm1hcCIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYWxsO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gYWxsKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsaWRhdG9ycyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHZhbGlkYXRvcnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmdW5jdGlvbiBhbGxQcm9wVHlwZXMoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gICAgdmFsaWRhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRvci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKGFsbFByb3BUeXBlcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbi8vIE1vc3RseSB0YWtlbiBmcm9tIFJlYWN0UHJvcFR5cGVzLlxuXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1JlcXVpcmVkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWVTYWZlICsgJ2Agd2FzIG5vdCBzcGVjaWZpZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgLicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gNiA/IF9sZW4gLSA2IDogMCksIF9rZXkgPSA2OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSA2XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGUuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lU2FmZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZVNhZmVdLmNvbmNhdChhcmdzKSk7XG4gIH1cblxuICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJyArIHByb3BGdWxsTmFtZSArICdgIHByb3Agb24gYCcgKyBjb21wb25lbnROYW1lICArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tXG4gICAgICAvLyBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiY29uc3QgZT1TeW1ib2woKSx0PVN5bWJvbCgpLHI9U3ltYm9sKCksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysbz1uZXcgV2Vha01hcCxzPWU9PmUmJihvLmhhcyhlKT9vLmdldChlKTpuKGUpPT09T2JqZWN0LnByb3RvdHlwZXx8bihlKT09PUFycmF5LnByb3RvdHlwZSksYz1lPT5cIm9iamVjdFwiPT10eXBlb2YgZSYmbnVsbCE9PWUsbD0obixvKT0+e2xldCBzPSExO2NvbnN0IGM9KGUsdCk9PntpZighcyl7bGV0IHI9ZS5hLmdldChuKTtyfHwocj1uZXcgU2V0LGUuYS5zZXQobixyKSksci5hZGQodCl9fSxsPXtmOm8sZ2V0KGUsdCl7cmV0dXJuIHQ9PT1yP246KGModGhpcyx0KSxpKGVbdF0sdGhpcy5hLHRoaXMuYykpfSxoYXMoZSxyKXtyZXR1cm4gcj09PXQ/KHM9ITAsdGhpcy5hLmRlbGV0ZShuKSwhMCk6KGModGhpcyxyKSxyIGluIGUpfSxvd25LZXlzKHQpe3JldHVybiBjKHRoaXMsZSksUmVmbGVjdC5vd25LZXlzKHQpfX07cmV0dXJuIG8mJihsLnNldD1sLmRlbGV0ZVByb3BlcnR5PSgpPT4hMSksbH0saT0oZSx0LG8pPT57aWYoIXMoZSkpcmV0dXJuIGU7Y29uc3QgYz1lW3JdfHxlLGk9KGU9Pk9iamVjdC5pc0Zyb3plbihlKXx8T2JqZWN0LnZhbHVlcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlKSkuc29tZShlPT4hZS53cml0YWJsZSkpKGMpO2xldCB1PW8mJm8uZ2V0KGMpO3JldHVybiB1JiZ1LmY9PT1pfHwodT1sKGMsaSksdS5wPW5ldyBQcm94eShpPyhlPT57aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gQXJyYXkuZnJvbShlKTtjb25zdCB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGUpO3JldHVybiBPYmplY3QudmFsdWVzKHQpLmZvckVhY2goZT0+e2UuY29uZmlndXJhYmxlPSEwfSksT2JqZWN0LmNyZWF0ZShuKGUpLHQpfSkoYyk6Yyx1KSxvJiZvLnNldChjLHUpKSx1LmE9dCx1LmM9byx1LnB9LHU9KGUsdCk9Pntjb25zdCByPVJlZmxlY3Qub3duS2V5cyhlKSxuPVJlZmxlY3Qub3duS2V5cyh0KTtyZXR1cm4gci5sZW5ndGghPT1uLmxlbmd0aHx8ci5zb21lKChlLHQpPT5lIT09blt0XSl9LGE9KHQscixuLG8pPT57aWYoT2JqZWN0LmlzKHQscikpcmV0dXJuITE7aWYoIWModCl8fCFjKHIpKXJldHVybiEwO2NvbnN0IHM9bi5nZXQodCk7aWYoIXMpcmV0dXJuITA7aWYobyl7Y29uc3QgZT1vLmdldCh0KTtpZihlJiZlLm49PT1yKXJldHVybiBlLmc7by5zZXQodCx7bjpyLGc6ITF9KX1sZXQgbD1udWxsO2Zvcihjb25zdCBjIG9mIHMpe2NvbnN0IHM9Yz09PWU/dSh0LHIpOmEodFtjXSxyW2NdLG4sbyk7aWYoITAhPT1zJiYhMSE9PXN8fChsPXMpLGwpYnJlYWt9cmV0dXJuIG51bGw9PT1sJiYobD0hMCksbyYmby5zZXQodCx7bjpyLGc6bH0pLGx9LGY9ZT0+ISFzKGUpJiZ0IGluIGUseT1lPT5zKGUpJiZlW3JdfHxudWxsLGI9KGUsdD0hMCk9PntvLnNldChlLHQpfSxnPShlLHQpPT57Y29uc3Qgcj1bXSxuPShlLG8pPT57Y29uc3Qgcz10LmdldChlKTtzP3MuZm9yRWFjaCh0PT57bihlW3RdLG8/Wy4uLm8sdF06W3RdKX0pOm8mJnIucHVzaChvKX07cmV0dXJuIG4oZSkscn07ZXhwb3J0e2cgYXMgYWZmZWN0ZWRUb1BhdGhMaXN0LGkgYXMgY3JlYXRlUHJveHkseSBhcyBnZXRVbnRyYWNrZWQsYSBhcyBpc0NoYW5nZWQsYiBhcyBtYXJrVG9UcmFjayxmIGFzIHRyYWNrTWVtb307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tb2Rlcm4ubWpzLm1hcFxuIiwiaW1wb3J0e2dldFVudHJhY2tlZCBhcyBlLGlzQ2hhbmdlZCBhcyB0LGNyZWF0ZVByb3h5IGFzIHIsdHJhY2tNZW1vIGFzIG59ZnJvbVwicHJveHktY29tcGFyZVwiO2V4cG9ydHtnZXRVbnRyYWNrZWQgYXMgZ2V0VW50cmFja2VkT2JqZWN0fWZyb21cInByb3h5LWNvbXBhcmVcIjtjb25zdCBhPWU9Plwib2JqZWN0XCI9PXR5cGVvZiBlJiZudWxsIT09ZSxvPSh0LHIpPT57aWYoIWEodCkpcmV0dXJuIHQ7Y29uc3QgYz1lKHQpO3JldHVybiBudWxsIT09Yz8obih0KSxjKTooci5oYXModCl8fChyLmFkZCh0KSxPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChbZSxuXSk9Pntjb25zdCBhPW8obixyKTtPYmplY3QuaXMoYSxuKXx8KHRbZV09YSl9KSksdCl9LGM9KGUsdCxyKT0+e2lmKCFhKGUpfHwhYSh0KSlyZXR1cm47Y29uc3Qgbj1yLmdldCh0KTtuJiZuLmZvckVhY2gobj0+e2MoZVtuXSx0W25dLHIpfSl9LHM9KG4sYSk9Pnt2YXIgcztjb25zdCBsPW51bGwhPShzPW51bGw9PWE/dm9pZCAwOmEuc2l6ZSk/czoxLHA9W10sdT1uZXcgV2Vha01hcCxmPW5ldyBXZWFrTWFwO3JldHVybiBhPT57Y29uc3Qgcz1lKGEpLGk9c3x8YSxkPXUuZ2V0KGkpO2lmKGQpcmV0dXJuIGMoYSxpLGQuYSksZC5yO2ZvcihsZXQgZT0wO2U8cC5sZW5ndGg7ZSs9MSl7Y29uc3Qgcj1wW2VdO2lmKCF0KHIubyxhLHIuYSxuZXcgV2Vha01hcCkpcmV0dXJuIHUuc2V0KGkse3I6ci5yLGE6ci5hfSksYyhhLGksci5hKSxyLnJ9Y29uc3QgZz1uZXcgV2Vha01hcCxoPXIoYSxnLGYpLGs9byhuKGgpLG5ldyBTZXQpO3JldHVybiBudWxsIT09cyYmYyhhLHMsZykscC51bnNoaWZ0KHtvOmkscjprLGE6Z30pLHAubGVuZ3RoPmwmJnAucG9wKCksdS5zZXQoaSx7cjprLGE6Z30pLGt9fTtleHBvcnR7cyBhcyBkZWZhdWx0fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1vZGVybi5tanMubWFwXG4iLCJleHBvcnQgKiBmcm9tICcuL3NyYy9DYXJkL0NhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL0J1dHRvbi9CdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL0NoZWNrQm94L0NoZWNrYm94JztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL0Zvcm1FbGVtZW50cy9FdmVudFR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL0Zvcm1FbGVtZW50cy9JbnB1dC9IaWRkZW5JbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9Gb3JtRWxlbWVudHMvSW5wdXQvSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvRm9ybUVsZW1lbnRzL1N3aXRjaC9Td2l0Y2gnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGF5b3V0L0ZsZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGF5b3V0L0dyb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvTGlzdC9MaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1JibUNvbXBvbmVudFByb3BzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RhYmxlL1RhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RleHQvQm9keSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9Ub3BCYXIvVG9wQmFyJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL1RvcEJhci9Ub3BCYXJCdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvVHlwZUhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvaGVscGVyJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcFJlYWN0TW9iaWxlLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uL2hlbHBlcic7XG5leHBvcnQgdmFyIENhcmQgPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciB0aXRsZSA9IF9hLnRpdGxlLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLmZ1bGxIZWlnaHQsIGZ1bGxIZWlnaHQgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYiwgX2MgPSBfYS5ub1BhZGRpbmdIZWlnaHQsIG5vUGFkZGluZ0hlaWdodCA9IF9jID09PSB2b2lkIDAgPyBmYWxzZSA6IF9jLCBfZCA9IF9hLm5vUGFkZGluZywgbm9QYWRkaW5nID0gX2QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2QsIF9lID0gX2Eubm9QYWRkaW5nV2lkdGgsIG5vUGFkZGluZ1dpZHRoID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2UsIF9mID0gX2Eubm9NYXJnaW4sIG5vTWFyZ2luID0gX2YgPT09IHZvaWQgMCA/IGZhbHNlIDogX2YsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInRpdGxlXCIsIFwiY2hpbGRyZW5cIiwgXCJmdWxsSGVpZ2h0XCIsIFwibm9QYWRkaW5nSGVpZ2h0XCIsIFwibm9QYWRkaW5nXCIsIFwibm9QYWRkaW5nV2lkdGhcIiwgXCJub01hcmdpblwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgdmFyIGNsYXNzZXMgPSBbJ2NhcmQnXTtcbiAgICBpZiAoZnVsbEhlaWdodClcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmdWxsLWhlaWdodCcpO1xuICAgIGlmIChub1BhZGRpbmcpXG4gICAgICAgIGNsYXNzZXMucHVzaCgnbm8tcGFkZGluZycpO1xuICAgIGlmIChub01hcmdpbilcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCduby1tYXJnaW4nKTtcbiAgICBpZiAobm9QYWRkaW5nSGVpZ2h0KVxuICAgICAgICBjbGFzc2VzLnB1c2goJ25vLXBhZGRpbmctaGVpZ2h0Jyk7XG4gICAgaWYgKG5vUGFkZGluZ1dpZHRoKVxuICAgICAgICBjbGFzc2VzLnB1c2goJ25vLXBhZGRpbmctd2lkdGgnKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoY2xhc3NlcywgY2xhc3NOYW1lKSB9KSxcbiAgICAgICAgdGl0bGUgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInRpdGxlXCIgfSwgdGl0bGUpIDogbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJjb250ZW50XCIgfSwgY2hpbGRyZW4pKSk7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcmQuanMubWFwIiwidmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiBhcyBCU0J1dHRvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5leHBvcnQgdmFyIEJ1dHRvbiA9IFJlYWN0Lm1lbW8oZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJTQnV0dG9uLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgYnNQcmVmaXg6IHByZWZpeENsYXNzKCdidXR0b24nKSB9KSwgY2hpbGRyZW4pKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnV0dG9uLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5mdW5jdGlvbiBDaGVja2JveChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBfYjtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2MgPSBfYS5sYWJlbCwgbGFiZWwgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5pc0xhYmVsQmVmb3JlQ2hlY2tib3gsIGlzTGFiZWxCZWZvcmVDaGVja2JveCA9IF9kID09PSB2b2lkIDAgPyBmYWxzZSA6IF9kLCBpZCA9IF9hLmlkLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImxhYmVsXCIsIFwiaXNMYWJlbEJlZm9yZUNoZWNrYm94XCIsIFwiaWRcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICAvLyBFZmZlY3RzXG4gICAgLy8gT3RoZXJcbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG4gICAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSA9PT0gMSAmJiB0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxhYmVsID0gY2hpbGRyZW47XG4gICAgfVxuICAgIHZhciBwcmVMYWJlbCA9ICcnO1xuICAgIGlmIChpc0xhYmVsQmVmb3JlQ2hlY2tib3gpIHtcbiAgICAgICAgX2IgPSBbcHJlTGFiZWwsIGxhYmVsXSwgbGFiZWwgPSBfYlswXSwgcHJlTGFiZWwgPSBfYlsxXTtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoWydjaGVja2JveCddLCBjbGFzc05hbWUpIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7IGh0bWxGb3I6IGlkLCBrZXk6IGlkIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2NoZWNrYm94LWxhYmVsJykgfSwgcHJlTGFiZWwpLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9fYXNzaWduKHt9LCBwcm9wcywgeyB0eXBlOiBcImNoZWNrYm94XCIsIGlkOiBpZCwgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnY2hlY2tib3gtaW5wdXQnKSB9KSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2NoZWNrYm94LWNoZWNrbWFyaycpIH0pLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdjaGVja2JveC1sYWJlbCcpIH0sIGxhYmVsKSkpKTtcbn1cbnZhciB0bXAgPSBSZWFjdC5tZW1vKENoZWNrYm94KTtcbmV4cG9ydCB7IHRtcCBhcyBDaGVja2JveCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hlY2tib3guanMubWFwIiwiZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRUeXBlcy5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuL0lucHV0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vLi4vaGVscGVyJztcbmZ1bmN0aW9uIEhpZGRlbklucHV0KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIF9iID0gX2Eubm9Gb2N1c0hpbnQsIG5vRm9jdXNIaW50ID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2IsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcIm5vRm9jdXNIaW50XCIsIFwiY2xhc3NOYW1lXCJdKTtcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuICAgIHZhciBub0ZvY3VzSGludENsYXNzID0gbm9Gb2N1c0hpbnQgPyAnbm8tZm9jdXMtaGludCcgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXQsIF9fYXNzaWduKHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcyhbJ2hpZGRlbi1pbnB1dCcsIG5vRm9jdXNIaW50Q2xhc3NdLCBjbGFzc05hbWUpIH0sIHByb3BzKSk7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhIaWRkZW5JbnB1dCk7XG5leHBvcnQgeyB0bXAgYXMgSGlkZGVuSW5wdXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhpZGRlbklucHV0LmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vLi4vaGVscGVyJztcbmZ1bmN0aW9uIElucHV0KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIGxhYmVsID0gX2EubGFiZWwsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgb25DaGFuZ2VEYXRhID0gX2Eub25DaGFuZ2VEYXRhLCBvdXRzaWRlT25DaGFuZ2UgPSBfYS5vbkNoYW5nZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImxhYmVsXCIsIFwiY2xhc3NOYW1lXCIsIFwib25DaGFuZ2VEYXRhXCIsIFwib25DaGFuZ2VcIl0pO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICB2YXIgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAob3V0c2lkZU9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBvdXRzaWRlT25DaGFuZ2UoT2JqZWN0LmFzc2lnbihlLCB7IGV4dHJhRGF0YTogb25DaGFuZ2VEYXRhIH0pKTtcbiAgICAgICAgfVxuICAgIH0sIFtvdXRzaWRlT25DaGFuZ2UsIG9uQ2hhbmdlRGF0YV0pO1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2lucHV0JywgY2xhc3NOYW1lKSB9LFxuICAgICAgICBsYWJlbCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnaW5wdXQtbGFiZWwnKSB9LCBsYWJlbCkgOiBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ2lucHV0LXRleHQnKSwgb25DaGFuZ2U6IG9uQ2hhbmdlIH0pKSkpO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oSW5wdXQpO1xuZXhwb3J0IHsgdG1wIGFzIElucHV0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi8uLi9oZWxwZXInO1xuZXhwb3J0IHZhciBTd2l0Y2ggPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBfYjtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2MgPSBfYS5sYWJlbCwgbGFiZWwgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgX2QgPSBfYS5wcmVMYWJlbCwgcHJlTGFiZWwgPSBfZCA9PT0gdm9pZCAwID8gJycgOiBfZCwgX2UgPSBfYS5pc0xhYmVsQmVmb3JlU3dpdGNoLCBpc0xhYmVsQmVmb3JlU3dpdGNoID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2UsIF9mID0gX2EuaXNEdWFsLCBpc0R1YWwgPSBfZiA9PT0gdm9pZCAwID8gdW5kZWZpbmVkIDogX2YsIGlkID0gX2EuaWQsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwibGFiZWxcIiwgXCJwcmVMYWJlbFwiLCBcImlzTGFiZWxCZWZvcmVTd2l0Y2hcIiwgXCJpc0R1YWxcIiwgXCJpZFwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICBpZiAoUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID09PSAxICYmIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbGFiZWwgPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgaWYgKGlzTGFiZWxCZWZvcmVTd2l0Y2gpIHtcbiAgICAgICAgX2IgPSBbcHJlTGFiZWwsIGxhYmVsXSwgbGFiZWwgPSBfYlswXSwgcHJlTGFiZWwgPSBfYlsxXTtcbiAgICB9XG4gICAgaWYgKGxhYmVsICYmIHByZUxhYmVsICYmIGlzRHVhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzRHVhbCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKFsnc3dpdGNoJywgaXNEdWFsID8gJ2R1YWwnIDogdW5kZWZpbmVkXSwgY2xhc3NOYW1lKSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgeyBodG1sRm9yOiBpZCwga2V5OiBpZCB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdzd2l0Y2gtbGFiZWwnKSB9LCBwcmVMYWJlbCksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX19hc3NpZ24oe30sIHByb3BzLCB7IHR5cGU6IFwiY2hlY2tib3hcIiwgaWQ6IGlkIH0pKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdzd2l0Y2gtdG9nZ2xlJykgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3N3aXRjaC1oYW5kbGUnKSB9KSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3N3aXRjaC1sYWJlbCcpIH0sIGxhYmVsKSkpKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3dpdGNoLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vaGVscGVyJztcbmZ1bmN0aW9uIEZsZXgoX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLnZlcnRpY2FsLCB2ZXJ0aWNhbCA9IF9iID09PSB2b2lkIDAgPyBmYWxzZSA6IF9iO1xuICAgIC8vIFN0YXRlc1xuICAgIC8vIFJlZnNcbiAgICAvLyBDYWxsYmFja3NcbiAgICAvLyBFZmZlY3RzXG4gICAgLy8gT3RoZXJcbiAgICB2YXIgY2xhc3NlcyA9IFsnZmxleCddO1xuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ3ZlcnRpY2FsJyk7XG4gICAgfVxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoY2xhc3NlcywgY2xhc3NOYW1lKSB9LCBjaGlsZHJlbik7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhGbGV4KTtcbmV4cG9ydCB7IHRtcCBhcyBGbGV4IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByZWZpeENsYXNzIH0gZnJvbSAnLi4vaGVscGVyJztcbmZ1bmN0aW9uIEdyb3coX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBfYiA9IF9hLmNlbnRlciwgY2VudGVyID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIHZhciBjbGFzc2VzID0gWydncm93J107XG4gICAgaWYgKGNlbnRlcilcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdjZW50ZXInKTtcbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKGNsYXNzZXMsIGNsYXNzTmFtZSkgfSwgY2hpbGRyZW4pO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oR3Jvdyk7XG5leHBvcnQgeyB0bXAgYXMgR3JvdyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R3Jvdy5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi9oZWxwZXInO1xuZnVuY3Rpb24gTGlzdChfYSkge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIHZhciBpdGVtcyA9IF9hLml0ZW1zLCByZW5kZXJJdGVtID0gX2EucmVuZGVySXRlbSwgcmVuZGVyQmVmb3JlID0gX2EucmVuZGVyQmVmb3JlLCBrZXlFeHRyYWN0b3IgPSBfYS5rZXlFeHRyYWN0b3IsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcIml0ZW1zXCIsIFwicmVuZGVySXRlbVwiLCBcInJlbmRlckJlZm9yZVwiLCBcImtleUV4dHJhY3RvclwiLCBcImNsYXNzTmFtZVwiXSk7XG4gICAgLy8gU3RhdGVzXG4gICAgLy8gUmVmc1xuICAgIC8vIENhbGxiYWNrc1xuICAgIC8vIEVmZmVjdHNcbiAgICAvLyBPdGhlclxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdCcsIGNsYXNzTmFtZSkgfSksIGl0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGJlZm9yZSA9IG51bGw7XG4gICAgICAgIGlmIChyZW5kZXJCZWZvcmUpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdC1pdGVtLWJlZm9yZScpIH0sIHJlbmRlckJlZm9yZShpdGVtLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygnbGlzdC1pdGVtJyksIGtleToga2V5RXh0cmFjdG9yKGl0ZW0sIGluZGV4KSB9LFxuICAgICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCdsaXN0LWl0ZW0tbWFpbicpIH0sIHJlbmRlckl0ZW0oaXRlbSwgaW5kZXgpKSkpO1xuICAgIH0pKSk7XG59XG52YXIgdG1wID0gUmVhY3QubWVtbyhMaXN0KTtcbmV4cG9ydCB7IHRtcCBhcyBMaXN0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaXN0LmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJibUNvbXBvbmVudFByb3BzLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUYWJsZSB9IGZyb20gJ3JlYWN0LXRhYmxlJztcbmltcG9ydCB7IFRhYmxlIGFzIFJCVGFibGUgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuZnVuY3Rpb24gVGFibGUoX2EpIHtcbiAgICAvLyBWYXJpYWJsZXNcbiAgICB2YXIgY29sdW1ucyA9IF9hLmNvbHVtbnMsIGRhdGEgPSBfYS5kYXRhLCBjZWxsUmVuZGVyZXIgPSBfYS5jZWxsUmVuZGVyZXI7XG4gICAgaWYgKGNlbGxSZW5kZXJlcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHZhciBfYTsgcmV0dXJuIChjLkNlbGwgPSAoX2EgPSBjLkNlbGwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNlbGxSZW5kZXJlcik7IH0pO1xuICAgIH1cbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKCEoJ3dpZHRoJyBpbiBjKSkge1xuICAgICAgICAgICAgYy53aWR0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgX2IgPSB1c2VUYWJsZSh7XG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSksIGdldFRhYmxlUHJvcHMgPSBfYi5nZXRUYWJsZVByb3BzLCBnZXRUYWJsZUJvZHlQcm9wcyA9IF9iLmdldFRhYmxlQm9keVByb3BzLCBoZWFkZXJHcm91cHMgPSBfYi5oZWFkZXJHcm91cHMsIHJvd3MgPSBfYi5yb3dzLCBwcmVwYXJlUm93ID0gX2IucHJlcGFyZVJvdztcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuICAgIHJldHVybiAoXG4gICAgLy8gYXBwbHkgdGhlIHRhYmxlIHByb3BzXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChSQlRhYmxlLCBfX2Fzc2lnbih7fSwgZ2V0VGFibGVQcm9wcygpKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRoZWFkXCIsIG51bGwsIFxuICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGhlYWRlciByb3dzXG4gICAgICAgIGhlYWRlckdyb3Vwcy5tYXAoZnVuY3Rpb24gKGhlYWRlckdyb3VwKSB7IHJldHVybiAoXG4gICAgICAgIC8vIEFwcGx5IHRoZSBoZWFkZXIgcm93IHByb3BzXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCBfX2Fzc2lnbih7fSwgaGVhZGVyR3JvdXAuZ2V0SGVhZGVyR3JvdXBQcm9wcygpKSwgXG4gICAgICAgIC8vIExvb3Agb3ZlciB0aGUgaGVhZGVycyBpbiBlYWNoIHJvd1xuICAgICAgICBoZWFkZXJHcm91cC5oZWFkZXJzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiAoXG4gICAgICAgIC8vIEFwcGx5IHRoZSBoZWFkZXIgY2VsbCBwcm9wc1xuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhcIiwgX19hc3NpZ24oe30sIGNvbHVtbi5nZXRIZWFkZXJQcm9wcygpKSwgXG4gICAgICAgIC8vIFJlbmRlciB0aGUgaGVhZGVyXG4gICAgICAgIGNvbHVtbi5yZW5kZXIoJ0hlYWRlcicpKSk7IH0pKSk7IH0pKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIF9fYXNzaWduKHt9LCBnZXRUYWJsZUJvZHlQcm9wcygpKSwgXG4gICAgICAgIC8vIExvb3Agb3ZlciB0aGUgdGFibGUgcm93c1xuICAgICAgICByb3dzLm1hcChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByb3cgZm9yIGRpc3BsYXlcbiAgICAgICAgICAgIHByZXBhcmVSb3cocm93KTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgcm93IHByb3BzXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgX19hc3NpZ24oe30sIHJvdy5nZXRSb3dQcm9wcygpKSwgXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIHJvd3MgY2VsbHNcbiAgICAgICAgICAgIHJvdy5jZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBjZWxsLmNvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGNlbGwgcHJvcHNcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCBfX2Fzc2lnbih7fSwgY2VsbC5nZXRDZWxsUHJvcHMoKSwgeyB3aWR0aDogd2lkdGggfSksIFxuICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgY2VsbCBjb250ZW50c1xuICAgICAgICAgICAgICAgIGNlbGwucmVuZGVyKCdDZWxsJykpKTtcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0pKSkpO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oVGFibGUpO1xuZXhwb3J0IHsgdG1wIGFzIFRhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBwcmVmaXhDbGFzcyB9IGZyb20gJy4uL2hlbHBlcic7XG5mdW5jdGlvbiBCb2R5KF9hKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgdmFyIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgX2IgPSBfYS5ibG9jaywgYmxvY2sgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYiwgX2MgPSBfYS5wcmlvLCBwcmlvID0gX2MgPT09IHZvaWQgMCA/ICdwcmltYXJ5JyA6IF9jLCBfZCA9IF9hLnNpemUsIHNpemUgPSBfZCA9PT0gdm9pZCAwID8gJ21lZGl1bScgOiBfZDtcbiAgICAvLyBTdGF0ZXNcbiAgICAvLyBSZWZzXG4gICAgLy8gQ2FsbGJhY2tzXG4gICAgLy8gRWZmZWN0c1xuICAgIC8vIE90aGVyXG4gICAgdmFyIGNsYXNzZXMgPSBbJ2JvZHknXTtcbiAgICBpZiAoYmxvY2spXG4gICAgICAgIGNsYXNzZXMucHVzaCgnYmxvY2snKTtcbiAgICBjbGFzc2VzLnB1c2gocHJpbyk7XG4gICAgY2xhc3Nlcy5wdXNoKHNpemUpO1xuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKGNsYXNzZXMsIGNsYXNzTmFtZSkgfSwgY2hpbGRyZW4pO1xufVxudmFyIHRtcCA9IFJlYWN0Lm1lbW8oQm9keSk7XG5leHBvcnQgeyB0bXAgYXMgQm9keSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm9keS5qcy5tYXAiLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29udGFpbmVyLCBOYXZiYXIgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuaW1wb3J0IHsgVG9wQmFyQnV0dG9uIH0gZnJvbSAnLi9Ub3BCYXJCdXR0b24nO1xuaW1wb3J0IHsgcHJlZml4Q2xhc3MgfSBmcm9tICcuLi9oZWxwZXInO1xuZXhwb3J0IHZhciBUb3BCYXIgPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiA9IF9hLnRpdGxlLCB0aXRsZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IF9hLnJpZ2h0QnV0dG9ucywgcmlnaHRCdXR0b25zID0gX2MgPT09IHZvaWQgMCA/IFtdIDogX2MsIF9kID0gX2EubGVmdEJ1dHRvbnMsIGxlZnRCdXR0b25zID0gX2QgPT09IHZvaWQgMCA/IFtdIDogX2QsIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZSwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcInRpdGxlXCIsIFwicmlnaHRCdXR0b25zXCIsIFwibGVmdEJ1dHRvbnNcIiwgXCJjbGFzc05hbWVcIl0pO1xuICAgIHZhciByaWdodEJ1dHRvbkNvbXBvbmVudHMgPSBnZXRCdXR0b25Db21wb25lbnRzKHJpZ2h0QnV0dG9ucyk7XG4gICAgdmFyIGxlZnRCdXR0b25Db21wb25lbnRzID0gZ2V0QnV0dG9uQ29tcG9uZW50cyhsZWZ0QnV0dG9ucyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE5hdmJhciwgX19hc3NpZ24oe30sIHJibVByb3BzLCB7IHZhcmlhbnQ6IFwibGlnaHRcIiwgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygndG9wYmFyJywgY2xhc3NOYW1lKSB9KSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIHsgZmx1aWQ6IFwieHhsXCIgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCd0b3BiYXItYnV0dG9uLWNvbnRhaW5lciBsZWZ0JykgfSwgbGVmdEJ1dHRvbkNvbXBvbmVudHMpLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcHJlZml4Q2xhc3MoJ3RvcGJhci10aXRsZS1jb250YWluZXInKSB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2YmFyLlRleHQsIHsgY2xhc3NOYW1lOiBwcmVmaXhDbGFzcygndG9wYmFyLXRpdGxlJykgfSwgdGl0bGUpKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHByZWZpeENsYXNzKCd0b3BiYXItYnV0dG9uLWNvbnRhaW5lciByaWdodCcpIH0sIHJpZ2h0QnV0dG9uQ29tcG9uZW50cykpKSk7XG59KTtcbmZ1bmN0aW9uIGdldEJ1dHRvbkNvbXBvbmVudHMoYnV0dG9ucykge1xuICAgIHJldHVybiBidXR0b25zLm1hcChmdW5jdGlvbiAoYnV0dG9uLCBpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBrZXkgPSAoX2EgPSBidXR0b24ua2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICBpZiAoJ2NvbXBvbmVudCcgaW4gYnV0dG9uKSB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gYnV0dG9uLmNvbXBvbmVudDtcbiAgICAgICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHsga2V5OiBrZXksIHRpdGxlOiBidXR0b24udGl0bGUsIG9uQ2xpY2s6IGJ1dHRvbi5hY3Rpb24sIGRpc2FibGVkOiBidXR0b24uZGlzYWJsZWQsIGljb246IGJ1dHRvbi5pY29uIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGQgPSBidXR0b24udGl0bGU7XG4gICAgICAgIGlmIChidXR0b24uaWNvbikge1xuICAgICAgICAgICAgY2hpbGQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHsgc3JjOiBidXR0b24uaWNvbiwgYWx0OiBidXR0b24udGl0bGUsIHRpdGxlOiBidXR0b24udGl0bGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFRvcEJhckJ1dHRvbiwgeyBrZXk6IGtleSwgb25DbGljazogYnV0dG9uLmFjdGlvbiwgZGlzYWJsZWQ6IGJ1dHRvbi5kaXNhYmxlZCB9LCBjaGlsZCkpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyLmpzLm1hcCIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE5hdkxpbmsgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnO1xuZXhwb3J0IHZhciBUb3BCYXJCdXR0b24gPSBSZWFjdC5tZW1vKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYiA9IF9hLmRpc2FibGVkLCBkaXNhYmxlZCA9IF9iID09PSB2b2lkIDAgPyBmYWxzZSA6IF9iLCBvbkNsaWNrID0gX2Eub25DbGljaywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgcmJtUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImRpc2FibGVkXCIsIFwib25DbGlja1wiLCBcImNoaWxkcmVuXCJdKTtcbiAgICB2YXIgY2IgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7IHJldHVybiAob25DbGljayA/IG9uQ2xpY2soKSA6IG51bGwpOyB9LCBbb25DbGlja10pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChOYXZMaW5rLCBfX2Fzc2lnbih7fSwgcmJtUHJvcHMsIHsgb25DbGljazogY2IsIGRpc2FibGVkOiBkaXNhYmxlZCB9KSwgY2hpbGRyZW4pKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9wQmFyQnV0dG9uLmpzLm1hcCIsImV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVR5cGVIZWxwZXJzLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBwcmVmaXhDbGFzcyhjbGFzc05hbWUpIHtcbiAgICB2YXIgb3RoZXJDbGFzc2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgb3RoZXJDbGFzc2VzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgY2xhc3NOYW1lcyA9IChBcnJheS5pc0FycmF5KGNsYXNzTmFtZSkgPyBjbGFzc05hbWUgOiBbY2xhc3NOYW1lXSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYyAhPT0gdW5kZWZpbmVkOyB9KVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBcInJibS1cIi5jb25jYXQoYyk7IH0pO1xuICAgIG90aGVyQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaC5hcHBseShjbGFzc05hbWVzLCB2YWx1ZS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHVuZGVmaW5lZDsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3NOYW1lcy5qb2luKCcgJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXIuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IENsb3NlQnV0dG9uIGZyb20gJy4vQ2xvc2VCdXR0b24nO1xuaW1wb3J0IE1vZGFsQ29udGV4dCBmcm9tICcuL01vZGFsQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogZmFsc2Vcbn07XG5jb25zdCBBYnN0cmFjdE1vZGFsSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xvc2VMYWJlbCxcbiAgY2xvc2VWYXJpYW50LFxuICBjbG9zZUJ1dHRvbixcbiAgb25IaWRlLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChNb2RhbENvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQub25IaWRlKCk7XG4gICAgb25IaWRlID09IG51bGwgPyB2b2lkIDAgOiBvbkhpZGUoKTtcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoXCJkaXZcIiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGNsb3NlQnV0dG9uICYmIC8qI19fUFVSRV9fKi9fanN4KENsb3NlQnV0dG9uLCB7XG4gICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VMYWJlbCxcbiAgICAgIHZhcmlhbnQ6IGNsb3NlVmFyaWFudCxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrXG4gICAgfSldXG4gIH0pO1xufSk7XG5BYnN0cmFjdE1vZGFsSGVhZGVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEFic3RyYWN0TW9kYWxIZWFkZXI7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBBY2NvcmRpb25Cb2R5IGZyb20gJy4vQWNjb3JkaW9uQm9keSc7XG5pbXBvcnQgQWNjb3JkaW9uQnV0dG9uIGZyb20gJy4vQWNjb3JkaW9uQnV0dG9uJztcbmltcG9ydCBBY2NvcmRpb25Db2xsYXBzZSBmcm9tICcuL0FjY29yZGlvbkNvbGxhcHNlJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgQWNjb3JkaW9uSGVhZGVyIGZyb20gJy4vQWNjb3JkaW9uSGVhZGVyJztcbmltcG9ydCBBY2NvcmRpb25JdGVtIGZyb20gJy4vQWNjb3JkaW9uSXRlbSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gICAgYWN0aXZlS2V5LFxuICAgIGJzUHJlZml4LFxuICAgIGNsYXNzTmFtZSxcbiAgICBvblNlbGVjdCxcbiAgICBmbHVzaCxcbiAgICAuLi5jb250cm9sbGVkUHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwcm9wcywge1xuICAgIGFjdGl2ZUtleTogJ29uU2VsZWN0J1xuICB9KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uJyk7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBhY3RpdmVFdmVudEtleTogYWN0aXZlS2V5LFxuICAgIG9uU2VsZWN0XG4gIH0pLCBbYWN0aXZlS2V5LCBvblNlbGVjdF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWNjb3JkaW9uQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICAuLi5jb250cm9sbGVkUHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIGZsdXNoICYmIGAke3ByZWZpeH0tZmx1c2hgKVxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb24uZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oQWNjb3JkaW9uLCB7XG4gIEJ1dHRvbjogQWNjb3JkaW9uQnV0dG9uLFxuICBDb2xsYXBzZTogQWNjb3JkaW9uQ29sbGFwc2UsXG4gIEl0ZW06IEFjY29yZGlvbkl0ZW0sXG4gIEhlYWRlcjogQWNjb3JkaW9uSGVhZGVyLFxuICBCb2R5OiBBY2NvcmRpb25Cb2R5XG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkNvbGxhcHNlIGZyb20gJy4vQWNjb3JkaW9uQ29sbGFwc2UnO1xuaW1wb3J0IEFjY29yZGlvbkl0ZW1Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEFjY29yZGlvbkJvZHkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2FjY29yZGlvbi1ib2R5Jyk7XG4gIGNvbnN0IHtcbiAgICBldmVudEtleVxuICB9ID0gdXNlQ29udGV4dChBY2NvcmRpb25JdGVtQ29udGV4dCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChBY2NvcmRpb25Db2xsYXBzZSwge1xuICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIC4uLnByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpXG4gICAgfSlcbiAgfSk7XG59KTtcbkFjY29yZGlvbkJvZHkuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uQm9keSc7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25Cb2R5OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgQWNjb3JkaW9uSXRlbUNvbnRleHQgZnJvbSAnLi9BY2NvcmRpb25JdGVtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VBY2NvcmRpb25CdXR0b24oZXZlbnRLZXksIG9uQ2xpY2spIHtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUV2ZW50S2V5LFxuICAgIG9uU2VsZWN0XG4gIH0gPSB1c2VDb250ZXh0KEFjY29yZGlvbkNvbnRleHQpO1xuICByZXR1cm4gZSA9PiB7XG4gICAgLypcbiAgICAgIENvbXBhcmUgdGhlIGV2ZW50IGtleSBpbiBjb250ZXh0IHdpdGggdGhlIGdpdmVuIGV2ZW50IGtleS5cbiAgICAgIElmIHRoZXkgYXJlIHRoZSBzYW1lLCB0aGVuIGNvbGxhcHNlIHRoZSBjb21wb25lbnQuXG4gICAgKi9cbiAgICBjb25zdCBldmVudEtleVBhc3NlZCA9IGV2ZW50S2V5ID09PSBhY3RpdmVFdmVudEtleSA/IG51bGwgOiBldmVudEtleTtcbiAgICBpZiAob25TZWxlY3QpIG9uU2VsZWN0KGV2ZW50S2V5UGFzc2VkLCBlKTtcbiAgICBpZiAob25DbGljaykgb25DbGljayhlKTtcbiAgfTtcbn1cbmNvbnN0IEFjY29yZGlvbkJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdidXR0b24nLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBvbkNsaWNrLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uLWJ1dHRvbicpO1xuICBjb25zdCB7XG4gICAgZXZlbnRLZXlcbiAgfSA9IHVzZUNvbnRleHQoQWNjb3JkaW9uSXRlbUNvbnRleHQpO1xuICBjb25zdCBhY2NvcmRpb25PbkNsaWNrID0gdXNlQWNjb3JkaW9uQnV0dG9uKGV2ZW50S2V5LCBvbkNsaWNrKTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUV2ZW50S2V5XG4gIH0gPSB1c2VDb250ZXh0KEFjY29yZGlvbkNvbnRleHQpO1xuXG4gIGlmIChDb21wb25lbnQgPT09ICdidXR0b24nKSB7XG4gICAgcHJvcHMudHlwZSA9ICdidXR0b24nO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIG9uQ2xpY2s6IGFjY29yZGlvbk9uQ2xpY2ssXG4gICAgLi4ucHJvcHMsXG4gICAgXCJhcmlhLWV4cGFuZGVkXCI6IGV2ZW50S2V5ID09PSBhY3RpdmVFdmVudEtleSxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgZXZlbnRLZXkgIT09IGFjdGl2ZUV2ZW50S2V5ICYmICdjb2xsYXBzZWQnKVxuICB9KTtcbn0pO1xuQWNjb3JkaW9uQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0FjY29yZGlvbkJ1dHRvbic7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25CdXR0b247IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICBldmVudEtleSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYWN0aXZlRXZlbnRLZXlcbiAgfSA9IHVzZUNvbnRleHQoQWNjb3JkaW9uQ29udGV4dCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYWNjb3JkaW9uLWNvbGxhcHNlJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb2xsYXBzZSwge1xuICAgIHJlZjogcmVmLFxuICAgIGluOiBhY3RpdmVFdmVudEtleSA9PT0gZXZlbnRLZXksXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIGNoaWxkcmVuOiBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKVxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb25Db2xsYXBzZS5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25Db2xsYXBzZSc7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25Db2xsYXBzZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBjb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuY29udGV4dC5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25Db250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkJ1dHRvbiBmcm9tICcuL0FjY29yZGlvbkJ1dHRvbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQWNjb3JkaW9uSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2gyJyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIG9uQ2xpY2ssXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdhY2NvcmRpb24taGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCksXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEFjY29yZGlvbkJ1dHRvbiwge1xuICAgICAgb25DbGljazogb25DbGljayxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXG4gIH0pO1xufSk7XG5BY2NvcmRpb25IZWFkZXIuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uSGVhZGVyJztcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkhlYWRlcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEFjY29yZGlvbkl0ZW1Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEFjY29yZGlvbkl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgZXZlbnRLZXksXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdhY2NvcmRpb24taXRlbScpO1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgZXZlbnRLZXlcbiAgfSksIFtldmVudEtleV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWNjb3JkaW9uSXRlbUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeClcbiAgICB9KVxuICB9KTtcbn0pO1xuQWNjb3JkaW9uSXRlbS5kaXNwbGF5TmFtZSA9ICdBY2NvcmRpb25JdGVtJztcbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkl0ZW07IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgY29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZXZlbnRLZXk6ICcnXG59KTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uSXRlbUNvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgY29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IEFuY2hvciBmcm9tICdAcmVzdGFydC91aS9BbmNob3InO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgQ2xvc2VCdXR0b24gZnJvbSAnLi9DbG9zZUJ1dHRvbic7XG5pbXBvcnQgZGl2V2l0aENsYXNzTmFtZSBmcm9tICcuL2RpdldpdGhDbGFzc05hbWUnO1xuaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRGl2U3R5bGVkQXNINCA9IGRpdldpdGhDbGFzc05hbWUoJ2g0Jyk7XG5EaXZTdHlsZWRBc0g0LmRpc3BsYXlOYW1lID0gJ0RpdlN0eWxlZEFzSDQnO1xuY29uc3QgQWxlcnRIZWFkaW5nID0gY3JlYXRlV2l0aEJzUHJlZml4KCdhbGVydC1oZWFkaW5nJywge1xuICBDb21wb25lbnQ6IERpdlN0eWxlZEFzSDRcbn0pO1xuY29uc3QgQWxlcnRMaW5rID0gY3JlYXRlV2l0aEJzUHJlZml4KCdhbGVydC1saW5rJywge1xuICBDb21wb25lbnQ6IEFuY2hvclxufSk7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICdwcmltYXJ5JyxcbiAgc2hvdzogdHJ1ZSxcbiAgdHJhbnNpdGlvbjogRmFkZSxcbiAgY2xvc2VMYWJlbDogJ0Nsb3NlIGFsZXJ0J1xufTtcbmNvbnN0IEFsZXJ0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHVuY29udHJvbGxlZFByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGJzUHJlZml4LFxuICAgIHNob3csXG4gICAgY2xvc2VMYWJlbCxcbiAgICBjbG9zZVZhcmlhbnQsXG4gICAgY2xhc3NOYW1lLFxuICAgIGNoaWxkcmVuLFxuICAgIHZhcmlhbnQsXG4gICAgb25DbG9zZSxcbiAgICBkaXNtaXNzaWJsZSxcbiAgICB0cmFuc2l0aW9uLFxuICAgIC4uLnByb3BzXG4gIH0gPSB1c2VVbmNvbnRyb2xsZWQodW5jb250cm9sbGVkUHJvcHMsIHtcbiAgICBzaG93OiAnb25DbG9zZSdcbiAgfSk7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2FsZXJ0Jyk7XG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlRXZlbnRDYWxsYmFjayhlID0+IHtcbiAgICBpZiAob25DbG9zZSkge1xuICAgICAgb25DbG9zZShmYWxzZSwgZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgVHJhbnNpdGlvbiA9IHRyYW5zaXRpb24gPT09IHRydWUgPyBGYWRlIDogdHJhbnNpdGlvbjtcblxuICBjb25zdCBhbGVydCA9IC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcm9sZTogXCJhbGVydFwiLFxuICAgIC4uLighVHJhbnNpdGlvbiA/IHByb3BzIDogdW5kZWZpbmVkKSxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIHZhcmlhbnQgJiYgYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCwgZGlzbWlzc2libGUgJiYgYCR7cHJlZml4fS1kaXNtaXNzaWJsZWApLFxuICAgIGNoaWxkcmVuOiBbZGlzbWlzc2libGUgJiYgLyojX19QVVJFX18qL19qc3goQ2xvc2VCdXR0b24sIHtcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsb3NlLFxuICAgICAgXCJhcmlhLWxhYmVsXCI6IGNsb3NlTGFiZWwsXG4gICAgICB2YXJpYW50OiBjbG9zZVZhcmlhbnRcbiAgICB9KSwgY2hpbGRyZW5dXG4gIH0pO1xuXG4gIGlmICghVHJhbnNpdGlvbikgcmV0dXJuIHNob3cgPyBhbGVydCA6IG51bGw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uLCB7XG4gICAgdW5tb3VudE9uRXhpdDogdHJ1ZSxcbiAgICAuLi5wcm9wcyxcbiAgICByZWY6IHVuZGVmaW5lZCxcbiAgICBpbjogc2hvdyxcbiAgICBjaGlsZHJlbjogYWxlcnRcbiAgfSk7XG59KTtcbkFsZXJ0LmRpc3BsYXlOYW1lID0gJ0FsZXJ0JztcbkFsZXJ0LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oQWxlcnQsIHtcbiAgTGluazogQWxlcnRMaW5rLFxuICBIZWFkaW5nOiBBbGVydEhlYWRpbmdcbn0pOyIsImltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmV4cG9ydCBkZWZhdWx0IEFuY2hvcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBiZzogJ3ByaW1hcnknLFxuICBwaWxsOiBmYWxzZVxufTtcbmNvbnN0IEJhZGdlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGJnLFxuICBwaWxsLFxuICB0ZXh0LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSAnc3BhbicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYmFkZ2UnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgcGlsbCAmJiBgcm91bmRlZC1waWxsYCwgdGV4dCAmJiBgdGV4dC0ke3RleHR9YCwgYmcgJiYgYGJnLSR7Ymd9YClcbiAgfSk7XG59KTtcbkJhZGdlLmRpc3BsYXlOYW1lID0gJ0JhZGdlJztcbkJhZGdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJhZGdlOyIsImltcG9ydCBhZGRDbGFzcyBmcm9tICdkb20taGVscGVycy9hZGRDbGFzcyc7XG5pbXBvcnQgY3NzIGZyb20gJ2RvbS1oZWxwZXJzL2Nzcyc7XG5pbXBvcnQgcXNhIGZyb20gJ2RvbS1oZWxwZXJzL3F1ZXJ5U2VsZWN0b3JBbGwnO1xuaW1wb3J0IHJlbW92ZUNsYXNzIGZyb20gJ2RvbS1oZWxwZXJzL3JlbW92ZUNsYXNzJztcbmltcG9ydCBNb2RhbE1hbmFnZXIgZnJvbSAnQHJlc3RhcnQvdWkvTW9kYWxNYW5hZ2VyJztcbmNvbnN0IFNlbGVjdG9yID0ge1xuICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gIFNUSUNLWV9DT05URU5UOiAnLnN0aWNreS10b3AnLFxuICBOQVZCQVJfVE9HR0xFUjogJy5uYXZiYXItdG9nZ2xlcidcbn07XG5cbmNsYXNzIEJvb3RzdHJhcE1vZGFsTWFuYWdlciBleHRlbmRzIE1vZGFsTWFuYWdlciB7XG4gIGFkanVzdEFuZFN0b3JlKHByb3AsIGVsZW1lbnQsIGFkanVzdCkge1xuICAgIGNvbnN0IGFjdHVhbCA9IGVsZW1lbnQuc3R5bGVbcHJvcF07IC8vIFRPRE86IERPTVN0cmluZ01hcCBhbmQgQ1NTU3R5bGVEZWNsYXJhdGlvbiBhcmVuJ3Qgc3RyaWN0bHkgY29tcGF0aWJsZVxuICAgIC8vIEB0cy1pZ25vcmVcblxuICAgIGVsZW1lbnQuZGF0YXNldFtwcm9wXSA9IGFjdHVhbDtcbiAgICBjc3MoZWxlbWVudCwge1xuICAgICAgW3Byb3BdOiBgJHtwYXJzZUZsb2F0KGNzcyhlbGVtZW50LCBwcm9wKSkgKyBhZGp1c3R9cHhgXG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlKHByb3AsIGVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZGF0YXNldFtwcm9wXTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgZWxlbWVudC5kYXRhc2V0W3Byb3BdO1xuICAgICAgY3NzKGVsZW1lbnQsIHtcbiAgICAgICAgW3Byb3BdOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpIHtcbiAgICBzdXBlci5zZXRDb250YWluZXJTdHlsZShjb250YWluZXJTdGF0ZSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRFbGVtZW50KCk7XG4gICAgYWRkQ2xhc3MoY29udGFpbmVyLCAnbW9kYWwtb3BlbicpO1xuICAgIGlmICghY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpIHJldHVybjtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHRoaXMuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3QgbWFyZ2luUHJvcCA9IHRoaXMuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShwYWRkaW5nUHJvcCwgZWwsIGNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSk7XG4gICAgcXNhKGNvbnRhaW5lciwgU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShtYXJnaW5Qcm9wLCBlbCwgLWNvbnRhaW5lclN0YXRlLnNjcm9sbEJhcldpZHRoKSk7XG4gICAgcXNhKGNvbnRhaW5lciwgU2VsZWN0b3IuTkFWQkFSX1RPR0dMRVIpLmZvckVhY2goZWwgPT4gdGhpcy5hZGp1c3RBbmRTdG9yZShtYXJnaW5Qcm9wLCBlbCwgY29udGFpbmVyU3RhdGUuc2Nyb2xsQmFyV2lkdGgpKTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRhaW5lclN0eWxlKGNvbnRhaW5lclN0YXRlKSB7XG4gICAgc3VwZXIucmVtb3ZlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyU3RhdGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgJ21vZGFsLW9wZW4nKTtcbiAgICBjb25zdCBwYWRkaW5nUHJvcCA9IHRoaXMuaXNSVEwgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCc7XG4gICAgY29uc3QgbWFyZ2luUHJvcCA9IHRoaXMuaXNSVEwgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmZvckVhY2goZWwgPT4gdGhpcy5yZXN0b3JlKHBhZGRpbmdQcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLlNUSUNLWV9DT05URU5UKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICAgIHFzYShjb250YWluZXIsIFNlbGVjdG9yLk5BVkJBUl9UT0dHTEVSKS5mb3JFYWNoKGVsID0+IHRoaXMucmVzdG9yZShtYXJnaW5Qcm9wLCBlbCkpO1xuICB9XG5cbn1cblxubGV0IHNoYXJlZE1hbmFnZXI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcmVkTWFuYWdlcihvcHRpb25zKSB7XG4gIGlmICghc2hhcmVkTWFuYWdlcikgc2hhcmVkTWFuYWdlciA9IG5ldyBCb290c3RyYXBNb2RhbE1hbmFnZXIob3B0aW9ucyk7XG4gIHJldHVybiBzaGFyZWRNYW5hZ2VyO1xufVxuZXhwb3J0IGRlZmF1bHQgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBCcmVhZGNydW1iSXRlbSBmcm9tICcuL0JyZWFkY3J1bWJJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGxhYmVsOiAnYnJlYWRjcnVtYicsXG4gIGxpc3RQcm9wczoge31cbn07XG5jb25zdCBCcmVhZGNydW1iID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgbGlzdFByb3BzLFxuICBjaGlsZHJlbixcbiAgbGFiZWwsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICduYXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2JyZWFkY3J1bWInKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIFwiYXJpYS1sYWJlbFwiOiBsYWJlbCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJvbFwiLCB7IC4uLmxpc3RQcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXgsIGxpc3RQcm9wcyA9PSBudWxsID8gdm9pZCAwIDogbGlzdFByb3BzLmNsYXNzTmFtZSksXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KVxuICB9KTtcbn0pO1xuQnJlYWRjcnVtYi5kaXNwbGF5TmFtZSA9ICdCcmVhZGNydW1iJztcbkJyZWFkY3J1bWIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihCcmVhZGNydW1iLCB7XG4gIEl0ZW06IEJyZWFkY3J1bWJJdGVtXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlLFxuICBsaW5rUHJvcHM6IHt9XG59O1xuY29uc3QgQnJlYWRjcnVtYkl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgYWN0aXZlLFxuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnbGknLFxuICBsaW5rQXM6IExpbmtDb21wb25lbnQgPSBBbmNob3IsXG4gIGxpbmtQcm9wcyxcbiAgaHJlZixcbiAgdGl0bGUsXG4gIHRhcmdldCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdicmVhZGNydW1iLWl0ZW0nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhwcmVmaXgsIGNsYXNzTmFtZSwge1xuICAgICAgYWN0aXZlXG4gICAgfSksXG4gICAgXCJhcmlhLWN1cnJlbnRcIjogYWN0aXZlID8gJ3BhZ2UnIDogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiBhY3RpdmUgPyBjaGlsZHJlbiA6IC8qI19fUFVSRV9fKi9fanN4KExpbmtDb21wb25lbnQsIHsgLi4ubGlua1Byb3BzLFxuICAgICAgaHJlZjogaHJlZixcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbkJyZWFkY3J1bWJJdGVtLmRpc3BsYXlOYW1lID0gJ0JyZWFkY3J1bWJJdGVtJztcbkJyZWFkY3J1bWJJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJyZWFkY3J1bWJJdGVtOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQnV0dG9uUHJvcHMgfSBmcm9tICdAcmVzdGFydC91aS9CdXR0b24nO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICdwcmltYXJ5JyxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuY29uc3QgQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYXMsXG4gIGJzUHJlZml4LFxuICB2YXJpYW50LFxuICBzaXplLFxuICBhY3RpdmUsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdidG4nKTtcbiAgY29uc3QgW2J1dHRvblByb3BzLCB7XG4gICAgdGFnTmFtZVxuICB9XSA9IHVzZUJ1dHRvblByb3BzKHtcbiAgICB0YWdOYW1lOiBhcyxcbiAgICAuLi5wcm9wc1xuICB9KTtcbiAgY29uc3QgQ29tcG9uZW50ID0gdGFnTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAuLi5idXR0b25Qcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgsIGFjdGl2ZSAmJiAnYWN0aXZlJywgdmFyaWFudCAmJiBgJHtwcmVmaXh9LSR7dmFyaWFudH1gLCBzaXplICYmIGAke3ByZWZpeH0tJHtzaXplfWAsIHByb3BzLmhyZWYgJiYgcHJvcHMuZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJylcbiAgfSk7XG59KTtcbkJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdCdXR0b24nO1xuQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB2ZXJ0aWNhbDogZmFsc2UsXG4gIHJvbGU6ICdncm91cCdcbn07XG5jb25zdCBCdXR0b25Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBzaXplLFxuICB2ZXJ0aWNhbCxcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucmVzdFxufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2J0bi1ncm91cCcpO1xuICBsZXQgYmFzZUNsYXNzID0gcHJlZml4O1xuICBpZiAodmVydGljYWwpIGJhc2VDbGFzcyA9IGAke3ByZWZpeH0tdmVydGljYWxgO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnJlc3QsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYmFzZUNsYXNzLCBzaXplICYmIGAke3ByZWZpeH0tJHtzaXplfWApXG4gIH0pO1xufSk7XG5CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdCdXR0b25Hcm91cCc7XG5CdXR0b25Hcm91cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBCdXR0b25Hcm91cDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICByb2xlOiAndG9vbGJhcidcbn07XG5jb25zdCBCdXR0b25Ub29sYmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdidG4tdG9vbGJhcicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgpXG4gIH0pO1xufSk7XG5CdXR0b25Ub29sYmFyLmRpc3BsYXlOYW1lID0gJ0J1dHRvblRvb2xiYXInO1xuQnV0dG9uVG9vbGJhci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBCdXR0b25Ub29sYmFyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IGRpdldpdGhDbGFzc05hbWUgZnJvbSAnLi9kaXZXaXRoQ2xhc3NOYW1lJztcbmltcG9ydCBDYXJkSW1nIGZyb20gJy4vQ2FyZEltZyc7XG5pbXBvcnQgQ2FyZEhlYWRlciBmcm9tICcuL0NhcmRIZWFkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERpdlN0eWxlZEFzSDUgPSBkaXZXaXRoQ2xhc3NOYW1lKCdoNScpO1xuY29uc3QgRGl2U3R5bGVkQXNINiA9IGRpdldpdGhDbGFzc05hbWUoJ2g2Jyk7XG5jb25zdCBDYXJkQm9keSA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1ib2R5Jyk7XG5jb25zdCBDYXJkVGl0bGUgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINVxufSk7XG5jb25zdCBDYXJkU3VidGl0bGUgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtc3VidGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINlxufSk7XG5jb25zdCBDYXJkTGluayA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1saW5rJywge1xuICBDb21wb25lbnQ6ICdhJ1xufSk7XG5jb25zdCBDYXJkVGV4dCA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC10ZXh0Jywge1xuICBDb21wb25lbnQ6ICdwJ1xufSk7XG5jb25zdCBDYXJkRm9vdGVyID0gY3JlYXRlV2l0aEJzUHJlZml4KCdjYXJkLWZvb3RlcicpO1xuY29uc3QgQ2FyZEltZ092ZXJsYXkgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2NhcmQtaW1nLW92ZXJsYXknKTtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgYm9keTogZmFsc2Vcbn07XG5jb25zdCBDYXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYmcsXG4gIHRleHQsXG4gIGJvcmRlcixcbiAgYm9keSxcbiAgY2hpbGRyZW4sXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NhcmQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgYmcgJiYgYGJnLSR7Ymd9YCwgdGV4dCAmJiBgdGV4dC0ke3RleHR9YCwgYm9yZGVyICYmIGBib3JkZXItJHtib3JkZXJ9YCksXG4gICAgY2hpbGRyZW46IGJvZHkgPyAvKiNfX1BVUkVfXyovX2pzeChDYXJkQm9keSwge1xuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSkgOiBjaGlsZHJlblxuICB9KTtcbn0pO1xuQ2FyZC5kaXNwbGF5TmFtZSA9ICdDYXJkJztcbkNhcmQuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihDYXJkLCB7XG4gIEltZzogQ2FyZEltZyxcbiAgVGl0bGU6IENhcmRUaXRsZSxcbiAgU3VidGl0bGU6IENhcmRTdWJ0aXRsZSxcbiAgQm9keTogQ2FyZEJvZHksXG4gIExpbms6IENhcmRMaW5rLFxuICBUZXh0OiBDYXJkVGV4dCxcbiAgSGVhZGVyOiBDYXJkSGVhZGVyLFxuICBGb290ZXI6IENhcmRGb290ZXIsXG4gIEltZ092ZXJsYXk6IENhcmRJbWdPdmVybGF5XG59KTsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgnY2FyZC1ncm91cCcpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQ2FyZEhlYWRlckNvbnRleHQgZnJvbSAnLi9DYXJkSGVhZGVyQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2FyZEhlYWRlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NhcmQtaGVhZGVyJyk7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjYXJkSGVhZGVyQnNQcmVmaXg6IHByZWZpeFxuICB9KSwgW3ByZWZpeF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ2FyZEhlYWRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBwcmVmaXgpXG4gICAgfSlcbiAgfSk7XG59KTtcbkNhcmRIZWFkZXIuZGlzcGxheU5hbWUgPSAnQ2FyZEhlYWRlcic7XG5leHBvcnQgZGVmYXVsdCBDYXJkSGVhZGVyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmNvbnN0IGNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnRleHQuZGlzcGxheU5hbWUgPSAnQ2FyZEhlYWRlckNvbnRleHQnO1xuZXhwb3J0IGRlZmF1bHQgY29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2FyZEltZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4oe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICBhczogQ29tcG9uZW50ID0gJ2ltZycsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY2FyZC1pbWcnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyh2YXJpYW50ID8gYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCA6IHByZWZpeCwgY2xhc3NOYW1lKSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuQ2FyZEltZy5kaXNwbGF5TmFtZSA9ICdDYXJkSW1nJztcbmV4cG9ydCBkZWZhdWx0IENhcmRJbWc7IiwiaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlVXBkYXRlRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVVwZGF0ZUVmZmVjdCc7XG5pbXBvcnQgdXNlQ29tbWl0dGVkUmVmIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUNvbW1pdHRlZFJlZic7XG5pbXBvcnQgdXNlVGltZW91dCBmcm9tICdAcmVzdGFydC9ob29rcy91c2VUaW1lb3V0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBDYXJvdXNlbENhcHRpb24gZnJvbSAnLi9DYXJvdXNlbENhcHRpb24nO1xuaW1wb3J0IENhcm91c2VsSXRlbSBmcm9tICcuL0Nhcm91c2VsSXRlbSc7XG5pbXBvcnQgeyBtYXAsIGZvckVhY2ggfSBmcm9tICcuL0VsZW1lbnRDaGlsZHJlbic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IHRyaWdnZXJCcm93c2VyUmVmbG93IGZyb20gJy4vdHJpZ2dlckJyb3dzZXJSZWZsb3cnO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgU1dJUEVfVEhSRVNIT0xEID0gNDA7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHNsaWRlOiB0cnVlLFxuICBmYWRlOiBmYWxzZSxcbiAgY29udHJvbHM6IHRydWUsXG4gIGluZGljYXRvcnM6IHRydWUsXG4gIGluZGljYXRvckxhYmVsczogW10sXG4gIGRlZmF1bHRBY3RpdmVJbmRleDogMCxcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBwYXVzZTogJ2hvdmVyJyxcbiAgd3JhcDogdHJ1ZSxcbiAgdG91Y2g6IHRydWUsXG4gIHByZXZJY29uOiAvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgY2xhc3NOYW1lOiBcImNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uXCJcbiAgfSksXG4gIHByZXZMYWJlbDogJ1ByZXZpb3VzJyxcbiAgbmV4dEljb246IC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICBjbGFzc05hbWU6IFwiY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb25cIlxuICB9KSxcbiAgbmV4dExhYmVsOiAnTmV4dCdcbn07XG5cbmZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5zdHlsZSB8fCAhZWxlbWVudC5wYXJlbnROb2RlIHx8ICFlbGVtZW50LnBhcmVudE5vZGUuc3R5bGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbGVtZW50U3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudFN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBlbGVtZW50U3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiYgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LnBhcmVudE5vZGUpLmRpc3BsYXkgIT09ICdub25lJztcbn1cblxuY29uc3QgQ2Fyb3VzZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigodW5jb250cm9sbGVkUHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBic1ByZWZpeCxcbiAgICBzbGlkZSxcbiAgICBmYWRlLFxuICAgIGNvbnRyb2xzLFxuICAgIGluZGljYXRvcnMsXG4gICAgaW5kaWNhdG9yTGFiZWxzLFxuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uU2VsZWN0LFxuICAgIG9uU2xpZGUsXG4gICAgb25TbGlkLFxuICAgIGludGVydmFsLFxuICAgIGtleWJvYXJkLFxuICAgIG9uS2V5RG93bixcbiAgICBwYXVzZSxcbiAgICBvbk1vdXNlT3ZlcixcbiAgICBvbk1vdXNlT3V0LFxuICAgIHdyYXAsXG4gICAgdG91Y2gsXG4gICAgb25Ub3VjaFN0YXJ0LFxuICAgIG9uVG91Y2hNb3ZlLFxuICAgIG9uVG91Y2hFbmQsXG4gICAgcHJldkljb24sXG4gICAgcHJldkxhYmVsLFxuICAgIG5leHRJY29uLFxuICAgIG5leHRMYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIGNsYXNzTmFtZSxcbiAgICBjaGlsZHJlbixcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHVuY29udHJvbGxlZFByb3BzLCB7XG4gICAgYWN0aXZlSW5kZXg6ICdvblNlbGVjdCdcbiAgfSk7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Nhcm91c2VsJyk7XG4gIGNvbnN0IGlzUlRMID0gdXNlSXNSVEwoKTtcbiAgY29uc3QgbmV4dERpcmVjdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW2RpcmVjdGlvbiwgc2V0RGlyZWN0aW9uXSA9IHVzZVN0YXRlKCduZXh0Jyk7XG4gIGNvbnN0IFtwYXVzZWQsIHNldFBhdXNlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc1NsaWRpbmcsIHNldElzU2xpZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtyZW5kZXJlZEFjdGl2ZUluZGV4LCBzZXRSZW5kZXJlZEFjdGl2ZUluZGV4XSA9IHVzZVN0YXRlKGFjdGl2ZUluZGV4IHx8IDApO1xuXG4gIGlmICghaXNTbGlkaW5nICYmIGFjdGl2ZUluZGV4ICE9PSByZW5kZXJlZEFjdGl2ZUluZGV4KSB7XG4gICAgaWYgKG5leHREaXJlY3Rpb25SZWYuY3VycmVudCkge1xuICAgICAgc2V0RGlyZWN0aW9uKG5leHREaXJlY3Rpb25SZWYuY3VycmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpcmVjdGlvbigoYWN0aXZlSW5kZXggfHwgMCkgPiByZW5kZXJlZEFjdGl2ZUluZGV4ID8gJ25leHQnIDogJ3ByZXYnKTtcbiAgICB9XG5cbiAgICBpZiAoc2xpZGUpIHtcbiAgICAgIHNldElzU2xpZGluZyh0cnVlKTtcbiAgICB9XG5cbiAgICBzZXRSZW5kZXJlZEFjdGl2ZUluZGV4KGFjdGl2ZUluZGV4IHx8IDApO1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobmV4dERpcmVjdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICBuZXh0RGlyZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfSk7XG4gIGxldCBudW1DaGlsZHJlbiA9IDA7XG4gIGxldCBhY3RpdmVDaGlsZEludGVydmFsOyAvLyBJdGVyYXRlIHRvIGdyYWIgYWxsIG9mIHRoZSBjaGlsZHJlbidzIGludGVydmFsIHZhbHVlc1xuICAvLyAoYW5kIGNvdW50IHRoZW0sIHRvbylcblxuICBmb3JFYWNoKGNoaWxkcmVuLCAoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgKytudW1DaGlsZHJlbjtcblxuICAgIGlmIChpbmRleCA9PT0gYWN0aXZlSW5kZXgpIHtcbiAgICAgIGFjdGl2ZUNoaWxkSW50ZXJ2YWwgPSBjaGlsZC5wcm9wcy5pbnRlcnZhbDtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBhY3RpdmVDaGlsZEludGVydmFsUmVmID0gdXNlQ29tbWl0dGVkUmVmKGFjdGl2ZUNoaWxkSW50ZXJ2YWwpO1xuICBjb25zdCBwcmV2ID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChpc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEFjdGl2ZUluZGV4ID0gcmVuZGVyZWRBY3RpdmVJbmRleCAtIDE7XG5cbiAgICBpZiAobmV4dEFjdGl2ZUluZGV4IDwgMCkge1xuICAgICAgaWYgKCF3cmFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dEFjdGl2ZUluZGV4ID0gbnVtQ2hpbGRyZW4gLSAxO1xuICAgIH1cblxuICAgIG5leHREaXJlY3Rpb25SZWYuY3VycmVudCA9ICdwcmV2JztcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QobmV4dEFjdGl2ZUluZGV4LCBldmVudCk7XG4gIH0sIFtpc1NsaWRpbmcsIHJlbmRlcmVkQWN0aXZlSW5kZXgsIG9uU2VsZWN0LCB3cmFwLCBudW1DaGlsZHJlbl0pOyAvLyBUaGlzIGlzIHVzZWQgaW4gdGhlIHNldEludGVydmFsLCBzbyBpdCBzaG91bGQgbm90IGludmFsaWRhdGUuXG5cbiAgY29uc3QgbmV4dCA9IHVzZUV2ZW50Q2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChpc1NsaWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV4dEFjdGl2ZUluZGV4ID0gcmVuZGVyZWRBY3RpdmVJbmRleCArIDE7XG5cbiAgICBpZiAobmV4dEFjdGl2ZUluZGV4ID49IG51bUNoaWxkcmVuKSB7XG4gICAgICBpZiAoIXdyYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0QWN0aXZlSW5kZXggPSAwO1xuICAgIH1cblxuICAgIG5leHREaXJlY3Rpb25SZWYuY3VycmVudCA9ICduZXh0JztcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QobmV4dEFjdGl2ZUluZGV4LCBldmVudCk7XG4gIH0pO1xuICBjb25zdCBlbGVtZW50UmVmID0gdXNlUmVmKCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIGVsZW1lbnQ6IGVsZW1lbnRSZWYuY3VycmVudCxcbiAgICBwcmV2LFxuICAgIG5leHRcbiAgfSkpOyAvLyBUaGlzIGlzIHVzZWQgaW4gdGhlIHNldEludGVydmFsLCBzbyBpdCBzaG91bGQgbm90IGludmFsaWRhdGUuXG5cbiAgY29uc3QgbmV4dFdoZW5WaXNpYmxlID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5oaWRkZW4gJiYgaXNWaXNpYmxlKGVsZW1lbnRSZWYuY3VycmVudCkpIHtcbiAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICBwcmV2KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc2xpZGVEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICduZXh0JyA/ICdzdGFydCcgOiAnZW5kJztcbiAgdXNlVXBkYXRlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc2xpZGUpIHtcbiAgICAgIC8vIFRoZXNlIGNhbGxiYWNrcyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIDxUcmFuc2l0aW9uPiBjYWxsYmFja3MuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25TbGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25TbGlkZShyZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbik7XG4gICAgb25TbGlkID09IG51bGwgPyB2b2lkIDAgOiBvblNsaWQocmVuZGVyZWRBY3RpdmVJbmRleCwgc2xpZGVEaXJlY3Rpb24pO1xuICB9LCBbcmVuZGVyZWRBY3RpdmVJbmRleF0pO1xuICBjb25zdCBvcmRlckNsYXNzTmFtZSA9IGAke3ByZWZpeH0taXRlbS0ke2RpcmVjdGlvbn1gO1xuICBjb25zdCBkaXJlY3Rpb25hbENsYXNzTmFtZSA9IGAke3ByZWZpeH0taXRlbS0ke3NsaWRlRGlyZWN0aW9ufWA7XG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSk7XG4gICAgb25TbGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25TbGlkZShyZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbik7XG4gIH0sIFtvblNsaWRlLCByZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbl0pO1xuICBjb25zdCBoYW5kbGVFbnRlcmVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldElzU2xpZGluZyhmYWxzZSk7XG4gICAgb25TbGlkID09IG51bGwgPyB2b2lkIDAgOiBvblNsaWQocmVuZGVyZWRBY3RpdmVJbmRleCwgc2xpZGVEaXJlY3Rpb24pO1xuICB9LCBbb25TbGlkLCByZW5kZXJlZEFjdGl2ZUluZGV4LCBzbGlkZURpcmVjdGlvbl0pO1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChrZXlib2FyZCAmJiAhL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICAgICAgbmV4dChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXYoZXZlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgaWYgKGlzUlRMKSB7XG4gICAgICAgICAgICBwcmV2KGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dChldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25LZXlEb3duID09IG51bGwgPyB2b2lkIDAgOiBvbktleURvd24oZXZlbnQpO1xuICB9LCBba2V5Ym9hcmQsIG9uS2V5RG93biwgcHJldiwgbmV4dCwgaXNSVExdKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdmVyID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChwYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgc2V0UGF1c2VkKHRydWUpO1xuICAgIH1cblxuICAgIG9uTW91c2VPdmVyID09IG51bGwgPyB2b2lkIDAgOiBvbk1vdXNlT3ZlcihldmVudCk7XG4gIH0sIFtwYXVzZSwgb25Nb3VzZU92ZXJdKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdXQgPSB1c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBvbk1vdXNlT3V0ID09IG51bGwgPyB2b2lkIDAgOiBvbk1vdXNlT3V0KGV2ZW50KTtcbiAgfSwgW29uTW91c2VPdXRdKTtcbiAgY29uc3QgdG91Y2hTdGFydFhSZWYgPSB1c2VSZWYoMCk7XG4gIGNvbnN0IHRvdWNoRGVsdGFYUmVmID0gdXNlUmVmKDApO1xuICBjb25zdCB0b3VjaFVucGF1c2VUaW1lb3V0ID0gdXNlVGltZW91dCgpO1xuICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gdXNlQ2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIHRvdWNoU3RhcnRYUmVmLmN1cnJlbnQgPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgdG91Y2hEZWx0YVhSZWYuY3VycmVudCA9IDA7XG5cbiAgICBpZiAocGF1c2UgPT09ICdob3ZlcicpIHtcbiAgICAgIHNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICBvblRvdWNoU3RhcnQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG91Y2hTdGFydChldmVudCk7XG4gIH0sIFtwYXVzZSwgb25Ub3VjaFN0YXJ0XSk7XG4gIGNvbnN0IGhhbmRsZVRvdWNoTW92ZSA9IHVzZUNhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRvdWNoRGVsdGFYUmVmLmN1cnJlbnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3VjaERlbHRhWFJlZi5jdXJyZW50ID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdG91Y2hTdGFydFhSZWYuY3VycmVudDtcbiAgICB9XG5cbiAgICBvblRvdWNoTW92ZSA9PSBudWxsID8gdm9pZCAwIDogb25Ub3VjaE1vdmUoZXZlbnQpO1xuICB9LCBbb25Ub3VjaE1vdmVdKTtcbiAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSB1c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgaWYgKHRvdWNoKSB7XG4gICAgICBjb25zdCB0b3VjaERlbHRhWCA9IHRvdWNoRGVsdGFYUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChNYXRoLmFicyh0b3VjaERlbHRhWCkgPiBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgICAgaWYgKHRvdWNoRGVsdGFYID4gMCkge1xuICAgICAgICAgIHByZXYoZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhdXNlID09PSAnaG92ZXInKSB7XG4gICAgICB0b3VjaFVucGF1c2VUaW1lb3V0LnNldCgoKSA9PiB7XG4gICAgICAgIHNldFBhdXNlZChmYWxzZSk7XG4gICAgICB9LCBpbnRlcnZhbCB8fCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIG9uVG91Y2hFbmQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG91Y2hFbmQoZXZlbnQpO1xuICB9LCBbdG91Y2gsIHBhdXNlLCBwcmV2LCBuZXh0LCB0b3VjaFVucGF1c2VUaW1lb3V0LCBpbnRlcnZhbCwgb25Ub3VjaEVuZF0pO1xuICBjb25zdCBzaG91bGRQbGF5ID0gaW50ZXJ2YWwgIT0gbnVsbCAmJiAhcGF1c2VkICYmICFpc1NsaWRpbmc7XG4gIGNvbnN0IGludGVydmFsSGFuZGxlUmVmID0gdXNlUmVmKCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdmFyIF9yZWYsIF9hY3RpdmVDaGlsZEludGVydmFsUjtcblxuICAgIGlmICghc2hvdWxkUGxheSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RnVuYyA9IGlzUlRMID8gcHJldiA6IG5leHQ7XG4gICAgaW50ZXJ2YWxIYW5kbGVSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRJbnRlcnZhbChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPyBuZXh0V2hlblZpc2libGUgOiBuZXh0RnVuYywgKF9yZWYgPSAoX2FjdGl2ZUNoaWxkSW50ZXJ2YWxSID0gYWN0aXZlQ2hpbGRJbnRlcnZhbFJlZi5jdXJyZW50KSAhPSBudWxsID8gX2FjdGl2ZUNoaWxkSW50ZXJ2YWxSIDogaW50ZXJ2YWwpICE9IG51bGwgPyBfcmVmIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGludGVydmFsSGFuZGxlUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZVJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbc2hvdWxkUGxheSwgcHJldiwgbmV4dCwgYWN0aXZlQ2hpbGRJbnRlcnZhbFJlZiwgaW50ZXJ2YWwsIG5leHRXaGVuVmlzaWJsZSwgaXNSVExdKTtcbiAgY29uc3QgaW5kaWNhdG9yT25DbGlja3MgPSB1c2VNZW1vKCgpID0+IGluZGljYXRvcnMgJiYgQXJyYXkuZnJvbSh7XG4gICAgbGVuZ3RoOiBudW1DaGlsZHJlblxuICB9LCAoXywgaW5kZXgpID0+IGV2ZW50ID0+IHtcbiAgICBvblNlbGVjdCA9PSBudWxsID8gdm9pZCAwIDogb25TZWxlY3QoaW5kZXgsIGV2ZW50KTtcbiAgfSksIFtpbmRpY2F0b3JzLCBudW1DaGlsZHJlbiwgb25TZWxlY3RdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhDb21wb25lbnQsIHtcbiAgICByZWY6IGVsZW1lbnRSZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgIG9uTW91c2VPdmVyOiBoYW5kbGVNb3VzZU92ZXIsXG4gICAgb25Nb3VzZU91dDogaGFuZGxlTW91c2VPdXQsXG4gICAgb25Ub3VjaFN0YXJ0OiBoYW5kbGVUb3VjaFN0YXJ0LFxuICAgIG9uVG91Y2hNb3ZlOiBoYW5kbGVUb3VjaE1vdmUsXG4gICAgb25Ub3VjaEVuZDogaGFuZGxlVG91Y2hFbmQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBzbGlkZSAmJiAnc2xpZGUnLCBmYWRlICYmIGAke3ByZWZpeH0tZmFkZWAsIHZhcmlhbnQgJiYgYCR7cHJlZml4fS0ke3ZhcmlhbnR9YCksXG4gICAgY2hpbGRyZW46IFtpbmRpY2F0b3JzICYmIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1pbmRpY2F0b3JzYCxcbiAgICAgIGNoaWxkcmVuOiBtYXAoY2hpbGRyZW4sIChfLCBpbmRleCkgPT4gLyojX19QVVJFX18qL19qc3goXCJidXR0b25cIiwge1xuICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICBcImRhdGEtYnMtdGFyZ2V0XCI6IFwiXCIgLy8gQm9vdHN0cmFwIHJlcXVpcmVzIHRoaXMgaW4gdGhlaXIgY3NzLlxuICAgICAgICAsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBpbmRpY2F0b3JMYWJlbHMgIT0gbnVsbCAmJiBpbmRpY2F0b3JMYWJlbHMubGVuZ3RoID8gaW5kaWNhdG9yTGFiZWxzW2luZGV4XSA6IGBTbGlkZSAke2luZGV4ICsgMX1gLFxuICAgICAgICBjbGFzc05hbWU6IGluZGV4ID09PSByZW5kZXJlZEFjdGl2ZUluZGV4ID8gJ2FjdGl2ZScgOiB1bmRlZmluZWQsXG4gICAgICAgIG9uQ2xpY2s6IGluZGljYXRvck9uQ2xpY2tzID8gaW5kaWNhdG9yT25DbGlja3NbaW5kZXhdIDogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtY3VycmVudFwiOiBpbmRleCA9PT0gcmVuZGVyZWRBY3RpdmVJbmRleFxuICAgICAgfSwgaW5kZXgpKVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0taW5uZXJgLFxuICAgICAgY2hpbGRyZW46IG1hcChjaGlsZHJlbiwgKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGluZGV4ID09PSByZW5kZXJlZEFjdGl2ZUluZGV4O1xuICAgICAgICByZXR1cm4gc2xpZGUgPyAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uV3JhcHBlciwge1xuICAgICAgICAgIGluOiBpc0FjdGl2ZSxcbiAgICAgICAgICBvbkVudGVyOiBpc0FjdGl2ZSA/IGhhbmRsZUVudGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uRW50ZXJlZDogaXNBY3RpdmUgPyBoYW5kbGVFbnRlcmVkIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFkZEVuZExpc3RlbmVyOiB0cmFuc2l0aW9uRW5kTGlzdGVuZXIsXG4gICAgICAgICAgY2hpbGRyZW46IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHsgLi4uaW5uZXJQcm9wcyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjaGlsZC5wcm9wcy5jbGFzc05hbWUsIGlzQWN0aXZlICYmIHN0YXR1cyAhPT0gJ2VudGVyZWQnICYmIG9yZGVyQ2xhc3NOYW1lLCAoc3RhdHVzID09PSAnZW50ZXJlZCcgfHwgc3RhdHVzID09PSAnZXhpdGluZycpICYmICdhY3RpdmUnLCAoc3RhdHVzID09PSAnZW50ZXJpbmcnIHx8IHN0YXR1cyA9PT0gJ2V4aXRpbmcnKSAmJiBkaXJlY3Rpb25hbENsYXNzTmFtZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2hpbGQucHJvcHMuY2xhc3NOYW1lLCBpc0FjdGl2ZSAmJiAnYWN0aXZlJylcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgIH0pLCBjb250cm9scyAmJiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgICBjaGlsZHJlbjogWyh3cmFwIHx8IGFjdGl2ZUluZGV4ICE9PSAwKSAmJiAvKiNfX1BVUkVfXyovX2pzeHMoQW5jaG9yLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1jb250cm9sLXByZXZgLFxuICAgICAgICBvbkNsaWNrOiBwcmV2LFxuICAgICAgICBjaGlsZHJlbjogW3ByZXZJY29uLCBwcmV2TGFiZWwgJiYgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByZXZMYWJlbFxuICAgICAgICB9KV1cbiAgICAgIH0pLCAod3JhcCB8fCBhY3RpdmVJbmRleCAhPT0gbnVtQ2hpbGRyZW4gLSAxKSAmJiAvKiNfX1BVUkVfXyovX2pzeHMoQW5jaG9yLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4fS1jb250cm9sLW5leHRgLFxuICAgICAgICBvbkNsaWNrOiBuZXh0LFxuICAgICAgICBjaGlsZHJlbjogW25leHRJY29uLCBuZXh0TGFiZWwgJiYgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgICAgY2hpbGRyZW46IG5leHRMYWJlbFxuICAgICAgICB9KV1cbiAgICAgIH0pXVxuICAgIH0pXVxuICB9KTtcbn0pO1xuQ2Fyb3VzZWwuZGlzcGxheU5hbWUgPSAnQ2Fyb3VzZWwnO1xuQ2Fyb3VzZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihDYXJvdXNlbCwge1xuICBDYXB0aW9uOiBDYXJvdXNlbENhcHRpb24sXG4gIEl0ZW06IENhcm91c2VsSXRlbVxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Nhcm91c2VsLWNhcHRpb24nKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgQ2Fyb3VzZWxJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgZmluYWxDbGFzc05hbWUgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnY2Fyb3VzZWwtaXRlbScpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogZmluYWxDbGFzc05hbWVcbiAgfSk7XG59KTtcbkNhcm91c2VsSXRlbS5kaXNwbGF5TmFtZSA9ICdDYXJvdXNlbEl0ZW0nO1xuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWxJdGVtOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gICdhcmlhLWxhYmVsJzogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFJlbmRlciBkaWZmZXJlbnQgY29sb3IgdmFyaWFudCBmb3IgdGhlIGJ1dHRvbi5cbiAgICpcbiAgICogT21pdHRpbmcgdGhpcyB3aWxsIHJlbmRlciB0aGUgZGVmYXVsdCBkYXJrIGNvbG9yLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnd2hpdGUnXSlcbn07XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gICdhcmlhLWxhYmVsJzogJ0Nsb3NlJ1xufTtcbmNvbnN0IENsb3NlQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeChcImJ1dHRvblwiLCB7XG4gIHJlZjogcmVmLFxuICB0eXBlOiBcImJ1dHRvblwiLFxuICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoJ2J0bi1jbG9zZScsIHZhcmlhbnQgJiYgYGJ0bi1jbG9zZS0ke3ZhcmlhbnR9YCwgY2xhc3NOYW1lKSxcbiAgLi4ucHJvcHNcbn0pKTtcbkNsb3NlQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0Nsb3NlQnV0dG9uJztcbkNsb3NlQnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNsb3NlQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IENsb3NlQnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBERVZJQ0VfU0laRVMgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbCh7XG4gIGFzLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSkge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2NvbCcpO1xuICBjb25zdCBzcGFucyA9IFtdO1xuICBjb25zdCBjbGFzc2VzID0gW107XG4gIERFVklDRV9TSVpFUy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgc3BhbjtcbiAgICBsZXQgb2Zmc2V0O1xuICAgIGxldCBvcmRlcjtcblxuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnb2JqZWN0JyAmJiBwcm9wVmFsdWUgIT0gbnVsbCkge1xuICAgICAgKHtcbiAgICAgICAgc3BhbixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlclxuICAgICAgfSA9IHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYW4gPSBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgaWYgKHNwYW4pIHNwYW5zLnB1c2goc3BhbiA9PT0gdHJ1ZSA/IGAke2JzUHJlZml4fSR7aW5maXh9YCA6IGAke2JzUHJlZml4fSR7aW5maXh9LSR7c3Bhbn1gKTtcbiAgICBpZiAob3JkZXIgIT0gbnVsbCkgY2xhc3Nlcy5wdXNoKGBvcmRlciR7aW5maXh9LSR7b3JkZXJ9YCk7XG4gICAgaWYgKG9mZnNldCAhPSBudWxsKSBjbGFzc2VzLnB1c2goYG9mZnNldCR7aW5maXh9LSR7b2Zmc2V0fWApO1xuICB9KTtcbiAgcmV0dXJuIFt7IC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIC4uLnNwYW5zLCAuLi5jbGFzc2VzKVxuICB9LCB7XG4gICAgYXMsXG4gICAgYnNQcmVmaXgsXG4gICAgc3BhbnNcbiAgfV07XG59XG5jb25zdCBDb2wgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3QgW3tcbiAgICBjbGFzc05hbWUsXG4gICAgLi4uY29sUHJvcHNcbiAgfSwge1xuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBic1ByZWZpeCxcbiAgICBzcGFuc1xuICB9XSA9IHVzZUNvbChwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4uY29sUHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgIXNwYW5zLmxlbmd0aCAmJiBic1ByZWZpeClcbiAgfSk7XG59KTtcbkNvbC5kaXNwbGF5TmFtZSA9ICdDb2wnO1xuZXhwb3J0IGRlZmF1bHQgQ29sOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNzcyBmcm9tICdkb20taGVscGVycy9jc3MnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFTlRFUkVELCBFTlRFUklORywgRVhJVEVELCBFWElUSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IGNyZWF0ZUNoYWluZWRGdW5jdGlvbiBmcm9tICcuL2NyZWF0ZUNoYWluZWRGdW5jdGlvbic7XG5pbXBvcnQgdHJpZ2dlckJyb3dzZXJSZWZsb3cgZnJvbSAnLi90cmlnZ2VyQnJvd3NlclJlZmxvdyc7XG5pbXBvcnQgVHJhbnNpdGlvbldyYXBwZXIgZnJvbSAnLi9UcmFuc2l0aW9uV3JhcHBlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTUFSR0lOUyA9IHtcbiAgaGVpZ2h0OiBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nXSxcbiAgd2lkdGg6IFsnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCddXG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGltZW5zaW9uVmFsdWUoZGltZW5zaW9uLCBlbGVtKSB7XG4gIGNvbnN0IG9mZnNldCA9IGBvZmZzZXQke2RpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpfSR7ZGltZW5zaW9uLnNsaWNlKDEpfWA7XG4gIGNvbnN0IHZhbHVlID0gZWxlbVtvZmZzZXRdO1xuICBjb25zdCBtYXJnaW5zID0gTUFSR0lOU1tkaW1lbnNpb25dO1xuICByZXR1cm4gdmFsdWUgKyAvLyBAdHMtaWdub3JlXG4gIHBhcnNlSW50KGNzcyhlbGVtLCBtYXJnaW5zWzBdKSwgMTApICsgLy8gQHRzLWlnbm9yZVxuICBwYXJzZUludChjc3MoZWxlbSwgbWFyZ2luc1sxXSksIDEwKTtcbn1cblxuY29uc3QgY29sbGFwc2VTdHlsZXMgPSB7XG4gIFtFWElURURdOiAnY29sbGFwc2UnLFxuICBbRVhJVElOR106ICdjb2xsYXBzaW5nJyxcbiAgW0VOVEVSSU5HXTogJ2NvbGxhcHNpbmcnLFxuICBbRU5URVJFRF06ICdjb2xsYXBzZSBzaG93J1xufTtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlLFxuICBnZXREaW1lbnNpb25WYWx1ZTogZ2V0RGVmYXVsdERpbWVuc2lvblZhbHVlXG59O1xuY29uc3QgQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBvbkVudGVyLFxuICBvbkVudGVyaW5nLFxuICBvbkVudGVyZWQsXG4gIG9uRXhpdCxcbiAgb25FeGl0aW5nLFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICBkaW1lbnNpb24gPSAnaGVpZ2h0JyxcbiAgZ2V0RGltZW5zaW9uVmFsdWUgPSBnZXREZWZhdWx0RGltZW5zaW9uVmFsdWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgLyogQ29tcHV0ZSBkaW1lbnNpb24gKi9cbiAgY29uc3QgY29tcHV0ZWREaW1lbnNpb24gPSB0eXBlb2YgZGltZW5zaW9uID09PSAnZnVuY3Rpb24nID8gZGltZW5zaW9uKCkgOiBkaW1lbnNpb247XG4gIC8qIC0tIEV4cGFuZGluZyAtLSAqL1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSAnMCc7XG4gIH0sIG9uRW50ZXIpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRW50ZXJdKTtcbiAgY29uc3QgaGFuZGxlRW50ZXJpbmcgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihlbGVtID0+IHtcbiAgICBjb25zdCBzY3JvbGwgPSBgc2Nyb2xsJHtjb21wdXRlZERpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpfSR7Y29tcHV0ZWREaW1lbnNpb24uc2xpY2UoMSl9YDtcbiAgICBlbGVtLnN0eWxlW2NvbXB1dGVkRGltZW5zaW9uXSA9IGAke2VsZW1bc2Nyb2xsXX1weGA7XG4gIH0sIG9uRW50ZXJpbmcpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRW50ZXJpbmddKTtcbiAgY29uc3QgaGFuZGxlRW50ZXJlZCA9IHVzZU1lbW8oKCkgPT4gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKGVsZW0gPT4ge1xuICAgIGVsZW0uc3R5bGVbY29tcHV0ZWREaW1lbnNpb25dID0gbnVsbDtcbiAgfSwgb25FbnRlcmVkKSwgW2NvbXB1dGVkRGltZW5zaW9uLCBvbkVudGVyZWRdKTtcbiAgLyogLS0gQ29sbGFwc2luZyAtLSAqL1xuXG4gIGNvbnN0IGhhbmRsZUV4aXQgPSB1c2VNZW1vKCgpID0+IGNyZWF0ZUNoYWluZWRGdW5jdGlvbihlbGVtID0+IHtcbiAgICBlbGVtLnN0eWxlW2NvbXB1dGVkRGltZW5zaW9uXSA9IGAke2dldERpbWVuc2lvblZhbHVlKGNvbXB1dGVkRGltZW5zaW9uLCBlbGVtKX1weGA7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3coZWxlbSk7XG4gIH0sIG9uRXhpdCksIFtvbkV4aXQsIGdldERpbWVuc2lvblZhbHVlLCBjb21wdXRlZERpbWVuc2lvbl0pO1xuICBjb25zdCBoYW5kbGVFeGl0aW5nID0gdXNlTWVtbygoKSA9PiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oZWxlbSA9PiB7XG4gICAgZWxlbS5zdHlsZVtjb21wdXRlZERpbWVuc2lvbl0gPSBudWxsO1xuICB9LCBvbkV4aXRpbmcpLCBbY29tcHV0ZWREaW1lbnNpb24sIG9uRXhpdGluZ10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbldyYXBwZXIsIHtcbiAgICByZWY6IHJlZixcbiAgICBhZGRFbmRMaXN0ZW5lcjogdHJhbnNpdGlvbkVuZExpc3RlbmVyLFxuICAgIC4uLnByb3BzLFxuICAgIFwiYXJpYS1leHBhbmRlZFwiOiBwcm9wcy5yb2xlID8gcHJvcHMuaW4gOiBudWxsLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0aW5nOiBoYW5kbGVFeGl0aW5nLFxuICAgIGNoaWxkUmVmOiBjaGlsZHJlbi5yZWYsXG4gICAgY2hpbGRyZW46IChzdGF0ZSwgaW5uZXJQcm9wcykgPT4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgeyAuLi5pbm5lclByb3BzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBjb2xsYXBzZVN0eWxlc1tzdGF0ZV0sIGNvbXB1dGVkRGltZW5zaW9uID09PSAnd2lkdGgnICYmICdjb2xsYXBzZS1ob3Jpem9udGFsJylcbiAgICB9KVxuICB9KTtcbn0pOyAvLyBAdHMtaWdub3JlXG5cbi8vIEB0cy1pZ25vcmVcbkNvbGxhcHNlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiBmYWxzZVxufTtcbmNvbnN0IENvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBmbHVpZCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdjb250YWluZXInKTtcbiAgY29uc3Qgc3VmZml4ID0gdHlwZW9mIGZsdWlkID09PSAnc3RyaW5nJyA/IGAtJHtmbHVpZH1gIDogJy1mbHVpZCc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBmbHVpZCA/IGAke3ByZWZpeH0ke3N1ZmZpeH1gIDogcHJlZml4KVxuICB9KTtcbn0pO1xuQ29udGFpbmVyLmRpc3BsYXlOYW1lID0gJ0NvbnRhaW5lcic7XG5Db250YWluZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgQ29udGFpbmVyOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlRHJvcGRvd24gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd24nO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgRHJvcGRvd25Db250ZXh0IGZyb20gJy4vRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCBEcm9wZG93bkl0ZW0gZnJvbSAnLi9Ecm9wZG93bkl0ZW0nO1xuaW1wb3J0IERyb3Bkb3duTWVudSwgeyBnZXREcm9wZG93bk1lbnVQbGFjZW1lbnQgfSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgRHJvcGRvd25Ub2dnbGUgZnJvbSAnLi9Ecm9wZG93blRvZ2dsZSc7XG5pbXBvcnQgSW5wdXRHcm91cENvbnRleHQgZnJvbSAnLi9JbnB1dEdyb3VwQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IHsgYWxpZ25Qcm9wVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERyb3Bkb3duSGVhZGVyID0gY3JlYXRlV2l0aEJzUHJlZml4KCdkcm9wZG93bi1oZWFkZXInLCB7XG4gIGRlZmF1bHRQcm9wczoge1xuICAgIHJvbGU6ICdoZWFkaW5nJ1xuICB9XG59KTtcbmNvbnN0IERyb3Bkb3duRGl2aWRlciA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnZHJvcGRvd24tZGl2aWRlcicsIHtcbiAgQ29tcG9uZW50OiAnaHInLFxuICBkZWZhdWx0UHJvcHM6IHtcbiAgICByb2xlOiAnc2VwYXJhdG9yJ1xuICB9XG59KTtcbmNvbnN0IERyb3Bkb3duSXRlbVRleHQgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Ryb3Bkb3duLWl0ZW0tdGV4dCcsIHtcbiAgQ29tcG9uZW50OiAnc3Bhbidcbn0pO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBuYXZiYXI6IGZhbHNlLFxuICBhbGlnbjogJ3N0YXJ0JyxcbiAgYXV0b0Nsb3NlOiB0cnVlXG59O1xuY29uc3QgRHJvcGRvd24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocFByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGJzUHJlZml4LFxuICAgIGRyb3AsXG4gICAgc2hvdyxcbiAgICBjbGFzc05hbWUsXG4gICAgYWxpZ24sXG4gICAgb25TZWxlY3QsXG4gICAgb25Ub2dnbGUsXG4gICAgZm9jdXNGaXJzdEl0ZW1PblNob3csXG4gICAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICAgIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgICBuYXZiYXI6IF80LFxuICAgIGF1dG9DbG9zZSxcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHBQcm9wcywge1xuICAgIHNob3c6ICdvblRvZ2dsZSdcbiAgfSk7XG4gIGNvbnN0IGlzSW5wdXRHcm91cCA9IHVzZUNvbnRleHQoSW5wdXRHcm91cENvbnRleHQpO1xuICBjb25zdCBwcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdkcm9wZG93bicpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG5cbiAgY29uc3QgaXNDbG9zaW5nUGVybWl0dGVkID0gc291cmNlID0+IHtcbiAgICAvLyBhdXRvQ2xvc2U9ZmFsc2Ugb25seSBwZXJtaXRzIGNsb3NlIG9uIGJ1dHRvbiBjbGlja1xuICAgIGlmIChhdXRvQ2xvc2UgPT09IGZhbHNlKSByZXR1cm4gc291cmNlID09PSAnY2xpY2snOyAvLyBhdXRvQ2xvc2U9aW5zaWRlIGRvZXNuJ3QgcGVybWl0IGNsb3NlIG9uIHJvb3RDbG9zZVxuXG4gICAgaWYgKGF1dG9DbG9zZSA9PT0gJ2luc2lkZScpIHJldHVybiBzb3VyY2UgIT09ICdyb290Q2xvc2UnOyAvLyBhdXRvQ2xvc2U9b3V0c2lkZSBkb2Vzbid0IHBlcm1pdCBjbG9zZSBvbiBzZWxlY3RcblxuICAgIGlmIChhdXRvQ2xvc2UgPT09ICdvdXRzaWRlJykgcmV0dXJuIHNvdXJjZSAhPT0gJ3NlbGVjdCc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVG9nZ2xlID0gdXNlRXZlbnRDYWxsYmFjaygobmV4dFNob3csIG1ldGEpID0+IHtcbiAgICBpZiAobWV0YS5vcmlnaW5hbEV2ZW50LmN1cnJlbnRUYXJnZXQgPT09IGRvY3VtZW50ICYmIChtZXRhLnNvdXJjZSAhPT0gJ2tleWRvd24nIHx8IG1ldGEub3JpZ2luYWxFdmVudC5rZXkgPT09ICdFc2NhcGUnKSkgbWV0YS5zb3VyY2UgPSAncm9vdENsb3NlJztcbiAgICBpZiAoaXNDbG9zaW5nUGVybWl0dGVkKG1ldGEuc291cmNlKSkgb25Ub2dnbGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG9nZ2xlKG5leHRTaG93LCBtZXRhKTtcbiAgfSk7XG4gIGNvbnN0IGFsaWduRW5kID0gYWxpZ24gPT09ICdlbmQnO1xuICBjb25zdCBwbGFjZW1lbnQgPSBnZXREcm9wZG93bk1lbnVQbGFjZW1lbnQoYWxpZ25FbmQsIGRyb3AsIGlzUlRMKTtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIGFsaWduLFxuICAgIGRyb3AsXG4gICAgaXNSVExcbiAgfSksIFthbGlnbiwgZHJvcCwgaXNSVExdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEJhc2VEcm9wZG93biwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBzaG93OiBzaG93LFxuICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0LFxuICAgICAgb25Ub2dnbGU6IGhhbmRsZVRvZ2dsZSxcbiAgICAgIGZvY3VzRmlyc3RJdGVtT25TaG93OiBmb2N1c0ZpcnN0SXRlbU9uU2hvdyxcbiAgICAgIGl0ZW1TZWxlY3RvcjogYC4ke3ByZWZpeH0taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKWAsXG4gICAgICBjaGlsZHJlbjogaXNJbnB1dEdyb3VwID8gcHJvcHMuY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgICAgIHJlZjogcmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBzaG93ICYmICdzaG93JywgKCFkcm9wIHx8IGRyb3AgPT09ICdkb3duJykgJiYgcHJlZml4LCBkcm9wID09PSAndXAnICYmICdkcm9wdXAnLCBkcm9wID09PSAnZW5kJyAmJiAnZHJvcGVuZCcsIGRyb3AgPT09ICdzdGFydCcgJiYgJ2Ryb3BzdGFydCcpXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5Ecm9wZG93bi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bic7XG5Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKERyb3Bkb3duLCB7XG4gIFRvZ2dsZTogRHJvcGRvd25Ub2dnbGUsXG4gIE1lbnU6IERyb3Bkb3duTWVudSxcbiAgSXRlbTogRHJvcGRvd25JdGVtLFxuICBJdGVtVGV4dDogRHJvcGRvd25JdGVtVGV4dCxcbiAgRGl2aWRlcjogRHJvcGRvd25EaXZpZGVyLFxuICBIZWFkZXI6IERyb3Bkb3duSGVhZGVyXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4vRHJvcGRvd24nO1xuaW1wb3J0IERyb3Bkb3duVG9nZ2xlIGZyb20gJy4vRHJvcGRvd25Ub2dnbGUnO1xuaW1wb3J0IERyb3Bkb3duTWVudSBmcm9tICcuL0Ryb3Bkb3duTWVudSc7XG5pbXBvcnQgeyBhbGlnblByb3BUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQW4gaHRtbCBpZCBhdHRyaWJ1dGUgZm9yIHRoZSBUb2dnbGUgYnV0dG9uLCBuZWNlc3NhcnkgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgc2NyZWVuIHJlYWRlcnMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gYGhyZWZgIHBhc3NlZCB0byB0aGUgVG9nZ2xlIGNvbXBvbmVudCAqL1xuICBocmVmOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBbiBgb25DbGlja2AgaGFuZGxlciBwYXNzZWQgdG8gdGhlIFRvZ2dsZSBjb21wb25lbnQgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIFRoZSBjb250ZW50IG9mIHRoZSBub24tdG9nZ2xlIEJ1dHRvbi4gICovXG4gIHRpdGxlOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKiBEaXNhYmxlcyBib3RoIEJ1dHRvbnMgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQWxpZ25zIHRoZSBkcm9wZG93biBtZW51LlxuICAgKlxuICAgKiBfc2VlIFtEcm9wZG93bk1lbnVdKCNkcm9wZG93bi1tZW51LXByb3BzKSBmb3IgbW9yZSBkZXRhaWxzX1xuICAgKlxuICAgKiBAdHlwZSB7XCJzdGFydFwifFwiZW5kXCJ8eyBzbTogXCJzdGFydFwifFwiZW5kXCIgfXx7IG1kOiBcInN0YXJ0XCJ8XCJlbmRcIiB9fHsgbGc6IFwic3RhcnRcInxcImVuZFwiIH18eyB4bDogXCJzdGFydFwifFwiZW5kXCJ9fHsgeHhsOiBcInN0YXJ0XCJ8XCJlbmRcIn0gfVxuICAgKi9cbiAgYWxpZ246IGFsaWduUHJvcFR5cGUsXG5cbiAgLyoqIEFuIEFSSUEgYWNjZXNzaWJsZSByb2xlIGFwcGxpZWQgdG8gdGhlIE1lbnUgY29tcG9uZW50LiBXaGVuIHNldCB0byAnbWVudScsIFRoZSBkcm9wZG93biAqL1xuICBtZW51Um9sZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogV2hldGhlciB0byByZW5kZXIgdGhlIGRyb3Bkb3duIG1lbnUgaW4gdGhlIERPTSBiZWZvcmUgdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2hvd24gKi9cbiAgcmVuZGVyTWVudU9uTW91bnQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiAgV2hpY2ggZXZlbnQgd2hlbiBmaXJlZCBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2lsbCBjYXVzZSBpdCB0byBiZSBjbG9zZWQuXG4gICAqXG4gICAqIF9zZWUgW0Ryb3Bkb3duTWVudV0oI2Ryb3Bkb3duLW1lbnUtcHJvcHMpIGZvciBtb3JlIGRldGFpbHNfXG4gICAqL1xuICByb290Q2xvc2VFdmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogTWVudSBjb2xvciB2YXJpYW50LlxuICAgKlxuICAgKiBPbWl0dGluZyB0aGlzIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGxpZ2h0IGNvbG9yLlxuICAgKi9cbiAgbWVudVZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2RhcmsnXSksXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQGlnbm9yZSAqL1xuICBzaXplOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGNvbXBvbmVudCBmb3Igc2ltcGxlIG9yIGdlbmVyYWwgdXNlIGRyb3Bkb3ducy4gUmVuZGVycyBhIGBCdXR0b25gIHRvZ2dsZSBhbmQgYWxsIGBjaGlsZHJlbmBcbiAqIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRlZmF1bHQgYERyb3Bkb3duLk1lbnVgLiBUaGlzIGNvbXBvbmVudCBhY2NlcHRzIGFsbCBvZlxuICogW2BEcm9wZG93bmAncyBwcm9wc10oI2Ryb3Bkb3duLXByb3BzKS5cbiAqXG4gKiBfQWxsIHVua25vd24gcHJvcHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgRHJvcGRvd25gIGNvbXBvbmVudC5fIE9ubHlcbiAqIHRoZSBCdXR0b24gYHZhcmlhbnRgLCBgc2l6ZWAgYW5kIGBic1ByZWZpeGAgcHJvcHMgYXJlIHBhc3NlZCB0byB0aGUgdG9nZ2xlLFxuICogYWxvbmcgd2l0aCBtZW51LXJlbGF0ZWQgcHJvcHMgYXJlIHBhc3NlZCB0byB0aGUgYERyb3Bkb3duLk1lbnVgXG4gKi9cblxuY29uc3QgRHJvcGRvd25CdXR0b24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICB0aXRsZSxcbiAgY2hpbGRyZW4sXG4gIGJzUHJlZml4LFxuICByb290Q2xvc2VFdmVudCxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgbWVudVJvbGUsXG4gIHJlbmRlck1lbnVPbk1vdW50LFxuICBkaXNhYmxlZCxcbiAgaHJlZixcbiAgaWQsXG4gIG1lbnVWYXJpYW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeHMoRHJvcGRvd24sIHtcbiAgcmVmOiByZWYsXG4gIC4uLnByb3BzLFxuICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duVG9nZ2xlLCB7XG4gICAgaWQ6IGlkLFxuICAgIGhyZWY6IGhyZWYsXG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjaGlsZEJzUHJlZml4OiBic1ByZWZpeCxcbiAgICBjaGlsZHJlbjogdGl0bGVcbiAgfSksIC8qI19fUFVSRV9fKi9fanN4KERyb3Bkb3duTWVudSwge1xuICAgIHJvbGU6IG1lbnVSb2xlLFxuICAgIHJlbmRlck9uTW91bnQ6IHJlbmRlck1lbnVPbk1vdW50LFxuICAgIHJvb3RDbG9zZUV2ZW50OiByb290Q2xvc2VFdmVudCxcbiAgICB2YXJpYW50OiBtZW51VmFyaWFudCxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSldXG59KSk7XG5Ecm9wZG93bkJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bkJ1dHRvbic7XG5Ecm9wZG93bkJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkJ1dHRvbjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBEcm9wZG93bkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5Ecm9wZG93bkNvbnRleHQuZGlzcGxheU5hbWUgPSAnRHJvcGRvd25Db250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duQ29udGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURyb3Bkb3duSXRlbSB9IGZyb20gJ0ByZXN0YXJ0L3VpL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJ0ByZXN0YXJ0L3VpL0FuY2hvcic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERyb3Bkb3duSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGV2ZW50S2V5LFxuICBkaXNhYmxlZCA9IGZhbHNlLFxuICBvbkNsaWNrLFxuICBhY3RpdmUsXG4gIGFzOiBDb21wb25lbnQgPSBBbmNob3IsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24taXRlbScpO1xuICBjb25zdCBbZHJvcGRvd25JdGVtUHJvcHMsIG1ldGFdID0gdXNlRHJvcGRvd25JdGVtKHtcbiAgICBrZXk6IGV2ZW50S2V5LFxuICAgIGhyZWY6IHByb3BzLmhyZWYsXG4gICAgZGlzYWJsZWQsXG4gICAgb25DbGljayxcbiAgICBhY3RpdmVcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgLi4uZHJvcGRvd25JdGVtUHJvcHMsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBtZXRhLmlzQWN0aXZlICYmICdhY3RpdmUnLCBkaXNhYmxlZCAmJiAnZGlzYWJsZWQnKVxuICB9KTtcbn0pO1xuRHJvcGRvd25JdGVtLmRpc3BsYXlOYW1lID0gJ0Ryb3Bkb3duSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkl0ZW07IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRHJvcGRvd25NZW51IH0gZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25NZW51JztcbmltcG9ydCB1c2VJc29tb3JwaGljRWZmZWN0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUlzb21vcnBoaWNFZmZlY3QnO1xuaW1wb3J0IHVzZU1lcmdlZFJlZnMgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlTWVyZ2VkUmVmcyc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnLi9Ecm9wZG93bkNvbnRleHQnO1xuaW1wb3J0IElucHV0R3JvdXBDb250ZXh0IGZyb20gJy4vSW5wdXRHcm91cENvbnRleHQnO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nIGZyb20gJy4vdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nJztcbmltcG9ydCB7IGFsaWduUHJvcFR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsaXA6IHRydWVcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wRGlyZWN0aW9uLCBpc1JUTCkge1xuICBjb25zdCB0b3BTdGFydCA9IGlzUlRMID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCc7XG4gIGNvbnN0IHRvcEVuZCA9IGlzUlRMID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCc7XG4gIGNvbnN0IGJvdHRvbVN0YXJ0ID0gaXNSVEwgPyAnYm90dG9tLWVuZCcgOiAnYm90dG9tLXN0YXJ0JztcbiAgY29uc3QgYm90dG9tRW5kID0gaXNSVEwgPyAnYm90dG9tLXN0YXJ0JyA6ICdib3R0b20tZW5kJztcbiAgY29uc3QgbGVmdFN0YXJ0ID0gaXNSVEwgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuICBjb25zdCBsZWZ0RW5kID0gaXNSVEwgPyAncmlnaHQtZW5kJyA6ICdsZWZ0LWVuZCc7XG4gIGNvbnN0IHJpZ2h0U3RhcnQgPSBpc1JUTCA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG4gIGNvbnN0IHJpZ2h0RW5kID0gaXNSVEwgPyAnbGVmdC1lbmQnIDogJ3JpZ2h0LWVuZCc7XG4gIGxldCBwbGFjZW1lbnQgPSBhbGlnbkVuZCA/IGJvdHRvbUVuZCA6IGJvdHRvbVN0YXJ0O1xuICBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3VwJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyB0b3BFbmQgOiB0b3BTdGFydDtlbHNlIGlmIChkcm9wRGlyZWN0aW9uID09PSAnZW5kJykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyByaWdodEVuZCA6IHJpZ2h0U3RhcnQ7ZWxzZSBpZiAoZHJvcERpcmVjdGlvbiA9PT0gJ3N0YXJ0JykgcGxhY2VtZW50ID0gYWxpZ25FbmQgPyBsZWZ0RW5kIDogbGVmdFN0YXJ0O1xuICByZXR1cm4gcGxhY2VtZW50O1xufVxuY29uc3QgRHJvcGRvd25NZW51ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYWxpZ24sXG4gIHJvb3RDbG9zZUV2ZW50LFxuICBmbGlwLFxuICBzaG93OiBzaG93UHJvcHMsXG4gIHJlbmRlck9uTW91bnQsXG4gIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBwb3BwZXJDb25maWcsXG4gIHZhcmlhbnQsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgbGV0IGFsaWduRW5kID0gZmFsc2U7XG4gIGNvbnN0IGlzTmF2YmFyID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnZHJvcGRvd24tbWVudScpO1xuICBjb25zdCB7XG4gICAgYWxpZ246IGNvbnRleHRBbGlnbixcbiAgICBkcm9wLFxuICAgIGlzUlRMXG4gIH0gPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGFsaWduID0gYWxpZ24gfHwgY29udGV4dEFsaWduO1xuICBjb25zdCBpc0lucHV0R3JvdXAgPSB1c2VDb250ZXh0KElucHV0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgYWxpZ25DbGFzc2VzID0gW107XG5cbiAgaWYgKGFsaWduKSB7XG4gICAgaWYgKHR5cGVvZiBhbGlnbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhbGlnbik7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGtleXMubGVuZ3RoID09PSAxLCAnVGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBicmVha3BvaW50IHdoZW4gcGFzc2luZyBhbiBvYmplY3QgdG8gYGFsaWduYCcpIDogdm9pZCAwO1xuXG4gICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYnJrUG9pbnQgPSBrZXlzWzBdO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBhbGlnblticmtQb2ludF07IC8vIC5kcm9wZG93bi1tZW51LWVuZCBpcyByZXF1aXJlZCBmb3IgcmVzcG9uc2l2ZWx5IGFsaWduaW5nXG4gICAgICAgIC8vIGxlZnQgaW4gYWRkaXRpb24gdG8gYWxpZ24gbGVmdCBjbGFzc2VzLlxuXG4gICAgICAgIGFsaWduRW5kID0gZGlyZWN0aW9uID09PSAnc3RhcnQnO1xuICAgICAgICBhbGlnbkNsYXNzZXMucHVzaChgJHtwcmVmaXh9LSR7YnJrUG9pbnR9LSR7ZGlyZWN0aW9ufWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdlbmQnKSB7XG4gICAgICBhbGlnbkVuZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGxhY2VtZW50ID0gZ2V0RHJvcGRvd25NZW51UGxhY2VtZW50KGFsaWduRW5kLCBkcm9wLCBpc1JUTCk7XG4gIGNvbnN0IFttZW51UHJvcHMsIHtcbiAgICBoYXNTaG93bixcbiAgICBwb3BwZXIsXG4gICAgc2hvdyxcbiAgICB0b2dnbGVcbiAgfV0gPSB1c2VEcm9wZG93bk1lbnUoe1xuICAgIGZsaXAsXG4gICAgcm9vdENsb3NlRXZlbnQsXG4gICAgc2hvdzogc2hvd1Byb3BzLFxuICAgIHVzZVBvcHBlcjogIWlzTmF2YmFyICYmIGFsaWduQ2xhc3Nlcy5sZW5ndGggPT09IDAsXG4gICAgb2Zmc2V0OiBbMCwgMl0sXG4gICAgcG9wcGVyQ29uZmlnLFxuICAgIHBsYWNlbWVudFxuICB9KTtcbiAgbWVudVByb3BzLnJlZiA9IHVzZU1lcmdlZFJlZnModXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgJ0Ryb3Bkb3duTWVudScpLCBtZW51UHJvcHMucmVmKTtcbiAgdXNlSXNvbW9ycGhpY0VmZmVjdCgoKSA9PiB7XG4gICAgLy8gUG9wcGVyJ3MgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlIG1lbnUgaXMgaW5jb3JyZWN0IHdoZW5cbiAgICAvLyByZW5kZXJPbk1vdW50PXRydWUuIE5lZWQgdG8gY2FsbCB1cGRhdGUoKSB0byBjb3JyZWN0IGl0LlxuICAgIGlmIChzaG93KSBwb3BwZXIgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcHBlci51cGRhdGUoKTtcbiAgfSwgW3Nob3ddKTtcbiAgaWYgKCFoYXNTaG93biAmJiAhcmVuZGVyT25Nb3VudCAmJiAhaXNJbnB1dEdyb3VwKSByZXR1cm4gbnVsbDsgLy8gRm9yIGN1c3RvbSBjb21wb25lbnRzIHByb3ZpZGUgYWRkaXRpb25hbCwgbm9uLURPTSwgcHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgbWVudVByb3BzLnNob3cgPSBzaG93O1xuXG4gICAgbWVudVByb3BzLmNsb3NlID0gKCkgPT4gdG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiB0b2dnbGUoZmFsc2UpO1xuXG4gICAgbWVudVByb3BzLmFsaWduID0gYWxpZ247XG4gIH1cblxuICBsZXQgc3R5bGUgPSBwcm9wcy5zdHlsZTtcblxuICBpZiAocG9wcGVyICE9IG51bGwgJiYgcG9wcGVyLnBsYWNlbWVudCkge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdGhlIGRlZmF1bHQgcG9wcGVyIHN0eWxlLFxuICAgIC8vIG1lbnVzIGFyZSBkaXNwbGF5OiBub25lIHdoZW4gbm90IHNob3duLlxuICAgIHN0eWxlID0geyAuLi5wcm9wcy5zdHlsZSxcbiAgICAgIC4uLm1lbnVQcm9wcy5zdHlsZVxuICAgIH07XG4gICAgcHJvcHNbJ3gtcGxhY2VtZW50J10gPSBwb3BwZXIucGxhY2VtZW50O1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAuLi5tZW51UHJvcHMsXG4gICAgc3R5bGU6IHN0eWxlIC8vIEJvb3RzdHJhcCBjc3MgcmVxdWlyZXMgdGhpcyBkYXRhIGF0dHJpYiB0byBzdHlsZSByZXNwb25zaXZlIG1lbnVzLlxuICAgICxcbiAgICAuLi4oKGFsaWduQ2xhc3Nlcy5sZW5ndGggfHwgaXNOYXZiYXIpICYmIHtcbiAgICAgICdkYXRhLWJzLXBvcHBlcic6ICdzdGF0aWMnXG4gICAgfSksXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBzaG93ICYmICdzaG93JywgYWxpZ25FbmQgJiYgYCR7cHJlZml4fS1lbmRgLCB2YXJpYW50ICYmIGAke3ByZWZpeH0tJHt2YXJpYW50fWAsIC4uLmFsaWduQ2xhc3NlcylcbiAgfSk7XG59KTtcbkRyb3Bkb3duTWVudS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93bk1lbnUnO1xuRHJvcGRvd25NZW51LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duTWVudTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEcm9wZG93blRvZ2dsZSB9IGZyb20gJ0ByZXN0YXJ0L3VpL0Ryb3Bkb3duVG9nZ2xlJztcbmltcG9ydCBEcm9wZG93bkNvbnRleHQgZnJvbSAnQHJlc3RhcnQvdWkvRHJvcGRvd25Db250ZXh0JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG5pbXBvcnQgSW5wdXRHcm91cENvbnRleHQgZnJvbSAnLi9JbnB1dEdyb3VwQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHVzZVdyYXBwZWRSZWZXaXRoV2FybmluZyBmcm9tICcuL3VzZVdyYXBwZWRSZWZXaXRoV2FybmluZyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRHJvcGRvd25Ub2dnbGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgc3BsaXQsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRCc1ByZWZpeCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gQnV0dG9uLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Ryb3Bkb3duLXRvZ2dsZScpO1xuICBjb25zdCBkcm9wZG93bkNvbnRleHQgPSB1c2VDb250ZXh0KERyb3Bkb3duQ29udGV4dCk7XG4gIGNvbnN0IGlzSW5wdXRHcm91cCA9IHVzZUNvbnRleHQoSW5wdXRHcm91cENvbnRleHQpO1xuXG4gIGlmIChjaGlsZEJzUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy5ic1ByZWZpeCA9IGNoaWxkQnNQcmVmaXg7XG4gIH1cblxuICBjb25zdCBbdG9nZ2xlUHJvcHNdID0gdXNlRHJvcGRvd25Ub2dnbGUoKTtcbiAgdG9nZ2xlUHJvcHMucmVmID0gdXNlTWVyZ2VkUmVmcyh0b2dnbGVQcm9wcy5yZWYsIHVzZVdyYXBwZWRSZWZXaXRoV2FybmluZyhyZWYsICdEcm9wZG93blRvZ2dsZScpKTsgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGZvcndhcmRzIHNpemUgYW5kIHZhcmlhbnQgKGlmIHNldCkgdG8gdGhlXG4gIC8vIHVuZGVybHlpbmcgY29tcG9uZW50LCB0byBhbGxvdyBpdCB0byByZW5kZXIgc2l6ZSBhbmQgc3R5bGUgdmFyaWFudHMuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHByZWZpeCwgc3BsaXQgJiYgYCR7cHJlZml4fS1zcGxpdGAsICEhaXNJbnB1dEdyb3VwICYmIChkcm9wZG93bkNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGRyb3Bkb3duQ29udGV4dC5zaG93KSAmJiAnc2hvdycpLFxuICAgIC4uLnRvZ2dsZVByb3BzLFxuICAgIC4uLnByb3BzXG4gIH0pO1xufSk7XG5Ecm9wZG93blRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdEcm9wZG93blRvZ2dsZSc7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blRvZ2dsZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLFxuICogYnV0IG9ubHkgbWFwcyBvdmVyIGNoaWxkcmVuIHRoYXQgYXJlIFwidmFsaWQgZWxlbWVudHNcIi5cbiAqXG4gKiBUaGUgbWFwRnVuY3Rpb24gcHJvdmlkZWQgaW5kZXggd2lsbCBiZSBub3JtYWxpc2VkIHRvIHRoZSBjb21wb25lbnRzIG1hcHBlZCxcbiAqIHNvIGFuIGludmFsaWQgY29tcG9uZW50IHdvdWxkIG5vdCBpbmNyZWFzZSB0aGUgaW5kZXguXG4gKlxuICovXG5cbmZ1bmN0aW9uIG1hcChjaGlsZHJlbiwgZnVuYykge1xuICBsZXQgaW5kZXggPSAwO1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBjaGlsZCA9PiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpID8gZnVuYyhjaGlsZCwgaW5kZXgrKykgOiBjaGlsZCk7XG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgXCJ2YWxpZCBlbGVtZW50c1wiLlxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkIHdpdGggdGhlIGluZGV4IHJlZmxlY3RpbmcgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICovXG5cblxuZnVuY3Rpb24gZm9yRWFjaChjaGlsZHJlbiwgZnVuYykge1xuICBsZXQgaW5kZXggPSAwO1xuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSBmdW5jKGNoaWxkLCBpbmRleCsrKTtcbiAgfSk7XG59XG4vKipcbiAqIEZpbmRzIHdoZXRoZXIgYSBjb21wb25lbnQncyBgY2hpbGRyZW5gIHByb3AgaW5jbHVkZXMgYSBSZWFjdCBlbGVtZW50IG9mIHRoZVxuICogc3BlY2lmaWVkIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiBoYXNDaGlsZE9mVHlwZShjaGlsZHJlbiwgdHlwZSkge1xuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikuc29tZShjaGlsZCA9PiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IHR5cGUpO1xufVxuXG5leHBvcnQgeyBtYXAsIGZvckVhY2gsIGhhc0NoaWxkT2ZUeXBlIH07IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVOVEVSRUQsIEVOVEVSSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kTGlzdGVuZXIgZnJvbSAnLi90cmFuc2l0aW9uRW5kTGlzdGVuZXInO1xuaW1wb3J0IHRyaWdnZXJCcm93c2VyUmVmbG93IGZyb20gJy4vdHJpZ2dlckJyb3dzZXJSZWZsb3cnO1xuaW1wb3J0IFRyYW5zaXRpb25XcmFwcGVyIGZyb20gJy4vVHJhbnNpdGlvbldyYXBwZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlXG59O1xuY29uc3QgZmFkZVN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3cnLFxuICBbRU5URVJFRF06ICdzaG93J1xufTtcbmNvbnN0IEZhZGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICB0cmFuc2l0aW9uQ2xhc3NlcyA9IHt9LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGhhbmRsZUVudGVyID0gdXNlQ2FsbGJhY2soKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3cobm9kZSk7XG4gICAgcHJvcHMub25FbnRlciA9PSBudWxsID8gdm9pZCAwIDogcHJvcHMub25FbnRlcihub2RlLCBpc0FwcGVhcmluZyk7XG4gIH0sIFtwcm9wc10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbldyYXBwZXIsIHtcbiAgICByZWY6IHJlZixcbiAgICBhZGRFbmRMaXN0ZW5lcjogdHJhbnNpdGlvbkVuZExpc3RlbmVyLFxuICAgIC4uLnByb3BzLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIGNoaWxkUmVmOiBjaGlsZHJlbi5yZWYsXG4gICAgY2hpbGRyZW46IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHsgLi4uaW5uZXJQcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcygnZmFkZScsIGNsYXNzTmFtZSwgY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBmYWRlU3R5bGVzW3N0YXR1c10sIHRyYW5zaXRpb25DbGFzc2VzW3N0YXR1c10pXG4gICAgfSlcbiAgfSk7XG59KTtcbkZhZGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuRmFkZS5kaXNwbGF5TmFtZSA9ICdGYWRlJztcbmV4cG9ydCBkZWZhdWx0IEZhZGU7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgZmVlZGJhY2sgaXMgZm9yIHZhbGlkIG9yIGludmFsaWQgZmllbGRzXG4gICAqXG4gICAqIEB0eXBlIHsoJ3ZhbGlkJ3wnaW52YWxpZCcpfVxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRGlzcGxheSBmZWVkYmFjayBhcyBhIHRvb2x0aXAuICovXG4gIHRvb2x0aXA6IFByb3BUeXBlcy5ib29sLFxuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlXG59O1xuY29uc3QgRmVlZGJhY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZiggLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuKHtcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBjbGFzc05hbWUsXG4gIHR5cGUgPSAndmFsaWQnLFxuICB0b29sdGlwID0gZmFsc2UsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgcmVmOiByZWYsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke3R5cGV9LSR7dG9vbHRpcCA/ICd0b29sdGlwJyA6ICdmZWVkYmFjayd9YClcbn0pKTtcbkZlZWRiYWNrLmRpc3BsYXlOYW1lID0gJ0ZlZWRiYWNrJztcbkZlZWRiYWNrLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydCBkZWZhdWx0IEZlZWRiYWNrOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IEZpZ3VyZUltYWdlIGZyb20gJy4vRmlndXJlSW1hZ2UnO1xuaW1wb3J0IEZpZ3VyZUNhcHRpb24gZnJvbSAnLi9GaWd1cmVDYXB0aW9uJztcbmNvbnN0IEZpZ3VyZSA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnZmlndXJlJywge1xuICBDb21wb25lbnQ6ICdmaWd1cmUnXG59KTtcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oRmlndXJlLCB7XG4gIEltYWdlOiBGaWd1cmVJbWFnZSxcbiAgQ2FwdGlvbjogRmlndXJlQ2FwdGlvblxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5jb25zdCBGaWd1cmVDYXB0aW9uID0gY3JlYXRlV2l0aEJzUHJlZml4KCdmaWd1cmUtY2FwdGlvbicsIHtcbiAgQ29tcG9uZW50OiAnZmlnY2FwdGlvbidcbn0pO1xuZXhwb3J0IGRlZmF1bHQgRmlndXJlQ2FwdGlvbjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBJbWFnZSwgeyBwcm9wVHlwZXMgYXMgaW1hZ2VQcm9wVHlwZXMgfSBmcm9tICcuL0ltYWdlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiB0cnVlXG59O1xuY29uc3QgRmlndXJlSW1hZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KEltYWdlLCB7XG4gIHJlZjogcmVmLFxuICAuLi5wcm9wcyxcbiAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgJ2ZpZ3VyZS1pbWcnKVxufSkpO1xuRmlndXJlSW1hZ2UuZGlzcGxheU5hbWUgPSAnRmlndXJlSW1hZ2UnO1xuRmlndXJlSW1hZ2UucHJvcFR5cGVzID0gaW1hZ2VQcm9wVHlwZXM7XG5GaWd1cmVJbWFnZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBGaWd1cmVJbWFnZTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtR3JvdXAgZnJvbSAnLi9Gb3JtR3JvdXAnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBGbG9hdGluZ0xhYmVsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGNvbnRyb2xJZCxcbiAgbGFiZWwsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWZsb2F0aW5nJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoRm9ybUdyb3VwLCB7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNvbnRyb2xJZDogY29udHJvbElkLFxuICAgIC4uLnByb3BzLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIC8qI19fUFVSRV9fKi9fanN4KFwibGFiZWxcIiwge1xuICAgICAgaHRtbEZvcjogY29udHJvbElkLFxuICAgICAgY2hpbGRyZW46IGxhYmVsXG4gICAgfSldXG4gIH0pO1xufSk7XG5GbG9hdGluZ0xhYmVsLmRpc3BsYXlOYW1lID0gJ0Zsb2F0aW5nTGFiZWwnO1xuZXhwb3J0IGRlZmF1bHQgRmxvYXRpbmdMYWJlbDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9ybUNoZWNrIGZyb20gJy4vRm9ybUNoZWNrJztcbmltcG9ydCBGb3JtQ29udHJvbCBmcm9tICcuL0Zvcm1Db250cm9sJztcbmltcG9ydCBGb3JtRmxvYXRpbmcgZnJvbSAnLi9Gb3JtRmxvYXRpbmcnO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICcuL0Zvcm1Hcm91cCc7XG5pbXBvcnQgRm9ybUxhYmVsIGZyb20gJy4vRm9ybUxhYmVsJztcbmltcG9ydCBGb3JtUmFuZ2UgZnJvbSAnLi9Gb3JtUmFuZ2UnO1xuaW1wb3J0IEZvcm1TZWxlY3QgZnJvbSAnLi9Gb3JtU2VsZWN0JztcbmltcG9ydCBGb3JtVGV4dCBmcm9tICcuL0Zvcm1UZXh0JztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi9Td2l0Y2gnO1xuaW1wb3J0IEZsb2F0aW5nTGFiZWwgZnJvbSAnLi9GbG9hdGluZ0xhYmVsJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgRm9ybSBgcmVmYCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdW5kZXJseWluZyBlbGVtZW50LFxuICAgKiB3aGljaCBtZWFucywgdW5sZXNzIGl0J3MgcmVuZGVyZWQgYGFzYCBhIGNvbXBvc2l0ZSBjb21wb25lbnQsXG4gICAqIGl0IHdpbGwgYmUgYSBET00gbm9kZSwgd2hlbiByZXNvbHZlZC5cbiAgICpcbiAgICogQHR5cGUge1JlYWN0UmVmfVxuICAgKiBAYWxpYXMgcmVmXG4gICAqL1xuICBfcmVmOiBQcm9wVHlwZXMuYW55LFxuXG4gIC8qKlxuICAgKiBNYXJrIGEgZm9ybSBhcyBoYXZpbmcgYmVlbiB2YWxpZGF0ZWQuIFNldHRpbmcgaXQgdG8gYHRydWVgIHdpbGxcbiAgICogdG9nZ2xlIGFueSB2YWxpZGF0aW9uIHN0eWxlcyBvbiB0aGUgZm9ybXMgZWxlbWVudHMuXG4gICAqL1xuICB2YWxpZGF0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlXG59O1xuY29uc3QgRm9ybSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNsYXNzTmFtZSxcbiAgdmFsaWRhdGVkLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZm9ybScsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgcmVmOiByZWYsXG4gIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHZhbGlkYXRlZCAmJiAnd2FzLXZhbGlkYXRlZCcpXG59KSk7XG5Gb3JtLmRpc3BsYXlOYW1lID0gJ0Zvcm0nO1xuRm9ybS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKEZvcm0sIHtcbiAgR3JvdXA6IEZvcm1Hcm91cCxcbiAgQ29udHJvbDogRm9ybUNvbnRyb2wsXG4gIEZsb2F0aW5nOiBGb3JtRmxvYXRpbmcsXG4gIENoZWNrOiBGb3JtQ2hlY2ssXG4gIFN3aXRjaCxcbiAgTGFiZWw6IEZvcm1MYWJlbCxcbiAgVGV4dDogRm9ybVRleHQsXG4gIFJhbmdlOiBGb3JtUmFuZ2UsXG4gIFNlbGVjdDogRm9ybVNlbGVjdCxcbiAgRmxvYXRpbmdMYWJlbFxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZlZWRiYWNrIGZyb20gJy4vRmVlZGJhY2snO1xuaW1wb3J0IEZvcm1DaGVja0lucHV0IGZyb20gJy4vRm9ybUNoZWNrSW5wdXQnO1xuaW1wb3J0IEZvcm1DaGVja0xhYmVsIGZyb20gJy4vRm9ybUNoZWNrTGFiZWwnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGhhc0NoaWxkT2ZUeXBlIH0gZnJvbSAnLi9FbGVtZW50Q2hpbGRyZW4nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybUNoZWNrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgaWQsXG4gIGJzUHJlZml4LFxuICBic1N3aXRjaFByZWZpeCxcbiAgaW5saW5lID0gZmFsc2UsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGlzVmFsaWQgPSBmYWxzZSxcbiAgaXNJbnZhbGlkID0gZmFsc2UsXG4gIGZlZWRiYWNrVG9vbHRpcCA9IGZhbHNlLFxuICBmZWVkYmFjayxcbiAgZmVlZGJhY2tUeXBlLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICB0aXRsZSA9ICcnLFxuICB0eXBlID0gJ2NoZWNrYm94JyxcbiAgbGFiZWwsXG4gIGNoaWxkcmVuLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzID0gJ2lucHV0JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2snKTtcbiAgYnNTd2l0Y2hQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNTd2l0Y2hQcmVmaXgsICdmb3JtLXN3aXRjaCcpO1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgY29uc3QgaW5uZXJGb3JtQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjb250cm9sSWQ6IGlkIHx8IGNvbnRyb2xJZFxuICB9KSwgW2NvbnRyb2xJZCwgaWRdKTtcbiAgY29uc3QgaGFzTGFiZWwgPSAhY2hpbGRyZW4gJiYgbGFiZWwgIT0gbnVsbCAmJiBsYWJlbCAhPT0gZmFsc2UgfHwgaGFzQ2hpbGRPZlR5cGUoY2hpbGRyZW4sIEZvcm1DaGVja0xhYmVsKTtcblxuICBjb25zdCBpbnB1dCA9IC8qI19fUFVSRV9fKi9fanN4KEZvcm1DaGVja0lucHV0LCB7IC4uLnByb3BzLFxuICAgIHR5cGU6IHR5cGUgPT09ICdzd2l0Y2gnID8gJ2NoZWNrYm94JyA6IHR5cGUsXG4gICAgcmVmOiByZWYsXG4gICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICBpc0ludmFsaWQ6IGlzSW52YWxpZCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgYXM6IGFzXG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBpbm5lckZvcm1Db250ZXh0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBoYXNMYWJlbCAmJiBic1ByZWZpeCwgaW5saW5lICYmIGAke2JzUHJlZml4fS1pbmxpbmVgLCB0eXBlID09PSAnc3dpdGNoJyAmJiBic1N3aXRjaFByZWZpeCksXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgLyojX19QVVJFX18qL19qc3hzKF9GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogW2lucHV0LCBoYXNMYWJlbCAmJiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ2hlY2tMYWJlbCwge1xuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbjogbGFiZWxcbiAgICAgICAgfSksIGZlZWRiYWNrICYmIC8qI19fUFVSRV9fKi9fanN4KEZlZWRiYWNrLCB7XG4gICAgICAgICAgdHlwZTogZmVlZGJhY2tUeXBlLFxuICAgICAgICAgIHRvb2x0aXA6IGZlZWRiYWNrVG9vbHRpcCxcbiAgICAgICAgICBjaGlsZHJlbjogZmVlZGJhY2tcbiAgICAgICAgfSldXG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufSk7XG5Gb3JtQ2hlY2suZGlzcGxheU5hbWUgPSAnRm9ybUNoZWNrJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oRm9ybUNoZWNrLCB7XG4gIElucHV0OiBGb3JtQ2hlY2tJbnB1dCxcbiAgTGFiZWw6IEZvcm1DaGVja0xhYmVsXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1DaGVja0lucHV0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgaWQsXG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHR5cGUgPSAnY2hlY2tib3gnLFxuICBpc1ZhbGlkID0gZmFsc2UsXG4gIGlzSW52YWxpZCA9IGZhbHNlLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnaW5wdXQnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2staW5wdXQnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICB0eXBlOiB0eXBlLFxuICAgIGlkOiBpZCB8fCBjb250cm9sSWQsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgsIGlzVmFsaWQgJiYgJ2lzLXZhbGlkJywgaXNJbnZhbGlkICYmICdpcy1pbnZhbGlkJylcbiAgfSk7XG59KTtcbkZvcm1DaGVja0lucHV0LmRpc3BsYXlOYW1lID0gJ0Zvcm1DaGVja0lucHV0JztcbmV4cG9ydCBkZWZhdWx0IEZvcm1DaGVja0lucHV0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtQ29udGV4dCBmcm9tICcuL0Zvcm1Db250ZXh0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybUNoZWNrTGFiZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBodG1sRm9yLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tY2hlY2stbGFiZWwnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwibGFiZWxcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBodG1sRm9yOiBodG1sRm9yIHx8IGNvbnRyb2xJZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeClcbiAgfSk7XG59KTtcbkZvcm1DaGVja0xhYmVsLmRpc3BsYXlOYW1lID0gJ0Zvcm1DaGVja0xhYmVsJztcbmV4cG9ydCBkZWZhdWx0IEZvcm1DaGVja0xhYmVsOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8gVE9ET1xuXG5jb25zdCBGb3JtQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Db250ZXh0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IEZlZWRiYWNrIGZyb20gJy4vRmVlZGJhY2snO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBGb3JtQ29udHJvbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICB0eXBlLFxuICBzaXplLFxuICBodG1sU2l6ZSxcbiAgaWQsXG4gIGNsYXNzTmFtZSxcbiAgaXNWYWxpZCA9IGZhbHNlLFxuICBpc0ludmFsaWQgPSBmYWxzZSxcbiAgcGxhaW50ZXh0LFxuICByZWFkT25seSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2lucHV0JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWNvbnRyb2wnKTtcbiAgbGV0IGNsYXNzZXM7XG5cbiAgaWYgKHBsYWludGV4dCkge1xuICAgIGNsYXNzZXMgPSB7XG4gICAgICBbYCR7YnNQcmVmaXh9LXBsYWludGV4dGBdOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjbGFzc2VzID0ge1xuICAgICAgW2JzUHJlZml4XTogdHJ1ZSxcbiAgICAgIFtgJHtic1ByZWZpeH0tJHtzaXplfWBdOiBzaXplXG4gICAgfTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY29udHJvbElkID09IG51bGwgfHwgIWlkLCAnYGNvbnRyb2xJZGAgaXMgaWdub3JlZCBvbiBgPEZvcm1Db250cm9sPmAgd2hlbiBgaWRgIGlzIHNwZWNpZmllZC4nKSA6IHZvaWQgMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICB0eXBlOiB0eXBlLFxuICAgIHNpemU6IGh0bWxTaXplLFxuICAgIHJlZjogcmVmLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICBpZDogaWQgfHwgY29udHJvbElkLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGNsYXNzZXMsIGlzVmFsaWQgJiYgYGlzLXZhbGlkYCwgaXNJbnZhbGlkICYmIGBpcy1pbnZhbGlkYCwgdHlwZSA9PT0gJ2NvbG9yJyAmJiBgJHtic1ByZWZpeH0tY29sb3JgKVxuICB9KTtcbn0pO1xuRm9ybUNvbnRyb2wuZGlzcGxheU5hbWUgPSAnRm9ybUNvbnRyb2wnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihGb3JtQ29udHJvbCwge1xuICBGZWVkYmFja1xufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ2Zvcm0tZmxvYXRpbmcnKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGNvbnRyb2xJZCxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBjb250cm9sSWRcbiAgfSksIFtjb250cm9sSWRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZvcm1Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICAgIHJlZjogcmVmXG4gICAgfSlcbiAgfSk7XG59KTtcbkZvcm1Hcm91cC5kaXNwbGF5TmFtZSA9ICdGb3JtR3JvdXAnO1xuZXhwb3J0IGRlZmF1bHQgRm9ybUdyb3VwOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IENvbCBmcm9tICcuL0NvbCc7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgY29sdW1uOiBmYWxzZSxcbiAgdmlzdWFsbHlIaWRkZW46IGZhbHNlXG59O1xuY29uc3QgRm9ybUxhYmVsID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2xhYmVsJyxcbiAgYnNQcmVmaXgsXG4gIGNvbHVtbixcbiAgdmlzdWFsbHlIaWRkZW4sXG4gIGNsYXNzTmFtZSxcbiAgaHRtbEZvcixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLWxhYmVsJyk7XG4gIGxldCBjb2x1bW5DbGFzcyA9ICdjb2wtZm9ybS1sYWJlbCc7XG4gIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykgY29sdW1uQ2xhc3MgPSBgJHtjb2x1bW5DbGFzc30gJHtjb2x1bW5DbGFzc30tJHtjb2x1bW59YDtcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgdmlzdWFsbHlIaWRkZW4gJiYgJ3Zpc3VhbGx5LWhpZGRlbicsIGNvbHVtbiAmJiBjb2x1bW5DbGFzcyk7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY29udHJvbElkID09IG51bGwgfHwgIWh0bWxGb3IsICdgY29udHJvbElkYCBpcyBpZ25vcmVkIG9uIGA8Rm9ybUxhYmVsPmAgd2hlbiBgaHRtbEZvcmAgaXMgc3BlY2lmaWVkLicpIDogdm9pZCAwO1xuICBodG1sRm9yID0gaHRtbEZvciB8fCBjb250cm9sSWQ7XG4gIGlmIChjb2x1bW4pIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb2wsIHtcbiAgICByZWY6IHJlZixcbiAgICBhczogXCJsYWJlbFwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICBodG1sRm9yOiBodG1sRm9yLFxuICAgIC4uLnByb3BzXG4gIH0pO1xuICByZXR1cm4gKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganN4LWExMXkvbGFiZWwtaGFzLWZvciwganN4LWExMXkvbGFiZWwtaGFzLWFzc29jaWF0ZWQtY29udHJvbFxuICAgIF9qc3goQ29tcG9uZW50LCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIGh0bWxGb3I6IGh0bWxGb3IsXG4gICAgICAuLi5wcm9wc1xuICAgIH0pXG4gICk7XG59KTtcbkZvcm1MYWJlbC5kaXNwbGF5TmFtZSA9ICdGb3JtTGFiZWwnO1xuRm9ybUxhYmVsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEZvcm1MYWJlbDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IEZvcm1Db250ZXh0IGZyb20gJy4vRm9ybUNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1SYW5nZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGlkLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb250cm9sSWRcbiAgfSA9IHVzZUNvbnRleHQoRm9ybUNvbnRleHQpO1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tcmFuZ2UnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiaW5wdXRcIiwgeyAuLi5wcm9wcyxcbiAgICB0eXBlOiBcInJhbmdlXCIsXG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGlkOiBpZCB8fCBjb250cm9sSWRcbiAgfSk7XG59KTtcbkZvcm1SYW5nZS5kaXNwbGF5TmFtZSA9ICdGb3JtUmFuZ2UnO1xuZXhwb3J0IGRlZmF1bHQgRm9ybVJhbmdlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgRm9ybUNvbnRleHQgZnJvbSAnLi9Gb3JtQ29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgRm9ybVNlbGVjdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBzaXplLFxuICBodG1sU2l6ZSxcbiAgY2xhc3NOYW1lLFxuICBpc1ZhbGlkID0gZmFsc2UsXG4gIGlzSW52YWxpZCA9IGZhbHNlLFxuICBpZCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY29udHJvbElkXG4gIH0gPSB1c2VDb250ZXh0KEZvcm1Db250ZXh0KTtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdmb3JtLXNlbGVjdCcpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJzZWxlY3RcIiwgeyAuLi5wcm9wcyxcbiAgICBzaXplOiBodG1sU2l6ZSxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgc2l6ZSAmJiBgJHtic1ByZWZpeH0tJHtzaXplfWAsIGlzVmFsaWQgJiYgYGlzLXZhbGlkYCwgaXNJbnZhbGlkICYmIGBpcy1pbnZhbGlkYCksXG4gICAgaWQ6IGlkIHx8IGNvbnRyb2xJZFxuICB9KTtcbn0pO1xuRm9ybVNlbGVjdC5kaXNwbGF5TmFtZSA9ICdGb3JtU2VsZWN0JztcbmV4cG9ydCBkZWZhdWx0IEZvcm1TZWxlY3Q7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IEZvcm1UZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbih7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSAnc21hbGwnLFxuICBtdXRlZCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ2Zvcm0tdGV4dCcpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBtdXRlZCAmJiAndGV4dC1tdXRlZCcpXG4gIH0pO1xufSk7XG5Gb3JtVGV4dC5kaXNwbGF5TmFtZSA9ICdGb3JtVGV4dCc7XG5leHBvcnQgZGVmYXVsdCBGb3JtVGV4dDsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAnaW1nJ1xuICAgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2UgYXMgZmx1aWQgaW1hZ2UuXG4gICAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2Ugc2hhcGUgYXMgcm91bmRlZC5cbiAgICovXG4gIHJvdW5kZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIGNpcmNsZS5cbiAgICovXG4gIHJvdW5kZWRDaXJjbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIHRodW1ibmFpbC5cbiAgICovXG4gIHRodW1ibmFpbDogUHJvcFR5cGVzLmJvb2xcbn07XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGZsdWlkOiBmYWxzZSxcbiAgcm91bmRlZDogZmFsc2UsXG4gIHJvdW5kZWRDaXJjbGU6IGZhbHNlLFxuICB0aHVtYm5haWw6IGZhbHNlXG59O1xuY29uc3QgSW1hZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBmbHVpZCxcbiAgcm91bmRlZCxcbiAgcm91bmRlZENpcmNsZSxcbiAgdGh1bWJuYWlsLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnaW1nJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImltZ1wiLCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBqc3gtYTExeS9hbHQtdGV4dFxuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGZsdWlkICYmIGAke2JzUHJlZml4fS1mbHVpZGAsIHJvdW5kZWQgJiYgYHJvdW5kZWRgLCByb3VuZGVkQ2lyY2xlICYmIGByb3VuZGVkLWNpcmNsZWAsIHRodW1ibmFpbCAmJiBgJHtic1ByZWZpeH0tdGh1bWJuYWlsYClcbiAgfSk7XG59KTtcbkltYWdlLmRpc3BsYXlOYW1lID0gJ0ltYWdlJztcbkltYWdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IEltYWdlOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBGb3JtQ2hlY2tJbnB1dCBmcm9tICcuL0Zvcm1DaGVja0lucHV0JztcbmltcG9ydCBJbnB1dEdyb3VwQ29udGV4dCBmcm9tICcuL0lucHV0R3JvdXBDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBJbnB1dEdyb3VwVGV4dCA9IGNyZWF0ZVdpdGhCc1ByZWZpeCgnaW5wdXQtZ3JvdXAtdGV4dCcsIHtcbiAgQ29tcG9uZW50OiAnc3Bhbidcbn0pO1xuXG5jb25zdCBJbnB1dEdyb3VwQ2hlY2tib3ggPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwVGV4dCwge1xuICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRm9ybUNoZWNrSW5wdXQsIHtcbiAgICB0eXBlOiBcImNoZWNrYm94XCIsXG4gICAgLi4ucHJvcHNcbiAgfSlcbn0pO1xuXG5jb25zdCBJbnB1dEdyb3VwUmFkaW8gPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwVGV4dCwge1xuICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRm9ybUNoZWNrSW5wdXQsIHtcbiAgICB0eXBlOiBcInJhZGlvXCIsXG4gICAgLi4ucHJvcHNcbiAgfSlcbn0pO1xuXG4vKipcbiAqXG4gKiBAcHJvcGVydHkge0lucHV0R3JvdXBUZXh0fSBUZXh0XG4gKiBAcHJvcGVydHkge0lucHV0R3JvdXBSYWRpb30gUmFkaW9cbiAqIEBwcm9wZXJ0eSB7SW5wdXRHcm91cENoZWNrYm94fSBDaGVja2JveFxuICovXG5jb25zdCBJbnB1dEdyb3VwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIHNpemUsXG4gIGhhc1ZhbGlkYXRpb24sXG4gIGNsYXNzTmFtZSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdpbnB1dC1ncm91cCcpOyAvLyBJbnRlbnRpb25hbGx5IGFuIGVtcHR5IG9iamVjdC4gVXNlZCBpbiBkZXRlY3RpbmcgaWYgYSBkcm9wZG93blxuICAvLyBleGlzdHMgdW5kZXIgYW4gaW5wdXQgZ3JvdXAuXG5cbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiAoe30pLCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChJbnB1dEdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWUsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBzaXplICYmIGAke2JzUHJlZml4fS0ke3NpemV9YCwgaGFzVmFsaWRhdGlvbiAmJiAnaGFzLXZhbGlkYXRpb24nKVxuICAgIH0pXG4gIH0pO1xufSk7XG5JbnB1dEdyb3VwLmRpc3BsYXlOYW1lID0gJ0lucHV0R3JvdXAnO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihJbnB1dEdyb3VwLCB7XG4gIFRleHQ6IElucHV0R3JvdXBUZXh0LFxuICBSYWRpbzogSW5wdXRHcm91cFJhZGlvLFxuICBDaGVja2JveDogSW5wdXRHcm91cENoZWNrYm94XG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBjb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb250ZXh0LmRpc3BsYXlOYW1lID0gJ0lucHV0R3JvdXBDb250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBCYXNlTmF2IGZyb20gJ0ByZXN0YXJ0L3VpL05hdic7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IExpc3RHcm91cEl0ZW0gZnJvbSAnLi9MaXN0R3JvdXBJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBMaXN0R3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGJzUHJlZml4OiBpbml0aWFsQnNQcmVmaXgsXG4gICAgdmFyaWFudCxcbiAgICBob3Jpem9udGFsLFxuICAgIG51bWJlcmVkLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhcyA9ICdkaXYnLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICdsaXN0LWdyb3VwJyk7XG4gIGxldCBob3Jpem9udGFsVmFyaWFudDtcblxuICBpZiAoaG9yaXpvbnRhbCkge1xuICAgIGhvcml6b250YWxWYXJpYW50ID0gaG9yaXpvbnRhbCA9PT0gdHJ1ZSA/ICdob3Jpem9udGFsJyA6IGBob3Jpem9udGFsLSR7aG9yaXpvbnRhbH1gO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKGhvcml6b250YWwgJiYgdmFyaWFudCA9PT0gJ2ZsdXNoJyksICdgdmFyaWFudD1cImZsdXNoXCJgIGFuZCBgaG9yaXpvbnRhbGAgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLicpIDogdm9pZCAwO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQmFzZU5hdiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wcyxcbiAgICBhczogYXMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgsIHZhcmlhbnQgJiYgYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gLCBob3Jpem9udGFsVmFyaWFudCAmJiBgJHtic1ByZWZpeH0tJHtob3Jpem9udGFsVmFyaWFudH1gLCBudW1iZXJlZCAmJiBgJHtic1ByZWZpeH0tbnVtYmVyZWRgKVxuICB9KTtcbn0pO1xuTGlzdEdyb3VwLmRpc3BsYXlOYW1lID0gJ0xpc3RHcm91cCc7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKExpc3RHcm91cCwge1xuICBJdGVtOiBMaXN0R3JvdXBJdGVtXG59KTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHsgdXNlTmF2SXRlbSB9IGZyb20gJ0ByZXN0YXJ0L3VpL05hdkl0ZW0nO1xuaW1wb3J0IHsgbWFrZUV2ZW50S2V5IH0gZnJvbSAnQHJlc3RhcnQvdWkvU2VsZWN0YWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBMaXN0R3JvdXBJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGFjdGl2ZSxcbiAgZGlzYWJsZWQsXG4gIGV2ZW50S2V5LFxuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIGFjdGlvbixcbiAgYXMsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdsaXN0LWdyb3VwLWl0ZW0nKTtcbiAgY29uc3QgW25hdkl0ZW1Qcm9wcywgbWV0YV0gPSB1c2VOYXZJdGVtKHtcbiAgICBrZXk6IG1ha2VFdmVudEtleShldmVudEtleSwgcHJvcHMuaHJlZiksXG4gICAgYWN0aXZlLFxuICAgIC4uLnByb3BzXG4gIH0pO1xuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUV2ZW50Q2FsbGJhY2soZXZlbnQgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5hdkl0ZW1Qcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgfSk7XG5cbiAgaWYgKGRpc2FibGVkICYmIHByb3BzLnRhYkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50YWJJbmRleCA9IC0xO1xuICAgIHByb3BzWydhcmlhLWRpc2FibGVkJ10gPSB0cnVlO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuXG5cbiAgY29uc3QgQ29tcG9uZW50ID0gYXMgfHwgKGFjdGlvbiA/IHByb3BzLmhyZWYgPyAnYScgOiAnYnV0dG9uJyA6ICdkaXYnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIC4uLm5hdkl0ZW1Qcm9wcyxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgbWV0YS5pc0FjdGl2ZSAmJiAnYWN0aXZlJywgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJywgdmFyaWFudCAmJiBgJHtic1ByZWZpeH0tJHt2YXJpYW50fWAsIGFjdGlvbiAmJiBgJHtic1ByZWZpeH0tYWN0aW9uYClcbiAgfSk7XG59KTtcbkxpc3RHcm91cEl0ZW0uZGlzcGxheU5hbWUgPSAnTGlzdEdyb3VwSXRlbSc7XG5leHBvcnQgZGVmYXVsdCBMaXN0R3JvdXBJdGVtOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSAnZG9tLWhlbHBlcnMvYWRkRXZlbnRMaXN0ZW5lcic7XG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJ2RvbS1oZWxwZXJzL2NhblVzZURPTSc7XG5pbXBvcnQgb3duZXJEb2N1bWVudCBmcm9tICdkb20taGVscGVycy9vd25lckRvY3VtZW50JztcbmltcG9ydCByZW1vdmVFdmVudExpc3RlbmVyIGZyb20gJ2RvbS1oZWxwZXJzL3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuaW1wb3J0IGdldFNjcm9sbGJhclNpemUgZnJvbSAnZG9tLWhlbHBlcnMvc2Nyb2xsYmFyU2l6ZSc7XG5pbXBvcnQgdXNlQ2FsbGJhY2tSZWYgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlQ2FsbGJhY2tSZWYnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCB1c2VXaWxsVW5tb3VudCBmcm9tICdAcmVzdGFydC9ob29rcy91c2VXaWxsVW5tb3VudCc7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZCBmcm9tICdkb20taGVscGVycy90cmFuc2l0aW9uRW5kJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJhc2VNb2RhbCBmcm9tICdAcmVzdGFydC91aS9Nb2RhbCc7XG5pbXBvcnQgeyBnZXRTaGFyZWRNYW5hZ2VyIH0gZnJvbSAnLi9Cb290c3RyYXBNb2RhbE1hbmFnZXInO1xuaW1wb3J0IEZhZGUgZnJvbSAnLi9GYWRlJztcbmltcG9ydCBNb2RhbEJvZHkgZnJvbSAnLi9Nb2RhbEJvZHknO1xuaW1wb3J0IE1vZGFsQ29udGV4dCBmcm9tICcuL01vZGFsQ29udGV4dCc7XG5pbXBvcnQgTW9kYWxEaWFsb2cgZnJvbSAnLi9Nb2RhbERpYWxvZyc7XG5pbXBvcnQgTW9kYWxGb290ZXIgZnJvbSAnLi9Nb2RhbEZvb3Rlcic7XG5pbXBvcnQgTW9kYWxIZWFkZXIgZnJvbSAnLi9Nb2RhbEhlYWRlcic7XG5pbXBvcnQgTW9kYWxUaXRsZSBmcm9tICcuL01vZGFsVGl0bGUnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4LCB1c2VJc1JUTCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZSxcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBhdXRvRm9jdXM6IHRydWUsXG4gIGVuZm9yY2VGb2N1czogdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICBhbmltYXRpb246IHRydWUsXG4gIGRpYWxvZ0FzOiBNb2RhbERpYWxvZ1xufTtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lLCByZWFjdC9uby1tdWx0aS1jb21wICovXG5cbmZ1bmN0aW9uIERpYWxvZ1RyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHMsXG4gICAgdGltZW91dDogbnVsbFxuICB9KTtcbn1cblxuZnVuY3Rpb24gQmFja2Ryb3BUcmFuc2l0aW9uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChGYWRlLCB7IC4uLnByb3BzLFxuICAgIHRpbWVvdXQ6IG51bGxcbiAgfSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5cblxuY29uc3QgTW9kYWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBzdHlsZSxcbiAgZGlhbG9nQ2xhc3NOYW1lLFxuICBjb250ZW50Q2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgZGlhbG9nQXM6IERpYWxvZyxcbiAgJ2FyaWEtbGFiZWxsZWRieSc6IGFyaWFMYWJlbGxlZGJ5LFxuXG4gIC8qIEJhc2VNb2RhbCBwcm9wcyAqL1xuICBzaG93LFxuICBhbmltYXRpb24sXG4gIGJhY2tkcm9wLFxuICBrZXlib2FyZCxcbiAgb25Fc2NhcGVLZXlEb3duLFxuICBvblNob3csXG4gIG9uSGlkZSxcbiAgY29udGFpbmVyLFxuICBhdXRvRm9jdXMsXG4gIGVuZm9yY2VGb2N1cyxcbiAgcmVzdG9yZUZvY3VzLFxuICByZXN0b3JlRm9jdXNPcHRpb25zLFxuICBvbkVudGVyZWQsXG4gIG9uRXhpdCxcbiAgb25FeGl0aW5nLFxuICBvbkVudGVyLFxuICBvbkVudGVyaW5nLFxuICBvbkV4aXRlZCxcbiAgYmFja2Ryb3BDbGFzc05hbWUsXG4gIG1hbmFnZXI6IHByb3BzTWFuYWdlcixcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBbbW9kYWxTdHlsZSwgc2V0U3R5bGVdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbYW5pbWF0ZVN0YXRpY01vZGFsLCBzZXRBbmltYXRlU3RhdGljTW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB3YWl0aW5nRm9yTW91c2VVcFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCByZW1vdmVTdGF0aWNNb2RhbEFuaW1hdGlvblJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW21vZGFsLCBzZXRNb2RhbFJlZl0gPSB1c2VDYWxsYmFja1JlZigpO1xuICBjb25zdCBtZXJnZWRSZWYgPSB1c2VNZXJnZWRSZWZzKHJlZiwgc2V0TW9kYWxSZWYpO1xuICBjb25zdCBoYW5kbGVIaWRlID0gdXNlRXZlbnRDYWxsYmFjayhvbkhpZGUpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbW9kYWwnKTtcbiAgY29uc3QgbW9kYWxDb250ZXh0ID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIG9uSGlkZTogaGFuZGxlSGlkZVxuICB9KSwgW2hhbmRsZUhpZGVdKTtcblxuICBmdW5jdGlvbiBnZXRNb2RhbE1hbmFnZXIoKSB7XG4gICAgaWYgKHByb3BzTWFuYWdlcikgcmV0dXJuIHByb3BzTWFuYWdlcjtcbiAgICByZXR1cm4gZ2V0U2hhcmVkTWFuYWdlcih7XG4gICAgICBpc1JUTFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRGlhbG9nU3R5bGUobm9kZSkge1xuICAgIGlmICghY2FuVXNlRE9NKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVySXNPdmVyZmxvd2luZyA9IGdldE1vZGFsTWFuYWdlcigpLmdldFNjcm9sbGJhcldpZHRoKCkgPiAwO1xuICAgIGNvbnN0IG1vZGFsSXNPdmVyZmxvd2luZyA9IG5vZGUuc2Nyb2xsSGVpZ2h0ID4gb3duZXJEb2N1bWVudChub2RlKS5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHNldFN0eWxlKHtcbiAgICAgIHBhZGRpbmdSaWdodDogY29udGFpbmVySXNPdmVyZmxvd2luZyAmJiAhbW9kYWxJc092ZXJmbG93aW5nID8gZ2V0U2Nyb2xsYmFyU2l6ZSgpIDogdW5kZWZpbmVkLFxuICAgICAgcGFkZGluZ0xlZnQ6ICFjb250YWluZXJJc092ZXJmbG93aW5nICYmIG1vZGFsSXNPdmVyZmxvd2luZyA/IGdldFNjcm9sbGJhclNpemUoKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlV2luZG93UmVzaXplID0gdXNlRXZlbnRDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG1vZGFsKSB7XG4gICAgICB1cGRhdGVEaWFsb2dTdHlsZShtb2RhbC5kaWFsb2cpO1xuICAgIH1cbiAgfSk7XG4gIHVzZVdpbGxVbm1vdW50KCgpID0+IHtcbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCgpO1xuICB9KTsgLy8gV2UgcHJldmVudCB0aGUgbW9kYWwgZnJvbSBjbG9zaW5nIGR1cmluZyBhIGRyYWcgYnkgZGV0ZWN0aW5nIHdoZXJlIHRoZVxuICAvLyB0aGUgY2xpY2sgb3JpZ2luYXRlcyBmcm9tLiBJZiBpdCBzdGFydHMgaW4gdGhlIG1vZGFsIGFuZCB0aGVuIGVuZHMgb3V0c2lkZVxuICAvLyBkb24ndCBjbG9zZS5cblxuICBjb25zdCBoYW5kbGVEaWFsb2dNb3VzZURvd24gPSAoKSA9PiB7XG4gICAgd2FpdGluZ0Zvck1vdXNlVXBSZWYuY3VycmVudCA9IHRydWU7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTW91c2VVcCA9IGUgPT4ge1xuICAgIGlmICh3YWl0aW5nRm9yTW91c2VVcFJlZi5jdXJyZW50ICYmIG1vZGFsICYmIGUudGFyZ2V0ID09PSBtb2RhbC5kaWFsb2cpIHtcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgd2FpdGluZ0Zvck1vdXNlVXBSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN0YXRpY01vZGFsQW5pbWF0aW9uID0gKCkgPT4ge1xuICAgIHNldEFuaW1hdGVTdGF0aWNNb2RhbCh0cnVlKTtcbiAgICByZW1vdmVTdGF0aWNNb2RhbEFuaW1hdGlvblJlZi5jdXJyZW50ID0gdHJhbnNpdGlvbkVuZChtb2RhbC5kaWFsb2csICgpID0+IHtcbiAgICAgIHNldEFuaW1hdGVTdGF0aWNNb2RhbChmYWxzZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3RhdGljQmFja2Ryb3BDbGljayA9IGUgPT4ge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFuZGxlU3RhdGljTW9kYWxBbmltYXRpb24oKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IGUgPT4ge1xuICAgIGlmIChiYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGhhbmRsZVN0YXRpY0JhY2tkcm9wQ2xpY2soZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlnbm9yZUJhY2tkcm9wQ2xpY2tSZWYuY3VycmVudCB8fCBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvbkhpZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uSGlkZSgpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVzY2FwZUtleURvd24gPSBlID0+IHtcbiAgICBpZiAoIWtleWJvYXJkICYmIGJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgLy8gQ2FsbCBwcmV2ZW50RGVmYXVsdCB0byBzdG9wIG1vZGFsIGZyb20gY2xvc2luZyBpbiByZXN0YXJ0IHVpLFxuICAgICAgLy8gdGhlbiBwbGF5IG91ciBhbmltYXRpb24uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBoYW5kbGVTdGF0aWNNb2RhbEFuaW1hdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoa2V5Ym9hcmQgJiYgb25Fc2NhcGVLZXlEb3duKSB7XG4gICAgICBvbkVzY2FwZUtleURvd24oZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB1cGRhdGVEaWFsb2dTdHlsZShub2RlKTtcbiAgICB9XG5cbiAgICBvbkVudGVyID09IG51bGwgPyB2b2lkIDAgOiBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVFeGl0ID0gbm9kZSA9PiB7XG4gICAgcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVtb3ZlU3RhdGljTW9kYWxBbmltYXRpb25SZWYuY3VycmVudCgpO1xuICAgIG9uRXhpdCA9PSBudWxsID8gdm9pZCAwIDogb25FeGl0KG5vZGUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVudGVyaW5nID0gKG5vZGUsIGlzQXBwZWFyaW5nKSA9PiB7XG4gICAgb25FbnRlcmluZyA9PSBudWxsID8gdm9pZCAwIDogb25FbnRlcmluZyhub2RlLCBpc0FwcGVhcmluZyk7IC8vIEZJWE1FOiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gd2hlbiBhbmltYXRpb24gaXMgZGlzYWJsZWQuXG5cbiAgICBhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRXhpdGVkID0gbm9kZSA9PiB7XG4gICAgaWYgKG5vZGUpIG5vZGUuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBSSEwgcmVtb3ZlcyBpdCBzb21ldGltZXNcblxuICAgIG9uRXhpdGVkID09IG51bGwgPyB2b2lkIDAgOiBvbkV4aXRlZChub2RlKTsgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHdvcmsgZXZlbiB3aGVuIGFuaW1hdGlvbiBpcyBkaXNhYmxlZC5cblxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCAncmVzaXplJywgaGFuZGxlV2luZG93UmVzaXplKTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJCYWNrZHJvcCA9IHVzZUNhbGxiYWNrKGJhY2tkcm9wUHJvcHMgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5iYWNrZHJvcFByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtic1ByZWZpeH0tYmFja2Ryb3BgLCBiYWNrZHJvcENsYXNzTmFtZSwgIWFuaW1hdGlvbiAmJiAnc2hvdycpXG4gIH0pLCBbYW5pbWF0aW9uLCBiYWNrZHJvcENsYXNzTmFtZSwgYnNQcmVmaXhdKTtcbiAgY29uc3QgYmFzZU1vZGFsU3R5bGUgPSB7IC4uLnN0eWxlLFxuICAgIC4uLm1vZGFsU3R5bGVcbiAgfTsgLy8gU2V0cyBgZGlzcGxheWAgYWx3YXlzIGJsb2NrIHdoZW4gYGFuaW1hdGlvbmAgaXMgZmFsc2VcblxuICBpZiAoIWFuaW1hdGlvbikge1xuICAgIGJhc2VNb2RhbFN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgY29uc3QgcmVuZGVyRGlhbG9nID0gZGlhbG9nUHJvcHMgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgIHJvbGU6IFwiZGlhbG9nXCIsXG4gICAgLi4uZGlhbG9nUHJvcHMsXG4gICAgc3R5bGU6IGJhc2VNb2RhbFN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBhbmltYXRlU3RhdGljTW9kYWwgJiYgYCR7YnNQcmVmaXh9LXN0YXRpY2ApLFxuICAgIG9uQ2xpY2s6IGJhY2tkcm9wID8gaGFuZGxlQ2xpY2sgOiB1bmRlZmluZWQsXG4gICAgb25Nb3VzZVVwOiBoYW5kbGVNb3VzZVVwLFxuICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGFyaWFMYWJlbGxlZGJ5LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChEaWFsb2csIHsgLi4ucHJvcHMsXG4gICAgICBvbk1vdXNlRG93bjogaGFuZGxlRGlhbG9nTW91c2VEb3duLFxuICAgICAgY2xhc3NOYW1lOiBkaWFsb2dDbGFzc05hbWUsXG4gICAgICBjb250ZW50Q2xhc3NOYW1lOiBjb250ZW50Q2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE1vZGFsQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBtb2RhbENvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KEJhc2VNb2RhbCwge1xuICAgICAgc2hvdzogc2hvdyxcbiAgICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgICAgYmFja2Ryb3A6IGJhY2tkcm9wLFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBrZXlib2FyZDogdHJ1ZSAvLyBBbHdheXMgc2V0IHRydWUgLSBzZWUgaGFuZGxlRXNjYXBlS2V5RG93blxuICAgICAgLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBlbmZvcmNlRm9jdXM6IGVuZm9yY2VGb2N1cyxcbiAgICAgIHJlc3RvcmVGb2N1czogcmVzdG9yZUZvY3VzLFxuICAgICAgcmVzdG9yZUZvY3VzT3B0aW9uczogcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgICAgIG9uRXNjYXBlS2V5RG93bjogaGFuZGxlRXNjYXBlS2V5RG93bixcbiAgICAgIG9uU2hvdzogb25TaG93LFxuICAgICAgb25IaWRlOiBvbkhpZGUsXG4gICAgICBvbkVudGVyOiBoYW5kbGVFbnRlcixcbiAgICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgICBvbkV4aXRpbmc6IG9uRXhpdGluZyxcbiAgICAgIG9uRXhpdGVkOiBoYW5kbGVFeGl0ZWQsXG4gICAgICBtYW5hZ2VyOiBnZXRNb2RhbE1hbmFnZXIoKSxcbiAgICAgIHRyYW5zaXRpb246IGFuaW1hdGlvbiA/IERpYWxvZ1RyYW5zaXRpb24gOiB1bmRlZmluZWQsXG4gICAgICBiYWNrZHJvcFRyYW5zaXRpb246IGFuaW1hdGlvbiA/IEJhY2tkcm9wVHJhbnNpdGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgIHJlbmRlckJhY2tkcm9wOiByZW5kZXJCYWNrZHJvcCxcbiAgICAgIHJlbmRlckRpYWxvZzogcmVuZGVyRGlhbG9nXG4gICAgfSlcbiAgfSk7XG59KTtcbk1vZGFsLmRpc3BsYXlOYW1lID0gJ01vZGFsJztcbk1vZGFsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTW9kYWwsIHtcbiAgQm9keTogTW9kYWxCb2R5LFxuICBIZWFkZXI6IE1vZGFsSGVhZGVyLFxuICBUaXRsZTogTW9kYWxUaXRsZSxcbiAgRm9vdGVyOiBNb2RhbEZvb3RlcixcbiAgRGlhbG9nOiBNb2RhbERpYWxvZyxcbiAgVFJBTlNJVElPTl9EVVJBVElPTjogMzAwLFxuICBCQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OOiAxNTBcbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdtb2RhbC1ib2R5Jyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuY29uc3QgTW9kYWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uSGlkZSgpIHt9XG5cbn0pO1xuZXhwb3J0IGRlZmF1bHQgTW9kYWxDb250ZXh0OyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBNb2RhbERpYWxvZyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNvbnRlbnRDbGFzc05hbWUsXG4gIGNlbnRlcmVkLFxuICBzaXplLFxuICBmdWxsc2NyZWVuLFxuICBjaGlsZHJlbixcbiAgc2Nyb2xsYWJsZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ21vZGFsJyk7XG4gIGNvbnN0IGRpYWxvZ0NsYXNzID0gYCR7YnNQcmVmaXh9LWRpYWxvZ2A7XG4gIGNvbnN0IGZ1bGxTY3JlZW5DbGFzcyA9IHR5cGVvZiBmdWxsc2NyZWVuID09PSAnc3RyaW5nJyA/IGAke2JzUHJlZml4fS1mdWxsc2NyZWVuLSR7ZnVsbHNjcmVlbn1gIDogYCR7YnNQcmVmaXh9LWZ1bGxzY3JlZW5gO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoZGlhbG9nQ2xhc3MsIGNsYXNzTmFtZSwgc2l6ZSAmJiBgJHtic1ByZWZpeH0tJHtzaXplfWAsIGNlbnRlcmVkICYmIGAke2RpYWxvZ0NsYXNzfS1jZW50ZXJlZGAsIHNjcm9sbGFibGUgJiYgYCR7ZGlhbG9nQ2xhc3N9LXNjcm9sbGFibGVgLCBmdWxsc2NyZWVuICYmIGZ1bGxTY3JlZW5DbGFzcyksXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhgJHtic1ByZWZpeH0tY29udGVudGAsIGNvbnRlbnRDbGFzc05hbWUpLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbk1vZGFsRGlhbG9nLmRpc3BsYXlOYW1lID0gJ01vZGFsRGlhbG9nJztcbmV4cG9ydCBkZWZhdWx0IE1vZGFsRGlhbG9nOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdtb2RhbC1mb290ZXInKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQWJzdHJhY3RNb2RhbEhlYWRlciBmcm9tICcuL0Fic3RyYWN0TW9kYWxIZWFkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgY2xvc2VMYWJlbDogJ0Nsb3NlJyxcbiAgY2xvc2VCdXR0b246IGZhbHNlXG59O1xuY29uc3QgTW9kYWxIZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbW9kYWwtaGVhZGVyJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChBYnN0cmFjdE1vZGFsSGVhZGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpXG4gIH0pO1xufSk7XG5Nb2RhbEhlYWRlci5kaXNwbGF5TmFtZSA9ICdNb2RhbEhlYWRlcic7XG5Nb2RhbEhlYWRlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBNb2RhbEhlYWRlcjsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmltcG9ydCBkaXZXaXRoQ2xhc3NOYW1lIGZyb20gJy4vZGl2V2l0aENsYXNzTmFtZSc7XG5jb25zdCBEaXZTdHlsZWRBc0g0ID0gZGl2V2l0aENsYXNzTmFtZSgnaDQnKTtcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgnbW9kYWwtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINFxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgYWxsIGZyb20gJ3Byb3AtdHlwZXMtZXh0cmEvbGliL2FsbCc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IEJhc2VOYXYgZnJvbSAnQHJlc3RhcnQvdWkvTmF2JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IENhcmRIZWFkZXJDb250ZXh0IGZyb20gJy4vQ2FyZEhlYWRlckNvbnRleHQnO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCBOYXZMaW5rIGZyb20gJy4vTmF2TGluayc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBqdXN0aWZ5OiBmYWxzZSxcbiAgZmlsbDogZmFsc2Vcbn07XG5jb25zdCBOYXYgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigodW5jb250cm9sbGVkUHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYXMgPSAnZGl2JyxcbiAgICBic1ByZWZpeDogaW5pdGlhbEJzUHJlZml4LFxuICAgIHZhcmlhbnQsXG4gICAgZmlsbCxcbiAgICBqdXN0aWZ5LFxuICAgIG5hdmJhcixcbiAgICBuYXZiYXJTY3JvbGwsXG4gICAgY2xhc3NOYW1lLFxuICAgIGFjdGl2ZUtleSxcbiAgICAuLi5wcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHVuY29udHJvbGxlZFByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXYnKTtcbiAgbGV0IG5hdmJhckJzUHJlZml4O1xuICBsZXQgY2FyZEhlYWRlckJzUHJlZml4O1xuICBsZXQgaXNOYXZiYXIgPSBmYWxzZTtcbiAgY29uc3QgbmF2YmFyQ29udGV4dCA9IHVzZUNvbnRleHQoTmF2YmFyQ29udGV4dCk7XG4gIGNvbnN0IGNhcmRIZWFkZXJDb250ZXh0ID0gdXNlQ29udGV4dChDYXJkSGVhZGVyQ29udGV4dCk7XG5cbiAgaWYgKG5hdmJhckNvbnRleHQpIHtcbiAgICBuYXZiYXJCc1ByZWZpeCA9IG5hdmJhckNvbnRleHQuYnNQcmVmaXg7XG4gICAgaXNOYXZiYXIgPSBuYXZiYXIgPT0gbnVsbCA/IHRydWUgOiBuYXZiYXI7XG4gIH0gZWxzZSBpZiAoY2FyZEhlYWRlckNvbnRleHQpIHtcbiAgICAoe1xuICAgICAgY2FyZEhlYWRlckJzUHJlZml4XG4gICAgfSA9IGNhcmRIZWFkZXJDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChCYXNlTmF2LCB7XG4gICAgYXM6IGFzLFxuICAgIHJlZjogcmVmLFxuICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIHtcbiAgICAgIFtic1ByZWZpeF06ICFpc05hdmJhcixcbiAgICAgIFtgJHtuYXZiYXJCc1ByZWZpeH0tbmF2YF06IGlzTmF2YmFyLFxuICAgICAgW2Ake25hdmJhckJzUHJlZml4fS1uYXYtc2Nyb2xsYF06IGlzTmF2YmFyICYmIG5hdmJhclNjcm9sbCxcbiAgICAgIFtgJHtjYXJkSGVhZGVyQnNQcmVmaXh9LSR7dmFyaWFudH1gXTogISFjYXJkSGVhZGVyQnNQcmVmaXgsXG4gICAgICBbYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gXTogISF2YXJpYW50LFxuICAgICAgW2Ake2JzUHJlZml4fS1maWxsYF06IGZpbGwsXG4gICAgICBbYCR7YnNQcmVmaXh9LWp1c3RpZmllZGBdOiBqdXN0aWZ5XG4gICAgfSksXG4gICAgLi4ucHJvcHNcbiAgfSk7XG59KTtcbk5hdi5kaXNwbGF5TmFtZSA9ICdOYXYnO1xuTmF2LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2LCB7XG4gIEl0ZW06IE5hdkl0ZW0sXG4gIExpbms6IE5hdkxpbmtcbn0pOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuL0Ryb3Bkb3duJztcbmltcG9ydCBOYXZMaW5rIGZyb20gJy4vTmF2TGluayc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgTmF2RHJvcGRvd24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBpZCxcbiAgdGl0bGUsXG4gIGNoaWxkcmVuLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICByb290Q2xvc2VFdmVudCxcbiAgbWVudVJvbGUsXG4gIGRpc2FibGVkLFxuICBhY3RpdmUsXG4gIHJlbmRlck1lbnVPbk1vdW50LFxuICBtZW51VmFyaWFudCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICAvKiBOYXZJdGVtIGhhcyBubyBhZGRpdGlvbmFsIGxvZ2ljLCBpdCdzIHB1cmVseSBwcmVzZW50YXRpb25hbC4gQ2FuIHNldCBuYXYgaXRlbSBjbGFzcyBoZXJlIHRvIHN1cHBvcnQgXCJhc1wiICovXG4gIGNvbnN0IG5hdkl0ZW1QcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgodW5kZWZpbmVkLCAnbmF2LWl0ZW0nKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhEcm9wZG93biwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIG5hdkl0ZW1QcmVmaXgpLFxuICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goRHJvcGRvd24uVG9nZ2xlLCB7XG4gICAgICBpZDogaWQsXG4gICAgICBldmVudEtleTogbnVsbCxcbiAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgY2hpbGRCc1ByZWZpeDogYnNQcmVmaXgsXG4gICAgICBhczogTmF2TGluayxcbiAgICAgIGNoaWxkcmVuOiB0aXRsZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5NZW51LCB7XG4gICAgICByb2xlOiBtZW51Um9sZSxcbiAgICAgIHJlbmRlck9uTW91bnQ6IHJlbmRlck1lbnVPbk1vdW50LFxuICAgICAgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50LFxuICAgICAgdmFyaWFudDogbWVudVZhcmlhbnQsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KV1cbiAgfSk7XG59KTtcbk5hdkRyb3Bkb3duLmRpc3BsYXlOYW1lID0gJ05hdkRyb3Bkb3duJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oTmF2RHJvcGRvd24sIHtcbiAgSXRlbTogRHJvcGRvd24uSXRlbSxcbiAgSXRlbVRleHQ6IERyb3Bkb3duLkl0ZW1UZXh0LFxuICBEaXZpZGVyOiBEcm9wZG93bi5EaXZpZGVyLFxuICBIZWFkZXI6IERyb3Bkb3duLkhlYWRlclxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ25hdi1pdGVtJyk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJ0ByZXN0YXJ0L3VpL0FuY2hvcic7XG5pbXBvcnQgeyB1c2VOYXZJdGVtIH0gZnJvbSAnQHJlc3RhcnQvdWkvTmF2SXRlbSc7XG5pbXBvcnQgeyBtYWtlRXZlbnRLZXkgfSBmcm9tICdAcmVzdGFydC91aS9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuY29uc3QgTmF2TGluayA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGFzOiBDb21wb25lbnQgPSBBbmNob3IsXG4gIGFjdGl2ZSxcbiAgZXZlbnRLZXksXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXYtbGluaycpO1xuICBjb25zdCBbbmF2SXRlbVByb3BzLCBtZXRhXSA9IHVzZU5hdkl0ZW0oe1xuICAgIGtleTogbWFrZUV2ZW50S2V5KGV2ZW50S2V5LCBwcm9wcy5ocmVmKSxcbiAgICBhY3RpdmUsXG4gICAgLi4ucHJvcHNcbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucHJvcHMsXG4gICAgLi4ubmF2SXRlbVByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBwcm9wcy5kaXNhYmxlZCAmJiAnZGlzYWJsZWQnLCBtZXRhLmlzQWN0aXZlICYmICdhY3RpdmUnKVxuICB9KTtcbn0pO1xuTmF2TGluay5kaXNwbGF5TmFtZSA9ICdOYXZMaW5rJztcbk5hdkxpbmsuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgTmF2TGluazsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNlbGVjdGFibGVDb250ZXh0IGZyb20gJ0ByZXN0YXJ0L3VpL1NlbGVjdGFibGVDb250ZXh0JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IE5hdmJhckJyYW5kIGZyb20gJy4vTmF2YmFyQnJhbmQnO1xuaW1wb3J0IE5hdmJhckNvbGxhcHNlIGZyb20gJy4vTmF2YmFyQ29sbGFwc2UnO1xuaW1wb3J0IE5hdmJhclRvZ2dsZSBmcm9tICcuL05hdmJhclRvZ2dsZSc7XG5pbXBvcnQgTmF2YmFyT2ZmY2FudmFzIGZyb20gJy4vTmF2YmFyT2ZmY2FudmFzJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhclRleHQgPSBjcmVhdGVXaXRoQnNQcmVmaXgoJ25hdmJhci10ZXh0Jywge1xuICBDb21wb25lbnQ6ICdzcGFuJ1xufSk7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGV4cGFuZDogdHJ1ZSxcbiAgdmFyaWFudDogJ2xpZ2h0JyxcbiAgY29sbGFwc2VPblNlbGVjdDogZmFsc2Vcbn07XG5jb25zdCBOYXZiYXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgYnNQcmVmaXg6IGluaXRpYWxCc1ByZWZpeCxcbiAgICBleHBhbmQsXG4gICAgdmFyaWFudCxcbiAgICBiZyxcbiAgICBmaXhlZCxcbiAgICBzdGlja3ksXG4gICAgY2xhc3NOYW1lLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ25hdicsXG4gICAgZXhwYW5kZWQsXG4gICAgb25Ub2dnbGUsXG4gICAgb25TZWxlY3QsXG4gICAgY29sbGFwc2VPblNlbGVjdCxcbiAgICAuLi5jb250cm9sbGVkUHJvcHNcbiAgfSA9IHVzZVVuY29udHJvbGxlZChwcm9wcywge1xuICAgIGV4cGFuZGVkOiAnb25Ub2dnbGUnXG4gIH0pO1xuICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChpbml0aWFsQnNQcmVmaXgsICduYXZiYXInKTtcbiAgY29uc3QgaGFuZGxlQ29sbGFwc2UgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIG9uU2VsZWN0ID09IG51bGwgPyB2b2lkIDAgOiBvblNlbGVjdCguLi5hcmdzKTtcblxuICAgIGlmIChjb2xsYXBzZU9uU2VsZWN0ICYmIGV4cGFuZGVkKSB7XG4gICAgICBvblRvZ2dsZSA9PSBudWxsID8gdm9pZCAwIDogb25Ub2dnbGUoZmFsc2UpO1xuICAgIH1cbiAgfSwgW29uU2VsZWN0LCBjb2xsYXBzZU9uU2VsZWN0LCBleHBhbmRlZCwgb25Ub2dnbGVdKTsgLy8gd2lsbCByZXN1bHQgaW4gc29tZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHRoYXQgc2VlbXMgYmV0dGVyXG4gIC8vIHRoYW4gZmFsc2UgbmVnYXRpdmVzLiBzdHJpY3QgYHVuZGVmaW5lZGAgY2hlY2sgYWxsb3dzIGV4cGxpY2l0XG4gIC8vIFwibnVsbGluZ1wiIG9mIHRoZSByb2xlIGlmIHRoZSB1c2VyIHJlYWxseSBkb2Vzbid0IHdhbnQgb25lXG5cbiAgaWYgKGNvbnRyb2xsZWRQcm9wcy5yb2xlID09PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSAnbmF2Jykge1xuICAgIGNvbnRyb2xsZWRQcm9wcy5yb2xlID0gJ25hdmlnYXRpb24nO1xuICB9XG5cbiAgbGV0IGV4cGFuZENsYXNzID0gYCR7YnNQcmVmaXh9LWV4cGFuZGA7XG4gIGlmICh0eXBlb2YgZXhwYW5kID09PSAnc3RyaW5nJykgZXhwYW5kQ2xhc3MgPSBgJHtleHBhbmRDbGFzc30tJHtleHBhbmR9YDtcbiAgY29uc3QgbmF2YmFyQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBvblRvZ2dsZTogKCkgPT4gb25Ub2dnbGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9uVG9nZ2xlKCFleHBhbmRlZCksXG4gICAgYnNQcmVmaXgsXG4gICAgZXhwYW5kZWQ6ICEhZXhwYW5kZWRcbiAgfSksIFtic1ByZWZpeCwgZXhwYW5kZWQsIG9uVG9nZ2xlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChOYXZiYXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG5hdmJhckNvbnRleHQsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFNlbGVjdGFibGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICB2YWx1ZTogaGFuZGxlQ29sbGFwc2UsXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7XG4gICAgICAgIHJlZjogcmVmLFxuICAgICAgICAuLi5jb250cm9sbGVkUHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBleHBhbmQgJiYgZXhwYW5kQ2xhc3MsIHZhcmlhbnQgJiYgYCR7YnNQcmVmaXh9LSR7dmFyaWFudH1gLCBiZyAmJiBgYmctJHtiZ31gLCBzdGlja3kgJiYgYHN0aWNreS0ke3N0aWNreX1gLCBmaXhlZCAmJiBgZml4ZWQtJHtmaXhlZH1gKVxuICAgICAgfSlcbiAgICB9KVxuICB9KTtcbn0pO1xuTmF2YmFyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk5hdmJhci5kaXNwbGF5TmFtZSA9ICdOYXZiYXInO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihOYXZiYXIsIHtcbiAgQnJhbmQ6IE5hdmJhckJyYW5kLFxuICBDb2xsYXBzZTogTmF2YmFyQ29sbGFwc2UsXG4gIE9mZmNhbnZhczogTmF2YmFyT2ZmY2FudmFzLFxuICBUZXh0OiBOYXZiYXJUZXh0LFxuICBUb2dnbGU6IE5hdmJhclRvZ2dsZVxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhckJyYW5kID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgYXMsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICduYXZiYXItYnJhbmQnKTtcbiAgY29uc3QgQ29tcG9uZW50ID0gYXMgfHwgKHByb3BzLmhyZWYgPyAnYScgOiAnc3BhbicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KVxuICB9KTtcbn0pO1xuTmF2YmFyQnJhbmQuZGlzcGxheU5hbWUgPSAnTmF2YmFyQnJhbmQnO1xuZXhwb3J0IGRlZmF1bHQgTmF2YmFyQnJhbmQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuL0NvbGxhcHNlJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgTmF2YmFyQ29udGV4dCBmcm9tICcuL05hdmJhckNvbnRleHQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IE5hdmJhckNvbGxhcHNlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgY2hpbGRyZW4sXG4gIGJzUHJlZml4LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnbmF2YmFyLWNvbGxhcHNlJyk7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE5hdmJhckNvbnRleHQpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29sbGFwc2UsIHtcbiAgICBpbjogISEoY29udGV4dCAmJiBjb250ZXh0LmV4cGFuZGVkKSxcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgcmVmOiByZWYsXG4gICAgICBjbGFzc05hbWU6IGJzUHJlZml4LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSlcbiAgfSk7XG59KTtcbk5hdmJhckNvbGxhcHNlLmRpc3BsYXlOYW1lID0gJ05hdmJhckNvbGxhcHNlJztcbmV4cG9ydCBkZWZhdWx0IE5hdmJhckNvbGxhcHNlOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JzsgLy8gVE9ETzogY2hlY2tcblxuY29uc3QgY29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29udGV4dC5kaXNwbGF5TmFtZSA9ICdOYXZiYXJDb250ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGNvbnRleHQ7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBPZmZjYW52YXMgZnJvbSAnLi9PZmZjYW52YXMnO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBOYXZiYXJPZmZjYW52YXMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE9mZmNhbnZhcywge1xuICAgIHJlZjogcmVmLFxuICAgIHNob3c6ICEhKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmV4cGFuZGVkKSxcbiAgICAuLi5wcm9wc1xuICB9KTtcbn0pO1xuTmF2YmFyT2ZmY2FudmFzLmRpc3BsYXlOYW1lID0gJ05hdmJhck9mZmNhbnZhcyc7XG5leHBvcnQgZGVmYXVsdCBOYXZiYXJPZmZjYW52YXM7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IE5hdmJhckNvbnRleHQgZnJvbSAnLi9OYXZiYXJDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGxhYmVsOiAnVG9nZ2xlIG5hdmlnYXRpb24nXG59O1xuY29uc3QgTmF2YmFyVG9nZ2xlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGxhYmVsLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnYnV0dG9uJyxcbiAgb25DbGljayxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ25hdmJhci10b2dnbGVyJyk7XG4gIGNvbnN0IHtcbiAgICBvblRvZ2dsZSxcbiAgICBleHBhbmRlZFxuICB9ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUpO1xuICAgIGlmIChvblRvZ2dsZSkgb25Ub2dnbGUoKTtcbiAgfSk7XG5cbiAgaWYgKENvbXBvbmVudCA9PT0gJ2J1dHRvbicpIHtcbiAgICBwcm9wcy50eXBlID0gJ2J1dHRvbic7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBsYWJlbCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgIWV4cGFuZGVkICYmICdjb2xsYXBzZWQnKSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7YnNQcmVmaXh9LWljb25gXG4gICAgfSlcbiAgfSk7XG59KTtcbk5hdmJhclRvZ2dsZS5kaXNwbGF5TmFtZSA9ICdOYXZiYXJUb2dnbGUnO1xuTmF2YmFyVG9nZ2xlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE5hdmJhclRvZ2dsZTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlTW9kYWwgZnJvbSAnQHJlc3RhcnQvdWkvTW9kYWwnO1xuaW1wb3J0IEZhZGUgZnJvbSAnLi9GYWRlJztcbmltcG9ydCBPZmZjYW52YXNCb2R5IGZyb20gJy4vT2ZmY2FudmFzQm9keSc7XG5pbXBvcnQgT2ZmY2FudmFzVG9nZ2xpbmcgZnJvbSAnLi9PZmZjYW52YXNUb2dnbGluZyc7XG5pbXBvcnQgTW9kYWxDb250ZXh0IGZyb20gJy4vTW9kYWxDb250ZXh0JztcbmltcG9ydCBOYXZiYXJDb250ZXh0IGZyb20gJy4vTmF2YmFyQ29udGV4dCc7XG5pbXBvcnQgT2ZmY2FudmFzSGVhZGVyIGZyb20gJy4vT2ZmY2FudmFzSGVhZGVyJztcbmltcG9ydCBPZmZjYW52YXNUaXRsZSBmcm9tICcuL09mZmNhbnZhc1RpdGxlJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQm9vdHN0cmFwTW9kYWxNYW5hZ2VyLCB7IGdldFNoYXJlZE1hbmFnZXIgfSBmcm9tICcuL0Jvb3RzdHJhcE1vZGFsTWFuYWdlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZSxcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlLFxuICBhdXRvRm9jdXM6IHRydWUsXG4gIGVuZm9yY2VGb2N1czogdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICBwbGFjZW1lbnQ6ICdzdGFydCdcbn07XG5cbmZ1bmN0aW9uIERpYWxvZ1RyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE9mZmNhbnZhc1RvZ2dsaW5nLCB7IC4uLnByb3BzXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBCYWNrZHJvcFRyYW5zaXRpb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHNcbiAgfSk7XG59XG5cbmNvbnN0IE9mZmNhbnZhcyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogYXJpYUxhYmVsbGVkYnksXG4gIHBsYWNlbWVudCxcblxuICAvKiBCYXNlTW9kYWwgcHJvcHMgKi9cbiAgc2hvdyxcbiAgYmFja2Ryb3AsXG4gIGtleWJvYXJkLFxuICBzY3JvbGwsXG4gIG9uRXNjYXBlS2V5RG93bixcbiAgb25TaG93LFxuICBvbkhpZGUsXG4gIGNvbnRhaW5lcixcbiAgYXV0b0ZvY3VzLFxuICBlbmZvcmNlRm9jdXMsXG4gIHJlc3RvcmVGb2N1cyxcbiAgcmVzdG9yZUZvY3VzT3B0aW9ucyxcbiAgb25FbnRlcmVkLFxuICBvbkV4aXQsXG4gIG9uRXhpdGluZyxcbiAgb25FbnRlcixcbiAgb25FbnRlcmluZyxcbiAgb25FeGl0ZWQsXG4gIGJhY2tkcm9wQ2xhc3NOYW1lLFxuICBtYW5hZ2VyOiBwcm9wc01hbmFnZXIsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgbW9kYWxNYW5hZ2VyID0gdXNlUmVmKCk7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnb2ZmY2FudmFzJyk7XG4gIGNvbnN0IHtcbiAgICBvblRvZ2dsZVxuICB9ID0gdXNlQ29udGV4dChOYXZiYXJDb250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaGFuZGxlSGlkZSA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgIG9uVG9nZ2xlID09IG51bGwgPyB2b2lkIDAgOiBvblRvZ2dsZSgpO1xuICAgIG9uSGlkZSA9PSBudWxsID8gdm9pZCAwIDogb25IaWRlKCk7XG4gIH0pO1xuICBjb25zdCBtb2RhbENvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgb25IaWRlOiBoYW5kbGVIaWRlXG4gIH0pLCBbaGFuZGxlSGlkZV0pO1xuXG4gIGZ1bmN0aW9uIGdldE1vZGFsTWFuYWdlcigpIHtcbiAgICBpZiAocHJvcHNNYW5hZ2VyKSByZXR1cm4gcHJvcHNNYW5hZ2VyO1xuXG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgLy8gSGF2ZSB0byB1c2UgYSBkaWZmZXJlbnQgbW9kYWwgbWFuYWdlciBzaW5jZSB0aGUgc2hhcmVkXG4gICAgICAvLyBvbmUgaGFuZGxlcyBvdmVyZmxvdy5cbiAgICAgIGlmICghbW9kYWxNYW5hZ2VyLmN1cnJlbnQpIG1vZGFsTWFuYWdlci5jdXJyZW50ID0gbmV3IEJvb3RzdHJhcE1vZGFsTWFuYWdlcih7XG4gICAgICAgIGhhbmRsZUNvbnRhaW5lck92ZXJmbG93OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbW9kYWxNYW5hZ2VyLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNoYXJlZE1hbmFnZXIoKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUVudGVyID0gKG5vZGUsIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAobm9kZSkgbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIG9uRW50ZXIgPT0gbnVsbCA/IHZvaWQgMCA6IG9uRW50ZXIobm9kZSwgLi4uYXJncyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRXhpdGVkID0gKG5vZGUsIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAobm9kZSkgbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgb25FeGl0ZWQgPT0gbnVsbCA/IHZvaWQgMCA6IG9uRXhpdGVkKC4uLmFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlckJhY2tkcm9wID0gdXNlQ2FsbGJhY2soYmFja2Ryb3BQcm9wcyA9PiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7IC4uLmJhY2tkcm9wUHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGAke2JzUHJlZml4fS1iYWNrZHJvcGAsIGJhY2tkcm9wQ2xhc3NOYW1lKVxuICB9KSwgW2JhY2tkcm9wQ2xhc3NOYW1lLCBic1ByZWZpeF0pO1xuXG4gIGNvbnN0IHJlbmRlckRpYWxvZyA9IGRpYWxvZ1Byb3BzID0+IC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgIC4uLmRpYWxvZ1Byb3BzLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4LCBgJHtic1ByZWZpeH0tJHtwbGFjZW1lbnR9YCksXG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogYXJpYUxhYmVsbGVkYnksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChNb2RhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbW9kYWxDb250ZXh0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChCYXNlTW9kYWwsIHtcbiAgICAgIHNob3c6IHNob3csXG4gICAgICByZWY6IHJlZixcbiAgICAgIGJhY2tkcm9wOiBiYWNrZHJvcCxcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAga2V5Ym9hcmQ6IGtleWJvYXJkLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBlbmZvcmNlRm9jdXM6IGVuZm9yY2VGb2N1cyAmJiAhc2Nyb2xsLFxuICAgICAgcmVzdG9yZUZvY3VzOiByZXN0b3JlRm9jdXMsXG4gICAgICByZXN0b3JlRm9jdXNPcHRpb25zOiByZXN0b3JlRm9jdXNPcHRpb25zLFxuICAgICAgb25Fc2NhcGVLZXlEb3duOiBvbkVzY2FwZUtleURvd24sXG4gICAgICBvblNob3c6IG9uU2hvdyxcbiAgICAgIG9uSGlkZTogaGFuZGxlSGlkZSxcbiAgICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgICAgb25FbnRlcmluZzogb25FbnRlcmluZyxcbiAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkLFxuICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICBvbkV4aXRpbmc6IG9uRXhpdGluZyxcbiAgICAgIG9uRXhpdGVkOiBoYW5kbGVFeGl0ZWQsXG4gICAgICBtYW5hZ2VyOiBnZXRNb2RhbE1hbmFnZXIoKSxcbiAgICAgIHRyYW5zaXRpb246IERpYWxvZ1RyYW5zaXRpb24sXG4gICAgICBiYWNrZHJvcFRyYW5zaXRpb246IEJhY2tkcm9wVHJhbnNpdGlvbixcbiAgICAgIHJlbmRlckJhY2tkcm9wOiByZW5kZXJCYWNrZHJvcCxcbiAgICAgIHJlbmRlckRpYWxvZzogcmVuZGVyRGlhbG9nXG4gICAgfSlcbiAgfSk7XG59KTtcbk9mZmNhbnZhcy5kaXNwbGF5TmFtZSA9ICdPZmZjYW52YXMnO1xuT2ZmY2FudmFzLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oT2ZmY2FudmFzLCB7XG4gIEJvZHk6IE9mZmNhbnZhc0JvZHksXG4gIEhlYWRlcjogT2ZmY2FudmFzSGVhZGVyLFxuICBUaXRsZTogT2ZmY2FudmFzVGl0bGVcbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdvZmZjYW52YXMtYm9keScpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBBYnN0cmFjdE1vZGFsSGVhZGVyIGZyb20gJy4vQWJzdHJhY3RNb2RhbEhlYWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogZmFsc2Vcbn07XG5jb25zdCBPZmZjYW52YXNIZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnb2ZmY2FudmFzLWhlYWRlcicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQWJzdHJhY3RNb2RhbEhlYWRlciwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzUHJlZml4KVxuICB9KTtcbn0pO1xuT2ZmY2FudmFzSGVhZGVyLmRpc3BsYXlOYW1lID0gJ09mZmNhbnZhc0hlYWRlcic7XG5PZmZjYW52YXNIZWFkZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzSGVhZGVyOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuaW1wb3J0IGRpdldpdGhDbGFzc05hbWUgZnJvbSAnLi9kaXZXaXRoQ2xhc3NOYW1lJztcbmNvbnN0IERpdlN0eWxlZEFzSDUgPSBkaXZXaXRoQ2xhc3NOYW1lKCdoNScpO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdvZmZjYW52YXMtdGl0bGUnLCB7XG4gIENvbXBvbmVudDogRGl2U3R5bGVkQXNINVxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBFTlRFUkVELCBFTlRFUklORywgRVhJVElORyB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdHJhbnNpdGlvbkVuZExpc3RlbmVyIGZyb20gJy4vdHJhbnNpdGlvbkVuZExpc3RlbmVyJztcbmltcG9ydCBUcmFuc2l0aW9uV3JhcHBlciBmcm9tICcuL1RyYW5zaXRpb25XcmFwcGVyJztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBpbjogZmFsc2UsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICBhcHBlYXI6IGZhbHNlXG59O1xuY29uc3QgdHJhbnNpdGlvblN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3cnLFxuICBbRU5URVJFRF06ICdzaG93J1xufTtcbmNvbnN0IE9mZmNhbnZhc1RvZ2dsaW5nID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdvZmZjYW52YXMnKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFRyYW5zaXRpb25XcmFwcGVyLCB7XG4gICAgcmVmOiByZWYsXG4gICAgYWRkRW5kTGlzdGVuZXI6IHRyYW5zaXRpb25FbmRMaXN0ZW5lcixcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZFJlZjogY2hpbGRyZW4ucmVmLFxuICAgIGNoaWxkcmVuOiAoc3RhdHVzLCBpbm5lclByb3BzKSA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7IC4uLmlubmVyUHJvcHMsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBjaGlsZHJlbi5wcm9wcy5jbGFzc05hbWUsIChzdGF0dXMgPT09IEVOVEVSSU5HIHx8IHN0YXR1cyA9PT0gRVhJVElORykgJiYgYCR7YnNQcmVmaXh9LXRvZ2dsaW5nYCwgdHJhbnNpdGlvblN0eWxlc1tzdGF0dXNdKVxuICAgIH0pXG4gIH0pO1xufSk7XG5PZmZjYW52YXNUb2dnbGluZy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5PZmZjYW52YXNUb2dnbGluZy5kaXNwbGF5TmFtZSA9ICdPZmZjYW52YXNUb2dnbGluZyc7XG5leHBvcnQgZGVmYXVsdCBPZmZjYW52YXNUb2dnbGluZzsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBCYXNlT3ZlcmxheSBmcm9tICdAcmVzdGFydC91aS9PdmVybGF5JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuaW1wb3J0IHVzZU92ZXJsYXlPZmZzZXQgZnJvbSAnLi91c2VPdmVybGF5T2Zmc2V0JztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgc2FmZUZpbmRET01Ob2RlIGZyb20gJy4vc2FmZUZpbmRET01Ob2RlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHRyYW5zaXRpb246IEZhZGUsXG4gIHJvb3RDbG9zZTogZmFsc2UsXG4gIHNob3c6IGZhbHNlLFxuICBwbGFjZW1lbnQ6ICd0b3AnXG59O1xuXG5mdW5jdGlvbiB3cmFwUmVmcyhwcm9wcywgYXJyb3dQcm9wcykge1xuICBjb25zdCB7XG4gICAgcmVmXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIHJlZjogYVJlZlxuICB9ID0gYXJyb3dQcm9wcztcblxuICBwcm9wcy5yZWYgPSByZWYuX193cmFwcGVkIHx8IChyZWYuX193cmFwcGVkID0gciA9PiByZWYoc2FmZUZpbmRET01Ob2RlKHIpKSk7XG5cbiAgYXJyb3dQcm9wcy5yZWYgPSBhUmVmLl9fd3JhcHBlZCB8fCAoYVJlZi5fX3dyYXBwZWQgPSByID0+IGFSZWYoc2FmZUZpbmRET01Ob2RlKHIpKSk7XG59XG5cbmNvbnN0IE92ZXJsYXkgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBjaGlsZHJlbjogb3ZlcmxheSxcbiAgdHJhbnNpdGlvbixcbiAgcG9wcGVyQ29uZmlnID0ge30sXG4gIC4uLm91dGVyUHJvcHNcbn0sIG91dGVyUmVmKSA9PiB7XG4gIGNvbnN0IHBvcHBlclJlZiA9IHVzZVJlZih7fSk7XG4gIGNvbnN0IFtyZWYsIG1vZGlmaWVyc10gPSB1c2VPdmVybGF5T2Zmc2V0KCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlZFJlZnMob3V0ZXJSZWYsIHJlZik7XG4gIGNvbnN0IGFjdHVhbFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uID09PSB0cnVlID8gRmFkZSA6IHRyYW5zaXRpb24gfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQmFzZU92ZXJsYXksIHsgLi4ub3V0ZXJQcm9wcyxcbiAgICByZWY6IG1lcmdlZFJlZixcbiAgICBwb3BwZXJDb25maWc6IHsgLi4ucG9wcGVyQ29uZmlnLFxuICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMuY29uY2F0KHBvcHBlckNvbmZpZy5tb2RpZmllcnMgfHwgW10pXG4gICAgfSxcbiAgICB0cmFuc2l0aW9uOiBhY3R1YWxUcmFuc2l0aW9uLFxuICAgIGNoaWxkcmVuOiAob3ZlcmxheVByb3BzLCB7XG4gICAgICBhcnJvd1Byb3BzLFxuICAgICAgcGxhY2VtZW50LFxuICAgICAgcG9wcGVyOiBwb3BwZXJPYmosXG4gICAgICBzaG93XG4gICAgfSkgPT4ge1xuICAgICAgdmFyIF9wb3BwZXJPYmokc3RhdGUsIF9wb3BwZXJPYmokc3RhdGUkbW9kaTtcblxuICAgICAgd3JhcFJlZnMob3ZlcmxheVByb3BzLCBhcnJvd1Byb3BzKTtcbiAgICAgIGNvbnN0IHBvcHBlciA9IE9iamVjdC5hc3NpZ24ocG9wcGVyUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgc3RhdGU6IHBvcHBlck9iaiA9PSBudWxsID8gdm9pZCAwIDogcG9wcGVyT2JqLnN0YXRlLFxuICAgICAgICBzY2hlZHVsZVVwZGF0ZTogcG9wcGVyT2JqID09IG51bGwgPyB2b2lkIDAgOiBwb3BwZXJPYmoudXBkYXRlLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG91dE9mQm91bmRhcmllczogKHBvcHBlck9iaiA9PSBudWxsID8gdm9pZCAwIDogKF9wb3BwZXJPYmokc3RhdGUgPSBwb3BwZXJPYmouc3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiAoX3BvcHBlck9iaiRzdGF0ZSRtb2RpID0gX3BvcHBlck9iaiRzdGF0ZS5tb2RpZmllcnNEYXRhLmhpZGUpID09IG51bGwgPyB2b2lkIDAgOiBfcG9wcGVyT2JqJHN0YXRlJG1vZGkuaXNSZWZlcmVuY2VIaWRkZW4pIHx8IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2Ygb3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG92ZXJsYXkoeyAuLi5vdmVybGF5UHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgc2hvdyxcbiAgICAgICAgLi4uKCF0cmFuc2l0aW9uICYmIHNob3cgJiYge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3Nob3cnXG4gICAgICAgIH0pLFxuICAgICAgICBwb3BwZXIsXG4gICAgICAgIGFycm93UHJvcHNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQob3ZlcmxheSwgeyAuLi5vdmVybGF5UHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgYXJyb3dQcm9wcyxcbiAgICAgICAgcG9wcGVyLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMob3ZlcmxheS5wcm9wcy5jbGFzc05hbWUsICF0cmFuc2l0aW9uICYmIHNob3cgJiYgJ3Nob3cnKSxcbiAgICAgICAgc3R5bGU6IHsgLi4ub3ZlcmxheS5wcm9wcy5zdHlsZSxcbiAgICAgICAgICAuLi5vdmVybGF5UHJvcHMuc3R5bGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn0pO1xuT3ZlcmxheS5kaXNwbGF5TmFtZSA9ICdPdmVybGF5Jztcbk92ZXJsYXkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT3ZlcmxheTsiLCJpbXBvcnQgY29udGFpbnMgZnJvbSAnZG9tLWhlbHBlcnMvY29udGFpbnMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZVRpbWVvdXQgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlVGltZW91dCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZFByb3AgfSBmcm9tICd1bmNvbnRyb2xsYWJsZSc7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCBPdmVybGF5IGZyb20gJy4vT3ZlcmxheSc7XG5pbXBvcnQgc2FmZUZpbmRET01Ob2RlIGZyb20gJy4vc2FmZUZpbmRET01Ob2RlJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuZnVuY3Rpb24gbm9ybWFsaXplRGVsYXkoZGVsYXkpIHtcbiAgcmV0dXJuIGRlbGF5ICYmIHR5cGVvZiBkZWxheSA9PT0gJ29iamVjdCcgPyBkZWxheSA6IHtcbiAgICBzaG93OiBkZWxheSxcbiAgICBoaWRlOiBkZWxheVxuICB9O1xufSAvLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgbW91c2VFbnRlciBhbmQgbW91c2VMZWF2ZS5cbi8vIFJlYWN0J3MgYnVpbHQgdmVyc2lvbiBpcyBicm9rZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNDI1MVxuLy8gZm9yIGNhc2VzIHdoZW4gdGhlIHRyaWdnZXIgaXMgZGlzYWJsZWQgYW5kIG1vdXNlT3V0L092ZXIgY2FuIGNhdXNlIGZsaWNrZXJcbi8vIG1vdmluZyBmcm9tIG9uZSBjaGlsZCBlbGVtZW50IHRvIGFub3RoZXIuXG5cblxuZnVuY3Rpb24gaGFuZGxlTW91c2VPdmVyT3V0KCAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuaGFuZGxlciwgYXJncywgcmVsYXRlZE5hdGl2ZSkge1xuICBjb25zdCBbZV0gPSBhcmdzO1xuICBjb25zdCB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IHJlbGF0ZWQgPSBlLnJlbGF0ZWRUYXJnZXQgfHwgZS5uYXRpdmVFdmVudFtyZWxhdGVkTmF0aXZlXTtcblxuICBpZiAoKCFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IHRhcmdldCkgJiYgIWNvbnRhaW5zKHRhcmdldCwgcmVsYXRlZCkpIHtcbiAgICBoYW5kbGVyKC4uLmFyZ3MpO1xuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdFNob3c6IGZhbHNlLFxuICB0cmlnZ2VyOiBbJ2hvdmVyJywgJ2ZvY3VzJ11cbn07XG5cbmZ1bmN0aW9uIE92ZXJsYXlUcmlnZ2VyKHtcbiAgdHJpZ2dlcixcbiAgb3ZlcmxheSxcbiAgY2hpbGRyZW4sXG4gIHBvcHBlckNvbmZpZyA9IHt9LFxuICBzaG93OiBwcm9wc1Nob3csXG4gIGRlZmF1bHRTaG93ID0gZmFsc2UsXG4gIG9uVG9nZ2xlLFxuICBkZWxheTogcHJvcHNEZWxheSxcbiAgcGxhY2VtZW50LFxuICBmbGlwID0gcGxhY2VtZW50ICYmIHBsYWNlbWVudC5pbmRleE9mKCdhdXRvJykgIT09IC0xLFxuICAuLi5wcm9wc1xufSkge1xuICBjb25zdCB0cmlnZ2VyTm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VkUmVmcyh0cmlnZ2VyTm9kZVJlZiwgY2hpbGRyZW4ucmVmKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXQoKTtcbiAgY29uc3QgaG92ZXJTdGF0ZVJlZiA9IHVzZVJlZignJyk7XG4gIGNvbnN0IFtzaG93LCBzZXRTaG93XSA9IHVzZVVuY29udHJvbGxlZFByb3AocHJvcHNTaG93LCBkZWZhdWx0U2hvdywgb25Ub2dnbGUpO1xuICBjb25zdCBkZWxheSA9IG5vcm1hbGl6ZURlbGF5KHByb3BzRGVsYXkpO1xuICBjb25zdCB7XG4gICAgb25Gb2N1cyxcbiAgICBvbkJsdXIsXG4gICAgb25DbGlja1xuICB9ID0gdHlwZW9mIGNoaWxkcmVuICE9PSAnZnVuY3Rpb24nID8gUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbikucHJvcHMgOiB7fTtcblxuICBjb25zdCBhdHRhY2hSZWYgPSByID0+IHtcbiAgICBtZXJnZWRSZWYoc2FmZUZpbmRET01Ob2RlKHIpKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTaG93ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHRpbWVvdXQuY2xlYXIoKTtcbiAgICBob3ZlclN0YXRlUmVmLmN1cnJlbnQgPSAnc2hvdyc7XG5cbiAgICBpZiAoIWRlbGF5LnNob3cpIHtcbiAgICAgIHNldFNob3codHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZW91dC5zZXQoKCkgPT4ge1xuICAgICAgaWYgKGhvdmVyU3RhdGVSZWYuY3VycmVudCA9PT0gJ3Nob3cnKSBzZXRTaG93KHRydWUpO1xuICAgIH0sIGRlbGF5LnNob3cpO1xuICB9LCBbZGVsYXkuc2hvdywgc2V0U2hvdywgdGltZW91dF0pO1xuICBjb25zdCBoYW5kbGVIaWRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHRpbWVvdXQuY2xlYXIoKTtcbiAgICBob3ZlclN0YXRlUmVmLmN1cnJlbnQgPSAnaGlkZSc7XG5cbiAgICBpZiAoIWRlbGF5LmhpZGUpIHtcbiAgICAgIHNldFNob3coZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVvdXQuc2V0KCgpID0+IHtcbiAgICAgIGlmIChob3ZlclN0YXRlUmVmLmN1cnJlbnQgPT09ICdoaWRlJykgc2V0U2hvdyhmYWxzZSk7XG4gICAgfSwgZGVsYXkuaGlkZSk7XG4gIH0sIFtkZWxheS5oaWRlLCBzZXRTaG93LCB0aW1lb3V0XSk7XG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICBoYW5kbGVTaG93KCk7XG4gICAgb25Gb2N1cyA9PSBudWxsID8gdm9pZCAwIDogb25Gb2N1cyguLi5hcmdzKTtcbiAgfSwgW2hhbmRsZVNob3csIG9uRm9jdXNdKTtcbiAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUNhbGxiYWNrKCguLi5hcmdzKSA9PiB7XG4gICAgaGFuZGxlSGlkZSgpO1xuICAgIG9uQmx1ciA9PSBudWxsID8gdm9pZCAwIDogb25CbHVyKC4uLmFyZ3MpO1xuICB9LCBbaGFuZGxlSGlkZSwgb25CbHVyXSk7XG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICBzZXRTaG93KCFzaG93KTtcbiAgICBvbkNsaWNrID09IG51bGwgPyB2b2lkIDAgOiBvbkNsaWNrKC4uLmFyZ3MpO1xuICB9LCBbb25DbGljaywgc2V0U2hvdywgc2hvd10pO1xuICBjb25zdCBoYW5kbGVNb3VzZU92ZXIgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIGhhbmRsZU1vdXNlT3Zlck91dChoYW5kbGVTaG93LCBhcmdzLCAnZnJvbUVsZW1lbnQnKTtcbiAgfSwgW2hhbmRsZVNob3ddKTtcbiAgY29uc3QgaGFuZGxlTW91c2VPdXQgPSB1c2VDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgIGhhbmRsZU1vdXNlT3Zlck91dChoYW5kbGVIaWRlLCBhcmdzLCAndG9FbGVtZW50Jyk7XG4gIH0sIFtoYW5kbGVIaWRlXSk7XG4gIGNvbnN0IHRyaWdnZXJzID0gdHJpZ2dlciA9PSBudWxsID8gW10gOiBbXS5jb25jYXQodHJpZ2dlcik7XG4gIGNvbnN0IHRyaWdnZXJQcm9wcyA9IHtcbiAgICByZWY6IGF0dGFjaFJlZlxuICB9O1xuXG4gIGlmICh0cmlnZ2Vycy5pbmRleE9mKCdjbGljaycpICE9PSAtMSkge1xuICAgIHRyaWdnZXJQcm9wcy5vbkNsaWNrID0gaGFuZGxlQ2xpY2s7XG4gIH1cblxuICBpZiAodHJpZ2dlcnMuaW5kZXhPZignZm9jdXMnKSAhPT0gLTEpIHtcbiAgICB0cmlnZ2VyUHJvcHMub25Gb2N1cyA9IGhhbmRsZUZvY3VzO1xuICAgIHRyaWdnZXJQcm9wcy5vbkJsdXIgPSBoYW5kbGVCbHVyO1xuICB9XG5cbiAgaWYgKHRyaWdnZXJzLmluZGV4T2YoJ2hvdmVyJykgIT09IC0xKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyh0cmlnZ2Vycy5sZW5ndGggPiAxLCAnW3JlYWN0LWJvb3RzdHJhcF0gU3BlY2lmeWluZyBvbmx5IHRoZSBgXCJob3ZlclwiYCB0cmlnZ2VyIGxpbWl0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgb3ZlcmxheSB0byBqdXN0IG1vdXNlIHVzZXJzLiBDb25zaWRlciBhbHNvIGluY2x1ZGluZyB0aGUgYFwiZm9jdXNcImAgdHJpZ2dlciBzbyB0aGF0IHRvdWNoIGFuZCBrZXlib2FyZCBvbmx5IHVzZXJzIGNhbiBzZWUgdGhlIG92ZXJsYXkgYXMgd2VsbC4nKSA6IHZvaWQgMDtcbiAgICB0cmlnZ2VyUHJvcHMub25Nb3VzZU92ZXIgPSBoYW5kbGVNb3VzZU92ZXI7XG4gICAgdHJpZ2dlclByb3BzLm9uTW91c2VPdXQgPSBoYW5kbGVNb3VzZU91dDtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFt0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbih0cmlnZ2VyUHJvcHMpIDogLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZHJlbiwgdHJpZ2dlclByb3BzKSwgLyojX19QVVJFX18qL19qc3goT3ZlcmxheSwgeyAuLi5wcm9wcyxcbiAgICAgIHNob3c6IHNob3csXG4gICAgICBvbkhpZGU6IGhhbmRsZUhpZGUsXG4gICAgICBmbGlwOiBmbGlwLFxuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBwb3BwZXJDb25maWc6IHBvcHBlckNvbmZpZyxcbiAgICAgIHRhcmdldDogdHJpZ2dlck5vZGVSZWYuY3VycmVudCxcbiAgICAgIGNoaWxkcmVuOiBvdmVybGF5XG4gICAgfSldXG4gIH0pO1xufVxuXG5PdmVybGF5VHJpZ2dlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBPdmVybGF5VHJpZ2dlcjsiLCIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1tdWx0aS1jb21wICovXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBBbmNob3IgZnJvbSAnQHJlc3RhcnQvdWkvQW5jaG9yJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgYWN0aXZlTGFiZWw6ICcoY3VycmVudCknXG59O1xuY29uc3QgUGFnZUl0ZW0gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhY3RpdmUsXG4gIGRpc2FibGVkLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICBhY3RpdmVMYWJlbCxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gYWN0aXZlIHx8IGRpc2FibGVkID8gJ3NwYW4nIDogQW5jaG9yO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJsaVwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsICdwYWdlLWl0ZW0nLCB7XG4gICAgICBhY3RpdmUsXG4gICAgICBkaXNhYmxlZFxuICAgIH0pLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoQ29tcG9uZW50LCB7XG4gICAgICBjbGFzc05hbWU6IFwicGFnZS1saW5rXCIsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGFjdGl2ZSAmJiBhY3RpdmVMYWJlbCAmJiAvKiNfX1BVUkVfXyovX2pzeChcInNwYW5cIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICAgIGNoaWxkcmVuOiBhY3RpdmVMYWJlbFxuICAgICAgfSldXG4gICAgfSlcbiAgfSk7XG59KTtcblBhZ2VJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblBhZ2VJdGVtLmRpc3BsYXlOYW1lID0gJ1BhZ2VJdGVtJztcbmV4cG9ydCBkZWZhdWx0IFBhZ2VJdGVtO1xuXG5mdW5jdGlvbiBjcmVhdGVCdXR0b24obmFtZSwgZGVmYXVsdFZhbHVlLCBsYWJlbCA9IG5hbWUpIHtcbiAgZnVuY3Rpb24gQnV0dG9uKHtcbiAgICBjaGlsZHJlbixcbiAgICAuLi5wcm9wc1xuICB9KSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhQYWdlSXRlbSwgeyAuLi5wcm9wcyxcbiAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IGRlZmF1bHRWYWx1ZVxuICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJ2aXN1YWxseS1oaWRkZW5cIixcbiAgICAgICAgY2hpbGRyZW46IGxhYmVsXG4gICAgICB9KV1cbiAgICB9KTtcbiAgfVxuXG4gIEJ1dHRvbi5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gIHJldHVybiBCdXR0b247XG59XG5cbmV4cG9ydCBjb25zdCBGaXJzdCA9IGNyZWF0ZUJ1dHRvbignRmlyc3QnLCAnwqsnKTtcbmV4cG9ydCBjb25zdCBQcmV2ID0gY3JlYXRlQnV0dG9uKCdQcmV2JywgJ+KAuScsICdQcmV2aW91cycpO1xuZXhwb3J0IGNvbnN0IEVsbGlwc2lzID0gY3JlYXRlQnV0dG9uKCdFbGxpcHNpcycsICfigKYnLCAnTW9yZScpO1xuZXhwb3J0IGNvbnN0IE5leHQgPSBjcmVhdGVCdXR0b24oJ05leHQnLCAn4oC6Jyk7XG5leHBvcnQgY29uc3QgTGFzdCA9IGNyZWF0ZUJ1dHRvbignTGFzdCcsICfCuycpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBQYWdlSXRlbSwgeyBFbGxpcHNpcywgRmlyc3QsIExhc3QsIE5leHQsIFByZXYgfSBmcm9tICcuL1BhZ2VJdGVtJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbi8qKlxuICogQHByb3BlcnR5IHtQYWdlSXRlbX0gSXRlbVxuICogQHByb3BlcnR5IHtQYWdlSXRlbX0gRmlyc3RcbiAqIEBwcm9wZXJ0eSB7UGFnZUl0ZW19IFByZXZcbiAqIEBwcm9wZXJ0eSB7UGFnZUl0ZW19IEVsbGlwc2lzXG4gKiBAcHJvcGVydHkge1BhZ2VJdGVtfSBOZXh0XG4gKiBAcHJvcGVydHkge1BhZ2VJdGVtfSBMYXN0XG4gKi9cbmNvbnN0IFBhZ2luYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBzaXplLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IGRlY29yYXRlZEJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAncGFnaW5hdGlvbicpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJ1bFwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGVjb3JhdGVkQnNQcmVmaXgsIHNpemUgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LSR7c2l6ZX1gKVxuICB9KTtcbn0pO1xuUGFnaW5hdGlvbi5kaXNwbGF5TmFtZSA9ICdQYWdpbmF0aW9uJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oUGFnaW5hdGlvbiwge1xuICBGaXJzdCxcbiAgUHJldixcbiAgRWxsaXBzaXMsXG4gIEl0ZW06IFBhZ2VJdGVtLFxuICBOZXh0LFxuICBMYXN0XG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlUGxhY2Vob2xkZXIgZnJvbSAnLi91c2VQbGFjZWhvbGRlcic7XG5pbXBvcnQgUGxhY2Vob2xkZXJCdXR0b24gZnJvbSAnLi9QbGFjZWhvbGRlckJ1dHRvbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgUGxhY2Vob2xkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBhczogQ29tcG9uZW50ID0gJ3NwYW4nLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IHBsYWNlaG9sZGVyUHJvcHMgPSB1c2VQbGFjZWhvbGRlcihwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChDb21wb25lbnQsIHsgLi4ucGxhY2Vob2xkZXJQcm9wcyxcbiAgICByZWY6IHJlZlxuICB9KTtcbn0pO1xuUGxhY2Vob2xkZXIuZGlzcGxheU5hbWUgPSAnUGxhY2Vob2xkZXInO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihQbGFjZWhvbGRlciwge1xuICBCdXR0b246IFBsYWNlaG9sZGVyQnV0dG9uXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB1c2VQbGFjZWhvbGRlciBmcm9tICcuL3VzZVBsYWNlaG9sZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBQbGFjZWhvbGRlckJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHBsYWNlaG9sZGVyUHJvcHMgPSB1c2VQbGFjZWhvbGRlcihwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChCdXR0b24sIHsgLi4ucGxhY2Vob2xkZXJQcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICB0YWJJbmRleDogLTFcbiAgfSk7XG59KTtcblBsYWNlaG9sZGVyQnV0dG9uLmRpc3BsYXlOYW1lID0gJ1BsYWNlaG9sZGVyQnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IFBsYWNlaG9sZGVyQnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4LCB1c2VJc1JUTCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgUG9wb3ZlckhlYWRlciBmcm9tICcuL1BvcG92ZXJIZWFkZXInO1xuaW1wb3J0IFBvcG92ZXJCb2R5IGZyb20gJy4vUG9wb3ZlckJvZHknO1xuaW1wb3J0IHsgZ2V0T3ZlcmxheURpcmVjdGlvbiB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBwbGFjZW1lbnQ6ICdyaWdodCdcbn07XG5jb25zdCBQb3BvdmVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIHBsYWNlbWVudCxcbiAgY2xhc3NOYW1lLFxuICBzdHlsZSxcbiAgY2hpbGRyZW4sXG4gIGJvZHksXG4gIGFycm93UHJvcHMsXG4gIHBvcHBlcjogXyxcbiAgc2hvdzogXzEsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgZGVjb3JhdGVkQnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICdwb3BvdmVyJyk7XG4gIGNvbnN0IGlzUlRMID0gdXNlSXNSVEwoKTtcbiAgY29uc3QgW3ByaW1hcnlQbGFjZW1lbnRdID0gKHBsYWNlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhY2VtZW50LnNwbGl0KCctJykpIHx8IFtdO1xuICBjb25zdCBic0RpcmVjdGlvbiA9IGdldE92ZXJsYXlEaXJlY3Rpb24ocHJpbWFyeVBsYWNlbWVudCwgaXNSVEwpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3hzKFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICByb2xlOiBcInRvb2x0aXBcIixcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgXCJ4LXBsYWNlbWVudFwiOiBwcmltYXJ5UGxhY2VtZW50LFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGRlY29yYXRlZEJzUHJlZml4LCBwcmltYXJ5UGxhY2VtZW50ICYmIGBicy1wb3BvdmVyLSR7YnNEaXJlY3Rpb259YCksXG4gICAgLi4ucHJvcHMsXG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwicG9wb3Zlci1hcnJvd1wiLFxuICAgICAgLi4uYXJyb3dQcm9wc1xuICAgIH0pLCBib2R5ID8gLyojX19QVVJFX18qL19qc3goUG9wb3ZlckJvZHksIHtcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pIDogY2hpbGRyZW5dXG4gIH0pO1xufSk7XG5Qb3BvdmVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oUG9wb3Zlciwge1xuICBIZWFkZXI6IFBvcG92ZXJIZWFkZXIsXG4gIEJvZHk6IFBvcG92ZXJCb2R5LFxuICAvLyBEZWZhdWx0IHBvcG92ZXIgb2Zmc2V0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi81YzMyNzY3ZTBlMGRiYWMyZDkzNGJjZGVlMDM3MTlhNjVkM2YxMTg3L2pzL3NyYy9wb3BvdmVyLmpzI0wyOFxuICBQT1BQRVJfT0ZGU0VUOiBbMCwgOF1cbn0pOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCdwb3BvdmVyLWJvZHknKTsiLCJpbXBvcnQgY3JlYXRlV2l0aEJzUHJlZml4IGZyb20gJy4vY3JlYXRlV2l0aEJzUHJlZml4JztcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdpdGhCc1ByZWZpeCgncG9wb3Zlci1oZWFkZXInKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNsb25lRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuL0VsZW1lbnRDaGlsZHJlbic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgUk9VTkRfUFJFQ0lTSU9OID0gMTAwMDtcbi8qKlxuICogVmFsaWRhdGUgdGhhdCBjaGlsZHJlbiwgaWYgYW55LCBhcmUgaW5zdGFuY2VzIG9mIGA8UHJvZ3Jlc3NCYXI+YC5cbiAqL1xuXG5mdW5jdGlvbiBvbmx5UHJvZ3Jlc3NCYXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICghY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBlcnJvciA9IG51bGw7XG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcGFyZSB0eXBlcyBpbiBhIHdheSB0aGF0IHdvcmtzIHdpdGggbGlicmFyaWVzIHRoYXQgcGF0Y2ggYW5kIHByb3h5XG4gICAgICogY29tcG9uZW50cyBsaWtlIHJlYWN0LWhvdC1sb2FkZXIuXG4gICAgICpcbiAgICAgKiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dhZWFyb24vcmVhY3QtaG90LWxvYWRlciNjaGVja2luZy1lbGVtZW50LXR5cGVzXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuXG5cbiAgICBjb25zdCBlbGVtZW50ID0gLyojX19QVVJFX18qL19qc3goUHJvZ3Jlc3NCYXIsIHt9KTtcblxuICAgIGlmIChjaGlsZC50eXBlID09PSBlbGVtZW50LnR5cGUpIHJldHVybjtcbiAgICBjb25zdCBjaGlsZFR5cGUgPSBjaGlsZC50eXBlO1xuICAgIGNvbnN0IGNoaWxkSWRlbnRpZmllciA9IC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkgPyBjaGlsZFR5cGUuZGlzcGxheU5hbWUgfHwgY2hpbGRUeXBlLm5hbWUgfHwgY2hpbGRUeXBlIDogY2hpbGQ7XG4gICAgZXJyb3IgPSBuZXcgRXJyb3IoYENoaWxkcmVuIG9mICR7Y29tcG9uZW50TmFtZX0gY2FuIGNvbnRhaW4gb25seSBQcm9ncmVzc0JhciBgICsgYGNvbXBvbmVudHMuIEZvdW5kICR7Y2hpbGRJZGVudGlmaWVyfS5gKTtcbiAgfSk7XG4gIHJldHVybiBlcnJvcjtcbn1cblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBtaW46IDAsXG4gIG1heDogMTAwLFxuICBhbmltYXRlZDogZmFsc2UsXG4gIGlzQ2hpbGQ6IGZhbHNlLFxuICB2aXN1YWxseUhpZGRlbjogZmFsc2UsXG4gIHN0cmlwZWQ6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpIHtcbiAgY29uc3QgcGVyY2VudGFnZSA9IChub3cgLSBtaW4pIC8gKG1heCAtIG1pbikgKiAxMDA7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiBST1VORF9QUkVDSVNJT04pIC8gUk9VTkRfUFJFQ0lTSU9OO1xufVxuXG5mdW5jdGlvbiByZW5kZXJQcm9ncmVzc0Jhcih7XG4gIG1pbixcbiAgbm93LFxuICBtYXgsXG4gIGxhYmVsLFxuICB2aXN1YWxseUhpZGRlbixcbiAgc3RyaXBlZCxcbiAgYW5pbWF0ZWQsXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gIHZhcmlhbnQsXG4gIGJzUHJlZml4LFxuICAuLi5wcm9wc1xufSwgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke2JzUHJlZml4fS1iYXJgLCB7XG4gICAgICBbYGJnLSR7dmFyaWFudH1gXTogdmFyaWFudCxcbiAgICAgIFtgJHtic1ByZWZpeH0tYmFyLWFuaW1hdGVkYF06IGFuaW1hdGVkLFxuICAgICAgW2Ake2JzUHJlZml4fS1iYXItc3RyaXBlZGBdOiBhbmltYXRlZCB8fCBzdHJpcGVkXG4gICAgfSksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBgJHtnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpfSVgLFxuICAgICAgLi4uc3R5bGVcbiAgICB9LFxuICAgIFwiYXJpYS12YWx1ZW5vd1wiOiBub3csXG4gICAgXCJhcmlhLXZhbHVlbWluXCI6IG1pbixcbiAgICBcImFyaWEtdmFsdWVtYXhcIjogbWF4LFxuICAgIGNoaWxkcmVuOiB2aXN1YWxseUhpZGRlbiA/IC8qI19fUFVSRV9fKi9fanN4KFwic3BhblwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG4gICAgICBjaGlsZHJlbjogbGFiZWxcbiAgICB9KSA6IGxhYmVsXG4gIH0pO1xufVxuXG5jb25zdCBQcm9ncmVzc0JhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGlzQ2hpbGQsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgcHJvcHMuYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgocHJvcHMuYnNQcmVmaXgsICdwcm9ncmVzcycpO1xuXG4gIGlmIChpc0NoaWxkKSB7XG4gICAgcmV0dXJuIHJlbmRlclByb2dyZXNzQmFyKHByb3BzLCByZWYpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIG1pbixcbiAgICBub3csXG4gICAgbWF4LFxuICAgIGxhYmVsLFxuICAgIHZpc3VhbGx5SGlkZGVuLFxuICAgIHN0cmlwZWQsXG4gICAgYW5pbWF0ZWQsXG4gICAgYnNQcmVmaXgsXG4gICAgdmFyaWFudCxcbiAgICBjbGFzc05hbWUsXG4gICAgY2hpbGRyZW4sXG4gICAgLi4ud3JhcHBlclByb3BzXG4gIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICByZWY6IHJlZixcbiAgICAuLi53cmFwcGVyUHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYnNQcmVmaXgpLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiA/IG1hcChjaGlsZHJlbiwgY2hpbGQgPT4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgaXNDaGlsZDogdHJ1ZVxuICAgIH0pKSA6IHJlbmRlclByb2dyZXNzQmFyKHtcbiAgICAgIG1pbixcbiAgICAgIG5vdyxcbiAgICAgIG1heCxcbiAgICAgIGxhYmVsLFxuICAgICAgdmlzdWFsbHlIaWRkZW4sXG4gICAgICBzdHJpcGVkLFxuICAgICAgYW5pbWF0ZWQsXG4gICAgICBic1ByZWZpeCxcbiAgICAgIHZhcmlhbnRcbiAgICB9LCByZWYpXG4gIH0pO1xufSk7XG5Qcm9ncmVzc0Jhci5kaXNwbGF5TmFtZSA9ICdQcm9ncmVzc0Jhcic7XG5Qcm9ncmVzc0Jhci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0JhcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBhc3BlY3RSYXRpbzogJzF4MSdcbn07XG5cbmZ1bmN0aW9uIHRvUGVyY2VudChudW0pIHtcbiAgaWYgKG51bSA8PSAwIHx8IG51bSA+IDEwMCkgcmV0dXJuICcxMDAlJztcbiAgaWYgKG51bSA8IDEpIHJldHVybiBgJHtudW0gKiAxMDB9JWA7XG4gIHJldHVybiBgJHtudW19JWA7XG59XG5cbmNvbnN0IFJhdGlvID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGFzcGVjdFJhdGlvLFxuICBzdHlsZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3JhdGlvJyk7XG4gIGNvbnN0IGlzQ3VzdG9tUmF0aW8gPSB0eXBlb2YgYXNwZWN0UmF0aW8gPT09ICdudW1iZXInO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIHN0eWxlOiB7IC4uLnN0eWxlLFxuICAgICAgLi4uKGlzQ3VzdG9tUmF0aW8gJiYge1xuICAgICAgICAnLS1icy1hc3BlY3QtcmF0aW8nOiB0b1BlcmNlbnQoYXNwZWN0UmF0aW8pXG4gICAgICB9KVxuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGJzUHJlZml4LCBjbGFzc05hbWUsICFpc0N1c3RvbVJhdGlvICYmIGAke2JzUHJlZml4fS0ke2FzcGVjdFJhdGlvfWApLFxuICAgIGNoaWxkcmVuOiBSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKVxuICB9KTtcbn0pO1xuUmF0aW8uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgUmF0aW87IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IERFVklDRV9TSVpFUyA9IFsneHhsJywgJ3hsJywgJ2xnJywgJ21kJywgJ3NtJywgJ3hzJ107XG5jb25zdCBSb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBkZWNvcmF0ZWRCc1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3JvdycpO1xuICBjb25zdCBzaXplUHJlZml4ID0gYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LWNvbHNgO1xuICBjb25zdCBjbGFzc2VzID0gW107XG4gIERFVklDRV9TSVpFUy5mb3JFYWNoKGJya1BvaW50ID0+IHtcbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1ticmtQb2ludF07XG4gICAgZGVsZXRlIHByb3BzW2Jya1BvaW50XTtcbiAgICBsZXQgY29scztcblxuICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgKHtcbiAgICAgICAgY29sc1xuICAgICAgfSA9IHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHMgPSBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgaWYgKGNvbHMgIT0gbnVsbCkgY2xhc3Nlcy5wdXNoKGAke3NpemVQcmVmaXh9JHtpbmZpeH0tJHtjb2xzfWApO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGRlY29yYXRlZEJzUHJlZml4LCAuLi5jbGFzc2VzKVxuICB9KTtcbn0pO1xuUm93LmRpc3BsYXlOYW1lID0gJ1Jvdyc7XG5leHBvcnQgZGVmYXVsdCBSb3c7IiwiaW1wb3J0IHsgU1NSUHJvdmlkZXIgfSBmcm9tICdAcmVzdGFydC91aS9zc3InO1xuZXhwb3J0IGRlZmF1bHQgU1NSUHJvdmlkZXI7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFNwaW5uZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgdmFyaWFudCxcbiAgYW5pbWF0aW9uLFxuICBzaXplLFxuICAvLyBOZWVkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBcImFzXCIgZHVyaW5nIHByb3AgZGVzdHJ1Y3R1cmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggc3R5bGVkLWNvbXBvbmVudHMgZ2l0aHViLmNvbS9yZWFjdC1ib290c3RyYXAvcmVhY3QtYm9vdHN0cmFwL2lzc3Vlcy8zNTk1XG4gIGFzOiBDb21wb25lbnQgPSAnZGl2JyxcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnc3Bpbm5lcicpO1xuICBjb25zdCBic1NwaW5uZXJQcmVmaXggPSBgJHtic1ByZWZpeH0tJHthbmltYXRpb259YDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhjbGFzc05hbWUsIGJzU3Bpbm5lclByZWZpeCwgc2l6ZSAmJiBgJHtic1NwaW5uZXJQcmVmaXh9LSR7c2l6ZX1gLCB2YXJpYW50ICYmIGB0ZXh0LSR7dmFyaWFudH1gKVxuICB9KTtcbn0pO1xuU3Bpbm5lci5kaXNwbGF5TmFtZSA9ICdTcGlubmVyJztcbmV4cG9ydCBkZWZhdWx0IFNwaW5uZXI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9CdXR0b24nO1xuaW1wb3J0IEJ1dHRvbkdyb3VwIGZyb20gJy4vQnV0dG9uR3JvdXAnO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4vRHJvcGRvd24nO1xuaW1wb3J0IHsgYWxpZ25Qcm9wVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFuIGh0bWwgaWQgYXR0cmlidXRlIGZvciB0aGUgVG9nZ2xlIGJ1dHRvbiwgbmVjZXNzYXJ5IGZvciBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBzdWNoIGFzIHNjcmVlbiByZWFkZXJzLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgdG9nZ2xlOyB0aGUgdmFsdWUgb2YgYHRpdGxlYCBpZiBub3Qgc3BlY2lmaWVkLlxuICAgKi9cbiAgdG9nZ2xlTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGBocmVmYCBwYXNzZWQgdG8gdGhlIG5vbi10b2dnbGUgQnV0dG9uICovXG4gIGhyZWY6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGFuY2hvciBgdGFyZ2V0YCBwYXNzZWQgdG8gdGhlIG5vbi10b2dnbGUgQnV0dG9uICovXG4gIHRhcmdldDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gYG9uQ2xpY2tgIGhhbmRsZXIgcGFzc2VkIHRvIHRoZSBub24tdG9nZ2xlIEJ1dHRvbiAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogVGhlIGNvbnRlbnQgb2YgdGhlIG5vbi10b2dnbGUgQnV0dG9uLiAgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqIEEgYHR5cGVgIHBhc3NlZCB0byB0aGUgbm9uLXRvZ2dsZSBCdXR0b24gKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRGlzYWJsZXMgYm90aCBCdXR0b25zICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEFsaWducyB0aGUgZHJvcGRvd24gbWVudS5cbiAgICpcbiAgICogX3NlZSBbRHJvcGRvd25NZW51XSgjZHJvcGRvd24tbWVudS1wcm9wcykgZm9yIG1vcmUgZGV0YWlsc19cbiAgICpcbiAgICogQHR5cGUge1wic3RhcnRcInxcImVuZFwifHsgc206IFwic3RhcnRcInxcImVuZFwiIH18eyBtZDogXCJzdGFydFwifFwiZW5kXCIgfXx7IGxnOiBcInN0YXJ0XCJ8XCJlbmRcIiB9fHsgeGw6IFwic3RhcnRcInxcImVuZFwifXx7IHh4bDogXCJzdGFydFwifFwiZW5kXCJ9IH1cbiAgICovXG4gIGFsaWduOiBhbGlnblByb3BUeXBlLFxuXG4gIC8qKiBBbiBBUklBIGFjY2Vzc2libGUgcm9sZSBhcHBsaWVkIHRvIHRoZSBNZW51IGNvbXBvbmVudC4gV2hlbiBzZXQgdG8gJ21lbnUnLCBUaGUgZHJvcGRvd24gKi9cbiAgbWVudVJvbGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBkcm9wZG93biBtZW51IGluIHRoZSBET00gYmVmb3JlIHRoZSBmaXJzdCB0aW1lIGl0IGlzIHNob3duICovXG4gIHJlbmRlck1lbnVPbk1vdW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogIFdoaWNoIGV2ZW50IHdoZW4gZmlyZWQgb3V0c2lkZSB0aGUgY29tcG9uZW50IHdpbGwgY2F1c2UgaXQgdG8gYmUgY2xvc2VkLlxuICAgKlxuICAgKiBfc2VlIFtEcm9wZG93bk1lbnVdKCNkcm9wZG93bi1tZW51LXByb3BzKSBmb3IgbW9yZSBkZXRhaWxzX1xuICAgKi9cbiAgcm9vdENsb3NlRXZlbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYnNQcmVmaXg6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQGlnbm9yZSAqL1xuICBzaXplOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICB0b2dnbGVMYWJlbDogJ1RvZ2dsZSBkcm9wZG93bicsXG4gIHR5cGU6ICdidXR0b24nXG59O1xuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGNvbXBvbmVudCBmb3Igc2ltcGxlIG9yIGdlbmVyYWwgdXNlIHNwbGl0IGJ1dHRvbiBkcm9wZG93bnMuIFJlbmRlcnMgYVxuICogYEJ1dHRvbkdyb3VwYCBjb250YWluaW5nIGEgYEJ1dHRvbmAgYW5kIGEgYEJ1dHRvbmAgdG9nZ2xlIGZvciB0aGUgYERyb3Bkb3duYC4gQWxsIGBjaGlsZHJlbmBcbiAqIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRlZmF1bHQgYERyb3Bkb3duLk1lbnVgLiBUaGlzIGNvbXBvbmVudCBhY2NlcHRzIGFsbCBvZiBbYERyb3Bkb3duYCdzXG4gKiBwcm9wc10oI2Ryb3Bkb3duLXByb3BzKS5cbiAqXG4gKiBfQWxsIHVua25vd24gcHJvcHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgRHJvcGRvd25gIGNvbXBvbmVudC5fXG4gKiBUaGUgQnV0dG9uIGB2YXJpYW50YCwgYHNpemVgIGFuZCBgYnNQcmVmaXhgIHByb3BzIGFyZSBwYXNzZWQgdG8gdGhlIGJ1dHRvbiBhbmQgdG9nZ2xlLFxuICogYW5kIG1lbnUtcmVsYXRlZCBwcm9wcyBhcmUgcGFzc2VkIHRvIHRoZSBgRHJvcGRvd24uTWVudWBcbiAqL1xuXG5jb25zdCBTcGxpdEJ1dHRvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGlkLFxuICBic1ByZWZpeCxcbiAgc2l6ZSxcbiAgdmFyaWFudCxcbiAgdGl0bGUsXG4gIHR5cGUsXG4gIHRvZ2dsZUxhYmVsLFxuICBjaGlsZHJlbixcbiAgb25DbGljayxcbiAgaHJlZixcbiAgdGFyZ2V0LFxuICBtZW51Um9sZSxcbiAgcmVuZGVyTWVudU9uTW91bnQsXG4gIHJvb3RDbG9zZUV2ZW50LFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeHMoRHJvcGRvd24sIHtcbiAgcmVmOiByZWYsXG4gIC4uLnByb3BzLFxuICBhczogQnV0dG9uR3JvdXAsXG4gIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goQnV0dG9uLCB7XG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICBic1ByZWZpeDogYnNQcmVmaXgsXG4gICAgaHJlZjogaHJlZixcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgY2hpbGRyZW46IHRpdGxlXG4gIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5Ub2dnbGUsIHtcbiAgICBzcGxpdDogdHJ1ZSxcbiAgICBpZDogaWQsXG4gICAgc2l6ZTogc2l6ZSxcbiAgICB2YXJpYW50OiB2YXJpYW50LFxuICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICBjaGlsZEJzUHJlZml4OiBic1ByZWZpeCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJzcGFuXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJ2aXN1YWxseS1oaWRkZW5cIixcbiAgICAgIGNoaWxkcmVuOiB0b2dnbGVMYWJlbFxuICAgIH0pXG4gIH0pLCAvKiNfX1BVUkVfXyovX2pzeChEcm9wZG93bi5NZW51LCB7XG4gICAgcm9sZTogbWVudVJvbGUsXG4gICAgcmVuZGVyT25Nb3VudDogcmVuZGVyTWVudU9uTW91bnQsXG4gICAgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9KV1cbn0pKTtcblNwbGl0QnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblNwbGl0QnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblNwbGl0QnV0dG9uLmRpc3BsYXlOYW1lID0gJ1NwbGl0QnV0dG9uJztcbmV4cG9ydCBkZWZhdWx0IFNwbGl0QnV0dG9uOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBjcmVhdGVVdGlsaXR5Q2xhc3NOYW1lLCB7IHJlc3BvbnNpdmVQcm9wVHlwZSB9IGZyb20gJy4vY3JlYXRlVXRpbGl0eUNsYXNzZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFN0YWNrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYXM6IENvbXBvbmVudCA9ICdkaXYnLFxuICBic1ByZWZpeCxcbiAgY2xhc3NOYW1lLFxuICBkaXJlY3Rpb24sXG4gIGdhcCxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnaHN0YWNrJyA6ICd2c3RhY2snKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwgeyAuLi5wcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgLi4uY3JlYXRlVXRpbGl0eUNsYXNzTmFtZSh7XG4gICAgICBnYXBcbiAgICB9KSlcbiAgfSk7XG59KTtcblN0YWNrLmRpc3BsYXlOYW1lID0gJ1N0YWNrJztcbmV4cG9ydCBkZWZhdWx0IFN0YWNrOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBGb3JtQ2hlY2sgZnJvbSAnLi9Gb3JtQ2hlY2snO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IFN3aXRjaCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiAvKiNfX1BVUkVfXyovX2pzeChGb3JtQ2hlY2ssIHsgLi4ucHJvcHMsXG4gIHJlZjogcmVmLFxuICB0eXBlOiBcInN3aXRjaFwiXG59KSk7XG5Td2l0Y2guZGlzcGxheU5hbWUgPSAnU3dpdGNoJztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oU3dpdGNoLCB7XG4gIElucHV0OiBGb3JtQ2hlY2suSW5wdXQsXG4gIExhYmVsOiBGb3JtQ2hlY2suTGFiZWxcbn0pOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFiQ29udGFpbmVyIGZyb20gJy4vVGFiQ29udGFpbmVyJztcbmltcG9ydCBUYWJDb250ZW50IGZyb20gJy4vVGFiQ29udGVudCc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuaW1wb3J0IHsgRnJhZ21lbnQgYXMgX0ZyYWdtZW50IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby11bnVzZWQtcHJvcC10eXBlcyAqL1xuY29uc3QgcHJvcFR5cGVzID0ge1xuICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuXG4gIC8qKlxuICAgKiBDb250ZW50IGZvciB0aGUgdGFiIHRpdGxlLlxuICAgKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqXG4gICAqIFRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgdGFiLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDbGFzcyB0byBwYXNzIHRvIHRoZSB1bmRlcmx5aW5nIG5hdiBsaW5rLlxuICAgKi9cbiAgdGFiQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBUYWIgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignUmVhY3RCb290c3RyYXA6IFRoZSBgVGFiYCBjb21wb25lbnQgaXMgbm90IG1lYW50IHRvIGJlIHJlbmRlcmVkISAnICsgXCJJdCdzIGFuIGFic3RyYWN0IGNvbXBvbmVudCB0aGF0IGlzIG9ubHkgdmFsaWQgYXMgYSBkaXJlY3QgQ2hpbGQgb2YgdGhlIGBUYWJzYCBDb21wb25lbnQuIFwiICsgJ0ZvciBjdXN0b20gdGFicyBjb21wb25lbnRzIHVzZSBUYWJQYW5lIGFuZCBUYWJzQ29udGFpbmVyIGRpcmVjdGx5Jyk7IC8vIE5lZWRlZCBvdGhlcndpc2UgZG9jcyBlcnJvciBvdXQuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KF9GcmFnbWVudCwge30pO1xufTtcblxuVGFiLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbmV4cG9ydCBkZWZhdWx0IE9iamVjdC5hc3NpZ24oVGFiLCB7XG4gIENvbnRhaW5lcjogVGFiQ29udGFpbmVyLFxuICBDb250ZW50OiBUYWJDb250ZW50LFxuICBQYW5lOiBUYWJQYW5lXG59KTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgVGFicyBmcm9tICdAcmVzdGFydC91aS9UYWJzJztcbmltcG9ydCBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50IGZyb20gJy4vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBUYWJDb250YWluZXIgPSAoe1xuICB0cmFuc2l0aW9uLFxuICAuLi5wcm9wc1xufSkgPT4gLyojX19QVVJFX18qL19qc3goVGFicywgeyAuLi5wcm9wcyxcbiAgdHJhbnNpdGlvbjogZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCh0cmFuc2l0aW9uKVxufSk7XG5cblRhYkNvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdUYWJDb250YWluZXInO1xuZXhwb3J0IGRlZmF1bHQgVGFiQ29udGFpbmVyOyIsImltcG9ydCBjcmVhdGVXaXRoQnNQcmVmaXggZnJvbSAnLi9jcmVhdGVXaXRoQnNQcmVmaXgnO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlV2l0aEJzUHJlZml4KCd0YWItY29udGVudCcpOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IE5vb3BUcmFuc2l0aW9uIGZyb20gJ0ByZXN0YXJ0L3VpL05vb3BUcmFuc2l0aW9uJztcbmltcG9ydCBTZWxlY3RhYmxlQ29udGV4dCBmcm9tICdAcmVzdGFydC91aS9TZWxlY3RhYmxlQ29udGV4dCc7XG5pbXBvcnQgVGFiQ29udGV4dCBmcm9tICdAcmVzdGFydC91aS9UYWJDb250ZXh0JztcbmltcG9ydCB7IHVzZVRhYlBhbmVsIH0gZnJvbSAnQHJlc3RhcnQvdWkvVGFiUGFuZWwnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50IGZyb20gJy4vZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgVGFiUGFuZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICB0cmFuc2l0aW9uLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IFt7XG4gICAgY2xhc3NOYW1lLFxuICAgIC8vIE5lZWQgdG8gZGVmaW5lIHRoZSBkZWZhdWx0IFwiYXNcIiBkdXJpbmcgcHJvcCBkZXN0cnVjdHVyaW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBzdHlsZWQtY29tcG9uZW50cyBnaXRodWIuY29tL3JlYWN0LWJvb3RzdHJhcC9yZWFjdC1ib290c3RyYXAvaXNzdWVzLzM1OTVcbiAgICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gICAgLi4ucmVzdFxuICB9LCB7XG4gICAgaXNBY3RpdmUsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyaW5nLFxuICAgIG9uRW50ZXJlZCxcbiAgICBvbkV4aXQsXG4gICAgb25FeGl0aW5nLFxuICAgIG9uRXhpdGVkLFxuICAgIG1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0LFxuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb24gPSBOb29wVHJhbnNpdGlvblxuICB9XSA9IHVzZVRhYlBhbmVsKHsgLi4ucHJvcHMsXG4gICAgdHJhbnNpdGlvbjogZ2V0VGFiVHJhbnNpdGlvbkNvbXBvbmVudCh0cmFuc2l0aW9uKVxuICB9KTtcbiAgY29uc3QgcHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndGFiLXBhbmUnKTsgLy8gV2UgcHJvdmlkZSBhbiBlbXB0eSB0aGUgVGFiQ29udGV4dCBzbyBgPE5hdj5gcyBpbiBgPFRhYlBhbmVsPmBzIGRvbid0XG4gIC8vIGNvbmZsaWN0IHdpdGggdGhlIHRvcCBsZXZlbCBvbmUuXG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFRhYkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goU2VsZWN0YWJsZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KFRyYW5zaXRpb24sIHtcbiAgICAgICAgaW46IGlzQWN0aXZlLFxuICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxuICAgICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQ6IG9uRW50ZXJlZCxcbiAgICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICBvbkV4aXRlZDogb25FeGl0ZWQsXG4gICAgICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgICAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0LFxuICAgICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnJlc3QsXG4gICAgICAgICAgcmVmOiByZWYsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcHJlZml4LCBpc0FjdGl2ZSAmJiAnYWN0aXZlJylcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfSk7XG59KTtcblRhYlBhbmUuZGlzcGxheU5hbWUgPSAnVGFiUGFuZSc7XG5leHBvcnQgZGVmYXVsdCBUYWJQYW5lOyIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBUYWJsZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHN0cmlwZWQsXG4gIGJvcmRlcmVkLFxuICBib3JkZXJsZXNzLFxuICBob3ZlcixcbiAgc2l6ZSxcbiAgdmFyaWFudCxcbiAgcmVzcG9uc2l2ZSxcbiAgLi4ucHJvcHNcbn0sIHJlZikgPT4ge1xuICBjb25zdCBkZWNvcmF0ZWRCc1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChic1ByZWZpeCwgJ3RhYmxlJyk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGVjb3JhdGVkQnNQcmVmaXgsIHZhcmlhbnQgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LSR7dmFyaWFudH1gLCBzaXplICYmIGAke2RlY29yYXRlZEJzUHJlZml4fS0ke3NpemV9YCwgc3RyaXBlZCAmJiBgJHtkZWNvcmF0ZWRCc1ByZWZpeH0tc3RyaXBlZGAsIGJvcmRlcmVkICYmIGAke2RlY29yYXRlZEJzUHJlZml4fS1ib3JkZXJlZGAsIGJvcmRlcmxlc3MgJiYgYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LWJvcmRlcmxlc3NgLCBob3ZlciAmJiBgJHtkZWNvcmF0ZWRCc1ByZWZpeH0taG92ZXJgKTtcblxuICBjb25zdCB0YWJsZSA9IC8qI19fUFVSRV9fKi9fanN4KFwidGFibGVcIiwgeyAuLi5wcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgcmVmOiByZWZcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICBsZXQgcmVzcG9uc2l2ZUNsYXNzID0gYCR7ZGVjb3JhdGVkQnNQcmVmaXh9LXJlc3BvbnNpdmVgO1xuXG4gICAgaWYgKHR5cGVvZiByZXNwb25zaXZlID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzcG9uc2l2ZUNsYXNzID0gYCR7cmVzcG9uc2l2ZUNsYXNzfS0ke3Jlc3BvbnNpdmV9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiByZXNwb25zaXZlQ2xhc3MsXG4gICAgICBjaGlsZHJlbjogdGFibGVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGFibGU7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVW5jb250cm9sbGVkIH0gZnJvbSAndW5jb250cm9sbGFibGUnO1xuaW1wb3J0IEJhc2VUYWJzIGZyb20gJ0ByZXN0YXJ0L3VpL1RhYnMnO1xuaW1wb3J0IE5hdiBmcm9tICcuL05hdic7XG5pbXBvcnQgTmF2TGluayBmcm9tICcuL05hdkxpbmsnO1xuaW1wb3J0IE5hdkl0ZW0gZnJvbSAnLi9OYXZJdGVtJztcbmltcG9ydCBUYWJDb250ZW50IGZyb20gJy4vVGFiQ29udGVudCc7XG5pbXBvcnQgVGFiUGFuZSBmcm9tICcuL1RhYlBhbmUnO1xuaW1wb3J0IHsgZm9yRWFjaCwgbWFwIH0gZnJvbSAnLi9FbGVtZW50Q2hpbGRyZW4nO1xuaW1wb3J0IGdldFRhYlRyYW5zaXRpb25Db21wb25lbnQgZnJvbSAnLi9nZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIHZhcmlhbnQ6ICd0YWJzJyxcbiAgbW91bnRPbkVudGVyOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pIHtcbiAgbGV0IGRlZmF1bHRBY3RpdmVLZXk7XG4gIGZvckVhY2goY2hpbGRyZW4sIGNoaWxkID0+IHtcbiAgICBpZiAoZGVmYXVsdEFjdGl2ZUtleSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0QWN0aXZlS2V5ID0gY2hpbGQucHJvcHMuZXZlbnRLZXk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRlZmF1bHRBY3RpdmVLZXk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRhYihjaGlsZCkge1xuICBjb25zdCB7XG4gICAgdGl0bGUsXG4gICAgZXZlbnRLZXksXG4gICAgZGlzYWJsZWQsXG4gICAgdGFiQ2xhc3NOYW1lLFxuICAgIGlkXG4gIH0gPSBjaGlsZC5wcm9wcztcblxuICBpZiAodGl0bGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KE5hdkl0ZW0sIHtcbiAgICBhczogXCJsaVwiLFxuICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4KE5hdkxpbmssIHtcbiAgICAgIGFzOiBcImJ1dHRvblwiLFxuICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNsYXNzTmFtZTogdGFiQ2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW46IHRpdGxlXG4gICAgfSlcbiAgfSk7XG59XG5cbmNvbnN0IFRhYnMgPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICBvblNlbGVjdCxcbiAgICB0cmFuc2l0aW9uLFxuICAgIG1vdW50T25FbnRlcixcbiAgICB1bm1vdW50T25FeGl0LFxuICAgIGNoaWxkcmVuLFxuICAgIGFjdGl2ZUtleSA9IGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgYWN0aXZlS2V5OiAnb25TZWxlY3QnXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3hzKEJhc2VUYWJzLCB7XG4gICAgaWQ6IGlkLFxuICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgIG9uU2VsZWN0OiBvblNlbGVjdCxcbiAgICB0cmFuc2l0aW9uOiBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50KHRyYW5zaXRpb24pLFxuICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgIHVubW91bnRPbkV4aXQ6IHVubW91bnRPbkV4aXQsXG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChOYXYsIHsgLi4uY29udHJvbGxlZFByb3BzLFxuICAgICAgcm9sZTogXCJ0YWJsaXN0XCIsXG4gICAgICBhczogXCJ1bFwiLFxuICAgICAgY2hpbGRyZW46IG1hcChjaGlsZHJlbiwgcmVuZGVyVGFiKVxuICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChUYWJDb250ZW50LCB7XG4gICAgICBjaGlsZHJlbjogbWFwKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUHJvcHMgPSB7IC4uLmNoaWxkLnByb3BzXG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBjaGlsZFByb3BzLnRpdGxlO1xuICAgICAgICBkZWxldGUgY2hpbGRQcm9wcy5kaXNhYmxlZDtcbiAgICAgICAgZGVsZXRlIGNoaWxkUHJvcHMudGFiQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVGFiUGFuZSwgeyAuLi5jaGlsZFByb3BzXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59O1xuXG5UYWJzLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblRhYnMuZGlzcGxheU5hbWUgPSAnVGFicyc7XG5leHBvcnQgZGVmYXVsdCBUYWJzOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRleHQsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgVGhlbWVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBwcmVmaXhlczoge31cbn0pO1xuY29uc3Qge1xuICBDb25zdW1lcixcbiAgUHJvdmlkZXJcbn0gPSBUaGVtZUNvbnRleHQ7XG5cbmZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIoe1xuICBwcmVmaXhlcyA9IHt9LFxuICBkaXIsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBwcmVmaXhlczogeyAuLi5wcmVmaXhlc1xuICAgIH0sXG4gICAgZGlyXG4gIH0pLCBbcHJlZml4ZXMsIGRpcl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJvb3RzdHJhcFByZWZpeChwcmVmaXgsIGRlZmF1bHRQcmVmaXgpIHtcbiAgY29uc3Qge1xuICAgIHByZWZpeGVzXG4gIH0gPSB1c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG4gIHJldHVybiBwcmVmaXggfHwgcHJlZml4ZXNbZGVmYXVsdFByZWZpeF0gfHwgZGVmYXVsdFByZWZpeDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VJc1JUTCgpIHtcbiAgY29uc3Qge1xuICAgIGRpclxuICB9ID0gdXNlQ29udGV4dChUaGVtZUNvbnRleHQpO1xuICByZXR1cm4gZGlyID09PSAncnRsJztcbn1cblxuZnVuY3Rpb24gY3JlYXRlQm9vdHN0cmFwQ29tcG9uZW50KENvbXBvbmVudCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSBvcHRzID0ge1xuICAgIHByZWZpeDogb3B0c1xuICB9O1xuICBjb25zdCBpc0NsYXNzeSA9IENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50OyAvLyBJZiBpdCdzIGEgZnVuY3Rpb25hbCBjb21wb25lbnQgbWFrZSBzdXJlIHdlIGRvbid0IGJyZWFrIGl0IHdpdGggYSByZWZcblxuICBjb25zdCB7XG4gICAgcHJlZml4LFxuICAgIGZvcndhcmRSZWZBcyA9IGlzQ2xhc3N5ID8gJ3JlZicgOiAnaW5uZXJSZWYnXG4gIH0gPSBvcHRzO1xuICBjb25zdCBXcmFwcGVkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHsgLi4ucHJvcHNcbiAgfSwgcmVmKSA9PiB7XG4gICAgcHJvcHNbZm9yd2FyZFJlZkFzXSA9IHJlZjtcbiAgICBjb25zdCBic1ByZWZpeCA9IHVzZUJvb3RzdHJhcFByZWZpeChwcm9wcy5ic1ByZWZpeCwgcHJlZml4KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goQ29tcG9uZW50LCB7IC4uLnByb3BzLFxuICAgICAgYnNQcmVmaXg6IGJzUHJlZml4XG4gICAgfSk7XG4gIH0pO1xuICBXcmFwcGVkLmRpc3BsYXlOYW1lID0gYEJvb3RzdHJhcCgke0NvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZX0pYDtcbiAgcmV0dXJuIFdyYXBwZWQ7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZUJvb3RzdHJhcENvbXBvbmVudCwgQ29uc3VtZXIgYXMgVGhlbWVDb25zdW1lciB9O1xuZXhwb3J0IGRlZmF1bHQgVGhlbWVQcm92aWRlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB1c2VUaW1lb3V0IGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZVRpbWVvdXQnO1xuaW1wb3J0IFRvYXN0RmFkZSBmcm9tICcuL1RvYXN0RmFkZSc7XG5pbXBvcnQgVG9hc3RIZWFkZXIgZnJvbSAnLi9Ub2FzdEhlYWRlcic7XG5pbXBvcnQgVG9hc3RCb2R5IGZyb20gJy4vVG9hc3RCb2R5JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgVG9hc3RDb250ZXh0IGZyb20gJy4vVG9hc3RDb250ZXh0JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5jb25zdCBUb2FzdCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBjbGFzc05hbWUsXG4gIHRyYW5zaXRpb246IFRyYW5zaXRpb24gPSBUb2FzdEZhZGUsXG4gIHNob3cgPSB0cnVlLFxuICBhbmltYXRpb24gPSB0cnVlLFxuICBkZWxheSA9IDUwMDAsXG4gIGF1dG9oaWRlID0gZmFsc2UsXG4gIG9uQ2xvc2UsXG4gIGJnLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndG9hc3QnKTsgLy8gV2UgdXNlIHJlZnMgZm9yIHRoZXNlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcmVzdGFydCB0aGUgYXV0b2hpZGVcbiAgLy8gdGltZXIgaW4gY2FzZSB0aGVzZSB2YWx1ZXMgY2hhbmdlLlxuXG4gIGNvbnN0IGRlbGF5UmVmID0gdXNlUmVmKGRlbGF5KTtcbiAgY29uc3Qgb25DbG9zZVJlZiA9IHVzZVJlZihvbkNsb3NlKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBkZWxheVJlZi5jdXJyZW50ID0gZGVsYXk7XG4gICAgb25DbG9zZVJlZi5jdXJyZW50ID0gb25DbG9zZTtcbiAgfSwgW2RlbGF5LCBvbkNsb3NlXSk7XG4gIGNvbnN0IGF1dG9oaWRlVGltZW91dCA9IHVzZVRpbWVvdXQoKTtcbiAgY29uc3QgYXV0b2hpZGVUb2FzdCA9ICEhKGF1dG9oaWRlICYmIHNob3cpO1xuICBjb25zdCBhdXRvaGlkZUZ1bmMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGF1dG9oaWRlVG9hc3QpIHtcbiAgICAgIG9uQ2xvc2VSZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogb25DbG9zZVJlZi5jdXJyZW50KCk7XG4gICAgfVxuICB9LCBbYXV0b2hpZGVUb2FzdF0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIE9ubHkgcmVzZXQgdGltZXIgaWYgc2hvdyBvciBhdXRvaGlkZSBjaGFuZ2VzLlxuICAgIGF1dG9oaWRlVGltZW91dC5zZXQoYXV0b2hpZGVGdW5jLCBkZWxheVJlZi5jdXJyZW50KTtcbiAgfSwgW2F1dG9oaWRlVGltZW91dCwgYXV0b2hpZGVGdW5jXSk7XG4gIGNvbnN0IHRvYXN0Q29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbkNsb3NlXG4gIH0pLCBbb25DbG9zZV0pO1xuICBjb25zdCBoYXNBbmltYXRpb24gPSAhIShUcmFuc2l0aW9uICYmIGFuaW1hdGlvbik7XG5cbiAgY29uc3QgdG9hc3QgPSAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7IC4uLnByb3BzLFxuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhic1ByZWZpeCwgY2xhc3NOYW1lLCBiZyAmJiBgYmctJHtiZ31gLCAhaGFzQW5pbWF0aW9uICYmIChzaG93ID8gJ3Nob3cnIDogJ2hpZGUnKSksXG4gICAgcm9sZTogXCJhbGVydFwiLFxuICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICB9KTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVG9hc3RDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRvYXN0Q29udGV4dCxcbiAgICBjaGlsZHJlbjogaGFzQW5pbWF0aW9uICYmIFRyYW5zaXRpb24gPyAvKiNfX1BVUkVfXyovX2pzeChUcmFuc2l0aW9uLCB7XG4gICAgICBpbjogc2hvdyxcbiAgICAgIHVubW91bnRPbkV4aXQ6IHRydWUsXG4gICAgICBjaGlsZHJlbjogdG9hc3RcbiAgICB9KSA6IHRvYXN0XG4gIH0pO1xufSk7XG5Ub2FzdC5kaXNwbGF5TmFtZSA9ICdUb2FzdCc7XG5leHBvcnQgZGVmYXVsdCBPYmplY3QuYXNzaWduKFRvYXN0LCB7XG4gIEJvZHk6IFRvYXN0Qm9keSxcbiAgSGVhZGVyOiBUb2FzdEhlYWRlclxufSk7IiwiaW1wb3J0IGNyZWF0ZVdpdGhCc1ByZWZpeCBmcm9tICcuL2NyZWF0ZVdpdGhCc1ByZWZpeCc7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVXaXRoQnNQcmVmaXgoJ3RvYXN0LWJvZHknKTsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgcG9zaXRpb25DbGFzc2VzID0ge1xuICAndG9wLXN0YXJ0JzogJ3RvcC0wIHN0YXJ0LTAnLFxuICAndG9wLWNlbnRlcic6ICd0b3AtMCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlLXgnLFxuICAndG9wLWVuZCc6ICd0b3AtMCBlbmQtMCcsXG4gICdtaWRkbGUtc3RhcnQnOiAndG9wLTUwIHN0YXJ0LTAgdHJhbnNsYXRlLW1pZGRsZS15JyxcbiAgJ21pZGRsZS1jZW50ZXInOiAndG9wLTUwIHN0YXJ0LTUwIHRyYW5zbGF0ZS1taWRkbGUnLFxuICAnbWlkZGxlLWVuZCc6ICd0b3AtNTAgZW5kLTAgdHJhbnNsYXRlLW1pZGRsZS15JyxcbiAgJ2JvdHRvbS1zdGFydCc6ICdib3R0b20tMCBzdGFydC0wJyxcbiAgJ2JvdHRvbS1jZW50ZXInOiAnYm90dG9tLTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZS14JyxcbiAgJ2JvdHRvbS1lbmQnOiAnYm90dG9tLTAgZW5kLTAnXG59O1xuY29uc3QgVG9hc3RDb250YWluZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICBic1ByZWZpeCxcbiAgcG9zaXRpb24sXG4gIGNsYXNzTmFtZSxcbiAgLy8gTmVlZCB0byBkZWZpbmUgdGhlIGRlZmF1bHQgXCJhc1wiIGR1cmluZyBwcm9wIGRlc3RydWN0dXJpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHN0eWxlZC1jb21wb25lbnRzIGdpdGh1Yi5jb20vcmVhY3QtYm9vdHN0cmFwL3JlYWN0LWJvb3RzdHJhcC9pc3N1ZXMvMzU5NVxuICBhczogQ29tcG9uZW50ID0gJ2RpdicsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICd0b2FzdC1jb250YWluZXInKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KENvbXBvbmVudCwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhic1ByZWZpeCwgcG9zaXRpb24gJiYgYHBvc2l0aW9uLWFic29sdXRlICR7cG9zaXRpb25DbGFzc2VzW3Bvc2l0aW9uXX1gLCBjbGFzc05hbWUpXG4gIH0pO1xufSk7XG5Ub2FzdENvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdUb2FzdENvbnRhaW5lcic7XG5leHBvcnQgZGVmYXVsdCBUb2FzdENvbnRhaW5lcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5jb25zdCBUb2FzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25DbG9zZSgpIHt9XG5cbn0pO1xuZXhwb3J0IGRlZmF1bHQgVG9hc3RDb250ZXh0OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEVOVEVSSU5HLCBFWElUSU5HIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cC9UcmFuc2l0aW9uJztcbmltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZmFkZVN0eWxlcyA9IHtcbiAgW0VOVEVSSU5HXTogJ3Nob3dpbmcnLFxuICBbRVhJVElOR106ICdzaG93aW5nIHNob3cnXG59O1xuY29uc3QgVG9hc3RGYWRlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IC8qI19fUFVSRV9fKi9fanN4KEZhZGUsIHsgLi4ucHJvcHMsXG4gIHJlZjogcmVmLFxuICB0cmFuc2l0aW9uQ2xhc3NlczogZmFkZVN0eWxlc1xufSkpO1xuVG9hc3RGYWRlLmRpc3BsYXlOYW1lID0gJ1RvYXN0RmFkZSc7XG5leHBvcnQgZGVmYXVsdCBUb2FzdEZhZGU7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQHJlc3RhcnQvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXggfSBmcm9tICcuL1RoZW1lUHJvdmlkZXInO1xuaW1wb3J0IENsb3NlQnV0dG9uIGZyb20gJy4vQ2xvc2VCdXR0b24nO1xuaW1wb3J0IFRvYXN0Q29udGV4dCBmcm9tICcuL1RvYXN0Q29udGV4dCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogdHJ1ZVxufTtcbmNvbnN0IFRvYXN0SGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIGNsb3NlTGFiZWwsXG4gIGNsb3NlVmFyaWFudCxcbiAgY2xvc2VCdXR0b24sXG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgYnNQcmVmaXggPSB1c2VCb290c3RyYXBQcmVmaXgoYnNQcmVmaXgsICd0b2FzdC1oZWFkZXInKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoVG9hc3RDb250ZXh0KTtcbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VFdmVudENhbGxiYWNrKGUgPT4ge1xuICAgIGNvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRleHQub25DbG9zZSA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5vbkNsb3NlKGUpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgLi4ucHJvcHMsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGJzUHJlZml4LCBjbGFzc05hbWUpLFxuICAgIGNoaWxkcmVuOiBbY2hpbGRyZW4sIGNsb3NlQnV0dG9uICYmIC8qI19fUFVSRV9fKi9fanN4KENsb3NlQnV0dG9uLCB7XG4gICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VMYWJlbCxcbiAgICAgIHZhcmlhbnQ6IGNsb3NlVmFyaWFudCxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLFxuICAgICAgXCJkYXRhLWRpc21pc3NcIjogXCJ0b2FzdFwiXG4gICAgfSldXG4gIH0pO1xufSk7XG5Ub2FzdEhlYWRlci5kaXNwbGF5TmFtZSA9ICdUb2FzdEhlYWRlcic7XG5Ub2FzdEhlYWRlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5leHBvcnQgZGVmYXVsdCBUb2FzdEhlYWRlcjsiLCJpbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vQnV0dG9uJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBGcmFnbWVudCBhcyBfRnJhZ21lbnQgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHVuZGVmaW5lZDtcblxuY29uc3QgVG9nZ2xlQnV0dG9uID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHtcbiAgYnNQcmVmaXgsXG4gIG5hbWUsXG4gIGNsYXNzTmFtZSxcbiAgY2hlY2tlZCxcbiAgdHlwZSxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxuICBkaXNhYmxlZCxcbiAgaWQsXG4gIGlucHV0UmVmLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAnYnRuLWNoZWNrJyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeHMoX0ZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcImlucHV0XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYnNQcmVmaXgsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICBkaXNhYmxlZDogISFkaXNhYmxlZCxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSB8fCBub29wLFxuICAgICAgaWQ6IGlkXG4gICAgfSksIC8qI19fUFVSRV9fKi9fanN4KEJ1dHRvbiwgeyAuLi5wcm9wcyxcbiAgICAgIHJlZjogcmVmLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJyksXG4gICAgICB0eXBlOiB1bmRlZmluZWQsXG4gICAgICBhczogXCJsYWJlbFwiLFxuICAgICAgaHRtbEZvcjogaWRcbiAgICB9KV1cbiAgfSk7XG59KTtcblRvZ2dsZUJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdUb2dnbGVCdXR0b24nO1xuZXhwb3J0IGRlZmF1bHQgVG9nZ2xlQnV0dG9uOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcbmltcG9ydCB7IHVzZVVuY29udHJvbGxlZCB9IGZyb20gJ3VuY29udHJvbGxhYmxlJztcbmltcG9ydCBjaGFpbkZ1bmN0aW9uIGZyb20gJy4vY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vRWxlbWVudENoaWxkcmVuJztcbmltcG9ydCBCdXR0b25Hcm91cCBmcm9tICcuL0J1dHRvbkdyb3VwJztcbmltcG9ydCBUb2dnbGVCdXR0b24gZnJvbSAnLi9Ub2dnbGVCdXR0b24nO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ3JhZGlvJyxcbiAgdmVydGljYWw6IGZhbHNlXG59O1xuY29uc3QgVG9nZ2xlQnV0dG9uR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgdHlwZSxcbiAgICBuYW1lLFxuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIC4uLmNvbnRyb2xsZWRQcm9wc1xuICB9ID0gdXNlVW5jb250cm9sbGVkKHByb3BzLCB7XG4gICAgdmFsdWU6ICdvbkNoYW5nZSdcbiAgfSk7XG5cbiAgY29uc3QgZ2V0VmFsdWVzID0gKCkgPT4gdmFsdWUgPT0gbnVsbCA/IFtdIDogW10uY29uY2F0KHZhbHVlKTtcblxuICBjb25zdCBoYW5kbGVUb2dnbGUgPSAoaW5wdXRWYWwsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFvbkNoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGdldFZhbHVlcygpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdmFsdWVzLmluZGV4T2YoaW5wdXRWYWwpICE9PSAtMTtcblxuICAgIGlmICh0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICBpZiAoIWlzQWN0aXZlICYmIG9uQ2hhbmdlKSBvbkNoYW5nZShpbnB1dFZhbCwgZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgb25DaGFuZ2UodmFsdWVzLmZpbHRlcihuID0+IG4gIT09IGlucHV0VmFsKSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbkNoYW5nZShbLi4udmFsdWVzLCBpbnB1dFZhbF0sIGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgISh0eXBlICE9PSAncmFkaW8nIHx8ICEhbmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdBIGBuYW1lYCBpcyByZXF1aXJlZCB0byBncm91cCB0aGUgdG9nZ2xlIGJ1dHRvbnMgd2hlbiB0aGUgYHR5cGVgICcgKyAnaXMgc2V0IHRvIFwicmFkaW9cIicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEJ1dHRvbkdyb3VwLCB7IC4uLmNvbnRyb2xsZWRQcm9wcyxcbiAgICByZWY6IHJlZixcbiAgICBjaGlsZHJlbjogbWFwKGNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IGNoaWxkVmFsLFxuICAgICAgICBvbkNoYW5nZTogY2hpbGRPbkNoYW5nZVxuICAgICAgfSA9IGNoaWxkLnByb3BzO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gZSA9PiBoYW5kbGVUb2dnbGUoY2hpbGRWYWwsIGUpO1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBjaGlsZC5uYW1lIHx8IG5hbWUsXG4gICAgICAgIGNoZWNrZWQ6IHZhbHVlcy5pbmRleE9mKGNoaWxkVmFsKSAhPT0gLTEsXG4gICAgICAgIG9uQ2hhbmdlOiBjaGFpbkZ1bmN0aW9uKGNoaWxkT25DaGFuZ2UsIGhhbmRsZXIpXG4gICAgICB9KTtcbiAgICB9KVxuICB9KTtcbn0pO1xuVG9nZ2xlQnV0dG9uR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbihUb2dnbGVCdXR0b25Hcm91cCwge1xuICBCdXR0b246IFRvZ2dsZUJ1dHRvblxufSk7IiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VCb290c3RyYXBQcmVmaXgsIHVzZUlzUlRMIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IGdldE92ZXJsYXlEaXJlY3Rpb24gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2VtZW50OiAncmlnaHQnXG59O1xuY29uc3QgVG9vbHRpcCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIGJzUHJlZml4LFxuICBwbGFjZW1lbnQsXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gIGNoaWxkcmVuLFxuICBhcnJvd1Byb3BzLFxuICBwb3BwZXI6IF8sXG4gIHNob3c6IF8yLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAndG9vbHRpcCcpO1xuICBjb25zdCBpc1JUTCA9IHVzZUlzUlRMKCk7XG4gIGNvbnN0IFtwcmltYXJ5UGxhY2VtZW50XSA9IChwbGFjZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYWNlbWVudC5zcGxpdCgnLScpKSB8fCBbXTtcbiAgY29uc3QgYnNEaXJlY3Rpb24gPSBnZXRPdmVybGF5RGlyZWN0aW9uKHByaW1hcnlQbGFjZW1lbnQsIGlzUlRMKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4cyhcImRpdlwiLCB7XG4gICAgcmVmOiByZWYsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJvbGU6IFwidG9vbHRpcFwiLFxuICAgIFwieC1wbGFjZW1lbnRcIjogcHJpbWFyeVBsYWNlbWVudCxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBic1ByZWZpeCwgYGJzLXRvb2x0aXAtJHtic0RpcmVjdGlvbn1gKSxcbiAgICAuLi5wcm9wcyxcbiAgICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJ0b29sdGlwLWFycm93XCIsXG4gICAgICAuLi5hcnJvd1Byb3BzXG4gICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7YnNQcmVmaXh9LWlubmVyYCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH0pXVxuICB9KTtcbn0pO1xuVG9vbHRpcC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5Ub29sdGlwLmRpc3BsYXlOYW1lID0gJ1Rvb2x0aXAnO1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcDsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBUcmFuc2l0aW9uIGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvVHJhbnNpdGlvbic7XG5pbXBvcnQgdXNlTWVyZ2VkUmVmcyBmcm9tICdAcmVzdGFydC9ob29rcy91c2VNZXJnZWRSZWZzJztcbmltcG9ydCBzYWZlRmluZERPTU5vZGUgZnJvbSAnLi9zYWZlRmluZERPTU5vZGUnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbi8vIE5vcm1hbGl6ZXMgVHJhbnNpdGlvbiBjYWxsYmFja3Mgd2hlbiBub2RlUmVmIGlzIHVzZWQuXG5jb25zdCBUcmFuc2l0aW9uV3JhcHBlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKCh7XG4gIG9uRW50ZXIsXG4gIG9uRW50ZXJpbmcsXG4gIG9uRW50ZXJlZCxcbiAgb25FeGl0LFxuICBvbkV4aXRpbmcsXG4gIG9uRXhpdGVkLFxuICBhZGRFbmRMaXN0ZW5lcixcbiAgY2hpbGRyZW4sXG4gIGNoaWxkUmVmLFxuICAuLi5wcm9wc1xufSwgcmVmKSA9PiB7XG4gIGNvbnN0IG5vZGVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlZFJlZnMobm9kZVJlZiwgY2hpbGRSZWYpO1xuXG4gIGNvbnN0IGF0dGFjaFJlZiA9IHIgPT4ge1xuICAgIG1lcmdlZFJlZihzYWZlRmluZERPTU5vZGUocikpO1xuICB9O1xuXG4gIGNvbnN0IG5vcm1hbGl6ZSA9IGNhbGxiYWNrID0+IHBhcmFtID0+IHtcbiAgICBpZiAoY2FsbGJhY2sgJiYgbm9kZVJlZi5jdXJyZW50KSB7XG4gICAgICBjYWxsYmFjayhub2RlUmVmLmN1cnJlbnQsIHBhcmFtKTtcbiAgICB9XG4gIH07XG4gIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAqL1xuXG5cbiAgY29uc3QgaGFuZGxlRW50ZXIgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FbnRlciksIFtvbkVudGVyXSk7XG4gIGNvbnN0IGhhbmRsZUVudGVyaW5nID0gdXNlQ2FsbGJhY2sobm9ybWFsaXplKG9uRW50ZXJpbmcpLCBbb25FbnRlcmluZ10pO1xuICBjb25zdCBoYW5kbGVFbnRlcmVkID0gdXNlQ2FsbGJhY2sobm9ybWFsaXplKG9uRW50ZXJlZCksIFtvbkVudGVyZWRdKTtcbiAgY29uc3QgaGFuZGxlRXhpdCA9IHVzZUNhbGxiYWNrKG5vcm1hbGl6ZShvbkV4aXQpLCBbb25FeGl0XSk7XG4gIGNvbnN0IGhhbmRsZUV4aXRpbmcgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FeGl0aW5nKSwgW29uRXhpdGluZ10pO1xuICBjb25zdCBoYW5kbGVFeGl0ZWQgPSB1c2VDYWxsYmFjayhub3JtYWxpemUob25FeGl0ZWQpLCBbb25FeGl0ZWRdKTtcbiAgY29uc3QgaGFuZGxlQWRkRW5kTGlzdGVuZXIgPSB1c2VDYWxsYmFjayhub3JtYWxpemUoYWRkRW5kTGlzdGVuZXIpLCBbYWRkRW5kTGlzdGVuZXJdKTtcbiAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMgKi9cblxuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goVHJhbnNpdGlvbiwge1xuICAgIHJlZjogcmVmLFxuICAgIC4uLnByb3BzLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkVudGVyaW5nOiBoYW5kbGVFbnRlcmluZyxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0ZWQ6IGhhbmRsZUV4aXRlZCxcbiAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmcsXG4gICAgYWRkRW5kTGlzdGVuZXI6IGhhbmRsZUFkZEVuZExpc3RlbmVyLFxuICAgIG5vZGVSZWY6IG5vZGVSZWYsXG4gICAgY2hpbGRyZW46IHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJyA/IChzdGF0dXMsIGlubmVyUHJvcHMpID0+IGNoaWxkcmVuKHN0YXR1cywgeyAuLi5pbm5lclByb3BzLFxuICAgICAgcmVmOiBhdHRhY2hSZWZcbiAgICB9KSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIHJlZjogYXR0YWNoUmVmXG4gICAgfSlcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25XcmFwcGVyOyIsIi8qKlxuICogU2FmZSBjaGFpbmVkIGZ1bmN0aW9uXG4gKlxuICogV2lsbCBvbmx5IGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBpZiBuZWVkZWQsXG4gKiBvdGhlcndpc2Ugd2lsbCBwYXNzIGJhY2sgZXhpc3RpbmcgZnVuY3Rpb25zIG9yIG51bGwuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY3Rpb25zIHRvIGNoYWluXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb258bnVsbH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKC4uLmZ1bmNzKSB7XG4gIHJldHVybiBmdW5jcy5maWx0ZXIoZiA9PiBmICE9IG51bGwpLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQXJndW1lbnQgVHlwZSwgbXVzdCBvbmx5IHByb3ZpZGUgZnVuY3Rpb25zLCB1bmRlZmluZWQsIG9yIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjYyA9PT0gbnVsbCkgcmV0dXJuIGY7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBhY2MuYXBwbHkodGhpcywgYXJncyk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgZi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9LCBudWxsKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2l2ZVByb3BUeXBlKHByb3BUeXBlKSB7XG4gIHJldHVybiBQcm9wVHlwZXMub25lT2ZUeXBlKFtwcm9wVHlwZSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICB4czogcHJvcFR5cGUsXG4gICAgc206IHByb3BUeXBlLFxuICAgIG1kOiBwcm9wVHlwZSxcbiAgICBsZzogcHJvcFR5cGUsXG4gICAgeGw6IHByb3BUeXBlLFxuICAgIHh4bDogcHJvcFR5cGVcbiAgfSldKTtcbn1cbmV4cG9ydCBjb25zdCBERVZJQ0VfU0laRVMgPSBbJ3h4bCcsICd4bCcsICdsZycsICdtZCcsICdzbScsICd4cyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVXRpbGl0eUNsYXNzTmFtZSh1dGlsaXR5VmFsdWVzKSB7XG4gIGNvbnN0IGNsYXNzZXMgPSBbXTtcbiAgT2JqZWN0LmVudHJpZXModXRpbGl0eVZhbHVlcykuZm9yRWFjaCgoW3V0aWxOYW1lLCB1dGlsVmFsdWVdKSA9PiB7XG4gICAgaWYgKHV0aWxWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHV0aWxWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgREVWSUNFX1NJWkVTLmZvckVhY2goYnJrUG9pbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGJwVmFsdWUgPSB1dGlsVmFsdWVbYnJrUG9pbnRdO1xuXG4gICAgICAgICAgaWYgKGJwVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaW5maXggPSBicmtQb2ludCAhPT0gJ3hzJyA/IGAtJHticmtQb2ludH1gIDogJyc7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goYCR7dXRpbE5hbWV9JHtpbmZpeH0tJHticFZhbHVlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7dXRpbE5hbWV9LSR7dXRpbFZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbGFzc2VzO1xufSIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IGNhbWVsaXplIGZyb20gJ2RvbS1oZWxwZXJzL2NhbWVsaXplJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUJvb3RzdHJhcFByZWZpeCB9IGZyb20gJy4vVGhlbWVQcm92aWRlcic7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBwYXNjYWxDYXNlID0gc3RyID0+IHN0clswXS50b1VwcGVyQ2FzZSgpICsgY2FtZWxpemUoc3RyKS5zbGljZSgxKTtcblxuLy8gVE9ETzogZW1zdHJpY3RlbiAmIGZpeCB0aGUgdHlwaW5nIGhlcmUhIGBjcmVhdGVXaXRoQnNQcmVmaXg8VEVsZW1lbnRUeXBlPi4uLmBcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVdpdGhCc1ByZWZpeChwcmVmaXgsIHtcbiAgZGlzcGxheU5hbWUgPSBwYXNjYWxDYXNlKHByZWZpeCksXG4gIENvbXBvbmVudCxcbiAgZGVmYXVsdFByb3BzXG59ID0ge30pIHtcbiAgY29uc3QgQnNDb21wb25lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigoe1xuICAgIGNsYXNzTmFtZSxcbiAgICBic1ByZWZpeCxcbiAgICBhczogVGFnID0gQ29tcG9uZW50IHx8ICdkaXYnLFxuICAgIC4uLnByb3BzXG4gIH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCBwcmVmaXgpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChUYWcsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKGNsYXNzTmFtZSwgcmVzb2x2ZWRQcmVmaXgpLFxuICAgICAgLi4ucHJvcHNcbiAgICB9KTtcbiAgfSk7XG4gIEJzQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiAgQnNDb21wb25lbnQuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgcmV0dXJuIEJzQ29tcG9uZW50O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBkZWZhdWx0IChjbGFzc05hbWUgPT4gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoKHAsIHJlZikgPT4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwgeyAuLi5wLFxuICByZWY6IHJlZixcbiAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHAuY2xhc3NOYW1lLCBjbGFzc05hbWUpXG59KSkpOyIsImltcG9ydCBGYWRlIGZyb20gJy4vRmFkZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUYWJUcmFuc2l0aW9uQ29tcG9uZW50KHRyYW5zaXRpb24pIHtcbiAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJhbnNpdGlvbiA/IEZhZGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdHJhbnNpdGlvbjtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgY2xhc3MgQnNQcmVmaXhDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge30gLy8gTmVlZCB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mIHR5cGVvZiBDb21wb25lbnQgdG8gZ2V0IHByb3BlciB0eXBlIGNoZWNraW5nLlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3ZlcmxheURpcmVjdGlvbihwbGFjZW1lbnQsIGlzUlRMKSB7XG4gIGxldCBic0RpcmVjdGlvbiA9IHBsYWNlbWVudDtcblxuICBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcpIHtcbiAgICBic0RpcmVjdGlvbiA9IGlzUlRMID8gJ2VuZCcgOiAnc3RhcnQnO1xuICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIGJzRGlyZWN0aW9uID0gaXNSVEwgPyAnc3RhcnQnIDogJ2VuZCc7XG4gIH1cblxuICByZXR1cm4gYnNEaXJlY3Rpb247XG59IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb24gfSBmcm9tICcuL0FjY29yZGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFjY29yZGlvbkNvbnRleHQgfSBmcm9tICcuL0FjY29yZGlvbkNvbnRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25Db2xsYXBzZSB9IGZyb20gJy4vQWNjb3JkaW9uQ29sbGFwc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25CdXR0b24sIHVzZUFjY29yZGlvbkJ1dHRvbiB9IGZyb20gJy4vQWNjb3JkaW9uQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWxlcnQgfSBmcm9tICcuL0FsZXJ0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQW5jaG9yIH0gZnJvbSAnLi9BbmNob3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYWRnZSB9IGZyb20gJy4vQmFkZ2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCcmVhZGNydW1iIH0gZnJvbSAnLi9CcmVhZGNydW1iJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuL0JyZWFkY3J1bWJJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25Hcm91cCB9IGZyb20gJy4vQnV0dG9uR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25Ub29sYmFyIH0gZnJvbSAnLi9CdXR0b25Ub29sYmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZCB9IGZyb20gJy4vQ2FyZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRJbWcgfSBmcm9tICcuL0NhcmRJbWcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkR3JvdXAgfSBmcm9tICcuL0NhcmRHcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcm91c2VsIH0gZnJvbSAnLi9DYXJvdXNlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcm91c2VsSXRlbSB9IGZyb20gJy4vQ2Fyb3VzZWxJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2xvc2VCdXR0b24gfSBmcm9tICcuL0Nsb3NlQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ29sIH0gZnJvbSAnLi9Db2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb2xsYXBzZSB9IGZyb20gJy4vQ29sbGFwc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93biB9IGZyb20gJy4vRHJvcGRvd24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcm9wZG93bkJ1dHRvbiB9IGZyb20gJy4vRHJvcGRvd25CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGYWRlIH0gZnJvbSAnLi9GYWRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybSB9IGZyb20gJy4vRm9ybSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1Db250cm9sIH0gZnJvbSAnLi9Gb3JtQ29udHJvbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1DaGVjayB9IGZyb20gJy4vRm9ybUNoZWNrJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUZsb2F0aW5nIH0gZnJvbSAnLi9Gb3JtRmxvYXRpbmcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGbG9hdGluZ0xhYmVsIH0gZnJvbSAnLi9GbG9hdGluZ0xhYmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUdyb3VwIH0gZnJvbSAnLi9Gb3JtR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtTGFiZWwgfSBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1UZXh0IH0gZnJvbSAnLi9Gb3JtVGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1TZWxlY3QgfSBmcm9tICcuL0Zvcm1TZWxlY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb250YWluZXIgfSBmcm9tICcuL0NvbnRhaW5lcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEltYWdlIH0gZnJvbSAnLi9JbWFnZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpZ3VyZSB9IGZyb20gJy4vRmlndXJlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5wdXRHcm91cCB9IGZyb20gJy4vSW5wdXRHcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RHcm91cCB9IGZyb20gJy4vTGlzdEdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEdyb3VwSXRlbSB9IGZyb20gJy4vTGlzdEdyb3VwSXRlbSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vZGFsIH0gZnJvbSAnLi9Nb2RhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vZGFsQm9keSB9IGZyb20gJy4vTW9kYWxCb2R5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxEaWFsb2cgfSBmcm9tICcuL01vZGFsRGlhbG9nJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxGb290ZXIgfSBmcm9tICcuL01vZGFsRm9vdGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWxUaXRsZSB9IGZyb20gJy4vTW9kYWxUaXRsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5hdiB9IGZyb20gJy4vTmF2JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmF2YmFyIH0gZnJvbSAnLi9OYXZiYXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZiYXJCcmFuZCB9IGZyb20gJy4vTmF2YmFyQnJhbmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZEcm9wZG93biB9IGZyb20gJy4vTmF2RHJvcGRvd24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXZJdGVtIH0gZnJvbSAnLi9OYXZJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTmF2TGluayB9IGZyb20gJy4vTmF2TGluayc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE9mZmNhbnZhcyB9IGZyb20gJy4vT2ZmY2FudmFzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT2ZmY2FudmFzSGVhZGVyIH0gZnJvbSAnLi9PZmZjYW52YXNIZWFkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBPZmZjYW52YXNUaXRsZSB9IGZyb20gJy4vT2ZmY2FudmFzVGl0bGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBPZmZjYW52YXNCb2R5IH0gZnJvbSAnLi9PZmZjYW52YXNCb2R5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE92ZXJsYXlUcmlnZ2VyIH0gZnJvbSAnLi9PdmVybGF5VHJpZ2dlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhZ2VJdGVtIH0gZnJvbSAnLi9QYWdlSXRlbSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBhZ2luYXRpb24gfSBmcm9tICcuL1BhZ2luYXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFjZWhvbGRlciB9IGZyb20gJy4vUGxhY2Vob2xkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFjZWhvbGRlckJ1dHRvbiB9IGZyb20gJy4vUGxhY2Vob2xkZXJCdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb3BvdmVyIH0gZnJvbSAnLi9Qb3BvdmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wb3ZlckhlYWRlciB9IGZyb20gJy4vUG9wb3ZlckhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvcG92ZXJCb2R5IH0gZnJvbSAnLi9Qb3BvdmVyQm9keSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFByb2dyZXNzQmFyIH0gZnJvbSAnLi9Qcm9ncmVzc0Jhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJhdGlvIH0gZnJvbSAnLi9SYXRpbyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJvdyB9IGZyb20gJy4vUm93JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3Bpbm5lciB9IGZyb20gJy4vU3Bpbm5lcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNwbGl0QnV0dG9uIH0gZnJvbSAnLi9TcGxpdEJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNTUlByb3ZpZGVyIH0gZnJvbSAnLi9TU1JQcm92aWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0YWNrIH0gZnJvbSAnLi9TdGFjayc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYiB9IGZyb20gJy4vVGFiJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFiQ29udGFpbmVyIH0gZnJvbSAnLi9UYWJDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJDb250ZW50IH0gZnJvbSAnLi9UYWJDb250ZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGUgfSBmcm9tICcuL1RhYmxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFiUGFuZSB9IGZyb20gJy4vVGFiUGFuZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYnMgfSBmcm9tICcuL1RhYnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUaGVtZVByb3ZpZGVyIH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVG9hc3QgfSBmcm9tICcuL1RvYXN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVG9hc3RCb2R5IH0gZnJvbSAnLi9Ub2FzdEJvZHknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2FzdEhlYWRlciB9IGZyb20gJy4vVG9hc3RIZWFkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2FzdENvbnRhaW5lciB9IGZyb20gJy4vVG9hc3RDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb2dnbGVCdXR0b24gfSBmcm9tICcuL1RvZ2dsZUJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvZ2dsZUJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9Ub2dnbGVCdXR0b25Hcm91cCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAnOyIsImltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2FmZUZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ICYmICdzZXRTdGF0ZScgaW4gY29tcG9uZW50T3JFbGVtZW50KSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NLmZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50T3JFbGVtZW50ICE9IG51bGwgPyBjb21wb25lbnRPckVsZW1lbnQgOiBudWxsO1xufSIsImltcG9ydCBjc3MgZnJvbSAnZG9tLWhlbHBlcnMvY3NzJztcbmltcG9ydCB0cmFuc2l0aW9uRW5kIGZyb20gJ2RvbS1oZWxwZXJzL3RyYW5zaXRpb25FbmQnO1xuXG5mdW5jdGlvbiBwYXJzZUR1cmF0aW9uKG5vZGUsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHN0ciA9IGNzcyhub2RlLCBwcm9wZXJ0eSkgfHwgJyc7XG4gIGNvbnN0IG11bHQgPSBzdHIuaW5kZXhPZignbXMnKSA9PT0gLTEgPyAxMDAwIDogMTtcbiAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKSAqIG11bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRMaXN0ZW5lcihlbGVtZW50LCBoYW5kbGVyKSB7XG4gIGNvbnN0IGR1cmF0aW9uID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJyk7XG4gIGNvbnN0IGRlbGF5ID0gcGFyc2VEdXJhdGlvbihlbGVtZW50LCAndHJhbnNpdGlvbkRlbGF5Jyk7XG4gIGNvbnN0IHJlbW92ZSA9IHRyYW5zaXRpb25FbmQoZWxlbWVudCwgZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbGVtZW50KSB7XG4gICAgICByZW1vdmUoKTtcbiAgICAgIGhhbmRsZXIoZSk7XG4gICAgfVxuICB9LCBkdXJhdGlvbiArIGRlbGF5KTtcbn0iLCIvLyByZWFkaW5nIGEgZGltZW5zaW9uIHByb3Agd2lsbCBjYXVzZSB0aGUgYnJvd3NlciB0byByZWNhbGN1bGF0ZSxcbi8vIHdoaWNoIHdpbGwgbGV0IG91ciBhbmltYXRpb25zIHdvcmtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyaWdnZXJCcm93c2VyUmVmbG93KG5vZGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcbiAgbm9kZS5vZmZzZXRIZWlnaHQ7XG59IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmNvbnN0IGFsaWduRGlyZWN0aW9uID0gUHJvcFR5cGVzLm9uZU9mKFsnc3RhcnQnLCAnZW5kJ10pO1xuZXhwb3J0IGNvbnN0IGFsaWduUHJvcFR5cGUgPSBQcm9wVHlwZXMub25lT2ZUeXBlKFthbGlnbkRpcmVjdGlvbiwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgc206IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgbWQ6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgbGc6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgeGw6IGFsaWduRGlyZWN0aW9uXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgeHhsOiBhbGlnbkRpcmVjdGlvblxufSldKTsiLCJpbXBvcnQgeyB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaGFzQ2xhc3MgZnJvbSAnZG9tLWhlbHBlcnMvaGFzQ2xhc3MnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCBQb3BvdmVyIGZyb20gJy4vUG9wb3Zlcic7IC8vIFRoaXMgaXMgbWVhbnQgZm9yIGludGVybmFsIHVzZS5cbi8vIFRoaXMgYXBwbGllcyBhIGN1c3RvbSBvZmZzZXQgdG8gdGhlIG92ZXJsYXkgaWYgaXQncyBhIHBvcG92ZXIuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZU92ZXJsYXlPZmZzZXQoKSB7XG4gIGNvbnN0IG92ZXJsYXlSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHBvcG92ZXJDbGFzcyA9IHVzZUJvb3RzdHJhcFByZWZpeCh1bmRlZmluZWQsICdwb3BvdmVyJyk7XG4gIGNvbnN0IG9mZnNldCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBvZmZzZXQ6ICgpID0+IHtcbiAgICAgICAgaWYgKG92ZXJsYXlSZWYuY3VycmVudCAmJiBoYXNDbGFzcyhvdmVybGF5UmVmLmN1cnJlbnQsIHBvcG92ZXJDbGFzcykpIHtcbiAgICAgICAgICByZXR1cm4gUG9wb3Zlci5QT1BQRVJfT0ZGU0VUO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBbcG9wb3ZlckNsYXNzXSk7XG4gIHJldHVybiBbb3ZlcmxheVJlZiwgW29mZnNldF1dO1xufSIsImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgdXNlQm9vdHN0cmFwUHJlZml4IH0gZnJvbSAnLi9UaGVtZVByb3ZpZGVyJztcbmltcG9ydCB7IHVzZUNvbCB9IGZyb20gJy4vQ29sJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBsYWNlaG9sZGVyKHtcbiAgYW5pbWF0aW9uLFxuICBiZyxcbiAgYnNQcmVmaXgsXG4gIHNpemUsXG4gIC4uLnByb3BzXG59KSB7XG4gIGJzUHJlZml4ID0gdXNlQm9vdHN0cmFwUHJlZml4KGJzUHJlZml4LCAncGxhY2Vob2xkZXInKTtcbiAgY29uc3QgW3tcbiAgICBjbGFzc05hbWUsXG4gICAgLi4uY29sUHJvcHNcbiAgfV0gPSB1c2VDb2wocHJvcHMpO1xuICByZXR1cm4geyAuLi5jb2xQcm9wcyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBhbmltYXRpb24gPyBgJHtic1ByZWZpeH0tJHthbmltYXRpb259YCA6IGJzUHJlZml4LCBzaXplICYmIGAke2JzUHJlZml4fS0ke3NpemV9YCwgYmcgJiYgYGJnLSR7Ymd9YClcbiAgfTtcbn0iLCJpbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VNZXJnZWRSZWZzIGZyb20gJ0ByZXN0YXJ0L2hvb2tzL3VzZU1lcmdlZFJlZnMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlV3JhcHBlZFJlZldpdGhXYXJuaW5nKHJlZiwgY29tcG9uZW50TmFtZSkge1xuICAvLyBAdHMtaWdub3JlXG4gIGlmICghKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHJldHVybiByZWY7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuXG4gIGNvbnN0IHdhcm5pbmdSZWYgPSB1c2VDYWxsYmFjayhyZWZWYWx1ZSA9PiB7XG4gICAgIShyZWZWYWx1ZSA9PSBudWxsIHx8ICFyZWZWYWx1ZS5pc1JlYWN0Q29tcG9uZW50KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgYCR7Y29tcG9uZW50TmFtZX0gaW5qZWN0ZWQgYSByZWYgdG8gYSBwcm92aWRlZCBcXGBhc1xcYCBjb21wb25lbnQgdGhhdCByZXNvbHZlZCB0byBhIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkIG9mIGEgRE9NIGVsZW1lbnQuIGAgKyAnVXNlIGBSZWFjdC5mb3J3YXJkUmVmYCB0byBwcm92aWRlIHRoZSBpbmplY3RlZCByZWYgdG8gdGhlIGNsYXNzIGNvbXBvbmVudCBhcyBhIHByb3AgaW4gb3JkZXIgdG8gcGFzcyBpdCBkaXJlY3RseSB0byBhIERPTSBlbGVtZW50JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICB9LCBbY29tcG9uZW50TmFtZV0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcblxuICByZXR1cm4gdXNlTWVyZ2VkUmVmcyh3YXJuaW5nUmVmLCByZWYpO1xufSIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG52YXIgdHJhY2luZyA9IHJlcXVpcmUoJ3NjaGVkdWxlci90cmFjaW5nJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuaWYgKCFSZWFjdCkge1xuICB7XG4gICAgdGhyb3cgRXJyb3IoIFwiUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS5cIiApO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBGdW5kYW1lbnRhbENvbXBvbmVudCA9IDIwO1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgQmxvY2sgPSAyMjtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMztcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyNDtcblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlRnVuZGFtZW50YWxBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIFNjb3BlIHN1cHBvcnQuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIHdoaWxlIHVubW91bnRpbmcgKG9yIGFmdGVyIGluIHRoZSBjYXNlIG9mIHBhc3NpdmUgZWZmZWN0cylcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7XG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgSUQsIGl0J3MgZXhwZWN0ZWQgdGhhdFxuICAgIC8vIHRoZSBuZXh0IHByb3AgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHNlcnZlciB2YWx1ZSwgc28ganVzdCByZXR1cm5cbiAgICAvLyBleHBlY3RlZFxuXG5cbiAgICBpZiAoaXNPcGFxdWVIeWRyYXRpbmdPYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQmxvY2s6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUuX3JlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SXNSZW5kZXJpbmcoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNSZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJzsgLy8gRmxhdHRlbiBjaGlsZHJlbi4gV2UnbGwgd2FybiBpZiB0aGV5IGFyZSBpbnZhbGlkXG4gIC8vIGR1cmluZyB2YWxpZGF0ZVByb3BzKCkgd2hpY2ggcnVucyBmb3IgaHlkcmF0aW9uIHRvby5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgdGhyb3cgb24gbm9uLWVsZW1lbnQgb2JqZWN0cy5cbiAgLy8gRWxlbWVudHMgYXJlIHN0cmluZ2lmaWVkICh3aGljaCBpcyBub3JtYWxseSBpcnJlbGV2YW50XG4gIC8vIGJ1dCBtYXR0ZXJzIGZvciA8ZmJ0PikuXG5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ICs9IGNoaWxkOyAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlIHBhdGggdG9vLlxuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBjb2RlIHBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgfSwgcHJvcHMpO1xuXG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAoIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImBkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LlwiICk7XG4gICAgfVxuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZGVmYXVsdFZhbHVlID09IG51bGwpKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKCEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCBcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xudmFyIE5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6IEhUTUxfTkFNRVNQQUNFLFxuICBtYXRobWw6IE1BVEhfTkFNRVNQQUNFLFxuICBzdmc6IFNWR19OQU1FU1BBQ0Vcbn07IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2Zykge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBfYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggdGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocHJvcHMuc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5JDEuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xudmFyIElTX1JFUExBWUVEID0gMSA8PCA0O1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZGlzY3JldGVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYiwgYywgZCkge1xuICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG59O1xuXG52YXIgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCA9IGJhdGNoZWRVcGRhdGVzSW1wbDtcbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xudmFyIGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYm9va2tlZXBpbmcpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRFdmVudFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0JhdGNoaW5nRXZlbnRVcGRhdGVzID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ0V2ZW50VXBkYXRlcyA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZJc0luc2lkZUV2ZW50SGFuZGxlciA9IGlzSW5zaWRlRXZlbnRIYW5kbGVyO1xuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGlzY3JldGVVcGRhdGVzSW1wbChmbiwgYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBwcmV2SXNJbnNpZGVFdmVudEhhbmRsZXI7XG5cbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoRGlzY3JldGVVcGRhdGVzSWZOZWVkZWQodGltZVN0YW1wKSB7XG4gIHtcbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwsIF9iYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBkaXNjcmV0ZVVwZGF0ZXNJbXBsID0gX2Rpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGZsdXNoRGlzY3JldGVVcGRhdGVzSW1wbCA9IF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGJhdGNoZWRFdmVudFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRFdmVudFVwZGF0ZXNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghKCFsaXN0ZW5lciB8fCB0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29raW5jdWJhdG9yL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICghKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50IHNjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSBmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0IGNhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgdG8gYmUgYXN5bmNocm9ub3VzLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImNsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBQbGFjZW1lbnRBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG42O1xudmFyIERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7IC8vIFRPRE8gKGVmZmVjdHMpIFJlbW92ZSB0aGlzIGJpdCBvbmNlIHRoZSBuZXcgcmVjb25jaWxlciBpcyBzeW5jZWQgdG8gdGhlIG9sZC5cblxudmFyIFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldiA9XG4vKiAgICAgKi9cbjgxOTI7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBIeWRyYXRpbmdBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG4xMDI4OyAvLyBQYXNzaXZlICYgVXBkYXRlICYgQ2FsbGJhY2sgJiBSZWYgJiBTbmFwc2hvdFxuXG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAqL1xuOTMyOyAvLyBVbmlvbiBvZiBhbGwgaG9zdCBlZmZlY3RzXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4yMDQ3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjE2Mzg0OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXJGaWJlci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmICghKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmICghKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShhLmFsdGVybmF0ZSA9PT0gYikpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmICghKGEudGFnID09PSBIb3N0Um9vdCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG5cbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cblxuXG4gIHZhciBub2RlID0gY3VycmVudFBhcmVudDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKCFub2RlLnNpYmxpbmcpIHtcbiAgICAgIGlmICghbm9kZS5yZXR1cm4gfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuXG4gIGlmICghY3VycmVudFBhcmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG5cblxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0IHx8IGVuYWJsZUZ1bmRhbWVudGFsQVBJICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAoIW5vZGUuc2libGluZykge1xuICAgICAgaWYgKCFub2RlLnJldHVybiB8fCBub2RlLnJldHVybiA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgbmVlZHMgdGhlIHJldHVybiBudWxsIGhlcmUsIGJ1dCBFU0xpbnQgY29tcGxhaW5zIGFib3V0IGl0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZG9lc0ZpYmVyQ29udGFpbihwYXJlbnRGaWJlciwgY2hpbGRGaWJlcikge1xuICB2YXIgbm9kZSA9IGNoaWxkRmliZXI7XG4gIHZhciBwYXJlbnRGaWJlckFsdGVybmF0ZSA9IHBhcmVudEZpYmVyLmFsdGVybmF0ZTtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlID09PSBwYXJlbnRGaWJlciB8fCBub2RlID09PSBwYXJlbnRGaWJlckFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbmZ1bmN0aW9uIGhhc1F1ZXVlZERpc2NyZXRlRXZlbnRzKCkge1xuICByZXR1cm4gcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMDtcbn1cbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzIHwgSVNfUkVQTEFZRUQsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRGlzY3JldGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5wdXNoKHF1ZXVlZEV2ZW50KTtcbn0gLy8gUmVzZXRzIHRoZSByZXBsYXlpbmcgZm9yIHRoaXMgdHlwZSBvZiBjb250aW51b3VzIGV2ZW50IHRvIG5vIGV2ZW50LlxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LmxhbmVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gRmlyc3QgcmVwbGF5IGRpc2NyZXRlIGV2ZW50cy5cblxuICB3aGlsZSAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RGlzY3JldGVFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdO1xuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIC8vIEluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIGJvdW5kYXJ5IHRvIHVuYmxvY2tcbiAgICAgIC8vIHRoZSBuZXh0IGRpc2NyZXRlIGV2ZW50LlxuICAgICAgdmFyIF9maWJlcjQgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oX2ZpYmVyNCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRDb250YWluZXJzID0gbmV4dERpc2NyZXRlRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICAgIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBhdHRlbXB0VG9EaXNwYXRjaEV2ZW50KG5leHREaXNjcmV0ZUV2ZW50LmRvbUV2ZW50TmFtZSwgbmV4dERpc2NyZXRlRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuZXh0RGlzY3JldGVFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgICAgbmV4dERpc2NyZXRlRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UndmUgc3VjY2Vzc2Z1bGx5IHJlcGxheWVkIHRoZSBmaXJzdCBldmVudC4gTGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAgIHF1ZXVlZERpc2NyZXRlRXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9IC8vIE5leHQgcmVwbGF5IGFueSBjb250aW51b3VzIGV2ZW50cy5cblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnQgPSAwO1xudmFyIFVzZXJCbG9ja2luZ0V2ZW50ID0gMTtcbnZhciBDb250aW51b3VzRXZlbnQgPSAyO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTtcbnZhciBldmVudFByaW9yaXRpZXMgPSBuZXcgTWFwKCk7IC8vIFdlIHN0b3JlIG1vc3Qgb2YgdGhlIGV2ZW50cyBpbiB0aGlzIG1vZHVsZSBpbiBwYWlycyBvZiB0d28gc3RyaW5ncyBzbyB3ZSBjYW4gcmUtdXNlXG4vLyB0aGUgY29kZSByZXF1aXJlZCB0byBhcHBseSB0aGUgc2FtZSBsb2dpYyBmb3IgZXZlbnQgcHJpb3JpdGl6YXRpb24gYW5kIHRoYXQgb2YgdGhlXG4vLyBTaW1wbGVFdmVudFBsdWdpbi4gVGhpcyBjb21wbGljYXRlcyB0aGluZ3Mgc2xpZ2h0bHksIGJ1dCB0aGUgYWltIGlzIHRvIHJlZHVjZSBjb2RlXG4vLyBkdXBsaWNhdGlvbiAoZm9yIHdoaWNoIHRoZXJlIHdvdWxkIGJlIHF1aXRlIGEgYml0KS4gRm9yIHRoZSBldmVudHMgdGhhdCBhcmUgbm90IG5lZWRlZFxuLy8gZm9yIHRoZSBTaW1wbGVFdmVudFBsdWdpbiAob3RoZXJEaXNjcmV0ZUV2ZW50cykgd2UgcHJvY2VzcyB0aGVtIHNlcGFyYXRlbHkgYXMgYW5cbi8vIGFycmF5IG9mIHRvcCBsZXZlbCBldmVudHMuXG4vLyBMYXN0bHksIHdlIGlnbm9yZSBwcmV0dGllciBzbyB3ZSBjYW4ga2VlcCB0aGUgZm9ybWF0dGluZyBzYW5lLlxuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBkaXNjcmV0ZUV2ZW50UGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiA9IFsnY2FuY2VsJywgJ2NhbmNlbCcsICdjbGljaycsICdjbGljaycsICdjbG9zZScsICdjbG9zZScsICdjb250ZXh0bWVudScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2NvcHknLCAnY3V0JywgJ2N1dCcsICdhdXhjbGljaycsICdhdXhDbGljaycsICdkYmxjbGljaycsICdkb3VibGVDbGljaycsIC8vIENhcmVmdWwhXG4nZHJhZ2VuZCcsICdkcmFnRW5kJywgJ2RyYWdzdGFydCcsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkcm9wJywgJ2ZvY3VzaW4nLCAnZm9jdXMnLCAvLyBDYXJlZnVsIVxuJ2ZvY3Vzb3V0JywgJ2JsdXInLCAvLyBDYXJlZnVsIVxuJ2lucHV0JywgJ2lucHV0JywgJ2ludmFsaWQnLCAnaW52YWxpZCcsICdrZXlkb3duJywgJ2tleURvd24nLCAna2V5cHJlc3MnLCAna2V5UHJlc3MnLCAna2V5dXAnLCAna2V5VXAnLCAnbW91c2Vkb3duJywgJ21vdXNlRG93bicsICdtb3VzZXVwJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGFzdGUnLCAncGF1c2UnLCAncGF1c2UnLCAncGxheScsICdwbGF5JywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVyRG93bicsICdwb2ludGVydXAnLCAncG9pbnRlclVwJywgJ3JhdGVjaGFuZ2UnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNldCcsICdzZWVrZWQnLCAnc2Vla2VkJywgJ3N1Ym1pdCcsICdzdWJtaXQnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hFbmQnLCAndG91Y2hzdGFydCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZWNoYW5nZScsICd2b2x1bWVDaGFuZ2UnXTtcbnZhciBvdGhlckRpc2NyZXRlRXZlbnRzID0gWydjaGFuZ2UnLCAnc2VsZWN0aW9uY2hhbmdlJywgJ3RleHRJbnB1dCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9udXBkYXRlJ107XG5cblxudmFyIHVzZXJCbG9ja2luZ1BhaXJzRm9yU2ltcGxlRXZlbnRQbHVnaW4gPSBbJ2RyYWcnLCAnZHJhZycsICdkcmFnZW50ZXInLCAnZHJhZ0VudGVyJywgJ2RyYWdleGl0JywgJ2RyYWdFeGl0JywgJ2RyYWdsZWF2ZScsICdkcmFnTGVhdmUnLCAnZHJhZ292ZXInLCAnZHJhZ092ZXInLCAnbW91c2Vtb3ZlJywgJ21vdXNlTW92ZScsICdtb3VzZW91dCcsICdtb3VzZU91dCcsICdtb3VzZW92ZXInLCAnbW91c2VPdmVyJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJvdXQnLCAncG9pbnRlck91dCcsICdwb2ludGVyb3ZlcicsICdwb2ludGVyT3ZlcicsICdzY3JvbGwnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b2dnbGUnLCAndG91Y2htb3ZlJywgJ3RvdWNoTW92ZScsICd3aGVlbCcsICd3aGVlbCddOyAvLyBwcmV0dGllci1pZ25vcmVcblxudmFyIGNvbnRpbnVvdXNQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luID0gWydhYm9ydCcsICdhYm9ydCcsIEFOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnLCBBTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJywgQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnLCAnY2FucGxheScsICdjYW5QbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2NhblBsYXlUaHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2Vycm9yJywgJ2dvdHBvaW50ZXJjYXB0dXJlJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2xvYWQnLCAnbG9hZCcsICdsb2FkZWRkYXRhJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ2xvYWRTdGFydCcsICdsb3N0cG9pbnRlcmNhcHR1cmUnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ3BsYXlpbmcnLCAncGxheWluZycsICdwcm9ncmVzcycsICdwcm9ncmVzcycsICdzZWVraW5nJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3RpbWVVcGRhdGUnLCBUUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnLCAnd2FpdGluZycsICd3YWl0aW5nJ107XG4vKipcbiAqIFR1cm5zXG4gKiBbJ2Fib3J0JywgLi4uXVxuICpcbiAqIGludG9cbiAqXG4gKiB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoW1xuICogICBbJ2Fib3J0JywgJ29uQWJvcnQnXSxcbiAqIF0pO1xuICpcbiAqIGFuZCByZWdpc3RlcnMgdGhlbS5cbiAqL1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhldmVudFR5cGVzLCBwcmlvcml0eSkge1xuICAvLyBBcyB0aGUgZXZlbnQgdHlwZXMgYXJlIGluIHBhaXJzIG9mIHR3bywgd2UgbmVlZCB0byBpdGVyYXRlXG4gIC8vIHRocm91Z2ggaW4gdHdvcy4gVGhlIGV2ZW50cyBhcmUgaW4gcGFpcnMgb2YgdHdvIHRvIHNhdmUgY29kZVxuICAvLyBhbmQgaW1wcm92ZSBpbml0IHBlcmYgb2YgcHJvY2Vzc2luZyB0aGlzIGFycmF5LCBhcyBpdCB3aWxsXG4gIC8vIHJlc3VsdCBpbiBmYXIgZmV3ZXIgb2JqZWN0IGFsbG9jYXRpb25zIGFuZCBwcm9wZXJ0eSBhY2Nlc3Nlc1xuICAvLyBpZiB3ZSBvbmx5IHVzZSB0aHJlZSBhcnJheXMgdG8gcHJvY2VzcyBhbGwgdGhlIGNhdGVnb3JpZXMgb2ZcbiAgLy8gaW5zdGVhZCBvZiB0dXBsZXMuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB0b3BFdmVudCA9IGV2ZW50VHlwZXNbaV07XG4gICAgdmFyIGV2ZW50ID0gZXZlbnRUeXBlc1tpICsgMV07XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gICAgdmFyIHJlYWN0TmFtZSA9ICdvbicgKyBjYXBpdGFsaXplZEV2ZW50O1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQodG9wRXZlbnQsIHByaW9yaXR5KTtcbiAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQodG9wRXZlbnQsIHJlYWN0TmFtZSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW3RvcEV2ZW50XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnRQcmlvcml0aWVzKGV2ZW50VHlwZXMsIHByaW9yaXR5KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQoZXZlbnRUeXBlc1tpXSwgcHJpb3JpdHkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHlGb3JQbHVnaW5TeXN0ZW0oZG9tRXZlbnROYW1lKSB7XG4gIHZhciBwcmlvcml0eSA9IGV2ZW50UHJpb3JpdGllcy5nZXQoZG9tRXZlbnROYW1lKTsgLy8gRGVmYXVsdCB0byBhIENvbnRpbnVvdXNFdmVudC4gTm90ZTogd2UgbWlnaHRcbiAgLy8gd2FudCB0byB3YXJuIGlmIHdlIGNhbid0IGRldGVjdCB0aGUgcHJpb3JpdHlcbiAgLy8gZm9yIHRoZSBldmVudC5cblxuICByZXR1cm4gcHJpb3JpdHkgPT09IHVuZGVmaW5lZCA/IENvbnRpbnVvdXNFdmVudCA6IHByaW9yaXR5O1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIHJlZ2lzdGVyU2ltcGxlUGx1Z2luRXZlbnRzQW5kU2V0VGhlaXJQcmlvcml0aWVzKGRpc2NyZXRlRXZlbnRQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luLCBEaXNjcmV0ZUV2ZW50KTtcbiAgcmVnaXN0ZXJTaW1wbGVQbHVnaW5FdmVudHNBbmRTZXRUaGVpclByaW9yaXRpZXModXNlckJsb2NraW5nUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgVXNlckJsb2NraW5nRXZlbnQpO1xuICByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhjb250aW51b3VzUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgQ29udGludW91c0V2ZW50KTtcbiAgc2V0RXZlbnRQcmlvcml0aWVzKG90aGVyRGlzY3JldGVFdmVudHMsIERpc2NyZXRlRXZlbnQpO1xufVxuXG52YXIgU2NoZWR1bGVyX25vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG5cbntcbiAgLy8gUHJvdmlkZSBleHBsaWNpdCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvZHVjdGlvbitwcm9maWxpbmcgYnVuZGxlIG9mIGUuZy5cbiAgLy8gcmVhY3QtZG9tIGlzIHVzZWQgd2l0aCBwcm9kdWN0aW9uIChub24tcHJvZmlsaW5nKSBidW5kbGUgb2ZcbiAgLy8gc2NoZWR1bGVyL3RyYWNpbmdcbiAgaWYgKCEodHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZiAhPSBudWxsICYmIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCAhPSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gcnVuIHRoZSBwcm9maWxpbmcgdmVyc2lvbiBvZiBhIHJlbmRlcmVyIChmb3IgZXhhbXBsZSwgYHJlYWN0LWRvbS9wcm9maWxpbmdgKSB3aXRob3V0IGFsc28gcmVwbGFjaW5nIHRoZSBgc2NoZWR1bGVyL3RyYWNpbmdgIG1vZHVsZSB3aXRoIGBzY2hlZHVsZXIvdHJhY2luZy1wcm9maWxpbmdgLiBZb3VyIGJ1bmRsZXIgbWlnaHQgaGF2ZSBhIHNldHRpbmcgZm9yIGFsaWFzaW5nIGJvdGggbW9kdWxlcy4gTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcHJvZmlsaW5nXCIgKTtcbiAgICB9XG4gIH1cbn1cbi8vIGFzY2VuZGluZyBudW1iZXJzIHNvIHdlIGNhbiBjb21wYXJlIHRoZW0gbGlrZSBudW1iZXJzLiBUaGV5IHN0YXJ0IGF0IDkwIHRvXG4vLyBhdm9pZCBjbGFzaGluZyB3aXRoIFNjaGVkdWxlcidzIHByaW9yaXRpZXMuXG5cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gOTg7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSA5NztcbnZhciBMb3dQcmlvcml0eSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSA9IDk1OyAvLyBOb1ByaW9yaXR5IGlzIHRoZSBhYnNlbmNlIG9mIHByaW9yaXR5LiBBbHNvIFJlYWN0LW9ubHkuXG5cbnZhciBOb1ByaW9yaXR5ID0gOTA7XG52YXIgaW5pdGlhbFRpbWVNcyA9IFNjaGVkdWxlcl9ub3coKTsgLy8gSWYgdGhlIGluaXRpYWwgdGltZXN0YW1wIGlzIHJlYXNvbmFibHkgc21hbGwsIHVzZSBTY2hlZHVsZXIncyBgbm93YCBkaXJlY3RseS5cblxudmFyIFN5bmNMYW5lUHJpb3JpdHkgPSAxNTtcbnZhciBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSA9IDE0O1xudmFyIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAxMztcbnZhciBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5ID0gMTI7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5ID0gMTE7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5ID0gMTA7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmVQcmlvcml0eSA9IDk7XG52YXIgRGVmYXVsdExhbmVQcmlvcml0eSA9IDg7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvblByaW9yaXR5ID0gNztcbnZhciBUcmFuc2l0aW9uUHJpb3JpdHkgPSA2O1xudmFyIFJldHJ5TGFuZVByaW9yaXR5ID0gNTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSA0O1xudmFyIElkbGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAzO1xudmFyIElkbGVMYW5lUHJpb3JpdHkgPSAyO1xudmFyIE9mZnNjcmVlbkxhbmVQcmlvcml0eSA9IDE7XG52YXIgTm9MYW5lUHJpb3JpdHkgPSAwO1xudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFN5bmNCYXRjaGVkTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAqL1xuNDtcbnZhciBJbnB1dERpc2NyZXRlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yNDtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAqL1xuMzI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAqL1xuMTkyO1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBEZWZhdWx0TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjM1ODQ7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE4NjExMjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42MjkxNDU2MDtcbnZhciBTb21lUmV0cnlMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzQyMTc3Mjc7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIElkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgwNTMwNjM2ODtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0O1xudmFyIE5vVGltZXN0YW1wID0gLTE7XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlTGFuZVByaW9yaXR5KG5ld0xhbmVQcmlvcml0eSkge1xufSAvLyBcIlJlZ2lzdGVyc1wiIHVzZWQgdG8gXCJyZXR1cm5cIiBtdWx0aXBsZSB2YWx1ZXNcbi8vIFVzZWQgYnkgZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMgYW5kIGdldE5leHRMYW5lczpcblxudmFyIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gRGVmYXVsdExhbmVQcmlvcml0eTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgaWYgKChTeW5jTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICBpZiAoKFN5bmNCYXRjaGVkTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIFN5bmNCYXRjaGVkTGFuZTtcbiAgfVxuXG4gIGlmICgoSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgJiBsYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0RGlzY3JldGVMYW5lcyA9IElucHV0RGlzY3JldGVMYW5lcyAmIGxhbmVzO1xuXG4gIGlmIChpbnB1dERpc2NyZXRlTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIGlucHV0RGlzY3JldGVMYW5lcztcbiAgfVxuXG4gIGlmICgobGFuZXMgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0Q29udGludW91c0xhbmVzID0gSW5wdXRDb250aW51b3VzTGFuZXMgJiBsYW5lcztcblxuICBpZiAoaW5wdXRDb250aW51b3VzTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaW5wdXRDb250aW51b3VzTGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0TGFuZXMgPSBEZWZhdWx0TGFuZXMgJiBsYW5lcztcblxuICBpZiAoZGVmYXVsdExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBkZWZhdWx0TGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBUcmFuc2l0aW9uSHlkcmF0aW9uUHJpb3JpdHk7XG4gICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIHRyYW5zaXRpb25MYW5lcyA9IFRyYW5zaXRpb25MYW5lcyAmIGxhbmVzO1xuXG4gIGlmICh0cmFuc2l0aW9uTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFRyYW5zaXRpb25Qcmlvcml0eTtcbiAgICByZXR1cm4gdHJhbnNpdGlvbkxhbmVzO1xuICB9XG5cbiAgdmFyIHJldHJ5TGFuZXMgPSBSZXRyeUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKHJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFJldHJ5TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiByZXRyeUxhbmVzO1xuICB9XG5cbiAgaWYgKGxhbmVzICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgaWYgKChsYW5lcyAmIElkbGVIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gIH1cblxuICB2YXIgaWRsZUxhbmVzID0gSWRsZUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKGlkbGVMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaWRsZUxhbmVzO1xuICB9XG5cbiAgaWYgKChPZmZzY3JlZW5MYW5lICYgbGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBPZmZzY3JlZW5MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICB7XG4gICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IERlZmF1bHRMYW5lUHJpb3JpdHk7XG4gIHJldHVybiBsYW5lcztcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0xhbmVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSWRsZUxhbmVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gTm9MYW5lUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxhbmVQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkobGFuZVByaW9yaXR5KSB7XG4gIHN3aXRjaCAobGFuZVByaW9yaXR5KSB7XG4gICAgY2FzZSBTeW5jTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW1tZWRpYXRlUHJpb3JpdHk7XG5cbiAgICBjYXNlIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk6XG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgRGVmYXVsdExhbmVQcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTpcbiAgICBjYXNlIFJldHJ5TGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSWRsZUxhbmVQcmlvcml0eTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJZGxlUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vUHJpb3JpdHk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCB1cGRhdGUgcHJpb3JpdHk6IFwiICsgbGFuZVByaW9yaXR5ICsgXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgbmV4dExhbmVQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB2YXIgZXhwaXJlZExhbmVzID0gcm9vdC5leHBpcmVkTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIENoZWNrIGlmIGFueSB3b3JrIGhhcyBleHBpcmVkLlxuXG4gIGlmIChleHBpcmVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBuZXh0TGFuZXMgPSBleHBpcmVkTGFuZXM7XG4gICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gICAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG4gICAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgICAgICBuZXh0TGFuZVByaW9yaXR5ID0gcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgICAgIG5leHRMYW5lUHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIGhpZ2hlciBwcmlvcml0eSBsYW5lcywgd2UnbGwgaW5jbHVkZSB0aGVtIGV2ZW4gaWYgdGhleVxuICAvLyBhcmUgc3VzcGVuZGVkLlxuXG5cbiAgbmV4dExhbmVzID0gcGVuZGluZ0xhbmVzICYgZ2V0RXF1YWxPckhpZ2hlclByaW9yaXR5TGFuZXMobmV4dExhbmVzKTsgLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh3aXBMYW5lcyk7XG4gICAgdmFyIHdpcExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuXG4gICAgaWYgKG5leHRMYW5lUHJpb3JpdHkgPD0gd2lwTGFuZVByaW9yaXR5KSB7XG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gbmV4dExhbmVQcmlvcml0eTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IEV4cGlyYXRpb24gaGV1cmlzdGljIGlzIGNvbnN0YW50IHBlciBsYW5lLCBzbyBjb3VsZCB1c2UgYSBtYXAuXG4gIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmUpO1xuICB2YXIgcHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcblxuICBpZiAocHJpb3JpdHkgPj0gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5KSB7XG4gICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuIFdoZW5cbiAgICAvLyB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nIHRoZXJlJ3NcbiAgICAvLyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2Ygc3luY2hyb25vdXNcbiAgICAvLyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGVcbiAgICAvLyBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgZXhwaXJhdGlvblxuICAgIC8vIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvbiBkb2VzIGhhcHBlbi5cbiAgICAvL1xuICAgIC8vIEFsc28gbm90ZSB0aGF0LCBpbiB0aGUgY2FzZSBvZiB1c2VyIGlucHV0IHNwZWNpZmljYWxseSwgdGhpcyB3aWxsIHNvb24gbm9cbiAgICAvLyBsb25nZXIgYmUgYW4gaXNzdWUgYmVjYXVzZSB3ZSBwbGFuIHRvIG1ha2UgdXNlciBpbnB1dCBzeW5jaHJvbm91cyBieVxuICAgIC8vIGRlZmF1bHQgKHVudGlsIHlvdSBlbnRlciBgc3RhcnRUcmFuc2l0aW9uYCwgb2YgY291cnNlLilcbiAgICAvL1xuICAgIC8vIElmIHdlcmVuJ3QgcGxhbm5pbmcgdG8gbWFrZSB0aGVzZSB1cGRhdGVzIHN5bmNocm9ub3VzIHNvb24gYW55d2F5LCBJXG4gICAgLy8gd291bGQgcHJvYmFibHkgbWFrZSB0aGlzIG51bWJlciBhIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuXG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICB9IGVsc2UgaWYgKHByaW9yaXR5ID49IFRyYW5zaXRpb25Qcmlvcml0eSkge1xuICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiByZXR1cm5OZXh0TGFuZXNQcmlvcml0eSgpIHtcbiAgcmV0dXJuIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn0gLy8gVG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyBtdWx0aXBsZSB1cGRhdGVzIGluIHRoZSBzYW1lIGV2ZW50LCB0aGlzIHNob3VsZFxuLy8gYmUgYSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFVwZGF0ZUxhbmUobGFuZVByaW9yaXR5LCB3aXBMYW5lcykge1xuICBzd2l0Y2ggKGxhbmVQcmlvcml0eSkge1xuICAgIGNhc2UgTm9MYW5lUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3luY0xhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0JhdGNoZWRMYW5lO1xuXG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJbnB1dERpc2NyZXRlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgIGlmIChfbGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgLy8gU2hpZnQgdG8gdGhlIG5leHQgcHJpb3JpdHkgbGV2ZWxcbiAgICAgICAgICByZXR1cm4gZmluZFVwZGF0ZUxhbmUoSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmU7XG4gICAgICB9XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9sYW5lMiA9IHBpY2tBcmJpdHJhcnlMYW5lKElucHV0Q29udGludW91c0xhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUyID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBTaGlmdCB0byB0aGUgbmV4dCBwcmlvcml0eSBsZXZlbFxuICAgICAgICAgIHJldHVybiBmaW5kVXBkYXRlTGFuZShEZWZhdWx0TGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmUyO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWZhdWx0TGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUzID0gcGlja0FyYml0cmFyeUxhbmUoRGVmYXVsdExhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUzID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBJZiBhbGwgdGhlIGRlZmF1bHQgbGFuZXMgYXJlIGFscmVhZHkgYmVpbmcgd29ya2VkIG9uLCBsb29rIGZvciBhXG4gICAgICAgICAgLy8gbGFuZSBpbiB0aGUgdHJhbnNpdGlvbiByYW5nZS5cbiAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgICAgaWYgKF9sYW5lMyA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgICAvLyBBbGwgdGhlIHRyYW5zaXRpb24gbGFuZXMgYXJlIHRha2VuLCB0b28uIFRoaXMgc2hvdWxkIGJlIHZlcnlcbiAgICAgICAgICAgIC8vIHJhcmUsIGJ1dCBhcyBhIGxhc3QgcmVzb3J0LCBwaWNrIGEgZGVmYXVsdCBsYW5lLiBUaGlzIHdpbGwgaGF2ZVxuICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgd29yay1pbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShEZWZhdWx0TGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbGFuZTM7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTogLy8gU2hvdWxkIGJlIGhhbmRsZWQgYnkgZmluZFRyYW5zaXRpb25MYW5lIGluc3RlYWRcblxuICAgIGNhc2UgUmV0cnlMYW5lUHJpb3JpdHk6XG4gICAgICAvLyBTaG91bGQgYmUgaGFuZGxlZCBieSBmaW5kUmV0cnlMYW5lIGluc3RlYWRcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZVByaW9yaXR5OlxuICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZTtcbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIHVwZGF0ZSBwcmlvcml0eTogXCIgKyBsYW5lUHJpb3JpdHkgKyBcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIiApO1xuICAgIH1cbiAgfVxufSAvLyBUbyBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHVwZGF0ZXMgaW4gdGhlIHNhbWUgZXZlbnQsIHRoaXMgc2hvdWxkXG4vLyBiZSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFRyYW5zaXRpb25MYW5lKHdpcExhbmVzLCBwZW5kaW5nTGFuZXMpIHtcbiAgLy8gRmlyc3QgbG9vayBmb3IgbGFuZXMgdGhhdCBhcmUgY29tcGxldGVseSB1bmNsYWltZWQsIGkuZS4gaGF2ZSBub1xuICAvLyBwZW5kaW5nIHdvcmsuXG4gIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUoVHJhbnNpdGlvbkxhbmVzICYgfnBlbmRpbmdMYW5lcyk7XG5cbiAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIElmIGFsbCBsYW5lcyBoYXZlIHBlbmRpbmcgd29yaywgbG9vayBmb3IgYSBsYW5lIHRoYXQgaXNuJ3QgY3VycmVudGx5XG4gICAgLy8gYmVpbmcgd29ya2VkIG9uLlxuICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBiZWluZyB3b3JrZWQgb24sIHBpY2sgYW55IGxhbmUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFRyYW5zaXRpb25MYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59IC8vIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdXBkYXRlcyBpbiB0aGUgc2FtZSBldmVudCwgdGhpcyBzaG91bGRcbi8vIGJlIHB1cmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgbGFuZSBmb3IgZ2l2ZW4gaW5wdXRzLlxuXG5mdW5jdGlvbiBmaW5kUmV0cnlMYW5lKHdpcExhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGBmaW5kVXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShSZXRyeUxhbmVzICYgfndpcExhbmVzKTtcblxuICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFJldHJ5TGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuXG5mdW5jdGlvbiBnZXRMb3dlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyBmaW5kcyB0aGUgbW9zdCBzaWduaWZpY2FudCBub24temVybyBiaXQuXG4gIHZhciBpbmRleCA9IDMxIC0gY2x6MzIobGFuZXMpO1xuICByZXR1cm4gaW5kZXggPCAwID8gTm9MYW5lcyA6IDEgPDwgaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdldEVxdWFsT3JIaWdoZXJQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHJldHVybiAoZ2V0TG93ZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSA8PCAxKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCBhbnkgdXBkYXRlIHRvIGFueSBsYW5lIGNhbiB1bmJsb2NrIGFueSBvdGhlciBsYW5lLiBCdXRcbiAgLy8gaXQncyBub3QgcHJhY3RpY2FsIHRvIHRyeSBldmVyeSBzaW5nbGUgcG9zc2libGUgY29tYmluYXRpb24uIFdlIG5lZWQgYVxuICAvLyBoZXVyaXN0aWMgdG8gZGVjaWRlIHdoaWNoIGxhbmVzIHRvIGF0dGVtcHQgdG8gcmVuZGVyLCBhbmQgaW4gd2hpY2ggYmF0Y2hlcy5cbiAgLy8gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIGhldXJpc3RpYyBhcyBpbiB0aGUgb2xkIEV4cGlyYXRpb25UaW1lcyBtb2RlbDpcbiAgLy8gcmV0cnkgYW55IGxhbmUgYXQgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHksIGJ1dCBkb24ndCB0cnkgdXBkYXRlcyBhdCBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgd2l0aG91dCBhbHNvIGluY2x1ZGluZyB0aGUgbG93ZXIgcHJpb3JpdHkgdXBkYXRlcy4gVGhpcyB3b3JrcyB3ZWxsXG4gIC8vIHdoZW4gY29uc2lkZXJpbmcgdXBkYXRlcyBhY3Jvc3MgZGlmZmVyZW50IHByaW9yaXR5IGxldmVscywgYnV0IGlzbid0XG4gIC8vIHN1ZmZpY2llbnQgZm9yIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5LCBzaW5jZSB3ZSB3YW50IHRvIHRyZWF0XG4gIC8vIHRob3NlIHVwZGF0ZXMgYXMgcGFyYWxsZWwuXG4gIC8vIFVuc3VzcGVuZCBhbnkgdXBkYXRlIGF0IGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5LlxuXG4gIHZhciBoaWdoZXJQcmlvcml0eUxhbmVzID0gdXBkYXRlTGFuZSAtIDE7IC8vIFR1cm5zIDBiMTAwMCBpbnRvIDBiMDExMVxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgJj0gaGlnaGVyUHJpb3JpdHlMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSBoaWdoZXJQcmlvcml0eUxhbmVzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCkge1xuICByb290LmV4cGlyZWRMYW5lcyB8PSBJbnB1dERpc2NyZXRlTGFuZXMgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIGhhc0Rpc2NyZXRlTGFuZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIElucHV0RGlzY3JldGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdE11dGFibGVSZWFkKHJvb3QsIHVwZGF0ZUxhbmUpIHtcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzIHw9IHVwZGF0ZUxhbmUgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IDA7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSBlbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuIE9ubHkgdXNlZCBvbiBsYW5lcywgc28gYXNzdW1lIGlucHV0IGlzIGFuIGludGVnZXIuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKGxhbmVzKSB7XG4gIGlmIChsYW5lcyA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2cobGFuZXMpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJbnRlbnRpb25hbGx5IG5vdCBuYW1lZCBpbXBvcnRzIGJlY2F1c2UgUm9sbHVwIHdvdWxkIHVzZSBkeW5hbWljIGRpc3BhdGNoIGZvclxudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksXG4gICAgcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eUZvclBsdWdpblN5c3RlbShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudDpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJZk5lZWRlZChuYXRpdmVFdmVudC50aW1lU3RhbXApO1xuICB9XG5cbiAgZGlzY3JldGVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgcnVuV2l0aFByaW9yaXR5KFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEsIGRpc3BhdGNoRXZlbnQuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFsbG93UmVwbGF5ID0gdHJ1ZTtcblxuICB7XG4gICAgLy8gVE9ETzogcmVwbGF5aW5nIGNhcHR1cmUgcGhhc2UgZXZlbnRzIGlzIGN1cnJlbnRseSBicm9rZW5cbiAgICAvLyBiZWNhdXNlIHdlIHVzZWQgdG8gZG8gaXQgZHVyaW5nIHRvcC1sZXZlbCBuYXRpdmUgYnViYmxlIGhhbmRsZXJzXG4gICAgLy8gYnV0IG5vdyB3ZSB1c2UgZGlmZmVyZW50IGJ1YmJsZSBhbmQgY2FwdHVyZSBoYW5kbGVycy5cbiAgICAvLyBJbiBlYWdlciBtb2RlLCB3ZSBhdHRhY2ggY2FwdHVyZSBsaXN0ZW5lcnMgZWFybHksIHNvIHdlIG5lZWRcbiAgICAvLyB0byBmaWx0ZXIgdGhlbSBvdXQgdW50aWwgd2UgZml4IHRoZSBsb2dpYyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkuXG4gICAgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIG91dHNpZGUgdGhlIGZsYWcgYnV0IEkgcHV0IGl0IGluc2lkZSB0byByZWR1Y2Ugcmlzay5cbiAgICBhbGxvd1JlcGxheSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgPT09IDA7XG4gIH1cblxuICBpZiAoYWxsb3dSZXBsYXkgJiYgaGFzUXVldWVkRGlzY3JldGVFdmVudHMoKSAmJiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMsIGFuZCB0aGlzIGlzIGFub3RoZXIgZGlzY3JldGVcbiAgICAvLyBldmVudCwgdGhlbiB3ZSBjYW4ndCBkaXNwYXRjaCBpdCByZWdhcmRsZXNzIG9mIGl0cyB0YXJnZXQsIHNpbmNlIHRoZXlcbiAgICAvLyBuZWVkIHRvIGRpc3BhdGNoIGluIG9yZGVyLlxuICAgIHF1ZXVlRGlzY3JldGVFdmVudChudWxsLCAvLyBGbGFncyB0aGF0IHdlJ3JlIG5vdCBhY3R1YWxseSBibG9ja2VkIG9uIGFueXRoaW5nIGFzIGZhciBhcyB3ZSBrbm93LlxuICAgIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJsb2NrZWRPbiA9IGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQgdGhpcyBldmVudC5cbiAgICBpZiAoYWxsb3dSZXBsYXkpIHtcbiAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93UmVwbGF5KSB7XG4gICAgaWYgKGlzUmVwbGF5YWJsZURpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lKSkge1xuICAgICAgLy8gVGhpcyB0aGlzIHRvIGJlIHJlcGxheWVkIGxhdGVyIG9uY2UgdGhlIHRhcmdldCBpcyBhdmFpbGFibGUuXG4gICAgICBxdWV1ZURpc2NyZXRlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gICAgLy8gcXVldWVpbmcgaXMgYWNjdW1tdWxhdGl2ZS5cblxuXG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59IC8vIEF0dGVtcHQgZGlzcGF0Y2hpbmcgYW4gZXZlbnQuIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcblxuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19SRVBMQVlFRCkgPT09IDApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIGhhc093blByb3BlcnR5JDIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duUHJvcGVydHkkMi5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhb2JqZWN0SXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuXG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBldmVudHNcbiAgICAgIC8vIGZvciB0aGUgc2FtZSBwb3J0YWwgY29udGFpbmVyIG9yIHJvb3Qgbm9kZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgIC8vIFRPRE86IG9uY2Ugd2UgcmVtb3ZlIHRoZSBmbGFnLCB3ZSBtYXkgYmUgYWJsZSB0byBhbHNvXG4gICAgICAvLyByZW1vdmUgc29tZSBvZiB0aGUgYm9va2tlZXBpbmcgbWFwcyB1c2VkIGZvciBsYXppbmVzcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHJvb3RDb250YWluZXJFbGVtZW50LCB0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgdGFyZ2V0ID0gcm9vdENvbnRhaW5lckVsZW1lbnQ7IC8vIHNlbGVjdGlvbmNoYW5nZSBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnRcbiAgLy8gb3RoZXJ3aXNlIGl0IHdvbid0IGNhcHR1cmUgaW5jb21pbmcgZXZlbnRzIHRoYXQgYXJlIG9ubHlcbiAgLy8gdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCBkaXJlY3RseS5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyAmJiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSAhPT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHRhcmdldCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIH0gLy8gSWYgdGhlIGV2ZW50IGNhbiBiZSBkZWxlZ2F0ZWQgKG9yIGlzIGNhcHR1cmUgcGhhc2UpLCB3ZSBjYW5cbiAgLy8gcmVnaXN0ZXIgaXQgdG8gdGhlIHJvb3QgY29udGFpbmVyLiBPdGhlcndpc2UsIHdlIHNob3VsZFxuICAvLyByZWdpc3RlciB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50IGFuZCBtYXJrIGl0IGFzXG4gIC8vIGEgbm9uLWRlbGVnYXRlZCBldmVudC5cblxuXG4gIGlmICh0YXJnZXRFbGVtZW50ICE9PSBudWxsICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmIG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgIC8vIEZvciBhbGwgbm9uLWRlbGVnYXRlZCBldmVudHMsIGFwYXJ0IGZyb20gc2Nyb2xsLCB3ZSBhdHRhY2hcbiAgICAvLyB0aGVpciBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHJlc3BlY3RpdmUgZWxlbWVudHMgdGhhdCB0aGVpclxuICAgIC8vIGV2ZW50cyBmaXJlIG9uLiBUaGF0IG1lYW5zIHdlIGNhbiBza2lwIHRoaXMgc3RlcCwgYXMgZXZlbnRcbiAgICAvLyBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHByZXZpb3VzbHkuIEhvd2V2ZXIsIHdlXG4gICAgLy8gc3BlY2lhbCBjYXNlIHRoZSBzY3JvbGwgZXZlbnQgYmVjYXVzZSB0aGUgcmVhbGl0eSBpcyB0aGF0IGFueVxuICAgIC8vIGVsZW1lbnQgY2FuIHNjcm9sbC5cbiAgICAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYXBwbHkgdGhlIHNhbWUgbG9naWMgdG8gYWxsXG4gICAgLy8gZXZlbnRzIGZyb20gdGhlIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0LiBUaGVuIHdlIGNhbiByZW1vdmVcbiAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZSBhbmQgdXNlIHRoZSBzYW1lIGxvZ2ljIGZvciBhbGwgZXZlbnRzLlxuICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzY3JvbGwnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19OT05fREVMRUdBVEVEO1xuICAgIHRhcmdldCA9IHRhcmdldEVsZW1lbnQ7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7IC8vIElmIHRoZSBsaXN0ZW5lciBlbnRyeSBpcyBlbXB0eSBvciB3ZSBzaG91bGQgdXBncmFkZSwgdGhlblxuICAvLyB3ZSBuZWVkIHRvIHRyYXAgYW4gZXZlbnQgbGlzdGVuZXIgb250byB0aGUgdGFyZ2V0LlxuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gICAgfVxuXG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkRXZlbnRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIEhUTUxfTkFNRVNQQUNFJDEgPSBOYW1lc3BhY2VzLmh0bWw7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclRleHREaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZTtcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuICAvLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbiAgLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbiAgLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG4gIHZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xuICB2YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG4gIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbiAgfTtcblxuICB3YXJuRm9yVGV4dERpZmZlcmVuY2UgPSBmdW5jdGlvbiAoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gIH07XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdvYmplY3QnICYmIG5leHRQcm9wICE9PSBudWxsICYmIG5leHRQcm9wLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRSkge1xuICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIHVzZU9wYXF1ZVJlZmVyZW5jZSdzIG9wYXF1ZSBvYmplY3QsIHRoaXMgbWVhbnMgd2UgYXJlIGh5ZHJhdGluZy5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgY2FsbCB0aGUgb3BhcXVlIG9iamVjdCdzIHRvU3RyaW5nIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIG5ldyBjbGllbnRcbiAgICAgIC8vIElEIHNvIGNsaWVudCBhbmQgc2VydmVyIElEcyBtYXRjaCBhbmQgdGhyb3dzIHRvIHJlcmVuZGVyLlxuICAgICAgbmV4dFByb3AudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlO1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIEJ1aWx0LWluIFNTUiBhdHRyaWJ1dGUgaXMgYWxsb3dlZFxuICAgICAgICBjYXNlICdkYXRhLXJlYWN0cm9vdCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cblxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICggLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgaWYgKGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclRleHREaWZmZXJlbmNlKHRleHROb2RlLm5vZGVWYWx1ZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gX2Fzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxO1xuXG57XG4gIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICByZXR1cm4gc2hvdWxkQXV0b0ZvY3VzSG9zdENvbXBvbmVudCh0eXBlLCBwcm9wcyk7XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnb3B0aW9uJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICB2YXIgYm9keSA9IGNvbnRhaW5lci5ib2R5O1xuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgYm9keS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSk7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSA7XG59XG52YXIgY2xpZW50SWQgPSAwO1xuZnVuY3Rpb24gbWFrZUNsaWVudElkSW5ERVYod2Fybk9uQWNjZXNzSW5ERVYpIHtcbiAgdmFyIGlkID0gJ3I6JyArIChjbGllbnRJZCsrKS50b1N0cmluZygzNik7XG4gIHJldHVybiB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm5PbkFjY2Vzc0luREVWKCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuT25BY2Nlc3NJbkRFVigpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRTtcbn1cbmZ1bmN0aW9uIG1ha2VPcGFxdWVIeWRyYXRpbmdPYmplY3QoYXR0ZW1wdFRvUmVhZFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX09QQVFVRV9JRF9UWVBFLFxuICAgIHRvU3RyaW5nOiBhdHRlbXB0VG9SZWFkVmFsdWUsXG4gICAgdmFsdWVPZjogYXR0ZW1wdFRvUmVhZFZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAge1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbiAgfVxufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImdldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBfYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQmxvY2tpbmdSb290ID0gMTtcbnZhciBDb25jdXJyZW50Um9vdCA9IDI7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9IC8vIERldlRvb2xzIGV4aXN0c1xuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIHByaW9yaXR5TGV2ZWwpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTY2hlZHVsZXJfcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICBTY2hlZHVsZXJfc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQsXG4gICAgU2NoZWR1bGVyX3JlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsXG4gICAgU2NoZWR1bGVyX25vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICBTY2hlZHVsZXJfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgU2NoZWR1bGVyX0ltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgU2NoZWR1bGVyX0xvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9JZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuXG57XG4gIC8vIFByb3ZpZGUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZSB3aGVuIHByb2R1Y3Rpb24rcHJvZmlsaW5nIGJ1bmRsZSBvZiBlLmcuXG4gIC8vIHJlYWN0LWRvbSBpcyB1c2VkIHdpdGggcHJvZHVjdGlvbiAobm9uLXByb2ZpbGluZykgYnVuZGxlIG9mXG4gIC8vIHNjaGVkdWxlci90cmFjaW5nXG4gIGlmICghKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Byb2ZpbGluZ1wiICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlQ2FsbGJhY2tOb2RlID0ge307IC8vIEV4Y2VwdCBmb3IgTm9Qcmlvcml0eSwgdGhlc2UgY29ycmVzcG9uZCB0byBTY2hlZHVsZXIgcHJpb3JpdGllcy4gV2UgdXNlXG4vLyBhc2NlbmRpbmcgbnVtYmVycyBzbyB3ZSBjYW4gY29tcGFyZSB0aGVtIGxpa2UgbnVtYmVycy4gVGhleSBzdGFydCBhdCA5MCB0b1xuLy8gYXZvaWQgY2xhc2hpbmcgd2l0aCBTY2hlZHVsZXIncyBwcmlvcml0aWVzLlxuXG52YXIgSW1tZWRpYXRlUHJpb3JpdHkkMSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgPSA5ODtcbnZhciBOb3JtYWxQcmlvcml0eSQxID0gOTc7XG52YXIgTG93UHJpb3JpdHkkMSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSQxID0gOTU7IC8vIE5vUHJpb3JpdHkgaXMgdGhlIGFic2VuY2Ugb2YgcHJpb3JpdHkuIEFsc28gUmVhY3Qtb25seS5cblxudmFyIE5vUHJpb3JpdHkkMSA9IDkwO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IC8vIEZhbGwgYmFjayBncmFjZWZ1bGx5IGlmIHdlJ3JlIHJ1bm5pbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBTY2hlZHVsZXIuXG5TY2hlZHVsZXJfcmVxdWVzdFBhaW50ICE9PSB1bmRlZmluZWQgPyBTY2hlZHVsZXJfcmVxdWVzdFBhaW50IDogZnVuY3Rpb24gKCkge307XG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbW1lZGlhdGVRdWV1ZUNhbGxiYWNrTm9kZSA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xudmFyIGluaXRpYWxUaW1lTXMkMSA9IFNjaGVkdWxlcl9ub3ckMSgpOyAvLyBJZiB0aGUgaW5pdGlhbCB0aW1lc3RhbXAgaXMgcmVhc29uYWJseSBzbWFsbCwgdXNlIFNjaGVkdWxlcidzIGBub3dgIGRpcmVjdGx5LlxuLy8gVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGBwZXJmb3JtYW5jZS5ub3dgLiBJblxuLy8gb2xkZXIgYnJvd3NlcnMsIFNjaGVkdWxlciBmYWxscyBiYWNrIHRvIGBEYXRlLm5vd2AsIHdoaWNoIHJldHVybnMgYSBVbml4XG4vLyB0aW1lc3RhbXAuIEluIHRoYXQgY2FzZSwgc3VidHJhY3QgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIHRvIHNpbXVsYXRlXG4vLyB0aGUgYmVoYXZpb3Igb2YgcGVyZm9ybWFuY2Uubm93IGFuZCBrZWVwIG91ciB0aW1lcyBzbWFsbCBlbm91Z2ggdG8gZml0XG4vLyB3aXRoaW4gMzIgYml0cy5cbi8vIFRPRE86IENvbnNpZGVyIGxpZnRpbmcgdGhpcyBpbnRvIFNjaGVkdWxlci5cblxudmFyIG5vdyA9IGluaXRpYWxUaW1lTXMkMSA8IDEwMDAwID8gU2NoZWR1bGVyX25vdyQxIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU2NoZWR1bGVyX25vdyQxKCkgLSBpbml0aWFsVGltZU1zJDE7XG59O1xuZnVuY3Rpb24gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHN3aXRjaCAoU2NoZWR1bGVyX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICBjYXNlIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJbW1lZGlhdGVQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gVXNlckJsb2NraW5nUHJpb3JpdHkkMjtcblxuICAgIGNhc2UgU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5JDE7XG5cbiAgICBjYXNlIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTpcbiAgICAgIHJldHVybiBMb3dQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfSWRsZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIElkbGVQcmlvcml0eSQxO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcHJpb3JpdHkgbGV2ZWwuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhY3RQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHkkMjpcbiAgICAgIHJldHVybiBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTtcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX0lkbGVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmtub3duIHByaW9yaXR5IGxldmVsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQxKHJlYWN0UHJpb3JpdHlMZXZlbCwgZm4pIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBmbik7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrKHJlYWN0UHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdOyAvLyBGbHVzaCB0aGUgcXVldWUgaW4gdGhlIG5leHQgdGljaywgYXQgdGhlIGVhcmxpZXN0LlxuXG4gICAgaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgPSBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXJfSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrUXVldWVJbXBsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGZha2VDYWxsYmFja05vZGU7XG59XG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpIHtcbiAgaWYgKGNhbGxiYWNrTm9kZSAhPT0gZmFrZUNhbGxiYWNrTm9kZSkge1xuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCkge1xuICBpZiAoaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgbm9kZSA9IGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlO1xuICAgIGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBTY2hlZHVsZXJfY2FuY2VsQ2FsbGJhY2sobm9kZSk7XG4gIH1cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY3kuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9pc1N5bmMyID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9xdWV1ZSA9IHN5bmNRdWV1ZTtcbiAgICAgICAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAoOyBpIDwgX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfcXVldWVbaV07XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhfaXNTeW5jMik7XG4gICAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICAgIFNjaGVkdWxlcl9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxudmFyIE5vTW9kZSA9IDA7XG52YXIgU3RyaWN0TW9kZSA9IDE7IC8vIFRPRE86IFJlbW92ZSBCbG9ja2luZ01vZGUgYW5kIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdFxuLy8gdGFnIGluc3RlYWRcblxudmFyIEJsb2NraW5nTW9kZSA9IDI7XG52YXIgQ29uY3VycmVudE1vZGUgPSA0O1xudmFyIFByb2ZpbGVNb2RlID0gODtcbnZhciBEZWJ1Z1RyYWNpbmdNb2RlID0gMTY7XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IDA7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGJhc2VQcm9wcyk7XG5cbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxudmFyIE1BWF9TSUdORURfMzFfQklUX0lOVCA9IDEwNzM3NDE4MjM7XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBuZXh0VmFsdWUpIHtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlckZpYmVyLnR5cGUuX2NvbnRleHQ7XG5cbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVDaGFuZ2VkQml0cyhjb250ZXh0LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAvLyBObyBjaGFuZ2VcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2hhbmdlZEJpdHMgPSB0eXBlb2YgY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09ICdmdW5jdGlvbicgPyBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0cyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogTUFYX1NJR05FRF8zMV9CSVRfSU5UO1xuXG4gICAge1xuICAgICAgaWYgKChjaGFuZ2VkQml0cyAmIE1BWF9TSUdORURfMzFfQklUX0lOVCkgIT09IGNoYW5nZWRCaXRzKSB7XG4gICAgICAgIGVycm9yKCdjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhICcgKyAnMzEtYml0IGludGVnZXIuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQgJiYgKGRlcGVuZGVuY3kub2JzZXJ2ZWRCaXRzICYgY2hhbmdlZEJpdHMpICE9PSAwKSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cblxuICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID09PSBjb250ZXh0KSA7IGVsc2UgaWYgKG9ic2VydmVkQml0cyA9PT0gZmFsc2UgfHwgb2JzZXJ2ZWRCaXRzID09PSAwKSA7IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0czsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cblxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZWRCaXRzICE9PSAnbnVtYmVyJyB8fCBvYnNlcnZlZEJpdHMgPT09IE1BWF9TSUdORURfMzFfQklUX0lOVCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IE1BWF9TSUdORURfMzFfQklUX0lOVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRPYnNlcnZlZEJpdHMgPSBvYnNlcnZlZEJpdHM7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG9ic2VydmVkQml0czogcmVzb2x2ZWRPYnNlcnZlZEJpdHMsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmICghKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtLFxuICAgICAgICByZXNwb25kZXJzOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbFxuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBfYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICghKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgKyBjYWxsYmFjayApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5OyAvLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxuXG52YXIgZW1wdHlSZWZzT2JqZWN0ID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnJlZnM7XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0IGEgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7XG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgY2hpbGQuX3N0b3JlID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKCEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuIFdlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSBpbnN0LnJlZnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEodHlwZW9mIG1peGVkUmVmID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4yLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBuZXdDaGlsZCkgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59IC8vIFdlIGF2b2lkIGlubGluaW5nIHRoaXMgdG8gYXZvaWQgcG90ZW50aWFsIGRlb3B0cyBmcm9tIHVzaW5nIHRyeS9jYXRjaC5cbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuXG5cbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cblxuICAgIGNoaWxkVG9EZWxldGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgY2hpbGRUb0RlbGV0ZS5mbGFncyA9IERlbGV0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyA9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgPSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5JDEobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywga2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywgbmV3Q2hpbGQua2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAoISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKCEobmV3Q2hpbGRyZW4gIT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQudGFnKSB7XG4gICAgICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBCbG9jazpcblxuICAgICAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZmFsbHRocm91Z2ggaGVyZSBpZiBlbmFibGVCbG9ja3NBUEkgaXMgbm90IG9uLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2V4aXN0aW5nMyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgICAgIF9leGlzdGluZzMucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIF9leGlzdGluZzMuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RpbmczO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIHZhciBpc09iamVjdCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGw7XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAndW5kZWZpbmVkJyAmJiAhaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgcmV0dXJuIGZpYmVyIGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyBjb21wb25lbnQsIHRocm93IGFuIGVycm9yLiBJZiBGaWJlciByZXR1cm4gdHlwZXMgYXJlIGRpc2FibGVkLFxuICAgICAgLy8gd2UgYWxyZWFkeSB0aHJldyBhYm92ZS5cbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnJlbmRlci5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSwgd2hpY2ggaGFuZGxlcyBib3RoXG4gICAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgY2xhc3Nlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVkIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgICAgY2FzZSBCbG9jazpcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKSArIFwiKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuXCIgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICghKGN1cnJlbnQgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IGN1cnJlbnQuY2hpbGQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKCEoYyAhPT0gTk9fQ09OVEVYVCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIEluIG9yZGVyIHRvIGNhcHR1cmUsIHRoZSBTdXNwZW5zZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgZmFsbGJhY2sgcHJvcC5cblxuICBpZiAocHJvcHMuZmFsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cblxuICBpZiAocHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG4gIC8vIHBhcmVudCBib3VuZGFyeSBpZiBpdCBpcyBjdXJyZW50bHkgaW52aXNpYmxlLlxuXG5cbiAgaWYgKGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBhYmxlIHRvIGhhbmRsZSBpdCwgd2UgbXVzdCBoYW5kbGUgaXQuXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjI7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjQ7XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICBjaGlsZFRvRGVsZXRlLmZsYWdzID0gRGVsZXRpb247IC8vIFRoaXMgbWlnaHQgc2VlbSBsaWtlIGl0IGJlbG9uZ3Mgb24gcHJvZ3Jlc3NlZEZpcnN0RGVsZXRpb24uIEhvd2V2ZXIsXG4gIC8vIHRoZXNlIGNoaWxkcmVuIGFyZSBub3QgcGFydCBvZiB0aGUgcmVjb25jaWxpYXRpb24gbGlzdCBvZiBjaGlsZHJlbi5cbiAgLy8gRXZlbiBpZiB3ZSBhYm9ydCBhbmQgcmVyZWNvbmNpbGUgdGhlIGNoaWxkcmVuLCB0aGF0IHdpbGwgdHJ5IHRvIGh5ZHJhdGVcbiAgLy8gYWdhaW4gYW5kIHRoZSBub2RlcyBhcmUgc3RpbGwgaW4gdGhlIGhvc3QgdHJlZSBzbyB0aGVzZSB3aWxsIGJlXG4gIC8vIHJlY3JlYXRlZC5cblxuICBpZiAocmV0dXJuRmliZXIubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcblxuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQobmV4dEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyKTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAge1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0eXBlID0gZmliZXIudHlwZTsgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHR5cGUgIT09ICdoZWFkJyAmJiB0eXBlICE9PSAnYm9keScgJiYgIXNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xudmFyIHJlbmRlcmVyU2lnaWwkMTtcblxue1xuICAvLyBVc2VkIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgbXV0YWJsZSBzb3VyY2UuXG4gIHJlbmRlcmVyU2lnaWwkMSA9IHt9O1xufVxuXG5mdW5jdGlvbiBtYXJrU291cmNlQXNEaXJ0eShtdXRhYmxlU291cmNlKSB7XG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24obXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAgcmV0dXJuIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFdvcmtJblByb2dyZXNzVmVyc2lvbihtdXRhYmxlU291cmNlLCB2ZXJzaW9uKSB7XG4gIHtcbiAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gdmVyc2lvbjtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gd2FybkFib3V0TXVsdGlwbGVSZW5kZXJlcnNERVYobXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAge1xuICAgICAgaWYgKG11dGFibGVTb3VyY2UuX2N1cnJlbnRQcmltYXJ5UmVuZGVyZXIgPT0gbnVsbCkge1xuICAgICAgICBtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbCQxO1xuICAgICAgfSBlbHNlIGlmIChtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsJDEpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgbXV0YWJsZSBzb3VyY2UuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBFYWdlciByZWFkcyB0aGUgdmVyc2lvbiBvZiBhIG11dGFibGUgc291cmNlIGFuZCBzdG9yZXMgaXQgb24gdGhlIHJvb3QuXG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VXNlT3BhcXVlSWRlbnRpZmllcjtcblxue1xuICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyID0ge307XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnR5cGUpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcblxuICAgICAgaWYgKCEobnVtYmVyT2ZSZVJlbmRlcnMgPCBSRV9SRU5ERVJfTElNSVQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jeS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIGlmICghIWRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgZWFybHkgcmV0dXJuIHN0YXRlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmN5LlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmICghKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBlYWdlclJlZHVjZXI6IHVwZGF0ZS5lYWdlclJlZHVjZXIsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgZWFnZXJSZWR1Y2VyOiB1cGRhdGUuZWFnZXJSZWR1Y2VyLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmVhZ2VyUmVkdWNlciA9PT0gcmVkdWNlcikge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIHdhcyBwcm9jZXNzZWQgZWFnZXJseSwgYW5kIGl0cyByZWR1Y2VyIG1hdGNoZXMgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByZWR1Y2VyLCB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLlxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpIHtcbiAge1xuICAgIHdhcm5BYm91dE11bHRpcGxlUmVuZGVyZXJzREVWKHNvdXJjZSk7XG4gIH1cblxuICB2YXIgZ2V0VmVyc2lvbiA9IHNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKHNvdXJjZS5fc291cmNlKTsgLy8gSXMgaXQgc2FmZSBmb3IgdGhpcyBjb21wb25lbnQgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXI/XG5cbiAgdmFyIGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsgLy8gQ2hlY2sgdGhlIHZlcnNpb24gZmlyc3QuXG4gIC8vIElmIHRoaXMgcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbixcbiAgLy8gd2UgY2FuIHVzZSBpdCBhbG9uZSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHNhZmVseSByZWFkIGZyb20gdGhlIHNvdXJjZS5cblxuICB2YXIgY3VycmVudFJlbmRlclZlcnNpb24gPSBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24oc291cmNlKTtcblxuICBpZiAoY3VycmVudFJlbmRlclZlcnNpb24gIT09IG51bGwpIHtcbiAgICAvLyBJdCdzIHNhZmUgdG8gcmVhZCBpZiB0aGUgc3RvcmUgaGFzbid0IGJlZW4gbXV0YXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lXG4gICAgLy8gd2UgcmVhZCBzb21ldGhpbmcuXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGN1cnJlbnRSZW5kZXJWZXJzaW9uID09PSB2ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gdmVyc2lvbiwgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHJlYWQgZnJvbSB0aGVcbiAgICAvLyBzb3VyY2UgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLCBzbyB3ZSBuZWVkIHRvIGRvIGEgYml0IG1vcmUgd29yay5cbiAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlzIGlmIHRoZXJlIGFyZSBhbnkgaG9va3MgdGhhdCBhbHJlYWR5XG4gICAgLy8gc3Vic2NyaWJlZCB0byB0aGUgc291cmNlLCBhbmQgaWYgc28sIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwZW5kaW5nXG4gICAgLy8gbXV0YXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIHN5bmNocm9uaXplZCB5ZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBtdXRhdGlvbnMsIHRoZW4gYHJvb3QubXV0YWJsZVJlYWRMYW5lc2Agd2lsbCBiZVxuICAgIC8vIGVtcHR5LCBhbmQgd2Uga25vdyB3ZSBjYW4gc2FmZWx5IHJlYWQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSAqYXJlKiBwZW5kaW5nIG11dGF0aW9ucywgd2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gc2FmZWx5IHJlYWRcbiAgICAvLyBpZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBsYW5lcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBwZW5kaW5nIG11dGF0aW9uXG4gICAgLy8gbGFuZXMsIHNpbmNlIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZSB2YWx1ZSB3ZSdyZSBhYm91dCB0byByZWFkIGZyb21cbiAgICAvLyB0aGUgc291cmNlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBkdXJpbmcgdGhlIG1vc3RcbiAgICAvLyByZWNlbnQgbXV0YXRpb24uXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgcm9vdC5tdXRhYmxlUmVhZExhbmVzKTtcblxuICAgIGlmIChpc1NhZmVUb1JlYWRGcm9tU291cmNlKSB7XG4gICAgICAvLyBJZiBpdCdzIHNhZmUgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIsXG4gICAgICAvLyBzdG9yZSB0aGUgdmVyc2lvbiBpbiBjYXNlIG90aGVyIGNvbXBvbmVudHMgcmVhZCBmcm9tIGl0LlxuICAgICAgLy8gQSBjaGFuZ2VkIHZlcnNpb24gbnVtYmVyIHdpbGwgbGV0IHRob3NlIGNvbXBvbmVudHMga25vdyB0byB0aHJvdyBhbmQgcmVzdGFydCB0aGUgcmVuZGVyLlxuICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKHNvdXJjZSwgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UpIHtcbiAgICB2YXIgc25hcHNob3QgPSBnZXRTbmFwc2hvdChzb3VyY2UuX3NvdXJjZSk7XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHNuYXBzaG90ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdNdXRhYmxlIHNvdXJjZSBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uIGFzIHRoZSBzbmFwc2hvdCB2YWx1ZS4gJyArICdGdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgbXV0YWJsZSB2YWx1ZXMgYW5kIGNhdXNlIHRlYXJpbmcuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbXV0YWJsZSBzb3VyY2UgYmVpbmcgc2hhcmVkIGJldHdlZW4gcmVuZGVyZXJzLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgaWYgdGhlIHNvdXJjZSBpcyBtdXRhdGVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVuZGVyZXIsXG4gICAgLy8gVGhlIHNlY29uZCByZW5kZXJlciBkb24ndCBrbm93IHRoYXQgaXQgbmVlZHMgdG8gcmVzZXQgdGhlIFdJUCB2ZXJzaW9uIGR1cmluZyB1bndpbmQsXG4gICAgLy8gKGJlY2F1c2UgdGhlIGhvb2sgb25seSBtYXJrcyBzb3VyY2VzIGFzIGRpcnR5IGlmIGl0J3Mgd3JpdHRlbiB0byB0aGVpciBXSVAgdmVyc2lvbikuXG4gICAgLy8gVGhhdCB3b3VsZCBjYXVzZSB0aGlzIHRlYXIgY2hlY2sgdG8gdGhyb3cgYWdhaW4gYW5kIGV2ZW50dWFsbHkgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAvLyBXZSBjYW4gYXZvaWQgdGhpcyBpbmZpbml0ZSBsb29wIGJ5IGV4cGxpY2l0bHkgbWFya2luZyB0aGUgc291cmNlIGFzIGRpcnR5LlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gbGVhZCB0byB0ZWFyaW5nIGluIHRoZSBmaXJzdCByZW5kZXJlciB3aGVuIGl0IHJlc3VtZXMsXG4gICAgLy8gYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCAoc2hvcnQgb2YgdGhyb3dpbmcgaGVyZSBhbmQgcmVmdXNpbmcgdG8gY29udGludWUgdGhlIHJlbmRlcikuXG4gICAgbWFya1NvdXJjZUFzRGlydHkoc291cmNlKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2Fubm90IHJlYWQgZnJvbSBtdXRhYmxlIHNvdXJjZSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgdGVhcmluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlTXV0YWJsZVNvdXJjZShob29rLCBzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICBpZiAoIShyb290ICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBnZXRWZXJzaW9uID0gc291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cbiAgdmFyIF9kaXNwYXRjaGVyJHVzZVN0YXRlID0gZGlzcGF0Y2hlci51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpO1xuICB9KSxcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IF9kaXNwYXRjaGVyJHVzZVN0YXRlWzBdLFxuICAgICAgc2V0U25hcHNob3QgPSBfZGlzcGF0Y2hlciR1c2VTdGF0ZVsxXTtcblxuICB2YXIgc25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7IC8vIEdyYWIgYSBoYW5kbGUgdG8gdGhlIHN0YXRlIGhvb2sgYXMgd2VsbC5cbiAgLy8gV2UgdXNlIGl0IHRvIGNsZWFyIHRoZSBwZW5kaW5nIHVwZGF0ZSBxdWV1ZSBpZiB3ZSBoYXZlIGEgbmV3IHNvdXJjZS5cblxuICB2YXIgc3RhdGVIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rO1xuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJlZnMgPSBtZW1vaXplZFN0YXRlLnJlZnM7XG4gIHZhciBwcmV2R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICB2YXIgcHJldlNvdXJjZSA9IG1lbW9pemVkU3RhdGUuc291cmNlO1xuICB2YXIgcHJldlN1YnNjcmliZSA9IG1lbW9pemVkU3RhdGUuc3Vic2NyaWJlO1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgcmVmczogcmVmcyxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICB9OyAvLyBTeW5jIHRoZSB2YWx1ZXMgbmVlZGVkIGJ5IG91ciBzdWJzY3JpcHRpb24gaGFuZGxlciBhZnRlciBlYWNoIGNvbW1pdC5cblxuICBkaXNwYXRjaGVyLnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcy5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBOb3JtYWxseSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24gZm9yIGEgc3RhdGUgaG9vayBuZXZlciBjaGFuZ2VzLFxuICAgIC8vIGJ1dCB0aGlzIGhvb2sgcmVjcmVhdGVzIHRoZSBxdWV1ZSBpbiBjZXJ0YWluIGNhc2VzICB0byBhdm9pZCB1cGRhdGVzIGZyb20gc3RhbGUgc291cmNlcy5cbiAgICAvLyBoYW5kbGVDaGFuZ2UoKSBiZWxvdyBuZWVkcyB0byByZWZlcmVuY2UgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGhvdXQgcmUtc3Vic2NyaWJpbmcsXG4gICAgLy8gc28gd2UgdXNlIGEgcmVmIHRvIGVuc3VyZSB0aGF0IGl0IGFsd2F5cyBoYXMgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXG4gICAgcmVmcy5zZXRTbmFwc2hvdCA9IHNldFNuYXBzaG90OyAvLyBDaGVjayBmb3IgYSBwb3NzaWJsZSBjaGFuZ2UgYmV0d2VlbiB3aGVuIHdlIGxhc3QgcmVuZGVyZWQgbm93LlxuXG4gICAgdmFyIG1heWJlTmV3VmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuXG4gICAgaWYgKCFvYmplY3RJcyh2ZXJzaW9uLCBtYXliZU5ld1ZlcnNpb24pKSB7XG4gICAgICB2YXIgbWF5YmVOZXdTbmFwc2hvdCA9IGdldFNuYXBzaG90KHNvdXJjZS5fc291cmNlKTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIG1heWJlTmV3U25hcHNob3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignTXV0YWJsZSBzb3VyY2Ugc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbiBhcyB0aGUgc25hcHNob3QgdmFsdWUuICcgKyAnRnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIG11dGFibGUgdmFsdWVzIGFuZCBjYXVzZSB0ZWFyaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0SXMoc25hcHNob3QsIG1heWJlTmV3U25hcHNob3QpKSB7XG4gICAgICAgIHNldFNuYXBzaG90KG1heWJlTmV3U25hcHNob3QpO1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbWFya1Jvb3RNdXRhYmxlUmVhZChyb290LCBsYW5lKTtcbiAgICAgIH0gLy8gSWYgdGhlIHNvdXJjZSBtdXRhdGVkIGJldHdlZW4gcmVuZGVyIGFuZCBub3csXG4gICAgICAvLyB0aGVyZSBtYXkgYmUgc3RhdGUgdXBkYXRlcyBhbHJlYWR5IHNjaGVkdWxlZCBmcm9tIHRoZSBvbGQgc291cmNlLlxuICAgICAgLy8gRW50YW5nbGUgdGhlIHVwZGF0ZXMgc28gdGhhdCB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC5cblxuXG4gICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCByb290Lm11dGFibGVSZWFkTGFuZXMpO1xuICAgIH1cbiAgfSwgW2dldFNuYXBzaG90LCBzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiB3ZSBnb3QgYSBuZXcgc291cmNlIG9yIHN1YnNjcmliZSBmdW5jdGlvbiwgcmUtc3Vic2NyaWJlIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cbiAgZGlzcGF0Y2hlci51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICAgICAgdmFyIGxhdGVzdFNldFNuYXBzaG90ID0gcmVmcy5zZXRTbmFwc2hvdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGF0ZXN0U2V0U25hcHNob3QobGF0ZXN0R2V0U25hcHNob3Qoc291cmNlLl9zb3VyY2UpKTsgLy8gUmVjb3JkIGEgcGVuZGluZyBtdXRhYmxlIHNvdXJjZSB1cGRhdGUgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuXG5cbiAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICAgIG1hcmtSb290TXV0YWJsZVJlYWQocm9vdCwgbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBBIHNlbGVjdG9yIG1pZ2h0IHRocm93IGFmdGVyIGEgc291cmNlIG11dGF0aW9uLlxuICAgICAgICAvLyBlLmcuIGl0IG1pZ2h0IHRyeSB0byByZWFkIGZyb20gYSBwYXJ0IG9mIHRoZSBzdG9yZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgc3RpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHdpdGggUmVhY3QuXG4gICAgICAgIC8vIFdvcnN0IGNhc2UgdGhlIHNlbGVjdG9yIHdpbGwgdGhyb3cgYWdhaW4gYW5kIHRoZW4gYW4gZXJyb3IgYm91bmRhcnkgd2lsbCBoYW5kbGUgaXQuXG4gICAgICAgIGxhdGVzdFNldFNuYXBzaG90KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB1bnN1YnNjcmliZSA9IHN1YnNjcmliZShzb3VyY2UuX3NvdXJjZSwgaGFuZGxlQ2hhbmdlKTtcblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgdW5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ011dGFibGUgc291cmNlIHN1YnNjcmliZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gIH0sIFtzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiBhbnkgb2YgdGhlIGlucHV0cyB0byB1c2VNdXRhYmxlU291cmNlIGNoYW5nZSwgcmVhZGluZyBpcyBwb3RlbnRpYWxseSB1bnNhZmUuXG4gIC8vXG4gIC8vIElmIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBzdWJzY3JpcHRpb24gaGF2ZSBjaGFuZ2VkIHdlIGNhbid0IGNhbid0IHRydXN0IHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIE1heWJlIHRoZSBzb3VyY2UgY2hhbmdlZCBpbiBhIHdheSB0aGF0IHRoZSBvbGQgc3Vic2NyaXB0aW9uIGlnbm9yZWQgYnV0IHRoZSBuZXcgb25lIGRlcGVuZHMgb24uXG4gIC8vXG4gIC8vIElmIHRoZSBnZXRTbmFwc2hvdCBmdW5jdGlvbiBjaGFuZ2VkLCB3ZSBhbHNvIHNob3VsZG4ndCByZWx5IG9uIHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgdW5kZXJseWluZyBzb3VyY2Ugd2FzIG11dGF0ZWQgYmV0d2VlbiB0aGUgd2hlbiB0aGUgbGFzdCBcImNoYW5nZVwiIGV2ZW50IGZpcmVkLFxuICAvLyBhbmQgd2hlbiB0aGUgY3VycmVudCByZW5kZXIgKHdpdGggdGhlIG5ldyBnZXRTbmFwc2hvdCBmdW5jdGlvbikgaXMgcHJvY2Vzc2VkLlxuICAvL1xuICAvLyBJbiBib3RoIGNhc2VzLCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgcGVuZGluZyB1cGRhdGVzIChzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgcmVsZXZhbnQpXG4gIC8vIGFuZCB0cmVhdCByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBhcyB3ZSBkbyBpbiB0aGUgbW91bnQgY2FzZS5cblxuICBpZiAoIW9iamVjdElzKHByZXZHZXRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHx8ICFvYmplY3RJcyhwcmV2U291cmNlLCBzb3VyY2UpIHx8ICFvYmplY3RJcyhwcmV2U3Vic2NyaWJlLCBzdWJzY3JpYmUpKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHF1ZXVlIGFuZCBzZXRTdGF0ZSBtZXRob2QsXG4gICAgLy8gU28gaWYgdGhlcmUgYXJlIGludGVybGVhdmVkIHVwZGF0ZXMsIHRoZXkgZ2V0IHB1c2hlZCB0byB0aGUgb2xkZXIgcXVldWUuXG4gICAgLy8gV2hlbiB0aGlzIGJlY29tZXMgY3VycmVudCwgdGhlIHByZXZpb3VzIHF1ZXVlIGFuZCBkaXNwYXRjaCBtZXRob2Qgd2lsbCBiZSBkaXNjYXJkZWQsXG4gICAgLy8gaW5jbHVkaW5nIGFueSBpbnRlcmxlYXZpbmcgdXBkYXRlcyB0aGF0IG9jY3VyLlxuICAgIHZhciBuZXdRdWV1ZSA9IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IHNuYXBzaG90XG4gICAgfTtcbiAgICBuZXdRdWV1ZS5kaXNwYXRjaCA9IHNldFNuYXBzaG90ID0gZGlzcGF0Y2hBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBuZXdRdWV1ZSk7XG4gICAgc3RhdGVIb29rLnF1ZXVlID0gbmV3UXVldWU7XG4gICAgc3RhdGVIb29rLmJhc2VRdWV1ZSA9IG51bGw7XG4gICAgc25hcHNob3QgPSByZWFkRnJvbVVuc3ViY3JpYmVkTXV0YWJsZVNvdXJjZShyb290LCBzb3VyY2UsIGdldFNuYXBzaG90KTtcbiAgICBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXRlSG9vay5iYXNlU3RhdGUgPSBzbmFwc2hvdDtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICByZWZzOiB7XG4gICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgICBzZXRTbmFwc2hvdDogbnVsbFxuICAgIH0sXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmVcbiAgfTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7XG4gICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZik7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlIHwgUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSB8IFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZSh2YWx1ZSksXG4gICAgICBwcmV2VmFsdWUgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX21vdW50U3RhdGVbMV07XG5cbiAgbW91bnRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgcmV0dXJuIHByZXZWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIHByZXZWYWx1ZSA9IF91cGRhdGVTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX3VwZGF0ZVN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgcHJldlZhbHVlID0gX3JlcmVuZGVyU3RhdGVbMF0sXG4gICAgICBzZXRWYWx1ZSA9IF9yZXJlbmRlclN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2spIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gIHtcbiAgICBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsIDwgVXNlckJsb2NraW5nUHJpb3JpdHkkMiA/IFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgOiBwcmlvcml0eUxldmVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRQZW5kaW5nKHRydWUpO1xuICAgIH0pO1xuICAgIHJ1bldpdGhQcmlvcml0eSQxKHByaW9yaXR5TGV2ZWwgPiBOb3JtYWxQcmlvcml0eSQxID8gTm9ybWFsUHJpb3JpdHkkMSA6IHByaW9yaXR5TGV2ZWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUyID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZTJbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGUyWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgY2FuIGJlIHN0b3JlZCBvbiBhIHJlZiwgc2luY2UgYHNldFBlbmRpbmdgXG4gIC8vIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgbW91bnRSZWYoc3RhcnQpO1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlMiA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGUyWzBdO1xuXG4gIHZhciBzdGFydFJlZiA9IHVwZGF0ZVJlZigpO1xuICB2YXIgc3RhcnQgPSBzdGFydFJlZi5jdXJyZW50O1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZTIgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZTJbMF07XG5cbiAgdmFyIHN0YXJ0UmVmID0gdXBkYXRlUmVmKCk7XG4gIHZhciBzdGFydCA9IHN0YXJ0UmVmLmN1cnJlbnQ7XG4gIHJldHVybiBbc3RhcnQsIGlzUGVuZGluZ107XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25PcGFxdWVJZGVudGlmaWVyQWNjZXNzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFNob3VsZCB3YXJuIGluIGVmZmVjdHMgYW5kIGNhbGxiYWNrcywgdG9vXG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcblxuICAgIGlmIChnZXRJc1JlbmRlcmluZygpICYmICFkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdKSB7XG4gICAgICBlcnJvcignVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgJyArICdwYXNzZWQgdGhyb3VnaCB0byBhdHRyaWJ1dGVzIG9ubHkuIERvIG5vdCByZWFkIHRoZSAnICsgJ3ZhbHVlIGRpcmVjdGx5LicpO1xuXG4gICAgICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRPcGFxdWVJZGVudGlmaWVyKCkge1xuICB2YXIgbWFrZUlkID0gIG1ha2VDbGllbnRJZEluREVWLmJpbmQobnVsbCwgd2Fybk9uT3BhcXVlSWRlbnRpZmllckFjY2Vzc0luREVWLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkpIDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciBkaWRVcGdyYWRlID0gZmFsc2U7XG4gICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcblxuICAgIHZhciByZWFkVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWRpZFVwZ3JhZGUpIHtcbiAgICAgICAgLy8gT25seSB1cGdyYWRlIG9uY2UuIFRoaXMgd29ya3MgZXZlbiBpbnNpZGUgdGhlIHJlbmRlciBwaGFzZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB1cGRhdGUgaXMgYWRkZWQgdG8gYSBzaGFyZWQgcXVldWUsIHdoaWNoIG91dGxhc3RzIHRoZVxuICAgICAgICAvLyBpbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgIGRpZFVwZ3JhZGUgPSB0cnVlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gdHJ1ZTtcbiAgICAgICAgICBzZXRJZChtYWtlSWQoKSk7XG4gICAgICAgICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICAgICAgICAgIHdhcm5Pbk9wYXF1ZUlkZW50aWZpZXJBY2Nlc3NJbkRFVihmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gYXR0cmlidXRlcyBvbmx5LiBEbyBub3QgcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaWQgPSBtYWtlT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHJlYWRWYWx1ZSk7XG4gICAgdmFyIHNldElkID0gbW91bnRTdGF0ZShpZClbMV07XG5cbiAgICBpZiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBVcGRhdGUgfCBQYXNzaXZlO1xuICAgICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0SWQobWFrZUlkKCkpO1xuICAgICAgfSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9pZCA9IG1ha2VJZCgpO1xuXG4gICAgbW91bnRTdGF0ZShfaWQpO1xuICAgIHJldHVybiBfaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpIHtcbiAgdmFyIGlkID0gdXBkYXRlU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlck9wYXF1ZUlkZW50aWZpZXIoKSB7XG4gIHZhciBpZCA9IHJlcmVuZGVyU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gICAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5lYWdlclJlZHVjZXIgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gamVzdCBpc24ndCBhIGdsb2JhbCwgYW5kIGlzbid0IHJlY29nbml6ZWQgb3V0c2lkZSBvZiB0ZXN0c1xuICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgICB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpO1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5EZXYoZmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VPcGFxdWVJZGVudGlmaWVyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbiAgICB9LFxuICAgIHVzZU9wYXF1ZUlkZW50aWZpZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU9wYXF1ZUlkZW50aWZpZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKHR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW1sYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgbmV4dFByb3BzLm1vZGUgPT09ICd1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZycpIHtcbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvIGluIEJsb2NraW5nIG1vZGUuXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7IC8vIFdlJ3JlIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgd2UgbmVlZCB0byBwdXNoIHRoaXMgdG8gdGhlIHN0YWNrIGFueXdheVxuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlJ3JlIG5vdCBoaWRkZW4gYW55bW9yZSwgcmVzZXQgdGhlIHN0YXRlXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuLy8gb3Vyc2VsdmVzIHRvIHRoaXMgY29uc3RyYWludCwgdGhvdWdoLiBJZiB0aGUgYmVoYXZpb3IgZGl2ZXJnZXMsIHdlIHNob3VsZFxuLy8gZm9yayB0aGUgZnVuY3Rpb24uXG5cblxudmFyIHVwZGF0ZUxlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudDtcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuXG4gICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgY2xhc3MgY29tcG9uZW50IHdpdGhvdXQgYW4gaW5zdGFuY2Ugb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkXG4gICAgICAvLyBpbnNpZGUgYSBub24tY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG9cbiAgICAgIC8vIHRyZWF0IGl0IGxpa2UgYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICBpZiAoIShjdXJyZW50ICE9PSBudWxsICYmIHVwZGF0ZVF1ZXVlICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIklmIHRoZSByb290IGRvZXMgbm90IGhhdmUgYW4gdXBkYXRlUXVldWUsIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgYmFpbGVkIG91dC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmVsZW1lbnQgOiBudWxsO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290Lmh5ZHJhdGUgJiYgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBjdXJyZW50IGNoaWxkcmVuIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gV2UgYWx3YXlzIHRyeSB0byBoeWRyYXRlLiBJZiB0aGlzIGlzbid0IGEgaHlkcmF0aW9uIHBhc3MgdGhlcmUgd29uJ3RcbiAgICAvLyBiZSBhbnkgY2hpbGRyZW4gdG8gaHlkcmF0ZSB3aGljaCBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSB0aGluZyBhc1xuICAgIC8vIG5vdCBoeWRyYXRpbmcuXG4gICAge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7XG5cbiAgICAgIGlmIChtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhW2ldO1xuICAgICAgICAgIHZhciB2ZXJzaW9uID0gbXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YVtpICsgMV07XG4gICAgICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHJlc2V0IGh5ZHJhdGlvbiBzdGF0ZSBpbiBjYXNlIHdlIGFib3J0ZWQgYW5kIHJlc3VtZWQgYW5vdGhlclxuICAgIC8vIHJvb3QuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQm91bmRhcmllcyB3aXRob3V0IGZhbGxiYWNrcyBvciBzaG91bGQgYmUgYXZvaWRlZCBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2VcbiAgICAgIC8vIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIG5leHRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSkge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgIGlmIChuZXh0UHJvcHMuZmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3BzLnVuc3RhYmxlX2V4cGVjdGVkTG9hZFRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgQ1BVLWJvdW5kIHRyZWUuIFNraXAgdGhpcyB0cmVlIGFuZCBzaG93IGEgcGxhY2Vob2xkZXIgdG9cbiAgICAgIC8vIHVuYmxvY2sgdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQuIFRoZW4gaW1tZWRpYXRlbHkgcmV0cnkgYWZ0ZXIgdGhlXG4gICAgICAvLyBpbml0aWFsIGNvbW1pdC5cbiAgICAgIHZhciBfZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXMgdG9cbiAgICAgIC8vIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtcyBvZlxuICAgICAgLy8gcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLCBpdCdzXG4gICAgICAvLyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzIGNvbW1pdHRlZC4gSWZcbiAgICAgIC8vIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZSBwYWludGVkLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLiBXZSBjYW4gdXNlIGFueVxuICAgICAgLy8gUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmcgc2luY2Ugd2UncmUgbGVhdmluZ1xuICAgICAgLy8gaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9mYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBJZiB0aGUgY3VycmVudCBmaWJlciBoYXMgYSBTdXNwZW5zZVN0YXRlLCB0aGF0IG1lYW5zIGl0J3MgYWxyZWFkeSBzaG93aW5nXG4gICAgLy8gYSBmYWxsYmFjay5cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50My5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4zID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBpcyBub3QgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2suXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRpbWVkIG91dC5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjQgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjQsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgX3ByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5tZW1vaXplZFN0YXRlID0gX3ByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKF9wcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpOyAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiBDb250aW51ZSByZW5kZXJpbmcgdGhlIGNoaWxkcmVuLCBsaWtlIHdlXG4gICAgICAgIC8vIG5vcm1hbGx5IGRvLlxuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW41ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuNSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBCbG9ja2luZ01vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBlZmZlY3QgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LiBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBEZWxldGlvbnMgYXJlIHN0b3JlZFxuICAgIC8vIG9uIHRoZSBzYW1lIGxpc3QgYXMgZWZmZWN0cy4gV2Ugd2FudCB0byBrZWVwIHRoZSBlZmZlY3RzIGZyb20gdGhlIHByaW1hcnlcbiAgICAvLyB0cmVlLiBTbyB3ZSBjb3B5IHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50J3MgZWZmZWN0IGxpc3QsIHdoaWNoIGRvZXMgbm90XG4gICAgLy8gaW5jbHVkZSB0aGUgZmFsbGJhY2sgZGVsZXRpb24gZWZmZWN0LlxuXG5cbiAgICB2YXIgcHJvZ3Jlc3NlZExhc3RFZmZlY3QgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKHByb2dyZXNzZWRMYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmZpcnN0RWZmZWN0O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IHByb2dyZXNzZWRMYXN0RWZmZWN0O1xuICAgICAgcHJvZ3Jlc3NlZExhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IFJlc2V0IHRoaXMgc29tZXdoZXJlIGVsc2U/IExvbCBsZWdhY3kgbW9kZSBpcyBzbyB3ZWlyZC5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCBsYXN0RWZmZWN0QmVmb3JlUmVuZGVyaW5nKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZSxcbiAgICAgIGxhc3RFZmZlY3Q6IGxhc3RFZmZlY3RCZWZvcmVSZW5kZXJpbmdcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbGFzdEVmZmVjdEJlZm9yZVJlbmRlcmluZztcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgbmV3VmFsdWUpO1xuXG4gIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkQml0cyA9IGNhbGN1bGF0ZUNoYW5nZWRCaXRzKGNvbnRleHQsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG5cbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuICAgIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0ICE9PSBudWxsKSB7XG4gICAgICBsYXN0Lm5leHRFZmZlY3QgPSBjdXJyZW50O1xuICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHVwZGF0ZUxhbmVzID0gd29ya0luUHJvZ3Jlc3MubGFuZXM7XG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAgICAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gICAgICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cblxuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICB9IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG5cblxuICAgICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgdXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQzID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQzLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MywgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlTGVnYWN5SGlkZGVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFmaWJlclJvb3QuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQuXG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvciB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbFxuICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeSBiZSBlbXB0eSkuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgJiYgIXByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBzdWJ0cmVlZSBpcyBydW5uaW5nIGluIGJsb2NraW5nIG1vZGUgd2UgY2FuIHN1c3BlbmQsXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvbid0IHN1c3BlbmQuXG4gICAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBCbG9ja2luZ01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IE9ubHkgc2NoZWR1bGUgdXBkYXRlcyBpZiB0aGVzZSB2YWx1ZXMgYXJlIG5vbiBlcXVhbCwgaS5lLiBpdCBjaGFuZ2VkLlxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhXG4gICAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS4gVGhpcyBmbGFnIGlzIGFsc28gdXNlZCB0byBoaWRlIHRoZVxuICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbi4gSW4gbXV0YXRpb24gbW9kZSwgd2UgYWxzbyBuZWVkIHRoZSBmbGFnIHRvXG4gICAgICAgICAgICAvLyAqdW5oaWRlKiBjaGlsZHJlbiB0aGF0IHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHNvIGNoZWNrIGlmIHRoaXNcbiAgICAgICAgICAgIC8vIGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHRvby5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVubmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbm5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVubmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbm5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cblxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVubmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5uYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVubmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSByb3cgd2UganVzdCByZW5kZXJlZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgd2UgcmVuZGVyZWQgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gY2hpbGQuIFRoZSBuZXN0ZWQgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGFwcGVuZGVkIHRoZW1zZWx2ZXMuXG4gICAgICAgICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZW1vdmUgYW55IGVmZmVjdHMgdGhhdCB3ZXJlIGFwcGVuZGVkIGFmdGVyIHRoaXMgcG9pbnQuXG5cbiAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IC8vIFdlJ3JlIGRvbmUuXG5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFya1NwYXduZWRXb3JrKFNvbWVSZXRyeUxhbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgbmV3UHJvcHMubW9kZSAhPT0gJ3Vuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nJykge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKCEoKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlRoZSByb290IGZhaWxlZCB0byB1bm1vdW50IGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspIHtcbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICBwb3BQcm92aWRlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lKHNvdXJjZS50eXBlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lKGJvdW5kYXJ5LnR5cGUpO1xuXG4gICAgICBpZiAoZXJyb3JCb3VuZGFyeU5hbWUpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTsgLy8gT25seSBsb2cgaGVyZSBpZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZFxuXG4gICAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXQgb25seSBpZlxuICAvLyBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoXG4gIC8vIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7IC8vIEl0cyBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgc291cmNlRmliZXIuZmlyc3RFZmZlY3QgPSBzb3VyY2VGaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcblxuICAgIGlmICgoc291cmNlRmliZXIubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIG1lbW9pemVkU3RhdGUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIHdlIGF0dGVtcHRlZFxuICAgICAgLy8gdG8gcmVuZGVyIGl0LlxuICAgICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzSW52aXNpYmxlUGFyZW50Qm91bmRhcnkgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpOyAvLyBTY2hlZHVsZSB0aGUgbmVhcmVzdCBTdXNwZW5zZSB0byByZS1yZW5kZXIgdGhlIHRpbWVkIG91dCB2aWV3LlxuXG4gICAgdmFyIF93b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudEJvdW5kYXJ5KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgbmVhcmVzdCBib3VuZGFyeS5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIHByb21pc2Ugb24gdGhlIGJvdW5kYXJ5IGZpYmVyLiBJZiB0aGUgYm91bmRhcnkgdGltZXMgb3V0LCB3ZSdsbFxuICAgICAgICAvLyBhdHRhY2ggYW5vdGhlciBsaXN0ZW5lciB0byBmbGlwIHRoZSBib3VuZGFyeSBiYWNrIHRvIGl0cyBub3JtYWwgc3RhdGUuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSBfd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICAgICAgICB9IC8vIElmIHRoZSBib3VuZGFyeSBpcyBvdXRzaWRlIG9mIGJsb2NraW5nIG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAgICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIEluIHRoZSBjb21taXQgcGhhc2UsIHdlJ2xsIHNjaGVkdWxlIGFcbiAgICAgICAgLy8gc3Vic2VxdWVudCBzeW5jaHJvbm91cyB1cGRhdGUgdG8gcmUtcmVuZGVyIHRoZSBTdXNwZW5zZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgY29tcG9uZW50IHRoYXQgc3VzcGVuZGVkIHdhc1xuICAgICAgICAvLyBpbnNpZGUgYSBibG9ja2luZyBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuXG5cbiAgICAgICAgaWYgKChfd29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpOyAvLyBFeGl0IHdpdGhvdXQgc3VzcGVuZGluZy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgICAgICAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAgICAgICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgICAgICAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgICAgICAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgICAgICAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgICAgICAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAgICAgICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgICAgICAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgICAgICAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgICAgICAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gICAgICAgIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAgICAgICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAgICAgICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgICAgICAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAgICAgICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAgICAgICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgICBfd29ya0luUHJvZ3Jlc3MgPSBfd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIH0gd2hpbGUgKF93b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7IC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG5cblxuICAgIHZhbHVlID0gbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lKHNvdXJjZUZpYmVyLnR5cGUpIHx8ICdBIFJlYWN0IGNvbXBvbmVudCcpICsgJyBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG4nICsgJ1xcbicgKyAnQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byAnICsgJ3Byb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LicpO1xuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IoKTtcbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyLCBudWxsLCBjdXJyZW50LCBpbnN0YW5jZSk7XG5cbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIHJlZiwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICB2YXIgcmVmRXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgcmVmRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSkge1xuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuXG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBCbG9jazpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFNuYXBzaG90KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgU25hcHNob3QpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KHRhZywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIHRhZykgPT09IHRhZykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudCh0YWcsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB0YWcpID09PSB0YWcpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIHVzZUVmZmVjdChhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArICd1c2VFZmZlY3QoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgIG5leHQgPSBfZWZmZWN0Lm5leHQsXG4gICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgIGlmICgodGFnICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxICYmICh0YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdFVubW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0TW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBuZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lLCBmaW5pc2hlZFJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciBjdXJyZW50UmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59IC8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5cblxuZnVuY3Rpb24gY29tbWl0VW5tb3VudChmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQpO1xuXG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgQmxvY2s6XG4gICAgICB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICB2YXIgX2VmZmVjdDIgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdDIuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QyLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RVbm1vdW50KGN1cnJlbnQsIGVmZmVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICB7XG4gICAgICAgICAgdW5tb3VudEhvc3RDb21wb25lbnRzKGZpbmlzaGVkUm9vdCwgY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmRhbWVudGFsQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgcm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBXaGlsZSB3ZSdyZSBpbnNpZGUgYSByZW1vdmVkIGhvc3Qgbm9kZSB3ZSBkb24ndCB3YW50IHRvIGNhbGxcbiAgLy8gcmVtb3ZlQ2hpbGQgb24gdGhlIGlubmVyIG5vZGVzIGJlY2F1c2UgdGhleSdyZSByZW1vdmVkIGJ5IHRoZSB0b3BcbiAgLy8gY2FsbCBhbnl3YXkuIFdlIGFsc28gd2FudCB0byBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50IG9uIGFsbFxuICAvLyBjb21wb3NpdGVzIGJlZm9yZSB0aGlzIGhvc3Qgbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZXJlZm9yZVxuICAvLyB3ZSBkbyBhbiBpbm5lciBsb29wIHdoaWxlIHdlJ3JlIHN0aWxsIGluc2lkZSB0aGUgaG9zdCBub2RlLlxuICB2YXIgbm9kZSA9IHJvb3Q7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb21taXRVbm1vdW50KGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiBtb3JlIGNvbXBvc2l0ZSBvciBob3N0IG5vZGVzLlxuICAgIC8vIFNraXAgcG9ydGFscyBiZWNhdXNlIGNvbW1pdFVubW91bnQoKSBjdXJyZW50bHkgdmlzaXRzIHRoZW0gcmVjdXJzaXZlbHkuXG5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoIC8vIElmIHdlIHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyB1c2luZyBjb21taXRVbm1vdW50IGFib3ZlLlxuICAgIC8vIElmIHdlIGRvbid0IHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyBoZXJlIGluc3RlYWQuXG4gICAgIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVycyB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuIElkZWFsbHksIHdlXG4gIC8vIHNob3VsZCBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLiBUaGlzIGNoaWxkXG4gIC8vIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vIE5vdGU6IHdlIGNhbm5vdCBudWxsIG91dCBzaWJsaW5nIGhlcmUsIG90aGVyd2lzZSBpdCBjYW4gY2F1c2UgaXNzdWVzXG4gIC8vIHdpdGggZmluZERPTU5vZGUgYW5kIGhvdyBpdCByZXF1aXJlcyB0aGUgc2libGluZyBmaWVsZCB0byBjYXJyeSBvdXRcbiAgLy8gdHJhdmVyc2FsIGluIGEgbGF0ZXIgZWZmZWN0LiBTZWUgUFIgIzE2ODIwLiBXZSBub3cgY2xlYXIgdGhlIHNpYmxpbmdcbiAgLy8gZmllbGQgYWZ0ZXIgZWZmZWN0cywgc2VlOiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cy5cbiAgLy9cbiAgLy8gRG9uJ3QgZGlzY29ubmVjdCBzdGF0ZU5vZGUgbm93OyBpdCB3aWxsIGJlIGRldGFjaGVkIGluIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzLlxuICAvLyBJdCBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGFuIGVycm9yIGJvdW5kYXJ5LFxuICAvLyBhbmQgb25lIG9mIGl0cyBkZXNjZW5kYW50cyB0aHJvd3Mgd2hpbGUgdW5tb3VudGluZyBhIHBhc3NpdmUgZWZmZWN0LlxuICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICBmaWJlci5jaGlsZCA9IG51bGw7XG4gIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIGZpYmVyLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgZmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgdmFyIHBhcmVudDtcbiAgdmFyIGlzQ29udGFpbmVyO1xuICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcGFyZW50ID0gcGFyZW50U3RhdGVOb2RlO1xuICAgICAgaXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgaXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cblxuICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgfVxuXG4gIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICBpZiAoaXNDb250YWluZXIpIHtcbiAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QgfHwgZW5hYmxlRnVuZGFtZW50YWxBUEkgKSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IGlzSG9zdCA/IG5vZGUuc3RhdGVOb2RlIDogbm9kZS5zdGF0ZU5vZGUuaW5zdGFuY2U7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCB8fCBlbmFibGVGdW5kYW1lbnRhbEFQSSApIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gaXNIb3N0ID8gbm9kZS5zdGF0ZU5vZGUgOiBub2RlLnN0YXRlTm9kZS5pbnN0YW5jZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVubW91bnRIb3N0Q29tcG9uZW50cyhmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgdmFyIG5vZGUgPSBjdXJyZW50OyAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuXG4gIHZhciBjdXJyZW50UGFyZW50SXNWYWxpZCA9IGZhbHNlOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICB2YXIgY3VycmVudFBhcmVudDtcbiAgdmFyIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmICghY3VycmVudFBhcmVudElzVmFsaWQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLnJldHVybjtcblxuICAgICAgZmluZFBhcmVudDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKCEocGFyZW50ICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGU7XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50U3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcblxuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIEFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSB1bm1vdW50ZWQsIGl0IGlzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGVcbiAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cblxuICAgICAgaWYgKGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGQoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuXG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgIC8vIFdlIHdpbGwgcmVhc3NpZ24gaXQgYmFjayB3aGVuIHdlIHBvcCB0aGUgcG9ydGFsIG9uIHRoZSB3YXkgdXAuXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlOyAvLyBWaXNpdCBjaGlsZHJlbiBiZWNhdXNlIHBvcnRhbHMgbWlnaHQgY29udGFpbiBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFVubW91bnQoZmluaXNoZWRSb290LCBub2RlKTsgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB3ZSBtYXkgZmluZCBtb3JlIGhvc3QgY29tcG9uZW50cyBiZWxvdy5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoZmluaXNoZWRSb290LCBjdXJyZW50KTtcbiAgfVxuXG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgZGV0YWNoRmliZXJNdXRhdGlvbihjdXJyZW50KTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZGV0YWNoRmliZXJNdXRhdGlvbihhbHRlcm5hdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFdvcmsoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3Jvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKF9yb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgaHlkcmF0ZWQuIE5vIG5lZWQgdG8gaHlkcmF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIF9yb290Lmh5ZHJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKF9yb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlQ29tcG9uZW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuZGFtZW50YWxDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNvbXBvbmVudChmaW5pc2hlZFdvcmspIHtcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlICE9PSBudWxsKSB7XG4gICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG5cbiAgICB7XG4gICAgICAvLyBIaWRlIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkgY2hpbGRyZW4uIFRPRE86XG4gICAgICAvLyBJZGVhbGx5LCB0aGlzIGVmZmVjdCB3b3VsZCBoYXZlIGJlZW4gc2NoZWR1bGVkIG9uIHRoZSBPZmZzY3JlZW4gZmliZXJcbiAgICAgIC8vIGl0c2VsZi4gVGhhdCdzIGhvdyB1bmhpZGluZyB3b3JrczogdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc2NoZWR1bGVzIGFuXG4gICAgICAvLyBlZmZlY3Qgb24gaXRzZWxmLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgZGlkbid0IGNvbXBsZXRlLFxuICAgICAgLy8gc28gdGhlIGZpYmVyIHdhcyBuZXZlciBhZGRlZCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIG5vcm1hbCBwYXRoLiBXZVxuICAgICAgLy8gY291bGQgaGF2ZSBhcHBlbmRlZCBpdCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIFN1c3BlbnNlIGNvbXBvbmVudCdzXG4gICAgICAvLyBzZWNvbmQgcGFzcywgYnV0IGRvaW5nIGl0IHRoaXMgd2F5IGlzIGxlc3MgY29tcGxpY2F0ZWQuIFRoaXMgd291bGQgYmVcbiAgICAgIC8vIHNpbXBsZXIgaWYgd2UgZ290IHJpZCBvZiB0aGUgZWZmZWN0IGxpc3QgYW5kIHRyYXZlcnNlZCB0aGUgdHJlZSwgbGlrZVxuICAgICAgLy8gd2UncmUgcGxhbm5pbmcgdG8gZG8uXG4gICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ocHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod2FrZWFibGUuX19yZWFjdERvTm90VHJhY2VJbnRlcmFjdGlvbnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbi8vIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGJvdW5kYXJ5IGlzIGFscmVhZHkgaGlkZGVuLlxuLy8gVE9ETzogVXNlIGFuIGVmZmVjdCB0YWcuXG5cblxuZnVuY3Rpb24gaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKG9sZFN0YXRlID09PSBudWxsIHx8IG9sZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlICE9PSBudWxsICYmIG5ld1N0YXRlLmRlaHlkcmF0ZWQgPT09IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb21taXRSZXNldFRleHRDb250ZW50KGN1cnJlbnQpIHtcblxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQuc3RhdGVOb2RlKTtcbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciQxID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IkMSgnc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIElzU29tZVJlbmRlcmVyQWN0aW5nID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSXNTb21lUmVuZGVyZXJBY3Rpbmc7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgRXZlbnRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBEaXNjcmV0ZUV2ZW50Q29udGV4dCA9XG4vKiAgICAgICAgICovXG40O1xudmFyIExlZ2FjeVVuYmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgKi9cbjg7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgUmV0cnlBZnRlckVycm9yID1cbi8qICAgICAgICovXG42NDtcbnZhciBSb290SW5jb21wbGV0ZSA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5jb21wbGV0ZTsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgcGluZ2VkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xudmFyIG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID0gTm9Qcmlvcml0eSQxO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xudmFyIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsgLy8gTWFya3MgdGhlIG5lZWQgdG8gcmVzY2hlZHVsZSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGVzZSBsYW5lc1xuLy8gZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIHRyYWNlZCBhY3Jvc3MgY29tcG9uZW50c1xuLy8gdGhhdCBzcGF3biBuZXcgd29yayBkdXJpbmcgcmVuZGVyLiBFLmcuIGhpZGRlbiBib3VuZGFyaWVzLCBzdXNwZW5kZWQgU1NSXG4vLyBoeWRyYXRpb24gb3IgU3VzcGVuc2VMaXN0LlxuLy8gVE9ETzogQ2FuIHVzZSBhIGJpdG1hc2sgaW5zdGVhZCBvZiBhbiBhcnJheVxuXG52YXIgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbnZhciBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgPSBOb0xhbmVzOyAvLyBEZXYgb25seSBmbGFnIHRoYXQgdHJhY2tzIGlmIHBhc3NpdmUgZWZmZWN0cyBhcmUgY3VycmVudGx5IGJlaW5nIGZsdXNoZWQuXG4vLyBXZSB3YXJuIGFib3V0IHN0YXRlIHVwZGF0ZXMgZm9yIHVubW91bnRlZCBjb21wb25lbnRzIGRpZmZlcmVudGx5IGluIHRoaXMgY2FzZS5cblxudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZSBpbnB1dHNcbiAgLy8gdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLiBGb3IgZXhhbXBsZSwgd2UgdXNlIHRoZSBgcmVuZGVyTGFuZXNgXG4gIC8vIHRvIGF2b2lkIGNob29zaW5nIGEgbGFuZSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuXG4gIC8vXG4gIC8vIEhvd2V2ZXIsIHRoZSBcImluY2x1ZGVkXCIgbGFuZXMgY291bGQgYmUgbXV0YXRlZCBpbiBiZXR3ZWVuIHVwZGF0ZXMgaW4gdGhlXG4gIC8vIHNhbWUgZXZlbnQsIGxpa2UgaWYgeW91IHBlcmZvcm0gYW4gdXBkYXRlIGluc2lkZSBgZmx1c2hTeW5jYC4gT3IgYW55IG90aGVyXG4gIC8vIGNvZGUgcGF0aCB0aGF0IG1pZ2h0IGNhbGwgYHByZXBhcmVGcmVzaFN0YWNrYC5cbiAgLy9cbiAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzIG92ZXIuXG4gIC8vIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cbiAgLy9cbiAgLy8gV2UnbGwgZG8gdGhlIHNhbWUgZm9yIGBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXNgIGJlbG93LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmIChjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGN1cnJlbnRFdmVudFBlbmRpbmdMYW5lcyA9IG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ICE9PSBudWxsID8gbW9zdFJlY2VudGx5VXBkYXRlZFJvb3QucGVuZGluZ0xhbmVzIDogTm9MYW5lcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZFRyYW5zaXRpb25MYW5lKGN1cnJlbnRFdmVudFdpcExhbmVzLCBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMpO1xuICB9IC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlcGVuZGVuY3kgb24gdGhlIFNjaGVkdWxlciBwcmlvcml0eS5cbiAgLy8gVG8gZG8gdGhhdCwgd2UncmUgcmVwbGFjaW5nIGl0IHdpdGggYW4gdXBkYXRlIGxhbmUgcHJpb3JpdHkuXG5cblxuICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpOyAvLyBUaGUgb2xkIGJlaGF2aW9yIHdhcyB1c2luZyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFNjaGVkdWxlci5cbiAgLy8gVGhpcyBjb3VwbGVzIFJlYWN0IHRvIHRoZSBTY2hlZHVsZXIgaW50ZXJuYWxzLCBzbyB3ZSdyZSByZXBsYWNpbmcgaXRcbiAgLy8gd2l0aCB0aGUgY3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eSBhYm92ZS4gQXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpc1xuICAvLyBjb3VsZCBiZSBwcm9ibGVtYXRpYywgaWYgd2UncmUgbm90IGluc2lkZSBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsXG4gIC8vIHRoZW4gd2UnbGwgZ2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBydW5uaW5nIFNjaGVkdWxlciB0YXNrLFxuICAvLyB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdCB3ZSB3YW50LlxuXG4gIHZhciBsYW5lO1xuXG4gIGlmICggLy8gVE9ETzogVGVtcG9yYXJ5LiBXZSdyZSByZW1vdmluZyB0aGUgY29uY2VwdCBvZiBkaXNjcmV0ZSB1cGRhdGVzLlxuICAoZXhlY3V0aW9uQ29udGV4dCAmIERpc2NyZXRlRXZlbnRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHNjaGVkdWxlclByaW9yaXR5ID09PSBVc2VyQmxvY2tpbmdQcmlvcml0eSQyKSB7XG4gICAgbGFuZSA9IGZpbmRVcGRhdGVMYW5lKElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHksIGN1cnJlbnRFdmVudFdpcExhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyTGFuZVByaW9yaXR5ID0gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eSk7XG5cbiAgICBsYW5lID0gZmluZFVwZGF0ZUxhbmUoc2NoZWR1bGVyTGFuZVByaW9yaXR5LCBjdXJyZW50RXZlbnRXaXBMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBTZWUgYHJlcXVlc3RVcGRhdGVMYW5lYCBmb3IgZXhwbGFuYXRpb24gb2YgYGN1cnJlbnRFdmVudFdpcExhbmVzYFxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRSZXRyeUxhbmUoY3VycmVudEV2ZW50V2lwTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcbiAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpO1xuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiByZXF1ZXN0VXBkYXRlTGFuZVByaW9yaXR5IGFsc28gcmVhZHMgdGhlIHByaW9yaXR5LiBQYXNzIHRoZVxuICAvLyBwcmlvcml0eSBhcyBhbiBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzIG9uZS5cblxuXG4gIHZhciBwcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICBpZiAobGFuZSA9PT0gU3luY0xhbmUpIHtcbiAgICBpZiAoIC8vIENoZWNrIGlmIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzXG4gICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBMZWdhY3lVbmJhdGNoZWRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIC8vIENoZWNrIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gUmVnaXN0ZXIgcGVuZGluZyBpbnRlcmFjdGlvbnMgb24gdGhlIHJvb3QgdG8gYXZvaWQgbG9zaW5nIHRyYWNlZCBpbnRlcmFjdGlvbiBkYXRhLlxuICAgICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmUpOyAvLyBUaGlzIGlzIGEgbGVnYWN5IGVkZ2UgY2FzZS4gVGhlIGluaXRpYWwgbW91bnQgb2YgYSBSZWFjdERPTS5yZW5kZXItZWRcbiAgICAgIC8vIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzIHNob3VsZCBiZSBzeW5jaHJvbm91cywgYnV0IGxheW91dCB1cGRhdGVzXG4gICAgICAvLyBzaG91bGQgYmUgZGVmZXJyZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmF0Y2guXG5cbiAgICAgIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNjaGVkdWxlIGEgZGlzY3JldGUgdXBkYXRlIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IFN5bmMuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgRGlzY3JldGVFdmVudENvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgKCAvLyBPbmx5IHVwZGF0ZXMgYXQgdXNlci1ibG9ja2luZyBwcmlvcml0eSBvciBncmVhdGVyIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gZGlzY3JldGUsIGV2ZW4gaW5zaWRlIGEgZGlzY3JldGUgZXZlbnQuXG4gICAgcHJpb3JpdHlMZXZlbCA9PT0gVXNlckJsb2NraW5nUHJpb3JpdHkkMiB8fCBwcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSQxKSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgZXZlbnQuIFRyYWNrIHRoZSBsb3dlc3QgcHJpb3JpdHlcbiAgICAgIC8vIGRpc2NyZXRlIHVwZGF0ZSBwZXIgcm9vdCBzbyB3ZSBjYW4gZmx1c2ggdGhlbSBlYXJseSwgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG5ldyBTZXQoW3Jvb3RdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuYWRkKHJvb3QpO1xuICAgICAgfVxuICAgIH0gLy8gU2NoZWR1bGUgb3RoZXIgdXBkYXRlcyBhZnRlciBpbiBjYXNlIHRoZSBjYWxsYmFjayBpcyBzeW5jLlxuXG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG4gIH0gLy8gV2UgdXNlIHRoaXMgd2hlbiBhc3NpZ25pbmcgYSBsYW5lIGZvciBhIHRyYW5zaXRpb24gaW5zaWRlXG4gIC8vIGByZXF1ZXN0VXBkYXRlTGFuZWAuIFdlIGFzc3VtZSBpdCdzIHRoZSBzYW1lIGFzIHRoZSByb290IGJlaW5nIHVwZGF0ZWQsXG4gIC8vIHNpbmNlIGluIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZSByb290IGFwcCBpdCBwcm9iYWJseSBpcy4gSWYgaXQncyBub3RcbiAgLy8gdGhlIHNhbWUgcm9vdCwgdGhlbiBpdCdzIG5vdCBhIGh1Z2UgZGVhbCwgd2UganVzdCBtaWdodCBiYXRjaCBtb3JlIHN0dWZmXG4gIC8vIHRvZ2V0aGVyIG1vcmUgdGhhbiBuZWNlc3NhcnkuXG5cblxuICBtb3N0UmVjZW50bHlVcGRhdGVkUm9vdCA9IHJvb3Q7XG59IC8vIFRoaXMgaXMgc3BsaXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXJrIGEgZmliZXIgd2l0aCBwZW5kaW5nXG4vLyB3b3JrIHdpdGhvdXQgdHJlYXRpbmcgaXQgYXMgYSB0eXBpY2FsIHVwZGF0ZSB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBhbiBldmVudDtcbi8vIGUuZy4gcmV0cnlpbmcgYSBTdXNwZW5zZSBib3VuZGFyeSBpc24ndCBhbiB1cGRhdGUsIGJ1dCBpdCBkb2VzIHNjaGVkdWxlIHdvcmtcbi8vIG9uIGEgZmliZXIuXG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgZXhwaXJhdGlvbiB0aW1lLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpOyAvLyBUaGlzIHJldHVybnMgdGhlIHByaW9yaXR5IGxldmVsIGNvbXB1dGVkIGR1cmluZyB0aGUgYGdldE5leHRMYW5lc2AgY2FsbC5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IHJldHVybk5leHRMYW5lc1ByaW9yaXR5KCk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayhleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5KSB7XG4gICAgICAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZSBwcmlvcml0eSBjaGFuZ2VkLiBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ld1xuICAgIC8vIG9uZSBiZWxvdy5cblxuXG4gICAgY2FuY2VsQ2FsbGJhY2soZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmVQcmlvcml0eSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfSBlbHNlIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSkge1xuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgcGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gbGFuZVByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShuZXdDYWxsYmFja1ByaW9yaXR5KTtcbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QpIHtcbiAgLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudEV2ZW50UGVuZGluZ0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGV4cGlyYXRpb24gdGltZSB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcyk7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgIC8vIFRoZSByZW5kZXIgaW5jbHVkZWQgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHdoZW4gdW5oaWRpbmcgYSBoaWRkZW4gdHJlZSwgd2UgaW5jbHVkZSBhbGwgdGhlIGxhbmVzXG4gICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgLy8gbGFuZXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCByZW5kZXJpbmcgd2l0aC5cbiAgICAvL1xuICAgIC8vIFNvIHdlJ2xsIHRocm93IG91dCB0aGUgY3VycmVudCB3b3JrIGFuZCByZXN0YXJ0LlxuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICB9IGVsc2UgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAgIC8vIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuXG4gICAgICBpZiAocm9vdC5oeWRyYXRlKSB7XG4gICAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgfSAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG5cblxuICAgICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluY29tcGxldGU6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcm9vdCBleGl0IHN0YXR1cy5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiICk7XG4gICAgfVxuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXM7XG4gIHZhciBleGl0U3RhdHVzO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiYgaW5jbHVkZXNTb21lTGFuZShyb290LmV4cGlyZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpKSB7XG4gICAgLy8gVGhlcmUncyBhIHBhcnRpYWwgdHJlZSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBpdHMgbGFuZXMgaGFzIGV4cGlyZWQuIEZpbmlzaFxuICAgIC8vIHJlbmRlcmluZyBpdCBiZWZvcmUgcmVuZGVyaW5nIHRoZSByZXN0IG9mIHRoZSBleHBpcmVkIHdvcmsuXG4gICAgbGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gICAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgICAgLy8gVGhlIHJlbmRlciBpbmNsdWRlZCBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHVuaGlkaW5nIGEgaGlkZGVuIHRyZWUsIHdlIGluY2x1ZGUgYWxsIHRoZSBsYW5lc1xuICAgICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgICAvLyBsYW5lcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHJlbmRlcmluZyB3aXRoLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIHBhcnQgb2YgdGhlIHRyZWUgaXMgcmVuZGVyZWRcbiAgICAgIC8vIGNvbmN1cnJlbnRseS4gSWYgdGhlIHdob2xlIHRyZWUgaXMgcmVuZGVyZWQgc3luY2hyb25vdXNseSwgdGhlbiB0aGVyZVxuICAgICAgLy8gYXJlIG5vIGludGVybGVhdmVkIGV2ZW50cy5cbiAgICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gIH1cblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAvLyBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cblxuICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9IC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cblxuXG4gICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmbHVzaERpc2NyZXRlVXBkYXRlcygpIHtcbiAgLy8gVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gZmx1c2ggaW5zaWRlIGJhdGNoZWRVcGRhdGVzLCBidXQgbm90IGluc2lkZSBgYWN0YC5cbiAgLy8gSG93ZXZlciwgYGFjdGAgdXNlcyBgYmF0Y2hlZFVwZGF0ZXNgLCBzbyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaFxuICAvLyB0aG9zZSB0d28gY2FzZXMuIE5lZWQgdG8gZml4IHRoaXMgYmVmb3JlIGV4cG9zaW5nIGZsdXNoRGlzY3JldGVVcGRhdGVzXG4gIC8vIGFzIGEgcHVibGljIEFQSS5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKEJhdGNoZWRDb250ZXh0IHwgUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgICBlcnJvcigndW5zdGFibGVfZmx1c2hEaXNjcmV0ZVVwZGF0ZXM6IENhbm5vdCBmbHVzaCB1cGRhdGVzIHdoZW4gUmVhY3QgaXMgJyArICdhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFdlJ3JlIGFscmVhZHkgcmVuZGVyaW5nLCBzbyB3ZSBjYW4ndCBzeW5jaHJvbm91c2x5IGZsdXNoIHBlbmRpbmcgd29yay5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmVzdGVkIGV2ZW50IGRpc3BhdGNoIHRyaWdnZXJlZCBieSBhIGxpZmVjeWNsZS9lZmZlY3QsXG4gICAgLy8gbGlrZSBgZWwuZm9jdXMoKWAuIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZsdXNoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcygpOyAvLyBJZiB0aGUgZGlzY3JldGUgdXBkYXRlcyBzY2hlZHVsZWQgcGFzc2l2ZSBlZmZlY3RzLCBmbHVzaCB0aGVtIG5vdyBzbyB0aGF0XG4gIC8vIHRoZXkgZmlyZSBiZWZvcmUgdGhlIG5leHQgc2VyaWFsIGV2ZW50LlxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbn1cblxuZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGlzY3JldGVVcGRhdGVzKCkge1xuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIC8vIEZvciBlYWNoIHJvb3Qgd2l0aCBwZW5kaW5nIGRpc2NyZXRlIHVwZGF0ZXMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG9cbiAgICAvLyBpbW1lZGlhdGVseSBmbHVzaCB0aGVtLlxuICAgIHZhciByb290cyA9IHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXM7XG4gICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG51bGw7XG4gICAgcm9vdHMuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIH0pO1xuICB9IC8vIE5vdyBmbHVzaCB0aGUgaW1tZWRpYXRlIHF1ZXVlLlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaFxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZEV2ZW50VXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRXZlbnRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyQxKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRGlzY3JldGVFdmVudENvbnRleHQ7XG5cbiAge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcnVuV2l0aFByaW9yaXR5JDEoVXNlckJsb2NraW5nUHJpb3JpdHkkMiwgZm4uYmluZChudWxsLCBhLCBiLCBjLCBkKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoXG4gICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5iYXRjaGVkVXBkYXRlcyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0ICY9IH5CYXRjaGVkQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBMZWdhY3lVbmJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luYyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gIGlmICgocHJldkV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oYSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShJbW1lZGlhdGVQcmlvcml0eSQxLCBmbi5iaW5kKG51bGwsIGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgICAvLyB0aGUgc3RhY2suXG5cbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluY29tcGxldGU7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAge1xuICAgIHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gcHVzaEludGVyYWN0aW9ucyhyb290KSB7XG4gIHtcbiAgICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zO1xuICAgIHJldHVybiBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEludGVyYWN0aW9ucyhwcmV2SW50ZXJhY3Rpb25zKSB7XG4gIHtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5jb21wbGV0ZSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGUgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdENvbXBsZXRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gICAgc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gcHVzaEludGVyYWN0aW9ucyhyb290KTtcblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgIHN0YXJ0V29ya09uUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHB1c2hJbnRlcmFjdGlvbnMocm9vdCk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcblxuICB7XG4gICAgcG9wSW50ZXJhY3Rpb25zKHByZXZJbnRlcmFjdGlvbnMpO1xuICB9XG5cbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuXG4gICAgcmV0dXJuIFJvb3RJbmNvbXBsZXRlO1xuICB9IGVsc2Uge1xuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNldENoaWxkTGFuZXMoY29tcGxldGVkV29yayk7XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJiAvLyBEbyBub3QgYXBwZW5kIGVmZmVjdHMgdG8gcGFyZW50cyBpZiBhIHNpYmxpbmcgZmFpbGVkIHRvIGNvbXBsZXRlXG4gICAgICAocmV0dXJuRmliZXIuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdvcmsubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmxhc3RFZmZlY3Q7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBmaWJlciBoYWQgc2lkZS1lZmZlY3RzLCB3ZSBhcHBlbmQgaXQgQUZURVIgdGhlIGNoaWxkcmVuJ3NcbiAgICAgICAgLy8gc2lkZS1lZmZlY3RzLiBXZSBjYW4gcGVyZm9ybSBjZXJ0YWluIHNpZGUtZWZmZWN0cyBlYXJsaWVyIGlmIG5lZWRlZCxcbiAgICAgICAgLy8gYnkgZG9pbmcgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGVmZmVjdCBsaXN0LiBXZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIG91ciBvd24gc2lkZS1lZmZlY3Qgb24gb3VyIG93biBsaXN0IGJlY2F1c2UgaWYgZW5kIHVwXG4gICAgICAgIC8vIHJldXNpbmcgY2hpbGRyZW4gd2UnbGwgc2NoZWR1bGUgdGhpcyBlZmZlY3Qgb250byBpdHNlbGYgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gYXQgdGhlIGVuZC5cblxuXG4gICAgICAgIHZhciBmbGFncyA9IGNvbXBsZXRlZFdvcmsuZmxhZ3M7IC8vIFNraXAgYm90aCBOb1dvcmsgYW5kIFBlcmZvcm1lZFdvcmsgdGFncyB3aGVuIGNyZWF0aW5nIHRoZSBlZmZlY3RcbiAgICAgICAgLy8gbGlzdC4gUGVyZm9ybWVkV29yayBlZmZlY3QgaXMgcmVhZCBieSBSZWFjdCBEZXZUb29scyBidXQgc2hvdWxkbid0IGJlXG4gICAgICAgIC8vIGNvbW1pdHRlZC5cblxuICAgICAgICBpZiAoZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBleHBpcmF0aW9uIHRpbWUuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgZWZmZWN0IGxpc3QuXG4gICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDaGlsZExhbmVzKGNvbXBsZXRlZFdvcmspIHtcbiAgaWYgKCAvLyBUT0RPOiBNb3ZlIHRoaXMgY2hlY2sgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBtb3ZpbmcgYHJlc2V0Q2hpbGRMYW5lc2BcbiAgLy8gdG8gc3dpdGNoIHN0YXRlbWVudCBpbiBgY29tcGxldGVXb3JrYC5cbiAgKGNvbXBsZXRlZFdvcmsudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQgfHwgY29tcGxldGVkV29yay50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkgJiYgY29tcGxldGVkV29yay5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmICFpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkgJiYgKGNvbXBsZXRlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvbmVudCBhcmUgaGlkZGVuLiBEb24ndCBidWJibGUgdGhlaXJcbiAgICAvLyBleHBpcmF0aW9uIHRpbWVzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lczsgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG5cbiAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCB8fCBjb21wbGV0ZWRXb3JrLmNoaWxkICE9PSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZDtcbiAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG5cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gY29tcGxldGVkV29yay50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIGNvbXBsZXRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290KSB7XG4gIHZhciByZW5kZXJQcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcbiAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgY29tbWl0Um9vdEltcGwuYmluZChudWxsLCByb290LCByZW5kZXJQcmlvcml0eUxldmVsKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoIShmaW5pc2hlZFdvcmsgIT09IHJvb3QuY3VycmVudCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpOyAvLyBDbGVhciBhbHJlYWR5IGZpbmlzaGVkIGRpc2NyZXRlIHVwZGF0ZXMgaW4gY2FzZSB0aGF0IGEgbGF0ZXIgY2FsbCBvZlxuICAvLyBgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNgIHN0YXJ0cyBhIHVzZWxlc3MgcmVuZGVyIHBhc3Mgd2hpY2ggbWF5IGNhbmNlbHNcbiAgLy8gYSBzY2hlZHVsZWQgdGltZW91dC5cblxuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIGlmICghaGFzRGlzY3JldGVMYW5lcyhyZW1haW5pbmdMYW5lcykgJiYgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcy5oYXMocm9vdCkpIHtcbiAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIEdldCB0aGUgbGlzdCBvZiBlZmZlY3RzLlxuXG5cbiAgdmFyIGZpcnN0RWZmZWN0O1xuXG4gIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmIGl0XG4gICAgLy8gaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCkge1xuXG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMsIG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIGVycm9yKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuXG4gICAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfSAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbXV0YXRpb24gcGhhc2UsIHdoZXJlIHdlIG11dGF0ZSB0aGUgaG9zdCB0cmVlLlxuXG5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRNdXRhdGlvbkVmZmVjdHMsIG51bGwsIHJvb3QsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIF9lcnJvcik7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcbiAgICAvLyB0aGUgaG9zdCB0cmVlIGFmdGVyIGl0J3MgYmVlbiBtdXRhdGVkLiBUaGUgaWRpb21hdGljIHVzZSBjYXNlIGZvciB0aGlzIGlzXG4gICAgLy8gbGF5b3V0LCBidXQgY2xhc3MgY29tcG9uZW50IGxpZmVjeWNsZXMgYWxzbyBmaXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLlxuXG4gICAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAge1xuICAgICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY29tbWl0TGF5b3V0RWZmZWN0cywgbnVsbCwgcm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvcjIgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBfZXJyb3IyKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7XG5cbiAgICBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVGVsbCBTY2hlZHVsZXIgdG8geWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIHNvIHRoZSBicm93c2VyIGhhcyBhblxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG5cbiAgICB7XG4gICAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzUmVuZGVyUHJpb3JpdHkgPSByZW5kZXJQcmlvcml0eUxldmVsO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIGVmZmVjdCBjaGFpbiBhdCB0aGlzIHBvaW50IHNvIGxldCdzIGNsZWFyIHRoZVxuICAgIC8vIG5leHRFZmZlY3QgcG9pbnRlcnMgdG8gYXNzaXN0IHdpdGggR0MuIElmIHdlIGhhdmUgcGFzc2l2ZSBlZmZlY3RzLCB3ZSdsbFxuICAgIC8vIGNsZWFyIHRoaXMgaW4gZmx1c2hQYXNzaXZlRWZmZWN0cy5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHROZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgbmV4dEVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgICAgaWYgKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhuZXh0RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgbmV4dEVmZmVjdCA9IG5leHROZXh0RWZmZWN0O1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSBzcGF3bmVkV29ya0R1cmluZ1JlbmRlcjtcbiAgICAgICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwaXJhdGlvblRpbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgZXhwaXJhdGlvblRpbWVzW2ldLCByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cywgdGhlbiB3ZSBjYW4gY29tcGxldGUgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb25zLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCB3YWl0IHVudGlsIGFmdGVyIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIGZsdXNoZWQuXG4gICAgICAvLyBXYWl0IHRvIGRvIHRoaXMgdW50aWwgYWZ0ZXIgcmVtYWluaW5nIHdvcmsgaGFzIGJlZW4gc2NoZWR1bGVkLFxuICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwcmVtYXR1cmVseSBzaWduYWwgY29tcGxldGUgZm9yIGludGVyYWN0aW9ucyB3aGVuIHRoZXJlJ3MgZS5nLiBoaWRkZW4gd29yay5cbiAgICAgIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjMgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBfZXJyb3IzO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgTGVnYWN5VW5iYXRjaGVkQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIGEgUmVhY3RET00ucmVuZGVyLWVkIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzLiBUaGUgY29tbWl0IGZpcmVkXG4gICAgLy8gc3luY2hyb25vdXNseSwgYnV0IGxheW91dCB1cGRhdGVzIHNob3VsZCBiZSBkZWZlcnJlZCB1bnRpbCB0aGUgZW5kXG4gICAgLy8gb2YgdGhlIGJhdGNoLlxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgJiYgZm9jdXNlZEluc3RhbmNlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgaWYgKGRvZXNGaWJlckNvbnRhaW4obmV4dEVmZmVjdCwgZm9jdXNlZEluc3RhbmNlSGFuZGxlKSkge1xuICAgICAgICAgIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBvdXQgb2YgdGhlIGhvdCBwYXRoIHVzaW5nIGEgZGVkaWNhdGVkIGVmZmVjdCB0YWcuXG4gICAgICAgIGlmIChuZXh0RWZmZWN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgbmV4dEVmZmVjdCkgJiYgZG9lc0ZpYmVyQ29udGFpbihuZXh0RWZmZWN0LCBmb2N1c2VkSW5zdGFuY2VIYW5kbGUpKSB7XG4gICAgICAgICAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVDeWNsZXMoY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBmbHVzaCBhdFxuICAgICAgLy8gdGhlIGVhcmxpZXN0IG9wcG9ydHVuaXR5LlxuICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBUT0RPOiBTaG91bGQgcHJvYmFibHkgbW92ZSB0aGUgYnVsayBvZiB0aGlzIGZ1bmN0aW9uIHRvIGNvbW1pdFdvcmsuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgIGNvbW1pdFJlc2V0VGV4dENvbnRlbnQobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjb21taXREZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgcGxhY2VtZW50LFxuICAgIC8vIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMuIFRvIGF2b2lkIG5lZWRpbmcgdG8gYWRkIGEgY2FzZSBmb3IgZXZlcnkgcG9zc2libGVcbiAgICAvLyBiaXRtYXAgdmFsdWUsIHdlIHJlbW92ZSB0aGUgc2Vjb25kYXJ5IGVmZmVjdHMgZnJvbSB0aGUgZWZmZWN0IHRhZyBhbmRcbiAgICAvLyBzd2l0Y2ggb24gdGhhdCB2YWx1ZS5cblxuXG4gICAgdmFyIHByaW1hcnlGbGFncyA9IGZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uIHwgSHlkcmF0aW5nKTtcblxuICAgIHN3aXRjaCAocHJpbWFyeUZsYWdzKSB7XG4gICAgICBjYXNlIFBsYWNlbWVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFBsYWNlbWVudChuZXh0RWZmZWN0KTsgLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgICAgICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgICAgICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG4gICAgICAgICAgbmV4dEVmZmVjdC5mbGFncyAmPSB+UGxhY2VtZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpOyAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgICAgICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG5cbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5QbGFjZW1lbnQ7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmc6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmdBbmRVcGRhdGU6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFVwZGF0ZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfY3VycmVudDMgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgICAgICBjb21taXRXb3JrKF9jdXJyZW50MywgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKHJvb3QsIG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiAoVXBkYXRlIHwgQ2FsbGJhY2spKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgY29tbWl0TGlmZUN5Y2xlcyhyb290LCBjdXJyZW50LCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKG5leHRFZmZlY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgaWYgKHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ICE9PSBOb1ByaW9yaXR5JDEpIHtcbiAgICB2YXIgcHJpb3JpdHlMZXZlbCA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID4gTm9ybWFsUHJpb3JpdHkkMSA/IE5vcm1hbFByaW9yaXR5JDEgOiBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eTtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eSA9IE5vUHJpb3JpdHkkMTtcblxuICAgIHtcbiAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsLCBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdE1vdW50KGZpYmVyLCBlZmZlY3QpIHtcbiAgcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBzY2hlZHVsZUNhbGxiYWNrKE5vcm1hbFByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0VW5tb3VudChmaWJlciwgZWZmZWN0KSB7XG4gIHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdENyZWF0ZShlZmZlY3QpIHtcbiAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkNhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IEFMTCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0IGRlc3Ryb3kgZnVuY3Rpb25zIGFyZSBjYWxsZWRcbiAgLy8gYmVmb3JlIEFOWSBwYXNzaXZlIGVmZmVjdCBjcmVhdGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuXG4gIC8vIE90aGVyd2lzZSBlZmZlY3RzIGluIHNpYmxpbmcgY29tcG9uZW50cyBtaWdodCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLlxuICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IG1heSB1bmludGVudGlvbmFsbHkgb3ZlcnJpZGUgYSByZWZcbiAgLy8gdmFsdWUgc2V0IGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50LlxuICAvLyBMYXlvdXQgZWZmZWN0cyBoYXZlIHRoZSBzYW1lIGNvbnN0cmFpbnQuXG4gIC8vIEZpcnN0IHBhc3M6IERlc3Ryb3kgc3RhbGUgcGFzc2l2ZSBlZmZlY3RzLlxuXG4gIHZhciB1bm1vdW50RWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudEVmZmVjdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgX2VmZmVjdCA9IHVubW91bnRFZmZlY3RzW2ldO1xuICAgIHZhciBmaWJlciA9IHVubW91bnRFZmZlY3RzW2kgKyAxXTtcbiAgICB2YXIgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveTtcbiAgICBfZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICB7XG4gICAgICBmaWJlci5mbGFncyAmPSB+UGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2O1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuZmxhZ3MgJj0gflBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBpZiAoIShmaWJlciAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTZWNvbmQgcGFzczogQ3JlYXRlIG5ldyBwYXNzaXZlIGVmZmVjdHMuXG5cblxuICB2YXIgbW91bnRFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW91bnRFZmZlY3RzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgIHZhciBfZWZmZWN0MiA9IG1vdW50RWZmZWN0c1tfaV07XG4gICAgdmFyIF9maWJlciA9IG1vdW50RWZmZWN0c1tfaSArIDFdO1xuXG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKF9maWJlcik7XG5cbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGludm9rZVBhc3NpdmVFZmZlY3RDcmVhdGUsIG51bGwsIF9lZmZlY3QyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgaWYgKCEoX2ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBiZSB3b3JraW5nIG9uIGFuIGVmZmVjdC5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZXJyb3I0ID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKF9maWJlciwgX2Vycm9yNCk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuICB9IC8vIE5vdGU6IFRoaXMgY3VycmVudGx5IGFzc3VtZXMgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cyBvbiB0aGUgcm9vdCBmaWJlclxuICAvLyBiZWNhdXNlIHRoZSByb290IGlzIG5vdCBwYXJ0IG9mIGl0cyBvd24gZWZmZWN0IGxpc3QuXG4gIC8vIFRoaXMgY291bGQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cblxuICB2YXIgZWZmZWN0ID0gcm9vdC5jdXJyZW50LmZpcnN0RWZmZWN0O1xuXG4gIHdoaWxlIChlZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dE5leHRFZmZlY3QgPSBlZmZlY3QubmV4dEVmZmVjdDsgLy8gUmVtb3ZlIG5leHRFZmZlY3QgcG9pbnRlciB0byBhc3Npc3QgR0NcblxuICAgIGVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgIGlmIChlZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZWZmZWN0KTtcbiAgICB9XG5cbiAgICBlZmZlY3QgPSBuZXh0TmV4dEVmZmVjdDtcbiAgfVxuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgZmluaXNoUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTsgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuXG4gIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsID8gMCA6IG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCArIDE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChyb290RmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgU3luY0xhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICAgIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBTeW5jTGFuZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQuXG4gICAgICAgICAgLy8gV2UgY2FuJ3Qgc2NoZWR1bGUgYW55IGZvbGxvdyB1cCB3b3JrIGZvciB0aGUgcm9vdCBiZWNhdXNlIHRoZSBmaWJlciBpcyBhbHJlYWR5IHVubW91bnRlZCxcbiAgICAgICAgICAvLyBidXQgd2UgY2FuIHN0aWxsIGNhbGwgdGhlIGxvZy1vbmx5IGJvdW5kYXJ5IHNvIHRoZSBlcnJvciBpc24ndCBzd2FsbG93ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUT0RPIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBiYW5kYWlkIGZvciB0aGUgb2xkIHJlY29uY2lsZXIgZm9yay5cbiAgICAgICAgICAvLyBXZSBjYW4gZGVsZXRlIHRoaXMgc3BlY2lhbCBjYXNlIG9uY2UgdGhlIG5ldyBmb3JrIGlzIG1lcmdlZC5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvclRvSWdub3JlKSB7Ly8gVE9ETyBJZ25vcmUgdGhpcyBlcnJvcj8gUmV0aHJvdyBpdD9cbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGFuIGVkZ2UgY2FzZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHBpbmdlZExhbmVzKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIChCbG9ja2luZ01vZGUgfCBDb25jdXJyZW50TW9kZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBCbG9jaykge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IEJsb2NrKSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIHVubW91bnRzIGZvciB0aGlzIEZpYmVyLFxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGV5IHdvdWxkIGhhdmUgcHJldmVudGVkIHRoaXMgdXBkYXRlLlxuXG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2KSAhPT0gTm9GbGFncykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykgOyBlbHNlIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gVGhpcyBcIiArICdpcyBhIG5vLW9wLCBidXQgaXQgaW5kaWNhdGVzIGEgbWVtb3J5IGxlYWsgaW4geW91ciBhcHBsaWNhdGlvbi4gVG8gJyArICdmaXgsIGNhbmNlbCBhbGwgc3Vic2NyaXB0aW9ucyBhbmQgYXN5bmNocm9ub3VzIHRhc2tzIGluICVzLicsIHRhZyA9PT0gQ2xhc3NDb21wb25lbnQgPyAndGhlIGNvbXBvbmVudFdpbGxVbm1vdW50IG1ldGhvZCcgOiAnYSB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbicpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuIFRyZWF0IGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGFuIGVycm9yLlxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayh1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTsgLy8gYGludm9rZUd1YXJkZWRDYWxsYmFja2Agc29tZXRpbWVzIHNldHMgYW4gZXhwYW5kbyBgX3N1cHByZXNzTG9nZ2luZ2AuXG4gICAgICAgIC8vIFJldGhyb3cgdGhpcyBlcnJvciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuXG5cbiAgICAgICAgdGhyb3cgcmVwbGF5RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGJyYW5jaCBpcyByZWFjaGFibGUgaWYgdGhlIHJlbmRlciBwaGFzZSBpcyBpbXB1cmUuXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIGEgJ3NoYXJlZCcgdmFyaWFibGUgdGhhdCBjaGFuZ2VzIHdoZW4gYWN0KCkgb3BlbnMvY2xvc2VzIGluIHRlc3RzLlxuXG5cbnZhciBJc1RoaXNSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5mdW5jdGlvbiB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpIHtcbiAge1xuICAgIGlmICggSXNTb21lUmVuZGVyZXJBY3RpbmcuY3VycmVudCA9PT0gdHJ1ZSAmJiBJc1RoaXNSZW5kZXJlckFjdGluZy5jdXJyZW50ICE9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgd3JvbmcgYWN0KCkgYXJvdW5kIHlvdXIgdGVzdCBpbnRlcmFjdGlvbnMuXFxuXCIgKyAnQmUgc3VyZSB0byB1c2UgdGhlIG1hdGNoaW5nIHZlcnNpb24gb2YgYWN0KCkgY29ycmVzcG9uZGluZyB0byB5b3VyIHJlbmRlcmVyOlxcblxcbicgKyAnLy8gZm9yIHJlYWN0LWRvbTpcXG4nICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2ltcG9ydCB7YWN0fSBmcicgKyBcIm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XFxuXCIgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTtcXG5cXG4nICsgJy8vIGZvciByZWFjdC10ZXN0LXJlbmRlcmVyOlxcbicgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnaW1wb3J0IFRlc3RSZW5kZXJlciBmcicgKyBcIm9tIHJlYWN0LXRlc3QtcmVuZGVyZXInO1xcblwiICsgJ2NvbnN0IHthY3R9ID0gVGVzdFJlbmRlcmVyO1xcbicgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTsnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdFZmZlY3RzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggKGZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSAhPT0gTm9Nb2RlICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIHJhbiBhbiBlZmZlY3QsIGJ1dCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luRGV2ID0gd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luREVWOyAvLyBJbiB0ZXN0cywgd2Ugd2FudCB0byBlbmZvcmNlIGEgbW9ja2VkIHNjaGVkdWxlci5cblxudmFyIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gZmFsc2U7IC8vIFRPRE8gQmVmb3JlIHdlIHJlbGVhc2UgY29uY3VycmVudCBtb2RlLCByZXZpc2l0IHRoaXMgYW5kIGRlY2lkZSB3aGV0aGVyIGEgbW9ja2VkXG4vLyBzY2hlZHVsZXIgaXMgdGhlIGFjdHVhbCByZWNvbW1lbmRhdGlvbi4gVGhlIGFsdGVybmF0aXZlIGNvdWxkIGJlIGEgdGVzdGluZyBidWlsZCxcbi8vIGEgbmV3IGxpYiwgb3Igd2hhdGV2ZXI7IHdlIGR1bm5vIGp1c3QgeWV0LiBUaGlzIG1lc3NhZ2UgaXMgZm9yIGVhcmx5IGFkb3B0ZXJzXG4vLyB0byBnZXQgdGhlaXIgdGVzdHMgcmlnaHQuXG5cbmZ1bmN0aW9uIHdhcm5JZlVubW9ja2VkU2NoZWR1bGVyKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkFib3V0VW5tb2NrZWRTY2hlZHVsZXIgPT09IGZhbHNlICYmIFNjaGVkdWxlci51bnN0YWJsZV9mbHVzaEFsbFdpdGhvdXRBc3NlcnRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpYmVyLm1vZGUgJiBCbG9ja2luZ01vZGUgfHwgZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignSW4gQ29uY3VycmVudCBvciBTeW5jIG1vZGVzLCB0aGUgXCJzY2hlZHVsZXJcIiBtb2R1bGUgbmVlZHMgdG8gYmUgbW9ja2VkICcgKyAndG8gZ3VhcmFudGVlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyB0ZXN0cyBhbmQgYnJvd3NlcnMuICcgKyAnRm9yIGV4YW1wbGUsIHdpdGggamVzdDogXFxuJyArIC8vIEJyZWFrIHVwIHJlcXVpcmVzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICBcImplc3QubW9jaygnc2NoZWR1bGVyJywgKCkgPT4gcmVxdWlyZVwiICsgXCIoJ3NjaGVkdWxlci91bnN0YWJsZV9tb2NrJykpO1xcblxcblwiICsgJ0ZvciBtb3JlIGluZm8sIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9tb2NrLXNjaGVkdWxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQocm9vdCwgbGFuZSkge1xuICAvLyBJbnRlcmFjdGlvbiB0aHJlYWRzIGFyZSB1bmlxdWUgcGVyIHJvb3QgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAgLy8gTk9URTogSW50ZW50aW9uYWxseSB1bnNvdW5kIGNhc3QuIEFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCBpdCdzIGEgbnVtYmVyXG4gIC8vIGFuZCBpdCByZXByZXNlbnRzIGEgYmF0Y2ggb2Ygd29yay4gQ291bGQgbWFrZSBhIGhlbHBlciBmdW5jdGlvbiBpbnN0ZWFkLFxuICAvLyBidXQgbWVoIHRoaXMgaXMgZmluZSBmb3Igbm93LlxuICByZXR1cm4gbGFuZSAqIDEwMDAgKyByb290LmludGVyYWN0aW9uVGhyZWFkSUQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtTcGF3bmVkV29yayhsYW5lKSB7XG5cbiAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID09PSBudWxsKSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBbbGFuZV07XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIucHVzaChsYW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUludGVyYWN0aW9ucyhyb290LCBsYW5lLCBpbnRlcmFjdGlvbnMpIHtcblxuICBpZiAoaW50ZXJhY3Rpb25zLnNpemUgPiAwKSB7XG4gICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgIHZhciBwZW5kaW5nSW50ZXJhY3Rpb25zID0gcGVuZGluZ0ludGVyYWN0aW9uTWFwLmdldChsYW5lKTtcblxuICAgIGlmIChwZW5kaW5nSW50ZXJhY3Rpb25zICE9IG51bGwpIHtcbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciBwcmV2aW91c2x5IHVuc2NoZWR1bGVkIGludGVyYWN0aW9uLlxuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuc2V0KGxhbmUsIG5ldyBTZXQoaW50ZXJhY3Rpb25zKSk7IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG5cbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmUpO1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lKSB7XG5cbiAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSwgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKSB7XG4gIC8vIHdlIGNhbiBhY2N1cmF0ZWx5IGF0dHJpYnV0ZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gaXQsIEFuZCBzbyB0aGF0IGNhc2NhZGluZ1xuICAvLyB3b3JrIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gIHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgc2NoZWR1bGVkTGFuZSkge1xuICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBzY2hlZHVsZWRMYW5lKSkge1xuICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHNldCBvZiBpbnRlcmFjdGlvbnMgb24gdGhlIEZpYmVyUm9vdCBmb3IgYSBmZXcgcmVhc29uczpcbiAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KClcbiAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVjYWxjdWxhdGUgaXQuIFdlIHdpbGwgYWxzbyB1c2UgaXQgaW4gY29tbWl0V29yaygpIHRvXG4gIC8vIHBhc3MgdG8gYW55IFByb2ZpbGVyIG9uUmVuZGVyKCkgaG9va3MuIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGFcbiAgLy8gd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cblxuICByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25zO1xuXG4gIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgdGhlIHN1YnNjcmliZXIgdGhyb3dzLCByZXRocm93IGl0IGluIGEgc2VwYXJhdGUgdGFza1xuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuICB2YXIgcmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3Vic2NyaWJlcjtcblxuICB0cnkge1xuICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgLy8gRklYTUU6IE1vcmUgdGhhbiBvbmUgbGFuZSBjYW4gZmluaXNoIGluIGEgc2luZ2xlIGNvbW1pdC5cbiAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChyb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQocm9vdC5tZW1vaXplZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgIC8vIFVubGVzcyB0aGUgcmVuZGVyIHdhcyBzdXNwZW5kZWQgb3IgY2FzY2FkaW5nIHdvcmsgd2FzIHNjaGVkdWxlZCxcbiAgICAvLyBJbiB3aGljaCBjYXNl4oCTIGxlYXZlIHBlbmRpbmcgaW50ZXJhY3Rpb25zIHVudGlsIHRoZSBzdWJzZXF1ZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgbGFuZSkge1xuICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb24gY291bnQgaWYgd2UncmUgZG9uZS5cbiAgICAgIC8vIElmIHRoZXJlJ3Mgc3RpbGwgd29yayBhdCB0aGUgY3VycmVudCBwcmlvcml0eSxcbiAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCwgbGFuZSkpIHtcbiAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShsYW5lKTtcbiAgICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIGBhY3RgIHRlc3RpbmcgQVBJXG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBhY3RpbmdVcGRhdGVzU2NvcGVEZXB0aCA+IDA7XG59XG4vLyBzbyB3ZSBjYW4gdGVsbCBpZiBhbnkgYXN5bmMgYWN0KCkgY2FsbHMgdHJ5IHRvIHJ1biBpbiBwYXJhbGxlbC5cblxuXG52YXIgYWN0aW5nVXBkYXRlc1Njb3BlRGVwdGggPSAwO1xuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICBmaWJlci5zaWJsaW5nID0gbnVsbDtcbiAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbn1cblxudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgZGVidWdDb3VudGVyID0gMTtcblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMubmV4dEVmZmVjdCA9IG51bGw7XG4gIHRoaXMuZmlyc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnSUQgPSBkZWJ1Z0NvdW50ZXIrKztcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEID0gY3VycmVudC5fZGVidWdJRDtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHdvcmtJblByb2dyZXNzLm5leHRFZmZlY3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZykge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZSB8IEJsb2NraW5nTW9kZSB8IFN0cmljdE1vZGU7XG4gIH0gZWxzZSBpZiAodGFnID09PSBCbG9ja2luZ1Jvb3QpIHtcbiAgICBtb2RlID0gQmxvY2tpbmdNb2RlIHwgU3RyaWN0TW9kZTtcbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IERlYnVnVHJhY2luZ01vZGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RNb2RlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUxlZ2FjeUhpZGRlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvciggXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgYXMgYSBwcm9wJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpOyAvLyBUT0RPOiBUaGUgUHJvZmlsZXIgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGluIGdldENvbXBvbmVudE5hbWUgc28gdGhhdCBpdCByZWxpZXMgb24gdGhlIHRhZ1xuICAvLyBpbnN0ZWFkLlxuXG4gIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAge1xuICAgIC8vIFRPRE86IFRoZSBTdXNwZW5zZUxpc3RDb21wb25lbnQgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG4gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgICAvLyBpbnN0ZWFkLlxuICAgIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIH1cblxuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIE9mZnNjcmVlbkNvbXBvbmVudCBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICB9XG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tTGVnYWN5SGlkZGVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihMZWdhY3lIaWRkZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIExlZ2FjeUhpZGRlbiBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTtcbiAgfVxuXG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7IC8vIFRPRE86IFRoZXNlIHNob3VsZCBub3QgbmVlZCBhIHR5cGUuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0Lm5leHRFZmZlY3QgPSBzb3VyY2UubmV4dEVmZmVjdDtcbiAgdGFyZ2V0LmZpcnN0RWZmZWN0ID0gc291cmNlLmZpcnN0RWZmZWN0O1xuICB0YXJnZXQubGFzdEVmZmVjdCA9IHNvdXJjZS5sYXN0RWZmZWN0O1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z0lEID0gc291cmNlLl9kZWJ1Z0lEO1xuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmludGVyYWN0aW9uVGhyZWFkSUQgPSB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCk7XG4gICAgdGhpcy5tZW1vaXplZEludGVyYWN0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBCbG9ja2luZ1Jvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSAnY3JlYXRlQmxvY2tpbmdSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gJ2NyZWF0ZUxlZ2FjeVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBoeWRyYXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIE9iamVjdC5rZXlzKGNvbXBvbmVudCkgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGh5ZHJhdGlvbkNhbGxiYWNrcykge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmVW5tb2NrZWRTY2hlZHVsZXIoY3VycmVudCQxKTtcbiAgICAgIHdhcm5JZk5vdFNjb3BlZFdpdGhNYXRjaGluZ0FjdChjdXJyZW50JDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWUoY3VycmVudC50eXBlKSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5uYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmU7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQyKHByaW9yaXR5LCBmbikge1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChob3N0RmliZXIudGFnID09PSBGdW5kYW1lbnRhbENvbXBvbmVudCkge1xuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlLmluc3RhbmNlO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gX2Fzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IF9hc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBfYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gY3JlYXRlUm9vdEltcGwoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NQmxvY2tpbmdSb290KGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKTtcbn1cblxuUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTUJsb2NraW5nUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01CbG9ja2luZ1Jvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgZnVuY3Rpb24gKCkge1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIC8vIFRhZyBpcyBlaXRoZXIgTGVnYWN5Um9vdCBvciBDb25jdXJyZW50IFJvb3RcbiAgdmFyIGh5ZHJhdGUgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlID09PSB0cnVlO1xuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0aW9uT3B0aW9ucyB8fCBudWxsO1xuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzIHx8IG51bGw7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgdGFnLCBoeWRyYXRlKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lci5ub2RlVHlwZTtcblxuICB7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTUJsb2NraW5nUm9vdChjb250YWluZXIsIExlZ2FjeVJvb3QsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWxlbWVudCAmJiByb290RWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKSB7XG4gIHZhciBzaG91bGRIeWRyYXRlID0gZm9yY2VIeWRyYXRlIHx8IHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpOyAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cblxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAge1xuICAgICAgICBpZiAoIXdhcm5lZCAmJiByb290U2libGluZy5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RTaWJsaW5nLmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSkge1xuICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcigncmVuZGVyKCk6IFRhcmdldCBub2RlIGhhcyBtYXJrdXAgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCB0aGVyZSAnICsgJ2FyZSB1bnJlbGF0ZWQgbm9kZXMgYXMgd2VsbC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGNhdXNlZCBieSAnICsgJ3doaXRlLXNwYWNlIGluc2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcblxuICAgICAgd2FybigncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE4LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIHNob3VsZEh5ZHJhdGUgPyB7XG4gICAgaHlkcmF0ZTogdHJ1ZVxuICB9IDogdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH0gLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cblxuXG4gIHZhciByb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciBmaWJlclJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBmaWJlclJvb3QgPSByb290Ll9pbnRlcm5hbFJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCBmaWJlclJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpYmVyUm9vdCA9IHJvb3QuX2ludGVybmFsUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgZmliZXJSb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2UoZmliZXJSb290KTtcbn1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgY3JlYXRlUm9vdChjb250YWluZXIsIHtoeWRyYXRlOiB0cnVlfSkucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyTm9kZSkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgaGFzKHBhcmVudENvbXBvbmVudCkpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwicGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnRcIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0VXNlckJsb2NraW5nSHlkcmF0aW9uKGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkkMik7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzJDEsIGZsdXNoRGlzY3JldGVVcGRhdGVzLCBiYXRjaGVkRXZlbnRVcGRhdGVzJDEpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuXG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCkge1xuICAgICAgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdUaGUgUmVhY3RET00udW5zdGFibGVfY3JlYXRlUG9ydGFsKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdERPTS5jcmVhdGVQb3J0YWwoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLCAnICsgJ2J1dCB3aXRob3V0IHRoZSBcInVuc3RhYmxlX1wiIHByZWZpeC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwga2V5KTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMsIGFuZCBSZWFjdFRlc3RVdGlsc0FjdC5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGZsdXNoUGFzc2l2ZUVmZmVjdHMsIC8vIFRPRE86IFRoaXMgaXMgcmVsYXRlZCB0byBgYWN0YCwgbm90IGV2ZW50cy4gTW92ZSB0byBzZXBhcmF0ZSBrZXk/XG4gIElzVGhpc1JlbmRlcmVyQWN0aW5nXVxufTtcbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWwgPSB1bnN0YWJsZV9jcmVhdGVQb3J0YWw7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gIC8vIENhbGwgdGhpcy5jb25zdHJ1Y3Rvci5nRFNGUCB0byBzdXBwb3J0IHN1Yi1jbGFzc2VzLlxuICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgaWYgKHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAvLyBDYWxsIHRoaXMuY29uc3RydWN0b3IuZ0RTRlAgdG8gc3VwcG9ydCBzdWItY2xhc3Nlcy5cbiAgLy8gVXNlIHRoZSBzZXRTdGF0ZSgpIHVwZGF0ZXIgdG8gZW5zdXJlIHN0YXRlIGlzbid0IHN0YWxlIGluIGNlcnRhaW4gZWRnZSBjYXNlcy5cbiAgZnVuY3Rpb24gdXBkYXRlcihwcmV2U3RhdGUpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLmNvbnN0cnVjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZSA6IG51bGw7XG4gIH1cbiAgLy8gQmluZGluZyBcInRoaXNcIiBpcyBpbXBvcnRhbnQgZm9yIHNoYWxsb3cgcmVuZGVyZXIgc3VwcG9ydC5cbiAgdGhpcy5zZXRTdGF0ZSh1cGRhdGVyLmJpbmQodGhpcykpO1xufVxuXG5mdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gIHRyeSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgdmFyIHByZXZTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgdGhpcy5wcm9wcyA9IG5leHRQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgIHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnID0gdHJ1ZTtcbiAgICB0aGlzLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90ID0gdGhpcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5wcm9wcyA9IHByZXZQcm9wcztcbiAgICB0aGlzLnN0YXRlID0gcHJldlN0YXRlO1xuICB9XG59XG5cbi8vIFJlYWN0IG1heSB3YXJuIGFib3V0IGNXTS9jV1JQL2NXVSBtZXRob2RzIGJlaW5nIGRlcHJlY2F0ZWQuXG4vLyBBZGQgYSBmbGFnIHRvIHN1cHByZXNzIHRoZXNlIHdhcm5pbmdzIGZvciB0aGlzIHNwZWNpYWwgY2FzZS5cbmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTtcbmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7XG5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuXG5mdW5jdGlvbiBwb2x5ZmlsbChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG5cbiAgaWYgKCFwcm90b3R5cGUgfHwgIXByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBwb2x5ZmlsbCBjbGFzcyBjb21wb25lbnRzJyk7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgcHJvdG90eXBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybiBDb21wb25lbnQ7XG4gIH1cblxuICAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gIC8vIEVycm9yIGlmIGFueSBvZiB0aGVzZSBsaWZlY3ljbGVzIGFyZSBwcmVzZW50LFxuICAvLyBCZWNhdXNlIHRoZXkgd291bGQgd29yayBkaWZmZXJlbnRseSBiZXR3ZWVuIG9sZGVyIGFuZCBuZXdlciAoMTYuMyspIHZlcnNpb25zIG9mIFJlYWN0LlxuICB2YXIgZm91bmRXaWxsTW91bnROYW1lID0gbnVsbDtcbiAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG4gIGlmICh0eXBlb2YgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm90b3R5cGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JztcbiAgfVxuICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvdG90eXBlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3RvdHlwZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICB9XG4gIGlmIChcbiAgICBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHxcbiAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8XG4gICAgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbFxuICApIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZTtcbiAgICB2YXIgbmV3QXBpTmFtZSA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSdcbiAgICAgICAgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICtcbiAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICcgdXNlcyAnICtcbiAgICAgICAgbmV3QXBpTmFtZSArXG4gICAgICAgICcgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczonICtcbiAgICAgICAgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/ICdcXG4gICcgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJykgK1xuICAgICAgICAoZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbFxuICAgICAgICAgID8gJ1xcbiAgJyArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWVcbiAgICAgICAgICA6ICcnKSArXG4gICAgICAgIChmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gJ1xcbiAgJyArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJykgK1xuICAgICAgICAnXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArXG4gICAgICAgICdodHRwczovL2ZiLm1lL3JlYWN0LWFzeW5jLWNvbXBvbmVudC1saWZlY3ljbGUtaG9va3MnXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWN0IDw9IDE2LjIgZG9lcyBub3Qgc3VwcG9ydCBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV00gYW5kIGNXUlAgdG8gaW52b2tlIHRoZSBuZXcgc3RhdGljIGxpZmVjeWNsZS5cbiAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgUmVhY3Qgd2lsbCBpZ25vcmUgdGhlc2UgbGlmZWN5Y2xlcyBpZiBnRFNGUCBleGlzdHMuXG4gIGlmICh0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBjb21wb25lbnRXaWxsTW91bnQ7XG4gICAgcHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuICB9XG5cbiAgLy8gUmVhY3QgPD0gMTYuMiBkb2VzIG5vdCBzdXBwb3J0IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLlxuICAvLyBBcyBhIHdvcmthcm91bmQsIHVzZSBjV1UgdG8gaW52b2tlIHRoZSBuZXcgbGlmZWN5Y2xlLlxuICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBSZWFjdCB3aWxsIGlnbm9yZSB0aGF0IGxpZmVjeWNsZSBpZiBnU0JVIGV4aXN0cy5cbiAgaWYgKHR5cGVvZiBwcm90b3R5cGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAodHlwZW9mIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwb2x5ZmlsbCBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGZvciBjb21wb25lbnRzIHRoYXQgZG8gbm90IGRlZmluZSBjb21wb25lbnREaWRVcGRhdGUoKSBvbiB0aGUgcHJvdG90eXBlJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90b3R5cGUuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGNvbXBvbmVudFdpbGxVcGRhdGU7XG5cbiAgICB2YXIgY29tcG9uZW50RGlkVXBkYXRlID0gcHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZTtcblxuICAgIHByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGVQb2x5ZmlsbChcbiAgICAgIHByZXZQcm9wcyxcbiAgICAgIHByZXZTdGF0ZSxcbiAgICAgIG1heWJlU25hcHNob3RcbiAgICApIHtcbiAgICAgIC8vIDE2LjMrIHdpbGwgbm90IGV4ZWN1dGUgb3VyIHdpbGwtdXBkYXRlIG1ldGhvZDtcbiAgICAgIC8vIEl0IHdpbGwgcGFzcyBhIHNuYXBzaG90IHZhbHVlIHRvIGRpZC11cGRhdGUgdGhvdWdoLlxuICAgICAgLy8gT2xkZXIgdmVyc2lvbnMgd2lsbCByZXF1aXJlIG91ciBwb2x5ZmlsbGVkIHdpbGwtdXBkYXRlIHZhbHVlLlxuICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgYm90aCBjYXNlcywgYnV0IGNhbid0IGp1c3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBcIm1heWJlU25hcHNob3RcIixcbiAgICAgIC8vIEJlY2F1c2UgZm9yIDw9IDE1LnggdmVyc2lvbnMgdGhpcyBtaWdodCBiZSBhIFwicHJldkNvbnRleHRcIiBvYmplY3QuXG4gICAgICAvLyBXZSBhbHNvIGNhbid0IGp1c3QgY2hlY2sgXCJfX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFwiLFxuICAgICAgLy8gQmVjYXVzZSBnZXQtc25hcHNob3QgbWlnaHQgcmV0dXJuIGEgZmFsc3kgdmFsdWUuXG4gICAgICAvLyBTbyBjaGVjayBmb3IgdGhlIGV4cGxpY2l0IF9fcmVhY3RJbnRlcm5hbFNuYXBzaG90RmxhZyBmbGFnIHRvIGRldGVybWluZSBiZWhhdmlvci5cbiAgICAgIHZhciBzbmFwc2hvdCA9IHRoaXMuX19yZWFjdEludGVybmFsU25hcHNob3RGbGFnXG4gICAgICAgID8gdGhpcy5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdFxuICAgICAgICA6IG1heWJlU25hcHNob3Q7XG5cbiAgICAgIGNvbXBvbmVudERpZFVwZGF0ZS5jYWxsKHRoaXMsIHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBDb21wb25lbnQ7XG59XG5cbmV4cG9ydCB7IHBvbHlmaWxsIH07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFJlZHV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZWR1eENvbnRleHQ7IiwiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcblxuZnVuY3Rpb24gUHJvdmlkZXIoX3JlZikge1xuICB2YXIgc3RvcmUgPSBfcmVmLnN0b3JlLFxuICAgICAgY29udGV4dCA9IF9yZWYuY29udGV4dCxcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUpO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uXG4gICAgfTtcbiAgfSwgW3N0b3JlXSk7XG4gIHZhciBwcmV2aW91c1N0YXRlID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCk7XG4gIH0sIFtzdG9yZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbjtcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG5cbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgcHJldmlvdXNTdGF0ZV0pO1xuICB2YXIgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFByb3ZpZGVyLnByb3BUeXBlcyA9IHtcbiAgICBzdG9yZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHN1YnNjcmliZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgZ2V0U3RhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9KSxcbiAgICBjb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0RGlzcGxheU5hbWVcIiwgXCJtZXRob2ROYW1lXCIsIFwicmVuZGVyQ291bnRQcm9wXCIsIFwic2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzXCIsIFwic3RvcmVLZXlcIiwgXCJ3aXRoUmVmXCIsIFwiZm9yd2FyZFJlZlwiLCBcImNvbnRleHRcIl0sXG4gICAgX2V4Y2x1ZGVkMiA9IFtcInJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcIl07XG5pbXBvcnQgaG9pc3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudFR5cGUsIGlzQ29udGV4dENvbnN1bWVyIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi9Db250ZXh0JzsgLy8gRGVmaW5lIHNvbWUgY29uc3RhbnQgYXJyYXlzIGp1c3QgdG8gYXZvaWQgcmUtY3JlYXRpbmcgdGhlc2VcblxudmFyIEVNUFRZX0FSUkFZID0gW107XG52YXIgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdO1xuXG52YXIgc3RyaW5naWZ5Q29tcG9uZW50ID0gZnVuY3Rpb24gc3RyaW5naWZ5Q29tcG9uZW50KENvbXApIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQ29tcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBTdHJpbmcoQ29tcCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHN0b3JlU3RhdGVVcGRhdGVzUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIHZhciB1cGRhdGVDb3VudCA9IHN0YXRlWzFdO1xuICByZXR1cm4gW2FjdGlvbi5wYXlsb2FkLCB1cGRhdGVDb3VudCArIDFdO1xufVxuXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBlZmZlY3RGdW5jLmFwcGx5KHZvaWQgMCwgZWZmZWN0QXJncyk7XG4gIH0sIGRlcGVuZGVuY2llcyk7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGFjdHVhbENoaWxkUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgLy8gV2Ugd2FudCB0byBjYXB0dXJlIHRoZSB3cmFwcGVyIHByb3BzIGFuZCBjaGlsZCBwcm9wcyB3ZSB1c2VkIGZvciBsYXRlciBjb21wYXJpc29uc1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBhY3R1YWxDaGlsZFByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoKSB7XG4gIC8vIElmIHdlJ3JlIG5vdCBzdWJzY3JpYmVkIHRvIHRoZSBzdG9yZSwgbm90aGluZyB0byBkbyBoZXJlXG4gIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47IC8vIENhcHR1cmUgdmFsdWVzIGZvciBjaGVja2luZyBpZiBhbmQgd2hlbiB0aGlzIGNvbXBvbmVudCB1bm1vdW50c1xuXG4gIHZhciBkaWRVbnN1YnNjcmliZSA9IGZhbHNlO1xuICB2YXIgbGFzdFRocm93bkVycm9yID0gbnVsbDsgLy8gV2UnbGwgcnVuIHRoaXMgY2FsbGJhY2sgZXZlcnkgdGltZSBhIHN0b3JlIHN1YnNjcmlwdGlvbiB1cGRhdGUgcHJvcGFnYXRlcyB0byB0aGlzIGNvbXBvbmVudFxuXG4gIHZhciBjaGVja0ZvclVwZGF0ZXMgPSBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlKSB7XG4gICAgICAvLyBEb24ndCBydW4gc3RhbGUgbGlzdGVuZXJzLlxuICAgICAgLy8gUmVkdXggZG9lc24ndCBndWFyYW50ZWUgdW5zdWJzY3JpcHRpb25zIGhhcHBlbiB1bnRpbCBuZXh0IGRpc3BhdGNoLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICB2YXIgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBfZGlkXyBjaGFuZ2UgKG9yIHdlIGNhdWdodCBhbiBlcnJvciksIHRoaXMgd3JhcHBlciBjb21wb25lbnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cbiAgICAgIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnU1RPUkVfVVBEQVRFRCcsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9OyAvLyBBY3R1YWxseSBzdWJzY3JpYmUgdG8gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yIChvciBzdG9yZSlcblxuXG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7IC8vIFB1bGwgZGF0YSBmcm9tIHRoZSBzdG9yZSBhZnRlciBmaXJzdCByZW5kZXIgaW4gY2FzZSB0aGUgc3RvcmUgaGFzXG4gIC8vIGNoYW5nZWQgc2luY2Ugd2UgYmVnYW4uXG5cbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG5cbiAgdmFyIHVuc3Vic2NyaWJlV3JhcHBlciA9IGZ1bmN0aW9uIHVuc3Vic2NyaWJlV3JhcHBlcigpIHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufVxuXG52YXIgaW5pdFN0YXRlVXBkYXRlcyA9IGZ1bmN0aW9uIGluaXRTdGF0ZVVwZGF0ZXMoKSB7XG4gIHJldHVybiBbbnVsbCwgMF07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25uZWN0QWR2YW5jZWQoXG4vKlxuICBzZWxlY3RvckZhY3RvcnkgaXMgYSBmdW5jIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gdXNlZCB0b1xuICBjb21wdXRlIG5ldyBwcm9wcyBmcm9tIHN0YXRlLCBwcm9wcywgYW5kIGRpc3BhdGNoLiBGb3IgZXhhbXBsZTpcbiAgICAgZXhwb3J0IGRlZmF1bHQgY29ubmVjdEFkdmFuY2VkKChkaXNwYXRjaCwgb3B0aW9ucykgPT4gKHN0YXRlLCBwcm9wcykgPT4gKHtcbiAgICAgIHRoaW5nOiBzdGF0ZS50aGluZ3NbcHJvcHMudGhpbmdJZF0sXG4gICAgICBzYXZlVGhpbmc6IGZpZWxkcyA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9ycy5zYXZlVGhpbmcocHJvcHMudGhpbmdJZCwgZmllbGRzKSksXG4gICAgfSkpKFlvdXJDb21wb25lbnQpXG4gICBBY2Nlc3MgdG8gZGlzcGF0Y2ggaXMgcHJvdmlkZWQgdG8gdGhlIGZhY3Rvcnkgc28gc2VsZWN0b3JGYWN0b3JpZXMgY2FuIGJpbmQgYWN0aW9uQ3JlYXRvcnNcbiAgb3V0c2lkZSBvZiB0aGVpciBzZWxlY3RvciBhcyBhbiBvcHRpbWl6YXRpb24uIE9wdGlvbnMgcGFzc2VkIHRvIGNvbm5lY3RBZHZhbmNlZCBhcmUgcGFzc2VkIHRvXG4gIHRoZSBzZWxlY3RvckZhY3RvcnksIGFsb25nIHdpdGggZGlzcGxheU5hbWUgYW5kIFdyYXBwZWRDb21wb25lbnQsIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICBOb3RlIHRoYXQgc2VsZWN0b3JGYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgY2FjaGluZy9tZW1vaXphdGlvbiBvZiBpbmJvdW5kIGFuZCBvdXRib3VuZFxuICBwcm9wcy4gRG8gbm90IHVzZSBjb25uZWN0QWR2YW5jZWQgZGlyZWN0bHkgd2l0aG91dCBtZW1vaXppbmcgcmVzdWx0cyBiZXR3ZWVuIGNhbGxzIHRvIHlvdXJcbiAgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUgQ29ubmVjdCBjb21wb25lbnQgd2lsbCByZS1yZW5kZXIgb24gZXZlcnkgc3RhdGUgb3IgcHJvcHMgY2hhbmdlLlxuKi9cbnNlbGVjdG9yRmFjdG9yeSwgLy8gb3B0aW9ucyBvYmplY3Q6XG5fcmVmKSB7XG4gIGlmIChfcmVmID09PSB2b2lkIDApIHtcbiAgICBfcmVmID0ge307XG4gIH1cblxuICB2YXIgX3JlZjIgPSBfcmVmLFxuICAgICAgX3JlZjIkZ2V0RGlzcGxheU5hbWUgPSBfcmVmMi5nZXREaXNwbGF5TmFtZSxcbiAgICAgIGdldERpc3BsYXlOYW1lID0gX3JlZjIkZ2V0RGlzcGxheU5hbWUgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiQ29ubmVjdEFkdmFuY2VkKFwiICsgbmFtZSArIFwiKVwiO1xuICB9IDogX3JlZjIkZ2V0RGlzcGxheU5hbWUsXG4gICAgICBfcmVmMiRtZXRob2ROYW1lID0gX3JlZjIubWV0aG9kTmFtZSxcbiAgICAgIG1ldGhvZE5hbWUgPSBfcmVmMiRtZXRob2ROYW1lID09PSB2b2lkIDAgPyAnY29ubmVjdEFkdmFuY2VkJyA6IF9yZWYyJG1ldGhvZE5hbWUsXG4gICAgICBfcmVmMiRyZW5kZXJDb3VudFByb3AgPSBfcmVmMi5yZW5kZXJDb3VudFByb3AsXG4gICAgICByZW5kZXJDb3VudFByb3AgPSBfcmVmMiRyZW5kZXJDb3VudFByb3AgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYyJHJlbmRlckNvdW50UHJvcCxcbiAgICAgIF9yZWYyJHNob3VsZEhhbmRsZVN0YSA9IF9yZWYyLnNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IF9yZWYyJHNob3VsZEhhbmRsZVN0YSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYyJHNob3VsZEhhbmRsZVN0YSxcbiAgICAgIF9yZWYyJHN0b3JlS2V5ID0gX3JlZjIuc3RvcmVLZXksXG4gICAgICBzdG9yZUtleSA9IF9yZWYyJHN0b3JlS2V5ID09PSB2b2lkIDAgPyAnc3RvcmUnIDogX3JlZjIkc3RvcmVLZXksXG4gICAgICBfcmVmMiR3aXRoUmVmID0gX3JlZjIud2l0aFJlZixcbiAgICAgIHdpdGhSZWYgPSBfcmVmMiR3aXRoUmVmID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJHdpdGhSZWYsXG4gICAgICBfcmVmMiRmb3J3YXJkUmVmID0gX3JlZjIuZm9yd2FyZFJlZixcbiAgICAgIGZvcndhcmRSZWYgPSBfcmVmMiRmb3J3YXJkUmVmID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYyJGZvcndhcmRSZWYsXG4gICAgICBfcmVmMiRjb250ZXh0ID0gX3JlZjIuY29udGV4dCxcbiAgICAgIGNvbnRleHQgPSBfcmVmMiRjb250ZXh0ID09PSB2b2lkIDAgPyBSZWFjdFJlZHV4Q29udGV4dCA6IF9yZWYyJGNvbnRleHQsXG4gICAgICBjb25uZWN0T3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHJlbmRlckNvdW50UHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZW5kZXJDb3VudFByb3AgaXMgcmVtb3ZlZC4gcmVuZGVyIGNvdW50aW5nIGlzIGJ1aWx0IGludG8gdGhlIGxhdGVzdCBSZWFjdCBEZXYgVG9vbHMgcHJvZmlsaW5nIGV4dGVuc2lvblwiKTtcbiAgICB9XG5cbiAgICBpZiAod2l0aFJlZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aXRoUmVmIGlzIHJlbW92ZWQuIFRvIGFjY2VzcyB0aGUgd3JhcHBlZCBpbnN0YW5jZSwgdXNlIGEgcmVmIG9uIHRoZSBjb25uZWN0ZWQgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgdmFyIGN1c3RvbVN0b3JlV2FybmluZ01lc3NhZ2UgPSAnVG8gdXNlIGEgY3VzdG9tIFJlZHV4IHN0b3JlIGZvciBzcGVjaWZpYyBjb21wb25lbnRzLCBjcmVhdGUgYSBjdXN0b20gUmVhY3QgY29udGV4dCB3aXRoICcgKyBcIlJlYWN0LmNyZWF0ZUNvbnRleHQoKSwgYW5kIHBhc3MgdGhlIGNvbnRleHQgb2JqZWN0IHRvIFJlYWN0IFJlZHV4J3MgUHJvdmlkZXIgYW5kIHNwZWNpZmljIGNvbXBvbmVudHNcIiArICcgbGlrZTogPFByb3ZpZGVyIGNvbnRleHQ9e015Q29udGV4dH0+PENvbm5lY3RlZENvbXBvbmVudCBjb250ZXh0PXtNeUNvbnRleHR9IC8+PC9Qcm92aWRlcj4uICcgKyAnWW91IG1heSBhbHNvIHBhc3MgYSB7Y29udGV4dCA6IE15Q29udGV4dH0gb3B0aW9uIHRvIGNvbm5lY3QnO1xuXG4gICAgaWYgKHN0b3JlS2V5ICE9PSAnc3RvcmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0b3JlS2V5IGhhcyBiZWVuIHJlbW92ZWQgYW5kIGRvZXMgbm90IGRvIGFueXRoaW5nLiAnICsgY3VzdG9tU3RvcmVXYXJuaW5nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIENvbnRleHQgPSBjb250ZXh0O1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcFdpdGhDb25uZWN0KFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgY29tcG9uZW50IHRvIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBcIiArIChtZXRob2ROYW1lICsgXCIuIEluc3RlYWQgcmVjZWl2ZWQgXCIgKyBzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCkpKTtcbiAgICB9XG5cbiAgICB2YXIgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZSh3cmFwcGVkQ29tcG9uZW50TmFtZSk7XG5cbiAgICB2YXIgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IF9leHRlbmRzKHt9LCBjb25uZWN0T3B0aW9ucywge1xuICAgICAgZ2V0RGlzcGxheU5hbWU6IGdldERpc3BsYXlOYW1lLFxuICAgICAgbWV0aG9kTmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlbmRlckNvdW50UHJvcDogcmVuZGVyQ291bnRQcm9wLFxuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBzdG9yZUtleTogc3RvcmVLZXksXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZTogd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50OiBXcmFwcGVkQ29tcG9uZW50XG4gICAgfSk7XG5cbiAgICB2YXIgcHVyZSA9IGNvbm5lY3RPcHRpb25zLnB1cmU7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVDaGlsZFNlbGVjdG9yKHN0b3JlKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JGYWN0b3J5KHN0b3JlLmRpc3BhdGNoLCBzZWxlY3RvckZhY3RvcnlPcHRpb25zKTtcbiAgICB9IC8vIElmIHdlIGFyZW4ndCBydW5uaW5nIGluIFwicHVyZVwiIG1vZGUsIHdlIGRvbid0IHdhbnQgdG8gbWVtb2l6ZSB2YWx1ZXMuXG4gICAgLy8gVG8gYXZvaWQgY29uZGl0aW9uYWxseSBjYWxsaW5nIGhvb2tzLCB3ZSBmYWxsIGJhY2sgdG8gYSB0aW55IHdyYXBwZXJcbiAgICAvLyB0aGF0IGp1c3QgZXhlY3V0ZXMgdGhlIGdpdmVuIGNhbGxiYWNrIGltbWVkaWF0ZWx5LlxuXG5cbiAgICB2YXIgdXNlUHVyZU9ubHlNZW1vID0gcHVyZSA/IHVzZU1lbW8gOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgIHZhciBfdXNlTWVtbyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFjdHVhbCBcImRhdGFcIiBwcm9wcyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVyIGNvbXBvbmVudCxcbiAgICAgICAgLy8gYW5kIHZhbHVlcyBuZWVkZWQgdG8gY29udHJvbCBiZWhhdmlvciAoZm9yd2FyZGVkIHJlZnMsIGFsdGVybmF0ZSBjb250ZXh0IGluc3RhbmNlcykuXG4gICAgICAgIC8vIFRvIG1haW50YWluIHRoZSB3cmFwcGVyUHJvcHMgb2JqZWN0IHJlZmVyZW5jZSwgbWVtb2l6ZSB0aGlzIGRlc3RydWN0dXJpbmcuXG4gICAgICAgIHZhciByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmID0gcHJvcHMucmVhY3RSZWR1eEZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIHdyYXBwZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBfZXhjbHVkZWQyKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKSxcbiAgICAgICAgICBwcm9wc0NvbnRleHQgPSBfdXNlTWVtb1swXSxcbiAgICAgICAgICByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmID0gX3VzZU1lbW9bMV0sXG4gICAgICAgICAgd3JhcHBlclByb3BzID0gX3VzZU1lbW9bMl07XG5cbiAgICAgIHZhciBDb250ZXh0VG9Vc2UgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVXNlcnMgbWF5IG9wdGlvbmFsbHkgcGFzcyBpbiBhIGN1c3RvbSBjb250ZXh0IGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIG91ciBSZWFjdFJlZHV4Q29udGV4dC5cbiAgICAgICAgLy8gTWVtb2l6ZSB0aGUgY2hlY2sgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGNvbnRleHQgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZS5cbiAgICAgICAgcmV0dXJuIHByb3BzQ29udGV4dCAmJiBwcm9wc0NvbnRleHQuQ29uc3VtZXIgJiYgaXNDb250ZXh0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbCkpID8gcHJvcHNDb250ZXh0IDogQ29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTsgLy8gUmV0cmlldmUgdGhlIHN0b3JlIGFuZCBhbmNlc3RvciBzdWJzY3JpcHRpb24gdmlhIGNvbnRleHQsIGlmIGF2YWlsYWJsZVxuXG4gICAgICB2YXIgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA9IEJvb2xlYW4ocHJvcHMuc3RvcmUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZ2V0U3RhdGUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgdmFyIGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgXFxcInN0b3JlXFxcIiBpbiB0aGUgY29udGV4dCBvZiBcIiArIChcIlxcXCJcIiArIGRpc3BsYXlOYW1lICsgXCJcXFwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBcIikgKyBcIm9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBcIiArIChcIlJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gXCIgKyBkaXNwbGF5TmFtZSArIFwiIGluIGNvbm5lY3Qgb3B0aW9ucy5cIikpO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICB2YXIgc3RvcmUgPSBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBwcm9wcy5zdG9yZSA6IGNvbnRleHRWYWx1ZS5zdG9yZTtcbiAgICAgIHZhciBjaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVGhlIGNoaWxkIHByb3BzIHNlbGVjdG9yIG5lZWRzIHRoZSBzdG9yZSByZWZlcmVuY2UgYXMgYW4gaW5wdXQuXG4gICAgICAgIC8vIFJlLWNyZWF0ZSB0aGlzIHNlbGVjdG9yIHdoZW5ldmVyIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGRTZWxlY3RvcihzdG9yZSk7XG4gICAgICB9LCBbc3RvcmVdKTtcblxuICAgICAgdmFyIF91c2VNZW1vMiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICAvLyBUaGlzIFN1YnNjcmlwdGlvbidzIHNvdXJjZSBzaG91bGQgbWF0Y2ggd2hlcmUgc3RvcmUgY2FtZSBmcm9tOiBwcm9wcyB2cy4gY29udGV4dC4gQSBjb21wb25lbnRcbiAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzdG9yZSB2aWEgcHJvcHMgc2hvdWxkbid0IHVzZSBzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0LCBvciB2aWNlIHZlcnNhLlxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBudWxsIDogY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbik7IC8vIGBub3RpZnlOZXN0ZWRTdWJzYCBpcyBkdXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHN1YnNjcmlwdGlvbmAgd2lsbCB0aGVuIGJlIG51bGwuIFRoaXMgY2FuXG4gICAgICAgIC8vIHByb2JhYmx5IGJlIGF2b2lkZWQgaWYgU3Vic2NyaXB0aW9uJ3MgbGlzdGVuZXJzIGxvZ2ljIGlzIGNoYW5nZWQgdG8gbm90IGNhbGwgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRoYXQgaGF2ZSBiZWVuIHVuc3Vic2NyaWJlZCBpbiB0aGUgIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AuXG5cbiAgICAgICAgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGluXG4gICAgICAgIC8vIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLCB3aGVyZSBgc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gVGhpcyBjYW5cbiAgICAgICAgLy8gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24ncyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnNcbiAgICAgICAgLy8gdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZSAgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcC5cbiAgICAgICAgdmFyIG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKSxcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSBfdXNlTWVtbzJbMF0sXG4gICAgICAgICAgbm90aWZ5TmVzdGVkU3VicyA9IF91c2VNZW1vMlsxXTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cblxuICAgICAgdmFyIG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICB9LCBbZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWUsIHN1YnNjcmlwdGlvbl0pOyAvLyBXZSBuZWVkIHRvIGZvcmNlIHRoaXMgd3JhcHBlciBjb21wb25lbnQgdG8gcmUtcmVuZGVyIHdoZW5ldmVyIGEgUmVkdXggc3RvcmUgdXBkYXRlXG4gICAgICAvLyBjYXVzZXMgYSBjaGFuZ2UgdG8gdGhlIGNhbGN1bGF0ZWQgY2hpbGQgY29tcG9uZW50IHByb3BzIChvciB3ZSBjYXVnaHQgYW4gZXJyb3IgaW4gbWFwU3RhdGUpXG5cbiAgICAgIHZhciBfdXNlUmVkdWNlciA9IHVzZVJlZHVjZXIoc3RvcmVTdGF0ZVVwZGF0ZXNSZWR1Y2VyLCBFTVBUWV9BUlJBWSwgaW5pdFN0YXRlVXBkYXRlcyksXG4gICAgICAgICAgX3VzZVJlZHVjZXIkID0gX3VzZVJlZHVjZXJbMF0sXG4gICAgICAgICAgcHJldmlvdXNTdGF0ZVVwZGF0ZVJlc3VsdCA9IF91c2VSZWR1Y2VyJFswXSxcbiAgICAgICAgICBmb3JjZUNvbXBvbmVudFVwZGF0ZURpc3BhdGNoID0gX3VzZVJlZHVjZXJbMV07IC8vIFByb3BhZ2F0ZSBhbnkgbWFwU3RhdGUvbWFwRGlzcGF0Y2ggZXJyb3JzIHVwd2FyZHNcblxuXG4gICAgICBpZiAocHJldmlvdXNTdGF0ZVVwZGF0ZVJlc3VsdCAmJiBwcmV2aW91c1N0YXRlVXBkYXRlUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQuZXJyb3I7XG4gICAgICB9IC8vIFNldCB1cCByZWZzIHRvIGNvb3JkaW5hdGUgdmFsdWVzIGJldHdlZW4gdGhlIHN1YnNjcmlwdGlvbiBlZmZlY3QgYW5kIHRoZSByZW5kZXIgbG9naWNcblxuXG4gICAgICB2YXIgbGFzdENoaWxkUHJvcHMgPSB1c2VSZWYoKTtcbiAgICAgIHZhciBsYXN0V3JhcHBlclByb3BzID0gdXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICB2YXIgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IHVzZVJlZigpO1xuICAgICAgdmFyIHJlbmRlcklzU2NoZWR1bGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgICAgIHZhciBhY3R1YWxDaGlsZFByb3BzID0gdXNlUHVyZU9ubHlNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVHJpY2t5IGxvZ2ljIGhlcmU6XG4gICAgICAgIC8vIC0gVGhpcyByZW5kZXIgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQgYnkgYSBSZWR1eCBzdG9yZSB1cGRhdGUgdGhhdCBwcm9kdWNlZCBuZXcgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5ldyBjaGlsZCBwcm9wcywgYW5kIHRoZSBzYW1lIHdyYXBwZXIgcHJvcHMsIHdlIGtub3cgd2Ugc2hvdWxkIHVzZSB0aGUgbmV3IGNoaWxkIHByb3BzIGFzLWlzLlxuICAgICAgICAvLyBCdXQsIGlmIHdlIGhhdmUgbmV3IHdyYXBwZXIgcHJvcHMsIHRob3NlIG1pZ2h0IGNoYW5nZSB0aGUgY2hpbGQgcHJvcHMsIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhpbmdzLlxuICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgJiYgd3JhcHBlclByb3BzID09PSBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50O1xuICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgIC8vIFRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgQmFkIFRoaW5ncyAoVE0pIHRvIGhhcHBlbiBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJlY2F1c2Ugb24gcmVuZGVycyBfbm90XyBjYXVzZWQgYnkgc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0aGUgbGF0ZXN0IHN0b3JlIHN0YXRlXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9wc1NlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCksIHdyYXBwZXJQcm9wcyk7XG4gICAgICB9LCBbc3RvcmUsIHByZXZpb3VzU3RhdGVVcGRhdGVSZXN1bHQsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgYWN0dWFsQ2hpbGRQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pOyAvLyBPdXIgcmUtc3Vic2NyaWJlIGxvZ2ljIG9ubHkgcnVucyB3aGVuIHRoZSBzdG9yZS9zdWJzY3JpcHRpb24gc2V0dXAgY2hhbmdlc1xuXG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3Moc3Vic2NyaWJlVXBkYXRlcywgW3Nob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2hdLCBbc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yXSk7IC8vIE5vdyB0aGF0IGFsbCB0aGF0J3MgZG9uZSwgd2UgY2FuIGZpbmFsbHkgdHJ5IHRvIGFjdHVhbGx5IHJlbmRlciB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgLy8gV2UgbWVtb2l6ZSB0aGUgZWxlbWVudHMgZm9yIHRoZSByZW5kZXJlZCBjaGlsZCBjb21wb25lbnQgYXMgYW4gb3B0aW1pemF0aW9uLlxuXG4gICAgICB2YXIgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50ID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgIHJlZjogcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICB9KSk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBpcyBzdWJzY3JpYmVkIHRvIHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdG8gcGFzcyBpdHMgb3duXG4gICAgICAgICAgLy8gc3Vic2NyaXB0aW9uIGluc3RhbmNlIGRvd24gdG8gb3VyIGRlc2NlbmRhbnRzLiBUaGF0IG1lYW5zIHJlbmRlcmluZyB0aGUgc2FtZVxuICAgICAgICAgIC8vIENvbnRleHQgaW5zdGFuY2UsIGFuZCBwdXR0aW5nIGEgZGlmZmVyZW50IHZhbHVlIGludG8gdGhlIGNvbnRleHQuXG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRUb1VzZS5Qcm92aWRlciwge1xuICAgICAgICAgICAgdmFsdWU6IG92ZXJyaWRkZW5Db250ZXh0VmFsdWVcbiAgICAgICAgICB9LCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIH0sIFtDb250ZXh0VG9Vc2UsIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCwgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZV0pO1xuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGQ7XG4gICAgfSAvLyBJZiB3ZSdyZSBpbiBcInB1cmVcIiBtb2RlLCBlbnN1cmUgb3VyIHdyYXBwZXIgY29tcG9uZW50IG9ubHkgcmUtcmVuZGVycyB3aGVuIGluY29taW5nIHByb3BzIGhhdmUgY2hhbmdlZC5cblxuXG4gICAgdmFyIENvbm5lY3QgPSBwdXJlID8gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pIDogQ29ubmVjdEZ1bmN0aW9uO1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IENvbm5lY3RGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIHZhciBmb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwdXJlXCIsIFwiYXJlU3RhdGVzRXF1YWxcIiwgXCJhcmVPd25Qcm9wc0VxdWFsXCIsIFwiYXJlU3RhdGVQcm9wc0VxdWFsXCIsIFwiYXJlTWVyZ2VkUHJvcHNFcXVhbFwiXTtcbmltcG9ydCBjb25uZWN0QWR2YW5jZWQgZnJvbSAnLi4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuLi91dGlscy9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IGRlZmF1bHRNYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBEaXNwYXRjaFRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgZnJvbSAnLi9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIGZyb20gJy4vbWVyZ2VQcm9wcyc7XG5pbXBvcnQgZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSBmcm9tICcuL3NlbGVjdG9yRmFjdG9yeSc7XG4vKlxuICBjb25uZWN0IGlzIGEgZmFjYWRlIG92ZXIgY29ubmVjdEFkdmFuY2VkLiBJdCB0dXJucyBpdHMgYXJncyBpbnRvIGEgY29tcGF0aWJsZVxuICBzZWxlY3RvckZhY3RvcnksIHdoaWNoIGhhcyB0aGUgc2lnbmF0dXJlOlxuXG4gICAgKGRpc3BhdGNoLCBvcHRpb25zKSA9PiAobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpID0+IG5leHRGaW5hbFByb3BzXG4gIFxuICBjb25uZWN0IHBhc3NlcyBpdHMgYXJncyB0byBjb25uZWN0QWR2YW5jZWQgYXMgb3B0aW9ucywgd2hpY2ggd2lsbCBpbiB0dXJuIHBhc3MgdGhlbSB0b1xuICBzZWxlY3RvckZhY3RvcnkgZWFjaCB0aW1lIGEgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2UgaXMgaW5zdGFudGlhdGVkIG9yIGhvdCByZWxvYWRlZC5cblxuICBzZWxlY3RvckZhY3RvcnkgcmV0dXJucyBhIGZpbmFsIHByb3BzIHNlbGVjdG9yIGZyb20gaXRzIG1hcFN0YXRlVG9Qcm9wcyxcbiAgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcywgbWVyZ2VQcm9wcyxcbiAgbWVyZ2VQcm9wc0ZhY3RvcmllcywgYW5kIHB1cmUgYXJncy5cblxuICBUaGUgcmVzdWx0aW5nIGZpbmFsIHByb3BzIHNlbGVjdG9yIGlzIGNhbGxlZCBieSB0aGUgQ29ubmVjdCBjb21wb25lbnQgaW5zdGFuY2Ugd2hlbmV2ZXJcbiAgaXQgcmVjZWl2ZXMgbmV3IHByb3BzIG9yIHN0b3JlIHN0YXRlLlxuICovXG5cbmZ1bmN0aW9uIG1hdGNoKGFyZywgZmFjdG9yaWVzLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSBmYWN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFjdG9yaWVzW2ldKGFyZyk7XG4gICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIG9wdGlvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIG9mIHR5cGUgXCIgKyB0eXBlb2YgYXJnICsgXCIgZm9yIFwiICsgbmFtZSArIFwiIGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgXCIgKyBvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lICsgXCIuXCIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufSAvLyBjcmVhdGVDb25uZWN0IHdpdGggZGVmYXVsdCBhcmdzIGJ1aWxkcyB0aGUgJ29mZmljaWFsJyBjb25uZWN0IGJlaGF2aW9yLiBDYWxsaW5nIGl0IHdpdGhcbi8vIGRpZmZlcmVudCBvcHRpb25zIG9wZW5zIHVwIHNvbWUgdGVzdGluZyBhbmQgZXh0ZW5zaWJpbGl0eSBzY2VuYXJpb3NcblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdChfdGVtcCkge1xuICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgX3JlZiRjb25uZWN0SE9DID0gX3JlZi5jb25uZWN0SE9DLFxuICAgICAgY29ubmVjdEhPQyA9IF9yZWYkY29ubmVjdEhPQyA9PT0gdm9pZCAwID8gY29ubmVjdEFkdmFuY2VkIDogX3JlZiRjb25uZWN0SE9DLFxuICAgICAgX3JlZiRtYXBTdGF0ZVRvUHJvcHNGID0gX3JlZi5tYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsXG4gICAgICBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPT09IHZvaWQgMCA/IGRlZmF1bHRNYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMgOiBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YsXG4gICAgICBfcmVmJG1hcERpc3BhdGNoVG9Qcm8gPSBfcmVmLm1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9PT0gdm9pZCAwID8gZGVmYXVsdE1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcyA6IF9yZWYkbWFwRGlzcGF0Y2hUb1BybyxcbiAgICAgIF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9IF9yZWYubWVyZ2VQcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1lcmdlUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1lcmdlUHJvcHNGYWN0b3IgPT09IHZvaWQgMCA/IGRlZmF1bHRNZXJnZVByb3BzRmFjdG9yaWVzIDogX3JlZiRtZXJnZVByb3BzRmFjdG9yLFxuICAgICAgX3JlZiRzZWxlY3RvckZhY3RvcnkgPSBfcmVmLnNlbGVjdG9yRmFjdG9yeSxcbiAgICAgIHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYkc2VsZWN0b3JGYWN0b3J5ID09PSB2b2lkIDAgPyBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IDogX3JlZiRzZWxlY3RvckZhY3Rvcnk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIF9yZWYyKSB7XG4gICAgaWYgKF9yZWYyID09PSB2b2lkIDApIHtcbiAgICAgIF9yZWYyID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9yZWYzID0gX3JlZjIsXG4gICAgICAgIF9yZWYzJHB1cmUgPSBfcmVmMy5wdXJlLFxuICAgICAgICBwdXJlID0gX3JlZjMkcHVyZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYzJHB1cmUsXG4gICAgICAgIF9yZWYzJGFyZVN0YXRlc0VxdWFsID0gX3JlZjMuYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIGFyZVN0YXRlc0VxdWFsID0gX3JlZjMkYXJlU3RhdGVzRXF1YWwgPT09IHZvaWQgMCA/IHN0cmljdEVxdWFsIDogX3JlZjMkYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIF9yZWYzJGFyZU93blByb3BzRXF1YSA9IF9yZWYzLmFyZU93blByb3BzRXF1YWwsXG4gICAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmMyRhcmVPd25Qcm9wc0VxdWEgPT09IHZvaWQgMCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYzJGFyZU93blByb3BzRXF1YSxcbiAgICAgICAgX3JlZjMkYXJlU3RhdGVQcm9wc0VxID0gX3JlZjMuYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmMyRhcmVTdGF0ZVByb3BzRXEgPT09IHZvaWQgMCA/IHNoYWxsb3dFcXVhbCA6IF9yZWYzJGFyZVN0YXRlUHJvcHNFcSxcbiAgICAgICAgX3JlZjMkYXJlTWVyZ2VkUHJvcHNFID0gX3JlZjMuYXJlTWVyZ2VkUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IF9yZWYzJGFyZU1lcmdlZFByb3BzRSA9PT0gdm9pZCAwID8gc2hhbGxvd0VxdWFsIDogX3JlZjMkYXJlTWVyZ2VkUHJvcHNFLFxuICAgICAgICBleHRyYU9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmMywgX2V4Y2x1ZGVkKTtcblxuICAgIHZhciBpbml0TWFwU3RhdGVUb1Byb3BzID0gbWF0Y2gobWFwU3RhdGVUb1Byb3BzLCBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgICB2YXIgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hdGNoKG1hcERpc3BhdGNoVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG4gICAgdmFyIGluaXRNZXJnZVByb3BzID0gbWF0Y2gobWVyZ2VQcm9wcywgbWVyZ2VQcm9wc0ZhY3RvcmllcywgJ21lcmdlUHJvcHMnKTtcbiAgICByZXR1cm4gY29ubmVjdEhPQyhzZWxlY3RvckZhY3RvcnksIF9leHRlbmRzKHtcbiAgICAgIC8vIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIG1ldGhvZE5hbWU6ICdjb25uZWN0JyxcbiAgICAgIC8vIHVzZWQgdG8gY29tcHV0ZSBDb25uZWN0J3MgZGlzcGxheU5hbWUgZnJvbSB0aGUgd3JhcHBlZCBjb21wb25lbnQncyBkaXNwbGF5TmFtZS5cbiAgICAgIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBcIkNvbm5lY3QoXCIgKyBuYW1lICsgXCIpXCI7XG4gICAgICB9LFxuICAgICAgLy8gaWYgbWFwU3RhdGVUb1Byb3BzIGlzIGZhbHN5LCB0aGUgQ29ubmVjdCBjb21wb25lbnQgZG9lc24ndCBzdWJzY3JpYmUgdG8gc3RvcmUgc3RhdGUgY2hhbmdlc1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyksXG4gICAgICAvLyBwYXNzZWQgdGhyb3VnaCB0byBzZWxlY3RvckZhY3RvcnlcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHM6IGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzOiBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHM6IGluaXRNZXJnZVByb3BzLFxuICAgICAgcHVyZTogcHVyZSxcbiAgICAgIGFyZVN0YXRlc0VxdWFsOiBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWw6IGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWw6IGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWw6IGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9LCBleHRyYU9wdGlvbnMpKTtcbiAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9jcmVhdGVDb25uZWN0KCk7IiwiaW1wb3J0IGJpbmRBY3Rpb25DcmVhdG9ycyBmcm9tICcuLi91dGlscy9iaW5kQWN0aW9uQ3JlYXRvcnMnO1xuaW1wb3J0IHsgd3JhcE1hcFRvUHJvcHNDb25zdGFudCwgd3JhcE1hcFRvUHJvcHNGdW5jIH0gZnJvbSAnLi93cmFwTWFwVG9Qcm9wcyc7XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24obWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoXG4gICAgfTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdvYmplY3QnID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3JzKG1hcERpc3BhdGNoVG9Qcm9wcywgZGlzcGF0Y2gpO1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBkZWZhdWx0IFt3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbiwgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZywgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0XTsiLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmV4cG9ydCBmdW5jdGlvbiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbihtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBTdGF0ZVRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZyhtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGRlZmF1bHQgW3doZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nXTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgICB2YXIgZGlzcGxheU5hbWUgPSBfcmVmLmRpc3BsYXlOYW1lLFxuICAgICAgICBwdXJlID0gX3JlZi5wdXJlLFxuICAgICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gX3JlZi5hcmVNZXJnZWRQcm9wc0VxdWFsO1xuICAgIHZhciBoYXNSdW5PbmNlID0gZmFsc2U7XG4gICAgdmFyIG1lcmdlZFByb3BzO1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIHZhciBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFwdXJlIHx8ICFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtZXJnZVByb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWVyZ2VQcm9wcztcbiAgfSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBkZWZhdWx0IFt3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24sIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkXTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gaW1wdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihzdGF0ZSwgb3duUHJvcHMpIHtcbiAgICByZXR1cm4gbWVyZ2VQcm9wcyhtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKSwgbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyksIG93blByb3BzKTtcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIF9yZWYpIHtcbiAgdmFyIGFyZVN0YXRlc0VxdWFsID0gX3JlZi5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmLmFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmLmFyZVN0YXRlUHJvcHNFcXVhbDtcbiAgdmFyIGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIG93blByb3BzO1xuICB2YXIgc3RhdGVQcm9wcztcbiAgdmFyIGRpc3BhdGNoUHJvcHM7XG4gIHZhciBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgdmFyIG5leHRTdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICB2YXIgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlQ2hhbmdlZCA9ICFhcmVTdGF0ZXNFcXVhbChuZXh0U3RhdGUsIHN0YXRlKTtcbiAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IG5leHRPd25Qcm9wcztcbiAgICBpZiAocHJvcHNDaGFuZ2VkICYmIHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHMoKTtcbiAgICBpZiAoc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3U3RhdGUoKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufSAvLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gSWYgcHVyZSBpcyB0cnVlLCB0aGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3RBZHZhbmNlZCdzIHNob3VsZENvbXBvbmVudFVwZGF0ZSB0byByZXR1cm4gZmFsc2UgaWYgZmluYWxcbi8vIHByb3BzIGhhdmUgbm90IGNoYW5nZWQuIElmIGZhbHNlLCB0aGUgc2VsZWN0b3Igd2lsbCBhbHdheXMgcmV0dXJuIGEgbmV3XG4vLyBvYmplY3QgYW5kIHNob3VsZENvbXBvbmVudFVwZGF0ZSB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZjIpIHtcbiAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBfcmVmMi5pbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IF9yZWYyLmluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyA9IF9yZWYyLmluaXRNZXJnZVByb3BzLFxuICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYyLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgdmFyIG1hcERpc3BhdGNoVG9Qcm9wcyA9IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgb3B0aW9ucy5kaXNwbGF5TmFtZSk7XG4gIH1cblxuICB2YXIgc2VsZWN0b3JGYWN0b3J5ID0gb3B0aW9ucy5wdXJlID8gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgOiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuICByZXR1cm4gc2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSwgZGlzcGxheU5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIGluIFwiICsgZGlzcGxheU5hbWUgKyBcIi5cIik7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoXCJUaGUgc2VsZWN0b3IgZm9yIFwiICsgbWV0aG9kTmFtZSArIFwiIG9mIFwiICsgZGlzcGxheU5hbWUgKyBcIiBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycsIGRpc3BsYXlOYW1lKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG5cbiAgICBjb25zdGFudFNlbGVjdG9yLmRlcGVuZHNPbk93blByb3BzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNvbnN0YW50U2VsZWN0b3I7XG4gIH07XG59IC8vIGRlcGVuZHNPbk93blByb3BzIGlzIHVzZWQgYnkgY3JlYXRlTWFwVG9Qcm9wc1Byb3h5IHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhc3MgcHJvcHMgYXMgYXJnc1xuLy8gdG8gdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgd3JhcHBlZC4gSXQgaXMgYWxzbyB1c2VkIGJ5IG1ha2VQdXJlUHJvcHNTZWxlY3RvciB0byBkZXRlcm1pbmVcbi8vIHdoZXRoZXIgbWFwVG9Qcm9wcyBuZWVkcyB0byBiZSBpbnZva2VkIHdoZW4gcHJvcHMgaGF2ZSBjaGFuZ2VkLlxuLy9cbi8vIEEgbGVuZ3RoIG9mIG9uZSBzaWduYWxzIHRoYXQgbWFwVG9Qcm9wcyBkb2VzIG5vdCBkZXBlbmQgb24gcHJvcHMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbi8vIEEgbGVuZ3RoIG9mIHplcm8gaXMgYXNzdW1lZCB0byBtZWFuIG1hcFRvUHJvcHMgaXMgZ2V0dGluZyBhcmdzIHZpYSBhcmd1bWVudHMgb3IgLi4uYXJncyBhbmRcbi8vIHRoZXJlZm9yZSBub3QgcmVwb3J0aW5nIGl0cyBsZW5ndGggYWNjdXJhdGVseS4uXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzICE9PSBudWxsICYmIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZTtcblxuICAgIHZhciBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gpO1xuICAgIH07IC8vIGFsbG93IGRldGVjdEZhY3RvcnlBbmRWZXJpZnkgdG8gZ2V0IG93blByb3BzXG5cblxuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIHZhciBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59IiwiaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4vY29tcG9uZW50cy9Qcm92aWRlcic7XG5pbXBvcnQgY29ubmVjdEFkdmFuY2VkIGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2Nvbm5lY3QvY29ubmVjdCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCB7IFByb3ZpZGVyLCBjb25uZWN0QWR2YW5jZWQsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlRGlzcGF0Y2hgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoSG9vayhjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQ7XG4gIH1cblxuICB2YXIgdXNlU3RvcmUgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIHZhciBzdG9yZSA9IHVzZVN0b3JlKCk7XG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBgZGlzcGF0Y2hgIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXG4gKiBpbXBvcnQgeyB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuICpcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xuICogICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKClcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxuICogICByZXR1cm4gKFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxuICogICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtpbmNyZWFzZUNvdW50ZXJ9PkluY3JlYXNlIGNvdW50ZXI8L2J1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgKVxuICogfVxuICovXG5cbmV4cG9ydCB2YXIgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0Jztcbi8qKlxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGAuIFRoaXMgaXMgYSBsb3ctbGV2ZWxcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGBcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbiAqIGltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuICpcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKHsgdmFsdWUgfSkgPT4ge1xuICogICBjb25zdCB7IHN0b3JlIH0gPSB1c2VSZWR1eENvbnRleHQoKVxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cbiAqIH1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdXhDb250ZXh0KCkge1xuICB2YXIgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChSZWFjdFJlZHV4Q29udGV4dCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcmVhY3QtcmVkdXggY29udGV4dCB2YWx1ZTsgcGxlYXNlIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIHdyYXBwZWQgaW4gYSA8UHJvdmlkZXI+Jyk7XG4gIH1cblxuICByZXR1cm4gY29udGV4dFZhbHVlO1xufSIsImltcG9ydCB7IHVzZVJlZHVjZXIsIHVzZVJlZiwgdXNlTWVtbywgdXNlQ29udGV4dCwgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxudmFyIHJlZkVxdWFsaXR5ID0gZnVuY3Rpb24gcmVmRXF1YWxpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn07XG5cbmZ1bmN0aW9uIHVzZVNlbGVjdG9yV2l0aFN0b3JlQW5kU3Vic2NyaXB0aW9uKHNlbGVjdG9yLCBlcXVhbGl0eUZuLCBzdG9yZSwgY29udGV4dFN1Yikge1xuICB2YXIgX3VzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMgKyAxO1xuICB9LCAwKSxcbiAgICAgIGZvcmNlUmVuZGVyID0gX3VzZVJlZHVjZXJbMV07XG5cbiAgdmFyIHN1YnNjcmlwdGlvbiA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGNvbnRleHRTdWIpO1xuICB9LCBbc3RvcmUsIGNvbnRleHRTdWJdKTtcbiAgdmFyIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSB1c2VSZWYoKTtcbiAgdmFyIGxhdGVzdFNlbGVjdG9yID0gdXNlUmVmKCk7XG4gIHZhciBsYXRlc3RTdG9yZVN0YXRlID0gdXNlUmVmKCk7XG4gIHZhciBsYXRlc3RTZWxlY3RlZFN0YXRlID0gdXNlUmVmKCk7XG4gIHZhciBzdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgdmFyIHNlbGVjdGVkU3RhdGU7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2VsZWN0b3IgIT09IGxhdGVzdFNlbGVjdG9yLmN1cnJlbnQgfHwgc3RvcmVTdGF0ZSAhPT0gbGF0ZXN0U3RvcmVTdGF0ZS5jdXJyZW50IHx8IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCkge1xuICAgICAgdmFyIG5ld1NlbGVjdGVkU3RhdGUgPSBzZWxlY3RvcihzdG9yZVN0YXRlKTsgLy8gZW5zdXJlIGxhdGVzdCBzZWxlY3RlZCBzdGF0ZSBpcyByZXVzZWQgc28gdGhhdCBhIGN1c3RvbSBlcXVhbGl0eSBmdW5jdGlvbiBjYW4gcmVzdWx0IGluIGlkZW50aWNhbCByZWZlcmVuY2VzXG5cbiAgICAgIGlmIChsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCAhZXF1YWxpdHlGbihuZXdTZWxlY3RlZFN0YXRlLCBsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQpKSB7XG4gICAgICAgIHNlbGVjdGVkU3RhdGUgPSBuZXdTZWxlY3RlZFN0YXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgIGVyci5tZXNzYWdlICs9IFwiXFxuVGhlIGVycm9yIG1heSBiZSBjb3JyZWxhdGVkIHdpdGggdGhpcyBwcmV2aW91cyBlcnJvcjpcXG5cIiArIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudC5zdGFjayArIFwiXFxuXFxuXCI7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbGF0ZXN0U2VsZWN0b3IuY3VycmVudCA9IHNlbGVjdG9yO1xuICAgIGxhdGVzdFN0b3JlU3RhdGUuY3VycmVudCA9IHN0b3JlU3RhdGU7XG4gICAgbGF0ZXN0U2VsZWN0ZWRTdGF0ZS5jdXJyZW50ID0gc2VsZWN0ZWRTdGF0ZTtcbiAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV3U3RvcmVTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7IC8vIEF2b2lkIGNhbGxpbmcgc2VsZWN0b3IgbXVsdGlwbGUgdGltZXMgaWYgdGhlIHN0b3JlJ3Mgc3RhdGUgaGFzIG5vdCBjaGFuZ2VkXG5cbiAgICAgICAgaWYgKG5ld1N0b3JlU3RhdGUgPT09IGxhdGVzdFN0b3JlU3RhdGUuY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbmV3U2VsZWN0ZWRTdGF0ZSA9IGxhdGVzdFNlbGVjdG9yLmN1cnJlbnQobmV3U3RvcmVTdGF0ZSk7XG5cbiAgICAgICAgaWYgKGVxdWFsaXR5Rm4oX25ld1NlbGVjdGVkU3RhdGUsIGxhdGVzdFNlbGVjdGVkU3RhdGUuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXRlc3RTZWxlY3RlZFN0YXRlLmN1cnJlbnQgPSBfbmV3U2VsZWN0ZWRTdGF0ZTtcbiAgICAgICAgbGF0ZXN0U3RvcmVTdGF0ZS5jdXJyZW50ID0gbmV3U3RvcmVTdGF0ZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyB3ZSBpZ25vcmUgYWxsIGVycm9ycyBoZXJlLCBzaW5jZSB3aGVuIHRoZSBjb21wb25lbnRcbiAgICAgICAgLy8gaXMgcmUtcmVuZGVyZWQsIHRoZSBzZWxlY3RvcnMgYXJlIGNhbGxlZCBhZ2FpbiwgYW5kXG4gICAgICAgIC8vIHdpbGwgdGhyb3cgYWdhaW4sIGlmIG5laXRoZXIgcHJvcHMgbm9yIHN0b3JlIHN0YXRlXG4gICAgICAgIC8vIGNoYW5nZWRcbiAgICAgICAgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50ID0gZXJyO1xuICAgICAgfVxuXG4gICAgICBmb3JjZVJlbmRlcigpO1xuICAgIH1cblxuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICBjaGVja0ZvclVwZGF0ZXMoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgIH07XG4gIH0sIFtzdG9yZSwgc3Vic2NyaXB0aW9uXSk7XG4gIHJldHVybiBzZWxlY3RlZFN0YXRlO1xufVxuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JIb29rKGNvbnRleHQpIHtcbiAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkge1xuICAgIGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dDtcbiAgfVxuXG4gIHZhciB1c2VSZWR1eENvbnRleHQgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoY29udGV4dCk7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTZWxlY3RvcihzZWxlY3RvciwgZXF1YWxpdHlGbikge1xuICAgIGlmIChlcXVhbGl0eUZuID09PSB2b2lkIDApIHtcbiAgICAgIGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZXF1YWxpdHlGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gdG8gdXNlU2VsZWN0b3JcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF91c2VSZWR1eENvbnRleHQgPSB1c2VSZWR1eENvbnRleHQoKSxcbiAgICAgICAgc3RvcmUgPSBfdXNlUmVkdXhDb250ZXh0LnN0b3JlLFxuICAgICAgICBjb250ZXh0U3ViID0gX3VzZVJlZHV4Q29udGV4dC5zdWJzY3JpcHRpb247XG5cbiAgICB2YXIgc2VsZWN0ZWRTdGF0ZSA9IHVzZVNlbGVjdG9yV2l0aFN0b3JlQW5kU3Vic2NyaXB0aW9uKHNlbGVjdG9yLCBlcXVhbGl0eUZuLCBzdG9yZSwgY29udGV4dFN1Yik7XG4gICAgdXNlRGVidWdWYWx1ZShzZWxlY3RlZFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbiAgfTtcbn1cbi8qKlxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggc3RvcmUncyBzdGF0ZS4gVGhpcyBob29rIHRha2VzIGEgc2VsZWN0b3IgZnVuY3Rpb25cbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxuICpcbiAqIFRoaXMgaG9vayB0YWtlcyBhbiBvcHRpb25hbCBlcXVhbGl0eSBjb21wYXJpc29uIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxuICogd2hldGhlciB0aGUgY29tcG9uZW50IG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbj19IGVxdWFsaXR5Rm4gdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eVxuICpcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuICogaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCdcbiAqXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICgpID0+IHtcbiAqICAgY29uc3QgY291bnRlciA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmNvdW50ZXIpXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxuICogfVxuICovXG5cbmV4cG9ydCB2YXIgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuLyoqXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTdG9yZWAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQ7XG4gIH1cblxuICB2YXIgdXNlUmVkdXhDb250ZXh0ID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU3RvcmUoKSB7XG4gICAgdmFyIF91c2VSZWR1eENvbnRleHQgPSB1c2VSZWR1eENvbnRleHQoKSxcbiAgICAgICAgc3RvcmUgPSBfdXNlUmVkdXhDb250ZXh0LnN0b3JlO1xuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbiAqIGltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAncmVhY3QtcmVkdXgnXG4gKlxuICogZXhwb3J0IGNvbnN0IEV4YW1wbGVDb21wb25lbnQgPSAoKSA9PiB7XG4gKiAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKVxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cbiAqIH1cbiAqL1xuXG5leHBvcnQgdmFyIHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsImV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyBhcyBiYXRjaCB9IGZyb20gJy4vdXRpbHMvcmVhY3RCYXRjaGVkVXBkYXRlcyc7XG5pbXBvcnQgeyBzZXRCYXRjaCB9IGZyb20gJy4vdXRpbHMvYmF0Y2gnOyAvLyBFbmFibGUgYmF0Y2hlZCB1cGRhdGVzIGluIG91ciBzdWJzY3JpcHRpb25zIGZvciB1c2Vcbi8vIHdpdGggc3RhbmRhcmQgUmVhY3QgcmVuZGVyZXJzIChSZWFjdERPTSwgUmVhY3QgTmF0aXZlKVxuXG5zZXRCYXRjaChiYXRjaCk7XG5leHBvcnQgeyBiYXRjaCB9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgdmFyIGJhdGNoID0gZ2V0QmF0Y2goKTtcbiAgdmFyIGZpcnN0ID0gbnVsbDtcbiAgdmFyIGxhc3QgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG4gICAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgICBiYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgICAgdmFyIGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG52YXIgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7fSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViKSB7XG4gIHZhciB1bnN1YnNjcmliZTtcbiAgdmFyIGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG5cbiAgZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgcmV0dXJuIGxpc3RlbmVycy5zdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICBsaXN0ZW5lcnMubm90aWZ5KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2VXcmFwcGVyKCkge1xuICAgIGlmIChzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odW5zdWJzY3JpYmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlID0gcGFyZW50U3ViID8gcGFyZW50U3ViLmFkZE5lc3RlZFN1YihoYW5kbGVDaGFuZ2VXcmFwcGVyKSA6IHN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2VXcmFwcGVyKTtcbiAgICAgIGxpc3RlbmVycyA9IGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHVuc3Vic2NyaWJlID0gdW5kZWZpbmVkO1xuICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdWJzY3JpcHRpb24gPSB7XG4gICAgYWRkTmVzdGVkU3ViOiBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3Viczogbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyOiBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZDogaXNTdWJzY3JpYmVkLFxuICAgIHRyeVN1YnNjcmliZTogdHJ5U3Vic2NyaWJlLFxuICAgIHRyeVVuc3Vic2NyaWJlOiB0cnlVbnN1YnNjcmliZSxcbiAgICBnZXRMaXN0ZW5lcnM6IGZ1bmN0aW9uIGdldExpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbnZhciBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCB2YXIgc2V0QmF0Y2ggPSBmdW5jdGlvbiBzZXRCYXRjaChuZXdCYXRjaCkge1xuICByZXR1cm4gYmF0Y2ggPSBuZXdCYXRjaDtcbn07IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgdmFyIGdldEJhdGNoID0gZnVuY3Rpb24gZ2V0QmF0Y2goKSB7XG4gIHJldHVybiBiYXRjaDtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGtleSkge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgX2xvb3Aoa2V5KTtcbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufSIsIi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIGJhc2VQcm90byA9IHByb3RvO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xuICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XG59IiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLXVucmVzb2x2ZWQgKi9cbmV4cG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJzsiLCJmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSAncmVhY3QnOyAvLyBSZWFjdCBjdXJyZW50bHkgdGhyb3dzIGEgd2FybmluZyB3aGVuIHVzaW5nIHVzZUxheW91dEVmZmVjdCBvbiB0aGUgc2VydmVyLlxuLy8gVG8gZ2V0IGFyb3VuZCBpdCwgd2UgY2FuIGNvbmRpdGlvbmFsbHkgdXNlRWZmZWN0IG9uIHRoZSBzZXJ2ZXIgKG5vLW9wKSBhbmRcbi8vIHVzZUxheW91dEVmZmVjdCBpbiB0aGUgYnJvd3Nlci4gV2UgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG8gZW5zdXJlIHRoZSBzdG9yZVxuLy8gc3Vic2NyaXB0aW9uIGNhbGxiYWNrIGFsd2F5cyBoYXMgdGhlIHNlbGVjdG9yIGZyb20gdGhlIGxhdGVzdCByZW5kZXIgY29tbWl0XG4vLyBhdmFpbGFibGUsIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgaGFwcGVuIGJldHdlZW4gcmVuZGVyIGFuZCB0aGUgZWZmZWN0LFxuLy8gd2hpY2ggbWF5IGNhdXNlIG1pc3NlZCB1cGRhdGVzOyB3ZSBhbHNvIG11c3QgZW5zdXJlIHRoZSBzdG9yZSBzdWJzY3JpcHRpb25cbi8vIGlzIGNyZWF0ZWQgc3luY2hyb25vdXNseSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBvY2N1ciBiZWZvcmUgdGhlXG4vLyBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBhbmQgYW4gaW5jb25zaXN0ZW50IHN0YXRlIG1heSBiZSBvYnNlcnZlZFxuXG5leHBvcnQgdmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0OyIsImltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJy4vaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcm5pbmcnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKG1ldGhvZE5hbWUgKyBcIigpIGluIFwiICsgZGlzcGxheU5hbWUgKyBcIiBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCBcIiArIHZhbHVlICsgXCIuXCIpO1xuICB9XG59IiwiLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG5cbn0iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3JlYWN0JykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdyZWFjdCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuUmVhY3RUYWJsZSA9IHt9LCBnbG9iYWwuUmVhY3QpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCBSZWFjdCkgeyAndXNlIHN0cmljdCc7XG5cbiAgUmVhY3QgPSBSZWFjdCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVhY3QsICdkZWZhdWx0JykgPyBSZWFjdFsnZGVmYXVsdCddIDogUmVhY3Q7XG5cbiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IHt9O1xuICAgIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICB2YXIga2V5LCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0O1xuICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcblxuICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpO1xuICAgICAgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHtcbiAgICB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7XG5cbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpO1xuICB9XG5cbiAgdmFyIHJlbmRlckVyciA9ICdSZW5kZXJlciBFcnJvciDimJ3vuI8nO1xuICB2YXIgYWN0aW9ucyA9IHtcbiAgICBpbml0OiAnaW5pdCdcbiAgfTtcbiAgdmFyIGRlZmF1bHRSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJlcihfcmVmKSB7XG4gICAgdmFyIF9yZWYkdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgICB2YWx1ZSA9IF9yZWYkdmFsdWUgPT09IHZvaWQgMCA/ICcnIDogX3JlZiR2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHZhciBlbXB0eVJlbmRlcmVyID0gZnVuY3Rpb24gZW1wdHlSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgXCJcXHhBMFwiKTtcbiAgfTtcbiAgdmFyIGRlZmF1bHRDb2x1bW4gPSB7XG4gICAgQ2VsbDogZGVmYXVsdFJlbmRlcmVyLFxuICAgIHdpZHRoOiAxNTAsXG4gICAgbWluV2lkdGg6IDAsXG4gICAgbWF4V2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gIH07XG5cbiAgZnVuY3Rpb24gbWVyZ2VQcm9wcygpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcHJvcExpc3QgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwcm9wTGlzdFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcExpc3QucmVkdWNlKGZ1bmN0aW9uIChwcm9wcywgbmV4dCkge1xuICAgICAgdmFyIHN0eWxlID0gbmV4dC5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBuZXh0LmNsYXNzTmFtZSxcbiAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UobmV4dCwgW1wic3R5bGVcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gICAgICBwcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywge30sIHJlc3QpO1xuXG4gICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgcHJvcHMuc3R5bGUgPSBwcm9wcy5zdHlsZSA/IF9leHRlbmRzKHt9LCBwcm9wcy5zdHlsZSB8fCB7fSwge30sIHN0eWxlIHx8IHt9KSA6IHN0eWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSA/IHByb3BzLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZSA6IGNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNsYXNzTmFtZSA9PT0gJycpIHtcbiAgICAgICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVByb3BHZXR0ZXIocHJldlByb3BzLCB1c2VyUHJvcHMsIG1ldGEpIHtcbiAgICAvLyBIYW5kbGUgYSBsYW1iZGEsIHBhc3MgaXQgdGhlIHByZXZpb3VzIHByb3BzXG4gICAgaWYgKHR5cGVvZiB1c2VyUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBoYW5kbGVQcm9wR2V0dGVyKHt9LCB1c2VyUHJvcHMocHJldlByb3BzLCBtZXRhKSk7XG4gICAgfSAvLyBIYW5kbGUgYW4gYXJyYXksIG1lcmdlIGVhY2ggaXRlbSBhcyBzZXBhcmF0ZSBwcm9wc1xuXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1c2VyUHJvcHMpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VQcm9wcy5hcHBseSh2b2lkIDAsIFtwcmV2UHJvcHNdLmNvbmNhdCh1c2VyUHJvcHMpKTtcbiAgICB9IC8vIEhhbmRsZSBhbiBvYmplY3QgYnkgZGVmYXVsdCwgbWVyZ2UgdGhlIHR3byBvYmplY3RzXG5cblxuICAgIHJldHVybiBtZXJnZVByb3BzKHByZXZQcm9wcywgdXNlclByb3BzKTtcbiAgfVxuXG4gIHZhciBtYWtlUHJvcEdldHRlciA9IGZ1bmN0aW9uIG1ha2VQcm9wR2V0dGVyKGhvb2tzLCBtZXRhKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAodXNlclByb3BzKSB7XG4gICAgICBpZiAodXNlclByb3BzID09PSB2b2lkIDApIHtcbiAgICAgICAgdXNlclByb3BzID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXS5jb25jYXQoaG9va3MsIFt1c2VyUHJvcHNdKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVByb3BHZXR0ZXIocHJldiwgbmV4dCwgX2V4dGVuZHMoe30sIG1ldGEsIHtcbiAgICAgICAgICB1c2VyUHJvcHM6IHVzZXJQcm9wc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7fSk7XG4gICAgfTtcbiAgfTtcbiAgdmFyIHJlZHVjZUhvb2tzID0gZnVuY3Rpb24gcmVkdWNlSG9va3MoaG9va3MsIGluaXRpYWwsIG1ldGEsIGFsbG93VW5kZWZpbmVkKSB7XG4gICAgaWYgKG1ldGEgPT09IHZvaWQgMCkge1xuICAgICAgbWV0YSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBob29rcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIG5leHQpIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBuZXh0KHByZXYsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICghYWxsb3dVbmRlZmluZWQgJiYgdHlwZW9mIG5leHRWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8obmV4dCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBUYWJsZTogQSByZWR1Y2VyIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgdW5kZWZpbmVkISBUaGlzIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfSwgaW5pdGlhbCk7XG4gIH07XG4gIHZhciBsb29wSG9va3MgPSBmdW5jdGlvbiBsb29wSG9va3MoaG9va3MsIGNvbnRleHQsIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgIHZhciBuZXh0VmFsdWUgPSBob29rKGNvbnRleHQsIG1ldGEpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgbmV4dFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhob29rLCBuZXh0VmFsdWUpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgVGFibGU6IEEgbG9vcC10eXBlIGhvb2sg4pid77iPIGp1c3QgcmV0dXJuZWQgYSB2YWx1ZSEgVGhpcyBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBmdW5jdGlvbiBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBiZWZvcmVzLCBwbHVnaW5OYW1lLCBhZnRlcnMpIHtcbiAgICBpZiAoIGFmdGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmaW5pbmcgcGx1Z2lucyBpbiB0aGUgXFxcImFmdGVyXFxcIiBzZWN0aW9uIG9mIGVuc3VyZVBsdWdpbk9yZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgKHNlZSBwbHVnaW4gXCIgKyBwbHVnaW5OYW1lICsgXCIpXCIpO1xuICAgIH1cblxuICAgIHZhciBwbHVnaW5JbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHJldHVybiBwbHVnaW4ucGx1Z2luTmFtZSA9PT0gcGx1Z2luTmFtZTtcbiAgICB9KTtcblxuICAgIGlmIChwbHVnaW5JbmRleCA9PT0gLTEpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsdWdpbiBcXFwiXCIgKyBwbHVnaW5OYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQgaW4gdGhlIHBsdWdpbiBsaXN0IVxcblRoaXMgdXN1YWxseSBtZWFucyB5b3UgbmVlZCB0byBuZWVkIHRvIG5hbWUgeW91ciBwbHVnaW4gaG9vayBieSBzZXR0aW5nIHRoZSAncGx1Z2luTmFtZScgcHJvcGVydHkgb2YgdGhlIGhvb2sgZnVuY3Rpb24sIGVnOlxcblxcbiAgXCIgKyBwbHVnaW5OYW1lICsgXCIucGx1Z2luTmFtZSA9ICdcIiArIHBsdWdpbk5hbWUgKyBcIidcXG5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYmVmb3Jlcy5mb3JFYWNoKGZ1bmN0aW9uIChiZWZvcmUpIHtcbiAgICAgIHZhciBiZWZvcmVJbmRleCA9IHBsdWdpbnMuZmluZEluZGV4KGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5wbHVnaW5OYW1lID09PSBiZWZvcmU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGJlZm9yZUluZGV4ID4gLTEgJiYgYmVmb3JlSW5kZXggPiBwbHVnaW5JbmRleCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QgVGFibGU6IFRoZSBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4gaG9vayBtdXN0IGJlIHBsYWNlZCBhZnRlciB0aGUgXCIgKyBiZWZvcmUgKyBcIiBwbHVnaW4gaG9vayFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBmdW5jdGlvbmFsVXBkYXRlKHVwZGF0ZXIsIG9sZCkge1xuICAgIHJldHVybiB0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJyA/IHVwZGF0ZXIob2xkKSA6IHVwZGF0ZXI7XG4gIH1cbiAgZnVuY3Rpb24gdXNlR2V0TGF0ZXN0KG9iaikge1xuICAgIHZhciByZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgICByZWYuY3VycmVudCA9IG9iajtcbiAgICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlZi5jdXJyZW50O1xuICAgIH0sIFtdKTtcbiAgfSAvLyBTU1IgaGFzIGlzc3VlcyB3aXRoIHVzZUxheW91dEVmZmVjdCBzdGlsbCwgc28gdXNlIHVzZUVmZmVjdCBkdXJpbmcgU1NSXG5cbiAgdmFyIHNhZmVVc2VMYXlvdXRFZmZlY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xuICBmdW5jdGlvbiB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZuLCBkZXBzKSB7XG4gICAgdmFyIG1vdW50ZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIHNhZmVVc2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG1vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgICBmbigpO1xuICAgICAgfVxuXG4gICAgICBtb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICB9LCBkZXBzKTtcbiAgfVxuICBmdW5jdGlvbiB1c2VBc3luY0RlYm91bmNlKGRlZmF1bHRGbiwgZGVmYXVsdFdhaXQpIHtcbiAgICBpZiAoZGVmYXVsdFdhaXQgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFdhaXQgPSAwO1xuICAgIH1cblxuICAgIHZhciBkZWJvdW5jZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gICAgdmFyIGdldERlZmF1bHRGbiA9IHVzZUdldExhdGVzdChkZWZhdWx0Rm4pO1xuICAgIHZhciBnZXREZWZhdWx0V2FpdCA9IHVzZUdldExhdGVzdChkZWZhdWx0V2FpdCk7XG4gICAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICB2YXIgX2xlbjIsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgX2tleTIsXG4gICAgICAgICAgICBfYXJnczIgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBmb3IgKF9sZW4yID0gX2FyZ3MyLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICAgICAgYXJnc1tfa2V5Ml0gPSBfYXJnczJbX2tleTJdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZGVib3VuY2VSZWYuY3VycmVudC5wcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVib3VuY2VSZWYuY3VycmVudC50aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgICAgICAgX2FzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAgICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgICAgICAgIHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWJvdW5jZVJlZi5jdXJyZW50LnRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MCA9IGRlYm91bmNlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEZuKCkuYXBwbHkodm9pZCAwLCBhcmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MSA9IF9jb250ZXh0LnNlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDAucmVzb2x2ZS5jYWxsKF9jb250ZXh0LnQwLCBfY29udGV4dC50MSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQudDIgPSBfY29udGV4dFtcImNhdGNoXCJdKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnJlamVjdChfY29udGV4dC50Mik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCgxMik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlLCBudWxsLCBbWzEsIDksIDEyLCAxNV1dKTtcbiAgICAgICAgICAgICAgICB9KSksIGdldERlZmF1bHRXYWl0KCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCksIFtnZXREZWZhdWx0Rm4sIGdldERlZmF1bHRXYWl0XSk7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZVJlbmRlcmVyKGluc3RhbmNlLCBjb2x1bW4sIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0eXBlLCB1c2VyUHJvcHMpIHtcbiAgICAgIGlmICh1c2VyUHJvcHMgPT09IHZvaWQgMCkge1xuICAgICAgICB1c2VyUHJvcHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgdmFyIENvbXAgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyBjb2x1bW5bdHlwZV0gOiB0eXBlO1xuXG4gICAgICBpZiAodHlwZW9mIENvbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb2x1bW4pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVuZGVyRXJyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsZXhSZW5kZXIoQ29tcCwgX2V4dGVuZHMoe30sIGluc3RhbmNlLCB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICB9LCBtZXRhLCB7fSwgdXNlclByb3BzKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBmbGV4UmVuZGVyKENvbXAsIHByb3BzKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RDb21wb25lbnQoQ29tcCkgPyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXAsIHByb3BzKSA6IENvbXA7XG4gIH1cblxuICBmdW5jdGlvbiBpc1JlYWN0Q29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgfHwgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0V4b3RpY0NvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29tcG9uZW50KTtcbiAgICAgIHJldHVybiBwcm90by5wcm90b3R5cGUgJiYgcHJvdG8ucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG4gICAgfSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFeG90aWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBjb21wb25lbnQuJCR0eXBlb2YgPT09ICdzeW1ib2wnICYmIFsncmVhY3QubWVtbycsICdyZWFjdC5mb3J3YXJkX3JlZiddLmluY2x1ZGVzKGNvbXBvbmVudC4kJHR5cGVvZi5kZXNjcmlwdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5rQ29sdW1uU3RydWN0dXJlKGNvbHVtbnMsIHBhcmVudCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgICAgZGVwdGggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4gPSBfZXh0ZW5kcyh7fSwgY29sdW1uLCB7XG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBkZXB0aDogZGVwdGhcbiAgICAgIH0pO1xuICAgICAgYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKTtcblxuICAgICAgaWYgKGNvbHVtbi5jb2x1bW5zKSB7XG4gICAgICAgIGNvbHVtbi5jb2x1bW5zID0gbGlua0NvbHVtblN0cnVjdHVyZShjb2x1bW4uY29sdW1ucywgY29sdW1uLCBkZXB0aCArIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZsYXR0ZW5Db2x1bW5zKGNvbHVtbnMpIHtcbiAgICByZXR1cm4gZmxhdHRlbkJ5KGNvbHVtbnMsICdjb2x1bW5zJyk7XG4gIH1cbiAgZnVuY3Rpb24gYXNzaWduQ29sdW1uQWNjZXNzb3IoY29sdW1uKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgZm9yIHN0cmluZyBhY2Nlc3NvclxuICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgIEhlYWRlciA9IGNvbHVtbi5IZWFkZXI7XG5cbiAgICBpZiAodHlwZW9mIGFjY2Vzc29yID09PSAnc3RyaW5nJykge1xuICAgICAgaWQgPSBpZCB8fCBhY2Nlc3NvcjtcbiAgICAgIHZhciBhY2Nlc3NvclBhdGggPSBhY2Nlc3Nvci5zcGxpdCgnLicpO1xuXG4gICAgICBhY2Nlc3NvciA9IGZ1bmN0aW9uIGFjY2Vzc29yKHJvdykge1xuICAgICAgICByZXR1cm4gZ2V0Qnkocm93LCBhY2Nlc3NvclBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWlkICYmIHR5cGVvZiBIZWFkZXIgPT09ICdzdHJpbmcnICYmIEhlYWRlcikge1xuICAgICAgaWQgPSBIZWFkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFpZCAmJiBjb2x1bW4uY29sdW1ucykge1xuICAgICAgY29uc29sZS5lcnJvcihjb2x1bW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGNvbHVtbiBJRCAob3IgdW5pcXVlIFwiSGVhZGVyXCIgdmFsdWUpIGlzIHJlcXVpcmVkIScpO1xuICAgIH1cblxuICAgIGlmICghaWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY29sdW1uKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBjb2x1bW4gSUQgKG9yIHN0cmluZyBhY2Nlc3NvcikgaXMgcmVxdWlyZWQhJyk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGFjY2Vzc29yOiBhY2Nlc3NvclxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgZnVuY3Rpb24gZGVjb3JhdGVDb2x1bW4oY29sdW1uLCB1c2VyRGVmYXVsdENvbHVtbikge1xuICAgIGlmICghdXNlckRlZmF1bHRDb2x1bW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCBfZXh0ZW5kcyh7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSBmYWxsYmFjayBoZWFkZXIsIGp1c3QgaW4gY2FzZVxuICAgICAgSGVhZGVyOiBlbXB0eVJlbmRlcmVyLFxuICAgICAgRm9vdGVyOiBlbXB0eVJlbmRlcmVyXG4gICAgfSwgZGVmYXVsdENvbHVtbiwge30sIHVzZXJEZWZhdWx0Q29sdW1uLCB7fSwgY29sdW1uKSk7XG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgIG9yaWdpbmFsV2lkdGg6IGNvbHVtbi53aWR0aFxuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH0gLy8gQnVpbGQgdGhlIGhlYWRlciBncm91cHMgZnJvbSB0aGUgYm90dG9tIHVwXG5cbiAgZnVuY3Rpb24gbWFrZUhlYWRlckdyb3VwcyhhbGxDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcykge1xuICAgIGlmIChhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9PT0gdm9pZCAwKSB7XG4gICAgICBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyA9IGZ1bmN0aW9uIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJHcm91cHMgPSBbXTtcbiAgICB2YXIgc2NhbkNvbHVtbnMgPSBhbGxDb2x1bW5zO1xuICAgIHZhciB1aWQgPSAwO1xuXG4gICAgdmFyIGdldFVJRCA9IGZ1bmN0aW9uIGdldFVJRCgpIHtcbiAgICAgIHJldHVybiB1aWQrKztcbiAgICB9O1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAvLyBUaGUgaGVhZGVyIGdyb3VwIHdlIGFyZSBjcmVhdGluZ1xuICAgICAgdmFyIGhlYWRlckdyb3VwID0ge1xuICAgICAgICBoZWFkZXJzOiBbXVxuICAgICAgfTsgLy8gVGhlIHBhcmVudCBjb2x1bW5zIHdlJ3JlIGdvaW5nIHRvIHNjYW4gbmV4dFxuXG4gICAgICB2YXIgcGFyZW50Q29sdW1ucyA9IFtdO1xuICAgICAgdmFyIGhhc1BhcmVudHMgPSBzY2FuQ29sdW1ucy5zb21lKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLnBhcmVudDtcbiAgICAgIH0pOyAvLyBTY2FuIGVhY2ggY29sdW1uIGZvciBwYXJlbnRzXG5cbiAgICAgIHNjYW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAvLyBXaGF0IGlzIHRoZSBsYXRlc3QgKGxhc3QpIHBhcmVudCBjb2x1bW4/XG4gICAgICAgIHZhciBsYXRlc3RQYXJlbnRDb2x1bW4gPSBbXS5jb25jYXQocGFyZW50Q29sdW1ucykucmV2ZXJzZSgpWzBdO1xuICAgICAgICB2YXIgbmV3UGFyZW50O1xuXG4gICAgICAgIGlmIChoYXNQYXJlbnRzKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBoYXMgYSBwYXJlbnQsIGFkZCBpdCBpZiBuZWNlc3NhcnlcbiAgICAgICAgICBpZiAoY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgbmV3UGFyZW50ID0gX2V4dGVuZHMoe30sIGNvbHVtbi5wYXJlbnQsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogY29sdW1uLnBhcmVudC5pZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5wYXJlbnQuaWQgKyBcIl9cIiArIGdldFVJRCgpLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBbY29sdW1uXVxuICAgICAgICAgICAgfSwgYWRkaXRpb25hbEhlYWRlclByb3BlcnRpZXMoY29sdW1uKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG90aGVyIGNvbHVtbnMgaGF2ZSBwYXJlbnRzLCB3ZSdsbCBuZWVkIHRvIGFkZCBhIHBsYWNlIGhvbGRlciBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbElkID0gY29sdW1uLmlkICsgXCJfcGxhY2Vob2xkZXJcIjtcbiAgICAgICAgICAgIG5ld1BhcmVudCA9IGRlY29yYXRlQ29sdW1uKF9leHRlbmRzKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxJZDogb3JpZ2luYWxJZCxcbiAgICAgICAgICAgICAgaWQ6IGNvbHVtbi5pZCArIFwiX3BsYWNlaG9sZGVyX1wiICsgZ2V0VUlEKCksXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyT2Y6IGNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyczogW2NvbHVtbl1cbiAgICAgICAgICAgIH0sIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKGNvbHVtbikpLCBkZWZhdWx0Q29sdW1uKTtcbiAgICAgICAgICB9IC8vIElmIHRoZSByZXN1bHRpbmcgcGFyZW50IGNvbHVtbnMgYXJlIHRoZSBzYW1lLCBqdXN0IGFkZFxuICAgICAgICAgIC8vIHRoZSBjb2x1bW4gYW5kIGluY3JlbWVudCB0aGUgaGVhZGVyIHNwYW5cblxuXG4gICAgICAgICAgaWYgKGxhdGVzdFBhcmVudENvbHVtbiAmJiBsYXRlc3RQYXJlbnRDb2x1bW4ub3JpZ2luYWxJZCA9PT0gbmV3UGFyZW50Lm9yaWdpbmFsSWQpIHtcbiAgICAgICAgICAgIGxhdGVzdFBhcmVudENvbHVtbi5oZWFkZXJzLnB1c2goY29sdW1uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50Q29sdW1ucy5wdXNoKG5ld1BhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycy5wdXNoKGNvbHVtbik7XG4gICAgICB9KTtcbiAgICAgIGhlYWRlckdyb3Vwcy5wdXNoKGhlYWRlckdyb3VwKTsgLy8gU3RhcnQgc2Nhbm5pbmcgdGhlIHBhcmVudCBjb2x1bW5zXG5cbiAgICAgIHNjYW5Db2x1bW5zID0gcGFyZW50Q29sdW1ucztcbiAgICB9O1xuXG4gICAgd2hpbGUgKHNjYW5Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyR3JvdXBzLnJldmVyc2UoKTtcbiAgfVxuICB2YXIgcGF0aE9iakNhY2hlID0gbmV3IE1hcCgpO1xuICBmdW5jdGlvbiBnZXRCeShvYmosIHBhdGgsIGRlZikge1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICB2YXIgY2FjaGVLZXkgPSB0eXBlb2YgcGF0aCA9PT0gJ2Z1bmN0aW9uJyA/IHBhdGggOiBKU09OLnN0cmluZ2lmeShwYXRoKTtcblxuICAgIHZhciBwYXRoT2JqID0gcGF0aE9iakNhY2hlLmdldChjYWNoZUtleSkgfHwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhdGhPYmogPSBtYWtlUGF0aEFycmF5KHBhdGgpO1xuICAgICAgcGF0aE9iakNhY2hlLnNldChjYWNoZUtleSwgcGF0aE9iaik7XG4gICAgICByZXR1cm4gcGF0aE9iajtcbiAgICB9KCk7XG5cbiAgICB2YXIgdmFsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbCA9IHBhdGhPYmoucmVkdWNlKGZ1bmN0aW9uIChjdXJzb3IsIHBhdGhQYXJ0KSB7XG4gICAgICAgIHJldHVybiBjdXJzb3JbcGF0aFBhcnRdO1xuICAgICAgfSwgb2JqKTtcbiAgICB9IGNhdGNoIChlKSB7Ly8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyA/IHZhbCA6IGRlZjtcbiAgfVxuICBmdW5jdGlvbiBnZXRGaXJzdERlZmluZWQoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYXJnc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihhKSB7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZmxhdHRlbkJ5KGFyciwga2V5KSB7XG4gICAgdmFyIGZsYXQgPSBbXTtcblxuICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24gcmVjdXJzZShhcnIpIHtcbiAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIGlmICghZFtrZXldKSB7XG4gICAgICAgICAgZmxhdC5wdXNoKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2UoZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlY3Vyc2UoYXJyKTtcbiAgICByZXR1cm4gZmxhdDtcbiAgfVxuICBmdW5jdGlvbiBleHBhbmRSb3dzKHJvd3MsIF9yZWYpIHtcbiAgICB2YXIgbWFudWFsRXhwYW5kZWRLZXkgPSBfcmVmLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBleHBhbmRlZCA9IF9yZWYuZXhwYW5kZWQsXG4gICAgICAgIF9yZWYkZXhwYW5kU3ViUm93cyA9IF9yZWYuZXhwYW5kU3ViUm93cyxcbiAgICAgICAgZXhwYW5kU3ViUm93cyA9IF9yZWYkZXhwYW5kU3ViUm93cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkZXhwYW5kU3ViUm93cztcbiAgICB2YXIgZXhwYW5kZWRSb3dzID0gW107XG5cbiAgICB2YXIgaGFuZGxlUm93ID0gZnVuY3Rpb24gaGFuZGxlUm93KHJvdywgYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgIGlmIChhZGRUb0V4cGFuZGVkUm93cyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGFkZFRvRXhwYW5kZWRSb3dzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcm93LmlzRXhwYW5kZWQgPSByb3cub3JpZ2luYWwgJiYgcm93Lm9yaWdpbmFsW21hbnVhbEV4cGFuZGVkS2V5XSB8fCBleHBhbmRlZFtyb3cuaWRdO1xuICAgICAgcm93LmNhbkV4cGFuZCA9IHJvdy5zdWJSb3dzICYmICEhcm93LnN1YlJvd3MubGVuZ3RoO1xuXG4gICAgICBpZiAoYWRkVG9FeHBhbmRlZFJvd3MpIHtcbiAgICAgICAgZXhwYW5kZWRSb3dzLnB1c2gocm93KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCAmJiByb3cuaXNFeHBhbmRlZCkge1xuICAgICAgICByb3cuc3ViUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlUm93KHJvdywgZXhwYW5kU3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGhhbmRsZVJvdyhyb3cpO1xuICAgIH0pO1xuICAgIHJldHVybiBleHBhbmRlZFJvd3M7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RmlsdGVyTWV0aG9kKGZpbHRlciwgdXNlckZpbHRlclR5cGVzLCBmaWx0ZXJUeXBlcykge1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGZpbHRlcikgfHwgdXNlckZpbHRlclR5cGVzW2ZpbHRlcl0gfHwgZmlsdGVyVHlwZXNbZmlsdGVyXSB8fCBmaWx0ZXJUeXBlcy50ZXh0O1xuICB9XG4gIGZ1bmN0aW9uIHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoYXV0b1JlbW92ZSwgdmFsdWUsIGNvbHVtbikge1xuICAgIHJldHVybiBhdXRvUmVtb3ZlID8gYXV0b1JlbW92ZSh2YWx1ZSwgY29sdW1uKSA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gIH1cbiAgZnVuY3Rpb24gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmcoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC1UYWJsZTogWW91IGhhdmUgbm90IGNhbGxlZCBwcmVwYXJlUm93KHJvdykgb25lIG9yIG1vcmUgcm93cyB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gcmVuZGVyLicpO1xuICB9XG4gIHZhciBwYXNzaXZlU3VwcG9ydGVkID0gbnVsbDtcbiAgZnVuY3Rpb24gcGFzc2l2ZUV2ZW50U3VwcG9ydGVkKCkge1xuICAgIC8vIG1lbW9pemUgc3VwcG9ydCB0byBhdm9pZCBhZGRpbmcgbXVsdGlwbGUgdGVzdCBldmVudHNcbiAgICBpZiAodHlwZW9mIHBhc3NpdmVTdXBwb3J0ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHBhc3NpdmVTdXBwb3J0ZWQ7XG4gICAgdmFyIHN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBnZXQgcGFzc2l2ZSgpIHtcbiAgICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwYXNzaXZlU3VwcG9ydGVkID0gc3VwcG9ydGVkO1xuICAgIHJldHVybiBwYXNzaXZlU3VwcG9ydGVkO1xuICB9IC8vXG5cbiAgdmFyIHJlT3BlbkJyYWNrZXQgPSAvXFxbL2c7XG4gIHZhciByZUNsb3NlQnJhY2tldCA9IC9cXF0vZztcblxuICBmdW5jdGlvbiBtYWtlUGF0aEFycmF5KG9iaikge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChvYmopIC8vIHJlbW92ZSBhbGwgcGVyaW9kcyBpbiBwYXJ0c1xuICAgIC5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoZCkucmVwbGFjZSgnLicsICdfJyk7XG4gICAgfSkgLy8gam9pbiBwYXJ0cyB1c2luZyBwZXJpb2RcbiAgICAuam9pbignLicpIC8vIHJlcGxhY2UgYnJhY2tldHMgd2l0aCBwZXJpb2RzXG4gICAgLnJlcGxhY2UocmVPcGVuQnJhY2tldCwgJy4nKS5yZXBsYWNlKHJlQ2xvc2VCcmFja2V0LCAnJykgLy8gc3BsaXQgaXQgYmFjayBvdXQgb24gcGVyaW9kc1xuICAgIC5zcGxpdCgnLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyLCBuZXdBcnIpIHtcbiAgICBpZiAobmV3QXJyID09PSB2b2lkIDApIHtcbiAgICAgIG5ld0FyciA9IFtdO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICBuZXdBcnIucHVzaChhcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBmbGF0dGVuRGVlcChhcnJbaV0sIG5ld0Fycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0FycjtcbiAgfVxuXG4gIHZhciBkZWZhdWx0R2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZVByb3BzKHByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIHJvbGU6ICd0YWJsZSdcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUYWJsZUJvZHlQcm9wcyhwcm9wcykge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICByb2xlOiAncm93Z3JvdXAnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0SGVhZGVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0SGVhZGVyUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQsXG4gICAgICByb2xlOiAnY29sdW1uaGVhZGVyJ1xuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldEZvb3RlclByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3RlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJfXCIgKyBjb2x1bW4uaWQsXG4gICAgICBjb2xTcGFuOiBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnRcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRIZWFkZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHMocHJvcHMsIF9yZWYzKSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjMuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJoZWFkZXJHcm91cF9cIiArIGluZGV4LFxuICAgICAgcm9sZTogJ3JvdydcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldEZvb3Rlckdyb3VwUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGluZGV4ID0gX3JlZjQuaW5kZXg7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJmb290ZXJHcm91cF9cIiArIGluZGV4XG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Um93UHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Um93UHJvcHMocHJvcHMsIF9yZWY1KSB7XG4gICAgdmFyIHJvdyA9IF9yZWY1LnJvdztcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcInJvd19cIiArIHJvdy5pZCxcbiAgICAgIHJvbGU6ICdyb3cnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Q2VsbFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldENlbGxQcm9wcyhwcm9wcywgX3JlZjYpIHtcbiAgICB2YXIgY2VsbCA9IF9yZWY2LmNlbGw7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIGtleTogXCJjZWxsX1wiICsgY2VsbC5yb3cuaWQgKyBcIl9cIiArIGNlbGwuY29sdW1uLmlkLFxuICAgICAgcm9sZTogJ2NlbGwnXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VEZWZhdWx0UGx1Z2luSG9va3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZU9wdGlvbnM6IFtdLFxuICAgICAgc3RhdGVSZWR1Y2VyczogW10sXG4gICAgICB1c2VDb250cm9sbGVkU3RhdGU6IFtdLFxuICAgICAgY29sdW1uczogW10sXG4gICAgICBjb2x1bW5zRGVwczogW10sXG4gICAgICBhbGxDb2x1bW5zOiBbXSxcbiAgICAgIGFsbENvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGFjY2Vzc1ZhbHVlOiBbXSxcbiAgICAgIG1hdGVyaWFsaXplZENvbHVtbnM6IFtdLFxuICAgICAgbWF0ZXJpYWxpemVkQ29sdW1uc0RlcHM6IFtdLFxuICAgICAgdXNlSW5zdGFuY2VBZnRlckRhdGE6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnM6IFtdLFxuICAgICAgdmlzaWJsZUNvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGhlYWRlckdyb3VwczogW10sXG4gICAgICBoZWFkZXJHcm91cHNEZXBzOiBbXSxcbiAgICAgIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9uczogW10sXG4gICAgICB1c2VJbnN0YW5jZTogW10sXG4gICAgICBwcmVwYXJlUm93OiBbXSxcbiAgICAgIGdldFRhYmxlUHJvcHM6IFtkZWZhdWx0R2V0VGFibGVQcm9wc10sXG4gICAgICBnZXRUYWJsZUJvZHlQcm9wczogW2RlZmF1bHRHZXRUYWJsZUJvZHlQcm9wc10sXG4gICAgICBnZXRIZWFkZXJHcm91cFByb3BzOiBbZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHNdLFxuICAgICAgZ2V0Rm9vdGVyR3JvdXBQcm9wczogW2RlZmF1bHRHZXRGb290ZXJHcm91cFByb3BzXSxcbiAgICAgIGdldEhlYWRlclByb3BzOiBbZGVmYXVsdEdldEhlYWRlclByb3BzXSxcbiAgICAgIGdldEZvb3RlclByb3BzOiBbZGVmYXVsdEdldEZvb3RlclByb3BzXSxcbiAgICAgIGdldFJvd1Byb3BzOiBbZGVmYXVsdEdldFJvd1Byb3BzXSxcbiAgICAgIGdldENlbGxQcm9wczogW2RlZmF1bHRHZXRDZWxsUHJvcHNdLFxuICAgICAgdXNlRmluYWxJbnN0YW5jZTogW11cbiAgICB9O1xuICB9XG5cbiAgYWN0aW9ucy5yZXNldEhpZGRlbkNvbHVtbnMgPSAncmVzZXRIaWRkZW5Db2x1bW5zJztcbiAgYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uID0gJ3RvZ2dsZUhpZGVDb2x1bW4nO1xuICBhY3Rpb25zLnNldEhpZGRlbkNvbHVtbnMgPSAnc2V0SGlkZGVuQ29sdW1ucyc7XG4gIGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMgPSAndG9nZ2xlSGlkZUFsbENvbHVtbnMnO1xuICB2YXIgdXNlQ29sdW1uVmlzaWJpbGl0eSA9IGZ1bmN0aW9uIHVzZUNvbHVtblZpc2liaWxpdHkoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVIaWRkZW5Qcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMpO1xuICAgIGhvb2tzLmhlYWRlckdyb3Vwc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnNdKTtcbiAgICB9KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlKTtcbiAgfTtcbiAgdXNlQ29sdW1uVmlzaWJpbGl0eS5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtblZpc2liaWxpdHknO1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZGVuUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYyLmNvbHVtbjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuKCFlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNvbHVtbi5pc1Zpc2libGUsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBDb2x1bW4gVmlzaWJsZSdcbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVIaWRlQWxsQ29sdW1ucyghZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiAhaW5zdGFuY2UuYWxsQ29sdW1uc0hpZGRlbiAmJiAhaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGgsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ29sdW1ucyBIaWRkZW4nLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogIWluc3RhbmNlLmFsbENvbHVtbnNIaWRkZW4gJiYgaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGhcbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1ucykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBoaWRkZW5Db2x1bW5zOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuaGlkZGVuQ29sdW1ucyB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4pIHtcbiAgICAgIHZhciBzaG91bGQgPSB0eXBlb2YgYWN0aW9uLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IGFjdGlvbi52YWx1ZSA6ICFzdGF0ZS5oaWRkZW5Db2x1bW5zLmluY2x1ZGVzKGFjdGlvbi5jb2x1bW5JZCk7XG4gICAgICB2YXIgaGlkZGVuQ29sdW1ucyA9IHNob3VsZCA/IFtdLmNvbmNhdChzdGF0ZS5oaWRkZW5Db2x1bW5zLCBbYWN0aW9uLmNvbHVtbklkXSkgOiBzdGF0ZS5oaWRkZW5Db2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZCAhPT0gYWN0aW9uLmNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGhpZGRlbkNvbHVtbnNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRIaWRkZW5Db2x1bW5zKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnZhbHVlLCBzdGF0ZS5oaWRkZW5Db2x1bW5zKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUhpZGVBbGxDb2x1bW5zKSB7XG4gICAgICB2YXIgc2hvdWxkQWxsID0gdHlwZW9mIGFjdGlvbi52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyBhY3Rpb24udmFsdWUgOiAhc3RhdGUuaGlkZGVuQ29sdW1ucy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IHNob3VsZEFsbCA/IGluc3RhbmNlLmFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQ7XG4gICAgICAgIH0pIDogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBoZWFkZXJzID0gaW5zdGFuY2UuaGVhZGVycyxcbiAgICAgICAgaGlkZGVuQ29sdW1ucyA9IGluc3RhbmNlLnN0YXRlLmhpZGRlbkNvbHVtbnM7XG4gICAgdmFyIGlzTW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG5cbiAgICBpZiAoIWlzTW91bnRlZFJlZi5jdXJyZW50KSA7XG5cbiAgICB2YXIgaGFuZGxlQ29sdW1uID0gZnVuY3Rpb24gaGFuZGxlQ29sdW1uKGNvbHVtbiwgcGFyZW50VmlzaWJsZSkge1xuICAgICAgY29sdW1uLmlzVmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgIWhpZGRlbkNvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmlkKTtcbiAgICAgIHZhciB0b3RhbFZpc2libGVIZWFkZXJDb3VudCA9IDA7XG5cbiAgICAgIGlmIChjb2x1bW4uaGVhZGVycyAmJiBjb2x1bW4uaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgY29sdW1uLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViQ29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJDb2x1bW4sIGNvbHVtbi5pc1Zpc2libGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gY29sdW1uLmlzVmlzaWJsZSA/IDEgOiAwO1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4udG90YWxWaXNpYmxlSGVhZGVyQ291bnQgPSB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICAgIHJldHVybiB0b3RhbFZpc2libGVIZWFkZXJDb3VudDtcbiAgICB9O1xuXG4gICAgdmFyIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YkhlYWRlcikge1xuICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ICs9IGhhbmRsZUNvbHVtbihzdWJIZWFkZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBoaWRkZW5Db2x1bW5zID0gaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEhpID0gaW5zdGFuY2UuYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyA9IF9pbnN0YW5jZSRhdXRvUmVzZXRIaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRIaTtcbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2UpO1xuICAgIHZhciBhbGxDb2x1bW5zSGlkZGVuID0gYWxsQ29sdW1ucy5sZW5ndGggPT09IGhpZGRlbkNvbHVtbnMubGVuZ3RoO1xuICAgIHZhciB0b2dnbGVIaWRlQ29sdW1uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVIaWRlQ29sdW1uLFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHNldEhpZGRlbkNvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlSGlkZUFsbENvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICBjb2x1bW4udG9nZ2xlSGlkZGVuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4sXG4gICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb2x1bW4uZ2V0VG9nZ2xlSGlkZGVuUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUhpZGRlblByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGdldEF1dG9SZXNldEhpZGRlbkNvbHVtbnMgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0SGlkZGVuQ29sdW1ucygpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1uc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBhbGxDb2x1bW5zSGlkZGVuOiBhbGxDb2x1bW5zSGlkZGVuLFxuICAgICAgdG9nZ2xlSGlkZUNvbHVtbjogdG9nZ2xlSGlkZUNvbHVtbixcbiAgICAgIHNldEhpZGRlbkNvbHVtbnM6IHNldEhpZGRlbkNvbHVtbnMsXG4gICAgICB0b2dnbGVIaWRlQWxsQ29sdW1uczogdG9nZ2xlSGlkZUFsbENvbHVtbnMsXG4gICAgICBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzOiBnZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzXG4gICAgfSk7XG4gIH1cblxuICB2YXIgZGVmYXVsdEluaXRpYWxTdGF0ZSA9IHt9O1xuICB2YXIgZGVmYXVsdENvbHVtbkluc3RhbmNlID0ge307XG5cbiAgdmFyIGRlZmF1bHRSZWR1Y2VyID0gZnVuY3Rpb24gZGVmYXVsdFJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgcHJldlN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0U3ViUm93cyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRTdWJSb3dzKHJvdywgaW5kZXgpIHtcbiAgICByZXR1cm4gcm93LnN1YlJvd3MgfHwgW107XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSb3dJZCA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRSb3dJZChyb3csIGluZGV4LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gXCJcIiArIChwYXJlbnQgPyBbcGFyZW50LmlkLCBpbmRleF0uam9pbignLicpIDogaW5kZXgpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0VXNlQ29udHJvbGxlZFN0YXRlID0gZnVuY3Rpb24gZGVmYXVsdFVzZUNvbnRyb2xsZWRTdGF0ZShkKSB7XG4gICAgcmV0dXJuIGQ7XG4gIH07XG5cbiAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0cyhwcm9wcykge1xuICAgIHZhciBfcHJvcHMkaW5pdGlhbFN0YXRlID0gcHJvcHMuaW5pdGlhbFN0YXRlLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfcHJvcHMkaW5pdGlhbFN0YXRlID09PSB2b2lkIDAgPyBkZWZhdWx0SW5pdGlhbFN0YXRlIDogX3Byb3BzJGluaXRpYWxTdGF0ZSxcbiAgICAgICAgX3Byb3BzJGRlZmF1bHRDb2x1bW4gPSBwcm9wcy5kZWZhdWx0Q29sdW1uLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX3Byb3BzJGRlZmF1bHRDb2x1bW4gPT09IHZvaWQgMCA/IGRlZmF1bHRDb2x1bW5JbnN0YW5jZSA6IF9wcm9wcyRkZWZhdWx0Q29sdW1uLFxuICAgICAgICBfcHJvcHMkZ2V0U3ViUm93cyA9IHByb3BzLmdldFN1YlJvd3MsXG4gICAgICAgIGdldFN1YlJvd3MgPSBfcHJvcHMkZ2V0U3ViUm93cyA9PT0gdm9pZCAwID8gZGVmYXVsdEdldFN1YlJvd3MgOiBfcHJvcHMkZ2V0U3ViUm93cyxcbiAgICAgICAgX3Byb3BzJGdldFJvd0lkID0gcHJvcHMuZ2V0Um93SWQsXG4gICAgICAgIGdldFJvd0lkID0gX3Byb3BzJGdldFJvd0lkID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0Um93SWQgOiBfcHJvcHMkZ2V0Um93SWQsXG4gICAgICAgIF9wcm9wcyRzdGF0ZVJlZHVjZXIgPSBwcm9wcy5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9wcm9wcyRzdGF0ZVJlZHVjZXIgPT09IHZvaWQgMCA/IGRlZmF1bHRSZWR1Y2VyIDogX3Byb3BzJHN0YXRlUmVkdWNlcixcbiAgICAgICAgX3Byb3BzJHVzZUNvbnRyb2xsZWRTID0gcHJvcHMudXNlQ29udHJvbGxlZFN0YXRlLFxuICAgICAgICB1c2VDb250cm9sbGVkU3RhdGUgPSBfcHJvcHMkdXNlQ29udHJvbGxlZFMgPT09IHZvaWQgMCA/IGRlZmF1bHRVc2VDb250cm9sbGVkU3RhdGUgOiBfcHJvcHMkdXNlQ29udHJvbGxlZFMsXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgW1wiaW5pdGlhbFN0YXRlXCIsIFwiZGVmYXVsdENvbHVtblwiLCBcImdldFN1YlJvd3NcIiwgXCJnZXRSb3dJZFwiLCBcInN0YXRlUmVkdWNlclwiLCBcInVzZUNvbnRyb2xsZWRTdGF0ZVwiXSk7XG5cbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGluaXRpYWxTdGF0ZTogaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdENvbHVtbjogZGVmYXVsdENvbHVtbixcbiAgICAgIGdldFN1YlJvd3M6IGdldFN1YlJvd3MsXG4gICAgICBnZXRSb3dJZDogZ2V0Um93SWQsXG4gICAgICBzdGF0ZVJlZHVjZXI6IHN0YXRlUmVkdWNlcixcbiAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZTogdXNlQ29udHJvbGxlZFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICB2YXIgdXNlVGFibGUgPSBmdW5jdGlvbiB1c2VUYWJsZShwcm9wcykge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHBsdWdpbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgcHJvcHNcbiAgICBwcm9wcyA9IGFwcGx5RGVmYXVsdHMocHJvcHMpOyAvLyBBZGQgY29yZSBwbHVnaW5zXG5cbiAgICBwbHVnaW5zID0gW3VzZUNvbHVtblZpc2liaWxpdHldLmNvbmNhdChwbHVnaW5zKTsgLy8gQ3JlYXRlIHRoZSB0YWJsZSBpbnN0YW5jZVxuXG4gICAgdmFyIGluc3RhbmNlUmVmID0gUmVhY3QudXNlUmVmKHt9KTsgLy8gQ3JlYXRlIGEgZ2V0dGVyIGZvciB0aGUgaW5zdGFuY2UgKGhlbHBzIGF2b2lkIGEgbG90IG9mIHBvdGVudGlhbCBtZW1vcnkgbGVha3MpXG5cbiAgICB2YXIgZ2V0SW5zdGFuY2UgPSB1c2VHZXRMYXRlc3QoaW5zdGFuY2VSZWYuY3VycmVudCk7IC8vIEFzc2lnbiB0aGUgcHJvcHMsIHBsdWdpbnMgYW5kIGhvb2tzIHRvIHRoZSBpbnN0YW5jZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBob29rczogbWFrZURlZmF1bHRQbHVnaW5Ib29rcygpXG4gICAgfSkpOyAvLyBBbGxvdyBwbHVnaW5zIHRvIHJlZ2lzdGVyIGhvb2tzIGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cbiAgICBwbHVnaW5zLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHBsdWdpbihnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICB9KTsgLy8gQ29uc3VtZSBhbGwgaG9va3MgYW5kIG1ha2UgYSBnZXR0ZXIgZm9yIHRoZW1cblxuICAgIHZhciBnZXRIb29rcyA9IHVzZUdldExhdGVzdChnZXRJbnN0YW5jZSgpLmhvb2tzKTtcbiAgICBnZXRJbnN0YW5jZSgpLmdldEhvb2tzID0gZ2V0SG9va3M7XG4gICAgZGVsZXRlIGdldEluc3RhbmNlKCkuaG9va3M7IC8vIEFsbG93IHVzZU9wdGlvbnMgaG9va3MgdG8gbW9kaWZ5IHRoZSBvcHRpb25zIGNvbWluZyBpbnRvIHRoZSB0YWJsZVxuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCByZWR1Y2VIb29rcyhnZXRIb29rcygpLnVzZU9wdGlvbnMsIGFwcGx5RGVmYXVsdHMocHJvcHMpKSk7XG5cbiAgICB2YXIgX2dldEluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgZGF0YSA9IF9nZXRJbnN0YW5jZS5kYXRhLFxuICAgICAgICB1c2VyQ29sdW1ucyA9IF9nZXRJbnN0YW5jZS5jb2x1bW5zLFxuICAgICAgICBpbml0aWFsU3RhdGUgPSBfZ2V0SW5zdGFuY2UuaW5pdGlhbFN0YXRlLFxuICAgICAgICBkZWZhdWx0Q29sdW1uID0gX2dldEluc3RhbmNlLmRlZmF1bHRDb2x1bW4sXG4gICAgICAgIGdldFN1YlJvd3MgPSBfZ2V0SW5zdGFuY2UuZ2V0U3ViUm93cyxcbiAgICAgICAgZ2V0Um93SWQgPSBfZ2V0SW5zdGFuY2UuZ2V0Um93SWQsXG4gICAgICAgIHN0YXRlUmVkdWNlciA9IF9nZXRJbnN0YW5jZS5zdGF0ZVJlZHVjZXIsXG4gICAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZSA9IF9nZXRJbnN0YW5jZS51c2VDb250cm9sbGVkU3RhdGU7IC8vIFNldHVwIHVzZXIgcmVkdWNlciByZWZcblxuXG4gICAgdmFyIGdldFN0YXRlUmVkdWNlciA9IHVzZUdldExhdGVzdChzdGF0ZVJlZHVjZXIpOyAvLyBCdWlsZCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIHJlZHVjZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgLy8gRGV0ZWN0IGludmFsaWQgYWN0aW9uc1xuICAgICAgaWYgKCFhY3Rpb24udHlwZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQWN0aW9uIPCfkYYnKTtcbiAgICAgIH0gLy8gUmVkdWNlIHRoZSBzdGF0ZSBmcm9tIGFsbCBwbHVnaW4gcmVkdWNlcnNcblxuXG4gICAgICByZXR1cm4gW10uY29uY2F0KGdldEhvb2tzKCkuc3RhdGVSZWR1Y2VycywgQXJyYXkuaXNBcnJheShnZXRTdGF0ZVJlZHVjZXIoKSkgPyBnZXRTdGF0ZVJlZHVjZXIoKSA6IFtnZXRTdGF0ZVJlZHVjZXIoKV0pLnJlZHVjZShmdW5jdGlvbiAocywgaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlcihzLCBhY3Rpb24sIHN0YXRlLCBnZXRJbnN0YW5jZSgpKSB8fCBzO1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0U3RhdGVSZWR1Y2VyLCBnZXRJbnN0YW5jZV0pOyAvLyBTdGFydCB0aGUgcmVkdWNlclxuXG4gICAgdmFyIF9SZWFjdCR1c2VSZWR1Y2VyID0gUmVhY3QudXNlUmVkdWNlcihyZWR1Y2VyLCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VyKGluaXRpYWxTdGF0ZSwge1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmluaXRcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgICAgICByZWR1Y2VyU3RhdGUgPSBfUmVhY3QkdXNlUmVkdWNlclswXSxcbiAgICAgICAgZGlzcGF0Y2ggPSBfUmVhY3QkdXNlUmVkdWNlclsxXTsgLy8gQWxsb3cgdGhlIHVzZXIgdG8gY29udHJvbCB0aGUgZmluYWwgc3RhdGUgd2l0aCBob29rc1xuXG5cbiAgICB2YXIgc3RhdGUgPSByZWR1Y2VIb29rcyhbXS5jb25jYXQoZ2V0SG9va3MoKS51c2VDb250cm9sbGVkU3RhdGUsIFt1c2VDb250cm9sbGVkU3RhdGVdKSwgcmVkdWNlclN0YXRlLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24oZ2V0SW5zdGFuY2UoKSwge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoXG4gICAgfSk7IC8vIERlY29yYXRlIEFsbCB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBsaW5rQ29sdW1uU3RydWN0dXJlKHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1ucywgdXNlckNvbHVtbnMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pKTtcbiAgICB9LCBbZ2V0SG9va3MsIGdldEluc3RhbmNlLCB1c2VyQ29sdW1uc10uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuY29sdW1uc0RlcHMsIFtdLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pKSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5jb2x1bW5zID0gY29sdW1uczsgLy8gR2V0IHRoZSBmbGF0IGxpc3Qgb2YgYWxsIGNvbHVtbnMgYW5kIGFsbG93IGhvb2tzIHRvIGRlY29yYXRlXG4gICAgLy8gdGhvc2UgY29sdW1ucyAoYW5kIHRyaWdnZXIgdGhpcyBtZW1vaXphdGlvbiB2aWEgZGVwcylcblxuICAgIHZhciBhbGxDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zLCBmbGF0dGVuQ29sdW1ucyhjb2x1bW5zKSwge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSkubWFwKGFzc2lnbkNvbHVtbkFjY2Vzc29yKTtcbiAgICB9LCBbY29sdW1ucywgZ2V0SG9va3MsIGdldEluc3RhbmNlXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5hbGxDb2x1bW5zRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmFsbENvbHVtbnMgPSBhbGxDb2x1bW5zOyAvLyBBY2Nlc3MgdGhlIHJvdyBtb2RlbCB1c2luZyBpbml0aWFsIGNvbHVtbnNcblxuICAgIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJvd3MgPSBbXTtcbiAgICAgIHZhciBmbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIHJvd3NCeUlkID0ge307XG4gICAgICB2YXIgYWxsQ29sdW1uc1F1ZXVlID0gW10uY29uY2F0KGFsbENvbHVtbnMpO1xuXG4gICAgICB3aGlsZSAoYWxsQ29sdW1uc1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1uc1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgcm93czogcm93cyxcbiAgICAgICAgICBmbGF0Um93czogZmxhdFJvd3MsXG4gICAgICAgICAgcm93c0J5SWQ6IHJvd3NCeUlkLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIGdldFJvd0lkOiBnZXRSb3dJZCxcbiAgICAgICAgICBnZXRTdWJSb3dzOiBnZXRTdWJSb3dzLFxuICAgICAgICAgIGFjY2Vzc1ZhbHVlSG9va3M6IGdldEhvb2tzKCkuYWNjZXNzVmFsdWUsXG4gICAgICAgICAgZ2V0SW5zdGFuY2U6IGdldEluc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgfSwgW2FsbENvbHVtbnMsIGRhdGEsIGdldFJvd0lkLCBnZXRTdWJSb3dzLCBnZXRIb29rcywgZ2V0SW5zdGFuY2VdKSxcbiAgICAgICAgcm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBmbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICByb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdO1xuXG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCB7XG4gICAgICByb3dzOiByb3dzLFxuICAgICAgaW5pdGlhbFJvd3M6IFtdLmNvbmNhdChyb3dzKSxcbiAgICAgIGZsYXRSb3dzOiBmbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiByb3dzQnlJZCAvLyBtYXRlcmlhbGl6ZWRDb2x1bW5zLFxuXG4gICAgfSk7XG4gICAgbG9vcEhvb2tzKGdldEhvb2tzKCkudXNlSW5zdGFuY2VBZnRlckRhdGEsIGdldEluc3RhbmNlKCkpOyAvLyBHZXQgdGhlIGZsYXQgbGlzdCBvZiBhbGwgY29sdW1ucyBBRlRFUiB0aGUgcm93c1xuICAgIC8vIGhhdmUgYmVlbiBhY2Nlc3MsIGFuZCBhbGxvdyBob29rcyB0byBkZWNvcmF0ZVxuICAgIC8vIHRob3NlIGNvbHVtbnMgKGFuZCB0cmlnZ2VyIHRoaXMgbWVtb2l6YXRpb24gdmlhIGRlcHMpXG5cbiAgICB2YXIgdmlzaWJsZUNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VIb29rcyhnZXRIb29rcygpLnZpc2libGVDb2x1bW5zLCBhbGxDb2x1bW5zLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRlQ29sdW1uKGQsIGRlZmF1bHRDb2x1bW4pO1xuICAgICAgfSk7XG4gICAgfSwgW2dldEhvb2tzLCBhbGxDb2x1bW5zLCBnZXRJbnN0YW5jZSwgZGVmYXVsdENvbHVtbl0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkudmlzaWJsZUNvbHVtbnNEZXBzLCBbXSwge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KSkpOyAvLyBDb21iaW5lIG5ldyB2aXNpYmxlIGNvbHVtbnMgd2l0aCBhbGwgY29sdW1uc1xuXG4gICAgYWxsQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvbHVtbnMgPSBbXS5jb25jYXQodmlzaWJsZUNvbHVtbnMpO1xuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKCFjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uLmlkO1xuICAgICAgICB9KSkge1xuICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFthbGxDb2x1bW5zLCB2aXNpYmxlQ29sdW1uc10pO1xuICAgIGdldEluc3RhbmNlKCkuYWxsQ29sdW1ucyA9IGFsbENvbHVtbnM7XG5cbiAgICB7XG4gICAgICB2YXIgZHVwbGljYXRlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4sIGkpIHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSkgIT09IGk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGR1cGxpY2F0ZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhhbGxDb2x1bW5zKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIGNvbHVtbnMgd2VyZSBmb3VuZCB3aXRoIGlkczogXFxcIlwiICsgZHVwbGljYXRlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSkuam9pbignLCAnKSArIFwiXFxcIiBpbiB0aGUgY29sdW1ucyBhcnJheSBhYm92ZVwiKTtcbiAgICAgIH1cbiAgICB9IC8vIE1ha2UgdGhlIGhlYWRlckdyb3Vwc1xuXG5cbiAgICB2YXIgaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVkdWNlSG9va3MoZ2V0SG9va3MoKS5oZWFkZXJHcm91cHMsIG1ha2VIZWFkZXJHcm91cHModmlzaWJsZUNvbHVtbnMsIGRlZmF1bHRDb2x1bW4pLCBnZXRJbnN0YW5jZSgpKTtcbiAgICB9LCBbZ2V0SG9va3MsIHZpc2libGVDb2x1bW5zLCBkZWZhdWx0Q29sdW1uLCBnZXRJbnN0YW5jZV0uY29uY2F0KHJlZHVjZUhvb2tzKGdldEhvb2tzKCkuaGVhZGVyR3JvdXBzRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlckdyb3VwcyA9IGhlYWRlckdyb3VwczsgLy8gR2V0IHRoZSBmaXJzdCBsZXZlbCBvZiBoZWFkZXJzXG5cbiAgICB2YXIgaGVhZGVycyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGhlYWRlckdyb3Vwcy5sZW5ndGggPyBoZWFkZXJHcm91cHNbMF0uaGVhZGVycyA6IFtdO1xuICAgIH0sIFtoZWFkZXJHcm91cHNdKTtcbiAgICBnZXRJbnN0YW5jZSgpLmhlYWRlcnMgPSBoZWFkZXJzOyAvLyBQcm92aWRlIGEgZmxhdCBoZWFkZXIgbGlzdCBmb3IgdXRpbGl0aWVzXG5cbiAgICBnZXRJbnN0YW5jZSgpLmZsYXRIZWFkZXJzID0gaGVhZGVyR3JvdXBzLnJlZHVjZShmdW5jdGlvbiAoYWxsLCBoZWFkZXJHcm91cCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChhbGwsIGhlYWRlckdyb3VwLmhlYWRlcnMpO1xuICAgIH0sIFtdKTtcbiAgICBsb29wSG9va3MoZ2V0SG9va3MoKS51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMsIGdldEluc3RhbmNlKCkpOyAvLyBGaWx0ZXIgY29sdW1ucyBkb3duIHRvIHZpc2libGUgb25lc1xuXG4gICAgdmFyIHZpc2libGVDb2x1bW5zRGVwID0gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pc1Zpc2libGU7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5pZDtcbiAgICB9KS5zb3J0KCkuam9pbignXycpO1xuICAgIHZpc2libGVDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlzVmlzaWJsZTtcbiAgICAgIH0pO1xuICAgIH0sIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbdmlzaWJsZUNvbHVtbnMsIHZpc2libGVDb2x1bW5zRGVwXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS52aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zOyAvLyBIZWFkZXIgVmlzaWJpbGl0eSBpcyBuZWVkZWQgYnkgdGhpcyBwb2ludFxuXG4gICAgdmFyIF9jYWxjdWxhdGVIZWFkZXJXaWR0aCA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzKSxcbiAgICAgICAgdG90YWxDb2x1bW5zTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGhbMF0sXG4gICAgICAgIHRvdGFsQ29sdW1uc1dpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoWzFdLFxuICAgICAgICB0b3RhbENvbHVtbnNNYXhXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aFsyXTtcblxuICAgIGdldEluc3RhbmNlKCkudG90YWxDb2x1bW5zTWluV2lkdGggPSB0b3RhbENvbHVtbnNNaW5XaWR0aDtcbiAgICBnZXRJbnN0YW5jZSgpLnRvdGFsQ29sdW1uc1dpZHRoID0gdG90YWxDb2x1bW5zV2lkdGg7XG4gICAgZ2V0SW5zdGFuY2UoKS50b3RhbENvbHVtbnNNYXhXaWR0aCA9IHRvdGFsQ29sdW1uc01heFdpZHRoO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUluc3RhbmNlLCBnZXRJbnN0YW5jZSgpKSAvLyBFYWNoIG1hdGVyaWFsaXplZCBoZWFkZXIgbmVlZHMgdG8gYmUgYXNzaWduZWQgYSByZW5kZXIgZnVuY3Rpb24gYW5kIG90aGVyXG4gICAgLy8gcHJvcCBnZXR0ZXIgcHJvcGVydGllcyBoZXJlLlxuICAgIDtcbiAgICBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5mbGF0SGVhZGVycywgZ2V0SW5zdGFuY2UoKS5hbGxDb2x1bW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIC8vIEdpdmUgY29sdW1ucy9oZWFkZXJzIHJlbmRlcmluZyBwb3dlclxuICAgICAgY29sdW1uLnJlbmRlciA9IG1ha2VSZW5kZXJlcihnZXRJbnN0YW5jZSgpLCBjb2x1bW4pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0SGVhZGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEhlYWRlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pOyAvLyBHaXZlIGNvbHVtbnMvaGVhZGVycyBhIGRlZmF1bHQgZ2V0Rm9vdGVyUHJvcHNcblxuICAgICAgY29sdW1uLmdldEZvb3RlclByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRGb290ZXJQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuaGVhZGVyR3JvdXBzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaGVhZGVyR3JvdXBzLmZpbHRlcihmdW5jdGlvbiAoaGVhZGVyR3JvdXAsIGkpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgaGVhZGVycyBhbmQgaGVhZGVyR3JvdXBzIHRoYXQgZG9uJ3QgaGF2ZSB2aXNpYmxlIGNvbHVtbnNcbiAgICAgICAgaGVhZGVyR3JvdXAuaGVhZGVycyA9IGhlYWRlckdyb3VwLmhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICB2YXIgcmVjdXJzZSA9IGZ1bmN0aW9uIHJlY3Vyc2UoaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgICAgICB9KS5sZW5ndGg7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChjb2x1bW4uaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoY29sdW1uLmhlYWRlcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNWaXNpYmxlO1xuICAgICAgICB9KTsgLy8gR2l2ZSBoZWFkZXJHcm91cHMgZ2V0Um93UHJvcHNcblxuICAgICAgICBpZiAoaGVhZGVyR3JvdXAuaGVhZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBoZWFkZXJHcm91cC5nZXRIZWFkZXJHcm91cFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRIZWFkZXJHcm91cFByb3BzLCB7XG4gICAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICAgIGhlYWRlckdyb3VwOiBoZWFkZXJHcm91cCxcbiAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGVhZGVyR3JvdXAuZ2V0Rm9vdGVyR3JvdXBQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Rm9vdGVyR3JvdXBQcm9wcywge1xuICAgICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgICBoZWFkZXJHcm91cDogaGVhZGVyR3JvdXAsXG4gICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSwgW2hlYWRlckdyb3VwcywgZ2V0SW5zdGFuY2UsIGdldEhvb2tzXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5mb290ZXJHcm91cHMgPSBbXS5jb25jYXQoZ2V0SW5zdGFuY2UoKS5oZWFkZXJHcm91cHMpLnJldmVyc2UoKTsgLy8gVGhlIHByZXBhcmVSb3cgZnVuY3Rpb24gaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkgYW5kIE1VU1QgYmUgY2FsbGVkIG9uXG4gICAgLy8gYW55IHJvd3MgdGhlIHVzZXIgd2lzaGVzIHRvIGJlIGRpc3BsYXllZC5cblxuICAgIGdldEluc3RhbmNlKCkucHJlcGFyZVJvdyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJvdy5nZXRSb3dQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0Um93UHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIHJvdzogcm93XG4gICAgICB9KTsgLy8gQnVpbGQgdGhlIHZpc2libGUgY2VsbHMgZm9yIGVhY2ggcm93XG5cbiAgICAgIHJvdy5hbGxDZWxscyA9IGFsbENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcm93LnZhbHVlc1tjb2x1bW4uaWRdO1xuICAgICAgICB2YXIgY2VsbCA9IHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTsgLy8gR2l2ZSBlYWNoIGNlbGwgYSBnZXRDZWxsUHJvcHMgYmFzZVxuXG4gICAgICAgIGNlbGwuZ2V0Q2VsbFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRDZWxsUHJvcHMsIHtcbiAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICBjZWxsOiBjZWxsXG4gICAgICAgIH0pOyAvLyBHaXZlIGVhY2ggY2VsbCBhIHJlbmRlcmVyIGZ1bmN0aW9uIChzdXBwb3J0cyBtdWx0aXBsZSByZW5kZXJlcnMpXG5cbiAgICAgICAgY2VsbC5yZW5kZXIgPSBtYWtlUmVuZGVyZXIoZ2V0SW5zdGFuY2UoKSwgY29sdW1uLCB7XG4gICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgY2VsbDogY2VsbCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgfSk7XG4gICAgICByb3cuY2VsbHMgPSB2aXNpYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gcm93LmFsbENlbGxzLmZpbmQoZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgICByZXR1cm4gY2VsbC5jb2x1bW4uaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gbmVlZCB0byBhcHBseSBhbnkgcm93IHNwZWNpZmljIGhvb2tzICh1c2VFeHBhbmRlZCByZXF1aXJlcyB0aGlzKVxuXG4gICAgICBsb29wSG9va3MoZ2V0SG9va3MoKS5wcmVwYXJlUm93LCByb3csIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0SW5zdGFuY2UsIGFsbENvbHVtbnMsIHZpc2libGVDb2x1bW5zXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5nZXRUYWJsZVByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUYWJsZVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGdldEluc3RhbmNlKCkuZ2V0VGFibGVCb2R5UHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRhYmxlQm9keVByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUZpbmFsSW5zdGFuY2UsIGdldEluc3RhbmNlKCkpO1xuICAgIHJldHVybiBnZXRJbnN0YW5jZSgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUhlYWRlcldpZHRocyhoZWFkZXJzLCBsZWZ0KSB7XG4gICAgaWYgKGxlZnQgPT09IHZvaWQgMCkge1xuICAgICAgbGVmdCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHN1bVRvdGFsTWluV2lkdGggPSAwO1xuICAgIHZhciBzdW1Ub3RhbFdpZHRoID0gMDtcbiAgICB2YXIgc3VtVG90YWxNYXhXaWR0aCA9IDA7XG4gICAgdmFyIHN1bVRvdGFsRmxleFdpZHRoID0gMDtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHN1YkhlYWRlcnMgPSBoZWFkZXIuaGVhZGVycztcbiAgICAgIGhlYWRlci50b3RhbExlZnQgPSBsZWZ0O1xuXG4gICAgICBpZiAoc3ViSGVhZGVycyAmJiBzdWJIZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgX2NhbGN1bGF0ZUhlYWRlcldpZHRoMiA9IGNhbGN1bGF0ZUhlYWRlcldpZHRocyhzdWJIZWFkZXJzLCBsZWZ0KSxcbiAgICAgICAgICAgIHRvdGFsTWluV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyWzBdLFxuICAgICAgICAgICAgdG90YWxXaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aDJbMV0sXG4gICAgICAgICAgICB0b3RhbE1heFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlsyXSxcbiAgICAgICAgICAgIHRvdGFsRmxleFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlszXTtcblxuICAgICAgICBoZWFkZXIudG90YWxNaW5XaWR0aCA9IHRvdGFsTWluV2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbFdpZHRoID0gdG90YWxXaWR0aDtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSB0b3RhbE1heFdpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxGbGV4V2lkdGggPSB0b3RhbEZsZXhXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlci50b3RhbE1pbldpZHRoID0gaGVhZGVyLm1pbldpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxXaWR0aCA9IE1hdGgubWluKE1hdGgubWF4KGhlYWRlci5taW5XaWR0aCwgaGVhZGVyLndpZHRoKSwgaGVhZGVyLm1heFdpZHRoKTtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWF4V2lkdGggPSBoZWFkZXIubWF4V2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbEZsZXhXaWR0aCA9IGhlYWRlci5jYW5SZXNpemUgPyBoZWFkZXIudG90YWxXaWR0aCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChoZWFkZXIuaXNWaXNpYmxlKSB7XG4gICAgICAgIGxlZnQgKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWluV2lkdGggKz0gaGVhZGVyLnRvdGFsTWluV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsV2lkdGggKz0gaGVhZGVyLnRvdGFsV2lkdGg7XG4gICAgICAgIHN1bVRvdGFsTWF4V2lkdGggKz0gaGVhZGVyLnRvdGFsTWF4V2lkdGg7XG4gICAgICAgIHN1bVRvdGFsRmxleFdpZHRoICs9IGhlYWRlci50b3RhbEZsZXhXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW3N1bVRvdGFsTWluV2lkdGgsIHN1bVRvdGFsV2lkdGgsIHN1bVRvdGFsTWF4V2lkdGgsIHN1bVRvdGFsRmxleFdpZHRoXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY2Vzc1Jvd3NGb3JDb2x1bW4oX3JlZikge1xuICAgIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgICByb3dzID0gX3JlZi5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IF9yZWYuZmxhdFJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gX3JlZi5yb3dzQnlJZCxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW4sXG4gICAgICAgIGdldFJvd0lkID0gX3JlZi5nZXRSb3dJZCxcbiAgICAgICAgZ2V0U3ViUm93cyA9IF9yZWYuZ2V0U3ViUm93cyxcbiAgICAgICAgYWNjZXNzVmFsdWVIb29rcyA9IF9yZWYuYWNjZXNzVmFsdWVIb29rcyxcbiAgICAgICAgZ2V0SW5zdGFuY2UgPSBfcmVmLmdldEluc3RhbmNlO1xuXG4gICAgLy8gQWNjZXNzIHRoZSByb3cncyBkYXRhIGNvbHVtbi1ieS1jb2x1bW5cbiAgICAvLyBXZSBkbyBpdCB0aGlzIHdheSBzbyB3ZSBjYW4gaW5jcmVtZW50YWxseSBhZGQgbWF0ZXJpYWxpemVkXG4gICAgLy8gY29sdW1ucyBhZnRlciB0aGUgZmlyc3QgcGFzcyBhbmQgYXZvaWQgZXhjZXNzaXZlIGxvb3BpbmdcbiAgICB2YXIgYWNjZXNzUm93ID0gZnVuY3Rpb24gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgZGVwdGgsIHBhcmVudCwgcGFyZW50Um93cykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCByZWZlcmVuY2UgYXJvdW5kXG4gICAgICB2YXIgb3JpZ2luYWwgPSBvcmlnaW5hbFJvdztcbiAgICAgIHZhciBpZCA9IGdldFJvd0lkKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcGFyZW50KTtcbiAgICAgIHZhciByb3cgPSByb3dzQnlJZFtpZF07IC8vIElmIHRoZSByb3cgaGFzbid0IGJlZW4gY3JlYXRlZCwgbGV0J3MgbWFrZSBpdFxuXG4gICAgICBpZiAoIXJvdykge1xuICAgICAgICByb3cgPSB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbCxcbiAgICAgICAgICBpbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgIGNlbGxzOiBbe31dIC8vIFRoaXMgaXMgYSBkdW1teSBjZWxsXG5cbiAgICAgICAgfTsgLy8gT3ZlcnJpZGUgY29tbW9uIGFycmF5IGZ1bmN0aW9ucyAoYW5kIHRoZSBkdW1teSBjZWxsJ3MgZ2V0Q2VsbFByb3BzIGZ1bmN0aW9uKVxuICAgICAgICAvLyB0byBzaG93IGFuIGVycm9yIGlmIGl0IGlzIGFjY2Vzc2VkIHdpdGhvdXQgY2FsbGluZyBwcmVwYXJlUm93XG5cbiAgICAgICAgcm93LmNlbGxzLm1hcCA9IHVucHJlcGFyZWRBY2Nlc3NXYXJuaW5nO1xuICAgICAgICByb3cuY2VsbHMuZmlsdGVyID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxscy5mb3JFYWNoID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxsc1swXS5nZXRDZWxsUHJvcHMgPSB1bnByZXBhcmVkQWNjZXNzV2FybmluZzsgLy8gQ3JlYXRlIHRoZSBjZWxscyBhbmQgdmFsdWVzXG5cbiAgICAgICAgcm93LnZhbHVlcyA9IHt9OyAvLyBQdXNoIHRoaXMgcm93IGludG8gdGhlIHBhcmVudFJvd3MgYXJyYXlcblxuICAgICAgICBwYXJlbnRSb3dzLnB1c2gocm93KTsgLy8gS2VlcCB0cmFjayBvZiBldmVyeSByb3cgaW4gYSBmbGF0IGFycmF5XG5cbiAgICAgICAgZmxhdFJvd3MucHVzaChyb3cpOyAvLyBBbHNvIGtlZXAgdHJhY2sgb2YgZXZlcnkgcm93IGJ5IGl0cyBJRFxuXG4gICAgICAgIHJvd3NCeUlkW2lkXSA9IHJvdzsgLy8gR2V0IHRoZSBvcmlnaW5hbCBzdWJyb3dzXG5cbiAgICAgICAgcm93Lm9yaWdpbmFsU3ViUm93cyA9IGdldFN1YlJvd3Mob3JpZ2luYWxSb3csIHJvd0luZGV4KTsgLy8gVGhlbiByZWN1cnNpdmVseSBhY2Nlc3MgdGhlbVxuXG4gICAgICAgIGlmIChyb3cub3JpZ2luYWxTdWJSb3dzKSB7XG4gICAgICAgICAgdmFyIHN1YlJvd3MgPSBbXTtcbiAgICAgICAgICByb3cub3JpZ2luYWxTdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3csIHN1YlJvd3MpO1xuICAgICAgICAgIH0pOyAvLyBLZWVwIHRoZSBuZXcgc3ViUm93cyBhcnJheSBvbiB0aGUgcm93XG5cbiAgICAgICAgICByb3cuc3ViUm93cyA9IHN1YlJvd3M7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocm93LnN1YlJvd3MpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJvdyBleGlzdHMsIHRoZW4gaXQncyBhbHJlYWR5IGJlZW4gYWNjZXNzZWRcbiAgICAgICAgLy8gS2VlcCByZWN1cnNpbmcsIGJ1dCBkb24ndCB3b3JyeSBhYm91dCBwYXNzaW5nIHRoZVxuICAgICAgICAvLyBhY2N1bWxhdG9yIGFycmF5ICh0aG9zZSByb3dzIGFscmVhZHkgZXhpc3QpXG4gICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgIHJldHVybiBhY2Nlc3NSb3coZCwgaSwgZGVwdGggKyAxLCByb3cpO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gSWYgdGhlIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3IsIHVzZSBpdCB0byBnZXQgYSB2YWx1ZVxuXG5cbiAgICAgIGlmIChjb2x1bW4uYWNjZXNzb3IpIHtcbiAgICAgICAgcm93LnZhbHVlc1tjb2x1bW4uaWRdID0gY29sdW1uLmFjY2Vzc29yKG9yaWdpbmFsUm93LCByb3dJbmRleCwgcm93LCBwYXJlbnRSb3dzLCBkYXRhKTtcbiAgICAgIH0gLy8gQWxsb3cgcGx1Z2lucyB0byBtYW5pcHVsYXRlIHRoZSBjb2x1bW4gdmFsdWVcblxuXG4gICAgICByb3cudmFsdWVzW2NvbHVtbi5pZF0gPSByZWR1Y2VIb29rcyhhY2Nlc3NWYWx1ZUhvb2tzLCByb3cudmFsdWVzW2NvbHVtbi5pZF0sIHtcbiAgICAgICAgcm93OiByb3csXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAob3JpZ2luYWxSb3csIHJvd0luZGV4KSB7XG4gICAgICByZXR1cm4gYWNjZXNzUm93KG9yaWdpbmFsUm93LCByb3dJbmRleCwgMCwgdW5kZWZpbmVkLCByb3dzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbnMucmVzZXRFeHBhbmRlZCA9ICdyZXNldEV4cGFuZGVkJztcbiAgYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCA9ICd0b2dnbGVSb3dFeHBhbmRlZCc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkID0gJ3RvZ2dsZUFsbFJvd3NFeHBhbmRlZCc7XG4gIHZhciB1c2VFeHBhbmRlZCA9IGZ1bmN0aW9uIHVzZUV4cGFuZGVkKGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQxKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDEpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93KTtcbiAgfTtcbiAgdXNlRXhwYW5kZWQucGx1Z2luTmFtZSA9ICd1c2VFeHBhbmRlZCc7XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCgpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgQWxsIFJvd3MgRXhwYW5kZWQnXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIHJvdyA9IF9yZWYyLnJvdztcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuICAgICAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQoKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIFJvdyBFeHBhbmRlZCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQxKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGV4cGFuZGVkOiB7fVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldEV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGV4cGFuZGVkOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZXhwYW5kZWQgfHwge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVBbGxSb3dzRXhwYW5kZWQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IGluc3RhbmNlLmlzQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQ7XG4gICAgICB2YXIgZXhwYW5kQWxsID0gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogIWlzQWxsUm93c0V4cGFuZGVkO1xuXG4gICAgICBpZiAoZXhwYW5kQWxsKSB7XG4gICAgICAgIHZhciBleHBhbmRlZCA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3dzQnlJZCkuZm9yRWFjaChmdW5jdGlvbiAocm93SWQpIHtcbiAgICAgICAgICBleHBhbmRlZFtyb3dJZF0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBleHBhbmRlZDoge31cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCkge1xuICAgICAgdmFyIGlkID0gYWN0aW9uLmlkLFxuICAgICAgICAgIHNldEV4cGFuZGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGV4aXN0cyA9IHN0YXRlLmV4cGFuZGVkW2lkXTtcbiAgICAgIHZhciBzaG91bGRFeGlzdCA9IHR5cGVvZiBzZXRFeHBhbmRlZCAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRFeHBhbmRlZCA6ICFleGlzdHM7XG5cbiAgICAgIGlmICghZXhpc3RzICYmIHNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGV4cGFuZGVkOiBfZXh0ZW5kcyh7fSwgc3RhdGUuZXhwYW5kZWQsIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2lkXSA9IHRydWUsIF9leHRlbmRzMikpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChleGlzdHMgJiYgIXNob3VsZEV4aXN0KSB7XG4gICAgICAgIHZhciBfc3RhdGUkZXhwYW5kZWQgPSBzdGF0ZS5leHBhbmRlZCxcbiAgICAgICAgICAgIF8gPSBfc3RhdGUkZXhwYW5kZWRbaWRdLFxuICAgICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9zdGF0ZSRleHBhbmRlZCwgW2lkXS5tYXAoX3RvUHJvcGVydHlLZXkpKTtcblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZXhwYW5kZWQ6IHJlc3RcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkMShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9IGluc3RhbmNlLm1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICBtYW51YWxFeHBhbmRlZEtleSA9IF9pbnN0YW5jZSRtYW51YWxFeHBhbiA9PT0gdm9pZCAwID8gJ2V4cGFuZGVkJyA6IF9pbnN0YW5jZSRtYW51YWxFeHBhbixcbiAgICAgICAgX2luc3RhbmNlJHBhZ2luYXRlRXhwID0gaW5zdGFuY2UucGFnaW5hdGVFeHBhbmRlZFJvd3MsXG4gICAgICAgIHBhZ2luYXRlRXhwYW5kZWRSb3dzID0gX2luc3RhbmNlJHBhZ2luYXRlRXhwID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHBhZ2luYXRlRXhwLFxuICAgICAgICBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPSBpbnN0YW5jZS5leHBhbmRTdWJSb3dzLFxuICAgICAgICBleHBhbmRTdWJSb3dzID0gX2luc3RhbmNlJGV4cGFuZFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGV4cGFuZFN1YlJvLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPSBpbnN0YW5jZS5hdXRvUmVzZXRFeHBhbmRlZCxcbiAgICAgICAgYXV0b1Jlc2V0RXhwYW5kZWQgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RXggPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0RXgsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICBleHBhbmRlZCA9IGluc3RhbmNlLnN0YXRlLmV4cGFuZGVkLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlU29ydEJ5JywgJ3VzZUdyb3VwQnknLCAndXNlUGl2b3RDb2x1bW5zJywgJ3VzZUdsb2JhbEZpbHRlciddLCAndXNlRXhwYW5kZWQnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RXhwYW5kZWQgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0RXhwYW5kZWQpO1xuICAgIHZhciBpc0FsbFJvd3NFeHBhbmRlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMocm93c0J5SWQpLmxlbmd0aCAmJiBPYmplY3Qua2V5cyhleHBhbmRlZCkubGVuZ3RoKTtcblxuICAgIGlmIChpc0FsbFJvd3NFeHBhbmRlZCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIWV4cGFuZGVkW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c0V4cGFuZGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSAvLyBCeXBhc3MgYW55IGVmZmVjdHMgZnJvbSBmaXJpbmcgd2hlbiB0aGlzIGNoYW5nZXNcblxuXG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0RXhwYW5kZWQoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldEV4cGFuZGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGF0YV0pO1xuICAgIHZhciB0b2dnbGVSb3dFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChpZCwgdmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVSb3dFeHBhbmRlZCxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciB0b2dnbGVBbGxSb3dzRXhwYW5kZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUm93c0V4cGFuZGVkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBleHBhbmRlZFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYWdpbmF0ZUV4cGFuZGVkUm93cykge1xuICAgICAgICByZXR1cm4gZXhwYW5kUm93cyhyb3dzLCB7XG4gICAgICAgICAgbWFudWFsRXhwYW5kZWRLZXk6IG1hbnVhbEV4cGFuZGVkS2V5LFxuICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LCBbcGFnaW5hdGVFeHBhbmRlZFJvd3MsIHJvd3MsIG1hbnVhbEV4cGFuZGVkS2V5LCBleHBhbmRlZCwgZXhwYW5kU3ViUm93c10pO1xuICAgIHZhciBleHBhbmRlZERlcHRoID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmluZEV4cGFuZGVkRGVwdGgoZXhwYW5kZWQpO1xuICAgIH0sIFtleHBhbmRlZF0pO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgdmFyIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwcmVFeHBhbmRlZFJvd3M6IHJvd3MsXG4gICAgICBleHBhbmRlZFJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIHJvd3M6IGV4cGFuZGVkUm93cyxcbiAgICAgIGV4cGFuZGVkRGVwdGg6IGV4cGFuZGVkRGVwdGgsXG4gICAgICBpc0FsbFJvd3NFeHBhbmRlZDogaXNBbGxSb3dzRXhwYW5kZWQsXG4gICAgICB0b2dnbGVSb3dFeHBhbmRlZDogdG9nZ2xlUm93RXhwYW5kZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzRXhwYW5kZWQ6IHRvZ2dsZUFsbFJvd3NFeHBhbmRlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wc1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyhyb3csIF9yZWYzKSB7XG4gICAgdmFyIGdldEhvb2tzID0gX3JlZjMuaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGluc3RhbmNlID0gX3JlZjMuaW5zdGFuY2U7XG5cbiAgICByb3cudG9nZ2xlUm93RXhwYW5kZWQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUm93RXhwYW5kZWQocm93LmlkLCBzZXQpO1xuICAgIH07XG5cbiAgICByb3cuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgcm93OiByb3dcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRFeHBhbmRlZERlcHRoKGV4cGFuZGVkKSB7XG4gICAgdmFyIG1heERlcHRoID0gMDtcbiAgICBPYmplY3Qua2V5cyhleHBhbmRlZCkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHZhciBzcGxpdElkID0gaWQuc3BsaXQoJy4nKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIHNwbGl0SWQubGVuZ3RoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF4RGVwdGg7XG4gIH1cblxuICB2YXIgdGV4dCA9IGZ1bmN0aW9uIHRleHQocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJvd3MgPSByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFN0cmluZyhmaWx0ZXJWYWx1ZSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcm93cztcbiAgfTtcblxuICB0ZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dCA9IGZ1bmN0aW9uIGV4YWN0VGV4dChyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHJvd1ZhbHVlKS50b0xvd2VyQ2FzZSgpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXhhY3RUZXh0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWw7XG4gIH07XG5cbiAgdmFyIGV4YWN0VGV4dENhc2UgPSBmdW5jdGlvbiBleGFjdFRleHRDYXNlKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocm93VmFsdWUpID09PSBTdHJpbmcoZmlsdGVyVmFsdWUpIDogdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0VGV4dENhc2UuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyhyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlcy5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlc0FsbCA9IGZ1bmN0aW9uIGluY2x1ZGVzQWxsKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5ldmVyeShmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd1ZhbHVlLmluY2x1ZGVzKHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNBbGwuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNTb21lID0gZnVuY3Rpb24gaW5jbHVkZXNTb21lKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICYmIHJvd1ZhbHVlLmxlbmd0aCAmJiBmaWx0ZXJWYWx1ZS5zb21lKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gcm93VmFsdWUuaW5jbHVkZXModmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlc1NvbWUuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbCB8fCAhdmFsLmxlbmd0aDtcbiAgfTtcblxuICB2YXIgaW5jbHVkZXNWYWx1ZSA9IGZ1bmN0aW9uIGluY2x1ZGVzVmFsdWUocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWUuaW5jbHVkZXMocm93VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgaW5jbHVkZXNWYWx1ZS5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBleGFjdCA9IGZ1bmN0aW9uIGV4YWN0KHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09PSBmaWx0ZXJWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4YWN0LmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xuICB9O1xuXG4gIHZhciBlcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID09IGZpbHRlclZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXF1YWxzLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbCA9PSBudWxsO1xuICB9O1xuXG4gIHZhciBiZXR3ZWVuID0gZnVuY3Rpb24gYmV0d2Vlbihyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgdmFyIF9yZWYgPSBmaWx0ZXJWYWx1ZSB8fCBbXSxcbiAgICAgICAgbWluID0gX3JlZlswXSxcbiAgICAgICAgbWF4ID0gX3JlZlsxXTtcblxuICAgIG1pbiA9IHR5cGVvZiBtaW4gPT09ICdudW1iZXInID8gbWluIDogLUluZmluaXR5O1xuICAgIG1heCA9IHR5cGVvZiBtYXggPT09ICdudW1iZXInID8gbWF4IDogSW5maW5pdHk7XG5cbiAgICBpZiAobWluID4gbWF4KSB7XG4gICAgICB2YXIgdGVtcCA9IG1pbjtcbiAgICAgIG1pbiA9IG1heDtcbiAgICAgIG1heCA9IHRlbXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiByb3dWYWx1ZSA+PSBtaW4gJiYgcm93VmFsdWUgPD0gbWF4O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgYmV0d2Vlbi5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8IHR5cGVvZiB2YWxbMF0gIT09ICdudW1iZXInICYmIHR5cGVvZiB2YWxbMV0gIT09ICdudW1iZXInO1xuICB9O1xuXG4gIHZhciBmaWx0ZXJUeXBlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdGV4dDogdGV4dCxcbiAgICBleGFjdFRleHQ6IGV4YWN0VGV4dCxcbiAgICBleGFjdFRleHRDYXNlOiBleGFjdFRleHRDYXNlLFxuICAgIGluY2x1ZGVzOiBpbmNsdWRlcyxcbiAgICBpbmNsdWRlc0FsbDogaW5jbHVkZXNBbGwsXG4gICAgaW5jbHVkZXNTb21lOiBpbmNsdWRlc1NvbWUsXG4gICAgaW5jbHVkZXNWYWx1ZTogaW5jbHVkZXNWYWx1ZSxcbiAgICBleGFjdDogZXhhY3QsXG4gICAgZXF1YWxzOiBlcXVhbHMsXG4gICAgYmV0d2VlbjogYmV0d2VlblxuICB9KTtcblxuICBhY3Rpb25zLnJlc2V0RmlsdGVycyA9ICdyZXNldEZpbHRlcnMnO1xuICBhY3Rpb25zLnNldEZpbHRlciA9ICdzZXRGaWx0ZXInO1xuICBhY3Rpb25zLnNldEFsbEZpbHRlcnMgPSAnc2V0QWxsRmlsdGVycyc7XG4gIHZhciB1c2VGaWx0ZXJzID0gZnVuY3Rpb24gdXNlRmlsdGVycyhob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDIpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMik7XG4gIH07XG4gIHVzZUZpbHRlcnMucGx1Z2luTmFtZSA9ICd1c2VGaWx0ZXJzJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJDIoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZmlsdGVyczogW11cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRGaWx0ZXJzKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGZpbHRlcnM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5maWx0ZXJzIHx8IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0RmlsdGVyKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBhY3Rpb24uZmlsdGVyVmFsdWU7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC1UYWJsZTogQ291bGQgbm90IGZpbmQgYSBjb2x1bW4gd2l0aCBpZDogXCIgKyBjb2x1bW5JZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoY29sdW1uLmZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgcHJldmlvdXNmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgcHJldmlvdXNmaWx0ZXIgJiYgcHJldmlvdXNmaWx0ZXIudmFsdWUpOyAvL1xuXG4gICAgICBpZiAoc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJNZXRob2QuYXV0b1JlbW92ZSwgbmV3RmlsdGVyLCBjb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgIT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldmlvdXNmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBpZiAoZC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBmaWx0ZXJzOiBbXS5jb25jYXQoc3RhdGUuZmlsdGVycywgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgdmFsdWU6IG5ld0ZpbHRlclxuICAgICAgICB9XSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRBbGxGaWx0ZXJzKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IGFjdGlvbi5maWx0ZXJzO1xuICAgICAgdmFyIF9hbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgICBfdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXM7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICAgICAgICBmaWx0ZXJzOiBmdW5jdGlvbmFsVXBkYXRlKGZpbHRlcnMsIHN0YXRlLmZpbHRlcnMpLmZpbHRlcihmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbiA9IF9hbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBmaWx0ZXIuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGNvbHVtbi5maWx0ZXIsIF91c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmIChzaG91bGRBdXRvUmVtb3ZlRmlsdGVyKGZpbHRlck1ldGhvZC5hdXRvUmVtb3ZlLCBmaWx0ZXIudmFsdWUsIGNvbHVtbikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDIoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIG1hbnVhbEZpbHRlcnMgPSBpbnN0YW5jZS5tYW51YWxGaWx0ZXJzLFxuICAgICAgICBfaW5zdGFuY2UkZGVmYXVsdENhbkYgPSBpbnN0YW5jZS5kZWZhdWx0Q2FuRmlsdGVyLFxuICAgICAgICBkZWZhdWx0Q2FuRmlsdGVyID0gX2luc3RhbmNlJGRlZmF1bHRDYW5GID09PSB2b2lkIDAgPyBmYWxzZSA6IF9pbnN0YW5jZSRkZWZhdWx0Q2FuRixcbiAgICAgICAgZGlzYWJsZUZpbHRlcnMgPSBpbnN0YW5jZS5kaXNhYmxlRmlsdGVycyxcbiAgICAgICAgZmlsdGVycyA9IGluc3RhbmNlLnN0YXRlLmZpbHRlcnMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRGaSA9IGluc3RhbmNlLmF1dG9SZXNldEZpbHRlcnMsXG4gICAgICAgIGF1dG9SZXNldEZpbHRlcnMgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0RmkgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Rmk7XG4gICAgdmFyIHNldEZpbHRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRGaWx0ZXIsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0QWxsRmlsdGVycyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChmaWx0ZXJzKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0QWxsRmlsdGVycyxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc1xuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBpZCA9IGNvbHVtbi5pZCxcbiAgICAgICAgICBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyID0gY29sdW1uLmRlZmF1bHRDYW5GaWx0ZXIsXG4gICAgICAgICAgY29sdW1uRGlzYWJsZUZpbHRlcnMgPSBjb2x1bW4uZGlzYWJsZUZpbHRlcnM7IC8vIERldGVybWluZSBpZiBhIGNvbHVtbiBpcyBmaWx0ZXJhYmxlXG5cbiAgICAgIGNvbHVtbi5jYW5GaWx0ZXIgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlRmlsdGVycyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EZWZhdWx0Q2FuRmlsdGVyLCBkZWZhdWx0Q2FuRmlsdGVyLCBmYWxzZSk7IC8vIFByb3ZpZGUgdGhlIGNvbHVtbiBhIHdheSBvZiB1cGRhdGluZyB0aGUgZmlsdGVyIHZhbHVlXG5cbiAgICAgIGNvbHVtbi5zZXRGaWx0ZXIgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBzZXRGaWx0ZXIoY29sdW1uLmlkLCB2YWwpO1xuICAgICAgfTsgLy8gUHJvdmlkZSB0aGUgY3VycmVudCBmaWx0ZXIgdmFsdWUgdG8gdGhlIGNvbHVtbiBmb3JcbiAgICAgIC8vIGNvbnZlbmllbmNlXG5cblxuICAgICAgdmFyIGZvdW5kID0gZmlsdGVycy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmZpbHRlclZhbHVlID0gZm91bmQgJiYgZm91bmQudmFsdWU7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxGaWx0ZXJzIHx8ICFmaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZmlsdGVyZWRSb3dzQnlJZCA9IHt9OyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKHJvd3MsIGRlcHRoKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZGVwdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpbHRlcmVkUm93cyA9IHJvd3M7XG4gICAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcnMucmVkdWNlKGZ1bmN0aW9uIChmaWx0ZXJlZFNvRmFyLCBfcmVmKSB7XG4gICAgICAgICAgdmFyIGNvbHVtbklkID0gX3JlZi5pZCxcbiAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpbHRlcnMgY29sdW1uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkU29GYXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZpbHRlck1ldGhvZCA9IGdldEZpbHRlck1ldGhvZChjb2x1bW4uZmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgICAgIGlmICghZmlsdGVyTWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhIHZhbGlkICdjb2x1bW4uZmlsdGVyJyBmb3IgY29sdW1uIHdpdGggdGhlIElEOiBcIiArIGNvbHVtbi5pZCArIFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFNvRmFyO1xuICAgICAgICAgIH0gLy8gUGFzcyB0aGUgcm93cywgaWQsIGZpbHRlclZhbHVlIGFuZCBjb2x1bW4gdG8gdGhlIGZpbHRlck1ldGhvZFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgZmlsdGVyZWQgcm93cyBiYWNrXG5cblxuICAgICAgICAgIGNvbHVtbi5maWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRTb0ZhciwgW2NvbHVtbklkXSwgZmlsdGVyVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBjb2x1bW4uZmlsdGVyZWRSb3dzO1xuICAgICAgICB9LCByb3dzKTsgLy8gQXBwbHkgdGhlIGZpbHRlciB0byBhbnkgc3ViUm93c1xuICAgICAgICAvLyBXZSB0ZWNobmljYWxseSBjb3VsZCBkbyB0aGlzIHJlY3Vyc2l2ZWx5IGluIHRoZSBhYm92ZSBsb29wLFxuICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBzZXZlcmVseSBoaW5kZXIgdGhlIEFQSSBmb3IgdGhlIHVzZXIsIHNpbmNlIHRoZXlcbiAgICAgICAgLy8gd291bGQgYmUgcmVxdWlyZWQgdG8gZG8gdGhhdCByZWN1cnNpb24gaW4gc29tZSBzY2VuYXJpb3NcblxuICAgICAgICBmaWx0ZXJlZFJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgZmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgZmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93O1xuXG4gICAgICAgICAgaWYgKCFyb3cuc3ViUm93cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdy5zdWJSb3dzID0gcm93LnN1YlJvd3MgJiYgcm93LnN1YlJvd3MubGVuZ3RoID4gMCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MsIGRlcHRoICsgMSkgOiByb3cuc3ViUm93cztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW2ZpbHRlclJvd3Mocm93cyksIGZpbHRlcmVkRmxhdFJvd3MsIGZpbHRlcmVkUm93c0J5SWRdO1xuICAgIH0sIFttYW51YWxGaWx0ZXJzLCBmaWx0ZXJzLCByb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGFsbENvbHVtbnMsIHVzZXJGaWx0ZXJUeXBlc10pLFxuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBmaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE5vdyB0aGF0IGVhY2ggZmlsdGVyZWQgY29sdW1uIGhhcyBpdCdzIHBhcnRpYWxseSBmaWx0ZXJlZCByb3dzLFxuICAgICAgLy8gbGV0cyBhc3NpZ24gdGhlIGZpbmFsIGZpbHRlcmVkIHJvd3MgdG8gYWxsIG9mIHRoZSBvdGhlciBjb2x1bW5zXG4gICAgICB2YXIgbm9uRmlsdGVyZWRDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gIWZpbHRlcnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW4uaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIFRoaXMgZXNzZW50aWFsbHkgZW5hYmxlcyBmYWNldGVkIGZpbHRlciBvcHRpb25zIHRvIGJlIGJ1aWx0IGVhc2lseVxuICAgICAgLy8gdXNpbmcgZXZlcnkgY29sdW1uJ3MgcHJlRmlsdGVyZWRSb3dzIHZhbHVlXG5cbiAgICAgIG5vbkZpbHRlcmVkQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgY29sdW1uLnByZUZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgICAgY29sdW1uLmZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cztcbiAgICAgIH0pO1xuICAgIH0sIFtmaWx0ZXJlZFJvd3MsIGZpbHRlcnMsIGFsbENvbHVtbnNdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0RmlsdGVycyA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRGaWx0ZXJzKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRGaWx0ZXJzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRGaWx0ZXJzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgbWFudWFsRmlsdGVycyA/IG51bGwgOiBkYXRhXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcHJlRmlsdGVyZWRSb3dzOiByb3dzLFxuICAgICAgcHJlRmlsdGVyZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBwcmVGaWx0ZXJlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGZpbHRlcmVkUm93czogZmlsdGVyZWRSb3dzLFxuICAgICAgZmlsdGVyZWRGbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIGZpbHRlcmVkUm93c0J5SWQ6IGZpbHRlcmVkUm93c0J5SWQsXG4gICAgICByb3dzOiBmaWx0ZXJlZFJvd3MsXG4gICAgICBmbGF0Um93czogZmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiBmaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgc2V0RmlsdGVyOiBzZXRGaWx0ZXIsXG4gICAgICBzZXRBbGxGaWx0ZXJzOiBzZXRBbGxGaWx0ZXJzXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyID0gJ3Jlc2V0R2xvYmFsRmlsdGVyJztcbiAgYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIgPSAnc2V0R2xvYmFsRmlsdGVyJztcbiAgdmFyIHVzZUdsb2JhbEZpbHRlciA9IGZ1bmN0aW9uIHVzZUdsb2JhbEZpbHRlcihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDMpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMyk7XG4gIH07XG4gIHVzZUdsb2JhbEZpbHRlci5wbHVnaW5OYW1lID0gJ3VzZUdsb2JhbEZpbHRlcic7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQzKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R2xvYmFsRmlsdGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdsb2JhbEZpbHRlcjogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLmdsb2JhbEZpbHRlciB8fCB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIpIHtcbiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGFjdGlvbi5maWx0ZXJWYWx1ZTtcbiAgICAgIHZhciB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS51c2VyRmlsdGVyVHlwZXM7XG4gICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGluc3RhbmNlLmdsb2JhbEZpbHRlciwgdXNlckZpbHRlclR5cGVzIHx8IHt9LCBmaWx0ZXJUeXBlcyk7XG4gICAgICB2YXIgbmV3RmlsdGVyID0gZnVuY3Rpb25hbFVwZGF0ZShmaWx0ZXJWYWx1ZSwgc3RhdGUuZ2xvYmFsRmlsdGVyKTsgLy9cblxuICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyTWV0aG9kLmF1dG9SZW1vdmUsIG5ld0ZpbHRlcikpIHtcbiAgICAgICAgdmFyIGdsb2JhbEZpbHRlciA9IHN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgICAgIHN0YXRlV2l0aG91dEdsb2JhbEZpbHRlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHN0YXRlLCBbXCJnbG9iYWxGaWx0ZXJcIl0pO1xuXG4gICAgICAgIHJldHVybiBzdGF0ZVdpdGhvdXRHbG9iYWxGaWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyOiBuZXdGaWx0ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDMoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgdXNlckZpbHRlclR5cGVzID0gaW5zdGFuY2UuZmlsdGVyVHlwZXMsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IGluc3RhbmNlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgbWFudWFsR2xvYmFsRmlsdGVyID0gaW5zdGFuY2UubWFudWFsR2xvYmFsRmlsdGVyLFxuICAgICAgICBnbG9iYWxGaWx0ZXJWYWx1ZSA9IGluc3RhbmNlLnN0YXRlLmdsb2JhbEZpbHRlcixcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEdsID0gaW5zdGFuY2UuYXV0b1Jlc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgICBhdXRvUmVzZXRHbG9iYWxGaWx0ZXIgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wsXG4gICAgICAgIGRpc2FibGVHbG9iYWxGaWx0ZXIgPSBpbnN0YW5jZS5kaXNhYmxlR2xvYmFsRmlsdGVyO1xuICAgIHZhciBzZXRHbG9iYWxGaWx0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZmlsdGVyVmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRHbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7IC8vIFRPRE86IENyZWF0ZSBhIGZpbHRlciBjYWNoZSBmb3IgaW5jcmVtZW50YWwgaGlnaCBzcGVlZCBtdWx0aS1maWx0ZXJpbmdcbiAgICAvLyBUaGlzIGdldHMgcHJldHR5IGNvbXBsaWNhdGVkIHByZXR0eSBmYXN0LCBzaW5jZSB5b3UgaGF2ZSB0byBtYWludGFpbiBhXG4gICAgLy8gY2FjaGUgZm9yIGVhY2ggcm93IGdyb3VwICh0b3AtbGV2ZWwgcm93cywgYW5kIGVhY2ggcm93J3MgcmVjdXJzaXZlIHN1YnJvd3MpXG4gICAgLy8gVGhpcyB3b3VsZCBtYWtlIG11bHRpLWZpbHRlcmluZyBhIGxvdCBmYXN0ZXIgdGhvdWdoLiBUb28gZmFyP1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR2xvYmFsRmlsdGVyIHx8IHR5cGVvZiBnbG9iYWxGaWx0ZXJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlsdGVyZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIGZpbHRlcmVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcblxuICAgICAgaWYgKCFmaWx0ZXJNZXRob2QpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IGZpbmQgYSB2YWxpZCAnZ2xvYmFsRmlsdGVyJyBvcHRpb24uXCIpO1xuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cblxuICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgdmFyIGNvbHVtbkRpc2FibGVHbG9iYWxGaWx0ZXIgPSBjb2x1bW4uZGlzYWJsZUdsb2JhbEZpbHRlcjtcbiAgICAgICAgY29sdW1uLmNhbkZpbHRlciA9IGdldEZpcnN0RGVmaW5lZChjb2x1bW5EaXNhYmxlR2xvYmFsRmlsdGVyID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHbG9iYWxGaWx0ZXIgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBmaWx0ZXJhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmNhbkZpbHRlciA9PT0gdHJ1ZTtcbiAgICAgIH0pOyAvLyBGaWx0ZXJzIHRvcCBsZXZlbCBhbmQgbmVzdGVkIHJvd3NcblxuICAgICAgdmFyIGZpbHRlclJvd3MgPSBmdW5jdGlvbiBmaWx0ZXJSb3dzKGZpbHRlcmVkUm93cykge1xuICAgICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJNZXRob2QoZmlsdGVyZWRSb3dzLCBmaWx0ZXJhYmxlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSksIGdsb2JhbEZpbHRlclZhbHVlKTtcbiAgICAgICAgZmlsdGVyZWRSb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIGZpbHRlcmVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICAgIGZpbHRlcmVkUm93c0J5SWRbcm93LmlkXSA9IHJvdztcbiAgICAgICAgICByb3cuc3ViUm93cyA9IHJvdy5zdWJSb3dzICYmIHJvdy5zdWJSb3dzLmxlbmd0aCA/IGZpbHRlclJvd3Mocm93LnN1YlJvd3MpIDogcm93LnN1YlJvd3M7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtmaWx0ZXJSb3dzKHJvd3MpLCBmaWx0ZXJlZEZsYXRSb3dzLCBmaWx0ZXJlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR2xvYmFsRmlsdGVyLCBnbG9iYWxGaWx0ZXJWYWx1ZSwgZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMsIGFsbENvbHVtbnMsIHJvd3MsIGZsYXRSb3dzLCByb3dzQnlJZCwgZGlzYWJsZUdsb2JhbEZpbHRlcl0pLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldEdsb2JhbEZpbHRlcik7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R2xvYmFsRmlsdGVyKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRHbG9iYWxGaWx0ZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxHbG9iYWxGaWx0ZXIgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkUm93czogcm93cyxcbiAgICAgIHByZUdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGZsYXRSb3dzLFxuICAgICAgcHJlR2xvYmFsRmlsdGVyZWRSb3dzQnlJZDogcm93c0J5SWQsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3M6IGdsb2JhbEZpbHRlcmVkUm93cyxcbiAgICAgIGdsb2JhbEZpbHRlcmVkRmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkOiBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgcm93czogZ2xvYmFsRmlsdGVyZWRSb3dzLFxuICAgICAgZmxhdFJvd3M6IGdsb2JhbEZpbHRlcmVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ2xvYmFsRmlsdGVyZWRSb3dzQnlJZCxcbiAgICAgIHNldEdsb2JhbEZpbHRlcjogc2V0R2xvYmFsRmlsdGVyLFxuICAgICAgZGlzYWJsZUdsb2JhbEZpbHRlcjogZGlzYWJsZUdsb2JhbEZpbHRlclxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc3VtKHZhbHVlcywgYWdncmVnYXRlZFZhbHVlcykge1xuICAgIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3QgYWRkIHRoZSBhZ2dyZWdhdGlvbnMgdG9nZXRoZXIgaW5zdGVhZCBvZlxuICAgIC8vIHByb2Nlc3MgbGVhZiBub2RlcyBpbmRpdmlkdWFsbHlcbiAgICByZXR1cm4gYWdncmVnYXRlZFZhbHVlcy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgbmV4dCkge1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgbmV4dCA9PT0gJ251bWJlcicgPyBuZXh0IDogMCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgZnVuY3Rpb24gbWluKHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtaW47XG4gIH1cbiAgZnVuY3Rpb24gbWF4KHZhbHVlcykge1xuICAgIHZhciBtYXggPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtYXg7XG4gIH1cbiAgZnVuY3Rpb24gbWluTWF4KHZhbHVlcykge1xuICAgIHZhciBtaW4gPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YXIgbWF4ID0gdmFsdWVzWzBdIHx8IDA7XG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1pbiArIFwiLi5cIiArIG1heDtcbiAgfVxuICBmdW5jdGlvbiBhdmVyYWdlKHZhbHVlcykge1xuICAgIHJldHVybiBzdW0obnVsbCwgdmFsdWVzKSAvIHZhbHVlcy5sZW5ndGg7XG4gIH1cbiAgZnVuY3Rpb24gbWVkaWFuKHZhbHVlcykge1xuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgIHZhciBudW1zID0gW10uY29uY2F0KHZhbHVlcykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoICUgMiAhPT0gMCA/IG51bXNbbWlkXSA6IChudW1zW21pZCAtIDFdICsgbnVtc1ttaWRdKSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlKHZhbHVlcykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKS52YWx1ZXMoKSk7XG4gIH1cbiAgZnVuY3Rpb24gdW5pcXVlQ291bnQodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKS5zaXplO1xuICB9XG4gIGZ1bmN0aW9uIGNvdW50KHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoO1xuICB9XG5cbiAgdmFyIGFnZ3JlZ2F0aW9ucyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgc3VtOiBzdW0sXG4gICAgbWluOiBtaW4sXG4gICAgbWF4OiBtYXgsXG4gICAgbWluTWF4OiBtaW5NYXgsXG4gICAgYXZlcmFnZTogYXZlcmFnZSxcbiAgICBtZWRpYW46IG1lZGlhbixcbiAgICB1bmlxdWU6IHVuaXF1ZSxcbiAgICB1bmlxdWVDb3VudDogdW5pcXVlQ291bnQsXG4gICAgY291bnQ6IGNvdW50XG4gIH0pO1xuXG4gIHZhciBlbXB0eUFycmF5ID0gW107XG4gIHZhciBlbXB0eU9iamVjdCA9IHt9OyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldEdyb3VwQnkgPSAncmVzZXRHcm91cEJ5JztcbiAgYWN0aW9ucy5zZXRHcm91cEJ5ID0gJ3NldEdyb3VwQnknO1xuICBhY3Rpb25zLnRvZ2dsZUdyb3VwQnkgPSAndG9nZ2xlR3JvdXBCeSc7XG4gIHZhciB1c2VHcm91cEJ5ID0gZnVuY3Rpb24gdXNlR3JvdXBCeShob29rcykge1xuICAgIGhvb2tzLmdldEdyb3VwQnlUb2dnbGVQcm9wcyA9IFtkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ0KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgICB9KTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1ucy5wdXNoKHZpc2libGVDb2x1bW5zKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDQpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDEpO1xuICB9O1xuICB1c2VHcm91cEJ5LnBsdWdpbk5hbWUgPSAndXNlR3JvdXBCeSc7XG5cbiAgdmFyIGRlZmF1bHRHZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0R3JvdXBCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmMi5oZWFkZXI7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25DbGljazogaGVhZGVyLmNhbkdyb3VwQnkgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZUdyb3VwQnkoKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGhlYWRlci5jYW5Hcm91cEJ5ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgR3JvdXBCeSdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ0KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIGdyb3VwQnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0R3JvdXBCeSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncm91cEJ5OiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZ3JvdXBCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEdyb3VwQnkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVHcm91cEJ5KSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQsXG4gICAgICAgICAgc2V0R3JvdXBCeSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZEdyb3VwQnkgPSB0eXBlb2Ygc2V0R3JvdXBCeSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRHcm91cEJ5IDogIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoY29sdW1uSWQpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRHcm91cEJ5KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncm91cEJ5OiBbXS5jb25jYXQoc3RhdGUuZ3JvdXBCeSwgW2NvbHVtbklkXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ3JvdXBCeTogc3RhdGUuZ3JvdXBCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyhjb2x1bW5zLCBfcmVmMykge1xuICAgIHZhciBncm91cEJ5ID0gX3JlZjMuaW5zdGFuY2Uuc3RhdGUuZ3JvdXBCeTtcbiAgICAvLyBTb3J0IGdyb3VwZWQgY29sdW1ucyB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbHVtbiBsaXN0XG4gICAgLy8gYmVmb3JlIHRoZSBoZWFkZXJzIGFyZSBidWlsdFxuICAgIHZhciBncm91cEJ5Q29sdW1ucyA9IGdyb3VwQnkubWFwKGZ1bmN0aW9uIChnKSB7XG4gICAgICByZXR1cm4gY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5pZCA9PT0gZztcbiAgICAgIH0pO1xuICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICB2YXIgbm9uR3JvdXBCeUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sKSB7XG4gICAgICByZXR1cm4gIWdyb3VwQnkuaW5jbHVkZXMoY29sLmlkKTtcbiAgICB9KTtcbiAgICBjb2x1bW5zID0gW10uY29uY2F0KGdyb3VwQnlDb2x1bW5zLCBub25Hcm91cEJ5Q29sdW1ucyk7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc0dyb3VwZWQgPSBncm91cEJ5LmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4uZ3JvdXBlZEluZGV4ID0gZ3JvdXBCeS5pbmRleE9mKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICB2YXIgZGVmYXVsdFVzZXJBZ2dyZWdhdGlvbnMgPSB7fTtcblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ0KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZmxhdFJvd3MgPSBpbnN0YW5jZS5mbGF0Um93cyxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIGZsYXRIZWFkZXJzID0gaW5zdGFuY2UuZmxhdEhlYWRlcnMsXG4gICAgICAgIF9pbnN0YW5jZSRncm91cEJ5Rm4gPSBpbnN0YW5jZS5ncm91cEJ5Rm4sXG4gICAgICAgIGdyb3VwQnlGbiA9IF9pbnN0YW5jZSRncm91cEJ5Rm4gPT09IHZvaWQgMCA/IGRlZmF1bHRHcm91cEJ5Rm4gOiBfaW5zdGFuY2UkZ3JvdXBCeUZuLFxuICAgICAgICBtYW51YWxHcm91cEJ5ID0gaW5zdGFuY2UubWFudWFsR3JvdXBCeSxcbiAgICAgICAgX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID0gaW5zdGFuY2UuYWdncmVnYXRpb25zLFxuICAgICAgICB1c2VyQWdncmVnYXRpb25zID0gX2luc3RhbmNlJGFnZ3JlZ2F0aW9uID09PSB2b2lkIDAgPyBkZWZhdWx0VXNlckFnZ3JlZ2F0aW9ucyA6IF9pbnN0YW5jZSRhZ2dyZWdhdGlvbixcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGdyb3VwQnkgPSBpbnN0YW5jZS5zdGF0ZS5ncm91cEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0R3IgPSBpbnN0YW5jZS5hdXRvUmVzZXRHcm91cEJ5LFxuICAgICAgICBhdXRvUmVzZXRHcm91cEJ5ID0gX2luc3RhbmNlJGF1dG9SZXNldEdyID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldEdyLFxuICAgICAgICBkaXNhYmxlR3JvdXBCeSA9IGluc3RhbmNlLmRpc2FibGVHcm91cEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuR3JvdXBCeSA9IGluc3RhbmNlLmRlZmF1bHRDYW5Hcm91cEJ5LFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQ29sdW1uT3JkZXInLCAndXNlRmlsdGVycyddLCAndXNlR3JvdXBCeScpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uR3JvdXBCeSA9IGNvbHVtbi5kZWZhdWx0R3JvdXBCeSxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlR3JvdXBCeSA9IGNvbHVtbi5kaXNhYmxlR3JvdXBCeTtcbiAgICAgIGNvbHVtbi5jYW5Hcm91cEJ5ID0gYWNjZXNzb3IgPyBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhbkdyb3VwQnksIGNvbHVtbkRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVHcm91cEJ5ID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpIDogZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbi5jYW5Hcm91cEJ5LCBkZWZhdWx0Q29sdW1uR3JvdXBCeSwgZGVmYXVsdENhbkdyb3VwQnksIGZhbHNlKTtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Hcm91cEJ5KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVHcm91cEJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVHcm91cEJ5KGNvbHVtbi5pZCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbi5BZ2dyZWdhdGVkID0gY29sdW1uLkFnZ3JlZ2F0ZWQgfHwgY29sdW1uLkNlbGw7XG4gICAgfSk7XG4gICAgdmFyIHRvZ2dsZUdyb3VwQnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoY29sdW1uSWQsIHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlR3JvdXBCeSxcbiAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBzZXRHcm91cEJ5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0R3JvdXBCeSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIGhlYWRlci5nZXRHcm91cEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEdyb3VwQnlUb2dnbGVQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWFudWFsR3JvdXBCeSB8fCAhZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGVtcHR5QXJyYXksIGVtcHR5T2JqZWN0LCBmbGF0Um93cywgcm93c0J5SWRdO1xuICAgICAgfSAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdCBvZiBmaWx0ZXJlZCBjb2x1bW5zIGV4aXN0XG5cblxuICAgICAgdmFyIGV4aXN0aW5nR3JvdXBCeSA9IGdyb3VwQnkuZmlsdGVyKGZ1bmN0aW9uIChnKSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IGc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIEZpbmQgdGhlIGNvbHVtbnMgdGhhdCBjYW4gb3IgYXJlIGFnZ3JlZ2F0aW5nXG4gICAgICAvLyBVc2VzIGVhY2ggY29sdW1uIHRvIGFnZ3JlZ2F0ZSByb3dzIGludG8gYSBzaW5nbGUgdmFsdWVcblxuICAgICAgdmFyIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyA9IGZ1bmN0aW9uIGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyhsZWFmUm93cywgZ3JvdXBlZFJvd3MsIGRlcHRoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICAgICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAvLyBEb24ndCBhZ2dyZWdhdGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXBCeVxuICAgICAgICAgIGlmIChleGlzdGluZ0dyb3VwQnkuaW5jbHVkZXMoY29sdW1uLmlkKSkge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBncm91cGVkUm93c1swXSA/IGdyb3VwZWRSb3dzWzBdLnZhbHVlc1tjb2x1bW4uaWRdIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIEFnZ3JlZ2F0ZSB0aGUgdmFsdWVzXG5cblxuICAgICAgICAgIHZhciBhZ2dyZWdhdGVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlID09PSAnZnVuY3Rpb24nID8gY29sdW1uLmFnZ3JlZ2F0ZSA6IHVzZXJBZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVdO1xuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0ZUZuKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcbiAgICAgICAgICAgIHZhciBncm91cGVkVmFsdWVzID0gZ3JvdXBlZFJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJvdy52YWx1ZXNbY29sdW1uLmlkXTtcbiAgICAgICAgICAgIH0pOyAvLyBHZXQgdGhlIGNvbHVtblZhbHVlcyB0byBhZ2dyZWdhdGVcblxuICAgICAgICAgICAgdmFyIGxlYWZWYWx1ZXMgPSBsZWFmUm93cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICB2YXIgY29sdW1uVmFsdWUgPSByb3cudmFsdWVzW2NvbHVtbi5pZF07XG5cbiAgICAgICAgICAgICAgaWYgKCFkZXB0aCAmJiBjb2x1bW4uYWdncmVnYXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWdncmVnYXRlVmFsdWVGbiA9IHR5cGVvZiBjb2x1bW4uYWdncmVnYXRlVmFsdWUgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uYWdncmVnYXRlVmFsdWUgOiB1c2VyQWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV0gfHwgYWdncmVnYXRpb25zW2NvbHVtbi5hZ2dyZWdhdGVWYWx1ZV07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlRm4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0IFRhYmxlOiBJbnZhbGlkIGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSBvcHRpb24gZm9yIGNvbHVtbiBsaXN0ZWQgYWJvdmVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBhZ2dyZWdhdGVWYWx1ZUZuKGNvbHVtblZhbHVlLCByb3csIGNvbHVtbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhbHVlc1tjb2x1bW4uaWRdID0gYWdncmVnYXRlRm4obGVhZlZhbHVlcywgZ3JvdXBlZFZhbHVlcyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uYWdncmVnYXRlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oe1xuICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdCBUYWJsZTogSW52YWxpZCBjb2x1bW4uYWdncmVnYXRlIG9wdGlvbiBmb3IgY29sdW1uIGxpc3RlZCBhYm92ZVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZ3JvdXBlZFJvd3NCeUlkID0ge307XG4gICAgICB2YXIgb25seUdyb3VwZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIG9ubHlHcm91cGVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBub25Hcm91cGVkRmxhdFJvd3MgPSBbXTtcbiAgICAgIHZhciBub25Hcm91cGVkUm93c0J5SWQgPSB7fTsgLy8gUmVjdXJzaXZlbHkgZ3JvdXAgdGhlIGRhdGFcblxuICAgICAgdmFyIGdyb3VwVXBSZWN1cnNpdmVseSA9IGZ1bmN0aW9uIGdyb3VwVXBSZWN1cnNpdmVseShyb3dzLCBkZXB0aCwgcGFyZW50SWQpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgICBkZXB0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGxldmVsLCBqdXN0IHJldHVybiB0aGUgcm93c1xuICAgICAgICBpZiAoZGVwdGggPT09IGV4aXN0aW5nR3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb2x1bW5JZCA9IGV4aXN0aW5nR3JvdXBCeVtkZXB0aF07IC8vIEdyb3VwIHRoZSByb3dzIHRvZ2V0aGVyIGZvciB0aGlzIGxldmVsXG5cbiAgICAgICAgdmFyIHJvd0dyb3Vwc01hcCA9IGdyb3VwQnlGbihyb3dzLCBjb2x1bW5JZCk7IC8vIFBlZm9ybSBhZ2dyZWdhdGlvbnMgZm9yIGVhY2ggZ3JvdXBcblxuICAgICAgICB2YXIgYWdncmVnYXRlZEdyb3VwZWRSb3dzID0gT2JqZWN0LmVudHJpZXMocm93R3JvdXBzTWFwKS5tYXAoZnVuY3Rpb24gKF9yZWY0LCBpbmRleCkge1xuICAgICAgICAgIHZhciBncm91cEJ5VmFsID0gX3JlZjRbMF0sXG4gICAgICAgICAgICAgIGdyb3VwZWRSb3dzID0gX3JlZjRbMV07XG4gICAgICAgICAgdmFyIGlkID0gY29sdW1uSWQgKyBcIjpcIiArIGdyb3VwQnlWYWw7XG4gICAgICAgICAgaWQgPSBwYXJlbnRJZCA/IHBhcmVudElkICsgXCI+XCIgKyBpZCA6IGlkOyAvLyBGaXJzdCwgUmVjdXJzZSB0byBncm91cCBzdWIgcm93cyBiZWZvcmUgYWdncmVnYXRpb25cblxuICAgICAgICAgIHZhciBzdWJSb3dzID0gZ3JvdXBVcFJlY3Vyc2l2ZWx5KGdyb3VwZWRSb3dzLCBkZXB0aCArIDEsIGlkKTsgLy8gRmxhdHRlbiB0aGUgbGVhZiByb3dzIG9mIHRoZSByb3dzIGluIHRoaXMgZ3JvdXBcblxuICAgICAgICAgIHZhciBsZWFmUm93cyA9IGRlcHRoID8gZmxhdHRlbkJ5KGdyb3VwZWRSb3dzLCAnbGVhZlJvd3MnKSA6IGdyb3VwZWRSb3dzO1xuICAgICAgICAgIHZhciB2YWx1ZXMgPSBhZ2dyZWdhdGVSb3dzVG9WYWx1ZXMobGVhZlJvd3MsIGdyb3VwZWRSb3dzLCBkZXB0aCk7XG4gICAgICAgICAgdmFyIHJvdyA9IHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGlzR3JvdXBlZDogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwQnlJRDogY29sdW1uSWQsXG4gICAgICAgICAgICBncm91cEJ5VmFsOiBncm91cEJ5VmFsLFxuICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICBzdWJSb3dzOiBzdWJSb3dzLFxuICAgICAgICAgICAgbGVhZlJvd3M6IGxlYWZSb3dzLFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKHN1YlJvdykge1xuICAgICAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgIGdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuXG4gICAgICAgICAgICBpZiAoc3ViUm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgb25seUdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGVkR3JvdXBlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICB2YXIgZ3JvdXBlZFJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkocm93cyk7XG4gICAgICBncm91cGVkUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJSb3cpIHtcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgZ3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG5cbiAgICAgICAgaWYgKHN1YlJvdy5pc0dyb3VwZWQpIHtcbiAgICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzLnB1c2goc3ViUm93KTtcbiAgICAgICAgICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIEFzc2lnbiB0aGUgbmV3IGRhdGFcblxuICAgICAgcmV0dXJuIFtncm91cGVkUm93cywgZ3JvdXBlZEZsYXRSb3dzLCBncm91cGVkUm93c0J5SWQsIG9ubHlHcm91cGVkRmxhdFJvd3MsIG9ubHlHcm91cGVkUm93c0J5SWQsIG5vbkdyb3VwZWRGbGF0Um93cywgbm9uR3JvdXBlZFJvd3NCeUlkXTtcbiAgICB9LCBbbWFudWFsR3JvdXBCeSwgZ3JvdXBCeSwgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkLCBhbGxDb2x1bW5zLCB1c2VyQWdncmVnYXRpb25zLCBncm91cEJ5Rm5dKSxcbiAgICAgICAgZ3JvdXBlZFJvd3MgPSBfUmVhY3QkdXNlTWVtb1swXSxcbiAgICAgICAgZ3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIGdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzJdLFxuICAgICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bM10sXG4gICAgICAgIG9ubHlHcm91cGVkUm93c0J5SWQgPSBfUmVhY3QkdXNlTWVtb1s0XSxcbiAgICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bNV0sXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzZdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldEdyb3VwQnkgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0R3JvdXBCeSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0R3JvdXBCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0R3JvdXBCeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbnVhbEdyb3VwQnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUdyb3VwZWRSb3dzOiByb3dzLFxuICAgICAgcHJlR3JvdXBlZEZsYXRSb3c6IGZsYXRSb3dzLFxuICAgICAgcHJlR3JvdXBlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGdyb3VwZWRSb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGdyb3VwZWRGbGF0Um93czogZ3JvdXBlZEZsYXRSb3dzLFxuICAgICAgZ3JvdXBlZFJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICBvbmx5R3JvdXBlZEZsYXRSb3dzOiBvbmx5R3JvdXBlZEZsYXRSb3dzLFxuICAgICAgb25seUdyb3VwZWRSb3dzQnlJZDogb25seUdyb3VwZWRSb3dzQnlJZCxcbiAgICAgIG5vbkdyb3VwZWRGbGF0Um93czogbm9uR3JvdXBlZEZsYXRSb3dzLFxuICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkOiBub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICByb3dzOiBncm91cGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBncm91cGVkRmxhdFJvd3MsXG4gICAgICByb3dzQnlJZDogZ3JvdXBlZFJvd3NCeUlkLFxuICAgICAgdG9nZ2xlR3JvdXBCeTogdG9nZ2xlR3JvdXBCeSxcbiAgICAgIHNldEdyb3VwQnk6IHNldEdyb3VwQnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMShyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgdmFyIF9yb3ckc3ViUm93cztcblxuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIGdyb3VwQnkgYW5kIHRoZSBwaXZvdCBjZWxsIGZvciB0aGUgcm93XG4gICAgICBjZWxsLmlzR3JvdXBlZCA9IGNlbGwuY29sdW1uLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pZCA9PT0gcm93Lmdyb3VwQnlJRDsgLy8gUGxhY2Vob2xkZXIgY2VsbHMgYXJlIGFueSBjb2x1bW5zIGluIHRoZSBncm91cEJ5IHRoYXQgYXJlIG5vdCBncm91cGVkXG5cbiAgICAgIGNlbGwuaXNQbGFjZWhvbGRlciA9ICFjZWxsLmlzR3JvdXBlZCAmJiBjZWxsLmNvbHVtbi5pc0dyb3VwZWQ7IC8vIEFnZ3JlZ2F0ZWQgY2VsbHMgYXJlIG5vdCBncm91cGVkLCBub3QgcmVwZWF0ZWQsIGJ1dCBzdGlsbCBoYXZlIHN1YlJvd3NcblxuICAgICAgY2VsbC5pc0FnZ3JlZ2F0ZWQgPSAhY2VsbC5pc0dyb3VwZWQgJiYgIWNlbGwuaXNQbGFjZWhvbGRlciAmJiAoKF9yb3ckc3ViUm93cyA9IHJvdy5zdWJSb3dzKSA9PSBudWxsID8gdm9pZCAwIDogX3JvdyRzdWJSb3dzLmxlbmd0aCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0R3JvdXBCeUZuKHJvd3MsIGNvbHVtbklkKSB7XG4gICAgcmV0dXJuIHJvd3MucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCByb3csIGkpIHtcbiAgICAgIC8vIFRPRE86IE1pZ2h0IHdhbnQgdG8gaW1wbGVtZW50IGEga2V5IHNlcmlhbGl6ZXIgaGVyZSBzb1xuICAgICAgLy8gaXJyZWd1bGFyIGNvbHVtbiB2YWx1ZXMgY2FuIHN0aWxsIGJlIGdyb3VwZWQgaWYgbmVlZGVkP1xuICAgICAgdmFyIHJlc0tleSA9IFwiXCIgKyByb3cudmFsdWVzW2NvbHVtbklkXTtcbiAgICAgIHByZXZbcmVzS2V5XSA9IEFycmF5LmlzQXJyYXkocHJldltyZXNLZXldKSA/IHByZXZbcmVzS2V5XSA6IFtdO1xuICAgICAgcHJldltyZXNLZXldLnB1c2gocm93KTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHZhciByZVNwbGl0QWxwaGFOdW1lcmljID0gLyhbMC05XSspL2dtOyAvLyBNaXhlZCBzb3J0aW5nIGlzIHNsb3csIGJ1dCB2ZXJ5IGluY2x1c2l2ZSBvZiBtYW55IGVkZ2UgY2FzZXMuXG4gIC8vIEl0IGhhbmRsZXMgbnVtYmVycywgbWl4ZWQgYWxwaGFudW1lcmljIGNvbWJpbmF0aW9ucywgYW5kIGV2ZW5cbiAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbmQgSW5maW5pdHlcblxuICB2YXIgYWxwaGFudW1lcmljID0gZnVuY3Rpb24gYWxwaGFudW1lcmljKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIF9nZXRSb3dWYWx1ZXNCeUNvbHVtbiA9IGdldFJvd1ZhbHVlc0J5Q29sdW1uSUQocm93QSwgcm93QiwgY29sdW1uSWQpLFxuICAgICAgICBhID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uWzFdOyAvLyBGb3JjZSB0byBzdHJpbmdzIChvciBcIlwiIGZvciB1bnN1cHBvcnRlZCB0eXBlcylcblxuXG4gICAgYSA9IHRvU3RyaW5nKGEpO1xuICAgIGIgPSB0b1N0cmluZyhiKTsgLy8gU3BsaXQgb24gbnVtYmVyIGdyb3VwcywgYnV0IGtlZXAgdGhlIGRlbGltaXRlclxuICAgIC8vIFRoZW4gcmVtb3ZlIGZhbHNleSBzcGxpdCB2YWx1ZXNcblxuICAgIGEgPSBhLnNwbGl0KHJlU3BsaXRBbHBoYU51bWVyaWMpLmZpbHRlcihCb29sZWFuKTtcbiAgICBiID0gYi5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5maWx0ZXIoQm9vbGVhbik7IC8vIFdoaWxlXG5cbiAgICB3aGlsZSAoYS5sZW5ndGggJiYgYi5sZW5ndGgpIHtcbiAgICAgIHZhciBhYSA9IGEuc2hpZnQoKTtcbiAgICAgIHZhciBiYiA9IGIuc2hpZnQoKTtcbiAgICAgIHZhciBhbiA9IHBhcnNlSW50KGFhLCAxMCk7XG4gICAgICB2YXIgYm4gPSBwYXJzZUludChiYiwgMTApO1xuICAgICAgdmFyIGNvbWJvID0gW2FuLCBibl0uc29ydCgpOyAvLyBCb3RoIGFyZSBzdHJpbmdcblxuICAgICAgaWYgKGlzTmFOKGNvbWJvWzBdKSkge1xuICAgICAgICBpZiAoYWEgPiBiYikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJiID4gYWEpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gT25lIGlzIGEgc3RyaW5nLCBvbmUgaXMgYSBudW1iZXJcblxuXG4gICAgICBpZiAoaXNOYU4oY29tYm9bMV0pKSB7XG4gICAgICAgIHJldHVybiBpc05hTihhbikgPyAtMSA6IDE7XG4gICAgICB9IC8vIEJvdGggYXJlIG51bWJlcnNcblxuXG4gICAgICBpZiAoYW4gPiBibikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJuID4gYW4pIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICB9O1xuICBmdW5jdGlvbiBkYXRldGltZShyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW4yID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW4yWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uMlsxXTtcblxuICAgIGEgPSBhLmdldFRpbWUoKTtcbiAgICBiID0gYi5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBiYXNpYyhyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW4zID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW4zWzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uM1sxXTtcblxuICAgIHJldHVybiBjb21wYXJlQmFzaWMoYSwgYik7XG4gIH1cbiAgZnVuY3Rpb24gc3RyaW5nKHJvd0EsIHJvd0IsIGNvbHVtbklkKSB7XG4gICAgdmFyIF9nZXRSb3dWYWx1ZXNCeUNvbHVtbjQgPSBnZXRSb3dWYWx1ZXNCeUNvbHVtbklEKHJvd0EsIHJvd0IsIGNvbHVtbklkKSxcbiAgICAgICAgYSA9IF9nZXRSb3dWYWx1ZXNCeUNvbHVtbjRbMF0sXG4gICAgICAgIGIgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW40WzFdO1xuXG4gICAgYSA9IGEuc3BsaXQoJycpLmZpbHRlcihCb29sZWFuKTtcbiAgICBiID0gYi5zcGxpdCgnJykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgd2hpbGUgKGEubGVuZ3RoICYmIGIubGVuZ3RoKSB7XG4gICAgICB2YXIgYWEgPSBhLnNoaWZ0KCk7XG4gICAgICB2YXIgYmIgPSBiLnNoaWZ0KCk7XG4gICAgICB2YXIgYWxvd2VyID0gYWEudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBibG93ZXIgPSBiYi50b0xvd2VyQ2FzZSgpOyAvLyBDYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24gdW50aWwgY2hhcmFjdGVycyBtYXRjaFxuXG4gICAgICBpZiAoYWxvd2VyID4gYmxvd2VyKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmxvd2VyID4gYWxvd2VyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gLy8gSWYgbG93ZXJjYXNlIGNoYXJhY3RlcnMgYXJlIGlkZW50aWNhbFxuXG5cbiAgICAgIGlmIChhYSA+IGJiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmIgPiBhYSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICB9XG4gIGZ1bmN0aW9uIG51bWJlcihyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBfZ2V0Um93VmFsdWVzQnlDb2x1bW41ID0gZ2V0Um93VmFsdWVzQnlDb2x1bW5JRChyb3dBLCByb3dCLCBjb2x1bW5JZCksXG4gICAgICAgIGEgPSBfZ2V0Um93VmFsdWVzQnlDb2x1bW41WzBdLFxuICAgICAgICBiID0gX2dldFJvd1ZhbHVlc0J5Q29sdW1uNVsxXTtcblxuICAgIHZhciByZXBsYWNlTm9uTnVtZXJpYyA9IC9bXjAtOS5dL2dpO1xuICAgIGEgPSBOdW1iZXIoU3RyaW5nKGEpLnJlcGxhY2UocmVwbGFjZU5vbk51bWVyaWMsICcnKSk7XG4gICAgYiA9IE51bWJlcihTdHJpbmcoYikucmVwbGFjZShyZXBsYWNlTm9uTnVtZXJpYywgJycpKTtcbiAgICByZXR1cm4gY29tcGFyZUJhc2ljKGEsIGIpO1xuICB9IC8vIFV0aWxzXG5cbiAgZnVuY3Rpb24gY29tcGFyZUJhc2ljKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYiA/IDAgOiBhID4gYiA/IDEgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJvd1ZhbHVlc0J5Q29sdW1uSUQocm93MSwgcm93MiwgY29sdW1uSWQpIHtcbiAgICByZXR1cm4gW3JvdzEudmFsdWVzW2NvbHVtbklkXSwgcm93Mi52YWx1ZXNbY29sdW1uSWRdXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvU3RyaW5nKGEpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4oYSkgfHwgYSA9PT0gSW5maW5pdHkgfHwgYSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyhhKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgc29ydFR5cGVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBhbHBoYW51bWVyaWM6IGFscGhhbnVtZXJpYyxcbiAgICBkYXRldGltZTogZGF0ZXRpbWUsXG4gICAgYmFzaWM6IGJhc2ljLFxuICAgIHN0cmluZzogc3RyaW5nLFxuICAgIG51bWJlcjogbnVtYmVyXG4gIH0pO1xuXG4gIGFjdGlvbnMucmVzZXRTb3J0QnkgPSAncmVzZXRTb3J0QnknO1xuICBhY3Rpb25zLnNldFNvcnRCeSA9ICdzZXRTb3J0QnknO1xuICBhY3Rpb25zLnRvZ2dsZVNvcnRCeSA9ICd0b2dnbGVTb3J0QnknO1xuICBhY3Rpb25zLmNsZWFyU29ydEJ5ID0gJ2NsZWFyU29ydEJ5JztcbiAgZGVmYXVsdENvbHVtbi5zb3J0VHlwZSA9ICdhbHBoYW51bWVyaWMnO1xuICBkZWZhdWx0Q29sdW1uLnNvcnREZXNjRmlyc3QgPSBmYWxzZTtcbiAgdmFyIHVzZVNvcnRCeSA9IGZ1bmN0aW9uIHVzZVNvcnRCeShob29rcykge1xuICAgIGhvb2tzLmdldFNvcnRCeVRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRTb3J0QnlUb2dnbGVQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkNSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ1KTtcbiAgfTtcbiAgdXNlU29ydEJ5LnBsdWdpbk5hbWUgPSAndXNlU29ydEJ5JztcblxuICB2YXIgZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgdmFyIF9pbnN0YW5jZSRpc011bHRpU29ydCA9IGluc3RhbmNlLmlzTXVsdGlTb3J0RXZlbnQsXG4gICAgICAgIGlzTXVsdGlTb3J0RXZlbnQgPSBfaW5zdGFuY2UkaXNNdWx0aVNvcnQgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5zaGlmdEtleTtcbiAgICB9IDogX2luc3RhbmNlJGlzTXVsdGlTb3J0O1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2xpY2s6IGNvbHVtbi5jYW5Tb3J0ID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkodW5kZWZpbmVkLCAhaW5zdGFuY2UuZGlzYWJsZU11bHRpU29ydCAmJiBpc011bHRpU29ydEV2ZW50KGUpKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGNvbHVtbi5jYW5Tb3J0ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6IGNvbHVtbi5jYW5Tb3J0ID8gJ1RvZ2dsZSBTb3J0QnknIDogdW5kZWZpbmVkXG4gICAgfV07XG4gIH07IC8vIFJlZHVjZXJcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkNShzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzb3J0Qnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0U29ydEJ5KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnNvcnRCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNsZWFyU29ydEJ5KSB7XG4gICAgICB2YXIgc29ydEJ5ID0gc3RhdGUuc29ydEJ5O1xuICAgICAgdmFyIG5ld1NvcnRCeSA9IHNvcnRCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgIT09IGFjdGlvbi5jb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IG5ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFNvcnRCeSkge1xuICAgICAgdmFyIF9zb3J0QnkgPSBhY3Rpb24uc29ydEJ5O1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IF9zb3J0QnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVTb3J0QnkpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBkZXNjID0gYWN0aW9uLmRlc2MsXG4gICAgICAgICAgbXVsdGkgPSBhY3Rpb24ubXVsdGk7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgZGlzYWJsZU11bHRpU29ydCA9IGluc3RhbmNlLmRpc2FibGVNdWx0aVNvcnQsXG4gICAgICAgICAgZGlzYWJsZVNvcnRSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlU29ydFJlbW92ZSxcbiAgICAgICAgICBkaXNhYmxlTXVsdGlSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlTXVsdGlSZW1vdmUsXG4gICAgICAgICAgX2luc3RhbmNlJG1heE11bHRpU29yID0gaW5zdGFuY2UubWF4TXVsdGlTb3J0Q29sQ291bnQsXG4gICAgICAgICAgbWF4TXVsdGlTb3J0Q29sQ291bnQgPSBfaW5zdGFuY2UkbWF4TXVsdGlTb3IgPT09IHZvaWQgMCA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogX2luc3RhbmNlJG1heE11bHRpU29yO1xuICAgICAgdmFyIF9zb3J0QnkyID0gc3RhdGUuc29ydEJ5OyAvLyBGaW5kIHRoZSBjb2x1bW4gZm9yIHRoaXMgY29sdW1uSWRcblxuICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0RGVzY0ZpcnN0ID0gY29sdW1uLnNvcnREZXNjRmlyc3Q7IC8vIEZpbmQgYW55IGV4aXN0aW5nIHNvcnRCeSBmb3IgdGhpcyBjb2x1bW5cblxuICAgICAgdmFyIGV4aXN0aW5nU29ydEJ5ID0gX3NvcnRCeTIuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBfc29ydEJ5Mi5maW5kSW5kZXgoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBoYXNEZXNjRGVmaW5lZCA9IHR5cGVvZiBkZXNjICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjICE9PSBudWxsO1xuICAgICAgdmFyIF9uZXdTb3J0QnkgPSBbXTsgLy8gV2hhdCBzaG91bGQgd2UgZG8gd2l0aCB0aGlzIHNvcnQgYWN0aW9uP1xuXG4gICAgICB2YXIgc29ydEFjdGlvbjtcblxuICAgICAgaWYgKCFkaXNhYmxlTXVsdGlTb3J0ICYmIG11bHRpKSB7XG4gICAgICAgIGlmIChleGlzdGluZ1NvcnRCeSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAndG9nZ2xlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ2FkZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCBtb2RlXG4gICAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSBfc29ydEJ5Mi5sZW5ndGggLSAxIHx8IF9zb3J0QnkyLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdTb3J0QnkpIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ3RvZ2dsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydEFjdGlvbiA9ICdyZXBsYWNlJztcbiAgICAgICAgfVxuICAgICAgfSAvLyBIYW5kbGUgdG9nZ2xlIHN0YXRlcyB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBzb3J0QnlcblxuXG4gICAgICBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScgJiYgLy8gTXVzdCBiZSB0b2dnbGluZ1xuICAgICAgIWRpc2FibGVTb3J0UmVtb3ZlICYmIC8vIElmIGRpc2FibGVTb3J0UmVtb3ZlLCBkaXNhYmxlIGluIGdlbmVyYWxcbiAgICAgICFoYXNEZXNjRGVmaW5lZCAmJiAoIC8vIE11c3Qgbm90IGJlIHNldHRpbmcgZGVzY1xuICAgICAgbXVsdGkgPyAhZGlzYWJsZU11bHRpUmVtb3ZlIDogdHJ1ZSkgJiYgKCAvLyBJZiBtdWx0aSwgZG9uJ3QgYWxsb3cgaWYgZGlzYWJsZU11bHRpUmVtb3ZlXG4gICAgICBleGlzdGluZ1NvcnRCeSAmJiAvLyBGaW5hbGx5LCBkZXRlY3QgaWYgaXQgc2hvdWxkIGluZGVlZCBiZSByZW1vdmVkXG4gICAgICBleGlzdGluZ1NvcnRCeS5kZXNjICYmICFzb3J0RGVzY0ZpcnN0IHx8ICFleGlzdGluZ1NvcnRCeS5kZXNjICYmIHNvcnREZXNjRmlyc3QpKSB7XG4gICAgICAgIHNvcnRBY3Rpb24gPSAncmVtb3ZlJztcbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnRBY3Rpb24gPT09ICdyZXBsYWNlJykge1xuICAgICAgICBfbmV3U29ydEJ5ID0gW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ2FkZCcpIHtcbiAgICAgICAgX25ld1NvcnRCeSA9IFtdLmNvbmNhdChfc29ydEJ5MiwgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XSk7IC8vIFRha2UgbGF0ZXN0IG4gY29sdW1uc1xuXG4gICAgICAgIF9uZXdTb3J0Qnkuc3BsaWNlKDAsIF9uZXdTb3J0QnkubGVuZ3RoIC0gbWF4TXVsdGlTb3J0Q29sQ291bnQpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0QWN0aW9uID09PSAndG9nZ2xlJykge1xuICAgICAgICAvLyBUaGlzIGZsaXBzIChvciBzZXRzKSB0aGVcbiAgICAgICAgX25ld1NvcnRCeSA9IF9zb3J0QnkyLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBkLCB7XG4gICAgICAgICAgICAgIGRlc2M6IGhhc0Rlc2NEZWZpbmVkID8gZGVzYyA6ICFleGlzdGluZ1NvcnRCeS5kZXNjXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRBY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICAgIF9uZXdTb3J0QnkgPSBfc29ydEJ5Mi5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogX25ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkNShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gaW5zdGFuY2UuZmxhdFJvd3MsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBfaW5zdGFuY2Ukb3JkZXJCeUZuID0gaW5zdGFuY2Uub3JkZXJCeUZuLFxuICAgICAgICBvcmRlckJ5Rm4gPSBfaW5zdGFuY2Ukb3JkZXJCeUZuID09PSB2b2lkIDAgPyBkZWZhdWx0T3JkZXJCeUZuIDogX2luc3RhbmNlJG9yZGVyQnlGbixcbiAgICAgICAgdXNlclNvcnRUeXBlcyA9IGluc3RhbmNlLnNvcnRUeXBlcyxcbiAgICAgICAgbWFudWFsU29ydEJ5ID0gaW5zdGFuY2UubWFudWFsU29ydEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuU29ydCA9IGluc3RhbmNlLmRlZmF1bHRDYW5Tb3J0LFxuICAgICAgICBkaXNhYmxlU29ydEJ5ID0gaW5zdGFuY2UuZGlzYWJsZVNvcnRCeSxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgc29ydEJ5ID0gaW5zdGFuY2Uuc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNvID0gaW5zdGFuY2UuYXV0b1Jlc2V0U29ydEJ5LFxuICAgICAgICBhdXRvUmVzZXRTb3J0QnkgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U28gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U287XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VGaWx0ZXJzJywgJ3VzZUdsb2JhbEZpbHRlcicsICd1c2VHcm91cEJ5JywgJ3VzZVBpdm90Q29sdW1ucyddLCAndXNlU29ydEJ5Jyk7XG4gICAgdmFyIHNldFNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChzb3J0QnkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRTb3J0QnksXG4gICAgICAgIHNvcnRCeTogc29ydEJ5XG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gVXBkYXRlcyBzb3J0aW5nIGJhc2VkIG9uIGEgY29sdW1uSWQsIGRlc2MgZmxhZyBhbmQgbXVsdGkgZmxhZ1xuXG4gICAgdmFyIHRvZ2dsZVNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZGVzYywgbXVsdGkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVTb3J0QnksXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZGVzYzogZGVzYyxcbiAgICAgICAgbXVsdGk6IG11bHRpXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gdXNlIHJlZmVyZW5jZSB0byBhdm9pZCBtZW1vcnkgbGVhayBpbiAjMTYwOFxuXG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTsgLy8gQWRkIHRoZSBnZXRTb3J0QnlUb2dnbGVQcm9wcyBtZXRob2QgdG8gY29sdW1ucyBhbmQgaGVhZGVyc1xuXG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICB2YXIgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgICAgZGVmYXVsdENvbHVtbkNhblNvcnQgPSBjb2x1bW4uY2FuU29ydCxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlU29ydEJ5ID0gY29sdW1uLmRpc2FibGVTb3J0QnksXG4gICAgICAgICAgaWQgPSBjb2x1bW4uaWQ7XG4gICAgICB2YXIgY2FuU29ydCA9IGFjY2Vzc29yID8gZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRpc2FibGVTb3J0QnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZVNvcnRCeSA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChkZWZhdWx0Q2FuU29ydCwgZGVmYXVsdENvbHVtbkNhblNvcnQsIGZhbHNlKTtcbiAgICAgIGNvbHVtbi5jYW5Tb3J0ID0gY2FuU29ydDtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Tb3J0KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkgPSBmdW5jdGlvbiAoZGVzYywgbXVsdGkpIHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlU29ydEJ5KGNvbHVtbi5pZCwgZGVzYywgbXVsdGkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbHVtbi5jbGVhclNvcnRCeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBhY3Rpb25zLmNsZWFyU29ydEJ5LFxuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4uZ2V0U29ydEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFNvcnRCeVRvZ2dsZVByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgICB2YXIgY29sdW1uU29ydCA9IHNvcnRCeS5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmlzU29ydGVkID0gISFjb2x1bW5Tb3J0O1xuICAgICAgY29sdW1uLnNvcnRlZEluZGV4ID0gc29ydEJ5LmZpbmRJbmRleChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGNvbHVtbi5pc1NvcnRlZERlc2MgPSBjb2x1bW4uaXNTb3J0ZWQgPyBjb2x1bW5Tb3J0LmRlc2MgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxTb3J0QnkgfHwgIXNvcnRCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93c107XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3J0ZWRGbGF0Um93cyA9IFtdOyAvLyBGaWx0ZXIgb3V0IHNvcnRCeXMgdGhhdCBjb3JyZXNwb25kIHRvIG5vbiBleGlzdGluZyBjb2x1bW5zXG5cbiAgICAgIHZhciBhdmFpbGFibGVTb3J0QnkgPSBzb3J0QnkuZmlsdGVyKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBzb3J0RGF0YSA9IGZ1bmN0aW9uIHNvcnREYXRhKHJvd3MpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmRlckJ5Rm4gdG8gY29tcG9zZSBtdWx0aXBsZSBzb3J0QnkncyB0b2dldGhlci5cbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gcGVyZm9ybSBhIHN0YWJsZSBzb3J0aW5nIHVzaW5nIHRoZSByb3cgaW5kZXhcbiAgICAgICAgLy8gaWYgbmVlZGVkLlxuICAgICAgICB2YXIgc29ydGVkRGF0YSA9IG9yZGVyQnlGbihyb3dzLCBhdmFpbGFibGVTb3J0QnkubWFwKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBjdXN0b20gc29ydGluZyBtZXRob2RzIGZvciBlYWNoIGNvbHVtblxuICAgICAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBzb3J0LmlkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LVRhYmxlOiBDb3VsZCBub3QgZmluZCBhIGNvbHVtbiB3aXRoIGlkOiBcIiArIHNvcnQuaWQgKyBcIiB3aGlsZSBzb3J0aW5nXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzb3J0VHlwZSA9IGNvbHVtbi5zb3J0VHlwZTsgLy8gTG9vayB1cCBzb3J0QnkgZnVuY3Rpb25zIGluIHRoaXMgb3JkZXI6XG4gICAgICAgICAgLy8gY29sdW1uIGZ1bmN0aW9uXG4gICAgICAgICAgLy8gY29sdW1uIHN0cmluZyBsb29rdXAgb24gdXNlciBzb3J0VHlwZVxuICAgICAgICAgIC8vIGNvbHVtbiBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBmdW5jdGlvblxuICAgICAgICAgIC8vIGRlZmF1bHQgc3RyaW5nIGxvb2t1cCBvbiB1c2VyIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG5cbiAgICAgICAgICB2YXIgc29ydE1ldGhvZCA9IGlzRnVuY3Rpb24oc29ydFR5cGUpIHx8ICh1c2VyU29ydFR5cGVzIHx8IHt9KVtzb3J0VHlwZV0gfHwgc29ydFR5cGVzW3NvcnRUeXBlXTtcblxuICAgICAgICAgIGlmICghc29ydE1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QtVGFibGU6IENvdWxkIG5vdCBmaW5kIGEgdmFsaWQgc29ydFR5cGUgb2YgJ1wiICsgc29ydFR5cGUgKyBcIicgZm9yIGNvbHVtbiAnXCIgKyBzb3J0LmlkICsgXCInLlwiKTtcbiAgICAgICAgICB9IC8vIFJldHVybiB0aGUgY29ycmVjdCBzb3J0Rm4uXG4gICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBpbiBhc2NlbmRpbmcgb3JkZXJcblxuXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydE1ldGhvZChhLCBiLCBzb3J0LmlkLCBzb3J0LmRlc2MpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pLCAvLyBNYXAgdGhlIGRpcmVjdGlvbnNcbiAgICAgICAgYXZhaWxhYmxlU29ydEJ5Lm1hcChmdW5jdGlvbiAoc29ydCkge1xuICAgICAgICAgIC8vIERldGVjdCBhbmQgdXNlIHRoZSBzb3J0SW52ZXJ0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5zb3J0SW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0LmRlc2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICFzb3J0LmRlc2M7XG4gICAgICAgIH0pKTsgLy8gSWYgdGhlcmUgYXJlIHN1Yi1yb3dzLCBzb3J0IHRoZW1cblxuICAgICAgICBzb3J0ZWREYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHNvcnRlZEZsYXRSb3dzLnB1c2gocm93KTtcblxuICAgICAgICAgIGlmICghcm93LnN1YlJvd3MgfHwgcm93LnN1YlJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93LnN1YlJvd3MgPSBzb3J0RGF0YShyb3cuc3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkRGF0YTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbc29ydERhdGEocm93cyksIHNvcnRlZEZsYXRSb3dzXTtcbiAgICB9LCBbbWFudWFsU29ydEJ5LCBzb3J0QnksIHJvd3MsIGZsYXRSb3dzLCBhbGxDb2x1bW5zLCBvcmRlckJ5Rm4sIHVzZXJTb3J0VHlwZXNdKSxcbiAgICAgICAgc29ydGVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBzb3J0ZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldFNvcnRCeSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRTb3J0QnkpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFNvcnRCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0U29ydEJ5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFttYW51YWxTb3J0QnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZVNvcnRlZFJvd3M6IHJvd3MsXG4gICAgICBwcmVTb3J0ZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBzb3J0ZWRSb3dzOiBzb3J0ZWRSb3dzLFxuICAgICAgc29ydGVkRmxhdFJvd3M6IHNvcnRlZEZsYXRSb3dzLFxuICAgICAgcm93czogc29ydGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBzb3J0ZWRGbGF0Um93cyxcbiAgICAgIHNldFNvcnRCeTogc2V0U29ydEJ5LFxuICAgICAgdG9nZ2xlU29ydEJ5OiB0b2dnbGVTb3J0QnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRPcmRlckJ5Rm4oYXJyLCBmdW5jcywgZGlycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoYXJyKS5zb3J0KGZ1bmN0aW9uIChyb3dBLCByb3dCKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBzb3J0Rm4gPSBmdW5jc1tpXTtcbiAgICAgICAgdmFyIGRlc2MgPSBkaXJzW2ldID09PSBmYWxzZSB8fCBkaXJzW2ldID09PSAnZGVzYyc7XG4gICAgICAgIHZhciBzb3J0SW50ID0gc29ydEZuKHJvd0EsIHJvd0IpO1xuXG4gICAgICAgIGlmIChzb3J0SW50ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2MgPyAtc29ydEludCA6IHNvcnRJbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpcnNbMF0gPyByb3dBLmluZGV4IC0gcm93Qi5pbmRleCA6IHJvd0IuaW5kZXggLSByb3dBLmluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUgPSAndXNlUGFnaW5hdGlvbic7IC8vIEFjdGlvbnNcblxuICBhY3Rpb25zLnJlc2V0UGFnZSA9ICdyZXNldFBhZ2UnO1xuICBhY3Rpb25zLmdvdG9QYWdlID0gJ2dvdG9QYWdlJztcbiAgYWN0aW9ucy5zZXRQYWdlU2l6ZSA9ICdzZXRQYWdlU2l6ZSc7XG4gIHZhciB1c2VQYWdpbmF0aW9uID0gZnVuY3Rpb24gdXNlUGFnaW5hdGlvbihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDYpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkNik7XG4gIH07XG4gIHVzZVBhZ2luYXRpb24ucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ2KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgcGFnZUluZGV4OiAwXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0UGFnZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5wYWdlSW5kZXggfHwgMFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmdvdG9QYWdlKSB7XG4gICAgICB2YXIgcGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlO1xuICAgICAgdmFyIG5ld1BhZ2VJbmRleCA9IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnBhZ2VJbmRleCwgc3RhdGUucGFnZUluZGV4KTtcbiAgICAgIHZhciBjYW5OYXZpZ2F0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAobmV3UGFnZUluZGV4ID4gc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIG5leHQgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBzdGF0ZS5wYWdlU2l6ZSA6IG5ld1BhZ2VJbmRleCA8IHBhZ2VDb3VudDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UGFnZUluZGV4IDwgc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIHByZXYgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IG5ld1BhZ2VJbmRleCA+IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNhbk5hdmlnYXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IG5ld1BhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFBhZ2VTaXplKSB7XG4gICAgICB2YXIgcGFnZVNpemUgPSBhY3Rpb24ucGFnZVNpemU7XG4gICAgICB2YXIgdG9wUm93SW5kZXggPSBzdGF0ZS5wYWdlU2l6ZSAqIHN0YXRlLnBhZ2VJbmRleDtcbiAgICAgIHZhciBwYWdlSW5kZXggPSBNYXRoLmZsb29yKHRvcFJvd0luZGV4IC8gcGFnZVNpemUpO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ2KGluc3RhbmNlKSB7XG4gICAgdmFyIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0UGEgPSBpbnN0YW5jZS5hdXRvUmVzZXRQYWdlLFxuICAgICAgICBhdXRvUmVzZXRQYWdlID0gX2luc3RhbmNlJGF1dG9SZXNldFBhID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBhLFxuICAgICAgICBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPSBpbnN0YW5jZS5tYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgbWFudWFsRXhwYW5kZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPT09IHZvaWQgMCA/ICdleHBhbmRlZCcgOiBfaW5zdGFuY2UkbWFudWFsRXhwYW4sXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICB1c2VyUGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPSBpbnN0YW5jZS5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3MgPSBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkcGFnaW5hdGVFeHAsXG4gICAgICAgIF9pbnN0YW5jZSRleHBhbmRTdWJSbyA9IGluc3RhbmNlLmV4cGFuZFN1YlJvd3MsXG4gICAgICAgIGV4cGFuZFN1YlJvd3MgPSBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkZXhwYW5kU3ViUm8sXG4gICAgICAgIF9pbnN0YW5jZSRzdGF0ZSA9IGluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwYWdlU2l6ZSA9IF9pbnN0YW5jZSRzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgcGFnZUluZGV4ID0gX2luc3RhbmNlJHN0YXRlLnBhZ2VJbmRleCxcbiAgICAgICAgZXhwYW5kZWQgPSBfaW5zdGFuY2Ukc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IF9pbnN0YW5jZSRzdGF0ZS5nbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlcnMgPSBfaW5zdGFuY2Ukc3RhdGUuZmlsdGVycyxcbiAgICAgICAgZ3JvdXBCeSA9IF9pbnN0YW5jZSRzdGF0ZS5ncm91cEJ5LFxuICAgICAgICBzb3J0QnkgPSBfaW5zdGFuY2Ukc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgbWFudWFsUGFnaW5hdGlvbiA9IGluc3RhbmNlLm1hbnVhbFBhZ2luYXRpb247XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VHbG9iYWxGaWx0ZXInLCAndXNlRmlsdGVycycsICd1c2VHcm91cEJ5JywgJ3VzZVNvcnRCeScsICd1c2VFeHBhbmRlZCddLCAndXNlUGFnaW5hdGlvbicpO1xuICAgIHZhciBnZXRBdXRvUmVzZXRQYWdlID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFBhZ2UpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBhZ2UoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldFBhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxQYWdpbmF0aW9uID8gbnVsbCA6IGRhdGEsIGdsb2JhbEZpbHRlciwgZmlsdGVycywgZ3JvdXBCeSwgc29ydEJ5XSk7XG4gICAgdmFyIHBhZ2VDb3VudCA9IG1hbnVhbFBhZ2luYXRpb24gPyB1c2VyUGFnZUNvdW50IDogTWF0aC5jZWlsKHJvd3MubGVuZ3RoIC8gcGFnZVNpemUpO1xuICAgIHZhciBwYWdlT3B0aW9ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHBhZ2VDb3VudCA+IDAgPyBbXS5jb25jYXQobmV3IEFycmF5KHBhZ2VDb3VudCkpLmZpbGwobnVsbCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfSkgOiBbXTtcbiAgICB9LCBbcGFnZUNvdW50XSk7XG4gICAgdmFyIHBhZ2UgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwYWdlO1xuXG4gICAgICBpZiAobWFudWFsUGFnaW5hdGlvbikge1xuICAgICAgICBwYWdlID0gcm93cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYWdlU3RhcnQgPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleDtcbiAgICAgICAgdmFyIHBhZ2VFbmQgPSBwYWdlU3RhcnQgKyBwYWdlU2l6ZTtcbiAgICAgICAgcGFnZSA9IHJvd3Muc2xpY2UocGFnZVN0YXJ0LCBwYWdlRW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2luYXRlRXhwYW5kZWRSb3dzKSB7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhwYW5kUm93cyhwYWdlLCB7XG4gICAgICAgIG1hbnVhbEV4cGFuZGVkS2V5OiBtYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICB9KTtcbiAgICB9LCBbZXhwYW5kU3ViUm93cywgZXhwYW5kZWQsIG1hbnVhbEV4cGFuZGVkS2V5LCBtYW51YWxQYWdpbmF0aW9uLCBwYWdlSW5kZXgsIHBhZ2VTaXplLCBwYWdpbmF0ZUV4cGFuZGVkUm93cywgcm93c10pO1xuICAgIHZhciBjYW5QcmV2aW91c1BhZ2UgPSBwYWdlSW5kZXggPiAwO1xuICAgIHZhciBjYW5OZXh0UGFnZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBwYWdlU2l6ZSA6IHBhZ2VJbmRleCA8IHBhZ2VDb3VudCAtIDE7XG4gICAgdmFyIGdvdG9QYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBhZ2VJbmRleCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmdvdG9QYWdlLFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHByZXZpb3VzUGFnZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnb3RvUGFnZShmdW5jdGlvbiAob2xkKSB7XG4gICAgICAgIHJldHVybiBvbGQgLSAxO1xuICAgICAgfSk7XG4gICAgfSwgW2dvdG9QYWdlXSk7XG4gICAgdmFyIG5leHRQYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdvdG9QYWdlKGZ1bmN0aW9uIChvbGQpIHtcbiAgICAgICAgcmV0dXJuIG9sZCArIDE7XG4gICAgICB9KTtcbiAgICB9LCBbZ290b1BhZ2VdKTtcbiAgICB2YXIgc2V0UGFnZVNpemUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocGFnZVNpemUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRQYWdlU2l6ZSxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwYWdlT3B0aW9uczogcGFnZU9wdGlvbnMsXG4gICAgICBwYWdlQ291bnQ6IHBhZ2VDb3VudCxcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICBjYW5QcmV2aW91c1BhZ2U6IGNhblByZXZpb3VzUGFnZSxcbiAgICAgIGNhbk5leHRQYWdlOiBjYW5OZXh0UGFnZSxcbiAgICAgIGdvdG9QYWdlOiBnb3RvUGFnZSxcbiAgICAgIHByZXZpb3VzUGFnZTogcHJldmlvdXNQYWdlLFxuICAgICAgbmV4dFBhZ2U6IG5leHRQYWdlLFxuICAgICAgc2V0UGFnZVNpemU6IHNldFBhZ2VTaXplXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0UGl2b3QgPSAncmVzZXRQaXZvdCc7XG4gIGFjdGlvbnMudG9nZ2xlUGl2b3QgPSAndG9nZ2xlUGl2b3QnO1xuICB2YXIgX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnMoaG9va3MpIHtcbiAgICBob29rcy5nZXRQaXZvdFRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRQaXZvdFRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ3KTtcbiAgICBob29rcy51c2VJbnN0YW5jZUFmdGVyRGF0YS5wdXNoKHVzZUluc3RhbmNlQWZ0ZXJEYXRhKTtcbiAgICBob29rcy5hbGxDb2x1bW5zLnB1c2goYWxsQ29sdW1ucyk7XG4gICAgaG9va3MuYWNjZXNzVmFsdWUucHVzaChhY2Nlc3NWYWx1ZSk7XG4gICAgaG9va3MubWF0ZXJpYWxpemVkQ29sdW1ucy5wdXNoKG1hdGVyaWFsaXplZENvbHVtbnMpO1xuICAgIGhvb2tzLm1hdGVyaWFsaXplZENvbHVtbnNEZXBzLnB1c2gobWF0ZXJpYWxpemVkQ29sdW1uc0RlcHMpO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zLnB1c2godmlzaWJsZUNvbHVtbnMkMSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnNEZXBzLnB1c2godmlzaWJsZUNvbHVtbnNEZXBzKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDcpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDIpO1xuICB9O1xuICBfVU5TVEFCTEVfdXNlUGl2b3RDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUGl2b3RDb2x1bW5zJztcbiAgdmFyIGRlZmF1bHRQaXZvdENvbHVtbnMgPSBbXTtcblxuICB2YXIgZGVmYXVsdEdldFBpdm90VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UGl2b3RUb2dnbGVQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmLmhlYWRlcjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBoZWFkZXIuY2FuUGl2b3QgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZVBpdm90KCk7XG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiBoZWFkZXIuY2FuUGl2b3QgPyAncG9pbnRlcicgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBQaXZvdCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ3KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBpdm90Q29sdW1uczogZGVmYXVsdFBpdm90Q29sdW1uc1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldFBpdm90KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnBpdm90Q29sdW1ucyB8fCBkZWZhdWx0UGl2b3RDb2x1bW5zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUGl2b3QpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBzZXRQaXZvdCA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZFBpdm90ID0gdHlwZW9mIHNldFBpdm90ICE9PSAndW5kZWZpbmVkJyA/IHNldFBpdm90IDogIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhjb2x1bW5JZCk7XG5cbiAgICAgIGlmIChyZXNvbHZlZFBpdm90KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBwaXZvdENvbHVtbnM6IFtdLmNvbmNhdChzdGF0ZS5waXZvdENvbHVtbnMsIFtjb2x1bW5JZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogc3RhdGUucGl2b3RDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkICE9PSBjb2x1bW5JZDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQWZ0ZXJEYXRhKGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2UuYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhbGxDb2x1bW5zKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjIuaW5zdGFuY2U7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4udW5pcXVlVmFsdWVzID0gbmV3IFNldCgpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjZXNzVmFsdWUodmFsdWUsIF9yZWYzKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYzLmNvbHVtbjtcblxuICAgIGlmIChjb2x1bW4udW5pcXVlVmFsdWVzICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbHVtbi51bmlxdWVWYWx1ZXMuYWRkKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zKG1hdGVyaWFsaXplZCwgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIHN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoIXN0YXRlLnBpdm90Q29sdW1ucy5sZW5ndGggfHwgIXN0YXRlLmdyb3VwQnkgfHwgIXN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbWF0ZXJpYWxpemVkO1xuICAgIH1cblxuICAgIHZhciBwaXZvdENvbHVtbnMgPSBzdGF0ZS5waXZvdENvbHVtbnMubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdmFyIHNvdXJjZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2UgJiYgIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoZC5pZCkgJiYgIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhkLmlkKTtcbiAgICB9KTtcblxuICAgIHZhciBidWlsZFBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIGJ1aWxkUGl2b3RDb2x1bW5zKGRlcHRoLCBwYXJlbnQsIHBpdm90RmlsdGVycykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAocGl2b3RGaWx0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgICAgcGl2b3RGaWx0ZXJzID0gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBwaXZvdENvbHVtbiA9IHBpdm90Q29sdW1uc1tkZXB0aF07XG5cbiAgICAgIGlmICghcGl2b3RDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNvbHVtbnMubWFwKGZ1bmN0aW9uIChzb3VyY2VDb2x1bW4pIHtcbiAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBvZmZlciBzdXBwb3J0IGhlcmUgZm9yIHJlbmVzdGluZyBwaXZvdGVkXG4gICAgICAgICAgLy8gY29sdW1ucyBpbnNpZGUgY29waWVzIG9mIHRoZWlyIGhlYWRlciBncm91cHMuIEZvciBub3csXG4gICAgICAgICAgLy8gdGhhdCBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlICgxKSBvdmVya2lsbCBvbiBuZXN0aW5nLCBjb25zaWRlcmluZ1xuICAgICAgICAgIC8vIHlvdSBhbHJlYWR5IGdldCBuZXN0aW5nIGZvciBldmVyeSBwaXZvdCBsZXZlbCBhbmQgKDIpXG4gICAgICAgICAgLy8gcmVhbGx5IGhhcmQuIDopXG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzb3VyY2VDb2x1bW4sIHtcbiAgICAgICAgICAgIGNhblBpdm90OiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGl2b3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaWQ6IFwiXCIgKyAocGFyZW50ID8gcGFyZW50LmlkICsgXCIuXCIgKyBzb3VyY2VDb2x1bW4uaWQgOiBzb3VyY2VDb2x1bW4uaWQpLFxuICAgICAgICAgICAgYWNjZXNzb3I6IGZ1bmN0aW9uIGFjY2Vzc29yKG9yaWdpbmFsUm93LCBpLCByb3cpIHtcbiAgICAgICAgICAgICAgaWYgKHBpdm90RmlsdGVycy5ldmVyeShmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihyb3cpO1xuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3NvdXJjZUNvbHVtbi5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB1bmlxdWVWYWx1ZXMgPSBBcnJheS5mcm9tKHBpdm90Q29sdW1uLnVuaXF1ZVZhbHVlcykuc29ydCgpO1xuICAgICAgcmV0dXJuIHVuaXF1ZVZhbHVlcy5tYXAoZnVuY3Rpb24gKHVuaXF1ZVZhbHVlKSB7XG4gICAgICAgIHZhciBjb2x1bW5Hcm91cCA9IF9leHRlbmRzKHt9LCBwaXZvdENvbHVtbiwge1xuICAgICAgICAgIEhlYWRlcjogcGl2b3RDb2x1bW4uUGl2b3RIZWFkZXIgfHwgdHlwZW9mIHBpdm90Q29sdW1uLmhlYWRlciA9PT0gJ3N0cmluZycgPyBwaXZvdENvbHVtbi5IZWFkZXIgKyBcIjogXCIgKyB1bmlxdWVWYWx1ZSA6IHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIGlzUGl2b3RHcm91cDogdHJ1ZSxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgaWQ6IHBhcmVudCA/IHBhcmVudC5pZCArIFwiLlwiICsgcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlIDogcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIHBpdm90VmFsdWU6IHVuaXF1ZVZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbHVtbkdyb3VwLmNvbHVtbnMgPSBidWlsZFBpdm90Q29sdW1ucyhkZXB0aCArIDEsIGNvbHVtbkdyb3VwLCBbXS5jb25jYXQocGl2b3RGaWx0ZXJzLCBbZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3Bpdm90Q29sdW1uLmlkXSA9PT0gdW5pcXVlVmFsdWU7XG4gICAgICAgIH1dKSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5Hcm91cDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgbmV3TWF0ZXJpYWxpemVkID0gZmxhdHRlbkNvbHVtbnMoYnVpbGRQaXZvdENvbHVtbnMoKSk7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChtYXRlcmlhbGl6ZWQsIG5ld01hdGVyaWFsaXplZCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zRGVwcyhkZXBzLCBfcmVmNSkge1xuICAgIHZhciBfcmVmNSRpbnN0YW5jZSRzdGF0ZSA9IF9yZWY1Lmluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwaXZvdENvbHVtbnMgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5waXZvdENvbHVtbnMsXG4gICAgICAgIGdyb3VwQnkgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5ncm91cEJ5O1xuICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW3Bpdm90Q29sdW1ucywgZ3JvdXBCeV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZUNvbHVtbnMkMSh2aXNpYmxlQ29sdW1ucywgX3JlZjYpIHtcbiAgICB2YXIgc3RhdGUgPSBfcmVmNi5pbnN0YW5jZS5zdGF0ZTtcbiAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2U7XG4gICAgfSk7XG5cbiAgICBpZiAoc3RhdGUucGl2b3RDb2x1bW5zLmxlbmd0aCAmJiBzdGF0ZS5ncm91cEJ5ICYmIHN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uaXNHcm91cGVkIHx8IGNvbHVtbi5pc1Bpdm90ZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1uc0RlcHMoZGVwcywgX3JlZjcpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW10uY29uY2F0KGRlcHMsIFtpbnN0YW5jZS5zdGF0ZS5waXZvdENvbHVtbnMsIGluc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDcoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFBpID0gaW5zdGFuY2UuYXV0b1Jlc2V0UGl2b3QsXG4gICAgICAgIGF1dG9SZXNldFBpdm90ID0gX2luc3RhbmNlJGF1dG9SZXNldFBpID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBpLFxuICAgICAgICBtYW5hdWxQaXZvdCA9IGluc3RhbmNlLm1hbmF1bFBpdm90LFxuICAgICAgICBkaXNhYmxlUGl2b3QgPSBpbnN0YW5jZS5kaXNhYmxlUGl2b3QsXG4gICAgICAgIGRlZmF1bHRDYW5QaXZvdCA9IGluc3RhbmNlLmRlZmF1bHRDYW5QaXZvdDtcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUdyb3VwQnknXSwgJ3VzZVBpdm90Q29sdW1ucycpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uUGl2b3QgPSBjb2x1bW4uZGVmYXVsdFBpdm90LFxuICAgICAgICAgIGNvbHVtbkRpc2FibGVQaXZvdCA9IGNvbHVtbi5kaXNhYmxlUGl2b3Q7XG4gICAgICBjb2x1bW4uY2FuUGl2b3QgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW4uY2FuUGl2b3QsIGNvbHVtbkRpc2FibGVQaXZvdCA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUGl2b3QgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSkgOiBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhblBpdm90LCBkZWZhdWx0Q29sdW1uUGl2b3QsIGRlZmF1bHRDYW5QaXZvdCwgZmFsc2UpO1xuXG4gICAgICBpZiAoY29sdW1uLmNhblBpdm90KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVQaXZvdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUGl2b3QoY29sdW1uLmlkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29sdW1uLkFnZ3JlZ2F0ZWQgPSBjb2x1bW4uQWdncmVnYXRlZCB8fCBjb2x1bW4uQ2VsbDtcbiAgICB9KTtcblxuICAgIHZhciB0b2dnbGVQaXZvdCA9IGZ1bmN0aW9uIHRvZ2dsZVBpdm90KGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVBpdm90LFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZsYXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgaGVhZGVyLmdldFBpdm90VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFBpdm90VG9nZ2xlUHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIGhlYWRlcjogaGVhZGVyXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UGl2b3QgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0UGl2b3QpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBpdm90KCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRQaXZvdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbmF1bFBpdm90ID8gbnVsbCA6IGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICB0b2dnbGVQaXZvdDogdG9nZ2xlUGl2b3RcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMihyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIHBpdm90Q29sdW1ucyBhbmQgdGhlIHBpdm90IGNlbGwgZm9yIHRoZSByb3dcbiAgICAgIGNlbGwuaXNQaXZvdGVkID0gY2VsbC5jb2x1bW4uaXNQaXZvdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUkMSA9ICd1c2VSb3dTZWxlY3QnOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldFNlbGVjdGVkUm93cyA9ICdyZXNldFNlbGVjdGVkUm93cyc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c1NlbGVjdGVkID0gJ3RvZ2dsZUFsbFJvd3NTZWxlY3RlZCc7XG4gIGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQgPSAndG9nZ2xlUm93U2VsZWN0ZWQnO1xuICBhY3Rpb25zLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSAndG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCc7XG4gIHZhciB1c2VSb3dTZWxlY3QgPSBmdW5jdGlvbiB1c2VSb3dTZWxlY3QoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ4KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDgpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDMpO1xuICB9O1xuICB1c2VSb3dTZWxlY3QucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWUkMTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZVJvd1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICAgIHJvdyA9IF9yZWYucm93O1xuICAgIHZhciBfaW5zdGFuY2UkbWFudWFsUm93U2UgPSBpbnN0YW5jZS5tYW51YWxSb3dTZWxlY3RlZEtleSxcbiAgICAgICAgbWFudWFsUm93U2VsZWN0ZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsUm93U2UgPT09IHZvaWQgMCA/ICdpc1NlbGVjdGVkJyA6IF9pbnN0YW5jZSRtYW51YWxSb3dTZTtcbiAgICB2YXIgY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvdy5vcmlnaW5hbCAmJiByb3cub3JpZ2luYWxbbWFudWFsUm93U2VsZWN0ZWRLZXldKSB7XG4gICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tlZCA9IHJvdy5pc1NlbGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZChlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBSb3cgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogcm93LmlzU29tZVNlbGVjdGVkXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIEFsbCBSb3dzIFNlbGVjdGVkJyxcbiAgICAgIGluZGV0ZXJtaW5hdGU6IEJvb2xlYW4oIWluc3RhbmNlLmlzQWxsUm93c1NlbGVjdGVkICYmIE9iamVjdC5rZXlzKGluc3RhbmNlLnN0YXRlLnNlbGVjdGVkUm93SWRzKS5sZW5ndGgpXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYzLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ3VycmVudCBQYWdlIFJvd3MgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogQm9vbGVhbighaW5zdGFuY2UuaXNBbGxQYWdlUm93c1NlbGVjdGVkICYmIGluc3RhbmNlLnBhZ2Uuc29tZShmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgdmFyIGlkID0gX3JlZjQuaWQ7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSlcbiAgICB9XTtcbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkOChzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzZWxlY3RlZFJvd0lkczoge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3MpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5zZWxlY3RlZFJvd0lkcyB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIHNldFNlbGVjdGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGlzQWxsUm93c1NlbGVjdGVkID0gaW5zdGFuY2UuaXNBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgICBfaW5zdGFuY2Ukbm9uR3JvdXBlZFIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkID0gX2luc3RhbmNlJG5vbkdyb3VwZWRSID09PSB2b2lkIDAgPyByb3dzQnlJZCA6IF9pbnN0YW5jZSRub25Hcm91cGVkUjtcbiAgICAgIHZhciBzZWxlY3RBbGwgPSB0eXBlb2Ygc2V0U2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnID8gc2V0U2VsZWN0ZWQgOiAhaXNBbGxSb3dzU2VsZWN0ZWQ7IC8vIE9ubHkgcmVtb3ZlL2FkZCB0aGUgcm93cyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cbiAgICAgIC8vICBMZWF2ZSBhbGwgdGhlIG90aGVyIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWQgYWxvbmUuXG5cbiAgICAgIHZhciBzZWxlY3RlZFJvd0lkcyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgaWYgKHNlbGVjdEFsbCkge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dJZHNbcm93SWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGVjdGVkUm93SWRzW3Jvd0lkXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IHNlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQpIHtcbiAgICAgIHZhciBpZCA9IGFjdGlvbi5pZCxcbiAgICAgICAgICBfc2V0U2VsZWN0ZWQgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgX3Jvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvID0gaW5zdGFuY2Uuc2VsZWN0U3ViUm93cyxcbiAgICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvLFxuICAgICAgICAgIGdldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB2YXIgc2hvdWxkRXhpc3QgPSB0eXBlb2YgX3NldFNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZCA6ICFpc1NlbGVjdGVkO1xuXG4gICAgICBpZiAoaXNTZWxlY3RlZCA9PT0gc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3U2VsZWN0ZWRSb3dJZHMgPSBfZXh0ZW5kcyh7fSwgc3RhdGUuc2VsZWN0ZWRSb3dJZHMpO1xuXG4gICAgICB2YXIgaGFuZGxlUm93QnlJZCA9IGZ1bmN0aW9uIGhhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZFtpZF07XG5cbiAgICAgICAgaWYgKCFyb3cuaXNHcm91cGVkKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEV4aXN0KSB7XG4gICAgICAgICAgICBuZXdTZWxlY3RlZFJvd0lkc1tpZF0gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RTdWJSb3dzICYmIGdldFN1YlJvd3Mocm93KSkge1xuICAgICAgICAgIHJldHVybiBnZXRTdWJSb3dzKHJvdykuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGVSb3dCeUlkKGlkKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IG5ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIF9zZXRTZWxlY3RlZDIgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBwYWdlID0gaW5zdGFuY2UucGFnZSxcbiAgICAgICAgICBfcm93c0J5SWQyID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvMiA9IGluc3RhbmNlLnNlbGVjdFN1YlJvd3MsXG4gICAgICAgICAgX3NlbGVjdFN1YlJvd3MgPSBfaW5zdGFuY2Ukc2VsZWN0U3ViUm8yID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvMixcbiAgICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgX2dldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuXG4gICAgICB2YXIgX3NlbGVjdEFsbCA9IHR5cGVvZiBfc2V0U2VsZWN0ZWQyICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZDIgOiAhaXNBbGxQYWdlUm93c1NlbGVjdGVkO1xuXG4gICAgICB2YXIgX25ld1NlbGVjdGVkUm93SWRzID0gX2V4dGVuZHMoe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgdmFyIF9oYW5kbGVSb3dCeUlkID0gZnVuY3Rpb24gX2hhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZDJbaWRdO1xuXG4gICAgICAgIGlmICghcm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgIGlmIChfc2VsZWN0QWxsKSB7XG4gICAgICAgICAgICBfbmV3U2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIF9uZXdTZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9zZWxlY3RTdWJSb3dzICYmIF9nZXRTdWJSb3dzKHJvdykpIHtcbiAgICAgICAgICByZXR1cm4gX2dldFN1YlJvd3Mocm93KS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBfaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBwYWdlLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICByZXR1cm4gX2hhbmRsZVJvd0J5SWQocm93LmlkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzZWxlY3RlZFJvd0lkczogX25ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ4KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPT09IHZvaWQgMCA/IHJvd3NCeUlkIDogX2luc3RhbmNlJG5vbkdyb3VwZWRSMixcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNlID0gaW5zdGFuY2UuYXV0b1Jlc2V0U2VsZWN0ZWRSb3dzLFxuICAgICAgICBhdXRvUmVzZXRTZWxlY3RlZFJvd3MgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UsXG4gICAgICAgIHNlbGVjdGVkUm93SWRzID0gaW5zdGFuY2Uuc3RhdGUuc2VsZWN0ZWRSb3dJZHMsXG4gICAgICAgIF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMgPSBpbnN0YW5jZS5zZWxlY3RTdWJSb3dzLFxuICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvMyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlLFxuICAgICAgICBnZXRTdWJSb3dzID0gaW5zdGFuY2UuZ2V0U3ViUm93cztcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUZpbHRlcnMnLCAndXNlR3JvdXBCeScsICd1c2VTb3J0QnknLCAndXNlRXhwYW5kZWQnLCAndXNlUGFnaW5hdGlvbiddLCAndXNlUm93U2VsZWN0Jyk7XG4gICAgdmFyIHNlbGVjdGVkRmxhdFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxlY3RlZEZsYXRSb3dzID0gW107XG4gICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IHNlbGVjdFN1YlJvd3MgPyBnZXRSb3dJc1NlbGVjdGVkKHJvdywgc2VsZWN0ZWRSb3dJZHMsIGdldFN1YlJvd3MpIDogISFzZWxlY3RlZFJvd0lkc1tyb3cuaWRdO1xuICAgICAgICByb3cuaXNTZWxlY3RlZCA9ICEhaXNTZWxlY3RlZDtcbiAgICAgICAgcm93LmlzU29tZVNlbGVjdGVkID0gaXNTZWxlY3RlZCA9PT0gbnVsbDtcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEZsYXRSb3dzO1xuICAgIH0sIFtyb3dzLCBzZWxlY3RTdWJSb3dzLCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93c10pO1xuICAgIHZhciBpc0FsbFJvd3NTZWxlY3RlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5sZW5ndGggJiYgT2JqZWN0LmtleXMoc2VsZWN0ZWRSb3dJZHMpLmxlbmd0aCk7XG4gICAgdmFyIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9IGlzQWxsUm93c1NlbGVjdGVkO1xuXG4gICAgaWYgKGlzQWxsUm93c1NlbGVjdGVkKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIXNlbGVjdGVkUm93SWRzW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc0FsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgaWYgKHBhZ2UgJiYgcGFnZS5sZW5ndGggJiYgcGFnZS5zb21lKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgICB2YXIgaWQgPSBfcmVmNS5pZDtcbiAgICAgICAgcmV0dXJuICFzZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSkge1xuICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFNlbGVjdGVkUm93cyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBkYXRhXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlUm93U2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVJvd1NlbGVjdGVkLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICB2YXIgZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIHZhciBnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBzZWxlY3RlZEZsYXRSb3dzOiBzZWxlY3RlZEZsYXRSb3dzLFxuICAgICAgaXNBbGxSb3dzU2VsZWN0ZWQ6IGlzQWxsUm93c1NlbGVjdGVkLFxuICAgICAgaXNBbGxQYWdlUm93c1NlbGVjdGVkOiBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0b2dnbGVSb3dTZWxlY3RlZDogdG9nZ2xlUm93U2VsZWN0ZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQ6IHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyxcbiAgICAgIGdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wczogZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzLFxuICAgICAgdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZDogdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyQzKHJvdywgX3JlZjYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNi5pbnN0YW5jZTtcblxuICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVSb3dTZWxlY3RlZChyb3cuaWQsIHNldCk7XG4gICAgfTtcblxuICAgIHJvdy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoaW5zdGFuY2UuZ2V0SG9va3MoKS5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Um93SXNTZWxlY3RlZChyb3csIHNlbGVjdGVkUm93SWRzLCBnZXRTdWJSb3dzKSB7XG4gICAgaWYgKHNlbGVjdGVkUm93SWRzW3Jvdy5pZF0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdWJSb3dzID0gZ2V0U3ViUm93cyhyb3cpO1xuXG4gICAgaWYgKHN1YlJvd3MgJiYgc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgIHZhciBhbGxDaGlsZHJlblNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHZhciBzb21lU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoc3ViUm93KSB7XG4gICAgICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGtub3cgYm90aCBvZiB0aGVzZVxuICAgICAgICBpZiAoc29tZVNlbGVjdGVkICYmICFhbGxDaGlsZHJlblNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldFJvd0lzU2VsZWN0ZWQoc3ViUm93LCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93cykpIHtcbiAgICAgICAgICBzb21lU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFsbENoaWxkcmVuU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWxsQ2hpbGRyZW5TZWxlY3RlZCA/IHRydWUgOiBzb21lU2VsZWN0ZWQgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3Nvcihyb3cpIHtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgPSBmdW5jdGlvbiBkZWZhdWx0SW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yKGNlbGwpIHtcbiAgICByZXR1cm4ge307XG4gIH07IC8vIEFjdGlvbnNcblxuXG4gIGFjdGlvbnMuc2V0Um93U3RhdGUgPSAnc2V0Um93U3RhdGUnO1xuICBhY3Rpb25zLnNldENlbGxTdGF0ZSA9ICdzZXRDZWxsU3RhdGUnO1xuICBhY3Rpb25zLnJlc2V0Um93U3RhdGUgPSAncmVzZXRSb3dTdGF0ZSc7XG4gIHZhciB1c2VSb3dTdGF0ZSA9IGZ1bmN0aW9uIHVzZVJvd1N0YXRlKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkOSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ5KTtcbiAgICBob29rcy5wcmVwYXJlUm93LnB1c2gocHJlcGFyZVJvdyQ0KTtcbiAgfTtcbiAgdXNlUm93U3RhdGUucGx1Z2luTmFtZSA9ICd1c2VSb3dTdGF0ZSc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ5KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgdmFyIF9pbnN0YW5jZSRpbml0aWFsUm93UyA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UyA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yIDogX2luc3RhbmNlJGluaXRpYWxSb3dTLFxuICAgICAgICBfaW5zdGFuY2UkaW5pdGlhbENlbGwgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZDtcblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICByb3dTdGF0ZToge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSb3dTdGF0ZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICByb3dTdGF0ZTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnJvd1N0YXRlIHx8IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0Um93U3RhdGUpIHtcbiAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgIHZhciByb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBvbGRSb3dTdGF0ZSA9IHR5cGVvZiBzdGF0ZS5yb3dTdGF0ZVtyb3dJZF0gIT09ICd1bmRlZmluZWQnID8gc3RhdGUucm93U3RhdGVbcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbcm93SWRdKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcm93U3RhdGU6IF9leHRlbmRzKHt9LCBzdGF0ZS5yb3dTdGF0ZSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcm93SWRdID0gZnVuY3Rpb25hbFVwZGF0ZSh2YWx1ZSwgb2xkUm93U3RhdGUpLCBfZXh0ZW5kczIpKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENlbGxTdGF0ZSkge1xuICAgICAgdmFyIF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCwgX3Jvd3NCeUlkJF9yb3dJZCwgX3Jvd3NCeUlkJF9yb3dJZCRjZWxsLCBfZXh0ZW5kczMsIF9leHRlbmRzNDtcblxuICAgICAgdmFyIF9yb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBfdmFsdWUgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBfb2xkUm93U3RhdGUgPSB0eXBlb2Ygc3RhdGUucm93U3RhdGVbX3Jvd0lkXSAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZS5yb3dTdGF0ZVtfcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbX3Jvd0lkXSk7XG5cbiAgICAgIHZhciBvbGRDZWxsU3RhdGUgPSB0eXBlb2YgKF9vbGRSb3dTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogKF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCA9IF9vbGRSb3dTdGF0ZS5jZWxsU3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfb2xkUm93U3RhdGUkY2VsbFN0YXRbY29sdW1uSWRdKSAhPT0gJ3VuZGVmaW5lZCcgPyBfb2xkUm93U3RhdGUuY2VsbFN0YXRlW2NvbHVtbklkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcigoX3Jvd3NCeUlkJF9yb3dJZCA9IHJvd3NCeUlkW19yb3dJZF0pID09IG51bGwgPyB2b2lkIDAgOiAoX3Jvd3NCeUlkJF9yb3dJZCRjZWxsID0gX3Jvd3NCeUlkJF9yb3dJZC5jZWxscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9yb3dzQnlJZCRfcm93SWQkY2VsbC5maW5kKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgIHJldHVybiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHJvd1N0YXRlOiBfZXh0ZW5kcyh7fSwgc3RhdGUucm93U3RhdGUsIChfZXh0ZW5kczQgPSB7fSwgX2V4dGVuZHM0W19yb3dJZF0gPSBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLCB7XG4gICAgICAgICAgY2VsbFN0YXRlOiBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLmNlbGxTdGF0ZSB8fCB7fSwgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNbY29sdW1uSWRdID0gZnVuY3Rpb25hbFVwZGF0ZShfdmFsdWUsIG9sZENlbGxTdGF0ZSksIF9leHRlbmRzMykpXG4gICAgICAgIH0pLCBfZXh0ZW5kczQpKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkOShpbnN0YW5jZSkge1xuICAgIHZhciBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPSBpbnN0YW5jZS5hdXRvUmVzZXRSb3dTdGF0ZSxcbiAgICAgICAgYXV0b1Jlc2V0Um93U3RhdGUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8sXG4gICAgICAgIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIHZhciBzZXRSb3dTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3dJZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Um93U3RhdGUsXG4gICAgICAgIHJvd0lkOiByb3dJZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0Q2VsbFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHJvd0lkLCBjb2x1bW5JZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Q2VsbFN0YXRlLFxuICAgICAgICByb3dJZDogcm93SWQsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0Um93U3RhdGUgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0Um93U3RhdGUpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFJvd1N0YXRlKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSb3dTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHNldFJvd1N0YXRlOiBzZXRSb3dTdGF0ZSxcbiAgICAgIHNldENlbGxTdGF0ZTogc2V0Q2VsbFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlUm93JDQocm93LCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICB2YXIgX2luc3RhbmNlJGluaXRpYWxSb3dTMiA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UzIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsUm93UzIsXG4gICAgICAgIF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgOiBfaW5zdGFuY2UkaW5pdGlhbENlbGwyLFxuICAgICAgICByb3dTdGF0ZSA9IGluc3RhbmNlLnN0YXRlLnJvd1N0YXRlO1xuXG4gICAgaWYgKHJvdykge1xuICAgICAgcm93LnN0YXRlID0gdHlwZW9mIHJvd1N0YXRlW3Jvdy5pZF0gIT09ICd1bmRlZmluZWQnID8gcm93U3RhdGVbcm93LmlkXSA6IGluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yKHJvdyk7XG5cbiAgICAgIHJvdy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zZXRSb3dTdGF0ZShyb3cuaWQsIHVwZGF0ZXIpO1xuICAgICAgfTtcblxuICAgICAgcm93LmNlbGxzLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgaWYgKCFyb3cuc3RhdGUuY2VsbFN0YXRlKSB7XG4gICAgICAgICAgcm93LnN0YXRlLmNlbGxTdGF0ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbC5zdGF0ZSA9IHR5cGVvZiByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSAhPT0gJ3VuZGVmaW5lZCcgPyByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcihjZWxsKTtcblxuICAgICAgICBjZWxsLnNldFN0YXRlID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Q2VsbFN0YXRlKHJvdy5pZCwgY2VsbC5jb2x1bW4uaWQsIHVwZGF0ZXIpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9ucy5yZXNldENvbHVtbk9yZGVyID0gJ3Jlc2V0Q29sdW1uT3JkZXInO1xuICBhY3Rpb25zLnNldENvbHVtbk9yZGVyID0gJ3NldENvbHVtbk9yZGVyJztcbiAgdmFyIHVzZUNvbHVtbk9yZGVyID0gZnVuY3Rpb24gdXNlQ29sdW1uT3JkZXIoaG9va3MpIHtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciRhKTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmNvbHVtbk9yZGVyXSk7XG4gICAgfSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnMucHVzaCh2aXNpYmxlQ29sdW1ucyQyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJGEpO1xuICB9O1xuICB1c2VDb2x1bW5PcmRlci5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtbk9yZGVyJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJGEoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uT3JkZXI6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0Q29sdW1uT3JkZXIpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uT3JkZXI6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlciB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGNvbHVtbk9yZGVyOiBmdW5jdGlvbmFsVXBkYXRlKGFjdGlvbi5jb2x1bW5PcmRlciwgc3RhdGUuY29sdW1uT3JkZXIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyQyKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbk9yZGVyID0gX3JlZjIuaW5zdGFuY2Uuc3RhdGUuY29sdW1uT3JkZXI7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBvcmRlciwgcmV0dXJuIHRoZSBub3JtYWwgY29sdW1uc1xuICAgIGlmICghY29sdW1uT3JkZXIgfHwgIWNvbHVtbk9yZGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgdmFyIGNvbHVtbk9yZGVyQ29weSA9IFtdLmNvbmNhdChjb2x1bW5PcmRlcik7IC8vIElmIHRoZXJlIGlzIGFuIG9yZGVyLCBtYWtlIGEgY29weSBvZiB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnNDb3B5ID0gW10uY29uY2F0KGNvbHVtbnMpOyAvLyBBbmQgbWFrZSBhIG5ldyBvcmRlcmVkIGFycmF5IG9mIHRoZSBjb2x1bW5zXG5cbiAgICB2YXIgY29sdW1uc0luT3JkZXIgPSBbXTsgLy8gTG9vcCBvdmVyIHRoZSBjb2x1bW5zIGFuZCBwbGFjZSB0aGVtIGluIG9yZGVyIGludG8gdGhlIG5ldyBhcnJheVxuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgdGFyZ2V0Q29sdW1uSWQgPSBjb2x1bW5PcmRlckNvcHkuc2hpZnQoKTtcbiAgICAgIHZhciBmb3VuZEluZGV4ID0gY29sdW1uc0NvcHkuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSB0YXJnZXRDb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZm91bmRJbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbHVtbnNJbk9yZGVyLnB1c2goY29sdW1uc0NvcHkuc3BsaWNlKGZvdW5kSW5kZXgsIDEpWzBdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKGNvbHVtbnNDb3B5Lmxlbmd0aCAmJiBjb2x1bW5PcmRlckNvcHkubGVuZ3RoKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIGFueSBjb2x1bW5zIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBlbmRcblxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb2x1bW5zSW5PcmRlciwgY29sdW1uc0NvcHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYShpbnN0YW5jZSkge1xuICAgIHZhciBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGluc3RhbmNlLnNldENvbHVtbk9yZGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldENvbHVtbk9yZGVyLFxuICAgICAgICBjb2x1bW5PcmRlcjogY29sdW1uT3JkZXJcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICB9XG5cbiAgZGVmYXVsdENvbHVtbi5jYW5SZXNpemUgPSB0cnVlOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nID0gJ2NvbHVtblN0YXJ0UmVzaXppbmcnO1xuICBhY3Rpb25zLmNvbHVtblJlc2l6aW5nID0gJ2NvbHVtblJlc2l6aW5nJztcbiAgYWN0aW9ucy5jb2x1bW5Eb25lUmVzaXppbmcgPSAnY29sdW1uRG9uZVJlc2l6aW5nJztcbiAgYWN0aW9ucy5yZXNldFJlc2l6ZSA9ICdyZXNldFJlc2l6ZSc7XG4gIHZhciB1c2VSZXNpemVDb2x1bW5zID0gZnVuY3Rpb24gdXNlUmVzaXplQ29sdW1ucyhob29rcykge1xuICAgIGhvb2tzLmdldFJlc2l6ZXJQcm9wcyA9IFtkZWZhdWx0R2V0UmVzaXplclByb3BzXTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICB9XG4gICAgfSk7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYik7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSRiKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSZXNpemVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UmVzaXplclByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgaGVhZGVyID0gX3JlZi5oZWFkZXI7XG4gICAgdmFyIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2g7XG5cbiAgICB2YXIgb25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKSB7XG4gICAgICB2YXIgaXNUb3VjaEV2ZW50ID0gZmFsc2U7XG5cbiAgICAgIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICAvLyBsZXRzIG5vdCByZXNwb25kIHRvIG11bHRpcGxlIHRvdWNoZXMgKGUuZy4gMiBvciAzIGZpbmdlcnMpXG4gICAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpc1RvdWNoRXZlbnQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVhZGVyc1RvUmVzaXplID0gZ2V0TGVhZkhlYWRlcnMoaGVhZGVyKTtcbiAgICAgIHZhciBoZWFkZXJJZFdpZHRocyA9IGhlYWRlcnNUb1Jlc2l6ZS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIFtkLmlkLCBkLnRvdGFsV2lkdGhdO1xuICAgICAgfSk7XG4gICAgICB2YXIgY2xpZW50WCA9IGlzVG91Y2hFdmVudCA/IE1hdGgucm91bmQoZS50b3VjaGVzWzBdLmNsaWVudFgpIDogZS5jbGllbnRYO1xuXG4gICAgICB2YXIgZGlzcGF0Y2hNb3ZlID0gZnVuY3Rpb24gZGlzcGF0Y2hNb3ZlKGNsaWVudFhQb3MpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uUmVzaXppbmcsXG4gICAgICAgICAgY2xpZW50WDogY2xpZW50WFBvc1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBkaXNwYXRjaEVuZCA9IGZ1bmN0aW9uIGRpc3BhdGNoRW5kKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uRG9uZVJlc2l6aW5nXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdmFyIGhhbmRsZXJzQW5kRXZlbnRzID0ge1xuICAgICAgICBtb3VzZToge1xuICAgICAgICAgIG1vdmVFdmVudDogJ21vdXNlbW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaE1vdmUoZS5jbGllbnRYKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwRXZlbnQ6ICdtb3VzZXVwJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyc0FuZEV2ZW50cy5tb3VzZS5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlcnNBbmRFdmVudHMubW91c2UudXBIYW5kbGVyKTtcbiAgICAgICAgICAgIGRpc3BhdGNoRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0b3VjaDoge1xuICAgICAgICAgIG1vdmVFdmVudDogJ3RvdWNobW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaE1vdmUoZS50b3VjaGVzWzBdLmNsaWVudFgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBFdmVudDogJ3RvdWNoZW5kJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXJzQW5kRXZlbnRzLnRvdWNoLm1vdmVFdmVudCwgaGFuZGxlcnNBbmRFdmVudHMudG91Y2gubW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC51cEV2ZW50LCBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkaXNwYXRjaEVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBldmVudHMgPSBpc1RvdWNoRXZlbnQgPyBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaCA6IGhhbmRsZXJzQW5kRXZlbnRzLm1vdXNlO1xuICAgICAgdmFyIHBhc3NpdmVJZlN1cHBvcnRlZCA9IHBhc3NpdmVFdmVudFN1cHBvcnRlZCgpID8ge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSA6IGZhbHNlO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZUV2ZW50LCBldmVudHMubW92ZUhhbmRsZXIsIHBhc3NpdmVJZlN1cHBvcnRlZCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy51cEV2ZW50LCBldmVudHMudXBIYW5kbGVyLCBwYXNzaXZlSWZTdXBwb3J0ZWQpO1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmNvbHVtblN0YXJ0UmVzaXppbmcsXG4gICAgICAgIGNvbHVtbklkOiBoZWFkZXIuaWQsXG4gICAgICAgIGNvbHVtbldpZHRoOiBoZWFkZXIudG90YWxXaWR0aCxcbiAgICAgICAgaGVhZGVySWRXaWR0aHM6IGhlYWRlcklkV2lkdGhzLFxuICAgICAgICBjbGllbnRYOiBjbGllbnRYXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucGVyc2lzdCgpIHx8IG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKTtcbiAgICAgIH0sXG4gICAgICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgICAgIHJldHVybiBlLnBlcnNpc3QoKSB8fCBvblJlc2l6ZVN0YXJ0KGUsIGhlYWRlcik7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgIH0sXG4gICAgICBkcmFnZ2FibGU6IGZhbHNlLFxuICAgICAgcm9sZTogJ3NlcGFyYXRvcidcbiAgICB9XTtcbiAgfTtcblxuICB1c2VSZXNpemVDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUmVzaXplQ29sdW1ucyc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRiKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSZXNpemUpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nKSB7XG4gICAgICB2YXIgY2xpZW50WCA9IGFjdGlvbi5jbGllbnRYLFxuICAgICAgICAgIGNvbHVtbklkID0gYWN0aW9uLmNvbHVtbklkLFxuICAgICAgICAgIGNvbHVtbldpZHRoID0gYWN0aW9uLmNvbHVtbldpZHRoLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzID0gYWN0aW9uLmhlYWRlcklkV2lkdGhzO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBjbGllbnRYLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzOiBoZWFkZXJJZFdpZHRocyxcbiAgICAgICAgICBjb2x1bW5XaWR0aDogY29sdW1uV2lkdGgsXG4gICAgICAgICAgaXNSZXNpemluZ0NvbHVtbjogY29sdW1uSWRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5SZXNpemluZykge1xuICAgICAgdmFyIF9jbGllbnRYID0gYWN0aW9uLmNsaWVudFg7XG5cbiAgICAgIHZhciBfc3RhdGUkY29sdW1uUmVzaXppbmcgPSBzdGF0ZS5jb2x1bW5SZXNpemluZyxcbiAgICAgICAgICBzdGFydFggPSBfc3RhdGUkY29sdW1uUmVzaXppbmcuc3RhcnRYLFxuICAgICAgICAgIF9jb2x1bW5XaWR0aCA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICBfc3RhdGUkY29sdW1uUmVzaXppbmcyID0gX3N0YXRlJGNvbHVtblJlc2l6aW5nLmhlYWRlcklkV2lkdGhzLFxuICAgICAgICAgIF9oZWFkZXJJZFdpZHRocyA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZzIgPT09IHZvaWQgMCA/IFtdIDogX3N0YXRlJGNvbHVtblJlc2l6aW5nMjtcblxuICAgICAgdmFyIGRlbHRhWCA9IF9jbGllbnRYIC0gc3RhcnRYO1xuICAgICAgdmFyIHBlcmNlbnRhZ2VEZWx0YVggPSBkZWx0YVggLyBfY29sdW1uV2lkdGg7XG4gICAgICB2YXIgbmV3Q29sdW1uV2lkdGhzID0ge307XG5cbiAgICAgIF9oZWFkZXJJZFdpZHRocy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIgaGVhZGVySWQgPSBfcmVmMlswXSxcbiAgICAgICAgICAgIGhlYWRlcldpZHRoID0gX3JlZjJbMV07XG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1toZWFkZXJJZF0gPSBNYXRoLm1heChoZWFkZXJXaWR0aCArIGhlYWRlcldpZHRoICogcGVyY2VudGFnZURlbHRhWCwgMCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBfZXh0ZW5kcyh7fSwgc3RhdGUuY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzLCB7fSwgbmV3Q29sdW1uV2lkdGhzKVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNvbHVtbkRvbmVSZXNpemluZykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBudWxsLFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IG51bGxcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSA9IGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBkaXNhYmxlUmVzaXppbmcgPSBpbnN0YW5jZS5kaXNhYmxlUmVzaXppbmcsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGNvbHVtblJlc2l6aW5nID0gaW5zdGFuY2Uuc3RhdGUuY29sdW1uUmVzaXppbmc7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIHZhciBjYW5SZXNpemUgPSBnZXRGaXJzdERlZmluZWQoaGVhZGVyLmRpc2FibGVSZXNpemluZyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUmVzaXppbmcgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBoZWFkZXIuY2FuUmVzaXplID0gY2FuUmVzaXplO1xuICAgICAgaGVhZGVyLndpZHRoID0gY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzW2hlYWRlci5pZF0gfHwgaGVhZGVyLm9yaWdpbmFsV2lkdGggfHwgaGVhZGVyLndpZHRoO1xuICAgICAgaGVhZGVyLmlzUmVzaXppbmcgPSBjb2x1bW5SZXNpemluZy5pc1Jlc2l6aW5nQ29sdW1uID09PSBoZWFkZXIuaWQ7XG5cbiAgICAgIGlmIChjYW5SZXNpemUpIHtcbiAgICAgICAgaGVhZGVyLmdldFJlc2l6ZXJQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0UmVzaXplclByb3BzLCB7XG4gICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYihpbnN0YW5jZSkge1xuICAgIHZhciBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFJlID0gaW5zdGFuY2UuYXV0b1Jlc2V0UmVzaXplLFxuICAgICAgICBhdXRvUmVzZXRSZXNpemUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUsXG4gICAgICAgIGNvbHVtbnMgPSBpbnN0YW5jZS5jb2x1bW5zO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQWJzb2x1dGVMYXlvdXQnXSwgJ3VzZVJlc2l6ZUNvbHVtbnMnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UmVzaXplID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFJlc2l6ZSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0UmVzaXplKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2NvbHVtbnNdKTtcbiAgICB2YXIgcmVzZXRSZXNpemluZyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHJlc2V0UmVzaXppbmc6IHJlc2V0UmVzaXppbmdcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlYWZIZWFkZXJzKGhlYWRlcikge1xuICAgIHZhciBsZWFmSGVhZGVycyA9IFtdO1xuXG4gICAgdmFyIHJlY3Vyc2VIZWFkZXIgPSBmdW5jdGlvbiByZWN1cnNlSGVhZGVyKGhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlci5jb2x1bW5zICYmIGhlYWRlci5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5tYXAocmVjdXJzZUhlYWRlcik7XG4gICAgICB9XG5cbiAgICAgIGxlYWZIZWFkZXJzLnB1c2goaGVhZGVyKTtcbiAgICB9O1xuXG4gICAgcmVjdXJzZUhlYWRlcihoZWFkZXIpO1xuICAgIHJldHVybiBsZWFmSGVhZGVycztcbiAgfVxuXG4gIHZhciBjZWxsU3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMFxuICB9O1xuICB2YXIgdXNlQWJzb2x1dGVMYXlvdXQgPSBmdW5jdGlvbiB1c2VBYnNvbHV0ZUxheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFRhYmxlQm9keVByb3BzLnB1c2goZ2V0Um93U3R5bGVzKTtcbiAgICBob29rcy5nZXRSb3dQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmLmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY29sdW1uLnRvdGFsTGVmdCArIFwicHhcIixcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldENlbGxQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjZWxsID0gX3JlZjIuY2VsbDtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY2VsbC5jb2x1bW4udG90YWxMZWZ0ICsgXCJweFwiLFxuICAgICAgICAgIHdpZHRoOiBjZWxsLmNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRGb290ZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjMpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcywge1xuICAgICAgICAgIGxlZnQ6IGNvbHVtbi50b3RhbExlZnQgKyBcInB4XCIsXG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgfTtcbiAgdXNlQWJzb2x1dGVMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VBYnNvbHV0ZUxheW91dCc7XG5cbiAgdmFyIGdldFJvd1N0eWxlcyA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6IGluc3RhbmNlLnRvdGFsQ29sdW1uc1dpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGNlbGxTdHlsZXMkMSA9IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMSA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICB3aWR0aDogaW5zdGFuY2UudG90YWxDb2x1bW5zV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgdXNlQmxvY2tMYXlvdXQgPSBmdW5jdGlvbiB1c2VCbG9ja0xheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDEpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMSk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQxKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYzKSB7XG4gICAgICB2YXIgY2VsbCA9IF9yZWYzLmNlbGw7XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZnVuY3Rpb24gKHByb3BzLCBfcmVmNCkge1xuICAgICAgdmFyIGNvbHVtbiA9IF9yZWY0LmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzJDEsIHtcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICB9O1xuICB1c2VCbG9ja0xheW91dC5wbHVnaW5OYW1lID0gJ3VzZUJsb2NrTGF5b3V0JztcblxuICBmdW5jdGlvbiB1c2VGbGV4TGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMpO1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDIpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMik7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQyKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGdldEhlYWRlclByb3BzKTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChnZXRDZWxsUHJvcHMpO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZ2V0Rm9vdGVyUHJvcHMpO1xuICB9XG4gIHVzZUZsZXhMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VGbGV4TGF5b3V0JztcblxuICB2YXIgZ2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMiA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXg6ICcxIDAgYXV0bycsXG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRIZWFkZXJQcm9wcyA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgIGZsZXg6IGNvbHVtbi50b3RhbEZsZXhXaWR0aCA/IGNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiIDogdW5kZWZpbmVkLFxuICAgICAgICBtaW5XaWR0aDogY29sdW1uLnRvdGFsTWluV2lkdGggKyBcInB4XCIsXG4gICAgICAgIHdpZHRoOiBjb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRDZWxsUHJvcHMgPSBmdW5jdGlvbiBnZXRDZWxsUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGNlbGwgPSBfcmVmNC5jZWxsO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjZWxsLmNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiLFxuICAgICAgICBtaW5XaWR0aDogY2VsbC5jb2x1bW4udG90YWxNaW5XaWR0aCArIFwicHhcIixcbiAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0Rm9vdGVyUHJvcHMgPSBmdW5jdGlvbiBnZXRGb290ZXJQcm9wcyhwcm9wcywgX3JlZjUpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjUuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjb2x1bW4udG90YWxGbGV4V2lkdGggPyBjb2x1bW4udG90YWxGbGV4V2lkdGggKyBcIiAwIGF1dG9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluV2lkdGg6IGNvbHVtbi50b3RhbE1pbldpZHRoICsgXCJweFwiLFxuICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiB1c2VHcmlkTGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYyk7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMkMSk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChnZXRIZWFkZXJQcm9wcyQxKTtcbiAgfVxuICB1c2VHcmlkTGF5b3V0LnBsdWdpbk5hbWUgPSAndXNlR3JpZExheW91dCc7XG5cbiAgdmFyIGdldFRhYmxlUHJvcHMkMSA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICAgICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBpbnN0YW5jZS5zdGF0ZS5ncmlkTGF5b3V0LmNvbHVtbldpZHRocy5tYXAoZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSkuam9pbihcIiBcIilcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0SGVhZGVyUHJvcHMkMSA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgaWQ6IFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW4uaWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIiAvL2VuYWJsZXMgYSBzY3JvbGwgd3JhcHBlciB0byBiZSBwbGFjZWQgYXJvdW5kIHRoZSB0YWJsZSBhbmQgaGF2ZSBzdGlja3kgaGVhZGVyc1xuXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRjKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBcImluaXRcIikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZ3JpZExheW91dDoge1xuICAgICAgICAgIGNvbHVtbldpZHRoczogaW5zdGFuY2UuY29sdW1ucy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiY29sdW1uU3RhcnRSZXNpemluZ1wiKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQ7XG4gICAgICB2YXIgY29sdW1uSW5kZXggPSBpbnN0YW5jZS52aXNpYmxlQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIGVsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpO1xuXG4gICAgICBpZiAoZWxXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncmlkTGF5b3V0OiBfZXh0ZW5kcyh7fSwgc3RhdGUuZ3JpZExheW91dCwge1xuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgc3RhcnRpbmdXaWR0aDogZWxXaWR0aFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJjb2x1bW5SZXNpemluZ1wiKSB7XG4gICAgICB2YXIgX3N0YXRlJGdyaWRMYXlvdXQgPSBzdGF0ZS5ncmlkTGF5b3V0LFxuICAgICAgICAgIF9jb2x1bW5JbmRleCA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbkluZGV4LFxuICAgICAgICAgIHN0YXJ0aW5nV2lkdGggPSBfc3RhdGUkZ3JpZExheW91dC5zdGFydGluZ1dpZHRoLFxuICAgICAgICAgIGNvbHVtbldpZHRocyA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbldpZHRocztcbiAgICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5jb2x1bW5SZXNpemluZy5zdGFydFggLSBhY3Rpb24uY2xpZW50WDtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHN0YXJ0aW5nV2lkdGggLSBjaGFuZ2U7XG4gICAgICB2YXIgY29sdW1uV2lkdGhzQ29weSA9IFtdLmNvbmNhdChjb2x1bW5XaWR0aHMpO1xuICAgICAgY29sdW1uV2lkdGhzQ29weVtfY29sdW1uSW5kZXhdID0gbmV3V2lkdGggKyBcInB4XCI7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdyaWRMYXlvdXQ6IF9leHRlbmRzKHt9LCBzdGF0ZS5ncmlkTGF5b3V0LCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBjb2x1bW5XaWR0aHNDb3B5XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpIHtcbiAgICB2YXIgX2RvY3VtZW50JGdldEVsZW1lbnRCO1xuXG4gICAgdmFyIHdpZHRoID0gKF9kb2N1bWVudCRnZXRFbGVtZW50QiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW5JZCkpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jdW1lbnQkZ2V0RWxlbWVudEIub2Zmc2V0V2lkdGg7XG5cbiAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydHMuX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnM7XG4gIGV4cG9ydHMuYWN0aW9ucyA9IGFjdGlvbnM7XG4gIGV4cG9ydHMuZGVmYXVsdENvbHVtbiA9IGRlZmF1bHRDb2x1bW47XG4gIGV4cG9ydHMuZGVmYXVsdEdyb3VwQnlGbiA9IGRlZmF1bHRHcm91cEJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdE9yZGVyQnlGbiA9IGRlZmF1bHRPcmRlckJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdFJlbmRlcmVyID0gZGVmYXVsdFJlbmRlcmVyO1xuICBleHBvcnRzLmVtcHR5UmVuZGVyZXIgPSBlbXB0eVJlbmRlcmVyO1xuICBleHBvcnRzLmVuc3VyZVBsdWdpbk9yZGVyID0gZW5zdXJlUGx1Z2luT3JkZXI7XG4gIGV4cG9ydHMuZmxleFJlbmRlciA9IGZsZXhSZW5kZXI7XG4gIGV4cG9ydHMuZnVuY3Rpb25hbFVwZGF0ZSA9IGZ1bmN0aW9uYWxVcGRhdGU7XG4gIGV4cG9ydHMubG9vcEhvb2tzID0gbG9vcEhvb2tzO1xuICBleHBvcnRzLm1ha2VQcm9wR2V0dGVyID0gbWFrZVByb3BHZXR0ZXI7XG4gIGV4cG9ydHMubWFrZVJlbmRlcmVyID0gbWFrZVJlbmRlcmVyO1xuICBleHBvcnRzLnJlZHVjZUhvb2tzID0gcmVkdWNlSG9va3M7XG4gIGV4cG9ydHMuc2FmZVVzZUxheW91dEVmZmVjdCA9IHNhZmVVc2VMYXlvdXRFZmZlY3Q7XG4gIGV4cG9ydHMudXNlQWJzb2x1dGVMYXlvdXQgPSB1c2VBYnNvbHV0ZUxheW91dDtcbiAgZXhwb3J0cy51c2VBc3luY0RlYm91bmNlID0gdXNlQXN5bmNEZWJvdW5jZTtcbiAgZXhwb3J0cy51c2VCbG9ja0xheW91dCA9IHVzZUJsb2NrTGF5b3V0O1xuICBleHBvcnRzLnVzZUNvbHVtbk9yZGVyID0gdXNlQ29sdW1uT3JkZXI7XG4gIGV4cG9ydHMudXNlRXhwYW5kZWQgPSB1c2VFeHBhbmRlZDtcbiAgZXhwb3J0cy51c2VGaWx0ZXJzID0gdXNlRmlsdGVycztcbiAgZXhwb3J0cy51c2VGbGV4TGF5b3V0ID0gdXNlRmxleExheW91dDtcbiAgZXhwb3J0cy51c2VHZXRMYXRlc3QgPSB1c2VHZXRMYXRlc3Q7XG4gIGV4cG9ydHMudXNlR2xvYmFsRmlsdGVyID0gdXNlR2xvYmFsRmlsdGVyO1xuICBleHBvcnRzLnVzZUdyaWRMYXlvdXQgPSB1c2VHcmlkTGF5b3V0O1xuICBleHBvcnRzLnVzZUdyb3VwQnkgPSB1c2VHcm91cEJ5O1xuICBleHBvcnRzLnVzZU1vdW50ZWRMYXlvdXRFZmZlY3QgPSB1c2VNb3VudGVkTGF5b3V0RWZmZWN0O1xuICBleHBvcnRzLnVzZVBhZ2luYXRpb24gPSB1c2VQYWdpbmF0aW9uO1xuICBleHBvcnRzLnVzZVJlc2l6ZUNvbHVtbnMgPSB1c2VSZXNpemVDb2x1bW5zO1xuICBleHBvcnRzLnVzZVJvd1NlbGVjdCA9IHVzZVJvd1NlbGVjdDtcbiAgZXhwb3J0cy51c2VSb3dTdGF0ZSA9IHVzZVJvd1N0YXRlO1xuICBleHBvcnRzLnVzZVNvcnRCeSA9IHVzZVNvcnRCeTtcbiAgZXhwb3J0cy51c2VUYWJsZSA9IHVzZVRhYmxlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC10YWJsZS5kZXZlbG9wbWVudC5qcy5tYXBcbiIsImlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLnByb2R1Y3Rpb24ubWluLmpzJylcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzJylcbn1cbiIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyB0aW1lb3V0c1NoYXBlIH0gZnJvbSAnLi91dGlscy9Qcm9wVHlwZXMnO1xuaW1wb3J0IFRyYW5zaXRpb25Hcm91cENvbnRleHQgZnJvbSAnLi9UcmFuc2l0aW9uR3JvdXBDb250ZXh0JztcbmV4cG9ydCB2YXIgVU5NT1VOVEVEID0gJ3VubW91bnRlZCc7XG5leHBvcnQgdmFyIEVYSVRFRCA9ICdleGl0ZWQnO1xuZXhwb3J0IHZhciBFTlRFUklORyA9ICdlbnRlcmluZyc7XG5leHBvcnQgdmFyIEVOVEVSRUQgPSAnZW50ZXJlZCc7XG5leHBvcnQgdmFyIEVYSVRJTkcgPSAnZXhpdGluZyc7XG4vKipcbiAqIFRoZSBUcmFuc2l0aW9uIGNvbXBvbmVudCBsZXRzIHlvdSBkZXNjcmliZSBhIHRyYW5zaXRpb24gZnJvbSBvbmUgY29tcG9uZW50XG4gKiBzdGF0ZSB0byBhbm90aGVyIF9vdmVyIHRpbWVfIHdpdGggYSBzaW1wbGUgZGVjbGFyYXRpdmUgQVBJLiBNb3N0IGNvbW1vbmx5XG4gKiBpdCdzIHVzZWQgdG8gYW5pbWF0ZSB0aGUgbW91bnRpbmcgYW5kIHVubW91bnRpbmcgb2YgYSBjb21wb25lbnQsIGJ1dCBjYW4gYWxzb1xuICogYmUgdXNlZCB0byBkZXNjcmliZSBpbi1wbGFjZSB0cmFuc2l0aW9uIHN0YXRlcyBhcyB3ZWxsLlxuICpcbiAqIC0tLVxuICpcbiAqICoqTm90ZSoqOiBgVHJhbnNpdGlvbmAgaXMgYSBwbGF0Zm9ybS1hZ25vc3RpYyBiYXNlIGNvbXBvbmVudC4gSWYgeW91J3JlIHVzaW5nXG4gKiB0cmFuc2l0aW9ucyBpbiBDU1MsIHlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZVxuICogW2BDU1NUcmFuc2l0aW9uYF0oaHR0cHM6Ly9yZWFjdGNvbW11bml0eS5vcmcvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9jc3MtdHJhbnNpdGlvbilcbiAqIGluc3RlYWQuIEl0IGluaGVyaXRzIGFsbCB0aGUgZmVhdHVyZXMgb2YgYFRyYW5zaXRpb25gLCBidXQgY29udGFpbnNcbiAqIGFkZGl0aW9uYWwgZmVhdHVyZXMgbmVjZXNzYXJ5IHRvIHBsYXkgbmljZSB3aXRoIENTUyB0cmFuc2l0aW9ucyAoaGVuY2UgdGhlXG4gKiBuYW1lIG9mIHRoZSBjb21wb25lbnQpLlxuICpcbiAqIC0tLVxuICpcbiAqIEJ5IGRlZmF1bHQgdGhlIGBUcmFuc2l0aW9uYCBjb21wb25lbnQgZG9lcyBub3QgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHRoZVxuICogY29tcG9uZW50IGl0IHJlbmRlcnMsIGl0IG9ubHkgdHJhY2tzIFwiZW50ZXJcIiBhbmQgXCJleGl0XCIgc3RhdGVzIGZvciB0aGVcbiAqIGNvbXBvbmVudHMuIEl0J3MgdXAgdG8geW91IHRvIGdpdmUgbWVhbmluZyBhbmQgZWZmZWN0IHRvIHRob3NlIHN0YXRlcy4gRm9yXG4gKiBleGFtcGxlIHdlIGNhbiBhZGQgc3R5bGVzIHRvIGEgY29tcG9uZW50IHdoZW4gaXQgZW50ZXJzIG9yIGV4aXRzOlxuICpcbiAqIGBgYGpzeFxuICogaW1wb3J0IHsgVHJhbnNpdGlvbiB9IGZyb20gJ3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAnO1xuICpcbiAqIGNvbnN0IGR1cmF0aW9uID0gMzAwO1xuICpcbiAqIGNvbnN0IGRlZmF1bHRTdHlsZSA9IHtcbiAqICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHtkdXJhdGlvbn1tcyBlYXNlLWluLW91dGAsXG4gKiAgIG9wYWNpdHk6IDAsXG4gKiB9XG4gKlxuICogY29uc3QgdHJhbnNpdGlvblN0eWxlcyA9IHtcbiAqICAgZW50ZXJpbmc6IHsgb3BhY2l0eTogMSB9LFxuICogICBlbnRlcmVkOiAgeyBvcGFjaXR5OiAxIH0sXG4gKiAgIGV4aXRpbmc6ICB7IG9wYWNpdHk6IDAgfSxcbiAqICAgZXhpdGVkOiAgeyBvcGFjaXR5OiAwIH0sXG4gKiB9O1xuICpcbiAqIGNvbnN0IEZhZGUgPSAoeyBpbjogaW5Qcm9wIH0pID0+IChcbiAqICAgPFRyYW5zaXRpb24gaW49e2luUHJvcH0gdGltZW91dD17ZHVyYXRpb259PlxuICogICAgIHtzdGF0ZSA9PiAoXG4gKiAgICAgICA8ZGl2IHN0eWxlPXt7XG4gKiAgICAgICAgIC4uLmRlZmF1bHRTdHlsZSxcbiAqICAgICAgICAgLi4udHJhbnNpdGlvblN0eWxlc1tzdGF0ZV1cbiAqICAgICAgIH19PlxuICogICAgICAgICBJJ20gYSBmYWRlIFRyYW5zaXRpb24hXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICApfVxuICogICA8L1RyYW5zaXRpb24+XG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlcmUgYXJlIDQgbWFpbiBzdGF0ZXMgYSBUcmFuc2l0aW9uIGNhbiBiZSBpbjpcbiAqICAtIGAnZW50ZXJpbmcnYFxuICogIC0gYCdlbnRlcmVkJ2BcbiAqICAtIGAnZXhpdGluZydgXG4gKiAgLSBgJ2V4aXRlZCdgXG4gKlxuICogVHJhbnNpdGlvbiBzdGF0ZSBpcyB0b2dnbGVkIHZpYSB0aGUgYGluYCBwcm9wLiBXaGVuIGB0cnVlYCB0aGUgY29tcG9uZW50XG4gKiBiZWdpbnMgdGhlIFwiRW50ZXJcIiBzdGFnZS4gRHVyaW5nIHRoaXMgc3RhZ2UsIHRoZSBjb21wb25lbnQgd2lsbCBzaGlmdCBmcm9tXG4gKiBpdHMgY3VycmVudCB0cmFuc2l0aW9uIHN0YXRlLCB0byBgJ2VudGVyaW5nJ2AgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGVcbiAqIHRyYW5zaXRpb24gYW5kIHRoZW4gdG8gdGhlIGAnZW50ZXJlZCdgIHN0YWdlIG9uY2UgaXQncyBjb21wbGV0ZS4gTGV0J3MgdGFrZVxuICogdGhlIGZvbGxvd2luZyBleGFtcGxlICh3ZSdsbCB1c2UgdGhlXG4gKiBbdXNlU3RhdGVdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9ob29rcy1yZWZlcmVuY2UuaHRtbCN1c2VzdGF0ZSkgaG9vayk6XG4gKlxuICogYGBganN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IFtpblByb3AsIHNldEluUHJvcF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxUcmFuc2l0aW9uIGluPXtpblByb3B9IHRpbWVvdXQ9ezUwMH0+XG4gKiAgICAgICAgIHtzdGF0ZSA9PiAoXG4gKiAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICl9XG4gKiAgICAgICA8L1RyYW5zaXRpb24+XG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldEluUHJvcCh0cnVlKX0+XG4gKiAgICAgICAgIENsaWNrIHRvIEVudGVyXG4gKiAgICAgICA8L2J1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIHRoZSBjb21wb25lbnQgd2lsbCBzaGlmdCB0byB0aGUgYCdlbnRlcmluZydgIHN0YXRlXG4gKiBhbmQgc3RheSB0aGVyZSBmb3IgNTAwbXMgKHRoZSB2YWx1ZSBvZiBgdGltZW91dGApIGJlZm9yZSBpdCBmaW5hbGx5IHN3aXRjaGVzXG4gKiB0byBgJ2VudGVyZWQnYC5cbiAqXG4gKiBXaGVuIGBpbmAgaXMgYGZhbHNlYCB0aGUgc2FtZSB0aGluZyBoYXBwZW5zIGV4Y2VwdCB0aGUgc3RhdGUgbW92ZXMgZnJvbVxuICogYCdleGl0aW5nJ2AgdG8gYCdleGl0ZWQnYC5cbiAqL1xuXG52YXIgVHJhbnNpdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShUcmFuc2l0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpIHx8IHRoaXM7XG4gICAgdmFyIHBhcmVudEdyb3VwID0gY29udGV4dDsgLy8gSW4gdGhlIGNvbnRleHQgb2YgYSBUcmFuc2l0aW9uR3JvdXAgYWxsIGVudGVycyBhcmUgcmVhbGx5IGFwcGVhcnNcblxuICAgIHZhciBhcHBlYXIgPSBwYXJlbnRHcm91cCAmJiAhcGFyZW50R3JvdXAuaXNNb3VudGluZyA/IHByb3BzLmVudGVyIDogcHJvcHMuYXBwZWFyO1xuICAgIHZhciBpbml0aWFsU3RhdHVzO1xuICAgIF90aGlzLmFwcGVhclN0YXR1cyA9IG51bGw7XG5cbiAgICBpZiAocHJvcHMuaW4pIHtcbiAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IEVYSVRFRDtcbiAgICAgICAgX3RoaXMuYXBwZWFyU3RhdHVzID0gRU5URVJJTkc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRU5URVJFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLnVubW91bnRPbkV4aXQgfHwgcHJvcHMubW91bnRPbkVudGVyKSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBVTk1PVU5URUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRVhJVEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc3RhdHVzOiBpbml0aWFsU3RhdHVzXG4gICAgfTtcbiAgICBfdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRyYW5zaXRpb24uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKF9yZWYsIHByZXZTdGF0ZSkge1xuICAgIHZhciBuZXh0SW4gPSBfcmVmLmluO1xuXG4gICAgaWYgKG5leHRJbiAmJiBwcmV2U3RhdGUuc3RhdHVzID09PSBVTk1PVU5URUQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHByZXZQcm9wcykge1xuICAvLyAgIGxldCBuZXh0U3RhdHVzID0gbnVsbFxuICAvLyAgIGlmIChwcmV2UHJvcHMgIT09IHRoaXMucHJvcHMpIHtcbiAgLy8gICAgIGNvbnN0IHsgc3RhdHVzIH0gPSB0aGlzLnN0YXRlXG4gIC8vICAgICBpZiAodGhpcy5wcm9wcy5pbikge1xuICAvLyAgICAgICBpZiAoc3RhdHVzICE9PSBFTlRFUklORyAmJiBzdGF0dXMgIT09IEVOVEVSRUQpIHtcbiAgLy8gICAgICAgICBuZXh0U3RhdHVzID0gRU5URVJJTkdcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcgfHwgc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gIC8vICAgICAgICAgbmV4dFN0YXR1cyA9IEVYSVRJTkdcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4geyBuZXh0U3RhdHVzIH1cbiAgLy8gfVxuICA7XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zaXRpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKHRydWUsIHRoaXMuYXBwZWFyU3RhdHVzKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBuZXh0U3RhdHVzID0gbnVsbDtcblxuICAgIGlmIChwcmV2UHJvcHMgIT09IHRoaXMucHJvcHMpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgICAgaWYgKHRoaXMucHJvcHMuaW4pIHtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gRU5URVJJTkcgJiYgc3RhdHVzICE9PSBFTlRFUkVEKSB7XG4gICAgICAgICAgbmV4dFN0YXR1cyA9IEVOVEVSSU5HO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBFTlRFUklORyB8fCBzdGF0dXMgPT09IEVOVEVSRUQpIHtcbiAgICAgICAgICBuZXh0U3RhdHVzID0gRVhJVElORztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzKGZhbHNlLCBuZXh0U3RhdHVzKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmNhbmNlbE5leHRDYWxsYmFjaygpO1xuICB9O1xuXG4gIF9wcm90by5nZXRUaW1lb3V0cyA9IGZ1bmN0aW9uIGdldFRpbWVvdXRzKCkge1xuICAgIHZhciB0aW1lb3V0ID0gdGhpcy5wcm9wcy50aW1lb3V0O1xuICAgIHZhciBleGl0LCBlbnRlciwgYXBwZWFyO1xuICAgIGV4aXQgPSBlbnRlciA9IGFwcGVhciA9IHRpbWVvdXQ7XG5cbiAgICBpZiAodGltZW91dCAhPSBudWxsICYmIHR5cGVvZiB0aW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgZXhpdCA9IHRpbWVvdXQuZXhpdDtcbiAgICAgIGVudGVyID0gdGltZW91dC5lbnRlcjsgLy8gVE9ETzogcmVtb3ZlIGZhbGxiYWNrIGZvciBuZXh0IG1ham9yXG5cbiAgICAgIGFwcGVhciA9IHRpbWVvdXQuYXBwZWFyICE9PSB1bmRlZmluZWQgPyB0aW1lb3V0LmFwcGVhciA6IGVudGVyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBleGl0OiBleGl0LFxuICAgICAgZW50ZXI6IGVudGVyLFxuICAgICAgYXBwZWFyOiBhcHBlYXJcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by51cGRhdGVTdGF0dXMgPSBmdW5jdGlvbiB1cGRhdGVTdGF0dXMobW91bnRpbmcsIG5leHRTdGF0dXMpIHtcbiAgICBpZiAobW91bnRpbmcgPT09IHZvaWQgMCkge1xuICAgICAgbW91bnRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgLy8gbmV4dFN0YXR1cyB3aWxsIGFsd2F5cyBiZSBFTlRFUklORyBvciBFWElUSU5HLlxuICAgICAgdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcblxuICAgICAgaWYgKG5leHRTdGF0dXMgPT09IEVOVEVSSU5HKSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUVudGVyKG1vdW50aW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUV4aXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMudW5tb3VudE9uRXhpdCAmJiB0aGlzLnN0YXRlLnN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBVTk1PVU5URURcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucGVyZm9ybUVudGVyID0gZnVuY3Rpb24gcGVyZm9ybUVudGVyKG1vdW50aW5nKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgZW50ZXIgPSB0aGlzLnByb3BzLmVudGVyO1xuICAgIHZhciBhcHBlYXJpbmcgPSB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQuaXNNb3VudGluZyA6IG1vdW50aW5nO1xuXG4gICAgdmFyIF9yZWYyID0gdGhpcy5wcm9wcy5ub2RlUmVmID8gW2FwcGVhcmluZ10gOiBbUmVhY3RET00uZmluZERPTU5vZGUodGhpcyksIGFwcGVhcmluZ10sXG4gICAgICAgIG1heWJlTm9kZSA9IF9yZWYyWzBdLFxuICAgICAgICBtYXliZUFwcGVhcmluZyA9IF9yZWYyWzFdO1xuXG4gICAgdmFyIHRpbWVvdXRzID0gdGhpcy5nZXRUaW1lb3V0cygpO1xuICAgIHZhciBlbnRlclRpbWVvdXQgPSBhcHBlYXJpbmcgPyB0aW1lb3V0cy5hcHBlYXIgOiB0aW1lb3V0cy5lbnRlcjsgLy8gbm8gZW50ZXIgYW5pbWF0aW9uIHNraXAgcmlnaHQgdG8gRU5URVJFRFxuICAgIC8vIGlmIHdlIGFyZSBtb3VudGluZyBhbmQgcnVubmluZyB0aGlzIGl0IG1lYW5zIGFwcGVhciBfbXVzdF8gYmUgc2V0XG5cbiAgICBpZiAoIW1vdW50aW5nICYmICFlbnRlciB8fCBjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgc3RhdHVzOiBFTlRFUkVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5wcm9wcy5vbkVudGVyZWQobWF5YmVOb2RlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25FbnRlcihtYXliZU5vZGUsIG1heWJlQXBwZWFyaW5nKTtcbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6IEVOVEVSSU5HXG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJpbmcobWF5YmVOb2RlLCBtYXliZUFwcGVhcmluZyk7XG5cbiAgICAgIF90aGlzMi5vblRyYW5zaXRpb25FbmQoZW50ZXJUaW1lb3V0LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgIHN0YXR1czogRU5URVJFRFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uRW50ZXJlZChtYXliZU5vZGUsIG1heWJlQXBwZWFyaW5nKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8ucGVyZm9ybUV4aXQgPSBmdW5jdGlvbiBwZXJmb3JtRXhpdCgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBleGl0ID0gdGhpcy5wcm9wcy5leGl0O1xuICAgIHZhciB0aW1lb3V0cyA9IHRoaXMuZ2V0VGltZW91dHMoKTtcbiAgICB2YXIgbWF5YmVOb2RlID0gdGhpcy5wcm9wcy5ub2RlUmVmID8gdW5kZWZpbmVkIDogUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk7IC8vIG5vIGV4aXQgYW5pbWF0aW9uIHNraXAgcmlnaHQgdG8gRVhJVEVEXG5cbiAgICBpZiAoIWV4aXQgfHwgY29uZmlnLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgIHN0YXR1czogRVhJVEVEXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMy5wcm9wcy5vbkV4aXRlZChtYXliZU5vZGUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vbkV4aXQobWF5YmVOb2RlKTtcbiAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICBzdGF0dXM6IEVYSVRJTkdcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczMucHJvcHMub25FeGl0aW5nKG1heWJlTm9kZSk7XG5cbiAgICAgIF90aGlzMy5vblRyYW5zaXRpb25FbmQodGltZW91dHMuZXhpdCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMuc2FmZVNldFN0YXRlKHtcbiAgICAgICAgICBzdGF0dXM6IEVYSVRFRFxuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMzLnByb3BzLm9uRXhpdGVkKG1heWJlTm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmNhbmNlbE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIGNhbmNlbE5leHRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5uZXh0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCgpO1xuICAgICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2FmZVNldFN0YXRlID0gZnVuY3Rpb24gc2FmZVNldFN0YXRlKG5leHRTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAvLyBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCB0aGVyZSBhcmUgd2VpcmQgcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAvLyBzZXRTdGF0ZSBjYWxsYmFja3MgYW5kIHVubW91bnRpbmcgaW4gdGVzdGluZywgc28gYWx3YXlzIG1ha2Ugc3VyZSB0aGF0XG4gICAgLy8gd2UgY2FuIGNhbmNlbCBhbnkgcGVuZGluZyBzZXRTdGF0ZSBjYWxsYmFja3MgYWZ0ZXIgd2UgdW5tb3VudC5cbiAgICBjYWxsYmFjayA9IHRoaXMuc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKTtcbiAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIF9wcm90by5zZXROZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiBzZXROZXh0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBhY3RpdmUgPSB0cnVlO1xuXG4gICAgdGhpcy5uZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIF90aGlzNC5uZXh0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubmV4dENhbGxiYWNrLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5uZXh0Q2FsbGJhY2s7XG4gIH07XG5cbiAgX3Byb3RvLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZCh0aW1lb3V0LCBoYW5kbGVyKSB7XG4gICAgdGhpcy5zZXROZXh0Q2FsbGJhY2soaGFuZGxlcik7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyB0aGlzLnByb3BzLm5vZGVSZWYuY3VycmVudCA6IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIHZhciBkb2VzTm90SGF2ZVRpbWVvdXRPckxpc3RlbmVyID0gdGltZW91dCA9PSBudWxsICYmICF0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyO1xuXG4gICAgaWYgKCFub2RlIHx8IGRvZXNOb3RIYXZlVGltZW91dE9yTGlzdGVuZXIpIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyKSB7XG4gICAgICB2YXIgX3JlZjMgPSB0aGlzLnByb3BzLm5vZGVSZWYgPyBbdGhpcy5uZXh0Q2FsbGJhY2tdIDogW25vZGUsIHRoaXMubmV4dENhbGxiYWNrXSxcbiAgICAgICAgICBtYXliZU5vZGUgPSBfcmVmM1swXSxcbiAgICAgICAgICBtYXliZU5leHRDYWxsYmFjayA9IF9yZWYzWzFdO1xuXG4gICAgICB0aGlzLnByb3BzLmFkZEVuZExpc3RlbmVyKG1heWJlTm9kZSwgbWF5YmVOZXh0Q2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHNldFRpbWVvdXQodGhpcy5uZXh0Q2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgX2luID0gX3RoaXMkcHJvcHMuaW4sXG4gICAgICAgIF9tb3VudE9uRW50ZXIgPSBfdGhpcyRwcm9wcy5tb3VudE9uRW50ZXIsXG4gICAgICAgIF91bm1vdW50T25FeGl0ID0gX3RoaXMkcHJvcHMudW5tb3VudE9uRXhpdCxcbiAgICAgICAgX2FwcGVhciA9IF90aGlzJHByb3BzLmFwcGVhcixcbiAgICAgICAgX2VudGVyID0gX3RoaXMkcHJvcHMuZW50ZXIsXG4gICAgICAgIF9leGl0ID0gX3RoaXMkcHJvcHMuZXhpdCxcbiAgICAgICAgX3RpbWVvdXQgPSBfdGhpcyRwcm9wcy50aW1lb3V0LFxuICAgICAgICBfYWRkRW5kTGlzdGVuZXIgPSBfdGhpcyRwcm9wcy5hZGRFbmRMaXN0ZW5lcixcbiAgICAgICAgX29uRW50ZXIgPSBfdGhpcyRwcm9wcy5vbkVudGVyLFxuICAgICAgICBfb25FbnRlcmluZyA9IF90aGlzJHByb3BzLm9uRW50ZXJpbmcsXG4gICAgICAgIF9vbkVudGVyZWQgPSBfdGhpcyRwcm9wcy5vbkVudGVyZWQsXG4gICAgICAgIF9vbkV4aXQgPSBfdGhpcyRwcm9wcy5vbkV4aXQsXG4gICAgICAgIF9vbkV4aXRpbmcgPSBfdGhpcyRwcm9wcy5vbkV4aXRpbmcsXG4gICAgICAgIF9vbkV4aXRlZCA9IF90aGlzJHByb3BzLm9uRXhpdGVkLFxuICAgICAgICBfbm9kZVJlZiA9IF90aGlzJHByb3BzLm5vZGVSZWYsXG4gICAgICAgIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfdGhpcyRwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJpblwiLCBcIm1vdW50T25FbnRlclwiLCBcInVubW91bnRPbkV4aXRcIiwgXCJhcHBlYXJcIiwgXCJlbnRlclwiLCBcImV4aXRcIiwgXCJ0aW1lb3V0XCIsIFwiYWRkRW5kTGlzdGVuZXJcIiwgXCJvbkVudGVyXCIsIFwib25FbnRlcmluZ1wiLCBcIm9uRW50ZXJlZFwiLCBcIm9uRXhpdFwiLCBcIm9uRXhpdGluZ1wiLCBcIm9uRXhpdGVkXCIsIFwibm9kZVJlZlwiXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgLy8gYWxsb3dzIGZvciBuZXN0ZWQgVHJhbnNpdGlvbnNcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSwgdHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nID8gY2hpbGRyZW4oc3RhdHVzLCBjaGlsZFByb3BzKSA6IFJlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwgY2hpbGRQcm9wcykpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5jb250ZXh0VHlwZSA9IFRyYW5zaXRpb25Hcm91cENvbnRleHQ7XG5UcmFuc2l0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqXG4gICAqIEEgUmVhY3QgcmVmZXJlbmNlIHRvIERPTSBlbGVtZW50IHRoYXQgbmVlZCB0byB0cmFuc2l0aW9uOlxuICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTExMjcxMzAvNDY3MTkzMlxuICAgKlxuICAgKiAgIC0gV2hlbiBgbm9kZVJlZmAgcHJvcCBpcyB1c2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZCB0byBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICogICAgICAoZS5nLiBgb25FbnRlcmApIGJlY2F1c2UgdXNlciBhbHJlYWR5IGhhcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBub2RlLlxuICAgKiAgIC0gV2hlbiBjaGFuZ2luZyBga2V5YCBwcm9wIG9mIGBUcmFuc2l0aW9uYCBpbiBhIGBUcmFuc2l0aW9uR3JvdXBgIGEgbmV3XG4gICAqICAgICBgbm9kZVJlZmAgbmVlZCB0byBiZSBwcm92aWRlZCB0byBgVHJhbnNpdGlvbmAgd2l0aCBjaGFuZ2VkIGBrZXlgIHByb3BcbiAgICogICAgIChzZWVcbiAgICogICAgIFt0ZXN0L0NTU1RyYW5zaXRpb24tdGVzdC5qc10oaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cC9ibG9iLzEzNDM1Zjg5N2IzYWI3MWY2ZTE5ZDcyNGYxNDU1OTZmNTkxMDU4MWMvdGVzdC9DU1NUcmFuc2l0aW9uLXRlc3QuanMjTDM2Mi1MNDM3KSkuXG4gICAqL1xuICBub2RlUmVmOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGN1cnJlbnQ6IHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/IFByb3BUeXBlcy5hbnkgOiBmdW5jdGlvbiAocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHZhbHVlID0gcHJvcFZhbHVlW2tleV07XG4gICAgICByZXR1cm4gUHJvcFR5cGVzLmluc3RhbmNlT2YodmFsdWUgJiYgJ293bmVyRG9jdW1lbnQnIGluIHZhbHVlID8gdmFsdWUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5FbGVtZW50IDogRWxlbWVudCkocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCk7XG4gICAgfVxuICB9KSxcblxuICAvKipcbiAgICogQSBgZnVuY3Rpb25gIGNoaWxkIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBSZWFjdCBlbGVtZW50LiBUaGlzIGZ1bmN0aW9uIGlzXG4gICAqIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IHRyYW5zaXRpb24gc3RhdHVzIChgJ2VudGVyaW5nJ2AsIGAnZW50ZXJlZCdgLFxuICAgKiBgJ2V4aXRpbmcnYCwgYCdleGl0ZWQnYCksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFwcGx5IGNvbnRleHRcbiAgICogc3BlY2lmaWMgcHJvcHMgdG8gYSBjb21wb25lbnQuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiA8VHJhbnNpdGlvbiBpbj17dGhpcy5zdGF0ZS5pbn0gdGltZW91dD17MTUwfT5cbiAgICogICB7c3RhdGUgPT4gKFxuICAgKiAgICAgPE15Q29tcG9uZW50IGNsYXNzTmFtZT17YGZhZGUgZmFkZS0ke3N0YXRlfWB9IC8+XG4gICAqICAgKX1cbiAgICogPC9UcmFuc2l0aW9uPlxuICAgKiBgYGBcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLCBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkXSkuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBzdGF0ZXNcbiAgICovXG4gIGluOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgY2hpbGQgY29tcG9uZW50IGlzIG1vdW50ZWQgaW1tZWRpYXRlbHkgYWxvbmcgd2l0aFxuICAgKiB0aGUgcGFyZW50IGBUcmFuc2l0aW9uYCBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIFwibGF6eSBtb3VudFwiIHRoZSBjb21wb25lbnQgb24gdGhlXG4gICAqIGZpcnN0IGBpbj17dHJ1ZX1gIHlvdSBjYW4gc2V0IGBtb3VudE9uRW50ZXJgLiBBZnRlciB0aGUgZmlyc3QgZW50ZXIgdHJhbnNpdGlvbiB0aGUgY29tcG9uZW50IHdpbGwgc3RheVxuICAgKiBtb3VudGVkLCBldmVuIG9uIFwiZXhpdGVkXCIsIHVubGVzcyB5b3UgYWxzbyBzcGVjaWZ5IGB1bm1vdW50T25FeGl0YC5cbiAgICovXG4gIG1vdW50T25FbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGNoaWxkIGNvbXBvbmVudCBzdGF5cyBtb3VudGVkIGFmdGVyIGl0IHJlYWNoZXMgdGhlIGAnZXhpdGVkJ2Agc3RhdGUuXG4gICAqIFNldCBgdW5tb3VudE9uRXhpdGAgaWYgeW91J2QgcHJlZmVyIHRvIHVubW91bnQgdGhlIGNvbXBvbmVudCBhZnRlciBpdCBmaW5pc2hlcyBleGl0aW5nLlxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGNoaWxkIGNvbXBvbmVudCBkb2VzIG5vdCBwZXJmb3JtIHRoZSBlbnRlciB0cmFuc2l0aW9uIHdoZW5cbiAgICogaXQgZmlyc3QgbW91bnRzLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBgaW5gLiBJZiB5b3Ugd2FudCB0aGlzXG4gICAqIGJlaGF2aW9yLCBzZXQgYm90aCBgYXBwZWFyYCBhbmQgYGluYCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqID4gKipOb3RlKio6IHRoZXJlIGFyZSBubyBzcGVjaWFsIGFwcGVhciBzdGF0ZXMgbGlrZSBgYXBwZWFyaW5nYC9gYXBwZWFyZWRgLCB0aGlzIHByb3BcbiAgICogPiBvbmx5IGFkZHMgYW4gYWRkaXRpb25hbCBlbnRlciB0cmFuc2l0aW9uLiBIb3dldmVyLCBpbiB0aGVcbiAgICogPiBgPENTU1RyYW5zaXRpb24+YCBjb21wb25lbnQgdGhhdCBmaXJzdCBlbnRlciB0cmFuc2l0aW9uIGRvZXMgcmVzdWx0IGluXG4gICAqID4gYWRkaXRpb25hbCBgLmFwcGVhci0qYCBjbGFzc2VzLCB0aGF0IHdheSB5b3UgY2FuIGNob29zZSB0byBzdHlsZSBpdFxuICAgKiA+IGRpZmZlcmVudGx5LlxuICAgKi9cbiAgYXBwZWFyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgZW50ZXIgdHJhbnNpdGlvbnMuXG4gICAqL1xuICBlbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIGV4aXQgdHJhbnNpdGlvbnMuXG4gICAqL1xuICBleGl0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFJlcXVpcmVkIHVubGVzcyBgYWRkRW5kTGlzdGVuZXJgIGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBZb3UgbWF5IHNwZWNpZnkgYSBzaW5nbGUgdGltZW91dCBmb3IgYWxsIHRyYW5zaXRpb25zOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogdGltZW91dD17NTAwfVxuICAgKiBgYGBcbiAgICpcbiAgICogb3IgaW5kaXZpZHVhbGx5OlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogdGltZW91dD17e1xuICAgKiAgYXBwZWFyOiA1MDAsXG4gICAqICBlbnRlcjogMzAwLFxuICAgKiAgZXhpdDogNTAwLFxuICAgKiB9fVxuICAgKiBgYGBcbiAgICpcbiAgICogLSBgYXBwZWFyYCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgYGVudGVyYFxuICAgKiAtIGBlbnRlcmAgZGVmYXVsdHMgdG8gYDBgXG4gICAqIC0gYGV4aXRgIGRlZmF1bHRzIHRvIGAwYFxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgeyBlbnRlcj86IG51bWJlciwgZXhpdD86IG51bWJlciwgYXBwZWFyPzogbnVtYmVyIH19XG4gICAqL1xuICB0aW1lb3V0OiBmdW5jdGlvbiB0aW1lb3V0KHByb3BzKSB7XG4gICAgdmFyIHB0ID0gdGltZW91dHNTaGFwZTtcbiAgICBpZiAoIXByb3BzLmFkZEVuZExpc3RlbmVyKSBwdCA9IHB0LmlzUmVxdWlyZWQ7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHQuYXBwbHkodm9pZCAwLCBbcHJvcHNdLmNvbmNhdChhcmdzKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZCBhIGN1c3RvbSB0cmFuc2l0aW9uIGVuZCB0cmlnZ2VyLiBDYWxsZWQgd2l0aCB0aGUgdHJhbnNpdGlvbmluZ1xuICAgKiBET00gbm9kZSBhbmQgYSBgZG9uZWAgY2FsbGJhY2suIEFsbG93cyBmb3IgbW9yZSBmaW5lIGdyYWluZWQgdHJhbnNpdGlvbiBlbmRcbiAgICogbG9naWMuIFRpbWVvdXRzIGFyZSBzdGlsbCB1c2VkIGFzIGEgZmFsbGJhY2sgaWYgcHJvdmlkZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiBhZGRFbmRMaXN0ZW5lcj17KG5vZGUsIGRvbmUpID0+IHtcbiAgICogICAvLyB1c2UgdGhlIGNzcyB0cmFuc2l0aW9uZW5kIGV2ZW50IHRvIG1hcmsgdGhlIGZpbmlzaCBvZiBhIHRyYW5zaXRpb25cbiAgICogICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBkb25lLCBmYWxzZSk7XG4gICAqIH19XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRW5kTGlzdGVuZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZW50ZXJpbmdcIiBzdGF0dXMgaXMgYXBwbGllZC4gQW4gZXh0cmEgcGFyYW1ldGVyXG4gICAqIGBpc0FwcGVhcmluZ2AgaXMgc3VwcGxpZWQgdG8gaW5kaWNhdGUgaWYgdGhlIGVudGVyIHN0YWdlIGlzIG9jY3VycmluZyBvbiB0aGUgaW5pdGlhbCBtb3VudFxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCwgaXNBcHBlYXJpbmc6IGJvb2wpIC0+IHZvaWRcbiAgICovXG4gIG9uRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJlbnRlcmluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLiBBbiBleHRyYSBwYXJhbWV0ZXJcbiAgICogYGlzQXBwZWFyaW5nYCBpcyBzdXBwbGllZCB0byBpbmRpY2F0ZSBpZiB0aGUgZW50ZXIgc3RhZ2UgaXMgb2NjdXJyaW5nIG9uIHRoZSBpbml0aWFsIG1vdW50XG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWQuXG4gICAqXG4gICAqIEB0eXBlIEZ1bmN0aW9uKG5vZGU6IEh0bWxFbGVtZW50LCBpc0FwcGVhcmluZzogYm9vbClcbiAgICovXG4gIG9uRW50ZXJpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJlbnRlcmVkXCIgc3RhdHVzIGlzIGFwcGxpZWQuIEFuIGV4dHJhIHBhcmFtZXRlclxuICAgKiBgaXNBcHBlYXJpbmdgIGlzIHN1cHBsaWVkIHRvIGluZGljYXRlIGlmIHRoZSBlbnRlciBzdGFnZSBpcyBvY2N1cnJpbmcgb24gdGhlIGluaXRpYWwgbW91bnRcbiAgICpcbiAgICogKipOb3RlKio6IHdoZW4gYG5vZGVSZWZgIHByb3AgaXMgcGFzc2VkLCBgbm9kZWAgaXMgbm90IHBhc3NlZC5cbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQsIGlzQXBwZWFyaW5nOiBib29sKSAtPiB2b2lkXG4gICAqL1xuICBvbkVudGVyZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZXhpdGluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCkgLT4gdm9pZFxuICAgKi9cbiAgb25FeGl0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGluZ1wiIHN0YXR1cyBpcyBhcHBsaWVkLlxuICAgKlxuICAgKiAqKk5vdGUqKjogd2hlbiBgbm9kZVJlZmAgcHJvcCBpcyBwYXNzZWQsIGBub2RlYCBpcyBub3QgcGFzc2VkLlxuICAgKlxuICAgKiBAdHlwZSBGdW5jdGlvbihub2RlOiBIdG1sRWxlbWVudCkgLT4gdm9pZFxuICAgKi9cbiAgb25FeGl0aW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGVkXCIgc3RhdHVzIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqICoqTm90ZSoqOiB3aGVuIGBub2RlUmVmYCBwcm9wIGlzIHBhc3NlZCwgYG5vZGVgIGlzIG5vdCBwYXNzZWRcbiAgICpcbiAgICogQHR5cGUgRnVuY3Rpb24obm9kZTogSHRtbEVsZW1lbnQpIC0+IHZvaWRcbiAgICovXG4gIG9uRXhpdGVkOiBQcm9wVHlwZXMuZnVuY1xufSA6IHt9OyAvLyBOYW1lIHRoZSBmdW5jdGlvbiBzbyBpdCBpcyBjbGVhcmVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5UcmFuc2l0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgaW46IGZhbHNlLFxuICBtb3VudE9uRW50ZXI6IGZhbHNlLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgYXBwZWFyOiBmYWxzZSxcbiAgZW50ZXI6IHRydWUsXG4gIGV4aXQ6IHRydWUsXG4gIG9uRW50ZXI6IG5vb3AsXG4gIG9uRW50ZXJpbmc6IG5vb3AsXG4gIG9uRW50ZXJlZDogbm9vcCxcbiAgb25FeGl0OiBub29wLFxuICBvbkV4aXRpbmc6IG5vb3AsXG4gIG9uRXhpdGVkOiBub29wXG59O1xuVHJhbnNpdGlvbi5VTk1PVU5URUQgPSBVTk1PVU5URUQ7XG5UcmFuc2l0aW9uLkVYSVRFRCA9IEVYSVRFRDtcblRyYW5zaXRpb24uRU5URVJJTkcgPSBFTlRFUklORztcblRyYW5zaXRpb24uRU5URVJFRCA9IEVOVEVSRUQ7XG5UcmFuc2l0aW9uLkVYSVRJTkcgPSBFWElUSU5HO1xuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIGRpc2FibGVkOiBmYWxzZVxufTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuZXhwb3J0IHZhciB0aW1lb3V0c1NoYXBlID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gIGVudGVyOiBQcm9wVHlwZXMubnVtYmVyLFxuICBleGl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBhcHBlYXI6IFByb3BUeXBlcy5udW1iZXJcbn0pLmlzUmVxdWlyZWRdKSA6IG51bGw7XG5leHBvcnQgdmFyIGNsYXNzTmFtZXNTaGFwZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuc2hhcGUoe1xuICBlbnRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgZXhpdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWN0aXZlOiBQcm9wVHlwZXMuc3RyaW5nXG59KSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgZW50ZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGVudGVyRG9uZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZW50ZXJBY3RpdmU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGV4aXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGV4aXREb25lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBleGl0QWN0aXZlOiBQcm9wVHlwZXMuc3RyaW5nXG59KV0pIDogbnVsbDsiLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAweGVhY2E7XG5leHBvcnRzLkZyYWdtZW50ID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBleHBvcnRzLkZyYWdtZW50ID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBleHBvcnRzLkZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bjtcbnZhciBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjtcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIHNlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IHNlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JmY3MvcHVsbC8xMDdcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuZnVuY3Rpb24ganN4REVWKHR5cGUsIGNvbmZpZywgbWF5YmVLZXksIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICB2YXIga2V5ID0gbnVsbDtcbiAgICB2YXIgcmVmID0gbnVsbDsgLy8gQ3VycmVudGx5LCBrZXkgY2FuIGJlIHNwcmVhZCBpbiBhcyBhIHByb3AuIFRoaXMgY2F1c2VzIGEgcG90ZW50aWFsXG4gICAgLy8gaXNzdWUgaWYga2V5IGlzIGFsc28gZXhwbGljaXRseSBkZWNsYXJlZCAoaWUuIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+XG4gICAgLy8gb3IgPGRpdiBrZXk9XCJIaVwiIHsuLi5wcm9wc30gLz4gKS4gV2Ugd2FudCB0byBkZXByZWNhdGUga2V5IHNwcmVhZCxcbiAgICAvLyBidXQgYXMgYW4gaW50ZXJtZWRpYXJ5IHN0ZXAsIHdlIHdpbGwgdXNlIGpzeERFViBmb3IgZXZlcnl0aGluZyBleGNlcHRcbiAgICAvLyA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPiwgYmVjYXVzZSB3ZSBhcmVuJ3QgY3VycmVudGx5IGFibGUgdG8gdGVsbCBpZlxuICAgIC8vIGtleSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGJlIHVuZGVmaW5lZCBvciBub3QuXG5cbiAgICBpZiAobWF5YmVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gJycgKyBtYXliZUtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZik7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gICAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAge1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB7XG4gICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICAgIGlmICghaW5mbykge1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpO1xuXG4gICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZVN0cmluZztcblxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgc291cmNlLCBzZWxmKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0NoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2ldLCB0eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCdSZWFjdC5qc3g6IFN0YXRpYyBjaGlsZHJlbiBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LiAnICsgJ1lvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gJyArICdVc2UgdGhlIEJhYmVsIHRyYW5zZm9ybSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbiwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuanN4ID0ganN4O1xuZXhwb3J0cy5qc3hzID0ganN4cztcbiAgfSkoKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbmV4cG9ydHMuRnJhZ21lbnQgPSAweGVhY2I7XG5leHBvcnRzLlN0cmljdE1vZGUgPSAweGVhY2M7XG5leHBvcnRzLlByb2ZpbGVyID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG5leHBvcnRzLlN1c3BlbnNlID0gMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSAweGVhZDk7XG52YXIgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSAweGVhZGE7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IDB4ZWFkNTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gMHhlYWQ3O1xudmFyIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gMHhlYWUwO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gMHhlYWUxO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gMHhlYWUyO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IDB4ZWFlMztcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wb3J0YWwnKTtcbiAgZXhwb3J0cy5GcmFnbWVudCA9IHN5bWJvbEZvcigncmVhY3QuZnJhZ21lbnQnKTtcbiAgZXhwb3J0cy5TdHJpY3RNb2RlID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBleHBvcnRzLlByb2ZpbGVyID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgZXhwb3J0cy5TdXNwZW5zZSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogMFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYWN0KCkgdG8gdHJhY2sgd2hldGhlciB5b3UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlLlxuICovXG52YXIgSXNTb21lUmVuZGVyZXJBY3RpbmcgPSB7XG4gIGN1cnJlbnQ6IGZhbHNlXG59O1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyLFxuICBJc1NvbWVSZW5kZXJlckFjdGluZzogSXNTb21lUmVuZGVyZXJBY3RpbmcsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAoISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiICk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5cbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIGV4cG9ydHMuUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdHJpY3RNb2RlOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gJycgKyBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSBudWxsICYmIHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignY3JlYXRlQ29udGV4dDogRXhwZWN0ZWQgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjYWxjdWxhdGVDaGFuZ2VkQml0cyxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHNcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG4gICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gZGVmYXVsdEV4cG9ydDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHJldHVybiBwYXlsb2FkLl9yZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAocmVuZGVyLmRpc3BsYXlOYW1lID09IG51bGwpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IGV4cG9ydHMuUHJvZmlsZXIgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdHJpY3RNb2RlIHx8IHR5cGUgPT09IGV4cG9ydHMuU3VzcGVuc2UgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICBpZiAoIShkaXNwYXRjaGVyICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgaWYgKHVuc3RhYmxlX29ic2VydmVkQml0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcigndXNlQ29udGV4dCgpIHNlY29uZCBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlICcgKyAndXNlIGluIFJlYWN0LiBQYXNzaW5nIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHBhc3NlZDogJXMuJXMnLCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMsIHR5cGVvZiB1bnN0YWJsZV9vYnNlcnZlZEJpdHMgPT09ICdudW1iZXInICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzJdKSA/ICdcXG5cXG5EaWQgeW91IGNhbGwgYXJyYXkubWFwKHVzZUNvbnRleHQpPyAnICsgJ0NhbGxpbmcgSG9va3MgaW5zaWRlIGEgbG9vcCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyA6ICcnKTtcbiAgICB9IC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cblxuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cyk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuU3VzcGVuc2U6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxue1xuXG4gIHRyeSB7XG4gICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW2Zyb3plbk9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtmcm96ZW5PYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJleHBvcnQgdmFyIEtFWV9QUkVGSVggPSAncGVyc2lzdDonO1xuZXhwb3J0IHZhciBGTFVTSCA9ICdwZXJzaXN0L0ZMVVNIJztcbmV4cG9ydCB2YXIgUkVIWURSQVRFID0gJ3BlcnNpc3QvUkVIWURSQVRFJztcbmV4cG9ydCB2YXIgUEFVU0UgPSAncGVyc2lzdC9QQVVTRSc7XG5leHBvcnQgdmFyIFBFUlNJU1QgPSAncGVyc2lzdC9QRVJTSVNUJztcbmV4cG9ydCB2YXIgUFVSR0UgPSAncGVyc2lzdC9QVVJHRSc7XG5leHBvcnQgdmFyIFJFR0lTVEVSID0gJ3BlcnNpc3QvUkVHSVNURVInO1xuZXhwb3J0IHZhciBERUZBVUxUX1ZFUlNJT04gPSAtMTsiLCJpbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVNaWdyYXRlKG1pZ3JhdGlvbnMsIGNvbmZpZykge1xuICB2YXIgX3JlZiA9IGNvbmZpZyB8fCB7fSxcbiAgICAgIGRlYnVnID0gX3JlZi5kZWJ1ZztcblxuICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBjdXJyZW50VmVyc2lvbikge1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogbm8gaW5ib3VuZCBzdGF0ZSwgc2tpcHBpbmcgbWlncmF0aW9uJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgdmFyIGluYm91bmRWZXJzaW9uID0gc3RhdGUuX3BlcnNpc3QgJiYgc3RhdGUuX3BlcnNpc3QudmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gc3RhdGUuX3BlcnNpc3QudmVyc2lvbiA6IERFRkFVTFRfVkVSU0lPTjtcblxuICAgIGlmIChpbmJvdW5kVmVyc2lvbiA9PT0gY3VycmVudFZlcnNpb24pIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogdmVyc2lvbnMgbWF0Y2gsIG5vb3AgbWlncmF0aW9uJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoaW5ib3VuZFZlcnNpb24gPiBjdXJyZW50VmVyc2lvbikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIGNvbnNvbGUuZXJyb3IoJ3JlZHV4LXBlcnNpc3Q6IGRvd25ncmFkaW5nIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIG1pZ3JhdGlvbktleXMgPSBPYmplY3Qua2V5cyhtaWdyYXRpb25zKS5tYXAoZnVuY3Rpb24gKHZlcikge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZlcik7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVyc2lvbiA+PSBrZXkgJiYga2V5ID4gaW5ib3VuZFZlcnNpb247XG4gICAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0pO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogbWlncmF0aW9uS2V5cycsIG1pZ3JhdGlvbktleXMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBtaWdyYXRlZFN0YXRlID0gbWlncmF0aW9uS2V5cy5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCB2ZXJzaW9uS2V5KSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRlYnVnKSBjb25zb2xlLmxvZygncmVkdXgtcGVyc2lzdDogcnVubmluZyBtaWdyYXRpb24gZm9yIHZlcnNpb25LZXknLCB2ZXJzaW9uS2V5KTtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGlvbnNbdmVyc2lvbktleV0oc3RhdGUpO1xuICAgICAgfSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtaWdyYXRlZFN0YXRlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgfTtcbn0iLCJpbXBvcnQgeyBLRVlfUFJFRklYLCBSRUhZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG4vLyBAVE9ETyByZW1vdmUgb25jZSBmbG93IDwgMC42MyBzdXBwb3J0IGlzIG5vIGxvbmdlciByZXF1aXJlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVBlcnNpc3RvaWQoY29uZmlnKSB7XG4gIC8vIGRlZmF1bHRzXG4gIHZhciBibGFja2xpc3QgPSBjb25maWcuYmxhY2tsaXN0IHx8IG51bGw7XG4gIHZhciB3aGl0ZWxpc3QgPSBjb25maWcud2hpdGVsaXN0IHx8IG51bGw7XG4gIHZhciB0cmFuc2Zvcm1zID0gY29uZmlnLnRyYW5zZm9ybXMgfHwgW107XG4gIHZhciB0aHJvdHRsZSA9IGNvbmZpZy50aHJvdHRsZSB8fCAwO1xuICB2YXIgc3RvcmFnZUtleSA9IFwiXCIuY29uY2F0KGNvbmZpZy5rZXlQcmVmaXggIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5rZXlQcmVmaXggOiBLRVlfUFJFRklYKS5jb25jYXQoY29uZmlnLmtleSk7XG4gIHZhciBzdG9yYWdlID0gY29uZmlnLnN0b3JhZ2U7XG4gIHZhciBzZXJpYWxpemU7XG5cbiAgaWYgKGNvbmZpZy5zZXJpYWxpemUgPT09IGZhbHNlKSB7XG4gICAgc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5zZXJpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZXJpYWxpemUgPSBjb25maWcuc2VyaWFsaXplO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZSA9IGRlZmF1bHRTZXJpYWxpemU7XG4gIH1cblxuICB2YXIgd3JpdGVGYWlsSGFuZGxlciA9IGNvbmZpZy53cml0ZUZhaWxIYW5kbGVyIHx8IG51bGw7IC8vIGluaXRpYWxpemUgc3RhdGVmdWwgdmFsdWVzXG5cbiAgdmFyIGxhc3RTdGF0ZSA9IHt9O1xuICB2YXIgc3RhZ2VkU3RhdGUgPSB7fTtcbiAgdmFyIGtleXNUb1Byb2Nlc3MgPSBbXTtcbiAgdmFyIHRpbWVJdGVyYXRvciA9IG51bGw7XG4gIHZhciB3cml0ZVByb21pc2UgPSBudWxsO1xuXG4gIHZhciB1cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc3RhdGUpIHtcbiAgICAvLyBhZGQgYW55IGNoYW5nZWQga2V5cyB0byB0aGUgcXVldWVcbiAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoIXBhc3NXaGl0ZWxpc3RCbGFja2xpc3Qoa2V5KSkgcmV0dXJuOyAvLyBpcyBrZXlzcGFjZSBpZ25vcmVkPyBub29wXG5cbiAgICAgIGlmIChsYXN0U3RhdGVba2V5XSA9PT0gc3RhdGVba2V5XSkgcmV0dXJuOyAvLyB2YWx1ZSB1bmNoYW5nZWQ/IG5vb3BcblxuICAgICAgaWYgKGtleXNUb1Byb2Nlc3MuaW5kZXhPZihrZXkpICE9PSAtMSkgcmV0dXJuOyAvLyBpcyBrZXkgYWxyZWFkeSBxdWV1ZWQ/IG5vb3BcblxuICAgICAga2V5c1RvUHJvY2Vzcy5wdXNoKGtleSk7IC8vIGFkZCBrZXkgdG8gcXVldWVcbiAgICB9KTsgLy9pZiBhbnkga2V5IGlzIG1pc3NpbmcgaW4gdGhlIG5ldyBzdGF0ZSB3aGljaCB3YXMgcHJlc2VudCBpbiB0aGUgbGFzdFN0YXRlLFxuICAgIC8vYWRkIGl0IGZvciBwcm9jZXNzaW5nIHRvb1xuXG4gICAgT2JqZWN0LmtleXMobGFzdFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChzdGF0ZVtrZXldID09PSB1bmRlZmluZWQgJiYgcGFzc1doaXRlbGlzdEJsYWNrbGlzdChrZXkpICYmIGtleXNUb1Byb2Nlc3MuaW5kZXhPZihrZXkpID09PSAtMSAmJiBsYXN0U3RhdGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleXNUb1Byb2Nlc3MucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pOyAvLyBzdGFydCB0aGUgdGltZSBpdGVyYXRvciBpZiBub3QgcnVubmluZyAocmVhZDogdGhyb3R0bGUpXG5cbiAgICBpZiAodGltZUl0ZXJhdG9yID09PSBudWxsKSB7XG4gICAgICB0aW1lSXRlcmF0b3IgPSBzZXRJbnRlcnZhbChwcm9jZXNzTmV4dEtleSwgdGhyb3R0bGUpO1xuICAgIH1cblxuICAgIGxhc3RTdGF0ZSA9IHN0YXRlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NOZXh0S2V5KCkge1xuICAgIGlmIChrZXlzVG9Qcm9jZXNzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRpbWVJdGVyYXRvcikgY2xlYXJJbnRlcnZhbCh0aW1lSXRlcmF0b3IpO1xuICAgICAgdGltZUl0ZXJhdG9yID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0ga2V5c1RvUHJvY2Vzcy5zaGlmdCgpO1xuICAgIHZhciBlbmRTdGF0ZSA9IHRyYW5zZm9ybXMucmVkdWNlKGZ1bmN0aW9uIChzdWJTdGF0ZSwgdHJhbnNmb3JtZXIpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5pbihzdWJTdGF0ZSwga2V5LCBsYXN0U3RhdGUpO1xuICAgIH0sIGxhc3RTdGF0ZVtrZXldKTtcblxuICAgIGlmIChlbmRTdGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZWRTdGF0ZVtrZXldID0gc2VyaWFsaXplKGVuZFN0YXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdyZWR1eC1wZXJzaXN0L2NyZWF0ZVBlcnNpc3RvaWQ6IGVycm9yIHNlcmlhbGl6aW5nIHN0YXRlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy9pZiB0aGUgZW5kU3RhdGUgaXMgdW5kZWZpbmVkLCBubyBuZWVkIHRvIHBlcnNpc3QgdGhlIGV4aXN0aW5nIHNlcmlhbGl6ZWQgY29udGVudFxuICAgICAgZGVsZXRlIHN0YWdlZFN0YXRlW2tleV07XG4gICAgfVxuXG4gICAgaWYgKGtleXNUb1Byb2Nlc3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB3cml0ZVN0YWdlZFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVTdGFnZWRTdGF0ZSgpIHtcbiAgICAvLyBjbGVhbnVwIGFueSByZW1vdmVkIGtleXMganVzdCBiZWZvcmUgd3JpdGUuXG4gICAgT2JqZWN0LmtleXMoc3RhZ2VkU3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKGxhc3RTdGF0ZVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHN0YWdlZFN0YXRlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgd3JpdGVQcm9taXNlID0gc3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIHNlcmlhbGl6ZShzdGFnZWRTdGF0ZSkpLmNhdGNoKG9uV3JpdGVGYWlsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhc3NXaGl0ZWxpc3RCbGFja2xpc3Qoa2V5KSB7XG4gICAgaWYgKHdoaXRlbGlzdCAmJiB3aGl0ZWxpc3QuaW5kZXhPZihrZXkpID09PSAtMSAmJiBrZXkgIT09ICdfcGVyc2lzdCcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdC5pbmRleE9mKGtleSkgIT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvbldyaXRlRmFpbChlcnIpIHtcbiAgICAvLyBAVE9ETyBhZGQgZmFpbCBoYW5kbGVycyAodHlwaWNhbGx5IHN0b3JhZ2UgZnVsbClcbiAgICBpZiAod3JpdGVGYWlsSGFuZGxlcikgd3JpdGVGYWlsSGFuZGxlcihlcnIpO1xuXG4gICAgaWYgKGVyciAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdG9yaW5nIGRhdGEnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChrZXlzVG9Qcm9jZXNzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcHJvY2Vzc05leHRLZXkoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JpdGVQcm9taXNlIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuICB9OyAvLyByZXR1cm4gYHBlcnNpc3RvaWRgXG5cblxuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIGZsdXNoOiBmbHVzaFxuICB9O1xufSAvLyBATk9URSBpbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGV4cG9zZWQgdmlhIGNvbmZpZ1xuXG5mdW5jdGlvbiBkZWZhdWx0U2VyaWFsaXplKGRhdGEpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zZm9ybSggLy8gQE5PVEUgaW5ib3VuZDogdHJhbnNmb3JtIHN0YXRlIGNvbWluZyBmcm9tIHJlZHV4IG9uIGl0cyB3YXkgdG8gYmVpbmcgc2VyaWFsaXplZCBhbmQgc3RvcmVkXG5pbmJvdW5kLCAvLyBATk9URSBvdXRib3VuZDogdHJhbnNmb3JtIHN0YXRlIGNvbWluZyBmcm9tIHN0b3JhZ2UsIG9uIGl0cyB3YXkgdG8gYmUgcmVoeWRyYXRlZCBpbnRvIHJlZHV4XG5vdXRib3VuZCkge1xuICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIHdoaXRlbGlzdCA9IGNvbmZpZy53aGl0ZWxpc3QgfHwgbnVsbDtcbiAgdmFyIGJsYWNrbGlzdCA9IGNvbmZpZy5ibGFja2xpc3QgfHwgbnVsbDtcblxuICBmdW5jdGlvbiB3aGl0ZWxpc3RCbGFja2xpc3RDaGVjayhrZXkpIHtcbiAgICBpZiAod2hpdGVsaXN0ICYmIHdoaXRlbGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdC5pbmRleE9mKGtleSkgIT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluOiBmdW5jdGlvbiBfaW4oc3RhdGUsIGtleSwgZnVsbFN0YXRlKSB7XG4gICAgICByZXR1cm4gIXdoaXRlbGlzdEJsYWNrbGlzdENoZWNrKGtleSkgJiYgaW5ib3VuZCA/IGluYm91bmQoc3RhdGUsIGtleSwgZnVsbFN0YXRlKSA6IHN0YXRlO1xuICAgIH0sXG4gICAgb3V0OiBmdW5jdGlvbiBvdXQoc3RhdGUsIGtleSwgZnVsbFN0YXRlKSB7XG4gICAgICByZXR1cm4gIXdoaXRlbGlzdEJsYWNrbGlzdENoZWNrKGtleSkgJiYgb3V0Ym91bmQgPyBvdXRib3VuZChzdGF0ZSwga2V5LCBmdWxsU3RhdGUpIDogc3RhdGU7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCB7IEtFWV9QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdG9yZWRTdGF0ZShjb25maWcpIHtcbiAgdmFyIHRyYW5zZm9ybXMgPSBjb25maWcudHJhbnNmb3JtcyB8fCBbXTtcbiAgdmFyIHN0b3JhZ2VLZXkgPSBcIlwiLmNvbmNhdChjb25maWcua2V5UHJlZml4ICE9PSB1bmRlZmluZWQgPyBjb25maWcua2V5UHJlZml4IDogS0VZX1BSRUZJWCkuY29uY2F0KGNvbmZpZy5rZXkpO1xuICB2YXIgc3RvcmFnZSA9IGNvbmZpZy5zdG9yYWdlO1xuICB2YXIgZGVidWcgPSBjb25maWcuZGVidWc7XG4gIHZhciBkZXNlcmlhbGl6ZTtcblxuICBpZiAoY29uZmlnLmRlc2VyaWFsaXplID09PSBmYWxzZSkge1xuICAgIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gZGVzZXJpYWxpemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnLmRlc2VyaWFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVzZXJpYWxpemUgPSBjb25maWcuZGVzZXJpYWxpemU7XG4gIH0gZWxzZSB7XG4gICAgZGVzZXJpYWxpemUgPSBkZWZhdWx0RGVzZXJpYWxpemU7XG4gIH1cblxuICByZXR1cm4gc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpLnRoZW4oZnVuY3Rpb24gKHNlcmlhbGl6ZWQpIHtcbiAgICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7ZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgc3RhdGUgPSB7fTtcbiAgICAgICAgdmFyIHJhd1N0YXRlID0gZGVzZXJpYWxpemUoc2VyaWFsaXplZCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHJhd1N0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBzdGF0ZVtrZXldID0gdHJhbnNmb3Jtcy5yZWR1Y2VSaWdodChmdW5jdGlvbiAoc3ViU3RhdGUsIHRyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIub3V0KHN1YlN0YXRlLCBrZXksIHJhd1N0YXRlKTtcbiAgICAgICAgICB9LCBkZXNlcmlhbGl6ZShyYXdTdGF0ZVtrZXldKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIGNvbnNvbGUubG9nKFwicmVkdXgtcGVyc2lzdC9nZXRTdG9yZWRTdGF0ZTogRXJyb3IgcmVzdG9yaW5nIGRhdGEgXCIuY29uY2F0KHNlcmlhbGl6ZWQpLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdERlc2VyaWFsaXplKHNlcmlhbCkge1xuICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWwpO1xufSIsImV4cG9ydCB7IGRlZmF1bHQgYXMgcGVyc2lzdFJlZHVjZXIgfSBmcm9tICcuL3BlcnNpc3RSZWR1Y2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGVyc2lzdENvbWJpbmVSZWR1Y2VycyB9IGZyb20gJy4vcGVyc2lzdENvbWJpbmVSZWR1Y2Vycyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBlcnNpc3RTdG9yZSB9IGZyb20gJy4vcGVyc2lzdFN0b3JlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlTWlncmF0ZSB9IGZyb20gJy4vY3JlYXRlTWlncmF0ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNyZWF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vY3JlYXRlVHJhbnNmb3JtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0U3RvcmVkU3RhdGUgfSBmcm9tICcuL2dldFN0b3JlZFN0YXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY3JlYXRlUGVyc2lzdG9pZCB9IGZyb20gJy4vY3JlYXRlUGVyc2lzdG9pZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHB1cmdlU3RvcmVkU3RhdGUgfSBmcm9tICcuL3B1cmdlU3RvcmVkU3RhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuXG5leHBvcnQgdmFyIFBlcnNpc3RHYXRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUGVyc2lzdEdhdGUsIF9QdXJlQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQZXJzaXN0R2F0ZSgpIHtcbiAgICB2YXIgX2dldFByb3RvdHlwZU9mMjtcblxuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQZXJzaXN0R2F0ZSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX2dldFByb3RvdHlwZU9mMiA9IF9nZXRQcm90b3R5cGVPZihQZXJzaXN0R2F0ZSkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgIGJvb3RzdHJhcHBlZDogZmFsc2VcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJfdW5zdWJzY3JpYmVcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVQZXJzaXN0b3JTdGF0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGVyc2lzdG9yID0gX3RoaXMucHJvcHMucGVyc2lzdG9yO1xuXG4gICAgICB2YXIgX3BlcnNpc3RvciRnZXRTdGF0ZSA9IHBlcnNpc3Rvci5nZXRTdGF0ZSgpLFxuICAgICAgICAgIGJvb3RzdHJhcHBlZCA9IF9wZXJzaXN0b3IkZ2V0U3RhdGUuYm9vdHN0cmFwcGVkO1xuXG4gICAgICBpZiAoYm9vdHN0cmFwcGVkKSB7XG4gICAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkJlZm9yZUxpZnQpIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoX3RoaXMucHJvcHMub25CZWZvcmVMaWZ0KCkpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgYm9vdHN0cmFwcGVkOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBib290c3RyYXBwZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLl91bnN1YnNjcmliZSAmJiBfdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQZXJzaXN0R2F0ZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZSA9IHRoaXMucHJvcHMucGVyc2lzdG9yLnN1YnNjcmliZSh0aGlzLmhhbmRsZVBlcnNpc3RvclN0YXRlKTtcbiAgICAgIHRoaXMuaGFuZGxlUGVyc2lzdG9yU3RhdGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZSAmJiB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmNoaWxkcmVuID09PSAnZnVuY3Rpb24nICYmIHRoaXMucHJvcHMubG9hZGluZykgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdDogUGVyc2lzdEdhdGUgZXhwZWN0cyBlaXRoZXIgYSBmdW5jdGlvbiBjaGlsZCBvciBsb2FkaW5nIHByb3AsIGJ1dCBub3QgYm90aC4gVGhlIGxvYWRpbmcgcHJvcCB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbih0aGlzLnN0YXRlLmJvb3RzdHJhcHBlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmJvb3RzdHJhcHBlZCA/IHRoaXMucHJvcHMuY2hpbGRyZW4gOiB0aGlzLnByb3BzLmxvYWRpbmc7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBlcnNpc3RHYXRlO1xufShQdXJlQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KFBlcnNpc3RHYXRlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNoaWxkcmVuOiBudWxsLFxuICBsb2FkaW5nOiBudWxsXG59KTsiLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgcGVyc2lzdFJlZHVjZXIgZnJvbSAnLi9wZXJzaXN0UmVkdWNlcic7XG5pbXBvcnQgYXV0b01lcmdlTGV2ZWwyIGZyb20gJy4vc3RhdGVSZWNvbmNpbGVyL2F1dG9NZXJnZUxldmVsMic7XG4vLyBjb21iaW5lUmVkdWNlcnMgKyBwZXJzaXN0UmVkdWNlciB3aXRoIHN0YXRlUmVjb25jaWxlciBkZWZhdWx0ZWQgdG8gYXV0b01lcmdlTGV2ZWwyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwZXJzaXN0Q29tYmluZVJlZHVjZXJzKGNvbmZpZywgcmVkdWNlcnMpIHtcbiAgY29uZmlnLnN0YXRlUmVjb25jaWxlciA9IGNvbmZpZy5zdGF0ZVJlY29uY2lsZXIgPT09IHVuZGVmaW5lZCA/IGF1dG9NZXJnZUxldmVsMiA6IGNvbmZpZy5zdGF0ZVJlY29uY2lsZXI7XG4gIHJldHVybiBwZXJzaXN0UmVkdWNlcihjb25maWcsIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycykpO1xufSIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IEZMVVNILCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFSFlEUkFURSwgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IGF1dG9NZXJnZUxldmVsMSBmcm9tICcuL3N0YXRlUmVjb25jaWxlci9hdXRvTWVyZ2VMZXZlbDEnO1xuaW1wb3J0IGNyZWF0ZVBlcnNpc3RvaWQgZnJvbSAnLi9jcmVhdGVQZXJzaXN0b2lkJztcbmltcG9ydCBkZWZhdWx0R2V0U3RvcmVkU3RhdGUgZnJvbSAnLi9nZXRTdG9yZWRTdGF0ZSc7XG5pbXBvcnQgcHVyZ2VTdG9yZWRTdGF0ZSBmcm9tICcuL3B1cmdlU3RvcmVkU3RhdGUnO1xudmFyIERFRkFVTFRfVElNRU9VVCA9IDUwMDA7XG4vKlxuICBAVE9ETyBhZGQgdmFsaWRhdGlvbiAvIGhhbmRsaW5nIGZvcjpcbiAgLSBwZXJzaXN0aW5nIGEgcmVkdWNlciB3aGljaCBoYXMgbmVzdGVkIF9wZXJzaXN0XG4gIC0gaGFuZGxpbmcgYWN0aW9ucyB0aGF0IGZpcmUgYmVmb3JlIHJleWRyYXRlIGlzIGNhbGxlZFxuKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGVyc2lzdFJlZHVjZXIoY29uZmlnLCBiYXNlUmVkdWNlcikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghY29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoJ2NvbmZpZyBpcyByZXF1aXJlZCBmb3IgcGVyc2lzdFJlZHVjZXInKTtcbiAgICBpZiAoIWNvbmZpZy5rZXkpIHRocm93IG5ldyBFcnJvcigna2V5IGlzIHJlcXVpcmVkIGluIHBlcnNpc3RvciBjb25maWcnKTtcbiAgICBpZiAoIWNvbmZpZy5zdG9yYWdlKSB0aHJvdyBuZXcgRXJyb3IoXCJyZWR1eC1wZXJzaXN0OiBjb25maWcuc3RvcmFnZSBpcyByZXF1aXJlZC4gVHJ5IHVzaW5nIG9uZSBvZiB0aGUgcHJvdmlkZWQgc3RvcmFnZSBlbmdpbmVzIGBpbXBvcnQgc3RvcmFnZSBmcm9tICdyZWR1eC1wZXJzaXN0L2xpYi9zdG9yYWdlJ2BcIik7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uICE9PSB1bmRlZmluZWQgPyBjb25maWcudmVyc2lvbiA6IERFRkFVTFRfVkVSU0lPTjtcbiAgdmFyIGRlYnVnID0gY29uZmlnLmRlYnVnIHx8IGZhbHNlO1xuICB2YXIgc3RhdGVSZWNvbmNpbGVyID0gY29uZmlnLnN0YXRlUmVjb25jaWxlciA9PT0gdW5kZWZpbmVkID8gYXV0b01lcmdlTGV2ZWwxIDogY29uZmlnLnN0YXRlUmVjb25jaWxlcjtcbiAgdmFyIGdldFN0b3JlZFN0YXRlID0gY29uZmlnLmdldFN0b3JlZFN0YXRlIHx8IGRlZmF1bHRHZXRTdG9yZWRTdGF0ZTtcbiAgdmFyIHRpbWVvdXQgPSBjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnRpbWVvdXQgOiBERUZBVUxUX1RJTUVPVVQ7XG4gIHZhciBfcGVyc2lzdG9pZCA9IG51bGw7XG4gIHZhciBfcHVyZ2UgPSBmYWxzZTtcbiAgdmFyIF9wYXVzZWQgPSB0cnVlO1xuXG4gIHZhciBjb25kaXRpb25hbFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbmRpdGlvbmFsVXBkYXRlKHN0YXRlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBwZXJzaXN0b2lkIG9ubHkgaWYgd2UgYXJlIHJlaHlkcmF0ZWQgYW5kIG5vdCBwYXVzZWRcbiAgICBzdGF0ZS5fcGVyc2lzdC5yZWh5ZHJhdGVkICYmIF9wZXJzaXN0b2lkICYmICFfcGF1c2VkICYmIF9wZXJzaXN0b2lkLnVwZGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgIHZhciBfcmVmID0gc3RhdGUgfHwge30sXG4gICAgICAgIF9wZXJzaXN0ID0gX3JlZi5fcGVyc2lzdCxcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbXCJfcGVyc2lzdFwiXSk7IC8vICRGbG93SWdub3JlIG5lZWQgdG8gdXBkYXRlIFN0YXRlIHR5cGVcblxuXG4gICAgdmFyIHJlc3RTdGF0ZSA9IHJlc3Q7XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFBFUlNJU1QpIHtcbiAgICAgIHZhciBfc2VhbGVkID0gZmFsc2U7XG5cbiAgICAgIHZhciBfcmVoeWRyYXRlID0gZnVuY3Rpb24gX3JlaHlkcmF0ZShwYXlsb2FkLCBlcnIpIHtcbiAgICAgICAgLy8gZGV2IHdhcm5pbmcgaWYgd2UgYXJlIGFscmVhZHkgc2VhbGVkXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIF9zZWFsZWQpIGNvbnNvbGUuZXJyb3IoXCJyZWR1eC1wZXJzaXN0OiByZWh5ZHJhdGUgZm9yIFxcXCJcIi5jb25jYXQoY29uZmlnLmtleSwgXCJcXFwiIGNhbGxlZCBhZnRlciB0aW1lb3V0LlwiKSwgcGF5bG9hZCwgZXJyKTsgLy8gb25seSByZWh5ZHJhdGUgaWYgd2UgYXJlIG5vdCBhbHJlYWR5IHNlYWxlZFxuXG4gICAgICAgIGlmICghX3NlYWxlZCkge1xuICAgICAgICAgIGFjdGlvbi5yZWh5ZHJhdGUoY29uZmlnLmtleSwgcGF5bG9hZCwgZXJyKTtcbiAgICAgICAgICBfc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGltZW91dCAmJiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgIV9zZWFsZWQgJiYgX3JlaHlkcmF0ZSh1bmRlZmluZWQsIG5ldyBFcnJvcihcInJlZHV4LXBlcnNpc3Q6IHBlcnNpc3QgdGltZWQgb3V0IGZvciBwZXJzaXN0IGtleSBcXFwiXCIuY29uY2F0KGNvbmZpZy5rZXksIFwiXFxcIlwiKSkpO1xuICAgICAgfSwgdGltZW91dCk7IC8vIEBOT1RFIFBFUlNJU1QgcmVzdW1lcyBpZiBwYXVzZWQuXG5cbiAgICAgIF9wYXVzZWQgPSBmYWxzZTsgLy8gQE5PVEUgb25seSBldmVyIGNyZWF0ZSBwZXJzaXN0b2lkIG9uY2UsIGVuc3VyZSB3ZSBjYWxsIGl0IGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgX3BlcnNpc3QgaGFzIGFscmVhZHkgYmVlbiBzZXRcblxuICAgICAgaWYgKCFfcGVyc2lzdG9pZCkgX3BlcnNpc3RvaWQgPSBjcmVhdGVQZXJzaXN0b2lkKGNvbmZpZyk7IC8vIEBOT1RFIFBFUlNJU1QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgbm9vcCBhZnRlciB0aGUgZmlyc3RcblxuICAgICAgaWYgKF9wZXJzaXN0KSB7XG4gICAgICAgIC8vIFdlIHN0aWxsIG5lZWQgdG8gY2FsbCB0aGUgYmFzZSByZWR1Y2VyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbmVzdGVkXG4gICAgICAgIC8vIHVzZXMgb2YgcGVyc2lzdFJlZHVjZXIgd2hpY2ggbmVlZCB0byBiZSBhd2FyZSBvZiB0aGUgUEVSU0lTVCBhY3Rpb25cbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGJhc2VSZWR1Y2VyKHJlc3RTdGF0ZSwgYWN0aW9uKSwge1xuICAgICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24ucmVoeWRyYXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBhY3Rpb24ucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcigncmVkdXgtcGVyc2lzdDogZWl0aGVyIHJlaHlkcmF0ZSBvciByZWdpc3RlciBpcyBub3QgYSBmdW5jdGlvbiBvbiB0aGUgUEVSU0lTVCBhY3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgYWN0aW9uIGlzIGJlaW5nIHJlcGxheWVkLiBUaGlzIGlzIGFuIHVuZXhwbG9yZWQgdXNlIGNhc2UsIHBsZWFzZSBvcGVuIGFuIGlzc3VlIGFuZCB3ZSB3aWxsIGZpZ3VyZSBvdXQgYSByZXNvbHV0aW9uLicpO1xuICAgICAgYWN0aW9uLnJlZ2lzdGVyKGNvbmZpZy5rZXkpO1xuICAgICAgZ2V0U3RvcmVkU3RhdGUoY29uZmlnKS50aGVuKGZ1bmN0aW9uIChyZXN0b3JlZFN0YXRlKSB7XG4gICAgICAgIHZhciBtaWdyYXRlID0gY29uZmlnLm1pZ3JhdGUgfHwgZnVuY3Rpb24gKHMsIHYpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1pZ3JhdGUocmVzdG9yZWRTdGF0ZSwgdmVyc2lvbikudGhlbihmdW5jdGlvbiAobWlncmF0ZWRTdGF0ZSkge1xuICAgICAgICAgIF9yZWh5ZHJhdGUobWlncmF0ZWRTdGF0ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChtaWdyYXRlRXJyKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbWlncmF0ZUVycikgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdDogbWlncmF0aW9uIGVycm9yJywgbWlncmF0ZUVycik7XG5cbiAgICAgICAgICBfcmVoeWRyYXRlKHVuZGVmaW5lZCwgbWlncmF0ZUVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBfcmVoeWRyYXRlKHVuZGVmaW5lZCwgZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGJhc2VSZWR1Y2VyKHJlc3RTdGF0ZSwgYWN0aW9uKSwge1xuICAgICAgICBfcGVyc2lzdDoge1xuICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgcmVoeWRyYXRlZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gUFVSR0UpIHtcbiAgICAgIF9wdXJnZSA9IHRydWU7XG4gICAgICBhY3Rpb24ucmVzdWx0KHB1cmdlU3RvcmVkU3RhdGUoY29uZmlnKSk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgYmFzZVJlZHVjZXIocmVzdFN0YXRlLCBhY3Rpb24pLCB7XG4gICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gRkxVU0gpIHtcbiAgICAgIGFjdGlvbi5yZXN1bHQoX3BlcnNpc3RvaWQgJiYgX3BlcnNpc3RvaWQuZmx1c2goKSk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgYmFzZVJlZHVjZXIocmVzdFN0YXRlLCBhY3Rpb24pLCB7XG4gICAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gUEFVU0UpIHtcbiAgICAgIF9wYXVzZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IFJFSFlEUkFURSkge1xuICAgICAgLy8gbm9vcCBvbiByZXN0U3RhdGUgaWYgcHVyZ2luZ1xuICAgICAgaWYgKF9wdXJnZSkgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHJlc3RTdGF0ZSwge1xuICAgICAgICBfcGVyc2lzdDogX29iamVjdFNwcmVhZCh7fSwgX3BlcnNpc3QsIHtcbiAgICAgICAgICByZWh5ZHJhdGVkOiB0cnVlXG4gICAgICAgIH0pIC8vIEBOT1RFIGlmIGtleSBkb2VzIG5vdCBtYXRjaCwgd2lsbCBjb250aW51ZSB0byBkZWZhdWx0IGVsc2UgYmVsb3dcblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3Rpb24ua2V5ID09PSBjb25maWcua2V5KSB7XG4gICAgICAgIHZhciByZWR1Y2VkU3RhdGUgPSBiYXNlUmVkdWNlcihyZXN0U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIHZhciBpbmJvdW5kU3RhdGUgPSBhY3Rpb24ucGF5bG9hZDsgLy8gb25seSByZWNvbmNpbGUgc3RhdGUgaWYgc3RhdGVSZWNvbmNpbGVyIGFuZCBpbmJvdW5kU3RhdGUgYXJlIGJvdGggZGVmaW5lZFxuXG4gICAgICAgIHZhciByZWNvbmNpbGVkUmVzdCA9IHN0YXRlUmVjb25jaWxlciAhPT0gZmFsc2UgJiYgaW5ib3VuZFN0YXRlICE9PSB1bmRlZmluZWQgPyBzdGF0ZVJlY29uY2lsZXIoaW5ib3VuZFN0YXRlLCBzdGF0ZSwgcmVkdWNlZFN0YXRlLCBjb25maWcpIDogcmVkdWNlZFN0YXRlO1xuXG4gICAgICAgIHZhciBfbmV3U3RhdGUgPSBfb2JqZWN0U3ByZWFkKHt9LCByZWNvbmNpbGVkUmVzdCwge1xuICAgICAgICAgIF9wZXJzaXN0OiBfb2JqZWN0U3ByZWFkKHt9LCBfcGVyc2lzdCwge1xuICAgICAgICAgICAgcmVoeWRyYXRlZDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25kaXRpb25hbFVwZGF0ZShfbmV3U3RhdGUpO1xuICAgICAgfVxuICAgIH0gLy8gaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBoYW5kbGVkIFBFUlNJU1QsIHN0cmFpZ2h0IHBhc3N0aHJvdWdoXG5cblxuICAgIGlmICghX3BlcnNpc3QpIHJldHVybiBiYXNlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsgLy8gcnVuIGJhc2UgcmVkdWNlcjpcbiAgICAvLyBpcyBzdGF0ZSBtb2RpZmllZCA/IHJldHVybiBvcmlnaW5hbCA6IHJldHVybiB1cGRhdGVkXG5cbiAgICB2YXIgbmV3U3RhdGUgPSBiYXNlUmVkdWNlcihyZXN0U3RhdGUsIGFjdGlvbik7XG4gICAgaWYgKG5ld1N0YXRlID09PSByZXN0U3RhdGUpIHJldHVybiBzdGF0ZTtcbiAgICByZXR1cm4gY29uZGl0aW9uYWxVcGRhdGUoX29iamVjdFNwcmVhZCh7fSwgbmV3U3RhdGUsIHtcbiAgICAgIF9wZXJzaXN0OiBfcGVyc2lzdFxuICAgIH0pKTtcbiAgfTtcbn0iLCJmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoc291cmNlLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB7IEZMVVNILCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFR0lTVEVSLCBSRUhZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgaW5pdGlhbFN0YXRlID0ge1xuICByZWdpc3RyeTogW10sXG4gIGJvb3RzdHJhcHBlZDogZmFsc2Vcbn07XG5cbnZhciBwZXJzaXN0b3JSZWR1Y2VyID0gZnVuY3Rpb24gcGVyc2lzdG9yUmVkdWNlcigpIHtcbiAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBpbml0aWFsU3RhdGU7XG4gIHZhciBhY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBSRUdJU1RFUjpcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICByZWdpc3RyeTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdGF0ZS5yZWdpc3RyeSksIFthY3Rpb24ua2V5XSlcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBSRUhZRFJBVEU6XG4gICAgICB2YXIgZmlyc3RJbmRleCA9IHN0YXRlLnJlZ2lzdHJ5LmluZGV4T2YoYWN0aW9uLmtleSk7XG5cbiAgICAgIHZhciByZWdpc3RyeSA9IF90b0NvbnN1bWFibGVBcnJheShzdGF0ZS5yZWdpc3RyeSk7XG5cbiAgICAgIHJlZ2lzdHJ5LnNwbGljZShmaXJzdEluZGV4LCAxKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksXG4gICAgICAgIGJvb3RzdHJhcHBlZDogcmVnaXN0cnkubGVuZ3RoID09PSAwXG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBlcnNpc3RTdG9yZShzdG9yZSwgb3B0aW9ucywgY2IpIHtcbiAgLy8gaGVscCBjYXRjaCBpbmNvcnJlY3QgdXNhZ2Ugb2YgcGFzc2luZyBQZXJzaXN0Q29uZmlnIGluIGFzIFBlcnNpc3Rvck9wdGlvbnNcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgb3B0aW9uc1RvVGVzdCA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIGJhbm5lZEtleXMgPSBbJ2JsYWNrbGlzdCcsICd3aGl0ZWxpc3QnLCAndHJhbnNmb3JtcycsICdzdG9yYWdlJywgJ2tleVByZWZpeCcsICdtaWdyYXRlJ107XG4gICAgYmFubmVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBpZiAoISFvcHRpb25zVG9UZXN0W2tdKSBjb25zb2xlLmVycm9yKFwicmVkdXgtcGVyc2lzdDogaW52YWxpZCBvcHRpb24gcGFzc2VkIHRvIHBlcnNpc3RTdG9yZTogXFxcIlwiLmNvbmNhdChrLCBcIlxcXCIuIFlvdSBtYXkgYmUgaW5jb3JyZWN0bHkgcGFzc2luZyBwZXJzaXN0Q29uZmlnIGludG8gcGVyc2lzdFN0b3JlLCB3aGVyZWFzIGl0IHNob3VsZCBiZSBwYXNzZWQgaW50byBwZXJzaXN0UmVkdWNlci5cIikpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJvb3N0cmFwcGVkQ2IgPSBjYiB8fCBmYWxzZTtcblxuICB2YXIgX3BTdG9yZSA9IGNyZWF0ZVN0b3JlKHBlcnNpc3RvclJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgb3B0aW9ucyAmJiBvcHRpb25zLmVuaGFuY2VyID8gb3B0aW9ucy5lbmhhbmNlciA6IHVuZGVmaW5lZCk7XG5cbiAgdmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIoa2V5KSB7XG4gICAgX3BTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiBSRUdJU1RFUixcbiAgICAgIGtleToga2V5XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlaHlkcmF0ZSA9IGZ1bmN0aW9uIHJlaHlkcmF0ZShrZXksIHBheWxvYWQsIGVycikge1xuICAgIHZhciByZWh5ZHJhdGVBY3Rpb24gPSB7XG4gICAgICB0eXBlOiBSRUhZRFJBVEUsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgZXJyOiBlcnIsXG4gICAgICBrZXk6IGtleSAvLyBkaXNwYXRjaCB0byBgc3RvcmVgIHRvIHJlaHlkcmF0ZSBhbmQgYHBlcnNpc3RvcmAgdG8gdHJhY2sgcmVzdWx0XG5cbiAgICB9O1xuICAgIHN0b3JlLmRpc3BhdGNoKHJlaHlkcmF0ZUFjdGlvbik7XG5cbiAgICBfcFN0b3JlLmRpc3BhdGNoKHJlaHlkcmF0ZUFjdGlvbik7XG5cbiAgICBpZiAoYm9vc3RyYXBwZWRDYiAmJiBwZXJzaXN0b3IuZ2V0U3RhdGUoKS5ib290c3RyYXBwZWQpIHtcbiAgICAgIGJvb3N0cmFwcGVkQ2IoKTtcbiAgICAgIGJvb3N0cmFwcGVkQ2IgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlcnNpc3RvciA9IF9vYmplY3RTcHJlYWQoe30sIF9wU3RvcmUsIHtcbiAgICBwdXJnZTogZnVuY3Rpb24gcHVyZ2UoKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQVVJHRSxcbiAgICAgICAgcmVzdWx0OiBmdW5jdGlvbiByZXN1bHQocHVyZ2VSZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocHVyZ2VSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXN1bHRzKTtcbiAgICB9LFxuICAgIGZsdXNoOiBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBzdG9yZS5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IEZMVVNILFxuICAgICAgICByZXN1bHQ6IGZ1bmN0aW9uIHJlc3VsdChmbHVzaFJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChmbHVzaFJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdHMpO1xuICAgIH0sXG4gICAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQQVVTRVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBwZXJzaXN0OiBmdW5jdGlvbiBwZXJzaXN0KCkge1xuICAgICAgc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBQRVJTSVNULFxuICAgICAgICByZWdpc3RlcjogcmVnaXN0ZXIsXG4gICAgICAgIHJlaHlkcmF0ZTogcmVoeWRyYXRlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICghKG9wdGlvbnMgJiYgb3B0aW9ucy5tYW51YWxQZXJzaXN0KSkge1xuICAgIHBlcnNpc3Rvci5wZXJzaXN0KCk7XG4gIH1cblxuICByZXR1cm4gcGVyc2lzdG9yO1xufSIsImltcG9ydCB7IEtFWV9QUkVGSVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwdXJnZVN0b3JlZFN0YXRlKGNvbmZpZykge1xuICB2YXIgc3RvcmFnZSA9IGNvbmZpZy5zdG9yYWdlO1xuICB2YXIgc3RvcmFnZUtleSA9IFwiXCIuY29uY2F0KGNvbmZpZy5rZXlQcmVmaXggIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5rZXlQcmVmaXggOiBLRVlfUFJFRklYKS5jb25jYXQoY29uZmlnLmtleSk7XG4gIHJldHVybiBzdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSwgd2FybklmUmVtb3ZlRXJyb3IpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZW1vdmVFcnJvcihlcnIpIHtcbiAgaWYgKGVyciAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcigncmVkdXgtcGVyc2lzdC9wdXJnZVN0b3JlZFN0YXRlOiBFcnJvciBwdXJnaW5nIGRhdGEgc3RvcmVkIHN0YXRlJywgZXJyKTtcbiAgfVxufSIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qXG4gIGF1dG9NZXJnZUxldmVsMTogXG4gICAgLSBtZXJnZXMgMSBsZXZlbCBvZiBzdWJzdGF0ZVxuICAgIC0gc2tpcHMgc3Vic3RhdGUgaWYgYWxyZWFkeSBtb2RpZmllZFxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1dG9NZXJnZUxldmVsMShpbmJvdW5kU3RhdGUsIG9yaWdpbmFsU3RhdGUsIHJlZHVjZWRTdGF0ZSwgX3JlZikge1xuICB2YXIgZGVidWcgPSBfcmVmLmRlYnVnO1xuXG4gIHZhciBuZXdTdGF0ZSA9IF9vYmplY3RTcHJlYWQoe30sIHJlZHVjZWRTdGF0ZSk7IC8vIG9ubHkgcmVoeWRyYXRlIGlmIGluYm91bmRTdGF0ZSBleGlzdHMgYW5kIGlzIGFuIG9iamVjdFxuXG5cbiAgaWYgKGluYm91bmRTdGF0ZSAmJiBfdHlwZW9mKGluYm91bmRTdGF0ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgT2JqZWN0LmtleXMoaW5ib3VuZFN0YXRlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8vIGlnbm9yZSBfcGVyc2lzdCBkYXRhXG4gICAgICBpZiAoa2V5ID09PSAnX3BlcnNpc3QnKSByZXR1cm47IC8vIGlmIHJlZHVjZXIgbW9kaWZpZXMgc3Vic3RhdGUsIHNraXAgYXV0byByZWh5ZHJhdGlvblxuXG4gICAgICBpZiAob3JpZ2luYWxTdGF0ZVtrZXldICE9PSByZWR1Y2VkU3RhdGVba2V5XSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkZWJ1ZykgY29uc29sZS5sb2coJ3JlZHV4LXBlcnNpc3Qvc3RhdGVSZWNvbmNpbGVyOiBzdWIgc3RhdGUgZm9yIGtleSBgJXNgIG1vZGlmaWVkLCBza2lwcGluZy4nLCBrZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG90aGVyd2lzZSBoYXJkIHNldCB0aGUgbmV3IHZhbHVlXG5cblxuICAgICAgbmV3U3RhdGVba2V5XSA9IGluYm91bmRTdGF0ZVtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcgJiYgaW5ib3VuZFN0YXRlICYmIF90eXBlb2YoaW5ib3VuZFN0YXRlKSA9PT0gJ29iamVjdCcpIGNvbnNvbGUubG9nKFwicmVkdXgtcGVyc2lzdC9zdGF0ZVJlY29uY2lsZXI6IHJlaHlkcmF0ZWQga2V5cyAnXCIuY29uY2F0KE9iamVjdC5rZXlzKGluYm91bmRTdGF0ZSkuam9pbignLCAnKSwgXCInXCIpKTtcbiAgcmV0dXJuIG5ld1N0YXRlO1xufSIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhzb3VyY2UsIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qXG4gIGF1dG9NZXJnZUxldmVsMjogXG4gICAgLSBtZXJnZXMgMiBsZXZlbCBvZiBzdWJzdGF0ZVxuICAgIC0gc2tpcHMgc3Vic3RhdGUgaWYgYWxyZWFkeSBtb2RpZmllZFxuICAgIC0gdGhpcyBpcyBlc3NlbnRpYWxseSByZWR1eC1wZXJpc3QgdjQgYmVoYXZpb3JcbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvTWVyZ2VMZXZlbDIoaW5ib3VuZFN0YXRlLCBvcmlnaW5hbFN0YXRlLCByZWR1Y2VkU3RhdGUsIF9yZWYpIHtcbiAgdmFyIGRlYnVnID0gX3JlZi5kZWJ1ZztcblxuICB2YXIgbmV3U3RhdGUgPSBfb2JqZWN0U3ByZWFkKHt9LCByZWR1Y2VkU3RhdGUpOyAvLyBvbmx5IHJlaHlkcmF0ZSBpZiBpbmJvdW5kU3RhdGUgZXhpc3RzIGFuZCBpcyBhbiBvYmplY3RcblxuXG4gIGlmIChpbmJvdW5kU3RhdGUgJiYgX3R5cGVvZihpbmJvdW5kU3RhdGUpID09PSAnb2JqZWN0Jykge1xuICAgIE9iamVjdC5rZXlzKGluYm91bmRTdGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAvLyBpZ25vcmUgX3BlcnNpc3QgZGF0YVxuICAgICAgaWYgKGtleSA9PT0gJ19wZXJzaXN0JykgcmV0dXJuOyAvLyBpZiByZWR1Y2VyIG1vZGlmaWVzIHN1YnN0YXRlLCBza2lwIGF1dG8gcmVoeWRyYXRpb25cblxuICAgICAgaWYgKG9yaWdpbmFsU3RhdGVba2V5XSAhPT0gcmVkdWNlZFN0YXRlW2tleV0pIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGVidWcpIGNvbnNvbGUubG9nKCdyZWR1eC1wZXJzaXN0L3N0YXRlUmVjb25jaWxlcjogc3ViIHN0YXRlIGZvciBrZXkgYCVzYCBtb2RpZmllZCwgc2tpcHBpbmcuJywga2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbkVub3VnaE9iamVjdChyZWR1Y2VkU3RhdGVba2V5XSkpIHtcbiAgICAgICAgLy8gaWYgb2JqZWN0IGlzIHBsYWluIGVub3VnaCBzaGFsbG93IG1lcmdlIHRoZSBuZXcgdmFsdWVzIChoZW5jZSBcIkxldmVsMlwiKVxuICAgICAgICBuZXdTdGF0ZVtrZXldID0gX29iamVjdFNwcmVhZCh7fSwgbmV3U3RhdGVba2V5XSwge30sIGluYm91bmRTdGF0ZVtrZXldKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBvdGhlcndpc2UgaGFyZCBzZXRcblxuXG4gICAgICBuZXdTdGF0ZVtrZXldID0gaW5ib3VuZFN0YXRlW2tleV07XG4gICAgfSk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBkZWJ1ZyAmJiBpbmJvdW5kU3RhdGUgJiYgX3R5cGVvZihpbmJvdW5kU3RhdGUpID09PSAnb2JqZWN0JykgY29uc29sZS5sb2coXCJyZWR1eC1wZXJzaXN0L3N0YXRlUmVjb25jaWxlcjogcmVoeWRyYXRlZCBrZXlzICdcIi5jb25jYXQoT2JqZWN0LmtleXMoaW5ib3VuZFN0YXRlKS5qb2luKCcsICcpLCBcIidcIikpO1xuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5Fbm91Z2hPYmplY3Qobykge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvKSAmJiBfdHlwZW9mKG8pID09PSAnb2JqZWN0Jztcbn0iLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiAnSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gJyArICdjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSAnICsgJ3RvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihlbmhhbmNlcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKHJlZHVjZXIpICsgXCInXCIpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGlzIG1ha2VzIGEgc2hhbGxvdyBjb3B5IG9mIGN1cnJlbnRMaXN0ZW5lcnMgc28gd2UgY2FuIHVzZVxuICAgKiBuZXh0TGlzdGVuZXJzIGFzIGEgdGVtcG9yYXJ5IGxpc3Qgd2hpbGUgZGlzcGF0Y2hpbmcuXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgYW55IGJ1Z3MgYXJvdW5kIGNvbnN1bWVycyBjYWxsaW5nXG4gICAqIHN1YnNjcmliZS91bnN1YnNjcmliZSBpbiB0aGUgbWlkZGxlIG9mIGEgZGlzcGF0Y2guXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1RoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gJyArICdQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihsaXN0ZW5lcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhICcgKyAnY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiAnWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgICB9XG5cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcIkFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnXCIgKyBraW5kT2YoYWN0aW9uKSArIFwiJy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiAnUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByZWR1Y2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdG9yZSB0byBjYWxjdWxhdGUgdGhlIHN0YXRlLlxuICAgKlxuICAgKiBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYXBwIGltcGxlbWVudHMgY29kZSBzcGxpdHRpbmcgYW5kIHlvdSB3YW50IHRvXG4gICAqIGxvYWQgc29tZSBvZiB0aGUgcmVkdWNlcnMgZHluYW1pY2FsbHkuIFlvdSBtaWdodCBhbHNvIG5lZWQgdGhpcyBpZiB5b3VcbiAgICogaW1wbGVtZW50IGEgaG90IHJlbG9hZGluZyBtZWNoYW5pc20gZm9yIFJlZHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0UmVkdWNlciBUaGUgcmVkdWNlciBmb3IgdGhlIHN0b3JlIHRvIHVzZSBpbnN0ZWFkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG5cblxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IFwiRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobmV4dFJlZHVjZXIpKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyOyAvLyBUaGlzIGFjdGlvbiBoYXMgYSBzaW1pbGlhciBlZmZlY3QgdG8gQWN0aW9uVHlwZXMuSU5JVC5cbiAgICAvLyBBbnkgcmVkdWNlcnMgdGhhdCBleGlzdGVkIGluIGJvdGggdGhlIG5ldyBhbmQgb2xkIHJvb3RSZWR1Y2VyXG4gICAgLy8gd2lsbCByZWNlaXZlIHRoZSBwcmV2aW91cyBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgICAvLyB0aGUgbmV3IHN0YXRlIHRyZWUgd2l0aCBhbnkgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBvbGQgb25lLlxuXG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbnRlcm9wZXJhYmlsaXR5IHBvaW50IGZvciBvYnNlcnZhYmxlL3JlYWN0aXZlIGxpYnJhcmllcy5cbiAgICogQHJldHVybnMge29ic2VydmFibGV9IEEgbWluaW1hbCBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIG9ic2VydmFibGUgcHJvcG9zYWw6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGVcbiAgICovXG5cblxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogXCJFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG9ic2VydmVyKSArIFwiJ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9IC8vIFdoZW4gYSBzdG9yZSBpcyBjcmVhdGVkLCBhbiBcIklOSVRcIiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCBzbyB0aGF0IGV2ZXJ5XG4gIC8vIHJlZHVjZXIgcmV0dXJucyB0aGVpciBpbml0aWFsIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAvLyB0aGUgaW5pdGlhbCBzdGF0ZSB0cmVlLlxuXG5cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgfSk7XG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMlskJG9ic2VydmFibGVdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG5cbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcblxufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gXCJUaGUgXCIgKyBhcmd1bWVudE5hbWUgKyBcIiBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFxcXCJcIiArIGtpbmRPZihpbnB1dFN0YXRlKSArIFwiXFxcIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBcIiArIChcImtleXM6IFxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiXCIpO1xuICB9XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldO1xuICB9KTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFwiVW5leHBlY3RlZCBcIiArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgXCIgXCIgKyAoXCJcXFwiXCIgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIiBmb3VuZCBpbiBcIiArIGFyZ3VtZW50TmFtZSArIFwiLiBcIikgKyBcIkV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIgKyAoXCJcXFwiXCIgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gXCIgKyBcIklmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBcIiArIFwiZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBcIiArIFwibm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgXCIgKyBcInlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gXCIgKyAoXCJEb24ndCB0cnkgdG8gaGFuZGxlICdcIiArIEFjdGlvblR5cGVzLklOSVQgKyBcIicgb3Igb3RoZXIgYWN0aW9ucyBpbiBcXFwicmVkdXgvKlxcXCIgXCIpICsgXCJuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBcIiArIFwiY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgXCIgKyBcImluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBcIiArIFwiYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuXCIpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCByZWR1Y2VyIGZ1bmN0aW9ucywgaW50byBhIHNpbmdsZVxuICogcmVkdWNlciBmdW5jdGlvbi4gSXQgd2lsbCBjYWxsIGV2ZXJ5IGNoaWxkIHJlZHVjZXIsIGFuZCBnYXRoZXIgdGhlaXIgcmVzdWx0c1xuICogaW50byBhIHNpbmdsZSBzdGF0ZSBvYmplY3QsIHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiB0aGUgcGFzc2VkXG4gKiByZWR1Y2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVkdWNlcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudFxuICogcmVkdWNlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkIGludG8gb25lLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpblxuICogaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXMgcmVkdWNlcnNgIHN5bnRheC4gVGhlIHJlZHVjZXJzIG1heSBuZXZlciByZXR1cm5cbiAqIHVuZGVmaW5lZCBmb3IgYW55IGFjdGlvbi4gSW5zdGVhZCwgdGhleSBzaG91bGQgcmV0dXJuIHRoZWlyIGluaXRpYWwgc3RhdGVcbiAqIGlmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlbSB3YXMgdW5kZWZpbmVkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueVxuICogdW5yZWNvZ25pemVkIGFjdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgZXZlcnkgcmVkdWNlciBpbnNpZGUgdGhlXG4gKiBwYXNzZWQgb2JqZWN0LCBhbmQgYnVpbGRzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUuXG4gKi9cblxuXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcmVkdWNlcktleXNbaV07XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3YXJuaW5nKFwiTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTsgLy8gVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB3YXJuIGFib3V0IHRoZSBzYW1lXG4gIC8vIGtleXMgbXVsdGlwbGUgdGltZXMuXG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG5cbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlID0ge307XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcblxuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGF0ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG5cbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlIFwiICsgKGFjdGlvblR5cGUgPyBcIlxcXCJcIiArIFN0cmluZyhhY3Rpb25UeXBlKSArIFwiXFxcIlwiIDogJyh1bmtub3duIHR5cGUpJykgKyBcIiwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBfa2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZC4gXCIgKyBcIlRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gXCIgKyBcIklmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGFjdGlvbiBjcmVhdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBkaXNwYXRjaCB3cmFwcGVkIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwiYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJ1wiICsga2luZE9mKGFjdGlvbkNyZWF0b3JzKSArIFwiJy4gXCIgKyBcIkRpZCB5b3Ugd3JpdGUgXFxcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIiBpbnN0ZWFkIG9mIFxcXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIj9cIik7XG4gIH1cblxuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdG9yZSA9IGNyZWF0ZVN0b3JlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcblxuICAgICAgdmFyIF9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiAnRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gJyArICdPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodm9pZCAwLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpLCB7fSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKlxuICogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuICogSWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1pbmlmaWVkIGFuZCBOT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLCB3YXJuIHRoZSB1c2VyLlxuICovXG5cbmZ1bmN0aW9uIGlzQ3J1c2hlZCgpIHt9XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBpc0NydXNoZWQubmFtZSA9PT0gJ3N0cmluZycgJiYgaXNDcnVzaGVkLm5hbWUgIT09ICdpc0NydXNoZWQnKSB7XG4gIHdhcm5pbmcoJ1lvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIuICcgKyAnVGhpcyBtZWFucyB0aGF0IHlvdSBhcmUgcnVubmluZyBhIHNsb3dlciBkZXZlbG9wbWVudCBidWlsZCBvZiBSZWR1eC4gJyArICdZb3UgY2FuIHVzZSBsb29zZS1lbnZpZnkgKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJ0b3NoL2xvb3NlLWVudmlmeSkgZm9yIGJyb3dzZXJpZnkgJyArICdvciBzZXR0aW5nIG1vZGUgdG8gcHJvZHVjdGlvbiBpbiB3ZWJwYWNrIChodHRwczovL3dlYnBhY2suanMub3JnL2NvbmNlcHRzL21vZGUvKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlIH07XG4iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbnZhciBSZWZsZWN0O1xuKGZ1bmN0aW9uIChSZWZsZWN0KSB7XG4gICAgLy8gTWV0YWRhdGEgUHJvcG9zYWxcbiAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhL1xuICAgIChmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgICAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOlxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByb290LlJlZmxlY3QgPSBSZWZsZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIocm9vdC5SZWZsZWN0LCBleHBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yeShleHBvcnRlcik7XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VFeHBvcnRlcih0YXJnZXQsIHByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KShmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcbiAgICAgICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgICAgIC8vIGZlYXR1cmUgdGVzdCBmb3IgU3ltYm9sIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB2YXIgdG9QcmltaXRpdmVTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLnRvUHJpbWl0aXZlIDogXCJAQHRvUHJpbWl0aXZlXCI7XG4gICAgICAgIHZhciBpdGVyYXRvclN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wuaXRlcmF0b3IgOiBcIkBAaXRlcmF0b3JcIjtcbiAgICAgICAgdmFyIHN1cHBvcnRzQ3JlYXRlID0gdHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIjsgLy8gZmVhdHVyZSB0ZXN0IGZvciBPYmplY3QuY3JlYXRlIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzUHJvdG8gPSB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5OyAvLyBmZWF0dXJlIHRlc3QgZm9yIF9fcHJvdG9fXyBzdXBwb3J0XG4gICAgICAgIHZhciBkb3duTGV2ZWwgPSAhc3VwcG9ydHNDcmVhdGUgJiYgIXN1cHBvcnRzUHJvdG87XG4gICAgICAgIHZhciBIYXNoTWFwID0ge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGFuIG9iamVjdCBpbiBkaWN0aW9uYXJ5IG1vZGUgKGEuay5hLiBcInNsb3dcIiBtb2RlIGluIHY4KVxuICAgICAgICAgICAgY3JlYXRlOiBzdXBwb3J0c0NyZWF0ZVxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoT2JqZWN0LmNyZWF0ZShudWxsKSk7IH1cbiAgICAgICAgICAgICAgICA6IHN1cHBvcnRzUHJvdG9cbiAgICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7IF9fcHJvdG9fXzogbnVsbCB9KTsgfVxuICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHt9KTsgfSxcbiAgICAgICAgICAgIGhhczogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KTsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBrZXkgaW4gbWFwOyB9LFxuICAgICAgICAgICAgZ2V0OiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gbWFwW2tleV07IH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIExvYWQgZ2xvYmFsIG9yIHNoaW0gdmVyc2lvbnMgb2YgTWFwLCBTZXQsIGFuZCBXZWFrTWFwXG4gICAgICAgIHZhciBmdW5jdGlvblByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihGdW5jdGlvbik7XG4gICAgICAgIHZhciB1c2VQb2x5ZmlsbCA9IHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W1wiUkVGTEVDVF9NRVRBREFUQV9VU0VfTUFQX1BPTFlGSUxMXCJdID09PSBcInRydWVcIjtcbiAgICAgICAgdmFyIF9NYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IE1hcCA6IENyZWF0ZU1hcFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciBfU2V0ID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG4gICAgICAgIHZhciBNZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUobWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YU1hcC5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IE1ldGFkYXRhLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIE1ldGFkYXRhLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gTWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICBNZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5zZXQoUCwgbWV0YWRhdGFNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4xLjEgT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgbWV0YWRhdGFNYXAuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKGtleXNPYmopO1xuICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IEl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYgRUNNQVNjcmlwdCBEYXRhIFR5cDBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5fY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVLZXkgIT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMuaW5kZXhPZih0aGlzLl9jYWNoZUtleSA9IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBBcnJheShzaXplKSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVVUlEKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gR2VuUmFuZG9tQnl0ZXMoVVVJRF9TSVpFKTtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHJhbmRvbSAtIFJGQyA0MTIyIMKnIDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCIvLyBDYWNoZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBFcmlrIFJhc211c3NlbidzIGBscnUtbWVtb2l6ZWA6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXJpa3Jhcy9scnUtbWVtb2l6ZVxudmFyIE5PVF9GT1VORCA9ICdOT1RfRk9VTkQnO1xuXG5mdW5jdGlvbiBjcmVhdGVTaW5nbGV0b25DYWNoZShlcXVhbHMpIHtcbiAgdmFyIGVudHJ5O1xuICByZXR1cm4ge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGVudHJ5ICYmIGVxdWFscyhlbnRyeS5rZXksIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICAgIH0sXG4gICAgcHV0OiBmdW5jdGlvbiBwdXQoa2V5LCB2YWx1ZSkge1xuICAgICAgZW50cnkgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH07XG4gICAgfSxcbiAgICBnZXRFbnRyaWVzOiBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGVudHJ5ID8gW2VudHJ5XSA6IFtdO1xuICAgIH0sXG4gICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMcnVDYWNoZShtYXhTaXplLCBlcXVhbHMpIHtcbiAgdmFyIGVudHJpZXMgPSBbXTtcblxuICBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGNhY2hlSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIHJldHVybiBlcXVhbHMoa2V5LCBlbnRyeS5rZXkpO1xuICAgIH0pOyAvLyBXZSBmb3VuZCBhIGNhY2hlZCBlbnRyeVxuXG4gICAgaWYgKGNhY2hlSW5kZXggPiAtMSkge1xuICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tjYWNoZUluZGV4XTsgLy8gQ2FjaGVkIGVudHJ5IG5vdCBhdCB0b3Agb2YgY2FjaGUsIG1vdmUgaXQgdG8gdGhlIHRvcFxuXG4gICAgICBpZiAoY2FjaGVJbmRleCA+IDApIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoY2FjaGVJbmRleCwgMSk7XG4gICAgICAgIGVudHJpZXMudW5zaGlmdChlbnRyeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICB9IC8vIE5vIGVudHJ5IGZvdW5kIGluIGNhY2hlLCByZXR1cm4gc2VudGluZWxcblxuXG4gICAgcmV0dXJuIE5PVF9GT1VORDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1dChrZXksIHZhbHVlKSB7XG4gICAgaWYgKGdldChrZXkpID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIC8vIFRPRE8gSXMgdW5zaGlmdCBzbG93P1xuICAgICAgZW50cmllcy51bnNoaWZ0KHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgICAgZW50cmllcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZW50cmllcyA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXQ6IGdldCxcbiAgICBwdXQ6IHB1dCxcbiAgICBnZXRFbnRyaWVzOiBnZXRFbnRyaWVzLFxuICAgIGNsZWFyOiBjbGVhclxuICB9O1xufVxuXG5leHBvcnQgdmFyIGRlZmF1bHRFcXVhbGl0eUNoZWNrID0gZnVuY3Rpb24gZGVmYXVsdEVxdWFsaXR5Q2hlY2soYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVLZXlDb21wYXJhdG9yKGVxdWFsaXR5Q2hlY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsKHByZXYsIG5leHQpIHtcbiAgICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gRG8gdGhpcyBpbiBhIGZvciBsb29wIChhbmQgbm90IGEgYGZvckVhY2hgIG9yIGFuIGBldmVyeWApIHNvIHdlIGNhbiBkZXRlcm1pbmUgZXF1YWxpdHkgYXMgZmFzdCBhcyBwb3NzaWJsZS5cblxuXG4gICAgdmFyIGxlbmd0aCA9IHByZXYubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlcXVhbGl0eUNoZWNrKHByZXZbaV0sIG5leHRbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbi8vIGRlZmF1bHRNZW1vaXplIG5vdyBzdXBwb3J0cyBhIGNvbmZpZ3VyYWJsZSBjYWNoZSBzaXplIHdpdGggTFJVIGJlaGF2aW9yLFxuLy8gYW5kIG9wdGlvbmFsIGNvbXBhcmlzb24gb2YgdGhlIHJlc3VsdCB2YWx1ZSB3aXRoIGV4aXN0aW5nIHZhbHVlc1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZW1vaXplKGZ1bmMsIGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMpIHtcbiAgdmFyIHByb3ZpZGVkT3B0aW9ucyA9IHR5cGVvZiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zID09PSAnb2JqZWN0JyA/IGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgOiB7XG4gICAgZXF1YWxpdHlDaGVjazogZXF1YWxpdHlDaGVja09yT3B0aW9uc1xuICB9O1xuICB2YXIgX3Byb3ZpZGVkT3B0aW9ucyRlcXVhID0gcHJvdmlkZWRPcHRpb25zLmVxdWFsaXR5Q2hlY2ssXG4gICAgICBlcXVhbGl0eUNoZWNrID0gX3Byb3ZpZGVkT3B0aW9ucyRlcXVhID09PSB2b2lkIDAgPyBkZWZhdWx0RXF1YWxpdHlDaGVjayA6IF9wcm92aWRlZE9wdGlvbnMkZXF1YSxcbiAgICAgIF9wcm92aWRlZE9wdGlvbnMkbWF4UyA9IHByb3ZpZGVkT3B0aW9ucy5tYXhTaXplLFxuICAgICAgbWF4U2l6ZSA9IF9wcm92aWRlZE9wdGlvbnMkbWF4UyA9PT0gdm9pZCAwID8gMSA6IF9wcm92aWRlZE9wdGlvbnMkbWF4UyxcbiAgICAgIHJlc3VsdEVxdWFsaXR5Q2hlY2sgPSBwcm92aWRlZE9wdGlvbnMucmVzdWx0RXF1YWxpdHlDaGVjaztcbiAgdmFyIGNvbXBhcmF0b3IgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjayk7XG4gIHZhciBjYWNoZSA9IG1heFNpemUgPT09IDEgPyBjcmVhdGVTaW5nbGV0b25DYWNoZShjb21wYXJhdG9yKSA6IGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGNvbXBhcmF0b3IpOyAvLyB3ZSByZWZlcmVuY2UgYXJndW1lbnRzIGluc3RlYWQgb2Ygc3ByZWFkaW5nIHRoZW0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcblxuICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICB2YXIgdmFsdWUgPSBjYWNoZS5nZXQoYXJndW1lbnRzKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB2YWx1ZSA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBjYWNoZS5nZXRFbnRyaWVzKCk7XG4gICAgICAgIHZhciBtYXRjaGluZ0VudHJ5ID0gZW50cmllcy5maW5kKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHRFcXVhbGl0eUNoZWNrKGVudHJ5LnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtYXRjaGluZ0VudHJ5KSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaGluZ0VudHJ5LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhY2hlLnB1dChhcmd1bWVudHMsIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWNoZS5jbGVhcigpO1xuICB9O1xuXG4gIHJldHVybiBtZW1vaXplZDtcbn0iLCJpbXBvcnQgeyBkZWZhdWx0TWVtb2l6ZSwgZGVmYXVsdEVxdWFsaXR5Q2hlY2sgfSBmcm9tICcuL2RlZmF1bHRNZW1vaXplJztcbmV4cG9ydCB7IGRlZmF1bHRNZW1vaXplLCBkZWZhdWx0RXF1YWxpdHlDaGVjayB9O1xuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoZnVuY3MpIHtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IEFycmF5LmlzQXJyYXkoZnVuY3NbMF0pID8gZnVuY3NbMF0gOiBmdW5jcztcblxuICBpZiAoIWRlcGVuZGVuY2llcy5ldmVyeShmdW5jdGlvbiAoZGVwKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkZXAgPT09ICdmdW5jdGlvbic7XG4gIH0pKSB7XG4gICAgdmFyIGRlcGVuZGVuY3lUeXBlcyA9IGRlcGVuZGVuY2llcy5tYXAoZnVuY3Rpb24gKGRlcCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBkZXAgPT09ICdmdW5jdGlvbicgPyBcImZ1bmN0aW9uIFwiICsgKGRlcC5uYW1lIHx8ICd1bm5hbWVkJykgKyBcIigpXCIgOiB0eXBlb2YgZGVwO1xuICAgIH0pLmpvaW4oJywgJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgYnV0IHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IFtcIiArIGRlcGVuZGVuY3lUeXBlcyArIFwiXVwiKTtcbiAgfVxuXG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvckNyZWF0b3IobWVtb2l6ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWVtb2l6ZU9wdGlvbnNGcm9tQXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWVtb2l6ZU9wdGlvbnNGcm9tQXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgY3JlYXRlU2VsZWN0b3IgPSBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvcigpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBmdW5jc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBfcmVjb21wdXRhdGlvbnMgPSAwO1xuXG4gICAgdmFyIF9sYXN0UmVzdWx0OyAvLyBEdWUgdG8gdGhlIGludHJpY2FjaWVzIG9mIHJlc3QgcGFyYW1zLCB3ZSBjYW4ndCBkbyBhbiBvcHRpb25hbCBhcmcgYWZ0ZXIgYC4uLmZ1bmNzYC5cbiAgICAvLyBTbywgc3RhcnQgYnkgZGVjbGFyaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuXG4gICAgLy8gKEFuZCB5ZXMsIHRoZSB3b3JkcyAnbWVtb2l6ZScgYW5kICdvcHRpb25zJyBhcHBlYXIgdG9vIG1hbnkgdGltZXMgaW4gdGhpcyBuZXh0IHNlcXVlbmNlLilcblxuXG4gICAgdmFyIGRpcmVjdGx5UGFzc2VkT3B0aW9ucyA9IHtcbiAgICAgIG1lbW9pemVPcHRpb25zOiB1bmRlZmluZWRcbiAgICB9OyAvLyBOb3JtYWxseSwgdGhlIHJlc3VsdCBmdW5jIG9yIFwib3V0cHV0IHNlbGVjdG9yXCIgaXMgdGhlIGxhc3QgYXJnXG5cbiAgICB2YXIgcmVzdWx0RnVuYyA9IGZ1bmNzLnBvcCgpOyAvLyBJZiB0aGUgcmVzdWx0IGZ1bmMgaXMgYWN0dWFsbHkgYW4gX29iamVjdF8sIGFzc3VtZSBpdCdzIG91ciBvcHRpb25zIG9iamVjdFxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHRGdW5jID09PSAnb2JqZWN0Jykge1xuICAgICAgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0gcmVzdWx0RnVuYzsgLy8gYW5kIHBvcCB0aGUgcmVhbCByZXN1bHQgZnVuYyBvZmZcblxuICAgICAgcmVzdWx0RnVuYyA9IGZ1bmNzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0RnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY3JlYXRlU2VsZWN0b3IgZXhwZWN0cyBhbiBvdXRwdXQgZnVuY3Rpb24gYWZ0ZXIgdGhlIGlucHV0cywgYnV0IHJlY2VpdmVkOiBbXCIgKyB0eXBlb2YgcmVzdWx0RnVuYyArIFwiXVwiKTtcbiAgICB9IC8vIERldGVybWluZSB3aGljaCBzZXQgb2Ygb3B0aW9ucyB3ZSdyZSB1c2luZy4gUHJlZmVyIG9wdGlvbnMgcGFzc2VkIGRpcmVjdGx5LFxuICAgIC8vIGJ1dCBmYWxsIGJhY2sgdG8gb3B0aW9ucyBnaXZlbiB0byBjcmVhdGVTZWxlY3RvckNyZWF0b3IuXG5cblxuICAgIHZhciBfZGlyZWN0bHlQYXNzZWRPcHRpb24gPSBkaXJlY3RseVBhc3NlZE9wdGlvbnMsXG4gICAgICAgIF9kaXJlY3RseVBhc3NlZE9wdGlvbjIgPSBfZGlyZWN0bHlQYXNzZWRPcHRpb24ubWVtb2l6ZU9wdGlvbnMsXG4gICAgICAgIG1lbW9pemVPcHRpb25zID0gX2RpcmVjdGx5UGFzc2VkT3B0aW9uMiA9PT0gdm9pZCAwID8gbWVtb2l6ZU9wdGlvbnNGcm9tQXJncyA6IF9kaXJlY3RseVBhc3NlZE9wdGlvbjI7IC8vIFNpbXBsaWZ5aW5nIGFzc3VtcHRpb246IGl0J3MgdW5saWtlbHkgdGhhdCB0aGUgZmlyc3Qgb3B0aW9ucyBhcmcgb2YgdGhlIHByb3ZpZGVkIG1lbW9pemVyXG4gICAgLy8gaXMgYW4gYXJyYXkuIEluIG1vc3QgbGlicyBJJ3ZlIGxvb2tlZCBhdCwgaXQncyBhbiBlcXVhbGl0eSBmdW5jdGlvbiBvciBvcHRpb25zIG9iamVjdC5cbiAgICAvLyBCYXNlZCBvbiB0aGF0LCBpZiBgbWVtb2l6ZU9wdGlvbnNgIF9pc18gYW4gYXJyYXksIHdlIGFzc3VtZSBpdCdzIGEgZnVsbFxuICAgIC8vIHVzZXItcHJvdmlkZWQgYXJyYXkgb2Ygb3B0aW9ucy4gT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIGp1c3QgdGhlIF9maXJzdF8gYXJnLCBhbmQgc29cbiAgICAvLyB3ZSB3cmFwIGl0IGluIGFuIGFycmF5IHNvIHdlIGNhbiBhcHBseSBpdC5cblxuICAgIHZhciBmaW5hbE1lbW9pemVPcHRpb25zID0gQXJyYXkuaXNBcnJheShtZW1vaXplT3B0aW9ucykgPyBtZW1vaXplT3B0aW9ucyA6IFttZW1vaXplT3B0aW9uc107XG4gICAgdmFyIGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhmdW5jcyk7XG4gICAgdmFyIG1lbW9pemVkUmVzdWx0RnVuYyA9IG1lbW9pemUuYXBwbHkodm9pZCAwLCBbZnVuY3Rpb24gKCkge1xuICAgICAgX3JlY29tcHV0YXRpb25zKys7IC8vIGFwcGx5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIHNwcmVhZGluZyBmb3IgcGVyZm9ybWFuY2UuXG5cbiAgICAgIHJldHVybiByZXN1bHRGdW5jLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfV0uY29uY2F0KGZpbmFsTWVtb2l6ZU9wdGlvbnMpKTsgLy8gSWYgYSBzZWxlY3RvciBpcyBjYWxsZWQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBhcmd1bWVudHMgd2UgZG9uJ3QgbmVlZCB0byB0cmF2ZXJzZSBvdXIgZGVwZW5kZW5jaWVzIGFnYWluLlxuXG4gICAgdmFyIHNlbGVjdG9yID0gbWVtb2l6ZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICB2YXIgbGVuZ3RoID0gZGVwZW5kZW5jaWVzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBhcHBseSBhcmd1bWVudHMgaW5zdGVhZCBvZiBzcHJlYWRpbmcgYW5kIG11dGF0ZSBhIGxvY2FsIGxpc3Qgb2YgcGFyYW1zIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBwYXJhbXMucHVzaChkZXBlbmRlbmNpZXNbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICB9IC8vIGFwcGx5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIHNwcmVhZGluZyBmb3IgcGVyZm9ybWFuY2UuXG5cblxuICAgICAgX2xhc3RSZXN1bHQgPSBtZW1vaXplZFJlc3VsdEZ1bmMuYXBwbHkobnVsbCwgcGFyYW1zKTtcbiAgICAgIHJldHVybiBfbGFzdFJlc3VsdDtcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHNlbGVjdG9yLCB7XG4gICAgICByZXN1bHRGdW5jOiByZXN1bHRGdW5jLFxuICAgICAgbWVtb2l6ZWRSZXN1bHRGdW5jOiBtZW1vaXplZFJlc3VsdEZ1bmMsXG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcyxcbiAgICAgIGxhc3RSZXN1bHQ6IGZ1bmN0aW9uIGxhc3RSZXN1bHQoKSB7XG4gICAgICAgIHJldHVybiBfbGFzdFJlc3VsdDtcbiAgICAgIH0sXG4gICAgICByZWNvbXB1dGF0aW9uczogZnVuY3Rpb24gcmVjb21wdXRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBfcmVjb21wdXRhdGlvbnM7XG4gICAgICB9LFxuICAgICAgcmVzZXRSZWNvbXB1dGF0aW9uczogZnVuY3Rpb24gcmVzZXRSZWNvbXB1dGF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIF9yZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9OyAvLyBAdHMtaWdub3JlXG5cblxuICByZXR1cm4gY3JlYXRlU2VsZWN0b3I7XG59XG5leHBvcnQgdmFyIGNyZWF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY3JlYXRlU2VsZWN0b3JDcmVhdG9yKGRlZmF1bHRNZW1vaXplKTtcbi8vIE1hbnVhbCBkZWZpbml0aW9uIG9mIHN0YXRlIGFuZCBvdXRwdXQgYXJndW1lbnRzXG5leHBvcnQgdmFyIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciA9IGZ1bmN0aW9uIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvcihzZWxlY3RvcnMsIHNlbGVjdG9yQ3JlYXRvcikge1xuICBpZiAoc2VsZWN0b3JDcmVhdG9yID09PSB2b2lkIDApIHtcbiAgICBzZWxlY3RvckNyZWF0b3IgPSBjcmVhdGVTZWxlY3RvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2VsZWN0b3JzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIGV4cGVjdHMgZmlyc3QgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0ICcgKyAoXCJ3aGVyZSBlYWNoIHByb3BlcnR5IGlzIGEgc2VsZWN0b3IsIGluc3RlYWQgcmVjZWl2ZWQgYSBcIiArIHR5cGVvZiBzZWxlY3RvcnMpKTtcbiAgfVxuXG4gIHZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0b3JzKTtcbiAgdmFyIHJlc3VsdFNlbGVjdG9yID0gc2VsZWN0b3JDcmVhdG9yKCAvLyBAdHMtaWdub3JlXG4gIG9iamVjdEtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gc2VsZWN0b3JzW2tleV07XG4gIH0pLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIHZhbHVlc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKGZ1bmN0aW9uIChjb21wb3NpdGlvbiwgdmFsdWUsIGluZGV4KSB7XG4gICAgICBjb21wb3NpdGlvbltvYmplY3RLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBjb21wb3NpdGlvbjtcbiAgICB9LCB7fSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0U2VsZWN0b3I7XG59OyIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgREVGQVVMVF9USFJFQURfSUQgPSAwOyAvLyBDb3VudGVycyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuXG5cbnZhciBpbnRlcmFjdGlvbklEQ291bnRlciA9IDA7XG52YXIgdGhyZWFkSURDb3VudGVyID0gMDsgLy8gU2V0IG9mIGN1cnJlbnRseSB0cmFjZWQgaW50ZXJhY3Rpb25zLlxuLy8gSW50ZXJhY3Rpb25zIFwic3RhY2tcIuKAk1xuLy8gTWVhbmluZyB0aGF0IG5ld2x5IHRyYWNlZCBpbnRlcmFjdGlvbnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBzZXQuXG4vLyBXaGVuIGFuIGludGVyYWN0aW9uIGdvZXMgb3V0IG9mIHNjb3BlLCB0aGUgcHJldmlvdXMgc2V0IChpZiBhbnkpIGlzIHJlc3RvcmVkLlxuXG5leHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmID0gbnVsbDsgLy8gTGlzdGVuZXIocykgdG8gbm90aWZ5IHdoZW4gaW50ZXJhY3Rpb25zIGJlZ2luIGFuZCBlbmQuXG5cbmV4cG9ydHMuX19zdWJzY3JpYmVyUmVmID0gbnVsbDtcblxue1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmID0ge1xuICAgIGN1cnJlbnQ6IG5ldyBTZXQoKVxuICB9O1xuICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZiA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9jbGVhcihjYWxsYmFjaykge1xuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBuZXcgU2V0KCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50KCkge1xuICB7XG4gICAgcmV0dXJuIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0VGhyZWFkSUQoKSB7XG4gIHJldHVybiArK3RocmVhZElEQ291bnRlcjtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3RyYWNlKG5hbWUsIHRpbWVzdGFtcCwgY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgX19jb3VudDogMSxcbiAgICBpZDogaW50ZXJhY3Rpb25JRENvdW50ZXIrKyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHRpbWVzdGFtcDogdGltZXN0YW1wXG4gIH07XG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50OyAvLyBUcmFjZWQgaW50ZXJhY3Rpb25zIHNob3VsZCBzdGFjay9hY2N1bXVsYXRlLlxuICAvLyBUbyBkbyB0aGF0LCBjbG9uZSB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gIC8vIFRoZSBwcmV2aW91cyBzZXQgd2lsbCBiZSByZXN0b3JlZCB1cG9uIGNvbXBsZXRpb24uXG5cbiAgdmFyIGludGVyYWN0aW9ucyA9IG5ldyBTZXQocHJldkludGVyYWN0aW9ucyk7XG4gIGludGVyYWN0aW9ucy5hZGQoaW50ZXJhY3Rpb24pO1xuICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBpbnRlcmFjdGlvbnM7XG4gIHZhciBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcbiAgdmFyIHJldHVyblZhbHVlO1xuXG4gIHRyeSB7XG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbik7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07IC8vIElmIG5vIGFzeW5jIHdvcmsgd2FzIHNjaGVkdWxlZCBmb3IgdGhpcyBpbnRlcmFjdGlvbixcbiAgICAgICAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBpdCdzIGNvbXBsZXRlZC5cblxuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsICYmIGludGVyYWN0aW9uLl9fY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXAoY2FsbGJhY2spIHtcbiAgdmFyIHRocmVhZElEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX1RIUkVBRF9JRDtcblxuICB2YXIgd3JhcHBlZEludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgdmFyIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICB9IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG4gIC8vIFVwZGF0ZSBhZnRlciBjYWxsaW5nIHN1YnNjcmliZXJzIGluIGNhc2Ugb2YgZXJyb3IuXG5cblxuICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgaW50ZXJhY3Rpb24uX19jb3VudCsrO1xuICB9KTtcbiAgdmFyIGhhc1J1biA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWQoKSB7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gd3JhcHBlZEludGVyYWN0aW9ucztcbiAgICBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZCh3cmFwcGVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCFoYXNSdW4pIHtcbiAgICAgICAgLy8gV2Ugb25seSBleHBlY3QgYSB3cmFwcGVkIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uY2UsXG4gICAgICAgIC8vIEJ1dCBpbiB0aGUgZXZlbnQgdGhhdCBpdCdzIGV4ZWN1dGVkIG1vcmUgdGhhbiBvbmNl4oCTXG4gICAgICAgIC8vIE9ubHkgZGVjcmVtZW50IHRoZSBvdXRzdGFuZGluZyBpbnRlcmFjdGlvbiBjb3VudHMgb25jZS5cbiAgICAgICAgaGFzUnVuID0gdHJ1ZTsgLy8gVXBkYXRlIHBlbmRpbmcgYXN5bmMgY291bnRzIGZvciBhbGwgd3JhcHBlZCBpbnRlcmFjdGlvbnMuXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IHNjaGVkdWxlZCBhc3luYyB3b3JrIGZvciBhbnkgb2YgdGhlbSxcbiAgICAgICAgLy8gTWFyayB0aGVtIGFzIGNvbXBsZXRlZC5cblxuICAgICAgICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3cmFwcGVkLmNhbmNlbCA9IGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBzdWJzY3JpYmVyLm9uV29ya0NhbmNlbGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gVXBkYXRlIHBlbmRpbmcgYXN5bmMgY291bnRzIGZvciBhbGwgd3JhcHBlZCBpbnRlcmFjdGlvbnMuXG4gICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBzY2hlZHVsZWQgYXN5bmMgd29yayBmb3IgYW55IG9mIHRoZW0sXG4gICAgICAvLyBNYXJrIHRoZW0gYXMgY29tcGxldGVkLlxuICAgICAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07XG5cbiAgICAgICAgaWYgKHN1YnNjcmliZXIgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbnZhciBzdWJzY3JpYmVycyA9IG51bGw7XG5cbntcbiAgc3Vic2NyaWJlcnMgPSBuZXcgU2V0KCk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7XG4gIHtcbiAgICBzdWJzY3JpYmVycy5hZGQoc3Vic2NyaWJlcik7XG5cbiAgICBpZiAoc3Vic2NyaWJlcnMuc2l6ZSA9PT0gMSkge1xuICAgICAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudCA9IHtcbiAgICAgICAgb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQ6IG9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkLFxuICAgICAgICBvbkludGVyYWN0aW9uVHJhY2VkOiBvbkludGVyYWN0aW9uVHJhY2VkLFxuICAgICAgICBvbldvcmtDYW5jZWxlZDogb25Xb3JrQ2FuY2VsZWQsXG4gICAgICAgIG9uV29ya1NjaGVkdWxlZDogb25Xb3JrU2NoZWR1bGVkLFxuICAgICAgICBvbldvcmtTdGFydGVkOiBvbldvcmtTdGFydGVkLFxuICAgICAgICBvbldvcmtTdG9wcGVkOiBvbldvcmtTdG9wcGVkXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5zdGFibGVfdW5zdWJzY3JpYmUoc3Vic2NyaWJlcikge1xuICB7XG4gICAgc3Vic2NyaWJlcnMuZGVsZXRlKHN1YnNjcmliZXIpO1xuXG4gICAgaWYgKHN1YnNjcmliZXJzLnNpemUgPT09IDApIHtcbiAgICAgIGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbikge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCkge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtDYW5jZWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5leHBvcnRzLnVuc3RhYmxlX2NsZWFyID0gdW5zdGFibGVfY2xlYXI7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnQgPSB1bnN0YWJsZV9nZXRDdXJyZW50O1xuZXhwb3J0cy51bnN0YWJsZV9nZXRUaHJlYWRJRCA9IHVuc3RhYmxlX2dldFRocmVhZElEO1xuZXhwb3J0cy51bnN0YWJsZV9zdWJzY3JpYmUgPSB1bnN0YWJsZV9zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3RyYWNlID0gdW5zdGFibGVfdHJhY2U7XG5leHBvcnRzLnVuc3RhYmxlX3Vuc3Vic2NyaWJlID0gdW5zdGFibGVfdW5zdWJzY3JpYmU7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXAgPSB1bnN0YWJsZV93cmFwO1xuICB9KSgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjIwLjJcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcblxudmFyIHJlcXVlc3RIb3N0Q2FsbGJhY2s7XG52YXIgcmVxdWVzdEhvc3RUaW1lb3V0O1xudmFyIGNhbmNlbEhvc3RUaW1lb3V0O1xudmFyIHJlcXVlc3RQYWludDtcbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn1cblxuaWYgKCAvLyBJZiBTY2hlZHVsZXIgcnVucyBpbiBhIG5vbi1ET00gZW52aXJvbm1lbnQsIGl0IGZhbGxzIGJhY2sgdG8gYSBuYWl2ZVxuLy8gaW1wbGVtZW50YXRpb24gdXNpbmcgc2V0VGltZW91dC5cbnR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IC8vIENoZWNrIGlmIE1lc3NhZ2VDaGFubmVsIGlzIHN1cHBvcnRlZCwgdG9vLlxudHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAnZnVuY3Rpb24nKSB7XG4gIC8vIElmIHRoaXMgYWNjaWRlbnRhbGx5IGdldHMgaW1wb3J0ZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCwgZS5nLiBKYXZhU2NyaXB0Q29yZSxcbiAgLy8gZmFsbGJhY2sgdG8gYSBuYWl2ZSBpbXBsZW1lbnRhdGlvbi5cbiAgdmFyIF9jYWxsYmFjayA9IG51bGw7XG4gIHZhciBfdGltZW91dElEID0gbnVsbDtcblxuICB2YXIgX2ZsdXNoQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF9jYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgdmFyIGhhc1JlbWFpbmluZ1RpbWUgPSB0cnVlO1xuXG4gICAgICAgIF9jYWxsYmFjayhoYXNSZW1haW5pbmdUaW1lLCBjdXJyZW50VGltZSk7XG5cbiAgICAgICAgX2NhbGxiYWNrID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc2V0VGltZW91dChfZmx1c2hDYWxsYmFjaywgMCk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJlcXVlc3RIb3N0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICBpZiAoX2NhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAvLyBQcm90ZWN0IGFnYWluc3QgcmUtZW50cmFuY3kuXG4gICAgICBzZXRUaW1lb3V0KHJlcXVlc3RIb3N0Q2FsbGJhY2ssIDAsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NhbGxiYWNrID0gY2I7XG4gICAgICBzZXRUaW1lb3V0KF9mbHVzaENhbGxiYWNrLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgcmVxdWVzdEhvc3RUaW1lb3V0ID0gZnVuY3Rpb24gKGNiLCBtcykge1xuICAgIF90aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGNiLCBtcyk7XG4gIH07XG5cbiAgY2FuY2VsSG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KF90aW1lb3V0SUQpO1xuICB9O1xuXG4gIGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJlcXVlc3RQYWludCA9IGV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmdW5jdGlvbiAoKSB7fTtcbn0gZWxzZSB7XG4gIC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuICB2YXIgX3NldFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dDtcbiAgdmFyIF9jbGVhclRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0O1xuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBUT0RPOiBTY2hlZHVsZXIgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoZXNlIG1ldGhvZHMgdG8gYmUgcG9seWZpbGxlZC4gQnV0XG4gICAgLy8gbWF5YmUgd2Ugd2FudCB0byBjb250aW51ZSB3YXJuaW5nIGlmIHRoZXkgZG9uJ3QgZXhpc3QsIHRvIHByZXNlcnZlIHRoZVxuICAgIC8vIG9wdGlvbiB0byByZWx5IG9uIGl0IGluIHRoZSBmdXR1cmU/XG4gICAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lO1xuXG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgICAgY29uc29sZVsnZXJyb3InXShcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBcIiArICdNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbEFuaW1hdGlvbkZyYW1lLiBcIiArICdNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgdmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gIHZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuICAvLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4gIC8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4gIC8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbiAgdmFyIHlpZWxkSW50ZXJ2YWwgPSA1O1xuICB2YXIgZGVhZGxpbmUgPSAwOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5cbiAge1xuICAgIC8vIGBpc0lucHV0UGVuZGluZ2AgaXMgbm90IGF2YWlsYWJsZS4gU2luY2Ugd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZlxuICAgIC8vIHRoZXJlJ3MgcGVuZGluZyBpbnB1dCwgYWx3YXlzIHlpZWxkIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLlxuICAgIGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKSA+PSBkZWFkbGluZTtcbiAgICB9OyAvLyBTaW5jZSB3ZSB5aWVsZCBldmVyeSBmcmFtZSByZWdhcmRsZXNzLCBgcmVxdWVzdFBhaW50YCBoYXMgbm8gZWZmZWN0LlxuXG5cbiAgICByZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuXG4gIGV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmdW5jdGlvbiAoZnBzKSB7XG4gICAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZwcyA+IDApIHtcbiAgICAgIHlpZWxkSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgICB5aWVsZEludGVydmFsID0gNTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBZaWVsZCBhZnRlciBgeWllbGRJbnRlcnZhbGAgbXMsIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSB2c3luY1xuICAgICAgLy8gY3ljbGUuIFRoaXMgbWVhbnMgdGhlcmUncyBhbHdheXMgdGltZSByZW1haW5pbmcgYXQgdGhlIGJlZ2lubmluZyBvZlxuICAgICAgLy8gdGhlIG1lc3NhZ2UgZXZlbnQuXG5cbiAgICAgIGRlYWRsaW5lID0gY3VycmVudFRpbWUgKyB5aWVsZEludGVydmFsO1xuICAgICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuXG4gICAgICAgIGlmICghaGFzTW9yZVdvcmspIHtcbiAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAgICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG4gIH07XG5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIG1zKSB7XG4gICAgdGFza1RpbWVvdXRJRCA9IF9zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICAgIH0sIG1zKTtcbiAgfTtcblxuICBjYW5jZWxIb3N0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfY2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuXG4gICAgdGFza1RpbWVvdXRJRCA9IC0xO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICByZXR1cm4gZmlyc3QgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBmaXJzdDtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG5cbiAgaWYgKGZpcnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAobGVmdCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jeS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci10cmFjaW5nLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxuLy8gcHJvdG90eXBlIGNsYXNzIGZvciBoYXNoIGZ1bmN0aW9uc1xuZnVuY3Rpb24gSGFzaCAoYmxvY2tTaXplLCBmaW5hbFNpemUpIHtcbiAgdGhpcy5fYmxvY2sgPSBCdWZmZXIuYWxsb2MoYmxvY2tTaXplKVxuICB0aGlzLl9maW5hbFNpemUgPSBmaW5hbFNpemVcbiAgdGhpcy5fYmxvY2tTaXplID0gYmxvY2tTaXplXG4gIHRoaXMuX2xlbiA9IDBcbn1cblxuSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuYykge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gZW5jIHx8ICd1dGY4J1xuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBlbmMpXG4gIH1cblxuICB2YXIgYmxvY2sgPSB0aGlzLl9ibG9ja1xuICB2YXIgYmxvY2tTaXplID0gdGhpcy5fYmxvY2tTaXplXG4gIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aFxuICB2YXIgYWNjdW0gPSB0aGlzLl9sZW5cblxuICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7KSB7XG4gICAgdmFyIGFzc2lnbmVkID0gYWNjdW0gJSBibG9ja1NpemVcbiAgICB2YXIgcmVtYWluZGVyID0gTWF0aC5taW4obGVuZ3RoIC0gb2Zmc2V0LCBibG9ja1NpemUgLSBhc3NpZ25lZClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtYWluZGVyOyBpKyspIHtcbiAgICAgIGJsb2NrW2Fzc2lnbmVkICsgaV0gPSBkYXRhW29mZnNldCArIGldXG4gICAgfVxuXG4gICAgYWNjdW0gKz0gcmVtYWluZGVyXG4gICAgb2Zmc2V0ICs9IHJlbWFpbmRlclxuXG4gICAgaWYgKChhY2N1bSAlIGJsb2NrU2l6ZSkgPT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShibG9jaylcbiAgICB9XG4gIH1cblxuICB0aGlzLl9sZW4gKz0gbGVuZ3RoXG4gIHJldHVybiB0aGlzXG59XG5cbkhhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdmFyIHJlbSA9IHRoaXMuX2xlbiAlIHRoaXMuX2Jsb2NrU2l6ZVxuXG4gIHRoaXMuX2Jsb2NrW3JlbV0gPSAweDgwXG5cbiAgLy8gemVybyAocmVtICsgMSkgdHJhaWxpbmcgYml0cywgd2hlcmUgKHJlbSArIDEpIGlzIHRoZSBzbWFsbGVzdFxuICAvLyBub24tbmVnYXRpdmUgc29sdXRpb24gdG8gdGhlIGVxdWF0aW9uIChsZW5ndGggKyAxICsgKHJlbSArIDEpKSA9PT0gZmluYWxTaXplIG1vZCBibG9ja1NpemVcbiAgdGhpcy5fYmxvY2suZmlsbCgwLCByZW0gKyAxKVxuXG4gIGlmIChyZW0gPj0gdGhpcy5fZmluYWxTaXplKSB7XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKVxuICAgIHRoaXMuX2Jsb2NrLmZpbGwoMClcbiAgfVxuXG4gIHZhciBiaXRzID0gdGhpcy5fbGVuICogOFxuXG4gIC8vIHVpbnQzMlxuICBpZiAoYml0cyA8PSAweGZmZmZmZmZmKSB7XG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShiaXRzLCB0aGlzLl9ibG9ja1NpemUgLSA0KVxuXG4gIC8vIHVpbnQ2NFxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dCaXRzID0gKGJpdHMgJiAweGZmZmZmZmZmKSA+Pj4gMFxuICAgIHZhciBoaWdoQml0cyA9IChiaXRzIC0gbG93Qml0cykgLyAweDEwMDAwMDAwMFxuXG4gICAgdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShoaWdoQml0cywgdGhpcy5fYmxvY2tTaXplIC0gOClcbiAgICB0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGxvd0JpdHMsIHRoaXMuX2Jsb2NrU2l6ZSAtIDQpXG4gIH1cblxuICB0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spXG4gIHZhciBoYXNoID0gdGhpcy5faGFzaCgpXG5cbiAgcmV0dXJuIGVuYyA/IGhhc2gudG9TdHJpbmcoZW5jKSA6IGhhc2hcbn1cblxuSGFzaC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hcbiIsInZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBTSEEgKGFsZ29yaXRobSkge1xuICBhbGdvcml0aG0gPSBhbGdvcml0aG0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBBbGdvcml0aG0gPSBleHBvcnRzW2FsZ29yaXRobV1cbiAgaWYgKCFBbGdvcml0aG0pIHRocm93IG5ldyBFcnJvcihhbGdvcml0aG0gKyAnIGlzIG5vdCBzdXBwb3J0ZWQgKHdlIGFjY2VwdCBwdWxsIHJlcXVlc3RzKScpXG5cbiAgcmV0dXJuIG5ldyBBbGdvcml0aG0oKVxufVxuXG5leHBvcnRzLnNoYSA9IHJlcXVpcmUoJy4vc2hhJylcbmV4cG9ydHMuc2hhMSA9IHJlcXVpcmUoJy4vc2hhMScpXG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhMjI0JylcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEyNTYnKVxuZXhwb3J0cy5zaGEzODQgPSByZXF1aXJlKCcuL3NoYTM4NCcpXG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTAsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzaGExLmpzIG9mIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNIQS0wIGFuZCBTSEEtMSBpcyBqdXN0IGEgYml0d2lzZSByb3RhdGUgbGVmdFxuICogb3BlcmF0aW9uIHdhcyBhZGRlZC5cbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMgfCAwLCAweGNhNjJjMWQ2IHwgMFxuXVxuXG52YXIgVyA9IG5ldyBBcnJheSg4MClcblxuZnVuY3Rpb24gU2hhICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGEsIEhhc2gpXG5cblNoYS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fYSA9IDB4Njc0NTIzMDFcbiAgdGhpcy5fYiA9IDB4ZWZjZGFiODlcbiAgdGhpcy5fYyA9IDB4OThiYWRjZmVcbiAgdGhpcy5fZCA9IDB4MTAzMjU0NzZcbiAgdGhpcy5fZSA9IDB4YzNkMmUxZjBcblxuICByZXR1cm4gdGhpc1xufVxuXG5mdW5jdGlvbiByb3RsNSAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDUpIHwgKG51bSA+Pj4gMjcpXG59XG5cbmZ1bmN0aW9uIHJvdGwzMCAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDMwKSB8IChudW0gPj4+IDIpXG59XG5cbmZ1bmN0aW9uIGZ0IChzLCBiLCBjLCBkKSB7XG4gIGlmIChzID09PSAwKSByZXR1cm4gKGIgJiBjKSB8ICgofmIpICYgZClcbiAgaWYgKHMgPT09IDIpIHJldHVybiAoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZClcbiAgcmV0dXJuIGIgXiBjIF4gZFxufVxuXG5TaGEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAoTSkge1xuICB2YXIgVyA9IHRoaXMuX3dcblxuICB2YXIgYSA9IHRoaXMuX2EgfCAwXG4gIHZhciBiID0gdGhpcy5fYiB8IDBcbiAgdmFyIGMgPSB0aGlzLl9jIHwgMFxuICB2YXIgZCA9IHRoaXMuX2QgfCAwXG4gIHZhciBlID0gdGhpcy5fZSB8IDBcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIFdbaV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0KVxuICBmb3IgKDsgaSA8IDgwOyArK2kpIFdbaV0gPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhLnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjApXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSB8IDAsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IgfCAwLCA0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9jIHwgMCwgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCB8IDAsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lIHwgMCwgMTYpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGFcbiIsIi8qXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTEsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgUFVCIDE4MC0xXG4gKiBWZXJzaW9uIDIuMWEgQ29weXJpZ2h0IFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDIuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBkZXRhaWxzLlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgSyA9IFtcbiAgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYyB8IDAsIDB4Y2E2MmMxZDYgfCAwXG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDgwKVxuXG5mdW5jdGlvbiBTaGExICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgNjQsIDU2KVxufVxuXG5pbmhlcml0cyhTaGExLCBIYXNoKVxuXG5TaGExLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2NzQ1MjMwMVxuICB0aGlzLl9iID0gMHhlZmNkYWI4OVxuICB0aGlzLl9jID0gMHg5OGJhZGNmZVxuICB0aGlzLl9kID0gMHgxMDMyNTQ3NlxuICB0aGlzLl9lID0gMHhjM2QyZTFmMFxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIHJvdGwxIChudW0pIHtcbiAgcmV0dXJuIChudW0gPDwgMSkgfCAobnVtID4+PiAzMSlcbn1cblxuZnVuY3Rpb24gcm90bDUgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCA1KSB8IChudW0gPj4+IDI3KVxufVxuXG5mdW5jdGlvbiByb3RsMzAgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAzMCkgfCAobnVtID4+PiAyKVxufVxuXG5mdW5jdGlvbiBmdCAocywgYiwgYywgZCkge1xuICBpZiAocyA9PT0gMCkgcmV0dXJuIChiICYgYykgfCAoKH5iKSAmIGQpXG4gIGlmIChzID09PSAyKSByZXR1cm4gKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpXG4gIHJldHVybiBiIF4gYyBeIGRcbn1cblxuU2hhMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhID0gdGhpcy5fYSB8IDBcbiAgdmFyIGIgPSB0aGlzLl9iIHwgMFxuICB2YXIgYyA9IHRoaXMuX2MgfCAwXG4gIHZhciBkID0gdGhpcy5fZCB8IDBcbiAgdmFyIGUgPSB0aGlzLl9lIHwgMFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gIGZvciAoOyBpIDwgODA7ICsraSkgV1tpXSA9IHJvdGwxKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0pXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgKytqKSB7XG4gICAgdmFyIHMgPSB+fihqIC8gMjApXG4gICAgdmFyIHQgPSAocm90bDUoYSkgKyBmdChzLCBiLCBjLCBkKSArIGUgKyBXW2pdICsgS1tzXSkgfCAwXG5cbiAgICBlID0gZFxuICAgIGQgPSBjXG4gICAgYyA9IHJvdGwzMChiKVxuICAgIGIgPSBhXG4gICAgYSA9IHRcbiAgfVxuXG4gIHRoaXMuX2EgPSAoYSArIHRoaXMuX2EpIHwgMFxuICB0aGlzLl9iID0gKGIgKyB0aGlzLl9iKSB8IDBcbiAgdGhpcy5fYyA9IChjICsgdGhpcy5fYykgfCAwXG4gIHRoaXMuX2QgPSAoZCArIHRoaXMuX2QpIHwgMFxuICB0aGlzLl9lID0gKGUgKyB0aGlzLl9lKSB8IDBcbn1cblxuU2hhMS5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIwKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EgfCAwLCAwKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9iIHwgMCwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYyB8IDAsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QgfCAwLCAxMilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZSB8IDAsIDE2KVxuXG4gIHJldHVybiBIXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2hhMVxuIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlY3VyZSBIYXNoIEFsZ29yaXRobSwgU0hBLTI1NiwgYXMgZGVmaW5lZFxuICogaW4gRklQUyAxODAtMlxuICogVmVyc2lvbiAyLjItYmV0YSBDb3B5cmlnaHQgQW5nZWwgTWFyaW4sIFBhdWwgSm9obnN0b24gMjAwMCAtIDIwMDkuXG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKlxuICovXG5cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBTaGEyNTYgPSByZXF1aXJlKCcuL3NoYTI1NicpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTIyNCAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTIyNCwgU2hhMjU2KVxuXG5TaGEyMjQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2EgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2IgPSAweDM2N2NkNTA3XG4gIHRoaXMuX2MgPSAweDMwNzBkZDE3XG4gIHRoaXMuX2QgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2UgPSAweGZmYzAwYjMxXG4gIHRoaXMuX2YgPSAweDY4NTgxNTExXG4gIHRoaXMuX2cgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2ggPSAweGJlZmE0ZmE0XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuU2hhMjI0LnByb3RvdHlwZS5faGFzaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIEggPSBCdWZmZXIuYWxsb2NVbnNhZmUoMjgpXG5cbiAgSC53cml0ZUludDMyQkUodGhpcy5fYSwgMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYiwgNClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fYywgOClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZCwgMTIpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2UsIDE2KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9mLCAyMClcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZywgMjQpXG5cbiAgcmV0dXJuIEhcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTaGEyMjRcbiIsIi8qKlxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0sIFNIQS0yNTYsIGFzIGRlZmluZWRcbiAqIGluIEZJUFMgMTgwLTJcbiAqIFZlcnNpb24gMi4yLWJldGEgQ29weXJpZ2h0IEFuZ2VsIE1hcmluLCBQYXVsIEpvaG5zdG9uIDIwMDAgLSAyMDA5LlxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICpcbiAqL1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIEsgPSBbXG4gIDB4NDI4QTJGOTgsIDB4NzEzNzQ0OTEsIDB4QjVDMEZCQ0YsIDB4RTlCNURCQTUsXG4gIDB4Mzk1NkMyNUIsIDB4NTlGMTExRjEsIDB4OTIzRjgyQTQsIDB4QUIxQzVFRDUsXG4gIDB4RDgwN0FBOTgsIDB4MTI4MzVCMDEsIDB4MjQzMTg1QkUsIDB4NTUwQzdEQzMsXG4gIDB4NzJCRTVENzQsIDB4ODBERUIxRkUsIDB4OUJEQzA2QTcsIDB4QzE5QkYxNzQsXG4gIDB4RTQ5QjY5QzEsIDB4RUZCRTQ3ODYsIDB4MEZDMTlEQzYsIDB4MjQwQ0ExQ0MsXG4gIDB4MkRFOTJDNkYsIDB4NEE3NDg0QUEsIDB4NUNCMEE5REMsIDB4NzZGOTg4REEsXG4gIDB4OTgzRTUxNTIsIDB4QTgzMUM2NkQsIDB4QjAwMzI3QzgsIDB4QkY1OTdGQzcsXG4gIDB4QzZFMDBCRjMsIDB4RDVBNzkxNDcsIDB4MDZDQTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdCNzBBODUsIDB4MkUxQjIxMzgsIDB4NEQyQzZERkMsIDB4NTMzODBEMTMsXG4gIDB4NjUwQTczNTQsIDB4NzY2QTBBQkIsIDB4ODFDMkM5MkUsIDB4OTI3MjJDODUsXG4gIDB4QTJCRkU4QTEsIDB4QTgxQTY2NEIsIDB4QzI0QjhCNzAsIDB4Qzc2QzUxQTMsXG4gIDB4RDE5MkU4MTksIDB4RDY5OTA2MjQsIDB4RjQwRTM1ODUsIDB4MTA2QUEwNzAsXG4gIDB4MTlBNEMxMTYsIDB4MUUzNzZDMDgsIDB4Mjc0ODc3NEMsIDB4MzRCMEJDQjUsXG4gIDB4MzkxQzBDQjMsIDB4NEVEOEFBNEEsIDB4NUI5Q0NBNEYsIDB4NjgyRTZGRjMsXG4gIDB4NzQ4RjgyRUUsIDB4NzhBNTYzNkYsIDB4ODRDODc4MTQsIDB4OENDNzAyMDgsXG4gIDB4OTBCRUZGRkEsIDB4QTQ1MDZDRUIsIDB4QkVGOUEzRjcsIDB4QzY3MTc4RjJcbl1cblxudmFyIFcgPSBuZXcgQXJyYXkoNjQpXG5cbmZ1bmN0aW9uIFNoYTI1NiAoKSB7XG4gIHRoaXMuaW5pdCgpXG5cbiAgdGhpcy5fdyA9IFcgLy8gbmV3IEFycmF5KDY0KVxuXG4gIEhhc2guY2FsbCh0aGlzLCA2NCwgNTYpXG59XG5cbmluaGVyaXRzKFNoYTI1NiwgSGFzaClcblxuU2hhMjU2LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hID0gMHg2YTA5ZTY2N1xuICB0aGlzLl9iID0gMHhiYjY3YWU4NVxuICB0aGlzLl9jID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kID0gMHhhNTRmZjUzYVxuICB0aGlzLl9lID0gMHg1MTBlNTI3ZlxuICB0aGlzLl9mID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9nID0gMHgxZjgzZDlhYlxuICB0aGlzLl9oID0gMHg1YmUwY2QxOVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGNoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDIgfCB4IDw8IDMwKSBeICh4ID4+PiAxMyB8IHggPDwgMTkpIF4gKHggPj4+IDIyIHwgeCA8PCAxMClcbn1cblxuZnVuY3Rpb24gc2lnbWExICh4KSB7XG4gIHJldHVybiAoeCA+Pj4gNiB8IHggPDwgMjYpIF4gKHggPj4+IDExIHwgeCA8PCAyMSkgXiAoeCA+Pj4gMjUgfCB4IDw8IDcpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMCAoeCkge1xuICByZXR1cm4gKHggPj4+IDcgfCB4IDw8IDI1KSBeICh4ID4+PiAxOCB8IHggPDwgMTQpIF4gKHggPj4+IDMpXG59XG5cbmZ1bmN0aW9uIGdhbW1hMSAoeCkge1xuICByZXR1cm4gKHggPj4+IDE3IHwgeCA8PCAxNSkgXiAoeCA+Pj4gMTkgfCB4IDw8IDEzKSBeICh4ID4+PiAxMClcbn1cblxuU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gKE0pIHtcbiAgdmFyIFcgPSB0aGlzLl93XG5cbiAgdmFyIGEgPSB0aGlzLl9hIHwgMFxuICB2YXIgYiA9IHRoaXMuX2IgfCAwXG4gIHZhciBjID0gdGhpcy5fYyB8IDBcbiAgdmFyIGQgPSB0aGlzLl9kIHwgMFxuICB2YXIgZSA9IHRoaXMuX2UgfCAwXG4gIHZhciBmID0gdGhpcy5fZiB8IDBcbiAgdmFyIGcgPSB0aGlzLl9nIHwgMFxuICB2YXIgaCA9IHRoaXMuX2ggfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSBXW2ldID0gTS5yZWFkSW50MzJCRShpICogNClcbiAgZm9yICg7IGkgPCA2NDsgKytpKSBXW2ldID0gKGdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIGdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdKSB8IDBcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IDY0OyArK2opIHtcbiAgICB2YXIgVDEgPSAoaCArIHNpZ21hMShlKSArIGNoKGUsIGYsIGcpICsgS1tqXSArIFdbal0pIHwgMFxuICAgIHZhciBUMiA9IChzaWdtYTAoYSkgKyBtYWooYSwgYiwgYykpIHwgMFxuXG4gICAgaCA9IGdcbiAgICBnID0gZlxuICAgIGYgPSBlXG4gICAgZSA9IChkICsgVDEpIHwgMFxuICAgIGQgPSBjXG4gICAgYyA9IGJcbiAgICBiID0gYVxuICAgIGEgPSAoVDEgKyBUMikgfCAwXG4gIH1cblxuICB0aGlzLl9hID0gKGEgKyB0aGlzLl9hKSB8IDBcbiAgdGhpcy5fYiA9IChiICsgdGhpcy5fYikgfCAwXG4gIHRoaXMuX2MgPSAoYyArIHRoaXMuX2MpIHwgMFxuICB0aGlzLl9kID0gKGQgKyB0aGlzLl9kKSB8IDBcbiAgdGhpcy5fZSA9IChlICsgdGhpcy5fZSkgfCAwXG4gIHRoaXMuX2YgPSAoZiArIHRoaXMuX2YpIHwgMFxuICB0aGlzLl9nID0gKGcgKyB0aGlzLl9nKSB8IDBcbiAgdGhpcy5faCA9IChoICsgdGhpcy5faCkgfCAwXG59XG5cblNoYTI1Ni5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDMyKVxuXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EsIDApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2IsIDQpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2MsIDgpXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2QsIDEyKVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9lLCAxNilcbiAgSC53cml0ZUludDMyQkUodGhpcy5fZiwgMjApXG4gIEgud3JpdGVJbnQzMkJFKHRoaXMuX2csIDI0KVxuICBILndyaXRlSW50MzJCRSh0aGlzLl9oLCAyOClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTI1NlxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIFNIQTUxMiA9IHJlcXVpcmUoJy4vc2hhNTEyJylcbnZhciBIYXNoID0gcmVxdWlyZSgnLi9oYXNoJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgVyA9IG5ldyBBcnJheSgxNjApXG5cbmZ1bmN0aW9uIFNoYTM4NCAoKSB7XG4gIHRoaXMuaW5pdCgpXG4gIHRoaXMuX3cgPSBXXG5cbiAgSGFzaC5jYWxsKHRoaXMsIDEyOCwgMTEyKVxufVxuXG5pbmhlcml0cyhTaGEzODQsIFNIQTUxMilcblxuU2hhMzg0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4Y2JiYjlkNWRcbiAgdGhpcy5fYmggPSAweDYyOWEyOTJhXG4gIHRoaXMuX2NoID0gMHg5MTU5MDE1YVxuICB0aGlzLl9kaCA9IDB4MTUyZmVjZDhcbiAgdGhpcy5fZWggPSAweDY3MzMyNjY3XG4gIHRoaXMuX2ZoID0gMHg4ZWI0NGE4N1xuICB0aGlzLl9naCA9IDB4ZGIwYzJlMGRcbiAgdGhpcy5faGggPSAweDQ3YjU0ODFkXG5cbiAgdGhpcy5fYWwgPSAweGMxMDU5ZWQ4XG4gIHRoaXMuX2JsID0gMHgzNjdjZDUwN1xuICB0aGlzLl9jbCA9IDB4MzA3MGRkMTdcbiAgdGhpcy5fZGwgPSAweGY3MGU1OTM5XG4gIHRoaXMuX2VsID0gMHhmZmMwMGIzMVxuICB0aGlzLl9mbCA9IDB4Njg1ODE1MTFcbiAgdGhpcy5fZ2wgPSAweDY0Zjk4ZmE3XG4gIHRoaXMuX2hsID0gMHhiZWZhNGZhNFxuXG4gIHJldHVybiB0aGlzXG59XG5cblNoYTM4NC5wcm90b3R5cGUuX2hhc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBIID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQ4KVxuXG4gIGZ1bmN0aW9uIHdyaXRlSW50NjRCRSAoaCwgbCwgb2Zmc2V0KSB7XG4gICAgSC53cml0ZUludDMyQkUoaCwgb2Zmc2V0KVxuICAgIEgud3JpdGVJbnQzMkJFKGwsIG9mZnNldCArIDQpXG4gIH1cblxuICB3cml0ZUludDY0QkUodGhpcy5fYWgsIHRoaXMuX2FsLCAwKVxuICB3cml0ZUludDY0QkUodGhpcy5fYmgsIHRoaXMuX2JsLCA4KVxuICB3cml0ZUludDY0QkUodGhpcy5fY2gsIHRoaXMuX2NsLCAxNilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLCB0aGlzLl9kbCwgMjQpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9laCwgdGhpcy5fZWwsIDMyKVxuICB3cml0ZUludDY0QkUodGhpcy5fZmgsIHRoaXMuX2ZsLCA0MClcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTM4NFxuIiwidmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbnZhciBLID0gW1xuICAweDQyOGEyZjk4LCAweGQ3MjhhZTIyLCAweDcxMzc0NDkxLCAweDIzZWY2NWNkLFxuICAweGI1YzBmYmNmLCAweGVjNGQzYjJmLCAweGU5YjVkYmE1LCAweDgxODlkYmJjLFxuICAweDM5NTZjMjViLCAweGYzNDhiNTM4LCAweDU5ZjExMWYxLCAweGI2MDVkMDE5LFxuICAweDkyM2Y4MmE0LCAweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4LFxuICAweGQ4MDdhYTk4LCAweGEzMDMwMjQyLCAweDEyODM1YjAxLCAweDQ1NzA2ZmJlLFxuICAweDI0MzE4NWJlLCAweDRlZTRiMjhjLCAweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyLFxuICAweDcyYmU1ZDc0LCAweGYyN2I4OTZmLCAweDgwZGViMWZlLCAweDNiMTY5NmIxLFxuICAweDliZGMwNmE3LCAweDI1YzcxMjM1LCAweGMxOWJmMTc0LCAweGNmNjkyNjk0LFxuICAweGU0OWI2OWMxLCAweDllZjE0YWQyLCAweGVmYmU0Nzg2LCAweDM4NGYyNWUzLFxuICAweDBmYzE5ZGM2LCAweDhiOGNkNWI1LCAweDI0MGNhMWNjLCAweDc3YWM5YzY1LFxuICAweDJkZTkyYzZmLCAweDU5MmIwMjc1LCAweDRhNzQ4NGFhLCAweDZlYTZlNDgzLFxuICAweDVjYjBhOWRjLCAweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLCAweDgzMTE1M2I1LFxuICAweDk4M2U1MTUyLCAweGVlNjZkZmFiLCAweGE4MzFjNjZkLCAweDJkYjQzMjEwLFxuICAweGIwMDMyN2M4LCAweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LCAweGJlZWYwZWU0LFxuICAweGM2ZTAwYmYzLCAweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LCAweDkzMGFhNzI1LFxuICAweDA2Y2E2MzUxLCAweGUwMDM4MjZmLCAweDE0MjkyOTY3LCAweDBhMGU2ZTcwLFxuICAweDI3YjcwYTg1LCAweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LCAweDVjMjZjOTI2LFxuICAweDRkMmM2ZGZjLCAweDVhYzQyYWVkLCAweDUzMzgwZDEzLCAweDlkOTViM2RmLFxuICAweDY1MGE3MzU0LCAweDhiYWY2M2RlLCAweDc2NmEwYWJiLCAweDNjNzdiMmE4LFxuICAweDgxYzJjOTJlLCAweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LCAweDE0ODIzNTNiLFxuICAweGEyYmZlOGExLCAweDRjZjEwMzY0LCAweGE4MWE2NjRiLCAweGJjNDIzMDAxLFxuICAweGMyNGI4YjcwLCAweGQwZjg5NzkxLCAweGM3NmM1MWEzLCAweDA2NTRiZTMwLFxuICAweGQxOTJlODE5LCAweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LCAweDU1NjVhOTEwLFxuICAweGY0MGUzNTg1LCAweDU3NzEyMDJhLCAweDEwNmFhMDcwLCAweDMyYmJkMWI4LFxuICAweDE5YTRjMTE2LCAweGI4ZDJkMGM4LCAweDFlMzc2YzA4LCAweDUxNDFhYjUzLFxuICAweDI3NDg3NzRjLCAweGRmOGVlYjk5LCAweDM0YjBiY2I1LCAweGUxOWI0OGE4LFxuICAweDM5MWMwY2IzLCAweGM1Yzk1YTYzLCAweDRlZDhhYTRhLCAweGUzNDE4YWNiLFxuICAweDViOWNjYTRmLCAweDc3NjNlMzczLCAweDY4MmU2ZmYzLCAweGQ2YjJiOGEzLFxuICAweDc0OGY4MmVlLCAweDVkZWZiMmZjLCAweDc4YTU2MzZmLCAweDQzMTcyZjYwLFxuICAweDg0Yzg3ODE0LCAweGExZjBhYjcyLCAweDhjYzcwMjA4LCAweDFhNjQzOWVjLFxuICAweDkwYmVmZmZhLCAweDIzNjMxZTI4LCAweGE0NTA2Y2ViLCAweGRlODJiZGU5LFxuICAweGJlZjlhM2Y3LCAweGIyYzY3OTE1LCAweGM2NzE3OGYyLCAweGUzNzI1MzJiLFxuICAweGNhMjczZWNlLCAweGVhMjY2MTljLCAweGQxODZiOGM3LCAweDIxYzBjMjA3LFxuICAweGVhZGE3ZGQ2LCAweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLCAweGVlNmVkMTc4LFxuICAweDA2ZjA2N2FhLCAweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LCAweGEyYzg5OGE2LFxuICAweDExM2Y5ODA0LCAweGJlZjkwZGFlLCAweDFiNzEwYjM1LCAweDEzMWM0NzFiLFxuICAweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLCAweDQwYzcyNDkzLFxuICAweDNjOWViZTBhLCAweDE1YzliZWJjLCAweDQzMWQ2N2M0LCAweDljMTAwZDRjLFxuICAweDRjYzVkNGJlLCAweGNiM2U0MmI2LCAweDU5N2YyOTljLCAweGZjNjU3ZTJhLFxuICAweDVmY2I2ZmFiLCAweDNhZDZmYWVjLCAweDZjNDQxOThjLCAweDRhNDc1ODE3XG5dXG5cbnZhciBXID0gbmV3IEFycmF5KDE2MClcblxuZnVuY3Rpb24gU2hhNTEyICgpIHtcbiAgdGhpcy5pbml0KClcbiAgdGhpcy5fdyA9IFdcblxuICBIYXNoLmNhbGwodGhpcywgMTI4LCAxMTIpXG59XG5cbmluaGVyaXRzKFNoYTUxMiwgSGFzaClcblxuU2hhNTEyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9haCA9IDB4NmEwOWU2NjdcbiAgdGhpcy5fYmggPSAweGJiNjdhZTg1XG4gIHRoaXMuX2NoID0gMHgzYzZlZjM3MlxuICB0aGlzLl9kaCA9IDB4YTU0ZmY1M2FcbiAgdGhpcy5fZWggPSAweDUxMGU1MjdmXG4gIHRoaXMuX2ZoID0gMHg5YjA1Njg4Y1xuICB0aGlzLl9naCA9IDB4MWY4M2Q5YWJcbiAgdGhpcy5faGggPSAweDViZTBjZDE5XG5cbiAgdGhpcy5fYWwgPSAweGYzYmNjOTA4XG4gIHRoaXMuX2JsID0gMHg4NGNhYTczYlxuICB0aGlzLl9jbCA9IDB4ZmU5NGY4MmJcbiAgdGhpcy5fZGwgPSAweDVmMWQzNmYxXG4gIHRoaXMuX2VsID0gMHhhZGU2ODJkMVxuICB0aGlzLl9mbCA9IDB4MmIzZTZjMWZcbiAgdGhpcy5fZ2wgPSAweGZiNDFiZDZiXG4gIHRoaXMuX2hsID0gMHgxMzdlMjE3OVxuXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIENoICh4LCB5LCB6KSB7XG4gIHJldHVybiB6IF4gKHggJiAoeSBeIHopKVxufVxuXG5mdW5jdGlvbiBtYWogKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgfCAoeiAmICh4IHwgeSkpXG59XG5cbmZ1bmN0aW9uIHNpZ21hMCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAyOCB8IHhsIDw8IDQpIF4gKHhsID4+PiAyIHwgeCA8PCAzMCkgXiAoeGwgPj4+IDcgfCB4IDw8IDI1KVxufVxuXG5mdW5jdGlvbiBzaWdtYTEgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMTQgfCB4bCA8PCAxOCkgXiAoeCA+Pj4gMTggfCB4bCA8PCAxNCkgXiAoeGwgPj4+IDkgfCB4IDw8IDIzKVxufVxuXG5mdW5jdGlvbiBHYW1tYTAgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcpXG59XG5cbmZ1bmN0aW9uIEdhbW1hMGwgKHgsIHhsKSB7XG4gIHJldHVybiAoeCA+Pj4gMSB8IHhsIDw8IDMxKSBeICh4ID4+PiA4IHwgeGwgPDwgMjQpIF4gKHggPj4+IDcgfCB4bCA8PCAyNSlcbn1cblxuZnVuY3Rpb24gR2FtbWExICh4LCB4bCkge1xuICByZXR1cm4gKHggPj4+IDE5IHwgeGwgPDwgMTMpIF4gKHhsID4+PiAyOSB8IHggPDwgMykgXiAoeCA+Pj4gNilcbn1cblxuZnVuY3Rpb24gR2FtbWExbCAoeCwgeGwpIHtcbiAgcmV0dXJuICh4ID4+PiAxOSB8IHhsIDw8IDEzKSBeICh4bCA+Pj4gMjkgfCB4IDw8IDMpIF4gKHggPj4+IDYgfCB4bCA8PCAyNilcbn1cblxuZnVuY3Rpb24gZ2V0Q2FycnkgKGEsIGIpIHtcbiAgcmV0dXJuIChhID4+PiAwKSA8IChiID4+PiAwKSA/IDEgOiAwXG59XG5cblNoYTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIChNKSB7XG4gIHZhciBXID0gdGhpcy5fd1xuXG4gIHZhciBhaCA9IHRoaXMuX2FoIHwgMFxuICB2YXIgYmggPSB0aGlzLl9iaCB8IDBcbiAgdmFyIGNoID0gdGhpcy5fY2ggfCAwXG4gIHZhciBkaCA9IHRoaXMuX2RoIHwgMFxuICB2YXIgZWggPSB0aGlzLl9laCB8IDBcbiAgdmFyIGZoID0gdGhpcy5fZmggfCAwXG4gIHZhciBnaCA9IHRoaXMuX2doIHwgMFxuICB2YXIgaGggPSB0aGlzLl9oaCB8IDBcblxuICB2YXIgYWwgPSB0aGlzLl9hbCB8IDBcbiAgdmFyIGJsID0gdGhpcy5fYmwgfCAwXG4gIHZhciBjbCA9IHRoaXMuX2NsIHwgMFxuICB2YXIgZGwgPSB0aGlzLl9kbCB8IDBcbiAgdmFyIGVsID0gdGhpcy5fZWwgfCAwXG4gIHZhciBmbCA9IHRoaXMuX2ZsIHwgMFxuICB2YXIgZ2wgPSB0aGlzLl9nbCB8IDBcbiAgdmFyIGhsID0gdGhpcy5faGwgfCAwXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSArPSAyKSB7XG4gICAgV1tpXSA9IE0ucmVhZEludDMyQkUoaSAqIDQpXG4gICAgV1tpICsgMV0gPSBNLnJlYWRJbnQzMkJFKGkgKiA0ICsgNClcbiAgfVxuICBmb3IgKDsgaSA8IDE2MDsgaSArPSAyKSB7XG4gICAgdmFyIHhoID0gV1tpIC0gMTUgKiAyXVxuICAgIHZhciB4bCA9IFdbaSAtIDE1ICogMiArIDFdXG4gICAgdmFyIGdhbW1hMCA9IEdhbW1hMCh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMGwgPSBHYW1tYTBsKHhsLCB4aClcblxuICAgIHhoID0gV1tpIC0gMiAqIDJdXG4gICAgeGwgPSBXW2kgLSAyICogMiArIDFdXG4gICAgdmFyIGdhbW1hMSA9IEdhbW1hMSh4aCwgeGwpXG4gICAgdmFyIGdhbW1hMWwgPSBHYW1tYTFsKHhsLCB4aClcblxuICAgIC8vIFdbaV0gPSBnYW1tYTAgKyBXW2kgLSA3XSArIGdhbW1hMSArIFdbaSAtIDE2XVxuICAgIHZhciBXaTdoID0gV1tpIC0gNyAqIDJdXG4gICAgdmFyIFdpN2wgPSBXW2kgLSA3ICogMiArIDFdXG5cbiAgICB2YXIgV2kxNmggPSBXW2kgLSAxNiAqIDJdXG4gICAgdmFyIFdpMTZsID0gV1tpIC0gMTYgKiAyICsgMV1cblxuICAgIHZhciBXaWwgPSAoZ2FtbWEwbCArIFdpN2wpIHwgMFxuICAgIHZhciBXaWggPSAoZ2FtbWEwICsgV2k3aCArIGdldENhcnJ5KFdpbCwgZ2FtbWEwbCkpIHwgMFxuICAgIFdpbCA9IChXaWwgKyBnYW1tYTFsKSB8IDBcbiAgICBXaWggPSAoV2loICsgZ2FtbWExICsgZ2V0Q2FycnkoV2lsLCBnYW1tYTFsKSkgfCAwXG4gICAgV2lsID0gKFdpbCArIFdpMTZsKSB8IDBcbiAgICBXaWggPSAoV2loICsgV2kxNmggKyBnZXRDYXJyeShXaWwsIFdpMTZsKSkgfCAwXG5cbiAgICBXW2ldID0gV2loXG4gICAgV1tpICsgMV0gPSBXaWxcbiAgfVxuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgMTYwOyBqICs9IDIpIHtcbiAgICBXaWggPSBXW2pdXG4gICAgV2lsID0gV1tqICsgMV1cblxuICAgIHZhciBtYWpoID0gbWFqKGFoLCBiaCwgY2gpXG4gICAgdmFyIG1hamwgPSBtYWooYWwsIGJsLCBjbClcblxuICAgIHZhciBzaWdtYTBoID0gc2lnbWEwKGFoLCBhbClcbiAgICB2YXIgc2lnbWEwbCA9IHNpZ21hMChhbCwgYWgpXG4gICAgdmFyIHNpZ21hMWggPSBzaWdtYTEoZWgsIGVsKVxuICAgIHZhciBzaWdtYTFsID0gc2lnbWExKGVsLCBlaClcblxuICAgIC8vIHQxID0gaCArIHNpZ21hMSArIGNoICsgS1tqXSArIFdbal1cbiAgICB2YXIgS2loID0gS1tqXVxuICAgIHZhciBLaWwgPSBLW2ogKyAxXVxuXG4gICAgdmFyIGNoaCA9IENoKGVoLCBmaCwgZ2gpXG4gICAgdmFyIGNobCA9IENoKGVsLCBmbCwgZ2wpXG5cbiAgICB2YXIgdDFsID0gKGhsICsgc2lnbWExbCkgfCAwXG4gICAgdmFyIHQxaCA9IChoaCArIHNpZ21hMWggKyBnZXRDYXJyeSh0MWwsIGhsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIGNobCkgfCAwXG4gICAgdDFoID0gKHQxaCArIGNoaCArIGdldENhcnJ5KHQxbCwgY2hsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIEtpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIEtpaCArIGdldENhcnJ5KHQxbCwgS2lsKSkgfCAwXG4gICAgdDFsID0gKHQxbCArIFdpbCkgfCAwXG4gICAgdDFoID0gKHQxaCArIFdpaCArIGdldENhcnJ5KHQxbCwgV2lsKSkgfCAwXG5cbiAgICAvLyB0MiA9IHNpZ21hMCArIG1halxuICAgIHZhciB0MmwgPSAoc2lnbWEwbCArIG1hamwpIHwgMFxuICAgIHZhciB0MmggPSAoc2lnbWEwaCArIG1hamggKyBnZXRDYXJyeSh0MmwsIHNpZ21hMGwpKSB8IDBcblxuICAgIGhoID0gZ2hcbiAgICBobCA9IGdsXG4gICAgZ2ggPSBmaFxuICAgIGdsID0gZmxcbiAgICBmaCA9IGVoXG4gICAgZmwgPSBlbFxuICAgIGVsID0gKGRsICsgdDFsKSB8IDBcbiAgICBlaCA9IChkaCArIHQxaCArIGdldENhcnJ5KGVsLCBkbCkpIHwgMFxuICAgIGRoID0gY2hcbiAgICBkbCA9IGNsXG4gICAgY2ggPSBiaFxuICAgIGNsID0gYmxcbiAgICBiaCA9IGFoXG4gICAgYmwgPSBhbFxuICAgIGFsID0gKHQxbCArIHQybCkgfCAwXG4gICAgYWggPSAodDFoICsgdDJoICsgZ2V0Q2FycnkoYWwsIHQxbCkpIHwgMFxuICB9XG5cbiAgdGhpcy5fYWwgPSAodGhpcy5fYWwgKyBhbCkgfCAwXG4gIHRoaXMuX2JsID0gKHRoaXMuX2JsICsgYmwpIHwgMFxuICB0aGlzLl9jbCA9ICh0aGlzLl9jbCArIGNsKSB8IDBcbiAgdGhpcy5fZGwgPSAodGhpcy5fZGwgKyBkbCkgfCAwXG4gIHRoaXMuX2VsID0gKHRoaXMuX2VsICsgZWwpIHwgMFxuICB0aGlzLl9mbCA9ICh0aGlzLl9mbCArIGZsKSB8IDBcbiAgdGhpcy5fZ2wgPSAodGhpcy5fZ2wgKyBnbCkgfCAwXG4gIHRoaXMuX2hsID0gKHRoaXMuX2hsICsgaGwpIHwgMFxuXG4gIHRoaXMuX2FoID0gKHRoaXMuX2FoICsgYWggKyBnZXRDYXJyeSh0aGlzLl9hbCwgYWwpKSB8IDBcbiAgdGhpcy5fYmggPSAodGhpcy5fYmggKyBiaCArIGdldENhcnJ5KHRoaXMuX2JsLCBibCkpIHwgMFxuICB0aGlzLl9jaCA9ICh0aGlzLl9jaCArIGNoICsgZ2V0Q2FycnkodGhpcy5fY2wsIGNsKSkgfCAwXG4gIHRoaXMuX2RoID0gKHRoaXMuX2RoICsgZGggKyBnZXRDYXJyeSh0aGlzLl9kbCwgZGwpKSB8IDBcbiAgdGhpcy5fZWggPSAodGhpcy5fZWggKyBlaCArIGdldENhcnJ5KHRoaXMuX2VsLCBlbCkpIHwgMFxuICB0aGlzLl9maCA9ICh0aGlzLl9maCArIGZoICsgZ2V0Q2FycnkodGhpcy5fZmwsIGZsKSkgfCAwXG4gIHRoaXMuX2doID0gKHRoaXMuX2doICsgZ2ggKyBnZXRDYXJyeSh0aGlzLl9nbCwgZ2wpKSB8IDBcbiAgdGhpcy5faGggPSAodGhpcy5faGggKyBoaCArIGdldENhcnJ5KHRoaXMuX2hsLCBobCkpIHwgMFxufVxuXG5TaGE1MTIucHJvdG90eXBlLl9oYXNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgSCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg2NClcblxuICBmdW5jdGlvbiB3cml0ZUludDY0QkUgKGgsIGwsIG9mZnNldCkge1xuICAgIEgud3JpdGVJbnQzMkJFKGgsIG9mZnNldClcbiAgICBILndyaXRlSW50MzJCRShsLCBvZmZzZXQgKyA0KVxuICB9XG5cbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2FoLCB0aGlzLl9hbCwgMClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2JoLCB0aGlzLl9ibCwgOClcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLCB0aGlzLl9jbCwgMTYpXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9kaCwgdGhpcy5fZGwsIDI0KVxuICB3cml0ZUludDY0QkUodGhpcy5fZWgsIHRoaXMuX2VsLCAzMilcbiAgd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLCB0aGlzLl9mbCwgNDApXG4gIHdyaXRlSW50NjRCRSh0aGlzLl9naCwgdGhpcy5fZ2wsIDQ4KVxuICB3cml0ZUludDY0QkUodGhpcy5faGgsIHRoaXMuX2hsLCA1NilcblxuICByZXR1cm4gSFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYTUxMlxuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IE1zc3FsUGFyYW1ldGVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvTXNzcWxQYXJhbWV0ZXJcIjtcbmltcG9ydCB7IFNxbFNlcnZlckRyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbi8qKlxuICogQ2FjaGVzIHF1ZXJ5IHJlc3VsdCBpbnRvIGN1cnJlbnQgZGF0YWJhc2UsIGludG8gc2VwYXJhdGUgdGFibGUgY2FsbGVkIFwicXVlcnktcmVzdWx0LWNhY2hlXCIuXG4gKi9cbnZhciBEYlF1ZXJ5UmVzdWx0Q2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIERiUXVlcnlSZXN1bHRDYWNoZShjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHZhciBzY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMuc2NoZW1hO1xuICAgICAgICB2YXIgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFiYXNlO1xuICAgICAgICB2YXIgY2FjaGVPcHRpb25zID0gdHlwZW9mIHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlID09PSBcIm9iamVjdFwiID8gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGUgOiB7fTtcbiAgICAgICAgdmFyIGNhY2hlVGFibGVOYW1lID0gY2FjaGVPcHRpb25zLnRhYmxlTmFtZSB8fCBcInF1ZXJ5LXJlc3VsdC1jYWNoZVwiO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVEYXRhYmFzZSA9IGRhdGFiYXNlO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVTY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRDYWNoZVRhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShjYWNoZVRhYmxlTmFtZSwgc2NoZW1hLCBkYXRhYmFzZSk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB3aXRoIGdpdmVuIGNhY2hlIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIERiUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHdpdGggZ2l2ZW4gY2FjaGUgcHJvdmlkZXIuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0YWJsZSBmb3Igc3RvcmluZyBjYWNoZSBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5zeW5jaHJvbml6ZSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZHJpdmVyLCB0YWJsZUV4aXN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLmdldFF1ZXJ5UnVubmVyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5oYXNUYWJsZSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUV4aXN0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUobmV3IFRhYmxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMucXVlcnlSZXN1bHRDYWNoZURhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHRoaXMucXVlcnlSZXN1bHRDYWNoZVNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jYWNoZUlkIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25TdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkZW50aWZpZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVJZGVudGlmaWVyIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiBkcml2ZXIubWFwcGVkRGF0YVR5cGVzLmNhY2hlVGltZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVEdXJhdGlvbiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicXVlcnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IGRyaXZlci5tYXBwZWREYXRhVHlwZXMuY2FjaGVRdWVyeSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiBkcml2ZXIubWFwcGVkRGF0YVR5cGVzLmNhY2hlUmVzdWx0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhY2hlcyBnaXZlbiBxdWVyeSByZXN1bHQuXG4gICAgICogUmV0dXJucyBjYWNoZSByZXN1bHQgaWYgZm91bmQuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgcmVzdWx0IGlzIG5vdCBjYWNoZWQuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5nZXRGcm9tQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLmdldFF1ZXJ5UnVubmVyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgICAgICAuZnJvbSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSwgXCJjYWNoZVwiKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIHFiXG4gICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcImNhY2hlXCIpICsgXCIuXCIgKyBxYi5lc2NhcGUoXCJpZGVudGlmaWVyXCIpICsgXCIgPSA6aWRlbnRpZmllclwiKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHsgaWRlbnRpZmllcjogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciA/IG5ldyBNc3NxbFBhcmFtZXRlcihvcHRpb25zLmlkZW50aWZpZXIsIFwibnZhcmNoYXJcIikgOiBvcHRpb25zLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgICAuZ2V0UmF3T25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcWJcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlKFwiZGJtc19sb2IuY29tcGFyZShcIiArIHFiLmVzY2FwZShcImNhY2hlXCIpICsgXCIuXCIgKyBxYi5lc2NhcGUoXCJxdWVyeVwiKSArIFwiLCA6cXVlcnkpID0gMFwiLCB7IHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IH0pXG4gICAgICAgICAgICAgICAgICAgIC5nZXRSYXdPbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBxYlxuICAgICAgICAgICAgICAgIC53aGVyZShxYi5lc2NhcGUoXCJjYWNoZVwiKSArIFwiLlwiICsgcWIuZXNjYXBlKFwicXVlcnlcIikgKyBcIiA9IDpxdWVyeVwiKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHsgcXVlcnk6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIgPyBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5xdWVyeSwgXCJudmFyY2hhclwiKSA6IG9wdGlvbnMucXVlcnkgfSlcbiAgICAgICAgICAgICAgICAuZ2V0UmF3T25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGNhY2hlIGlzIGV4cGlyZWQgb3Igbm90LlxuICAgICAqL1xuICAgIERiUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuaXNFeHBpcmVkID0gZnVuY3Rpb24gKHNhdmVkQ2FjaGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gdHlwZW9mIHNhdmVkQ2FjaGUuZHVyYXRpb24gPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChzYXZlZENhY2hlLmR1cmF0aW9uKSA6IHNhdmVkQ2FjaGUuZHVyYXRpb247XG4gICAgICAgIHJldHVybiAoKHR5cGVvZiBzYXZlZENhY2hlLnRpbWUgPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChzYXZlZENhY2hlLnRpbWUpIDogc2F2ZWRDYWNoZS50aW1lKSArIGR1cmF0aW9uKSA8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmVzIGdpdmVuIHF1ZXJ5IHJlc3VsdCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgRGJRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5zdG9yZUluQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc2F2ZWRDYWNoZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNob3VsZENyZWF0ZVF1ZXJ5UnVubmVyLCBpbnNlcnRlZFZhbHVlcywgcWIsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ3JlYXRlUXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lciA9PT0gdW5kZWZpbmVkIHx8IChxdWVyeVJ1bm5lciA9PT0gbnVsbCB8fCBxdWVyeVJ1bm5lciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcXVlcnlSdW5uZXIuZ2V0UmVwbGljYXRpb25Nb2RlKCkpID09PSBcInNsYXZlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlSdW5uZXIgPT09IHVuZGVmaW5lZCB8fCBzaG91bGRDcmVhdGVRdWVyeVJ1bm5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKFwibWFzdGVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRWYWx1ZXMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHsgLy8gdG9kbzogYmFkIGFic3RyYWN0aW9uLCByZS1pbXBsZW1lbnQgdGhpcyBwYXJ0LCBwcm9iYWJseSBiZXR0ZXIgaWYgd2UgY3JlYXRlIGFuIGVudGl0eSBtZXRhZGF0YSBmb3IgY2FjaGUgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZhbHVlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogbmV3IE1zc3FsUGFyYW1ldGVyKG9wdGlvbnMuaWRlbnRpZmllciwgXCJudmFyY2hhclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogbmV3IE1zc3FsUGFyYW1ldGVyKG9wdGlvbnMudGltZSwgXCJiaWdpbnRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5kdXJhdGlvbiwgXCJpbnRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5xdWVyeSwgXCJudmFyY2hhclwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBuZXcgTXNzcWxQYXJhbWV0ZXIob3B0aW9ucy5yZXN1bHQsIFwibnZhcmNoYXJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNhdmVkQ2FjaGUgJiYgc2F2ZWRDYWNoZS5pZGVudGlmaWVyKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMucXVlcnlSZXN1bHRDYWNoZVRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoaW5zZXJ0ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUocWIuZXNjYXBlKFwiaWRlbnRpZmllclwiKSArIFwiID0gOmNvbmRpdGlvblwiLCB7IGNvbmRpdGlvbjogaW5zZXJ0ZWRWYWx1ZXMuaWRlbnRpZmllciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzYXZlZENhY2hlICYmIHNhdmVkQ2FjaGUucXVlcnkpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gcXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldChpbnNlcnRlZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLndoZXJlKFwiZGJtc19sb2IuY29tcGFyZShcXFwicXVlcnlcXFwiLCA6Y29uZGl0aW9uKSA9IDBcIiwgeyBjb25kaXRpb246IGluc2VydGVkVmFsdWVzLnF1ZXJ5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUocWIuZXNjYXBlKFwicXVlcnlcIikgKyBcIiA9IDpjb25kaXRpb25cIiwgeyBjb25kaXRpb246IGluc2VydGVkVmFsdWVzLnF1ZXJ5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogLy8gb3RoZXJ3aXNlIGluc2VydFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGhpcy5xdWVyeVJlc3VsdENhY2hlVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhpbnNlcnRlZFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZENyZWF0ZVF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGV2ZXJ5dGhpbmcgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRRdWVyeVJ1bm5lcihxdWVyeVJ1bm5lcikuY2xlYXJUYWJsZSh0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgY2FjaGVkIHJlc3VsdHMgYnkgZ2l2ZW4gaWRlbnRpZmllcnMgZnJvbSBjYWNoZS5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpZGVudGlmaWVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaWRlbnRpZmllcnMubWFwKGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHFiID0gX3RoaXMuZ2V0UXVlcnlSdW5uZXIocXVlcnlSdW5uZXIpLm1hbmFnZXIuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFiLmRlbGV0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKF90aGlzLnF1ZXJ5UmVzdWx0Q2FjaGVUYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcImlkZW50aWZpZXJcIikgKyBcIiA9IDppZGVudGlmaWVyXCIsIHsgaWRlbnRpZmllcjogaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcXVlcnkgcnVubmVyIHRvIHdvcmsgd2l0aC5cbiAgICAgKi9cbiAgICBEYlF1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmdldFF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVJ1bm5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIH07XG4gICAgcmV0dXJuIERiUXVlcnlSZXN1bHRDYWNoZTtcbn0oKSk7XG5leHBvcnQgeyBEYlF1ZXJ5UmVzdWx0Q2FjaGUgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGJRdWVyeVJlc3VsdENhY2hlLmpzLm1hcFxuIiwiaW1wb3J0IHsgUmVkaXNRdWVyeVJlc3VsdENhY2hlIH0gZnJvbSBcIi4vUmVkaXNRdWVyeVJlc3VsdENhY2hlXCI7XG5pbXBvcnQgeyBEYlF1ZXJ5UmVzdWx0Q2FjaGUgfSBmcm9tIFwiLi9EYlF1ZXJ5UmVzdWx0Q2FjaGVcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvci9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogQ2FjaGVzIHF1ZXJ5IHJlc3VsdCBpbnRvIFJlZGlzIGRhdGFiYXNlLlxuICovXG52YXIgUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5KGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgcmVzdWx0IGNhY2hlIGJhc2VkIG9uIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICBRdWVyeVJlc3VsdENhY2hlRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRvIHVzZSBjYWNoZSB5b3UgbmVlZCB0byBlbmFibGUgaXQgaW4gY29ubmVjdGlvbiBvcHRpb25zIGJ5IHNldHRpbmcgY2FjaGU6IHRydWUgb3IgcHJvdmlkaW5nIHNvbWUgY2FjaGluZyBvcHRpb25zLiBFeGFtcGxlOiB7IGhvc3Q6IC4uLiwgdXNlcm5hbWU6IC4uLiwgY2FjaGU6IHRydWUgfVwiKTtcbiAgICAgICAgdmFyIGNhY2hlID0gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGU7XG4gICAgICAgIGlmIChjYWNoZS5wcm92aWRlciAmJiB0eXBlb2YgY2FjaGUucHJvdmlkZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnByb3ZpZGVyKHRoaXMuY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlLnR5cGUgPT09IFwicmVkaXNcIiB8fCBjYWNoZS50eXBlID09PSBcImlvcmVkaXNcIiB8fCBjYWNoZS50eXBlID09PSBcImlvcmVkaXMvY2x1c3RlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZGlzUXVlcnlSZXN1bHRDYWNoZSh0aGlzLmNvbm5lY3Rpb24sIGNhY2hlLnR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYlF1ZXJ5UmVzdWx0Q2FjaGUodGhpcy5jb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIENhY2hlcyBxdWVyeSByZXN1bHQgaW50byBSZWRpcyBkYXRhYmFzZS5cbiAqL1xudmFyIFJlZGlzUXVlcnlSZXN1bHRDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVkaXNRdWVyeVJlc3VsdENhY2hlKGNvbm5lY3Rpb24sIGNsaWVudFR5cGUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jbGllbnRUeXBlID0gY2xpZW50VHlwZTtcbiAgICAgICAgdGhpcy5yZWRpcyA9IHRoaXMubG9hZFJlZGlzKCk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29ubmVjdGlvbiB3aXRoIGdpdmVuIGNhY2hlIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlT3B0aW9ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBjYWNoZU9wdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGllbnRUeXBlID09PSBcInJlZGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlT3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSB0aGlzLnJlZGlzLmNyZWF0ZUNsaWVudChjYWNoZU9wdGlvbnMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IHRoaXMucmVkaXMuY3JlYXRlQ2xpZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jbGllbnRUeXBlID09PSBcImlvcmVkaXNcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zICYmIGNhY2hlT3B0aW9ucy5wb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzKGNhY2hlT3B0aW9ucy5wb3J0LCBjYWNoZU9wdGlvbnMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzKGNhY2hlT3B0aW9ucy5wb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYWNoZU9wdGlvbnMgJiYgY2FjaGVPcHRpb25zLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbmV3IHRoaXMucmVkaXMoY2FjaGVPcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBuZXcgdGhpcy5yZWRpcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xpZW50VHlwZSA9PT0gXCJpb3JlZGlzL2NsdXN0ZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVPcHRpb25zICYmIGNhY2hlT3B0aW9ucy5vcHRpb25zICYmIEFycmF5LmlzQXJyYXkoY2FjaGVPcHRpb25zLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyB0aGlzLnJlZGlzLkNsdXN0ZXIoY2FjaGVPcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNhY2hlT3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucyAmJiBjYWNoZU9wdGlvbnMub3B0aW9ucy5zdGFydHVwTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbmV3IHRoaXMucmVkaXMuQ2x1c3RlcihjYWNoZU9wdGlvbnMub3B0aW9ucy5zdGFydHVwTm9kZXMsIGNhY2hlT3B0aW9ucy5vcHRpb25zLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIm9wdGlvbnMuc3RhcnR1cE5vZGVzIHJlcXVpcmVkIGZvciBcIiArIHRoaXMuY2xpZW50VHlwZSArIFwiLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB0aGUgY29ubmVjdGlvblxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jbGllbnQucXVpdChmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGFibGUgZm9yIHN0b3JpbmcgY2FjaGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuc3luY2hyb25pemUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhY2hlcyBnaXZlbiBxdWVyeSByZXN1bHQuXG4gICAgICogUmV0dXJucyBjYWNoZSByZXN1bHQgaWYgZm91bmQuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgcmVzdWx0IGlzIG5vdCBjYWNoZWQuXG4gICAgICovXG4gICAgUmVkaXNRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5nZXRGcm9tQ2FjaGUgPSBmdW5jdGlvbiAob3B0aW9ucywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5nZXQob3B0aW9ucy5pZGVudGlmaWVyLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIG9rKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50LmdldChvcHRpb25zLnF1ZXJ5LCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIG9rKEpTT04ucGFyc2UocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvayh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjYWNoZSBpcyBleHBpcmVkIG9yIG5vdC5cbiAgICAgKi9cbiAgICBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmlzRXhwaXJlZCA9IGZ1bmN0aW9uIChzYXZlZENhY2hlKSB7XG4gICAgICAgIHJldHVybiAoc2F2ZWRDYWNoZS50aW1lICsgc2F2ZWRDYWNoZS5kdXJhdGlvbikgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0b3JlcyBnaXZlbiBxdWVyeSByZXN1bHQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuc3RvcmVJbkNhY2hlID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNhdmVkQ2FjaGUsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5zZXQob3B0aW9ucy5pZGVudGlmaWVyLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgXCJQWFwiLCBvcHRpb25zLmR1cmF0aW9uLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xpZW50LnNldChvcHRpb25zLnF1ZXJ5LCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSwgXCJQWFwiLCBvcHRpb25zLmR1cmF0aW9uLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyBldmVyeXRoaW5nIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgUmVkaXNRdWVyeVJlc3VsdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNsaWVudC5mbHVzaGRiKGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBjYWNoZWQgcmVzdWx0cyBieSBnaXZlbiBpZGVudGlmaWVycyBmcm9tIGNhY2hlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGlkZW50aWZpZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChpZGVudGlmaWVycy5tYXAoZnVuY3Rpb24gKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlS2V5KGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc2luZ2xlIGtleSBmcm9tIHJlZGlzIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlZGlzUXVlcnlSZXN1bHRDYWNoZS5wcm90b3R5cGUuZGVsZXRlS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICBfdGhpcy5jbGllbnQuZGVsKGtleSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoZXJyKTtcbiAgICAgICAgICAgICAgICBvaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgcmVkaXMgZGVwZW5kZW5jeS5cbiAgICAgKi9cbiAgICBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGUucHJvdG90eXBlLmxvYWRSZWRpcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaWVudFR5cGUgPT09IFwiaW9yZWRpcy9jbHVzdGVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGxhdGZvcm1Ub29scy5sb2FkKFwiaW9yZWRpc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQbGF0Zm9ybVRvb2xzLmxvYWQodGhpcy5jbGllbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCB1c2UgY2FjaGUgYmVjYXVzZSBcIiArIHRoaXMuY2xpZW50VHlwZSArIFwiIGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBydW4gXFxcIm5wbSBpIFwiICsgdGhpcy5jbGllbnRUeXBlICsgXCIgLS1zYXZlXFxcIi5cIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWRpc1F1ZXJ5UmVzdWx0Q2FjaGU7XG59KCkpO1xuZXhwb3J0IHsgUmVkaXNRdWVyeVJlc3VsdENhY2hlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZGlzUXVlcnlSZXN1bHRDYWNoZS5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVlcFBhcnRpYWwuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eVRhcmdldC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0TGl0ZXJhbC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VHlwZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kgfSBmcm9tIFwiLi4vbmFtaW5nLXN0cmF0ZWd5L0RlZmF1bHROYW1pbmdTdHJhdGVneVwiO1xuaW1wb3J0IHsgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvclwiO1xuaW1wb3J0IHsgQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBNaWdyYXRpb25FeGVjdXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vTWlncmF0aW9uRXhlY3V0b3JcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9tb25nb2RiL01vbmdvRHJpdmVyXCI7XG5pbXBvcnQgeyBNb25nb0VudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5LW1hbmFnZXIvTW9uZ29FbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvciB9IGZyb20gXCIuLi9tZXRhZGF0YS1idWlsZGVyL0VudGl0eU1ldGFkYXRhVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB9IGZyb20gXCIuLi9lbnRpdHktbWFuYWdlci9FbnRpdHlNYW5hZ2VyRmFjdG9yeVwiO1xuaW1wb3J0IHsgRHJpdmVyRmFjdG9yeSB9IGZyb20gXCIuLi9kcml2ZXIvRHJpdmVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuL0Nvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXJcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyRmFjdG9yeSB9IGZyb20gXCIuLi9sb2dnZXIvTG9nZ2VyRmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnkgfSBmcm9tIFwiLi4vY2FjaGUvUXVlcnlSZXN1bHRDYWNoZUZhY3RvcnlcIjtcbmltcG9ydCB7IFNxbGpzRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHktbWFuYWdlci9TcWxqc0VudGl0eU1hbmFnZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uTG9hZGVyIH0gZnJvbSBcIi4uL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25Mb2FkZXJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIENvbm5lY3Rpb24gaXMgYSBzaW5nbGUgZGF0YWJhc2UgT1JNIGNvbm5lY3Rpb24gdG8gYSBzcGVjaWZpYyBkYXRhYmFzZS5cbiAqIEl0cyBub3QgcmVxdWlyZWQgdG8gYmUgYSBkYXRhYmFzZSBjb25uZWN0aW9uLCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSBpdCBjYW4gY3JlYXRlIGNvbm5lY3Rpb24gcG9vbC5cbiAqIFlvdSBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB0byBtdWx0aXBsZSBkYXRhYmFzZXMgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAqL1xudmFyIENvbm5lY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogTWlncmF0aW9uIGluc3RhbmNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1pZ3JhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSBzdWJzY3JpYmVyIGluc3RhbmNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGwgZW50aXR5IG1ldGFkYXRhcyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhcyA9IFtdO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgXCJkZWZhdWx0XCI7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5jcmVhdGUodGhpcy5vcHRpb25zLmxvZ2dlciwgdGhpcy5vcHRpb25zLmxvZ2dpbmcpO1xuICAgICAgICB0aGlzLmRyaXZlciA9IG5ldyBEcml2ZXJGYWN0b3J5KCkuY3JlYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLmNyZWF0ZUVudGl0eU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5uYW1pbmdTdHJhdGVneSA9IG9wdGlvbnMubmFtaW5nU3RyYXRlZ3kgfHwgbmV3IERlZmF1bHROYW1pbmdTdHJhdGVneSgpO1xuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0Q2FjaGUgPSBvcHRpb25zLmNhY2hlID8gbmV3IFF1ZXJ5UmVzdWx0Q2FjaGVGYWN0b3J5KHRoaXMpLmNyZWF0ZSgpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlbGF0aW9uTG9hZGVyID0gbmV3IFJlbGF0aW9uTG9hZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25uZWN0aW9uLnByb3RvdHlwZSwgXCJtb25nb01hbmFnZXJcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbW9uZ29kYiBlbnRpdHkgbWFuYWdlciB0aGF0IGFsbG93cyB0byBwZXJmb3JtIG1vbmdvZGItc3BlY2lmaWMgcmVwb3NpdG9yeSBvcGVyYXRpb25zXG4gICAgICAgICAqIHdpdGggYW55IGVudGl0eSBpbiB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBvbmx5IGluIG1vbmdvZGIgY29ubmVjdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMubWFuYWdlciBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk1vbmdvRW50aXR5TWFuYWdlciBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgTW9uZ29EQiBkYXRhYmFzZXMuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlcjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25uZWN0aW9uLnByb3RvdHlwZSwgXCJzcWxqc01hbmFnZXJcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHNxbC5qcyBzcGVjaWZpYyBFbnRpdHkgTWFuYWdlciB0aGF0IGFsbG93cyB0byBwZXJmb3JtIHNwZWNpYWwgbG9hZCBhbmQgc2F2ZSBvcGVyYXRpb25zXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgc3FsanMgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLm1hbmFnZXIgaW5zdGFuY2VvZiBTcWxqc0VudGl0eU1hbmFnZXIpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxqc0VudGl0eU1hbmFnZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIFNxbGpzIGRhdGFiYXNlcy5cIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBvbiBhcHBsaWNhdGlvbiBib290c3RyYXAuXG4gICAgICogVGhpcyBtZXRob2Qgbm90IG5lY2Vzc2FyaWx5IGNyZWF0ZXMgZGF0YWJhc2UgY29ubmVjdGlvbiAoZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLFxuICAgICAqIGJ1dCBpdCBhbHNvIGNhbiBzZXR1cCBhIGNvbm5lY3Rpb24gcG9vbCB3aXRoIGRhdGFiYXNlIHRvIHVzZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yKHRoaXMubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZSB2aWEgaXRzIGRyaXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcml2ZXIuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UgdmlhIGl0cyBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSZXN1bHRDYWNoZS5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjb25uZWN0ZWQgc3RhdHVzIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RVdGlscy5hc3NpZ24odGhpcywgeyBpc0Nvbm5lY3RlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs0LCAxMiwgLCAxNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgYWxsIG1ldGFkYXRhcyByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRNZXRhZGF0YXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLmFmdGVyQ29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZHJvcFNjaGVtYSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BEYXRhYmFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5zeW5jaHJvbml6ZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnN5bmNocm9uaXplKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLm1pZ3JhdGlvbnNSdW4pIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucnVuTWlncmF0aW9ucyh7IHRyYW5zYWN0aW9uOiB0aGlzLm9wdGlvbnMubWlncmF0aW9uc1RyYW5zYWN0aW9uTW9kZSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZm9yIHNvbWUgcmVhc29uIGJ1aWxkIG1ldGFkYXRhIGZhaWwgKGZvciBleGFtcGxlIHZhbGlkYXRpb24gZXJyb3IgZHVyaW5nIGVudGl0eSBtZXRhZGF0YSBjaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsb3NlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZm9yIHNvbWUgcmVhc29uIGJ1aWxkIG1ldGFkYXRhIGZhaWwgKGZvciBleGFtcGxlIHZhbGlkYXRpb24gZXJyb3IgZHVyaW5nIGVudGl0eSBtZXRhZGF0YSBjaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8xO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2UuXG4gICAgICogT25jZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgeW91IGNhbm5vdCB1c2UgcmVwb3NpdG9yaWVzIG9yIHBlcmZvcm0gYW55IG9wZXJhdGlvbnMgZXhjZXB0IG9wZW5pbmcgY29ubmVjdGlvbiBhZ2Fpbi5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IodGhpcy5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLmRpc2Nvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSZXN1bHRDYWNoZS5kaXNjb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCB7IGlzQ29ubmVjdGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRhdGFiYXNlIHNjaGVtYSBmb3IgYWxsIGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhpcyBjb25uZWN0aW9uLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHJvcEJlZm9yZVN5bmMgSWYgc2V0IHRvIHRydWUgdGhlbiBpdCBkcm9wcyB0aGUgZGF0YWJhc2Ugd2l0aCBhbGwgaXRzIHRhYmxlcyBhbmQgZGF0YVxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnN5bmNocm9uaXplID0gZnVuY3Rpb24gKGRyb3BCZWZvcmVTeW5jKSB7XG4gICAgICAgIGlmIChkcm9wQmVmb3JlU3luYyA9PT0gdm9pZCAwKSB7IGRyb3BCZWZvcmVTeW5jID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYUJ1aWxkZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkcm9wQmVmb3JlU3luYykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BEYXRhYmFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFCdWlsZGVyID0gdGhpcy5kcml2ZXIuY3JlYXRlU2NoZW1hQnVpbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgc2NoZW1hQnVpbGRlci5idWlsZCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSBkYXRhYmFzZSBhbmQgYWxsIGl0cyBkYXRhLlxuICAgICAqIEJlIGNhcmVmdWwgd2l0aCB0aGlzIG1ldGhvZCBvbiBwcm9kdWN0aW9uIHNpbmNlIHRoaXMgbWV0aG9kIHdpbGwgZXJhc2UgYWxsIHlvdXIgZGF0YWJhc2UgdGFibGVzIGFuZCB0aGVpciBkYXRhLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgLy8gVE9ETyByZW5hbWVcbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgZGF0YWJhc2VzXzIsIGRhdGFiYXNlc18xLCBkYXRhYmFzZXNfMV8xLCBkYXRhYmFzZSwgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsICwgMTMsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciB8fCB0aGlzLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlc18yID0gdGhpcy5kcml2ZXIuZGF0YWJhc2UgPyBbdGhpcy5kcml2ZXIuZGF0YWJhc2VdIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5kYXRhYmFzZSAmJiBkYXRhYmFzZXNfMi5pbmRleE9mKG1ldGFkYXRhLmRhdGFiYXNlKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlc18yLnB1c2gobWV0YWRhdGEuZGF0YWJhc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMiwgNywgOCwgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzXzEgPSBfX3ZhbHVlcyhkYXRhYmFzZXNfMiksIGRhdGFiYXNlc18xXzEgPSBkYXRhYmFzZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWRhdGFiYXNlc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSA9IGRhdGFiYXNlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jbGVhckRhdGFiYXNlKGRhdGFiYXNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzXzFfMSA9IGRhdGFiYXNlc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YWJhc2VzXzFfMSAmJiAhZGF0YWJhc2VzXzFfMS5kb25lICYmIChfYSA9IGRhdGFiYXNlc18xLnJldHVybikpIF9hLmNhbGwoZGF0YWJhc2VzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNsZWFyRGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUnVucyBhbGwgcGVuZGluZyBtaWdyYXRpb25zLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUucnVuTWlncmF0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25FeGVjdXRvciwgc3VjY2Vzc01pZ3JhdGlvbnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlncmF0aW9uRXhlY3V0b3IgPSBuZXcgTWlncmF0aW9uRXhlY3V0b3IodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvci50cmFuc2FjdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMudHJhbnNhY3Rpb24pIHx8IFwiYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25FeGVjdXRvci5leGVjdXRlUGVuZGluZ01pZ3JhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHN1Y2Nlc3NNaWdyYXRpb25zXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIGxhc3QgZXhlY3V0ZWQgbWlncmF0aW9uLlxuICAgICAqIENhbiBiZSB1c2VkIG9ubHkgYWZ0ZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgaXMgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUudW5kb0xhc3RNaWdyYXRpb24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWlncmF0aW9uRXhlY3V0b3I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvcih0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlncmF0aW9uRXhlY3V0b3IgPSBuZXcgTWlncmF0aW9uRXhlY3V0b3IodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvci50cmFuc2FjdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMudHJhbnNhY3Rpb24pIHx8IFwiYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25FeGVjdXRvci51bmRvTGFzdE1pZ3JhdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCBtaWdyYXRpb25zIGFuZCB3aGV0aGVyIHRoZXkgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIHBlbmRpbmcgbWlncmF0aW9uc1xuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLnNob3dNaWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWlncmF0aW9uRXhlY3V0b3I7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yKHRoaXMubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25FeGVjdXRvciA9IG5ldyBNaWdyYXRpb25FeGVjdXRvcih0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1pZ3JhdGlvbkV4ZWN1dG9yLnNob3dNaWdyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnRpdHkgbWV0YWRhdGEgZXhpc3QgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MsIHRhcmdldCBuYW1lIG9yIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuaGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZE1ldGFkYXRhKHRhcmdldCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBzY2hlbWEgbmFtZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5maW5kTWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldFJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyB0cmVlIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3Mgb3IgbmFtZS5cbiAgICAgKiBPbmx5IHRyZWUtdHlwZSBlbnRpdGllcyBjYW4gaGF2ZSBhIFRyZWVSZXBvc2l0b3J5LCBsaWtlIG9uZXMgZGVjb3JhdGVkIHdpdGggQFRyZWUgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldFRyZWVSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFRyZWVSZXBvc2l0b3J5KHRhcmdldCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIG1vbmdvZGItc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIFdvcmtzIG9ubHkgaWYgY29ubmVjdGlvbiBpcyBtb25nb2RiLXNwZWNpZmljLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmdldE1vbmdvUmVwb3NpdG9yeSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKCEodGhpcy5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiWW91IGNhbiB1c2UgZ2V0TW9uZ29SZXBvc2l0b3J5IG9ubHkgZm9yIE1vbmdvREIgY29ubmVjdGlvbnMuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFJlcG9zaXRvcnkodGFyZ2V0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgY3VzdG9tIGVudGl0eSByZXBvc2l0b3J5IG1hcmtlZCB3aXRoIEBFbnRpdHlSZXBvc2l0b3J5IGRlY29yYXRvci5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5nZXRDdXN0b21SZXBvc2l0b3J5ID0gZnVuY3Rpb24gKGN1c3RvbVJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRDdXN0b21SZXBvc2l0b3J5KGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUudHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLm1hbmFnZXIudHJhbnNhY3Rpb24oaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1c2VkUXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUXVlcmllcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IE1vbmdvREIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5UnVubmVyICYmIHF1ZXJ5UnVubmVyLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZFF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXIgfHwgdGhpcy5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsICwgMywgNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdXNlZFF1ZXJ5UnVubmVyLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcXVlcnlSdW5uZXIpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdXNlZFF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNxbCBxdWVyeS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoZW50aXR5T3JSdW5uZXIsIGFsaWFzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE1vbmdvRW50aXR5TWFuYWdlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJRdWVyeSBCdWlsZGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgTW9uZ29EQi5cIik7XG4gICAgICAgIGlmIChhbGlhcykge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YShlbnRpdHlPclJ1bm5lcik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcih0aGlzLCBxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAuc2VsZWN0KGFsaWFzKVxuICAgICAgICAgICAgICAgIC5mcm9tKG1ldGFkYXRhLnRhcmdldCwgYWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXIodGhpcywgZW50aXR5T3JSdW5uZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgcnVubmVyIHVzZWQgZm9yIHBlcmZvcm0gcXVlcmllcyBvbiBhIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqIFVzaW5nIHF1ZXJ5IHJ1bm5lcnMgeW91IGNhbiBjb250cm9sIHlvdXIgcXVlcmllcyB0byBleGVjdXRlIHVzaW5nIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZFxuICAgICAqIG1hbnVhbGx5IGNvbnRyb2wgeW91ciBkYXRhYmFzZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIE1vZGUgaXMgdXNlZCBpbiByZXBsaWNhdGlvbiBtb2RlIGFuZCBpbmRpY2F0ZXMgd2hhdGV2ZXIgeW91IHdhbnQgdG8gY29ubmVjdFxuICAgICAqIHRvIG1hc3RlciBkYXRhYmFzZSBvciBhbnkgb2Ygc2xhdmUgZGF0YWJhc2VzLlxuICAgICAqIElmIHlvdSBwZXJmb3JtIHdyaXRlcyB5b3UgbXVzdCB1c2UgbWFzdGVyIGRhdGFiYXNlLFxuICAgICAqIGlmIHlvdSBwZXJmb3JtIHJlYWRzIHlvdSBjYW4gdXNlIHNsYXZlIGRhdGFiYXNlcy5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IFwibWFzdGVyXCI7IH1cbiAgICAgICAgdmFyIHF1ZXJ5UnVubmVyID0gdGhpcy5kcml2ZXIuY3JlYXRlUXVlcnlSdW5uZXIobW9kZSk7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcy5jcmVhdGVFbnRpdHlNYW5hZ2VyKHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihxdWVyeVJ1bm5lciwgeyBtYW5hZ2VyOiBtYW5hZ2VyIH0pO1xuICAgICAgICByZXR1cm4gcXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtZXRhZGF0YSBvZiB0aGUganVuY3Rpb24gdGFibGUgKG1hbnktdG8tbWFueSB0YWJsZSkuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0TWFueVRvTWFueU1ldGFkYXRhID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgcmVsYXRpb25Qcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIHJlbGF0aW9uTWV0YWRhdGEgPSB0aGlzLmdldE1ldGFkYXRhKGVudGl0eVRhcmdldCkuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghcmVsYXRpb25NZXRhZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcXFwiXCIgKyByZWxhdGlvblByb3BlcnR5UGF0aCArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIFwiICsgZW50aXR5VGFyZ2V0ICsgXCIgZW50aXR5LlwiKTtcbiAgICAgICAgaWYgKCFyZWxhdGlvbk1ldGFkYXRhLmlzTWFueVRvTWFueSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcXFwiXCIgKyBlbnRpdHlUYXJnZXQgKyBcIiNcIiArIHJlbGF0aW9uUHJvcGVydHlQYXRoICsgXCJcXFwiIGRvZXMgbm90IGhhdmUgYSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLlwiICtcbiAgICAgICAgICAgICAgICBcIllvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9ubHkgb24gbWFueS10by1tYW55IHJlbGF0aW9ucy5cIik7XG4gICAgICAgIHJldHVybiByZWxhdGlvbk1ldGFkYXRhLmp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIEVudGl0eSBNYW5hZ2VyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uIHdpdGggdGhlIGhlbHAgb2YgdGhlIEVudGl0eU1hbmFnZXJGYWN0b3J5LlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUVudGl0eU1hbmFnZXIgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSgpLmNyZWF0ZSh0aGlzLCBxdWVyeVJ1bm5lcik7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRmluZHMgZXhpc3QgZW50aXR5IG1ldGFkYXRhIGJ5IHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MsIHRhcmdldCBuYW1lIG9yIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbi5wcm90b3R5cGUuZmluZE1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlNZXRhZGF0YXMuZmluZChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS50YXJnZXQgPT09IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEubmFtZSA9PT0gdGFyZ2V0Lm9wdGlvbnMubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhYmxlUGF0aCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLm5hbWUgPT09IHRhcmdldCB8fCBtZXRhZGF0YS50YWJsZU5hbWUgPT09IHRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIG1ldGFkYXRhcyBmb3IgYWxsIHJlZ2lzdGVyZWQgY2xhc3NlcyBpbnNpZGUgdGhpcyBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb24ucHJvdG90eXBlLmJ1aWxkTWV0YWRhdGFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlciA9IG5ldyBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyKHRoaXMpO1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGFWYWxpZGF0b3IgPSBuZXcgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IoKTtcbiAgICAgICAgLy8gY3JlYXRlIHN1YnNjcmliZXJzIGluc3RhbmNlcyBpZiB0aGV5IGFyZSBub3QgZGlzYWxsb3dlZCBmcm9tIGhpZ2gtbGV2ZWwgKGZvciBleGFtcGxlIHRoZXkgY2FuIGRpc2FsbG93ZWQgZnJvbSBtaWdyYXRpb25zIHJ1biBwcm9jZXNzKVxuICAgICAgICB2YXIgc3Vic2NyaWJlcnMgPSBjb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmJ1aWxkU3Vic2NyaWJlcnModGhpcy5vcHRpb25zLnN1YnNjcmliZXJzIHx8IFtdKTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHsgc3Vic2NyaWJlcnM6IHN1YnNjcmliZXJzIH0pO1xuICAgICAgICAvLyBidWlsZCBlbnRpdHkgbWV0YWRhdGFzXG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YXMgPSBjb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLmJ1aWxkRW50aXR5TWV0YWRhdGFzKHRoaXMub3B0aW9ucy5lbnRpdGllcyB8fCBbXSk7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCB7IGVudGl0eU1ldGFkYXRhczogZW50aXR5TWV0YWRhdGFzIH0pO1xuICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9uIGluc3RhbmNlc1xuICAgICAgICB2YXIgbWlncmF0aW9ucyA9IGNvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIuYnVpbGRNaWdyYXRpb25zKHRoaXMub3B0aW9ucy5taWdyYXRpb25zIHx8IFtdKTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHsgbWlncmF0aW9uczogbWlncmF0aW9ucyB9KTtcbiAgICAgICAgLy8gdmFsaWRhdGUgYWxsIGNyZWF0ZWQgZW50aXR5IG1ldGFkYXRhcyB0byBtYWtlIHN1cmUgdXNlciBjcmVhdGVkIGVudGl0aWVzIGFyZSB2YWxpZCBhbmQgY29ycmVjdFxuICAgICAgICBlbnRpdHlNZXRhZGF0YVZhbGlkYXRvci52YWxpZGF0ZU1hbnkodGhpcy5lbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFibGVUeXBlICE9PSBcInZpZXdcIjsgfSksIHRoaXMuZHJpdmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb24gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXBcbiIsImltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9Db25uZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9Db25uZWN0aW9uTm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvci9BbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yXCI7XG4vKipcbiAqIENvbm5lY3Rpb25NYW5hZ2VyIGlzIHVzZWQgdG8gc3RvcmUgYW5kIG1hbmFnZSBtdWx0aXBsZSBvcm0gY29ubmVjdGlvbnMuXG4gKiBJdCBhbHNvIHByb3ZpZGVzIHVzZWZ1bCBmYWN0b3J5IG1ldGhvZHMgdG8gc2ltcGxpZnkgY29ubmVjdGlvbiBjcmVhdGlvbi5cbiAqL1xudmFyIENvbm5lY3Rpb25NYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25NYW5hZ2VyKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW50ZXJuYWwgbG9va3VwIHRvIHF1aWNrbHkgZ2V0IGZyb20gYSBjb25uZWN0aW9uIG5hbWUgdG8gdGhlIENvbm5lY3Rpb24gb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29ubmVjdGlvbk1hbmFnZXIucHJvdG90eXBlLCBcImNvbm5lY3Rpb25zXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbnMgcmVnaXN0ZXJlZCBpbiB0aGlzIGNvbm5lY3Rpb24gbWFuYWdlci5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb25uZWN0aW9uTWFwLnZhbHVlcygpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGluIHRoZSBtYW5hZ2VyLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFwLmhhcyhuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcmVnaXN0ZXJlZCBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogSWYgY29ubmVjdGlvbiBuYW1lIGlzIG5vdCBnaXZlbiB0aGVuIGl0IHdpbGwgZ2V0IGEgZGVmYXVsdCBjb25uZWN0aW9uLlxuICAgICAqIFRocm93cyBlcnJvciBpZiBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgd2FzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uTWFuYWdlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IHZvaWQgMCkgeyBuYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25NYXAuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3IobmFtZSk7XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBjb25uZWN0aW9uIG9wdGlvbnMgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgbWFuYWdlci5cbiAgICAgKiBDb25uZWN0aW9uIHdvbid0IGJlIGVzdGFibGlzaGVkLCB5b3UnbGwgbmVlZCB0byBtYW51YWxseSBjYWxsIGNvbm5lY3QgbWV0aG9kIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NYW5hZ2VyLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICAvLyBjaGVjayBpZiBzdWNoIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICAgIHZhciBleGlzdENvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb25NYXAuZ2V0KG9wdGlvbnMubmFtZSB8fCBcImRlZmF1bHRcIik7XG4gICAgICAgIGlmIChleGlzdENvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGlmIGNvbm5lY3Rpb24gaXMgcmVnaXN0ZXJlZCBhbmQgaXRzIG5vdCBjbG9zZWQgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKGV4aXN0Q29ubmVjdGlvbi5pc0Nvbm5lY3RlZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvcihvcHRpb25zLm5hbWUgfHwgXCJkZWZhdWx0XCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uXG4gICAgICAgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbk1hcC5zZXQoY29ubmVjdGlvbi5uYW1lLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk1hbmFnZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbk1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGltcG9ydENsYXNzZXNGcm9tRGlyZWN0b3JpZXMgfSBmcm9tIFwiLi4vdXRpbC9EaXJlY3RvcnlFeHBvcnRlZENsYXNzZXNMb2FkZXJcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IGdldEZyb21Db250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuLi9tZXRhZGF0YS1idWlsZGVyL0VudGl0eU1ldGFkYXRhQnVpbGRlclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi4vZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWFUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG4vKipcbiAqIEJ1aWxkcyBtaWdyYXRpb24gaW5zdGFuY2VzLCBzdWJzY3JpYmVyIGluc3RhbmNlcyBhbmQgZW50aXR5IG1ldGFkYXRhcyBmb3IgdGhlIGdpdmVuIGNsYXNzZXMuXG4gKi9cbnZhciBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBtaWdyYXRpb24gaW5zdGFuY2VzIGZvciB0aGUgZ2l2ZW4gY2xhc3NlcyBvciBkaXJlY3Rvcmllcy5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5idWlsZE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQoT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyhtaWdyYXRpb25zKSwgMiksIG1pZ3JhdGlvbkNsYXNzZXMgPSBfYVswXSwgbWlncmF0aW9uRGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGFsbE1pZ3JhdGlvbkNsYXNzZXMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChtaWdyYXRpb25DbGFzc2VzKSwgZmFsc2UpLCBfX3JlYWQoaW1wb3J0Q2xhc3Nlc0Zyb21EaXJlY3Rvcmllcyh0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLCBtaWdyYXRpb25EaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBhbGxNaWdyYXRpb25DbGFzc2VzLm1hcChmdW5jdGlvbiAobWlncmF0aW9uQ2xhc3MpIHsgcmV0dXJuIGdldEZyb21Db250YWluZXIobWlncmF0aW9uQ2xhc3MpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBzdWJzY3JpYmVyIGluc3RhbmNlcyBmb3IgdGhlIGdpdmVuIGNsYXNzZXMgb3IgZGlyZWN0b3JpZXMuXG4gICAgICovXG4gICAgQ29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuYnVpbGRTdWJzY3JpYmVycyA9IGZ1bmN0aW9uIChzdWJzY3JpYmVycykge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQoT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyhzdWJzY3JpYmVycyB8fCBbXSksIDIpLCBzdWJzY3JpYmVyQ2xhc3NlcyA9IF9hWzBdLCBzdWJzY3JpYmVyRGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGFsbFN1YnNjcmliZXJDbGFzc2VzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3Vic2NyaWJlckNsYXNzZXMpLCBmYWxzZSksIF9fcmVhZChpbXBvcnRDbGFzc2VzRnJvbURpcmVjdG9yaWVzKHRoaXMuY29ubmVjdGlvbi5sb2dnZXIsIHN1YnNjcmliZXJEaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKClcbiAgICAgICAgICAgIC5maWx0ZXJTdWJzY3JpYmVycyhhbGxTdWJzY3JpYmVyQ2xhc3NlcylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBnZXRGcm9tQ29udGFpbmVyKG1ldGFkYXRhLnRhcmdldCk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZSBnaXZlbiBjbGFzc2VzIG9yIGRpcmVjdG9yaWVzLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkRW50aXR5TWV0YWRhdGFzID0gZnVuY3Rpb24gKGVudGl0aWVzKSB7XG4gICAgICAgIC8vIHRvZG86IGluc3RlYWQgd2UgbmVlZCB0byBtZXJnZSBtdWx0aXBsZSBtZXRhZGF0YSBhcmdzIHN0b3JhZ2VzXG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChPcm1VdGlscy5zcGxpdENsYXNzZXNBbmRTdHJpbmdzKGVudGl0aWVzIHx8IFtdKSwgMiksIGVudGl0eUNsYXNzZXNPclNjaGVtYXMgPSBfYVswXSwgZW50aXR5RGlyZWN0b3JpZXMgPSBfYVsxXTtcbiAgICAgICAgdmFyIGVudGl0eUNsYXNzZXMgPSBlbnRpdHlDbGFzc2VzT3JTY2hlbWFzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHsgcmV0dXJuIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkgPT09IGZhbHNlOyB9KTtcbiAgICAgICAgdmFyIGVudGl0eVNjaGVtYXMgPSBlbnRpdHlDbGFzc2VzT3JTY2hlbWFzLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHsgcmV0dXJuIGVudGl0eUNsYXNzIGluc3RhbmNlb2YgRW50aXR5U2NoZW1hOyB9KTtcbiAgICAgICAgdmFyIGFsbEVudGl0eUNsYXNzZXMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChlbnRpdHlDbGFzc2VzKSwgZmFsc2UpLCBfX3JlYWQoaW1wb3J0Q2xhc3Nlc0Zyb21EaXJlY3Rvcmllcyh0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLCBlbnRpdHlEaXJlY3RvcmllcykpLCBmYWxzZSk7XG4gICAgICAgIGFsbEVudGl0eUNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGVudGl0eVNjaGVtYXMucHVzaChlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZGVjb3JhdG9yRW50aXR5TWV0YWRhdGFzID0gbmV3IEVudGl0eU1ldGFkYXRhQnVpbGRlcih0aGlzLmNvbm5lY3Rpb24sIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKSkuYnVpbGQoYWxsRW50aXR5Q2xhc3Nlcyk7XG4gICAgICAgIHZhciBtZXRhZGF0YUFyZ3NTdG9yYWdlRnJvbVNjaGVtYSA9IG5ldyBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShlbnRpdHlTY2hlbWFzKTtcbiAgICAgICAgdmFyIHNjaGVtYUVudGl0eU1ldGFkYXRhcyA9IG5ldyBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIodGhpcy5jb25uZWN0aW9uLCBtZXRhZGF0YUFyZ3NTdG9yYWdlRnJvbVNjaGVtYSkuYnVpbGQoKTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGRlY29yYXRvckVudGl0eU1ldGFkYXRhcyksIGZhbHNlKSwgX19yZWFkKHNjaGVtYUVudGl0eU1ldGFkYXRhcyksIGZhbHNlKTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uTWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb25NZXRhZGF0YUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbk1ldGFkYXRhQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogQ29udGFpbmVyIHRvIGJlIHVzZWQgYnkgdGhpcyBsaWJyYXJ5IGZvciBpbnZlcnNpb24gY29udHJvbC4gSWYgY29udGFpbmVyIHdhcyBub3QgaW1wbGljaXRseSBzZXQgdGhlbiBieSBkZWZhdWx0XG4gKiBjb250YWluZXIgc2ltcGx5IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzLlxuICovXG52YXIgZGVmYXVsdENvbnRhaW5lciA9IG5ldyAoLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGNsYXNzXzEoKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgfVxuICAgIGNsYXNzXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzb21lQ2xhc3MpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZmluZChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS50eXBlID09PSBzb21lQ2xhc3M7IH0pO1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHsgdHlwZTogc29tZUNsYXNzLCBvYmplY3Q6IG5ldyBzb21lQ2xhc3MoKSB9O1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLm9iamVjdDtcbiAgICB9O1xuICAgIHJldHVybiBjbGFzc18xO1xufSgpKSkoKTtcbnZhciB1c2VyQ29udGFpbmVyO1xudmFyIHVzZXJDb250YWluZXJPcHRpb25zO1xuLyoqXG4gKiBTZXRzIGNvbnRhaW5lciB0byBiZSB1c2VkIGJ5IHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRhaW5lcihpb2NDb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICB1c2VyQ29udGFpbmVyID0gaW9jQ29udGFpbmVyO1xuICAgIHVzZXJDb250YWluZXJPcHRpb25zID0gb3B0aW9ucztcbn1cbi8qKlxuICogR2V0cyB0aGUgSU9DIGNvbnRhaW5lciB1c2VkIGJ5IHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZyb21Db250YWluZXIoc29tZUNsYXNzKSB7XG4gICAgaWYgKHVzZXJDb250YWluZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHVzZXJDb250YWluZXIuZ2V0KHNvbWVDbGFzcyk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKCF1c2VyQ29udGFpbmVyT3B0aW9ucyB8fCAhdXNlckNvbnRhaW5lck9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKCF1c2VyQ29udGFpbmVyT3B0aW9ucyB8fCAhdXNlckNvbnRhaW5lck9wdGlvbnMuZmFsbGJhY2tPbkVycm9ycylcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdENvbnRhaW5lci5nZXQoc29tZUNsYXNzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGNoZWNrLlxuICogQ2FuIGJlIHVzZWQgb24gZW50aXR5IHByb3BlcnR5IG9yIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgY2hlY2tzIHdpdGggY29tcG9zaXRlIGNvbHVtbnMgd2hlbiB1c2VkIG9uIGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENoZWNrKG5hbWVPckV4cHJlc3Npb24sIG1heWJlRXhwcmVzc2lvbikge1xuICAgIHZhciBuYW1lID0gbWF5YmVFeHByZXNzaW9uID8gbmFtZU9yRXhwcmVzc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZXhwcmVzc2lvbiA9IG1heWJlRXhwcmVzc2lvbiA/IG1heWJlRXhwcmVzc2lvbiA6IG5hbWVPckV4cHJlc3Npb247XG4gICAgaWYgKCFleHByZXNzaW9uKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2hlY2sgZXhwcmVzc2lvbiBpcyByZXF1aXJlZFwiKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNsc09yT2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogcHJvcGVydHlOYW1lID8gY2xzT3JPYmplY3QuY29uc3RydWN0b3IgOiBjbHNPck9iamVjdCxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoZWNrLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG4vKipcbiAqIFVzZWQgdG8gZGVjbGFyZSBhIGNsYXNzIGFzIGEgY3VzdG9tIHJlcG9zaXRvcnkuXG4gKiBDdXN0b20gcmVwb3NpdG9yeSBjYW4gbWFuYWdlIHNvbWUgc3BlY2lmaWMgZW50aXR5IG9yIGp1c3QgYmUgZ2VuZXJpYy5cbiAqIEN1c3RvbSByZXBvc2l0b3J5IG9wdGlvbmFsbHkgY2FuIGV4dGVuZCBBYnN0cmFjdFJlcG9zaXRvcnksIFJlcG9zaXRvcnkgb3IgVHJlZVJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHlSZXBvc2l0b3J5KGVudGl0eSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlSZXBvc2l0b3JpZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGV4Y2x1c2lvbi5cbiAqIENhbiBiZSB1c2VkIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgZXhjbHVzaW9ucyB3aXRoIGNvbXBvc2l0ZSBjb2x1bW5zIHdoZW4gdXNlZCBvbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFeGNsdXNpb24obmFtZU9yRXhwcmVzc2lvbiwgbWF5YmVFeHByZXNzaW9uKSB7XG4gICAgdmFyIG5hbWUgPSBtYXliZUV4cHJlc3Npb24gPyBuYW1lT3JFeHByZXNzaW9uIDogdW5kZWZpbmVkO1xuICAgIHZhciBleHByZXNzaW9uID0gbWF5YmVFeHByZXNzaW9uID8gbWF5YmVFeHByZXNzaW9uIDogbmFtZU9yRXhwcmVzc2lvbjtcbiAgICBpZiAoIWV4cHJlc3Npb24pXG4gICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFeGNsdXNpb24gZXhwcmVzc2lvbiBpcyByZXF1aXJlZFwiKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNsc09yT2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmV4Y2x1c2lvbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHByb3BlcnR5TmFtZSA/IGNsc09yT2JqZWN0LmNvbnN0cnVjdG9yIDogY2xzT3JPYmplY3QsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeGNsdXNpb24uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBjb2x1bW4gdG8gZ2VuZXJhdGUgYSB2YWx1ZSBvbiBlbnRpdHkgaW5zZXJ0aW9uLlxuICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGdlbmVyYXRpb24gc3RyYXRlZ3kgLSBpbmNyZW1lbnQsIHV1aWQgYW5kIHJvd2lkIChjb2Nrcm9hY2hkYiBvbmx5KS5cbiAqIEluY3JlbWVudCB1c2VzIGEgbnVtYmVyIHdoaWNoIGluY3JlYXNlcyBieSBvbmUgb24gZWFjaCBpbnNlcnRpb24uXG4gKiBVdWlkIGdlbmVyYXRlcyBhIHNwZWNpYWwgVVVJRCB0b2tlbi5cbiAqIFJvd2lkIHN1cHBvcnRzIG9ubHkgaW4gQ29ja3JvYWNoREIgYW5kIHVzZXMgYHVuaXF1ZV9yb3dpZCgpYCBmdW5jdGlvblxuICpcbiAqIE5vdGUsIHNvbWUgZGF0YWJhc2VzIGRvIG5vdCBzdXBwb3J0IG5vbi1wcmltYXJ5IGdlbmVyYXRpb24gY29sdW1ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdlbmVyYXRlZChzdHJhdGVneSkge1xuICAgIGlmIChzdHJhdGVneSA9PT0gdm9pZCAwKSB7IHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjsgfVxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZW5lcmF0ZWQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ3JlYXRlcyBhIGRhdGFiYXNlIGluZGV4LlxuICogQ2FuIGJlIHVzZWQgb24gZW50aXR5IHByb3BlcnR5IG9yIG9uIGVudGl0eS5cbiAqIENhbiBjcmVhdGUgaW5kaWNlcyB3aXRoIGNvbXBvc2l0ZSBjb2x1bW5zIHdoZW4gdXNlZCBvbiBlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJbmRleChuYW1lT3JGaWVsZHNPck9wdGlvbnMsIG1heWJlRmllbGRzT3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckZpZWxkc09yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG5hbWVPckZpZWxkc09yT3B0aW9ucyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZmllbGRzID0gdHlwZW9mIG5hbWVPckZpZWxkc09yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG1heWJlRmllbGRzT3JPcHRpb25zIDogbmFtZU9yRmllbGRzT3JPcHRpb25zO1xuICAgIHZhciBvcHRpb25zID0gKHR5cGVvZiBuYW1lT3JGaWVsZHNPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobmFtZU9yRmllbGRzT3JPcHRpb25zKSkgPyBuYW1lT3JGaWVsZHNPck9wdGlvbnMgOiBtYXliZU9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBtYXliZUZpZWxkc09yT3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShtYXliZUZpZWxkc09yT3B0aW9ucykpID8gbWF5YmVGaWVsZHNPck9wdGlvbnMgOiBtYXliZU9wdGlvbnM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjbHNPck9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5pbmRpY2VzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBwcm9wZXJ0eU5hbWUgPyBjbHNPck9iamVjdC5jb25zdHJ1Y3RvciA6IGNsc09yT2JqZWN0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHByb3BlcnR5TmFtZSA/IFtwcm9wZXJ0eU5hbWVdIDogZmllbGRzLFxuICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMgJiYgb3B0aW9ucy5zeW5jaHJvbml6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUsXG4gICAgICAgICAgICB3aGVyZTogb3B0aW9ucyA/IG9wdGlvbnMud2hlcmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1bmlxdWU6IG9wdGlvbnMgJiYgb3B0aW9ucy51bmlxdWUgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICBzcGF0aWFsOiBvcHRpb25zICYmIG9wdGlvbnMuc3BhdGlhbCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGZ1bGx0ZXh0OiBvcHRpb25zICYmIG9wdGlvbnMuZnVsbHRleHQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZXI6IG9wdGlvbnMgPyBvcHRpb25zLnBhcnNlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNwYXJzZTogb3B0aW9ucyAmJiBvcHRpb25zLnNwYXJzZSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5iYWNrZ3JvdW5kID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgZXhwaXJlQWZ0ZXJTZWNvbmRzOiBvcHRpb25zID8gb3B0aW9ucy5leHBpcmVBZnRlclNlY29uZHMgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5kZXguanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ29tcG9zaXRlIHVuaXF1ZSBjb25zdHJhaW50IG11c3QgYmUgc2V0IG9uIGVudGl0eSBjbGFzc2VzIGFuZCBtdXN0IHNwZWNpZnkgZW50aXR5J3MgZmllbGRzIHRvIGJlIHVuaXF1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVuaXF1ZShuYW1lT3JGaWVsZHMsIG1heWJlRmllbGRzKSB7XG4gICAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZU9yRmllbGRzID09PSBcInN0cmluZ1wiID8gbmFtZU9yRmllbGRzIDogdW5kZWZpbmVkO1xuICAgIHZhciBmaWVsZHMgPSB0eXBlb2YgbmFtZU9yRmllbGRzID09PSBcInN0cmluZ1wiID8gbWF5YmVGaWVsZHMgOiBuYW1lT3JGaWVsZHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjbHNPck9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHZhciBjb2x1bW5zID0gZmllbGRzO1xuICAgICAgICBpZiAocHJvcGVydHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIChwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IFtwcm9wZXJ0eU5hbWUudG9TdHJpbmcoKV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiBwcm9wZXJ0eU5hbWUgPyBjbHNPck9iamVjdC5jb25zdHJ1Y3RvciA6IGNsc09yT2JqZWN0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIH07XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goYXJncyk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yXCI7XG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKHR5cGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHwgdHlwZU9yT3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gdHlwZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgICAgIHZhciByZWZsZWN0TWV0YWRhdGFUeXBlID0gUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhID8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICAgICAgICAgIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSlcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IHR5cGU7XG4gICAgICAgIC8vIHNwZWNpZnkgSFNUT1JFIHR5cGUgaWYgY29sdW1uIGlzIEhTVE9SRVxuICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSBcImhzdG9yZVwiICYmICFvcHRpb25zLmhzdG9yZVR5cGUpXG4gICAgICAgICAgICBvcHRpb25zLmhzdG9yZVR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBPYmplY3QgPyBcIm9iamVjdFwiIDogXCJzdHJpbmdcIjtcbiAgICAgICAgaWYgKHR5cGVPck9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgeyAvLyByZWdpc3RlciBhbiBlbWJlZGRlZFxuICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVtYmVkZGVkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICBpc0FycmF5OiByZWZsZWN0TWV0YWRhdGFUeXBlID09PSBBcnJheSB8fCBvcHRpb25zLmFycmF5ID09PSB0cnVlLFxuICAgICAgICAgICAgICAgIHByZWZpeDogb3B0aW9ucy5wcmVmaXggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlZml4IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGVPck9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyByZWdpc3RlciBhIHJlZ3VsYXIgY29sdW1uXG4gICAgICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnVuaXF1ZXMucHVzaCh7IHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLCBjb2x1bW5zOiBbcHJvcGVydHlOYW1lXSB9KTtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgIG1vZGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCIgPyBvcHRpb25zLmdlbmVyYXRlZCA6IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGEgY3JlYXRpb24gZGF0ZSBvZiB0aGUgaW5zZXJ0ZWQgb2JqZWN0LlxuICogQ3JlYXRpb24gZGF0ZSBpcyBnZW5lcmF0ZWQgYW5kIGluc2VydGVkIG9ubHkgb25jZSxcbiAqIGF0IHRoZSBmaXJzdCB0aW1lIHdoZW4geW91IGNyZWF0ZSBhbiBvYmplY3QsIHRoZSB2YWx1ZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSB0YWJsZSwgYW5kIGlzIG5ldmVyIHRvdWNoZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwiY3JlYXRlRGF0ZVwiLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DcmVhdGVEYXRlQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIFRoaXMgY29sdW1uIHdpbGwgc3RvcmUgYSBkZWxldGUgZGF0ZSBvZiB0aGUgc29mdC1kZWxldGVkIG9iamVjdC5cbiAqIFRoaXMgZGF0ZSBpcyBiZWluZyB1cGRhdGVkIGVhY2ggdGltZSB5b3Ugc29mdC1kZWxldGUgdGhlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlbGV0ZURhdGVDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJkZWxldGVEYXRlXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZURhdGVDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogU3BlY2lhbCB0eXBlIG9mIGNvbHVtbiB0aGF0IGlzIGF2YWlsYWJsZSBvbmx5IGZvciBNb25nb0RCIGRhdGFiYXNlLlxuICogTWFya3MgeW91ciBlbnRpdHkncyBjb2x1bW4gdG8gYmUgYW4gb2JqZWN0IGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2JqZWN0SWRDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gaWYgY29sdW1uIG9wdGlvbnMgYXJlIG5vdCBnaXZlbiB0aGVuIGNyZWF0ZSBhIG5ldyBlbXB0eSBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFvcHRpb25zLm5hbWUpXG4gICAgICAgICAgICBvcHRpb25zLm5hbWUgPSBcIl9pZFwiO1xuICAgICAgICAvLyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGEgbmV3IGNvbHVtbiBtZXRhZGF0YVxuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcIm9iamVjdElkXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9iamVjdElkQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yXCI7XG5pbXBvcnQgeyBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1ByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3JcIjtcbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKHR5cGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHR5cGVPck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgICB2YXIgcmVmbGVjdE1ldGFkYXRhVHlwZSA9IFJlZmxlY3QgJiYgUmVmbGVjdC5nZXRNZXRhZGF0YSA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIG5vIHR5cGUgaW4gY29sdW1uIG9wdGlvbnMgdGhlbiBzZXQgdHlwZSBmcm9tIGZpcnN0IGZ1bmN0aW9uIGFyZ3VtZW50LCBvciBndWVzc2VkIG9uZVxuICAgICAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKVxuICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgICAgICBpZiAob3B0aW9ucy5udWxsYWJsZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG4gICAgICAgIC8vIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBuZXcgY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6IHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuZ2VuZXJhdGVkIDogXCJpbmNyZW1lbnRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1QcmltYXJ5Q29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihzdHJhdGVneU9yT3B0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIHZhciBzdHJhdGVneTtcbiAgICBpZiAoc3RyYXRlZ3lPck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHJhdGVneU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHN0cmF0ZWd5ID0gc3RyYXRlZ3lPck9wdGlvbnM7XG4gICAgICAgIGlmIChzdHJhdGVneU9yT3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICB9XG4gICAgaWYgKG1heWJlT3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBzdHJhdGVneSA9PT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJyb3dpZFwiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgICAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuICAgICAgICAvLyByZWdpc3RlciBjb2x1bW4gbWV0YWRhdGEgYXJnc1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcInJlZ3VsYXJcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBzdHJhdGVneTogc3RyYXRlZ3lcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpbWFyeUdlbmVyYXRlZENvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGFuIHVwZGF0ZSBkYXRlIG9mIHRoZSB1cGRhdGVkIG9iamVjdC5cbiAqIFRoaXMgZGF0ZSBpcyBiZWluZyB1cGRhdGVkIGVhY2ggdGltZSB5b3UgcGVyc2lzdCB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVXBkYXRlRGF0ZUNvbHVtbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBtb2RlOiBcInVwZGF0ZURhdGVcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMgPyBvcHRpb25zIDoge31cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXBkYXRlRGF0ZUNvbHVtbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBUaGlzIGNvbHVtbiB3aWxsIHN0b3JlIGEgbnVtYmVyIC0gdmVyc2lvbiBvZiB0aGUgZW50aXR5LlxuICogRXZlcnkgdGltZSB5b3VyIGVudGl0eSB3aWxsIGJlIHBlcnNpc3RlZCwgdGhpcyBudW1iZXIgd2lsbCBiZSBpbmNyZWFzZWQgYnkgb25lIC1cbiAqIHNvIHlvdSBjYW4gb3JnYW5pemUgdmlzaW9uaW5nIGFuZCB1cGRhdGUgc3RyYXRlZ2llcyBvZiB5b3VyIGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZlcnNpb25Db2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJ2ZXJzaW9uXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZlcnNpb25Db2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVmlld0NvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB2aWV3IGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFZpZXdDb2x1bW4ob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbW9kZTogXCJyZWd1bGFyXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zIHx8IHt9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSB2aWV3LlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVmlld0VudGl0eShuYW1lT3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICB2YXIgb3B0aW9ucyA9ICh0eXBlb2YgbmFtZU9yT3B0aW9ucyA9PT0gXCJvYmplY3RcIiA/IG5hbWVPck9wdGlvbnMgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBvcHRpb25zLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBkZXBlbmRzT246IG9wdGlvbnMuZGVwZW5kc09uID8gbmV3IFNldChvcHRpb25zLmRlcGVuZHNPbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0eXBlOiBcInZpZXdcIixcbiAgICAgICAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogISFvcHRpb25zLm1hdGVyaWFsaXplZFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3RW50aXR5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIFNwZWNpYWwgdHlwZSBvZiB0aGUgdGFibGUgdXNlZCBpbiB0aGUgc2luZ2xlLXRhYmxlIGluaGVyaXRlZCB0YWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDaGlsZEVudGl0eShkaXNjcmltaW5hdG9yVmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAvLyByZWdpc3RlciBhIHRhYmxlIG1ldGFkYXRhXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIHR5cGU6IFwiZW50aXR5LWNoaWxkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyByZWdpc3RlciBkaXNjcmltaW5hdG9yIHZhbHVlIGlmIGl0IHdhcyBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGRpc2NyaW1pbmF0b3JWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5kaXNjcmltaW5hdG9yVmFsdWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBkaXNjcmltaW5hdG9yVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hpbGRFbnRpdHkuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWVPck9wdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgIHZhciBvcHRpb25zID0gKHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcIm9iamVjdFwiID8gbmFtZU9yT3B0aW9ucyA6IG1heWJlT3B0aW9ucykgfHwge307XG4gICAgdmFyIG5hbWUgPSB0eXBlb2YgbmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/IG5hbWVPck9wdGlvbnMgOiBvcHRpb25zLm5hbWU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHR5cGU6IFwicmVndWxhclwiLFxuICAgICAgICAgICAgb3JkZXJCeTogb3B0aW9ucy5vcmRlckJ5ID8gb3B0aW9ucy5vcmRlckJ5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5naW5lOiBvcHRpb25zLmVuZ2luZSA/IG9wdGlvbnMuZW5naW5lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IG9wdGlvbnMuZGF0YWJhc2UgPyBvcHRpb25zLmRhdGFiYXNlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSA/IG9wdGlvbnMuc2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMuc3luY2hyb25pemUsXG4gICAgICAgICAgICB3aXRob3V0Um93aWQ6IG9wdGlvbnMud2l0aG91dFJvd2lkXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBTZXRzIGZvciBlbnRpdHkgdG8gdXNlIHRhYmxlIGluaGVyaXRhbmNlIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUYWJsZUluaGVyaXRhbmNlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuaW5oZXJpdGFuY2VzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICBwYXR0ZXJuOiBvcHRpb25zICYmIG9wdGlvbnMucGF0dGVybiA/IG9wdGlvbnMucGF0dGVybiA6IFwiU1RJXCIsXG4gICAgICAgICAgICBjb2x1bW46IG9wdGlvbnMgJiYgb3B0aW9ucy5jb2x1bW4gPyB0eXBlb2Ygb3B0aW9ucy5jb2x1bW4gPT09IFwic3RyaW5nXCIgPyB7IG5hbWU6IG9wdGlvbnMuY29sdW1uIH0gOiBvcHRpb25zLmNvbHVtbiA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUluaGVyaXRhbmNlLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyVHlwZXMgfSBmcm9tIFwiLi4vLi4vbWV0YWRhdGEvdHlwZXMvRXZlbnRMaXN0ZW5lclR5cGVzXCI7XG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9uIHdoaWNoIHRoaXMgZGVjb3JhdG9yIGlzIGFwcGxpZWQgYWZ0ZXIgdGhpcyBlbnRpdHkgaW5zZXJ0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJJbnNlcnQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9JTlNFUlRcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWZ0ZXJJbnNlcnQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciBlbnRpdHkgaXMgbG9hZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJMb2FkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfTE9BRFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZnRlckxvYWQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciB0aGlzIGVudGl0eSByZW1vdmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQWZ0ZXJSZW1vdmUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9SRU1PVkVcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWZ0ZXJSZW1vdmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBhZnRlciB0aGlzIGVudGl0eSB1cGRhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBZnRlclVwZGF0ZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlMaXN0ZW5lcnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdHlwZTogRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX1VQREFURVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZnRlclVwZGF0ZS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiB3aGljaCB0aGlzIGRlY29yYXRvciBpcyBhcHBsaWVkIGJlZm9yZSB0aGlzIGVudGl0eSBpbnNlcnRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCZWZvcmVJbnNlcnQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5TGlzdGVuZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHR5cGU6IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfSU5TRVJUXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJlZm9yZUluc2VydC5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuLyoqXG4gKiBDYWxscyBhIG1ldGhvZCBvbiB3aGljaCB0aGlzIGRlY29yYXRvciBpcyBhcHBsaWVkIGJlZm9yZSB0aGlzIGVudGl0eSByZW1vdmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQmVmb3JlUmVtb3ZlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX1JFTU9WRVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CZWZvcmVSZW1vdmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9IGZyb20gXCIuLi8uLi9tZXRhZGF0YS90eXBlcy9FdmVudExpc3RlbmVyVHlwZXNcIjtcbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb24gd2hpY2ggdGhpcyBkZWNvcmF0b3IgaXMgYXBwbGllZCBiZWZvcmUgdGhpcyBlbnRpdHkgdXBkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQmVmb3JlVXBkYXRlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmVudGl0eUxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0eXBlOiBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX1VQREFURVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CZWZvcmVVcGRhdGUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQ2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGxpc3RlbiB0byBPUk0gZXZlbnRzIGFuZCB0aGVpciBtZXRob2RzIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gZXZlbnRcbiAqIG9jY3Vycy4gVGhvc2UgY2xhc3NlcyBtdXN0IGltcGxlbWVudCBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRXZlbnRTdWJzY3JpYmVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlTdWJzY3JpYmVycy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50U3Vic2NyaWJlci5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29sdW1uT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW50aXR5T3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5kZXhPcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luQ29sdW1uT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Sm9pblRhYmxlT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25PcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WYWx1ZVRyYW5zZm9ybWVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEpvaW5Db2x1bW4gZGVjb3JhdG9yIHVzZWQgb24gb25lLXRvLW9uZSByZWxhdGlvbnMgdG8gc3BlY2lmeSBvd25lciBzaWRlIG9mIHJlbGF0aW9uc2hpcC5cbiAqIEl0IGFsc28gY2FuIGJlIHVzZWQgb24gYm90aCBvbmUtdG8tb25lIGFuZCBtYW55LXRvLW9uZSByZWxhdGlvbnMgdG8gc3BlY2lmeSBjdXN0b20gY29sdW1uIG5hbWVcbiAqIG9yIGN1c3RvbSByZWZlcmVuY2VkIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEpvaW5Db2x1bW4ob3B0aW9uc09yT3B0aW9uc0FycmF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9uc09yT3B0aW9uc0FycmF5KSA/IG9wdGlvbnNPck9wdGlvbnNBcnJheSA6IFtvcHRpb25zT3JPcHRpb25zQXJyYXkgfHwge31dO1xuICAgICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5qb2luQ29sdW1ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbk5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luQ29sdW1uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEpvaW5UYWJsZSBkZWNvcmF0b3IgaXMgdXNlZCBpbiBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwIHRvIHNwZWNpZnkgb3duZXIgc2lkZSBvZiByZWxhdGlvbnNoaXAuXG4gKiBJdHMgYWxzbyB1c2VkIHRvIHNldCBhIGN1c3RvbSBqdW5jdGlvbiB0YWJsZSdzIG5hbWUsIGNvbHVtbiBuYW1lcyBhbmQgcmVmZXJlbmNlZCBjb2x1bW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSm9pblRhYmxlKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICBqb2luQ29sdW1uczogKG9wdGlvbnMgJiYgb3B0aW9ucy5qb2luQ29sdW1uID8gW29wdGlvbnMuam9pbkNvbHVtbl0gOiBvcHRpb25zLmpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uczogKG9wdGlvbnMgJiYgb3B0aW9ucy5pbnZlcnNlSm9pbkNvbHVtbiA/IFtvcHRpb25zLmludmVyc2VKb2luQ29sdW1uXSA6IG9wdGlvbnMuaW52ZXJzZUpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucyAmJiBvcHRpb25zLnNjaGVtYSA/IG9wdGlvbnMuc2NoZW1hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IG9wdGlvbnMgJiYgb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpvaW5UYWJsZS5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBpbnZlcnNlU2lkZVByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgaW52ZXJzZVNpZGVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0aW9ucyA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhKSB7IC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICAgICAgICB2YXIgcmVmbGVjdGVkVHlwZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICBpZiAocmVmbGVjdGVkVHlwZSAmJiB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIilcbiAgICAgICAgICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tbWFueVwiLFxuICAgICAgICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICAgICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgICAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hbnlUb01hbnkuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICB2YXIgaW52ZXJzZVNpZGVQcm9wZXJ0eTtcbiAgICBpZiAodHlwZW9mIGludmVyc2VTaWRlT3JPcHRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG9wdGlvbnMgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1vbmVcIixcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICAgICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZVByb3BlcnR5LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYW55VG9PbmUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogQSBvbmUtdG8tbWFueSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MixcbiAqIGJ1dCBFbnRpdHkyIGhhcyBvbmx5IG9uZSBFbnRpdHkxLiBFbnRpdHkyIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZiBFbnRpdHkxIG9uIGl0c1xuICogc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb01hbnkodHlwZUZ1bmN0aW9uT3JUYXJnZXQsIGludmVyc2VTaWRlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgICAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tbWFueVwiLFxuICAgICAgICAgICAgdHlwZTogdHlwZUZ1bmN0aW9uT3JUYXJnZXQsXG4gICAgICAgICAgICBpbnZlcnNlU2lkZVByb3BlcnR5OiBpbnZlcnNlU2lkZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T25lVG9NYW55LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIE9uZS10by1vbmUgcmVsYXRpb24gYWxsb3dzIHRvIGNyZWF0ZSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGF2ZSBvbmx5IG9uZSBFbnRpdHkyLlxuICogRW50aXR5MSBpcyBhbiBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmFnZXMgRW50aXR5MSBpZCBvbiBpdHMgb3duIHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPbmVUb09uZSh0eXBlRnVuY3Rpb25PclRhcmdldCwgaW52ZXJzZVNpZGVPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICAgIHZhciBpbnZlcnNlU2lkZVByb3BlcnR5O1xuICAgIGlmICh0eXBlb2YgaW52ZXJzZVNpZGVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0aW9ucyA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEpIHsgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgICAgICAgIHZhciByZWZsZWN0ZWRUeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIGlmIChyZWZsZWN0ZWRUeXBlICYmIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiKVxuICAgICAgICAgICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICAgICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgICAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICAgICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgICAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9uZVRvT25lLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEhvbGRzIGEgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoZSBjbG9zdXJlIHRhYmxlIG9mIHRoZSBjb2x1bW4uXG4gKlxuICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIGRlY29yYXRvciwgaXQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB2ZXJzaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gUmVsYXRpb25Db3VudChyZWxhdGlvbiwgYWxpYXMsIHF1ZXJ5QnVpbGRlckZhY3RvcnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5yZWxhdGlvbkNvdW50cy5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24sXG4gICAgICAgICAgICBhbGlhczogYWxpYXMsXG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXJGYWN0b3J5OiBxdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnQuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogU3BlY2lhbCBkZWNvcmF0b3IgdXNlZCB0byBleHRyYWN0IHJlbGF0aW9uIGlkIGludG8gc2VwYXJhdGUgZW50aXR5IHByb3BlcnR5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlbGF0aW9uSWQocmVsYXRpb24sIGFsaWFzLCBxdWVyeUJ1aWxkZXJGYWN0b3J5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkucmVsYXRpb25JZHMucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgcmVsYXRpb246IHJlbGF0aW9uLFxuICAgICAgICAgICAgYWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogcXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbklkLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb25nb1JlcG9zaXRvcnkgfSBmcm9tIFwiLi4vLi4vcmVwb3NpdG9yeS9Nb25nb1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFRyZWVSZXBvc2l0b3J5IH0gZnJvbSBcIi4uLy4uL3JlcG9zaXRvcnkvVHJlZVJlcG9zaXRvcnlcIjtcbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvbihjb25uZWN0aW9uT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBtZXRob2QgLSB3ZSBnb25uYSBuZWVkIGl0XG4gICAgICAgIHZhciBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgIC8vIG92ZXJyaWRlIG1ldGhvZCBkZXNjcmlwdG9yIHdpdGggcHJveHkgbWV0aG9kXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7XG4gICAgICAgICAgICB2YXIgaXNvbGF0aW9uTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbk9yT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbk9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25Pck9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbk9yT3B0aW9ucy5jb25uZWN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uT3JPcHRpb25zLmNvbm5lY3Rpb25OYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uT3JPcHRpb25zLmlzb2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwgPSBjb25uZWN0aW9uT3JPcHRpb25zLmlzb2xhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0cmFuc2FjdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKGVudGl0eU1hbmFnZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJnc1dpdGhJbmplY3RlZFRyYW5zYWN0aW9uTWFuYWdlckFuZFJlcG9zaXRvcmllcztcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgYWxsIEBUcmFuc2FjdGlvbk1hbmFnZXIoKSBhbmQgQFRyYW5zYWN0aW9uUmVwb3NpdG9yeSgpIGRlY29yYXRvciB1c2FnZXMgZm9yIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlck1ldGFkYXRhcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyVHJhbnNhY3Rpb25FbnRpdHlNYW5hZ2Vycyh0YXJnZXQuY29uc3RydWN0b3IsIG1ldGhvZE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyVHJhbnNhY3Rpb25SZXBvc2l0b3J5KHRhcmdldC5jb25zdHJ1Y3RvciwgbWV0aG9kTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgQFRyYW5zYWN0aW9uTWFuYWdlcigpIGRlY29yYXRvciB1c2FnZXMgdGhlIGluamVjdCB0aGVtXG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlck1ldGFkYXRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncyksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBtZXRob2QgcGFyYW1zIHdpdGggaW5qZWN0aW9uIG9mIHRyYW5zYWN0aW9uRW50aXR5TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMuc3BsaWNlKG1ldGFkYXRhLmluZGV4LCAwLCBlbnRpdHlNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcy5sZW5ndGggPT09IDApIHsgLy8gb3RoZXJ3aXNlIGlmIHRoZXJlJ3Mgbm8gdHJhbnNhY3Rpb24gcmVwb3NpdG9yaWVzIGluIHVzZSwgaW5qZWN0IGl0IGFzIGEgZmlyc3QgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMgPSBfX3NwcmVhZEFycmF5KFtlbnRpdHlNYW5hZ2VyXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdzV2l0aEluamVjdGVkVHJhbnNhY3Rpb25NYW5hZ2VyQW5kUmVwb3NpdG9yaWVzID0gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFyZ3MpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZvciBldmVyeSB1c2FnZSBvZiBAVHJhbnNhY3Rpb25SZXBvc2l0b3J5IGRlY29yYXRvclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUmVwb3NpdG9yeU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVwb3NpdG9yeUluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXRlY3QgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeSBhbmQgZ2V0IGluc3RhbmNlIGZyb20gdHJhbnNhY3Rpb24gZW50aXR5IG1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXRhZGF0YS5yZXBvc2l0b3J5VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXBvc2l0b3J5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0UmVwb3NpdG9yeShtZXRhZGF0YS5lbnRpdHlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9uZ29SZXBvc2l0b3J5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0TW9uZ29SZXBvc2l0b3J5KG1ldGFkYXRhLmVudGl0eVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmVlUmVwb3NpdG9yeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5SW5zdGFuY2UgPSBlbnRpdHlNYW5hZ2VyLmdldFRyZWVSZXBvc2l0b3J5KG1ldGFkYXRhLmVudGl0eVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IHRoZSBUeXBlT1JNJ3Mgb25lcywgdGhlcmUgbXVzdCBiZSBjdXN0b20gcmVwb3NpdG9yeSBjbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJbnN0YW5jZSA9IGVudGl0eU1hbmFnZXIuZ2V0Q3VzdG9tUmVwb3NpdG9yeShtZXRhZGF0YS5yZXBvc2l0b3J5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBtZXRob2QgcGFyYW0gd2l0aCBpbmplY3Rpb24gb2YgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgICAgICBhcmdzV2l0aEluamVjdGVkVHJhbnNhY3Rpb25NYW5hZ2VyQW5kUmVwb3NpdG9yaWVzLnNwbGljZShtZXRhZGF0YS5pbmRleCwgMCwgcmVwb3NpdG9yeUluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkoX3RoaXMsIGFyZ3NXaXRoSW5qZWN0ZWRUcmFuc2FjdGlvbk1hbmFnZXJBbmRSZXBvc2l0b3JpZXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5tYW5hZ2VyLnRyYW5zYWN0aW9uKGlzb2xhdGlvbkxldmVsLCB0cmFuc2FjdGlvbkNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5tYW5hZ2VyLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyYW5zYWN0aW9uLmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIEluamVjdHMgdHJhbnNhY3Rpb24ncyBlbnRpdHkgbWFuYWdlciBpbnRvIHRoZSBtZXRob2Qgd3JhcHBlZCB3aXRoIEBUcmFuc2FjdGlvbiBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QsIG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFuc2FjdGlvbk1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvclwiO1xuLyoqXG4gKiBJbmplY3RzIHRyYW5zYWN0aW9uJ3MgcmVwb3NpdG9yeSBpbnRvIHRoZSBtZXRob2Qgd3JhcHBlZCB3aXRoIEBUcmFuc2FjdGlvbiBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2FjdGlvblJlcG9zaXRvcnkoZW50aXR5VHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgICAvLyBnZXQgcmVwb3NpdG9yeSB0eXBlXG4gICAgICAgIHZhciByZXBvc2l0b3J5VHlwZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlUeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIG9iamVjdCwgbWV0aG9kTmFtZSlbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDYW5ub3RSZWZsZWN0TWV0aG9kUGFyYW1ldGVyVHlwZUVycm9yKG9iamVjdC5jb25zdHJ1Y3RvciwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRyYW5zYWN0aW9uUmVwb3NpdG9yaWVzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgcmVwb3NpdG9yeVR5cGU6IHJlcG9zaXRvcnlUeXBlLFxuICAgICAgICAgICAgZW50aXR5VHlwZTogZW50aXR5VHlwZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25SZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuLi8uLi9nbG9iYWxzXCI7XG4vKipcbiAqIE1hcmtzIGVudGl0eSB0byB3b3JrIGxpa2UgYSB0cmVlLlxuICogVHJlZSBwYXR0ZXJuIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdHJlZSBlbnRpdHkgc2hvdWxkIGJlIHNwZWNpZmllZC5cbiAqIEBUcmVlUGFyZW50IGRlY29yYXRvciBtdXN0IGJlIHVzZWQgaW4gdHJlZSBlbnRpdGllcy5cbiAqIFRyZWVSZXBvc2l0b3J5IGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgd2l0aCB0cmVlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVHJlZSh0eXBlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRyZWVzLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgb3B0aW9uczogdHlwZSA9PT0gXCJjbG9zdXJlLXRhYmxlXCIgPyBvcHRpb25zIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWUuanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBlbnRpdHkgcHJvcGVydHkgYXMgYSBjaGlsZHJlbiBvZiB0aGUgdHJlZS5cbiAqIFwiVHJlZSBjaGlsZHJlblwiIHdpbGwgY29udGFpbiBhbGwgY2hpbGRyZW4gKGJpbmQpIG9mIHRoaXMgZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gVHJlZUNoaWxkcmVuKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIHJlZmxlY3RlZFR5cGUgPSBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaXNMYXp5ID0gKHJlZmxlY3RlZFR5cGUgJiYgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCIpIHx8IGZhbHNlO1xuICAgICAgICAvLyBhZGQgb25lLXRvLW1hbnkgcmVsYXRpb24gZm9yIHRoaXNcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlzVHJlZUNoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm9uZS10by1tYW55XCIsXG4gICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmplY3QuY29uc3RydWN0b3I7IH0sXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVDaGlsZHJlbi5qcy5tYXBcbiIsImltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vLi4vZ2xvYmFsc1wiO1xuLyoqXG4gKiBDcmVhdGVzIGEgXCJsZXZlbFwiL1wibGVuZ3RoXCIgY29sdW1uIHRvIHRoZSB0YWJsZSB0aGF0IGhvbGRzIGEgY2xvc3VyZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRyZWVMZXZlbENvbHVtbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1vZGU6IFwidHJlZUxldmVsXCIsXG4gICAgICAgICAgICBvcHRpb25zOiB7fVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmVlTGV2ZWxDb2x1bW4uanMubWFwXG4iLCJpbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL2dsb2JhbHNcIjtcbi8qKlxuICogTWFya3MgYSBlbnRpdHkgcHJvcGVydHkgYXMgYSBwYXJlbnQgb2YgdGhlIHRyZWUuXG4gKiBcIlRyZWUgcGFyZW50XCIgaW5kaWNhdGVzIHdobyBvd25zIChpcyBhIHBhcmVudCkgb2YgdGhpcyBlbnRpdHkgaW4gdHJlZSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmVlUGFyZW50KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICAgICAgdmFyIHJlZmxlY3RlZFR5cGUgPSBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0TWV0YWRhdGEgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaXNMYXp5ID0gKHJlZmxlY3RlZFR5cGUgJiYgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJiByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCIpIHx8IGZhbHNlO1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkucmVsYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgaXNUcmVlUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGlzTGF6eTogaXNMYXp5LFxuICAgICAgICAgICAgcmVsYXRpb25UeXBlOiBcIm1hbnktdG8tb25lXCIsXG4gICAgICAgICAgICB0eXBlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmplY3QuY29uc3RydWN0b3I7IH0sXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVQYXJlbnQuanMubWFwXG4iLCJpbXBvcnQgeyBNaXNzaW5nRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTWlzc2luZ0RyaXZlckVycm9yXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4vbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4vc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4vb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgU3FsaXRlRHJpdmVyIH0gZnJvbSBcIi4vc3FsaXRlL1NxbGl0ZURyaXZlclwiO1xuaW1wb3J0IHsgQ29yZG92YURyaXZlciB9IGZyb20gXCIuL2NvcmRvdmEvQ29yZG92YURyaXZlclwiO1xuaW1wb3J0IHsgUmVhY3ROYXRpdmVEcml2ZXIgfSBmcm9tIFwiLi9yZWFjdC1uYXRpdmUvUmVhY3ROYXRpdmVEcml2ZXJcIjtcbmltcG9ydCB7IE5hdGl2ZXNjcmlwdERyaXZlciB9IGZyb20gXCIuL25hdGl2ZXNjcmlwdC9OYXRpdmVzY3JpcHREcml2ZXJcIjtcbmltcG9ydCB7IFNxbGpzRHJpdmVyIH0gZnJvbSBcIi4vc3FsanMvU3FsanNEcml2ZXJcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4vbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4vcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IEV4cG9Ecml2ZXIgfSBmcm9tIFwiLi9leHBvL0V4cG9Ecml2ZXJcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4vYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgU2FwRHJpdmVyIH0gZnJvbSBcIi4vc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgQmV0dGVyU3FsaXRlM0RyaXZlciB9IGZyb20gXCIuL2JldHRlci1zcWxpdGUzL0JldHRlclNxbGl0ZTNEcml2ZXJcIjtcbmltcG9ydCB7IENhcGFjaXRvckRyaXZlciB9IGZyb20gXCIuL2NhcGFjaXRvci9DYXBhY2l0b3JEcml2ZXJcIjtcbi8qKlxuICogSGVscHMgdG8gY3JlYXRlIGRyaXZlcnMuXG4gKi9cbnZhciBEcml2ZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyaXZlckZhY3RvcnkoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZHJpdmVyIGRlcGVuZCBvbiBhIGdpdmVuIGNvbm5lY3Rpb24ncyBkcml2ZXIgdHlwZS5cbiAgICAgKi9cbiAgICBEcml2ZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgdHlwZSA9IGNvbm5lY3Rpb24ub3B0aW9ucy50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJteXNxbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXlzcWxEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwicG9zdGdyZXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImNvY2tyb2FjaGRiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2Nrcm9hY2hEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwic2FwXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXBEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwibWFyaWFkYlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXlzcWxEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwic3FsaXRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcWxpdGVEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiYmV0dGVyLXNxbGl0ZTNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJldHRlclNxbGl0ZTNEcml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiY29yZG92YVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29yZG92YURyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJuYXRpdmVzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZXNjcmlwdERyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJyZWFjdC1uYXRpdmVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlYWN0TmF0aXZlRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcInNxbGpzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcWxqc0RyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJvcmFjbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9yYWNsZURyaXZlcihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNhc2UgXCJtc3NxbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3FsU2VydmVyRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcIm1vbmdvZGJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vbmdvRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImV4cG9cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cG9Ecml2ZXIoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjYXNlIFwiYXVyb3JhLWRhdGEtYXBpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXJvcmFEYXRhQXBpRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImF1cm9yYS1kYXRhLWFwaS1wZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImNhcGFjaXRvclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FwYWNpdG9yRHJpdmVyKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RyaXZlckVycm9yKHR5cGUsIFtcbiAgICAgICAgICAgICAgICAgICAgXCJhdXJvcmEtZGF0YS1hcGlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhdXJvcmEtZGF0YS1hcGktcGdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJiZXR0ZXItc3FsaXRlM1wiLFxuICAgICAgICAgICAgICAgICAgICBcImNhcGFjaXRvclwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvY2tyb2FjaGRiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29yZG92YVwiLFxuICAgICAgICAgICAgICAgICAgICBcImV4cG9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJtYXJpYWRiXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibW9uZ29kYlwiLFxuICAgICAgICAgICAgICAgICAgICBcIm1zc3FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibXlzcWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJuYXRpdmVzY3JpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJvcmFjbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInJlYWN0LW5hdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInNhcFwiLFxuICAgICAgICAgICAgICAgICAgICBcInNxbGl0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInNxbGpzXCIsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEcml2ZXJGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IERyaXZlckZhY3RvcnkgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RHJpdmVyRmFjdG9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGhhc2gsIHNob3J0ZW4gfSBmcm9tIFwiLi4vdXRpbC9TdHJpbmdVdGlsc1wiO1xuLyoqXG4gKiBDb21tb24gZHJpdmVyIHV0aWxpdHkgZnVuY3Rpb25zLlxuICovXG52YXIgRHJpdmVyVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHJpdmVyVXRpbHMoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBhbmQgYnVpbGRzIGEgbmV3IGRyaXZlciBvcHRpb25zLlxuICAgICAqIEV4dHJhY3RzIHNldHRpbmdzIGZyb20gY29ubmVjdGlvbiB1cmwgYW5kIHNldHMgdG8gYSBuZXcgb3B0aW9ucyBvYmplY3QuXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGREcml2ZXJPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMsIGJ1aWxkT3B0aW9ucykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICAgICAgICB2YXIgdXJsRHJpdmVyT3B0aW9ucyA9IHRoaXMucGFyc2VDb25uZWN0aW9uVXJsKG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIGlmIChidWlsZE9wdGlvbnMgJiYgYnVpbGRPcHRpb25zLnVzZVNpZCAmJiB1cmxEcml2ZXJPcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgICAgICAgICAgICAgdXJsRHJpdmVyT3B0aW9ucy5zaWQgPSB1cmxEcml2ZXJPcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKE9iamVjdC5rZXlzKHVybERyaXZlck9wdGlvbnMpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsRHJpdmVyT3B0aW9uc1trZXldID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdXJsRHJpdmVyT3B0aW9uc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHVybERyaXZlck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGJ1aWxkRHJpdmVyT3B0aW9ucyBmb3IgTW9uZ29kREIgb25seSB0byBzdXBwb3J0IHJlcGxpY2Egc2V0XG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRNb25nb0RCRHJpdmVyT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zLCBidWlsZE9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICAgICAgdmFyIHVybERyaXZlck9wdGlvbnMgPSB0aGlzLnBhcnNlTW9uZ29EQkNvbm5lY3Rpb25Vcmwob3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgaWYgKGJ1aWxkT3B0aW9ucyAmJiBidWlsZE9wdGlvbnMudXNlU2lkICYmIHVybERyaXZlck9wdGlvbnMuZGF0YWJhc2UpIHtcbiAgICAgICAgICAgICAgICB1cmxEcml2ZXJPcHRpb25zLnNpZCA9IHVybERyaXZlck9wdGlvbnMuZGF0YWJhc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXModXJsRHJpdmVyT3B0aW9ucykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxEcml2ZXJPcHRpb25zW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxEcml2ZXJPcHRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgdXJsRHJpdmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSm9pbnMgYW5kIHNob3J0ZW5zIGFsaWFzIGlmIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBhbGlhcyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBsaW1pdCBhbGxvd2VkIGJ5IHRoZSBjdXJyZW50XG4gICAgICogZHJpdmVyLCByZXBsYWNlcyBpdCB3aXRoIGEgc2hvcnRlbmQgc3RyaW5nLCBpZiB0aGUgc2hvcnRlbmQgc3RyaW5nXG4gICAgICogaXMgc3RpbGwgdG9vIGxvbmcsIGl0IHdpbGwgdGhlbiBoYXNoIHRoZSBhbGlhcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkcml2ZXIgQ3VycmVudCBgRHJpdmVyYC5cbiAgICAgKiBAcGFyYW0gYnVpbGRPcHRpb25zIE9wdGlvbmFsIHNldHRpbmdzLlxuICAgICAqIEBwYXJhbSBhbGlhcyBBbGlhcyBwYXJ0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQW4gYWxpYXMgdGhhdCBpcyBubyBsb25nZXIgdGhhbiB0aGUgZGl2ZXJzIG1heCBhbGlhcyBsZW5ndGguXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyA9IGZ1bmN0aW9uIChfYSwgYnVpbGRPcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXhBbGlhc0xlbmd0aCA9IF9hLm1heEFsaWFzTGVuZ3RoO1xuICAgICAgICB2YXIgYWxpYXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFsaWFzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnVpbGRPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBhbGlhcy51bnNoaWZ0KGJ1aWxkT3B0aW9ucyk7XG4gICAgICAgICAgICBidWlsZE9wdGlvbnMgPSB7IHNob3J0ZW46IGZhbHNlLCBqb2luZXI6IFwiX1wiIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWlsZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgc2hvcnRlbjogZmFsc2UsIGpvaW5lcjogXCJfXCIgfSwgYnVpbGRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3QWxpYXMgPSBhbGlhcy5sZW5ndGggPT09IDEgPyBhbGlhc1swXSA6IGFsaWFzLmpvaW4oYnVpbGRPcHRpb25zLmpvaW5lcik7XG4gICAgICAgIGlmIChtYXhBbGlhc0xlbmd0aCAmJiBtYXhBbGlhc0xlbmd0aCA+IDAgJiYgbmV3QWxpYXMubGVuZ3RoID4gbWF4QWxpYXNMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChidWlsZE9wdGlvbnMuc2hvcnRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBzaG9ydGVuZWRBbGlhcyA9IHNob3J0ZW4obmV3QWxpYXMpO1xuICAgICAgICAgICAgICAgIGlmIChzaG9ydGVuZWRBbGlhcy5sZW5ndGggPCBtYXhBbGlhc0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvcnRlbmVkQWxpYXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc2gobmV3QWxpYXMsIHsgbGVuZ3RoOiBtYXhBbGlhc0xlbmd0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3QWxpYXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYGJ1aWxkQWxpYXNgIGluc3RlYWQuXG4gICAgICovXG4gICAgRHJpdmVyVXRpbHMuYnVpbGRDb2x1bW5BbGlhcyA9IGZ1bmN0aW9uIChfYSwgYnVpbGRPcHRpb25zKSB7XG4gICAgICAgIHZhciBtYXhBbGlhc0xlbmd0aCA9IF9hLm1heEFsaWFzTGVuZ3RoO1xuICAgICAgICB2YXIgYWxpYXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFsaWFzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQWxpYXMuYXBwbHkodGhpcywgX19zcHJlYWRBcnJheShbeyBtYXhBbGlhc0xlbmd0aDogbWF4QWxpYXNMZW5ndGggfSwgYnVpbGRPcHRpb25zXSwgX19yZWFkKGFsaWFzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbm5lY3Rpb24gZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybC5cbiAgICAgKi9cbiAgICBEcml2ZXJVdGlscy5wYXJzZUNvbm5lY3Rpb25VcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdXJsLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgdmFyIGZpcnN0U2xhc2hlcyA9IHVybC5pbmRleE9mKFwiLy9cIik7XG4gICAgICAgIHZhciBwcmVCYXNlID0gdXJsLnN1YnN0cihmaXJzdFNsYXNoZXMgKyAyKTtcbiAgICAgICAgdmFyIHNlY29uZFNsYXNoID0gcHJlQmFzZS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgdmFyIGJhc2UgPSAoc2Vjb25kU2xhc2ggIT09IC0xKSA/IHByZUJhc2Uuc3Vic3RyKDAsIHNlY29uZFNsYXNoKSA6IHByZUJhc2U7XG4gICAgICAgIHZhciBhZnRlckJhc2UgPSAoc2Vjb25kU2xhc2ggIT09IC0xKSA/IHByZUJhc2Uuc3Vic3RyKHNlY29uZFNsYXNoICsgMSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHJlbW92ZSBtb25nb2RiIHF1ZXJ5IHBhcmFtc1xuICAgICAgICBpZiAoYWZ0ZXJCYXNlICYmIGFmdGVyQmFzZS5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyQmFzZSA9IGFmdGVyQmFzZS5zdWJzdHIoMCwgYWZ0ZXJCYXNlLmluZGV4T2YoXCI/XCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGFzdEF0U2lnbiA9IGJhc2UubGFzdEluZGV4T2YoXCJAXCIpO1xuICAgICAgICB2YXIgdXNlcm5hbWVBbmRQYXNzd29yZCA9IGJhc2Uuc3Vic3RyKDAsIGxhc3RBdFNpZ24pO1xuICAgICAgICB2YXIgaG9zdEFuZFBvcnQgPSBiYXNlLnN1YnN0cihsYXN0QXRTaWduICsgMSk7XG4gICAgICAgIHZhciB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQ7XG4gICAgICAgIHZhciBwYXNzd29yZCA9IFwiXCI7XG4gICAgICAgIHZhciBmaXJzdENvbG9uID0gdXNlcm5hbWVBbmRQYXNzd29yZC5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgaWYgKGZpcnN0Q29sb24gIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyKDAsIGZpcnN0Q29sb24pO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VybmFtZUFuZFBhc3N3b3JkLnN1YnN0cihmaXJzdENvbG9uICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gX19yZWFkKGhvc3RBbmRQb3J0LnNwbGl0KFwiOlwiKSwgMiksIGhvc3QgPSBfYVswXSwgcG9ydCA9IF9hWzFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICB1c2VybmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpLFxuICAgICAgICAgICAgcG9ydDogcG9ydCA/IHBhcnNlSW50KHBvcnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IGFmdGVyQmFzZSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbm5lY3Rpb24gZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uIHVybCBmb3IgTW9uZ29EQiB0byBzdXBwb3J0IHJlcGxpY2Egc2V0LlxuICAgICAqL1xuICAgIERyaXZlclV0aWxzLnBhcnNlTW9uZ29EQkNvbm5lY3Rpb25VcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciBfYSwgZV8zLCBfYjtcbiAgICAgICAgdmFyIHR5cGUgPSB1cmwuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICB2YXIgZmlyc3RTbGFzaGVzID0gdXJsLmluZGV4T2YoXCIvL1wiKTtcbiAgICAgICAgdmFyIHByZUJhc2UgPSB1cmwuc3Vic3RyKGZpcnN0U2xhc2hlcyArIDIpO1xuICAgICAgICB2YXIgc2Vjb25kU2xhc2ggPSBwcmVCYXNlLmluZGV4T2YoXCIvXCIpO1xuICAgICAgICB2YXIgYmFzZSA9IChzZWNvbmRTbGFzaCAhPT0gLTEpID8gcHJlQmFzZS5zdWJzdHIoMCwgc2Vjb25kU2xhc2gpIDogcHJlQmFzZTtcbiAgICAgICAgdmFyIGFmdGVyQmFzZSA9IChzZWNvbmRTbGFzaCAhPT0gLTEpID8gcHJlQmFzZS5zdWJzdHIoc2Vjb25kU2xhc2ggKyAxKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGFmdGVyUXVlc3Rpb25NYXJrID0gXCJcIjtcbiAgICAgICAgdmFyIGhvc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBwb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgaG9zdFJlcGxpY2FTZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciByZXBsaWNhU2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgb3B0aW9uc09iamVjdCA9IHt9O1xuICAgICAgICBpZiAoYWZ0ZXJCYXNlICYmIGFmdGVyQmFzZS5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHNwbGl0IHBhcmFtc1xuICAgICAgICAgICAgYWZ0ZXJRdWVzdGlvbk1hcmsgPSBhZnRlckJhc2Uuc3Vic3RyKChhZnRlckJhc2UuaW5kZXhPZihcIj9cIikgKyAxKSwgYWZ0ZXJCYXNlLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgb3B0aW9uc0xpc3QgPSBhZnRlclF1ZXN0aW9uTWFyay5zcGxpdChcIiZcIik7XG4gICAgICAgICAgICB2YXIgb3B0aW9uS2V5XzE7XG4gICAgICAgICAgICB2YXIgb3B0aW9uVmFsdWVfMTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBvcHRpb25zT2JqZWN0IGZvciBtZXJnZSB3aXRoIGNvbm5lY3Rpb25Vcmwgb2JqZWN0IGJlZm9yZSByZXR1cm5cbiAgICAgICAgICAgIG9wdGlvbnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbkl0ZW0pIHtcbiAgICAgICAgICAgICAgICBvcHRpb25LZXlfMSA9IG9wdGlvbkl0ZW0uc3BsaXQoXCI9XCIpWzBdO1xuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlXzEgPSBvcHRpb25JdGVtLnNwbGl0KFwiPVwiKVsxXTtcbiAgICAgICAgICAgICAgICBvcHRpb25zT2JqZWN0W29wdGlvbktleV8xXSA9IG9wdGlvblZhbHVlXzE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNwZWNpZmljIHJlcGxpY2FTZXQgdmFsdWUgdG8gc2V0IG9wdGlvbnMgYWJvdXQgaG9zdFJlcGxpY2FTZXRcbiAgICAgICAgICAgIHJlcGxpY2FTZXQgPSBvcHRpb25zT2JqZWN0W1wicmVwbGljYVNldFwiXTtcbiAgICAgICAgICAgIGFmdGVyQmFzZSA9IGFmdGVyQmFzZS5zdWJzdHIoMCwgYWZ0ZXJCYXNlLmluZGV4T2YoXCI/XCIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGFzdEF0U2lnbiA9IGJhc2UubGFzdEluZGV4T2YoXCJAXCIpO1xuICAgICAgICB2YXIgdXNlcm5hbWVBbmRQYXNzd29yZCA9IGJhc2Uuc3Vic3RyKDAsIGxhc3RBdFNpZ24pO1xuICAgICAgICB2YXIgaG9zdEFuZFBvcnQgPSBiYXNlLnN1YnN0cihsYXN0QXRTaWduICsgMSk7XG4gICAgICAgIHZhciB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQ7XG4gICAgICAgIHZhciBwYXNzd29yZCA9IFwiXCI7XG4gICAgICAgIHZhciBmaXJzdENvbG9uID0gdXNlcm5hbWVBbmRQYXNzd29yZC5pbmRleE9mKFwiOlwiKTtcbiAgICAgICAgaWYgKGZpcnN0Q29sb24gIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyKDAsIGZpcnN0Q29sb24pO1xuICAgICAgICAgICAgcGFzc3dvcmQgPSB1c2VybmFtZUFuZFBhc3N3b3JkLnN1YnN0cihmaXJzdENvbG9uICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgcmVwbGljYVNldCBoYXZlIHZhbHVlIHNldCBJdCBhcyBob3N0bGlzdCwgSWYgbm90IHNldCBsaWtlIHN0YW5kYWxvbmUgaG9zdFxuICAgICAgICBpZiAocmVwbGljYVNldCkge1xuICAgICAgICAgICAgaG9zdFJlcGxpY2FTZXQgPSBob3N0QW5kUG9ydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9hID0gX19yZWFkKGhvc3RBbmRQb3J0LnNwbGl0KFwiOlwiKSwgMiksIGhvc3QgPSBfYVswXSwgcG9ydCA9IF9hWzFdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb25uZWN0aW9uVXJsID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICAgICAgICBob3N0UmVwbGljYVNldDogaG9zdFJlcGxpY2FTZXQsXG4gICAgICAgICAgICB1c2VybmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpLFxuICAgICAgICAgICAgcG9ydDogcG9ydCA/IHBhcnNlSW50KHBvcnQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGF0YWJhc2U6IGFmdGVyQmFzZSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExvb3AgdG8gc2V0IGV2ZXJ5IG9wdGlvbnMgaW4gY29ubmVjdGlvblVybCB0byBvYmplY3RcbiAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXMob3B0aW9uc09iamVjdCkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lID0gX19yZWFkKF9kLnZhbHVlLCAyKSwga2V5ID0gX2VbMF0sIHZhbHVlID0gX2VbMV07XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblVybFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvblVybDtcbiAgICB9O1xuICAgIHJldHVybiBEcml2ZXJVdGlscztcbn0oKSk7XG5leHBvcnQgeyBEcml2ZXJVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ecml2ZXJVdGlscy5qcy5tYXBcbiIsIi8qKlxuICogVGhpcyBjbGFzcyBzdG9yZXMgcXVlcnkgYW5kIGl0cyBwYXJhbWV0ZXJzXG4gKi9cbnZhciBRdWVyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWVyeShxdWVyeSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgfVxuICAgIHJldHVybiBRdWVyeTtcbn0oKSk7XG5leHBvcnQgeyBRdWVyeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeS5qcy5tYXBcbiIsIi8qKlxuICogVGhpcyBjbGFzcyBzdG9yZXMgdXAgYW5kIGRvd24gcXVlcmllcyBuZWVkZWQgZm9yIG1pZ3JhdGlvbnMgZnVuY3Rpb25hbGl0eS5cbiAqL1xudmFyIFNxbEluTWVtb3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNxbEluTWVtb3J5KCkge1xuICAgICAgICB0aGlzLnVwUXVlcmllcyA9IFtdO1xuICAgICAgICB0aGlzLmRvd25RdWVyaWVzID0gW107XG4gICAgfVxuICAgIHJldHVybiBTcWxJbk1lbW9yeTtcbn0oKSk7XG5leHBvcnQgeyBTcWxJbk1lbW9yeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcWxJbk1lbW9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IFBsYXRmb3JtVG9vbHMgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sc1wiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vYXVyb3JhLWRhdGEtYXBpLXBnL0F1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBBcHBseVZhbHVlVHJhbnNmb3JtZXJzIH0gZnJvbSBcIi4uLy4uL3V0aWwvQXBwbHlWYWx1ZVRyYW5zZm9ybWVyc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vRHJpdmVyVXRpbHNcIjtcbnZhciBQb3N0Z3Jlc1dyYXBwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvc3RncmVzV3JhcHBlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb3N0Z3Jlc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBvc3RncmVzV3JhcHBlcjtcbn0oUG9zdGdyZXNEcml2ZXIpKTtcbnZhciBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLm9wdGlvbnMgPSBjb25uZWN0aW9uLm9wdGlvbnM7XG4gICAgICAgIF90aGlzLmlzUmVwbGljYXRlZCA9IGZhbHNlO1xuICAgICAgICAvLyBsb2FkIGRhdGEtYXBpIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICBfdGhpcy5jbGllbnQgPSBuZXcgX3RoaXMuRGF0YUFwaURyaXZlcihfdGhpcy5vcHRpb25zLnJlZ2lvbiwgX3RoaXMub3B0aW9ucy5zZWNyZXRBcm4sIF90aGlzLm9wdGlvbnMucmVzb3VyY2VBcm4sIF90aGlzLm9wdGlvbnMuZGF0YWJhc2UsIGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycykgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMpOyB9LCBfdGhpcy5vcHRpb25zLnNlcnZpY2VDb25maWdPcHRpb25zLCBfdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMpO1xuICAgICAgICBfdGhpcy5kYXRhYmFzZSA9IERyaXZlclV0aWxzLmJ1aWxkRHJpdmVyT3B0aW9ucyhfdGhpcy5vcHRpb25zKS5kYXRhYmFzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEltcGxlbWVudGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICogQmFzZWQgb24gcG9vbGluZyBvcHRpb25zLCBpdCBjYW4gZWl0aGVyIGNyZWF0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5LFxuICAgICAqIGVpdGhlciBjcmVhdGUgYSBwb29sIGFuZCBjcmVhdGUgY29ubmVjdGlvbiB3aGVuIG5lZWRlZC5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBydW5uZXIgdXNlZCB0byBleGVjdXRlIGRhdGFiYXNlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIodGhpcywgbmV3IHRoaXMuRGF0YUFwaURyaXZlcih0aGlzLm9wdGlvbnMucmVnaW9uLCB0aGlzLm9wdGlvbnMuc2VjcmV0QXJuLCB0aGlzLm9wdGlvbnMucmVzb3VyY2VBcm4sIHRoaXMub3B0aW9ucy5kYXRhYmFzZSwgZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7IHJldHVybiBfdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7IH0sIHRoaXMub3B0aW9ucy5zZXJ2aWNlQ29uZmlnT3B0aW9ucywgdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMpLCBtb2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGdpdmVuIHZhbHVlIHRvIGEgdmFsdWUgdG8gYmUgcGVyc2lzdGVkLCBiYXNlZCBvbiBpdHMgY29sdW1uIHR5cGUgYW5kIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5mb3JtYXRPcHRpb25zLmNhc3RQYXJhbWV0ZXJzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wcmVwYXJlUGVyc2lzdGVudFZhbHVlKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBnaXZlbiB2YWx1ZSB0byBhIHZhbHVlIHRvIGJlIHBlcnNpc3RlZCwgYmFzZWQgb24gaXRzIGNvbHVtbiB0eXBlIGFuZCBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLnByZXBhcmVIeWRyYXRlZFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmZvcm1hdE9wdGlvbnMuY2FzdFBhcmFtZXRlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5wcmVwYXJlSHlkcmF0ZWRWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybUZyb20oY29sdW1uTWV0YWRhdGEudHJhbnNmb3JtZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlci5wcm90b3R5cGUubG9hZERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRyaXZlciA9IHRoaXMub3B0aW9ucy5kcml2ZXIgfHwgUGxhdGZvcm1Ub29scy5sb2FkKFwidHlwZW9ybS1hdXJvcmEtZGF0YS1hcGktZHJpdmVyXCIpO1xuICAgICAgICB2YXIgcGcgPSBkcml2ZXIucGc7XG4gICAgICAgIHRoaXMuRGF0YUFwaURyaXZlciA9IHBnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgZ2l2ZW4gcXVlcnkuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLnByb3RvdHlwZS5leGVjdXRlUXVlcnkgPSBmdW5jdGlvbiAoY29ubmVjdGlvbiwgcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5xdWVyeShxdWVyeSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbnkgYWN0aW9uIGFmdGVyIGNvbm5lY3Rpb24gKGUuZy4gY3JlYXRlIGV4dGVuc2lvbnMgaW4gUG9zdGdyZXMgZHJpdmVyKS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIucHJvdG90eXBlLmFmdGVyQ29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbnNNZXRhZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGVja01ldGFkYXRhRm9yRXh0ZW5zaW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc01ldGFkYXRhID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRlbnNpb25zTWV0YWRhdGEuaGFzRXh0ZW5zaW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVuYWJsZUV4dGVuc2lvbnMoZXh0ZW5zaW9uc01ldGFkYXRhLCB0aGlzLmNvbm5lY3Rpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcjtcbn0oUG9zdGdyZXNXcmFwcGVyKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFBvc3RncmVzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vcG9zdGdyZXMvUG9zdGdyZXNRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL1F1ZXJ5UmVzdWx0XCI7XG52YXIgUG9zdGdyZXNRdWVyeVJ1bm5lcldyYXBwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyKGRyaXZlciwgbW9kZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZHJpdmVyLCBtb2RlKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUG9zdGdyZXNRdWVyeVJ1bm5lcldyYXBwZXI7XG59KFBvc3RncmVzUXVlcnlSdW5uZXIpKTtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHBvc3RncmVzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyKGRyaXZlciwgY2xpZW50LCBtb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRyaXZlciwgbW9kZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzL3VzZXMgZGF0YWJhc2UgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcGVyZm9ybSBmdXJ0aGVyIG9wZXJhdGlvbnMuXG4gICAgICogUmV0dXJucyBvYnRhaW5lZCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwic2xhdmVcIiAmJiB0aGlzLmRyaXZlci5pc1JlcGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSA9IHRoaXMuZHJpdmVyLm9idGFpblNsYXZlQ29ubmVjdGlvbigpLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgY29ubmVjdGlvbiA9IF9iWzBdLCByZWxlYXNlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3RlZFF1ZXJ5UnVubmVycy5wdXNoKF90aGlzKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VDYWxsYmFjayA9IHJlbGVhc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtYXN0ZXJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uUHJvbWlzZSA9IHRoaXMuZHJpdmVyLm9idGFpbk1hc3RlckNvbm5lY3Rpb24oKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGNvbm5lY3Rpb24gPSBfYlswXSwgcmVsZWFzZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMucHVzaChfdGhpcyk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWxlYXNlQ2FsbGJhY2sgPSByZWxlYXNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyYW5zYWN0aW9uIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnN0YXJ0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25TdGFydCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJvbGxiYWNrcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJvbGxiYWNrVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMsIHVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgaWYgKHVzZVN0cnVjdHVyZWRSZXN1bHQgPT09IHZvaWQgMCkgeyB1c2VTdHJ1Y3R1cmVkUmVzdWx0ID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJhdywgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbGllbnQucXVlcnkocXVlcnksIHBhcmFtZXRlcnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXcuaGFzT3duUHJvcGVydHkoJ3JlY29yZHMnKSkgJiYgQXJyYXkuaXNBcnJheShyYXcucmVjb3JkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgnbnVtYmVyT2ZSZWNvcmRzVXBkYXRlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFmZmVjdGVkID0gcmF3Lm51bWJlck9mUmVjb3Jkc1VwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXVyb3JhRGF0YUFwaVBvc3RncmVzUXVlcnlSdW5uZXI7XG59KFBvc3RncmVzUXVlcnlSdW5uZXJXcmFwcGVyKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXJvcmFEYXRhQXBpUG9zdGdyZXNRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBDYXBhY2l0b3JRdWVyeVJ1bm5lciB9IGZyb20gXCIuL0NhcGFjaXRvclF1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciwgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yLCB9IGZyb20gXCIuLi8uLi9lcnJvclwiO1xudmFyIENhcGFjaXRvckRyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FwYWNpdG9yRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDYXBhY2l0b3JEcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb25uZWN0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kYXRhYmFzZSA9IF90aGlzLm9wdGlvbnMuZGF0YWJhc2U7XG4gICAgICAgIF90aGlzLmRyaXZlciA9IF90aGlzLm9wdGlvbnMuZHJpdmVyO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRyaXZlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImRyaXZlclwiKTtcbiAgICAgICAgLy8gbG9hZCBzcWxpdGUgcGFja2FnZVxuICAgICAgICBfdGhpcy5zcWxpdGUgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQ2FwYWNpdG9yRHJpdmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENhcGFjaXRvckRyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBDYXBhY2l0b3JEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IG5ldyBDYXBhY2l0b3JRdWVyeVJ1bm5lcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENhcGFjaXRvckRyaXZlci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VNb2RlLCBpc0RhdGFiYXNlRW5jcnl0ZWQsIGRhdGFiYXNlVmVyc2lvbiwgY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlTW9kZSA9IHRoaXMub3B0aW9ucy5tb2RlIHx8IFwibm8tZW5jcnlwdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNEYXRhYmFzZUVuY3J5dGVkID0gZGF0YWJhc2VNb2RlICE9PSBcIm5vLWVuY3J5cHRpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlVmVyc2lvbiA9IHR5cGVvZiB0aGlzLm9wdGlvbnMudmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNxbGl0ZS5jcmVhdGVDb25uZWN0aW9uKHRoaXMub3B0aW9ucy5kYXRhYmFzZSwgaXNEYXRhYmFzZUVuY3J5dGVkLCBkYXRhYmFzZU1vZGUsIGRhdGFiYXNlVmVyc2lvbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgY29ubmVjdGlvbi5vcGVuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBwcm9wZXJseS4gdGhpcyBhbHNvIG1ha2VzIG9uRGVsZXRlIHRvIHdvcmsgd2l0aCBzcWxpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBjb25uZWN0aW9uLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB0byB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5vcHRpb25zLmpvdXJuYWxNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wiREVMRVRFXCIsIFwiVFJVTkNBVEVcIiwgXCJQRVJTSVNUXCIsIFwiTUVNT1JZXCIsIFwiV0FMXCIsIFwiT0ZGXCJdLmluZGV4T2YodGhpcy5vcHRpb25zLmpvdXJuYWxNb2RlKSAhPT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGNvbm5lY3Rpb24ucXVlcnkoXCJQUkFHTUEgam91cm5hbF9tb2RlID0gXCIgKyB0aGlzLm9wdGlvbnMuam91cm5hbE1vZGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCBjb25uZWN0aW9uXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYXBhY2l0b3JEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsaXRlID0gdGhpcy5kcml2ZXI7XG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJDYXBhY2l0b3JcIiwgXCJAY2FwYWNpdG9yLWNvbW11bml0eS9zcWxpdGVcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYXBhY2l0b3JEcml2ZXI7XG59KEFic3RyYWN0U3FsaXRlRHJpdmVyKSk7XG5leHBvcnQgeyBDYXBhY2l0b3JEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FwYWNpdG9yRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlGYWlsZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL1F1ZXJ5UmVzdWx0XCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBzcWxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqL1xudmFyIENhcGFjaXRvclF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYXBhY2l0b3JRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQ2FwYWNpdG9yUXVlcnlSdW5uZXIoZHJpdmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRyaXZlciA9IGRyaXZlcjtcbiAgICAgICAgX3RoaXMuY29ubmVjdGlvbiA9IGRyaXZlci5jb25uZWN0aW9uO1xuICAgICAgICBfdGhpcy5icm9hZGNhc3RlciA9IG5ldyBCcm9hZGNhc3RlcihfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ2FwYWNpdG9yUXVlcnlSdW5uZXIucHJvdG90eXBlLmV4ZWN1dGVTZXQgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhYmFzZUNvbm5lY3Rpb24uZXhlY3V0ZVNldChzZXQsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgQ2FwYWNpdG9yUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24sIGNvbW1hbmQsIHJhdywgcmVzdWx0LCBlcnJfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHF1ZXJ5LnN1YnN0cigwLCBxdWVyeS5pbmRleE9mKFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgOSwgLCAxMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoW1wiQkVHSU5cIiwgXCJST0xMQkFDS1wiLCBcIkNPTU1JVFwiLCBcIkNSRUFURVwiLCBcIkFMVEVSXCIsIFwiRFJPUFwiXS5pbmRleE9mKGNvbW1hbmQpICE9PSAtMSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWN1dGUocXVlcnksIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShbXCJJTlNFUlRcIiwgXCJVUERBVEVcIiwgXCJERUxFVEVcIl0uaW5kZXhPZihjb21tYW5kKSAhPT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGRhdGFiYXNlQ29ubmVjdGlvbi5ydW4ocXVlcnksIHBhcmFtZXRlcnMsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbNCAvKnlpZWxkKi8sIGRhdGFiYXNlQ29ubmVjdGlvbi5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyB8fCBbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgndmFsdWVzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3LnZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmF3Lmhhc093blByb3BlcnR5KCdjaGFuZ2VzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSByYXcuY2hhbmdlcy5jaGFuZ2VzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yYXcgPSByYXcuY2hhbmdlcy5sYXN0SWQgfHwgcmF3LmNoYW5nZXMuY2hhbmdlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQucmF3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZXJyXzEsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnJfMSk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGFyYW1ldHJpemVzIGdpdmVuIG9iamVjdCBvZiB2YWx1ZXMuIFVzZWQgdG8gY3JlYXRlIGNvbHVtbj12YWx1ZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIENhcGFjaXRvclF1ZXJ5UnVubmVyLnByb3RvdHlwZS5wYXJhbWV0cml6ZSA9IGZ1bmN0aW9uIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RMaXRlcmFsKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gXCJcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIiArIFwiPT9cIjsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FwYWNpdG9yUXVlcnlSdW5uZXI7XG59KEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIpKTtcbmV4cG9ydCB7IENhcGFjaXRvclF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhcGFjaXRvclF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IENvcmRvdmFRdWVyeVJ1bm5lciB9IGZyb20gXCIuL0NvcmRvdmFRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbmltcG9ydCB7IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbnZhciBDb3Jkb3ZhRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb3Jkb3ZhRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb3Jkb3ZhRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgLy8gdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgLy8gdGhpcy5vcHRpb25zID0gY29ubmVjdGlvbi5vcHRpb25zIGFzIENvcmRvdmFDb25uZWN0aW9uT3B0aW9ucztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmxvY2F0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlck9wdGlvbk5vdFNldEVycm9yKFwibG9jYXRpb25cIik7XG4gICAgICAgIC8vIGxvYWQgc3FsaXRlIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uY2xvc2Uob2ssIGZhaWwpO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgcnVubmVyIHVzZWQgdG8gZXhlY3V0ZSBkYXRhYmFzZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IG5ldyBDb3Jkb3ZhUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zLCBjb25uZWN0aW9uO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5vcHRpb25zLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLm9wdGlvbnMubG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZXh0cmEgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3FsaXRlLm9wZW5EYXRhYmFzZShvcHRpb25zLCBmdW5jdGlvbiAoZGIpIHsgcmV0dXJuIHJlc29sdmUoZGIpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBwcm9wZXJseS4gdGhpcyBhbHNvIG1ha2VzIG9uRGVsZXRlIHRvIHdvcmsgd2l0aCBzcWxpdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZXhlY3V0ZVNxbChcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTjtcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9rKCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGZhaWwoZXJyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29ubmVjdGlvbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIENvcmRvdmFEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc3FsaXRlID0gdGhpcy5vcHRpb25zLmRyaXZlciB8fCB3aW5kb3cuc3FsaXRlUGx1Z2luO1xuICAgICAgICAgICAgdGhpcy5zcWxpdGUgPSBzcWxpdGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJDb3Jkb3ZhLVNRTGl0ZVwiLCBcImNvcmRvdmEtc3FsaXRlLXN0b3JhZ2VcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb3Jkb3ZhRHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgQ29yZG92YURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3Jkb3ZhRHJpdmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlGYWlsZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgQ29yZG92YVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb3Jkb3ZhUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENvcmRvdmFRdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLmJyb2FkY2FzdGVyID0gbmV3IEJyb2FkY2FzdGVyKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24sIHF1ZXJ5U3RhcnRUaW1lLCByYXcsIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnlFbmRUaW1lLCBxdWVyeUV4ZWN1dGlvblRpbWUsIHJlc3VsdCwgcmVzdWx0U2V0LCBpLCBlcnJfMTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIHBhcmFtZXRlcnMsIGZ1bmN0aW9uIChyYXcpIHsgcmV0dXJuIG9rKHJhdyk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGZhaWwoZXJyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlTbG93KHF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkuc3Vic3RyKDAsIDExKSA9PT0gXCJJTlNFUlQgSU5UT1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdy5pbnNlcnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByYXcucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRTZXQucHVzaChyYXcucm93cy5pdGVtKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZXN1bHRTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJlc3VsdFNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeUVycm9yKGVycl8xLCBxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihxdWVyeSwgcGFyYW1ldGVycywgZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBuZXcgcm93IHdpdGggZ2l2ZW4gdmFsdWVzIGludG8gdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqIFJldHVybnMgdmFsdWUgb2YgdGhlIGdlbmVyYXRlZCBjb2x1bW4gaWYgZ2l2ZW4gYW5kIGdlbmVyYXRlIGNvbHVtbiBleGlzdCBpbiB0aGUgdGFibGUuXG4gICAgIC8vIHRvZG86IGltcGxlbWVudCBuZXcgc3ludGF4XG4gICAgYXN5bmMgaW5zZXJ0KHRhYmxlTmFtZTogc3RyaW5nLCBrZXlWYWx1ZXM6IE9iamVjdExpdGVyYWwpOiBQcm9taXNlPEluc2VydFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoa2V5VmFsdWVzKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGtleXMubWFwKGtleSA9PiBgXCIke2tleX1cImApLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0ga2V5cy5tYXAoa2V5ID0+IFwiP1wiKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IHRoaXMuY29ubmVjdGlvbi5oYXNNZXRhZGF0YSh0YWJsZU5hbWUpID8gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhYmxlTmFtZSkuZ2VuZXJhdGVkQ29sdW1ucyA6IFtdO1xuICAgICAgICBjb25zdCBzcWwgPSBjb2x1bW5zLmxlbmd0aCA+IDAgPyAoYElOU0VSVCBJTlRPIFwiJHt0YWJsZU5hbWV9XCIoJHtjb2x1bW5zfSkgVkFMVUVTICgke3ZhbHVlc30pYCkgOiBgSU5TRVJUIElOVE8gXCIke3RhYmxlTmFtZX1cIiBERUZBVUxUIFZBTFVFU2A7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBrZXlzLm1hcChrZXkgPT4ga2V5VmFsdWVzW2tleV0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJbnNlcnRSZXN1bHQ+KGFzeW5jIChvaywgZmFpbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IF9fdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBkYXRhYmFzZUNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNvbm5lY3QoKTtcbiAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKHNxbCwgcGFyYW1ldGVycywgKHJlc3VsdFNldDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkTWFwID0gZ2VuZXJhdGVkQ29sdW1ucy5yZWR1Y2UoKG1hcCwgZ2VuZXJhdGVkQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2VuZXJhdGVkQ29sdW1uLmlzUHJpbWFyeSAmJiBnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiICYmIHJlc3VsdFNldC5pbnNlcnRJZCA/IHJlc3VsdFNldC5pbnNlcnRJZCA6IGtleVZhbHVlc1tnZW5lcmF0ZWRDb2x1bW4uZGF0YWJhc2VOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0sIHt9IGFzIE9iamVjdExpdGVyYWwpO1xuXG4gICAgICAgICAgICAgICAgb2soe1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkTWFwOiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIF9fdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnIsIHNxbCwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0qL1xuICAgIC8qKlxuICAgICAqIFdvdWxkIHN0YXJ0IGEgdHJhbnNhY3Rpb24gYnV0IHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIENvcmRvdmFRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoJ1RyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgQ29yZG92YSBkcml2ZXInKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdvdWxkIHN0YXJ0IGEgdHJhbnNhY3Rpb24gYnV0IHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIENvcmRvdmFRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENvcmRvdmEgZHJpdmVyJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXb3VsZCBzdGFydCBhIHRyYW5zYWN0aW9uIGJ1dCB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy5cbiAgICAgKi9cbiAgICBDb3Jkb3ZhUXVlcnlSdW5uZXIucHJvdG90eXBlLnJvbGxiYWNrVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENvcmRvdmEgZHJpdmVyJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0YWJsZXMgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBkYXRhYmFzZS5cbiAgICAgKiBCZSBjYXJlZnVsIHdpdGggdXNpbmcgdGhpcyBtZXRob2QgYW5kIGF2b2lkIHVzaW5nIGl0IGluIHByb2R1Y3Rpb24gb3IgbWlncmF0aW9uc1xuICAgICAqIChiZWNhdXNlIGl0IGNhbiBjbGVhciBhbGwgeW91ciBkYXRhYmFzZSkuXG4gICAgICovXG4gICAgQ29yZG92YVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jbGVhckRhdGFiYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0Vmlld0Ryb3BzUXVlcnksIGRyb3BWaWV3UXVlcmllcywgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5LCBkcm9wVGFibGVRdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPRkY7XCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsICwgNywgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIFxcXCInIHx8IG5hbWUgfHwgJ1xcXCI7JyBhcyBxdWVyeSBGUk9NIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBXSEVSRSBcXFwidHlwZVxcXCIgPSAndmlldydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0Vmlld0Ryb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFZpZXdRdWVyaWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgXFxcIicgfHwgbmFtZSB8fCAnXFxcIjsnIGFzIHF1ZXJ5IEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiAhPSAnc3FsaXRlX3NlcXVlbmNlJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BWaWV3UXVlcmllcy5tYXAoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5KHFbXCJxdWVyeVwiXSk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OO1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBQYXJhbWV0cml6ZXMgZ2l2ZW4gb2JqZWN0IG9mIHZhbHVlcy4gVXNlZCB0byBjcmVhdGUgY29sdW1uPXZhbHVlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQ29yZG92YVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5wYXJhbWV0cml6ZSA9IGZ1bmN0aW9uIChvYmplY3RMaXRlcmFsLCBzdGFydEluZGV4KSB7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSB2b2lkIDApIHsgc3RhcnRJbmRleCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdExpdGVyYWwpLm1hcChmdW5jdGlvbiAoa2V5LCBpbmRleCkgeyByZXR1cm4gXCJcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIiArIFwiPT9cIjsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29yZG92YVF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBDb3Jkb3ZhUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29yZG92YVF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IEV4cG9RdWVyeVJ1bm5lciB9IGZyb20gXCIuL0V4cG9RdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbnZhciBFeHBvRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHBvRHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBFeHBvRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRyaXZlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImRyaXZlclwiKTtcbiAgICAgICAgLy8gbG9hZCBzcWxpdGUgcGFja2FnZVxuICAgICAgICBfdGhpcy5zcWxpdGUgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBFeHBvRHJpdmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLl9kYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBydW5uZXIgdXNlZCB0byBleGVjdXRlIGRhdGFiYXNlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgRXhwb0RyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IEV4cG9RdWVyeVJ1bm5lcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEV4cG9Ecml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uXzEgPSBfdGhpcy5zcWxpdGUub3BlbkRhdGFiYXNlKF90aGlzLm9wdGlvbnMuZGF0YWJhc2UpO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbmFibGUgZm9yZWlnbiBrZXlzIGluIHNxbGl0ZSB0byBtYWtlIHN1cmUgYWxsIGZvcmVpZ24ga2V5IHJlbGF0ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAvLyB3b3JraW5nIHByb3Blcmx5LiB0aGlzIGFsc28gbWFrZXMgb25EZWxldGUgd29yayB3aXRoIHNxbGl0ZS5cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbl8xLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0c3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdHN4LmV4ZWN1dGVTcWwoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvayhkYXRhYmFzZUNvbm5lY3Rpb25fMSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoeyB0cmFuc2FjdGlvbjogdCwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRXhwb0RyaXZlcjtcbn0oQWJzdHJhY3RTcWxpdGVEcml2ZXIpKTtcbmV4cG9ydCB7IEV4cG9Ecml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwb0RyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBCcm9hZGNhc3RlciB9IGZyb20gXCIuLi8uLi9zdWJzY3JpYmVyL0Jyb2FkY2FzdGVyXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgRXhwb1F1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHBvUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEV4cG9RdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLmJyb2FkY2FzdGVyID0gbmV3IEJyb2FkY2FzdGVyKF90aGlzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJhbnNhY3Rpb24uIFdpdGhpbiBFeHBvLCBhbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBoYXBwZW4gaW4gYVxuICAgICAqIHRyYW5zYWN0aW9uIGNvbnRleHQsIHNvIGlzc3VpbmcgYSBgQkVHSU4gVFJBTlNBQ1RJT05gIGNvbW1hbmQgaXNcbiAgICAgKiByZWR1bmRhbnQgYW5kIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gICAgICpcbiAgICAgKiBgRXJyb3I6IEVycm9yIGNvZGUgMTogY2Fubm90IHN0YXJ0IGEgdHJhbnNhY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb25gXG4gICAgICpcbiAgICAgKiBJbnN0ZWFkLCB3ZSBrZWVwIHRyYWNrIG9mIGEgYFRyYW5zYWN0aW9uYCBvYmplY3QgaW4gYHRoaXMudHJhbnNhY3Rpb25gXG4gICAgICogYW5kIGNvbnRpbnVlIHVzaW5nIHRoZSBzYW1lIG9iamVjdCB1bnRpbCB3ZSB3aXNoIHRvIGNvbW1pdCB0aGVcbiAgICAgKiB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBFeHBvUXVlcnlSdW5uZXIucHJvdG90eXBlLnN0YXJ0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgJiYgdHlwZW9mIHRoaXMudHJhbnNhY3Rpb24gIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblN0YXJ0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICogU2luY2UgRXhwbyB3aWxsIGF1dG9tYXRpY2FsbHkgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBvbmNlIGFsbCB0aGVcbiAgICAgKiBjYWxsYmFja3Mgb2YgdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBoYXZlIGJlZW4gY29tcGxldGVkLCBcImNvbW1pdHRpbmdcIiBhXG4gICAgICogdHJhbnNhY3Rpb24gaW4gdGhpcyBkcml2ZXIncyBjb250ZXh0IG1lYW5zIHRoYXQgd2UgZGVsZXRlIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIG9iamVjdCBhbmQgc2V0IHRoZSBzdGFnZSBmb3IgdGhlIG5leHQgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgJiYgdHlwZW9mIHRoaXMudHJhbnNhY3Rpb24gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Db21taXQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9sbGJhY2tzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKiBUaGlzIG1ldGhvZCdzIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIGBjb21taXRUcmFuc2FjdGlvbigpYCBiZWNhdXNlXG4gICAgICogdGhlIHRyYW5zYWN0aW9uIGxpZmVjeWNsZSBpcyBoYW5kbGVkIHdpdGhpbiB0aGUgRXhwbyB0cmFuc2FjdGlvbiBvYmplY3QuXG4gICAgICogSXNzdWluZyBzZXBhcmF0ZSBzdGF0ZW1lbnRzIGZvciBgQ09NTUlUYCBvciBgUk9MTEJBQ0tgIGFyZW4ndCBuZWNlc3NhcnkuXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yb2xsYmFja1RyYW5zYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSAmJiB0eXBlb2YgdGhpcy50cmFuc2FjdGlvbiA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgRXhwb1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlQ29ubmVjdGlvbiwgcXVlcnlTdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3QoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgRXhwbyBTUUwgcXVlcmllcyBhcmUgZXhlY3V0ZWQgaW4gYSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24udHJhbnNhY3Rpb24oZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy50cmFuc2FjdGlvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uLmV4ZWN1dGVTcWwocXVlcnksIHBhcmFtZXRlcnMsIGZ1bmN0aW9uICh0LCByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNsb3cgcXVlcmllcyBpZiBtYXhRdWVyeUV4ZWN1dGlvbiB0aW1lIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4UXVlcnlFeGVjdXRpb25UaW1lID0gX3RoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFF1ZXJ5RXhlY3V0aW9uVGltZSAmJiBxdWVyeUV4ZWN1dGlvblRpbWUgPiBtYXhRdWVyeUV4ZWN1dGlvblRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeVNsb3cocXVlcnlFeGVjdXRpb25UaW1lLCBxdWVyeSwgcGFyYW1ldGVycywgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgUXVlcnlSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGlkIG9mIGluc2VydGVkIHJvdywgaWYgcXVlcnkgd2FzIGluc2VydCBzdGF0ZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zdWJzdHIoMCwgMTEpID09PSBcIklOU0VSVCBJTlRPXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yYXcgPSByYXcuaW5zZXJ0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93c0FmZmVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHJhdy5yb3dzQWZmZWN0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93cycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0U2V0ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhdy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U2V0LnB1c2gocmF3LnJvd3MuaXRlbShpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmVzdWx0U2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZXN1bHRTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVN0cnVjdHVyZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQucmF3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZXJyLCBxdWVyeSwgcGFyYW1ldGVycywgX3RoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRXhwb1F1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBFeHBvUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXhwb1F1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBSZWFkYWJsZSwgV3JpdGFibGUgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sc1wiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBpbmdzLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4vTmF0aXZlc2NyaXB0UXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IERyaXZlck9wdGlvbk5vdFNldEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL0RyaXZlck9wdGlvbk5vdFNldEVycm9yXCI7XG5pbXBvcnQgeyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yXCI7XG4vKipcbiAqIE9yZ2FuaXplcyBjb21tdW5pY2F0aW9uIHdpdGggc3FsaXRlIERCTVMgd2l0aGluIE5hdGl2ZXNjcmlwdC5cbiAqL1xudmFyIE5hdGl2ZXNjcmlwdERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmF0aXZlc2NyaXB0RHJpdmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBOYXRpdmVzY3JpcHREcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb25uZWN0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb24ub3B0aW9ucztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBfdGhpcy5vcHRpb25zLmRyaXZlcjtcbiAgICAgICAgLy8gdmFsaWRhdGUgb3B0aW9ucyB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBzZXRcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2FkIHNxbGl0ZSBwYWNrYWdlXG4gICAgICAgIF90aGlzLmxvYWREZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uY2xvc2UoKS50aGVuKG9rKS5jYXRjaChmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5UnVubmVyKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgTmF0aXZlc2NyaXB0RHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVUeXBlID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IEJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiYmxvYlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLm5vcm1hbGl6ZVR5cGUuY2FsbCh0aGlzLCBjb2x1bW4pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IF90aGlzLm9wdGlvbnMucmVhZE9ubHksXG4gICAgICAgICAgICAgICAga2V5OiBfdGhpcy5vcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICBtdWx0aXRocmVhZGluZzogX3RoaXMub3B0aW9ucy5tdWx0aXRocmVhZGluZyxcbiAgICAgICAgICAgICAgICBtaWdyYXRlOiBfdGhpcy5vcHRpb25zLm1pZ3JhdGUsXG4gICAgICAgICAgICAgICAgaW9zRmxhZ3M6IF90aGlzLm9wdGlvbnMuaW9zRmxhZ3MsXG4gICAgICAgICAgICAgICAgYW5kcm9pZEZsYWdzOiBfdGhpcy5vcHRpb25zLmFuZHJvaWRGbGFncyxcbiAgICAgICAgICAgIH0sIF90aGlzLm9wdGlvbnMuZXh0cmEgfHwge30pO1xuICAgICAgICAgICAgbmV3IF90aGlzLnNxbGl0ZShfdGhpcy5vcHRpb25zLmRhdGFiYXNlLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyLCBkYikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgLy8gdXNlIG9iamVjdCBtb2RlIHRvIHdvcmsgd2l0aCBUeXBlT1JNXG4gICAgICAgICAgICAgICAgZGIucmVzdWx0VHlwZShfdGhpcy5zcWxpdGUuUkVTVUxUU0FTT0JKRUNUKTtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIsIFtdLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbGwgc2V0XG4gICAgICAgICAgICAgICAgICAgIG9rKGRiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIGRyaXZlciBkZXBlbmRlbmN5IGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5LCB0aGVuIHRyeSB0byBsb2FkIGl0IHZpYSBcInJlcXVpcmVcIi5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHREcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsaXRlID0gdGhpcy5kcml2ZXI7XG4gICAgICAgIGlmICghdGhpcy5kcml2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IoXCJOYXRpdmVzY3JpcHRcIiwgXCJuYXRpdmVzY3JpcHQtc3FsaXRlXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmF0aXZlc2NyaXB0RHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgTmF0aXZlc2NyaXB0RHJpdmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdGl2ZXNjcmlwdERyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyIH0gZnJvbSBcIi4uLy4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJlc3VsdFwiO1xuLyoqXG4gKiBSdW5zIHF1ZXJpZXMgb24gYSBzaW5nbGUgc3FsaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmF0aXZlc2NyaXB0UXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyKGRyaXZlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5kcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBpc0luc2VydFF1ZXJ5LCBoYW5kbGVyLCBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnNlcnRRdWVyeSA9IHF1ZXJ5LnN1YnN0cigwLCAxMSkgPT09IFwiSU5TRVJUIElOVE9cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXJyLCByYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2xvdyBxdWVyaWVzIGlmIG1heFF1ZXJ5RXhlY3V0aW9uIHRpbWUgaXMgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IF90aGlzLmRyaXZlci5vcHRpb25zLm1heFF1ZXJ5RXhlY3V0aW9uVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5RXhlY3V0aW9uVGltZSA9IHF1ZXJ5RW5kVGltZSAtIHF1ZXJ5U3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnIsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwobmV3IFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGVycikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFF1ZXJ5UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5zZXJ0UXVlcnkgJiYgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzID0gcmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2socmVzdWx0LnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnNlcnRRdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjU1FMKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5hbGwocXVlcnksIHBhcmFtZXRlcnMsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBhcmFtZXRyaXplcyBnaXZlbiBvYmplY3Qgb2YgdmFsdWVzLiBVc2VkIHRvIGNyZWF0ZSBjb2x1bW49dmFsdWUgcXVlcmllcy5cbiAgICAgKi9cbiAgICBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lci5wcm90b3R5cGUucGFyYW1ldHJpemUgPSBmdW5jdGlvbiAob2JqZWN0TGl0ZXJhbCwgc3RhcnRJbmRleCkge1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gdm9pZCAwKSB7IHN0YXJ0SW5kZXggPSAwOyB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3RMaXRlcmFsKS5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsga2V5ICsgXCJcXFwiXCIgKyBcIj0/XCI7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE5hdGl2ZXNjcmlwdFF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBOYXRpdmVzY3JpcHRRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVzY3JpcHRRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeUZhaWxlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBCYXNlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL0Jhc2VRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFRhYmxlQ2hlY2sgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDaGVja1wiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IFRhYmxlRXhjbHVzaW9uIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRXhjbHVzaW9uXCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG5pbXBvcnQgeyBUYWJsZUluZGV4IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vUXVlcnlcIjtcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL1ZlcnNpb25VdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbmltcG9ydCB7IE1ldGFkYXRhVGFibGVUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL01ldGFkYXRhVGFibGVUeXBlXCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBwb3N0Z3JlcyBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgUG9zdGdyZXNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9zdGdyZXNRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUG9zdGdyZXNRdWVyeVJ1bm5lcihkcml2ZXIsIG1vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICBfdGhpcy5jb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3Rpb247XG4gICAgICAgIF90aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICBfdGhpcy5icm9hZGNhc3RlciA9IG5ldyBCcm9hZGNhc3RlcihfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMvdXNlcyBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCB0byBwZXJmb3JtIGZ1cnRoZXIgb3BlcmF0aW9ucy5cbiAgICAgKiBSZXR1cm5zIG9idGFpbmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbik7XG4gICAgICAgIGlmICh0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcInNsYXZlXCIgJiYgdGhpcy5kcml2ZXIuaXNSZXBsaWNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvblByb21pc2UgPSB0aGlzLmRyaXZlci5vYnRhaW5TbGF2ZUNvbm5lY3Rpb24oKS50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGNvbm5lY3Rpb24gPSBfYlswXSwgcmVsZWFzZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMucHVzaChfdGhpcyk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgb25FcnJvckNhbGxiYWNrID0gZnVuY3Rpb24gKGVycikgeyByZXR1cm4gX3RoaXMucmVsZWFzZVBvc3RncmVzQ29ubmVjdGlvbihlcnIpOyB9O1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLm9uKFwiZXJyb3JcIiwgb25FcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG1hc3RlclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlID0gdGhpcy5kcml2ZXIub2J0YWluTWFzdGVyQ29ubmVjdGlvbigpLnRoZW4oZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgY29ubmVjdGlvbiA9IF9iWzBdLCByZWxlYXNlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3RlZFF1ZXJ5UnVubmVycy5wdXNoKF90aGlzKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICAgICAgICAgIHZhciBvbkVycm9yQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5yZWxlYXNlUG9zdGdyZXNDb25uZWN0aW9uKGVycik7IH07XG4gICAgICAgICAgICAgICAgX3RoaXMucmVsZWFzZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24ub24oXCJlcnJvclwiLCBvbkVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVsZWFzZSBhIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbCwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGFuIEVycm9yIHRvIHJlbGVhc2Ugd2l0aC5cbiAgICAgKiBQZXIgcGctcG9vbCBkb2N1bWVudGF0aW9uIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBwb29sIGZyb20gcmUtdXNpbmcgdGhlIGJyb2tlbiBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbGVhc2VQb3N0Z3Jlc0Nvbm5lY3Rpb24gPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlbGVhc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxlYXNlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5kcml2ZXIuY29ubmVjdGVkUXVlcnlSdW5uZXJzLmluZGV4T2YodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0ZWRRdWVyeVJ1bm5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdXNlZCBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqIFlvdSBjYW5ub3QgdXNlIHF1ZXJ5IHJ1bm5lciBtZXRob2RzIG9uY2UgaXRzIHJlbGVhc2VkLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGVhc2VQb3N0Z3Jlc0Nvbm5lY3Rpb24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5zdGFydFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU1RBUlQgVFJBTlNBQ1RJT05cIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzb2xhdGlvbkxldmVsKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMIFwiICsgaXNvbGF0aW9uTGV2ZWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21taXRzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Db21taXQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJDT01NSVRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9sbGJhY2tzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yb2xsYmFja1RyYW5zYWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUk9MTEJBQ0tcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KCdBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2snKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCA9PT0gdm9pZCAwKSB7IHVzZVN0cnVjdHVyZWRSZXN1bHQgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBxdWVyeVN0YXJ0VGltZSwgcmF3LCBtYXhRdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5RW5kVGltZSwgcXVlcnlFeGVjdXRpb25UaW1lLCByZXN1bHQsIGVycl8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZGF0YWJhc2VDb25uZWN0aW9uLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlFbmRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXcuaGFzT3duUHJvcGVydHkoJ3Jvd3MnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVjb3JkcyA9IHJhdy5yb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Lmhhc093blByb3BlcnR5KCdyb3dDb3VudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHJhdy5yb3dDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyYXcuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiREVMRVRFXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVUERBVEVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBVUERBVEUgYW5kIERFTEVURSBxdWVyeSBhZGRpdGlvbmFsbHkgcmV0dXJuIG51bWJlciBvZiBhZmZlY3RlZCByb3dzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gW3Jhdy5yb3dzLCByYXcucm93Q291bnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmF3LnJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0LnJhd107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlFcnJvcihlcnJfMSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGVycl8xKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByYXcgZGF0YSBzdHJlYW0uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBvbkVuZCwgb25FcnJvcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgUXVlcnlTdHJlYW0sIGRhdGFiYXNlQ29ubmVjdGlvbiwgc3RyZWFtO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlTdHJlYW0gPSB0aGlzLmRyaXZlci5sb2FkU3RyZWFtRGVwZW5kZW5jeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZWxlYXNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUNvbm5lY3Rpb24gPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBkYXRhYmFzZUNvbm5lY3Rpb24ucXVlcnkobmV3IFF1ZXJ5U3RyZWFtKHF1ZXJ5LCBwYXJhbWV0ZXJzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25FbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsIG9uRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHN0cmVhbV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIGRhdGFiYXNlIG5hbWVzIGluY2x1ZGluZyBzeXN0ZW0gZGF0YWJhc2VzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldERhdGFiYXNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzY2hlbWEgbmFtZXMgaW5jbHVkaW5nIHN5c3RlbSBzY2hlbWFzLlxuICAgICAqIElmIGRhdGFiYXNlIHBhcmFtZXRlciBzcGVjaWZpZWQsIHJldHVybnMgc2NoZW1hcyBvZiB0aGF0IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFNjaGVtYXMgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc0RhdGFiYXNlID0gZnVuY3Rpb24gKGRhdGFiYXNlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgKiBGUk9NIHBnX2RhdGFiYXNlIFdIRVJFIGRhdG5hbWU9J1wiICsgZGF0YWJhc2UgKyBcIic7XCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZVxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldEN1cnJlbnREYXRhYmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBjdXJyZW50X2RhdGFiYXNlKClcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxdWVyeVswXVtcImN1cnJlbnRfZGF0YWJhc2VcIl1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5oYXNTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJzY2hlbWF0YVxcXCIgV0hFUkUgXFxcInNjaGVtYV9uYW1lXFxcIiA9ICdcIiArIHNjaGVtYSArIFwiJ1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBjdXJyZW50bHkgdXNpbmcgZGF0YWJhc2Ugc2NoZW1hXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0Q3VycmVudFNjaGVtYSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBjdXJyZW50X3NjaGVtYSgpXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcXVlcnlbMF1bXCJjdXJyZW50X3NjaGVtYVwiXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc1RhYmxlID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRUYWJsZU5hbWUsIF9hLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFRhYmxlTmFtZSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBhcnNlZFRhYmxlTmFtZS5zY2hlbWEpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwYXJzZWRUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNjaGVtYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJ0YWJsZXNcXFwiIFdIRVJFIFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgcGFyc2VkVGFibGVOYW1lLnNjaGVtYSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgcGFyc2VkVGFibGVOYW1lLnRhYmxlTmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWRUYWJsZU5hbWUsIF9hLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFRhYmxlTmFtZSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBhcnNlZFRhYmxlTmFtZS5zY2hlbWEpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwYXJzZWRUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNjaGVtYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgKiBGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJjb2x1bW5zXFxcIiBXSEVSRSBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIHBhcnNlZFRhYmxlTmFtZS5zY2hlbWEgKyBcIicgQU5EIFxcXCJ0YWJsZV9uYW1lXFxcIiA9ICdcIiArIHBhcnNlZFRhYmxlTmFtZS50YWJsZU5hbWUgKyBcIicgQU5EIFxcXCJjb2x1bW5fbmFtZVxcXCIgPSAnXCIgKyBjb2x1bW5OYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBkYXRhYmFzZS5cbiAgICAgKiBOb3RlOiBQb3N0Z3JlcyBkb2VzIG5vdCBzdXBwb3J0IGRhdGFiYXNlIGNyZWF0aW9uIGluc2lkZSBhIHRyYW5zYWN0aW9uIGJsb2NrLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlID0gZnVuY3Rpb24gKGRhdGFiYXNlLCBpZk5vdEV4aXN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhYmFzZUFscmVhZHlFeGlzdHMsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZk5vdEV4aXN0KSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRGF0YWJhc2UoZGF0YWJhc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VBbHJlYWR5RXhpc3RzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlQWxyZWFkeUV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IFwiQ1JFQVRFIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJEUk9QIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKG5ldyBRdWVyeSh1cCksIG5ldyBRdWVyeShkb3duKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgZGF0YWJhc2UuXG4gICAgICogTm90ZTogUG9zdGdyZXMgZG9lcyBub3Qgc3VwcG9ydCBkYXRhYmFzZSBkcm9wcGluZyBpbnNpZGUgYSB0cmFuc2FjdGlvbiBibG9jay5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZkV4aXN0ID8gXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFwiXCIgKyBkYXRhYmFzZSArIFwiXFxcIlwiIDogXCJEUk9QIERBVEFCQVNFIFxcXCJcIiArIGRhdGFiYXNlICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJDUkVBVEUgREFUQUJBU0UgXFxcIlwiICsgZGF0YWJhc2UgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXMobmV3IFF1ZXJ5KHVwKSwgbmV3IFF1ZXJ5KGRvd24pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hUGF0aCwgaWZOb3RFeGlzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVBhdGguaW5kZXhPZihcIi5cIikgPT09IC0xID8gc2NoZW1hUGF0aCA6IHNjaGVtYVBhdGguc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZk5vdEV4aXN0ID8gXCJDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiXCIgOiBcIkNSRUFURSBTQ0hFTUEgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gXCJEUk9QIFNDSEVNQSBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIgQ0FTQ0FERVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyhuZXcgUXVlcnkodXApLCBuZXcgUXVlcnkoZG93bikpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYVBhdGgsIGlmRXhpc3QsIGlzQ2FzY2FkZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2NoZW1hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVBhdGguaW5kZXhPZihcIi5cIikgPT09IC0xID8gc2NoZW1hUGF0aCA6IHNjaGVtYVBhdGguc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBpZkV4aXN0ID8gXCJEUk9QIFNDSEVNQSBJRiBFWElTVFMgXFxcIlwiICsgc2NoZW1hICsgXCJcXFwiIFwiICsgKGlzQ2FzY2FkZSA/IFwiQ0FTQ0FERVwiIDogXCJcIikgOiBcIkRST1AgU0NIRU1BIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIiBcIiArIChpc0Nhc2NhZGUgPyBcIkNBU0NBREVcIiA6IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IFwiQ1JFQVRFIFNDSEVNQSBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXMobmV3IFF1ZXJ5KHVwKSwgbmV3IFF1ZXJ5KGRvd24pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBpZk5vdEV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgY3JlYXRlSW5kaWNlcykge1xuICAgICAgICBpZiAoaWZOb3RFeGlzdCA9PT0gdm9pZCAwKSB7IGlmTm90RXhpc3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY3JlYXRlRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBjcmVhdGVGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMgPT09IHZvaWQgMCkgeyBjcmVhdGVJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNUYWJsZUV4aXN0LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBlbnVtQ29sdW1ucywgY3JlYXRlZEVudW1UeXBlcywgZW51bUNvbHVtbnNfMSwgZW51bUNvbHVtbnNfMV8xLCBjb2x1bW4sIGhhc0VudW0sIGVudW1OYW1lLCBlXzFfMSwgZ2VuZXJhdGVkQ29sdW1ucywgZ2VuZXJhdGVkQ29sdW1uc18xLCBnZW5lcmF0ZWRDb2x1bW5zXzFfMSwgY29sdW1uLCB0YWJsZU5hbWVXaXRoU2NoZW1hLCB0YWJsZU5hbWUsIHNjaGVtYSwgaW5zZXJ0UXVlcnksIGRlbGV0ZVF1ZXJ5LCBlXzJfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZOb3RFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bUNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgY29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRW51bVR5cGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMywgOCwgOSwgMTBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzEgPSBfX3ZhbHVlcyhlbnVtQ29sdW1ucyksIGVudW1Db2x1bW5zXzFfMSA9IGVudW1Db2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnVtQ29sdW1uc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBlbnVtQ29sdW1uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc0VudW1UeXBlKHRhYmxlLCBjb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRW51bSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZW51bSB3aXRoIHRoZSBzYW1lIFwiZW51bU5hbWVcIiBpcyBkZWZpbmVkIG1vcmUgdGhlbiBvbmNlLCBtZSBtdXN0IHByZXZlbnQgZG91YmxlIGNyZWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0VudW0gJiYgY3JlYXRlZEVudW1UeXBlcy5pbmRleE9mKGVudW1OYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRW51bVR5cGVzLnB1c2goZW51bU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZW51bU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcEVudW1UeXBlU3FsKHRhYmxlLCBjb2x1bW4sIGVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzFfMSA9IGVudW1Db2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db2x1bW5zXzFfMSAmJiAhZW51bUNvbHVtbnNfMV8xLmRvbmUgJiYgKF9hID0gZW51bUNvbHVtbnNfMS5yZXR1cm4pKSBfYS5jYWxsKGVudW1Db2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZENvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIiAmJiBjb2x1bW4uYXNFeHByZXNzaW9uOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy50cnlzLnB1c2goWzExLCAxNiwgMTcsIDE4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zXzEgPSBfX3ZhbHVlcyhnZW5lcmF0ZWRDb2x1bW5zKSwgZ2VuZXJhdGVkQ29sdW1uc18xXzEgPSBnZW5lcmF0ZWRDb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWdlbmVyYXRlZENvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGdlbmVyYXRlZENvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRUYWJsZU5hbWVXaXRoU2NoZW1hKHRhYmxlLm5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Muc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRyaXZlci5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uc18xXzEgPSBnZW5lcmF0ZWRDb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzMgLypicmVhayovLCAxOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzJfMSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0ZWRDb2x1bW5zXzFfMSAmJiAhZ2VuZXJhdGVkQ29sdW1uc18xXzEuZG9uZSAmJiAoX2IgPSBnZW5lcmF0ZWRDb2x1bW5zXzEucmV0dXJuKSkgX2IuY2FsbChnZW5lcmF0ZWRDb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKHRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjcmVhdGVGb3JlaWduS2V5cyBpcyB0cnVlLCB3ZSBtdXN0IGRyb3AgY3JlYXRlZCBmb3JlaWduIGtleXMgaW4gZG93biBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZVRhYmxlIGRvZXMgbm90IG5lZWQgc2VwYXJhdGUgbWV0aG9kIHRvIGNyZWF0ZSBmb3JlaWduIGtleXMsIGJlY2F1c2UgaXQgY3JlYXRlIGZrJ3MgaW4gdGhlIHNhbWUgcXVlcnkgd2l0aCB0YWJsZSBjcmVhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVGb3JlaWduS2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBkb3duUXVlcmllcy5wdXNoKF90aGlzLmRyb3BGb3JlaWduS2V5U3FsKHRhYmxlLCBmb3JlaWduS2V5KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZSh0YWJsZSwgaW5kZXguY29sdW1uTmFtZXMsIGluZGV4LndoZXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goX3RoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BUYWJsZSA9IGZ1bmN0aW9uICh0YXJnZXQsIGlmRXhpc3QsIGRyb3BGb3JlaWduS2V5cywgZHJvcEluZGljZXMpIHtcbiAgICAgICAgaWYgKGRyb3BGb3JlaWduS2V5cyA9PT0gdm9pZCAwKSB7IGRyb3BGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGRyb3BJbmRpY2VzID09PSB2b2lkIDApIHsgZHJvcEluZGljZXMgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpc1RhYmxlRXhpc3QsIGNyZWF0ZUZvcmVpZ25LZXlzLCB0YWJsZVBhdGgsIHRhYmxlLCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhcmdldCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RhYmxlRXhpc3QgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGFibGVFeGlzdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb3JlaWduS2V5cyA9IGRyb3BGb3JlaWduS2V5cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aCA9IHRoaXMuZ2V0VGFibGVQYXRoKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlUGF0aCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wSW5kaWNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BGb3JlaWduS2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiB1cFF1ZXJpZXMucHVzaChfdGhpcy5kcm9wRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKHRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdmlldy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllcywgZG93blF1ZXJpZXMsIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVWaWV3U3FsKHZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gdXBRdWVyaWVzKS5wdXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmFwcGx5KF9hLCBbX2Uuc2VudCgpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFZpZXdTcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSAoX2MgPSBkb3duUXVlcmllcykucHVzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5hcHBseShfYywgW19lLnNlbnQoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlldyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZpZXdOYW1lLCB2aWV3LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgVmlldyA/IHRhcmdldC5uYW1lIDogdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRWaWV3KHZpZXdOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IChfYSA9IHVwUXVlcmllcykucHVzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5hcHBseShfYSwgW19lLnNlbnQoKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZCA9IChfYyA9IGRvd25RdWVyaWVzKS5wdXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmFwcGx5KF9jLCBbX2Uuc2VudCgpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbmFtZVRhYmxlID0gZnVuY3Rpb24gKG9sZFRhYmxlT3JOYW1lLCBuZXdUYWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllcywgZG93blF1ZXJpZXMsIG9sZFRhYmxlLCBfYSwgbmV3VGFibGUsIF9iLCBzY2hlbWFOYW1lLCBvbGRUYWJsZU5hbWUsIGNvbHVtbk5hbWVzLCBvbGRQa05hbWUsIG5ld1BrTmFtZSwgZW51bUNvbHVtbnMsIGVudW1Db2x1bW5zXzIsIGVudW1Db2x1bW5zXzJfMSwgY29sdW1uLCBvbGRFbnVtVHlwZSwgZV8zXzE7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRUYWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9sZFRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZShvbGRUYWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlID0gb2xkVGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUob2xkVGFibGUpLCBzY2hlbWFOYW1lID0gX2Iuc2NoZW1hLCBvbGRUYWJsZU5hbWUgPSBfYi50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZS5uYW1lID0gc2NoZW1hTmFtZSA/IHNjaGVtYU5hbWUgKyBcIi5cIiArIG5ld1RhYmxlTmFtZSA6IG5ld1RhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKG9sZFRhYmxlKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdUYWJsZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aChuZXdUYWJsZSkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgb2xkVGFibGVOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBjb2x1bW4gcHJpbWFyeSBrZXkgY29uc3RyYWludFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RhYmxlLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IG5ld1RhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKG9sZFRhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKG5ld1RhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgobmV3VGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgb2xkUGtOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1BrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aChuZXdUYWJsZSkgKyBcIiBSRU5BTUUgQ09OU1RSQUlOVCBcXFwiXCIgKyBuZXdQa05hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgb2xkUGtOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBzZXF1ZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sLmlzR2VuZXJhdGVkICYmIGNvbC5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcXVlbmNlUGF0aCA9IF90aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKG9sZFRhYmxlLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXF1ZW5jZU5hbWUgPSBfdGhpcy5idWlsZFNlcXVlbmNlTmFtZShvbGRUYWJsZSwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2VxdWVuY2VQYXRoID0gX3RoaXMuYnVpbGRTZXF1ZW5jZVBhdGgobmV3VGFibGUsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NlcXVlbmNlTmFtZSA9IF90aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKG5ld1RhYmxlLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cCA9IFwiQUxURVIgU0VRVUVOQ0UgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHNlcXVlbmNlUGF0aCkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3U2VxdWVuY2VOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb3duID0gXCJBTFRFUiBTRVFVRU5DRSBcIiArIF90aGlzLmVzY2FwZVBhdGgobmV3U2VxdWVuY2VQYXRoKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBzZXF1ZW5jZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KHVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KGRvd24pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSB1bmlxdWUgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnVuaXF1ZXMuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdVbmlxdWVOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShuZXdUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZS5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBuZXdVbmlxdWVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgaW5kZXggY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBuZXcgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IF90aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZShuZXdUYWJsZSkuc2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdJbmRleE5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZShuZXdUYWJsZSwgaW5kZXguY29sdW1uTmFtZXMsIGluZGV4LndoZXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gc2NoZW1hID8gXCJBTFRFUiBJTkRFWCBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiXCIgOiBcIkFMVEVSIElOREVYIFxcXCJcIiArIGluZGV4Lm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG5ld0luZGV4TmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb3duID0gc2NoZW1hID8gXCJBTFRFUiBJTkRFWCBcXFwiXCIgKyBzY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiXCIgOiBcIkFMVEVSIElOREVYIFxcXCJcIiArIG5ld0luZGV4TmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeSh1cCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KGRvd24pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSBuZXdJbmRleE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBmb3JlaWduIGtleSBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuZm9yZWlnbktleXMuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG5ldyBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3Rm9yZWlnbktleU5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKG5ld1RhYmxlLCBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLCBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIiBUTyBcXFwiXCIgKyBuZXdGb3JlaWduS2V5TmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIF90aGlzLmVzY2FwZVBhdGgobmV3VGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgbmV3Rm9yZWlnbktleU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgZm9yZWlnbktleS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkubmFtZSA9IG5ld0ZvcmVpZ25LZXlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtQ29sdW1ucyA9IG5ld1RhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi50eXBlID09PSBcImVudW1cIiB8fCBjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFs0LCA5LCAxMCwgMTFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Db2x1bW5zXzIgPSBfX3ZhbHVlcyhlbnVtQ29sdW1ucyksIGVudW1Db2x1bW5zXzJfMSA9IGVudW1Db2x1bW5zXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnVtQ29sdW1uc18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBlbnVtQ29sdW1uc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHJlbmFtaW5nIGZvciB1c2VyLWRlZmluZWQgZW51bSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmVudW1OYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRVc2VyRGVmaW5lZFR5cGVOYW1lKG9sZFRhYmxlLCBjb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bVR5cGUgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUWVBFIFxcXCJcIiArIG9sZEVudW1UeXBlLnNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBvbGRFbnVtVHlwZS5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZShuZXdUYWJsZSwgY29sdW1uLCBmYWxzZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZShuZXdUYWJsZSwgY29sdW1uKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBvbGRFbnVtVHlwZS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bUNvbHVtbnNfMl8xID0gZW51bUNvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfM18xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8zID0geyBlcnJvcjogZV8zXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db2x1bW5zXzJfMSAmJiAhZW51bUNvbHVtbnNfMl8xLmRvbmUgJiYgKF9jID0gZW51bUNvbHVtbnNfMi5yZXR1cm4pKSBfYy5jYWxsKGVudW1Db2x1bW5zXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb2x1bW4gZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgaGFzRW51bSwgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZV8xLCBjb2x1bW5OYW1lc18xLCBwa05hbWUsIGNvbHVtbk5hbWVzLCBjb2x1bW5JbmRleCwgdW5pcXVlQ29uc3RyYWludCwgdGFibGVOYW1lV2l0aFNjaGVtYSwgdGFibGVOYW1lLCBzY2hlbWEsIGluc2VydFF1ZXJ5LCBkZWxldGVRdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRW51bVR5cGUodGFibGUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFbnVtID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNFbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVFbnVtVHlwZVNxbCh0YWJsZSwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmRyb3BFbnVtVHlwZVNxbCh0YWJsZSwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBcIiArIHRoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwodGFibGUsIGNvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT0xVTU4gXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG9yIHVwZGF0ZSBwcmltYXJ5IGtleSBjb25zdHJhaW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzUHJpbWFyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFibGUgYWxyZWFkeSBoYXZlIHByaW1hcnkga2V5LCBtZSBtdXN0IGRyb3AgaXQgYW5kIHJlY3JlYXRlIGFnYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lXzEgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lXzEgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZV8xICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzXzEgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBwcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGNsb25lZFRhYmxlLmluZGljZXMuZmluZChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBpbmRleC5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgY29sdW1uSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBjb2x1bW5JbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHVuaXF1ZSBjb25zdHJhaW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludCA9IG5ldyBUYWJsZVVuaXF1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW2NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBbY29sdW1uLm5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZUNvbnN0cmFpbnQubmFtZSArIFwiXFxcIiBVTklRVUUgKFxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbHVtbi5nZW5lcmF0ZWRUeXBlID09PSBcIlNUT1JFRFwiICYmIGNvbHVtbi5hc0V4cHJlc3Npb24pKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VGFibGVOYW1lV2l0aFNjaGVtYSh0YWJsZS5uYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Iuc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRyaXZlci5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW4ncyBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDT01NRU5UIE9OIENPTFVNTiBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIi5cXFwiXCIgKyBjb2x1bW4ubmFtZSArIFwiXFxcIiBJUyBcIiArIHRoaXMuZXNjYXBlQ29tbWVudChjb2x1bW4uY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkNPTU1FTlQgT04gQ09MVU1OIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiIElTIFwiICsgdGhpcy5lc2NhcGVDb21tZW50KGNvbHVtbi5jb21tZW50KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmFkZENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ2FjaGVkVGFibGUodGFibGUsIGNsb25lZFRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbHVtbnMgZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zXzEsIGNvbHVtbnNfMV8xLCBjb2x1bW4sIGVfNF8xO1xuICAgICAgICAgICAgdmFyIGVfNCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMSA9IF9fdmFsdWVzKGNvbHVtbnMpLCBjb2x1bW5zXzFfMSA9IGNvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZENvbHVtbih0YWJsZU9yTmFtZSwgY29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc18xXzEgPSBjb2x1bW5zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNF8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV80ID0geyBlcnJvcjogZV80XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zXzFfMSAmJiAhY29sdW1uc18xXzEuZG9uZSAmJiAoX2EgPSBjb2x1bW5zXzEucmV0dXJuKSkgX2EuY2FsbChjb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVuYW1lcyBjb2x1bW4gaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnJlbmFtZUNvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgb2xkVGFibGVDb2x1bW5Pck5hbWUsIG5ld1RhYmxlQ29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIG9sZENvbHVtbiwgbmV3Q29sdW1uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW4gPSBvbGRUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gb2xkVGFibGVDb2x1bW5Pck5hbWUgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gb2xkVGFibGVDb2x1bW5Pck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcXFwiXCIgKyBvbGRUYWJsZUNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiIHRhYmxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uID0gbmV3VGFibGVDb2x1bW5Pck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4gPSBvbGRDb2x1bW4uY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4ubmFtZSA9IG5ld1RhYmxlQ29sdW1uT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2hhbmdlQ29sdW1uKHRhYmxlLCBvbGRDb2x1bW4sIG5ld0NvbHVtbildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNoYW5nZUNvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgb2xkVGFibGVDb2x1bW5Pck5hbWUsIG5ld0NvbHVtbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgZGVmYXVsdFZhbHVlQ2hhbmdlZCwgb2xkQ29sdW1uLCBvbGRFbnVtVHlwZSwgcHJpbWFyeUNvbHVtbnMsIGNvbHVtbk5hbWVzLCBvbGRQa05hbWUsIG5ld1BrTmFtZSwgc2VxdWVuY2VQYXRoLCBzZXF1ZW5jZU5hbWUsIG5ld1NlcXVlbmNlUGF0aCwgbmV3U2VxdWVuY2VOYW1lLCB1cCwgZG93biwgb2xkVGFibGVDb2x1bW4sIGFycmF5U3VmZml4LCBuZXdFbnVtTmFtZSwgb2xkRW51bU5hbWUsIG9sZEVudW1OYW1lV2l0aG91dFNjaGVtYSwgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCwgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hX29sZCwgdXBUeXBlLCBkb3duVHlwZSwgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZSwgY29sdW1uTmFtZXMsIGNvbHVtbiwgcGtOYW1lLCBjb2x1bW5OYW1lcywgcHJpbWFyeUNvbHVtbiwgY29sdW1uLCBwa05hbWUsIGNvbHVtbk5hbWVzLCB1bmlxdWVDb25zdHJhaW50LCB1bmlxdWVDb25zdHJhaW50LCB0YWJsZU5hbWVXaXRoU2NoZW1hLCB0YWJsZU5hbWUsIHNjaGVtYTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZENvbHVtbiA9IG9sZFRhYmxlQ29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9sZFRhYmxlQ29sdW1uT3JOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG9sZFRhYmxlQ29sdW1uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2xkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXFxcIlwiICsgb2xkVGFibGVDb2x1bW5Pck5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIiB0YWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRDb2x1bW4udHlwZSAhPT0gbmV3Q29sdW1uLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvbGRDb2x1bW4ubGVuZ3RoICE9PSBuZXdDb2x1bW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmV3Q29sdW1uLmlzQXJyYXkgIT09IG9sZENvbHVtbi5pc0FycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFvbGRDb2x1bW4uZ2VuZXJhdGVkVHlwZSAmJiBuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAob2xkQ29sdW1uLmFzRXhwcmVzc2lvbiAhPT0gbmV3Q29sdW1uLmFzRXhwcmVzc2lvbiAmJiBuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIikpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGRhdGEgY29udmVyc2lvbiwgd2UganVzdCByZWNyZWF0ZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcENvbHVtbih0YWJsZSwgb2xkQ29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGRhdGEgY29udmVyc2lvbiwgd2UganVzdCByZWNyZWF0ZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYWRkQ29sdW1uKHRhYmxlLCBuZXdDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsb25lZCB0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRDb2x1bW4ubmFtZSAhPT0gbmV3Q29sdW1uLm5hbWUpKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT0xVTU4gXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9sZENvbHVtbi50eXBlID09PSBcImVudW1cIiB8fCBvbGRDb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFVzZXJEZWZpbmVkVHlwZU5hbWUodGFibGUsIG9sZENvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtVHlwZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRZUEUgXFxcIlwiICsgb2xkRW51bVR5cGUuc2NoZW1hICsgXCJcXFwiLlxcXCJcIiArIG9sZEVudW1UeXBlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFwiICsgdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBuZXdDb2x1bW4sIGZhbHNlKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUWVBFIFwiICsgdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBuZXdDb2x1bW4pICsgXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZEVudW1UeXBlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgY29sdW1uIHByaW1hcnkga2V5IGNvbnN0cmFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDb2x1bW4uaXNQcmltYXJ5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMgPSBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBjb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBvbGQgY29sdW1uIG5hbWUgd2l0aCBuZXcgY29sdW1uIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcy5zcGxpY2UoY29sdW1uTmFtZXMuaW5kZXhPZihvbGRDb2x1bW4ubmFtZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzLnB1c2gobmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG9sZFBrTmFtZSArIFwiXFxcIiBUTyBcXFwiXCIgKyBuZXdQa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgUkVOQU1FIENPTlNUUkFJTlQgXFxcIlwiICsgbmV3UGtOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG9sZFBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgY29sdW1uIHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmlzR2VuZXJhdGVkID09PSB0cnVlICYmIG5ld0NvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZVBhdGggPSB0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBvbGRDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOYW1lID0gdGhpcy5idWlsZFNlcXVlbmNlTmFtZSh0YWJsZSwgb2xkQ29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlcXVlbmNlUGF0aCA9IHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXF1ZW5jZU5hbWUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKHRhYmxlLCBuZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBcIkFMVEVSIFNFUVVFTkNFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHNlcXVlbmNlUGF0aCkgKyBcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3U2VxdWVuY2VOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IFwiQUxURVIgU0VRVUVOQ0UgXCIgKyB0aGlzLmVzY2FwZVBhdGgobmV3U2VxdWVuY2VQYXRoKSArIFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBzZXF1ZW5jZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkodXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShkb3duKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgdW5pcXVlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5maW5kQ29sdW1uVW5pcXVlcyhvbGRDb2x1bW4pLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIG5ldyBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMuc3BsaWNlKHVuaXF1ZS5jb2x1bW5OYW1lcy5pbmRleE9mKG9sZENvbHVtbi5uYW1lKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLnB1c2gobmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdVbmlxdWVOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShjbG9uZWRUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIHVuaXF1ZS5uYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld1VuaXF1ZU5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBuZXdVbmlxdWVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgaW5kZXggY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmZpbmRDb2x1bW5JbmRpY2VzKG9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBuZXcgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY29sdW1uTmFtZXMuc3BsaWNlKGluZGV4LmNvbHVtbk5hbWVzLmluZGV4T2Yob2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcy5wdXNoKG5ld0NvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gX3RoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKS5zY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4TmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKGNsb25lZFRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXAgPSBzY2hlbWEgPyBcIkFMVEVSIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdJbmRleE5hbWUgKyBcIlxcXCJcIiA6IFwiQUxURVIgSU5ERVggXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIiBSRU5BTUUgVE8gXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvd24gPSBzY2hlbWEgPyBcIkFMVEVSIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBuZXdJbmRleE5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIGluZGV4Lm5hbWUgKyBcIlxcXCJcIiA6IFwiQUxURVIgSU5ERVggXFxcIlwiICsgbmV3SW5kZXhOYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KHVwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoZG93bikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgY29uc3RyYWludCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgubmFtZSA9IG5ld0luZGV4TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMob2xkQ29sdW1uKS5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgbmV3IGNvbnN0cmFpbnQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMuc3BsaWNlKGZvcmVpZ25LZXkuY29sdW1uTmFtZXMuaW5kZXhPZihvbGRDb2x1bW4ubmFtZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMucHVzaChuZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0ZvcmVpZ25LZXlOYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZShjbG9uZWRUYWJsZSwgZm9yZWlnbktleS5jb2x1bW5OYW1lcywgX3RoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgX3RoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09OU1RSQUlOVCBcXFwiXCIgKyBmb3JlaWduS2V5Lm5hbWUgKyBcIlxcXCIgVE8gXFxcIlwiICsgbmV3Rm9yZWlnbktleU5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyBfdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFJFTkFNRSBDT05TVFJBSU5UIFxcXCJcIiArIG5ld0ZvcmVpZ25LZXlOYW1lICsgXCJcXFwiIFRPIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBjb25zdHJhaW50IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSBuZXdGb3JlaWduS2V5TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGVDb2x1bW4gPSBjbG9uZWRUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG9sZENvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmNvbHVtbnNbY2xvbmVkVGFibGUuY29sdW1ucy5pbmRleE9mKG9sZFRhYmxlQ29sdW1uKV0ubmFtZSA9IG5ld0NvbHVtbi5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uLm5hbWUgPSBuZXdDb2x1bW4ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5wcmVjaXNpb24gIT09IG9sZENvbHVtbi5wcmVjaXNpb24gfHwgbmV3Q29sdW1uLnNjYWxlICE9PSBvbGRDb2x1bW4uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgVFlQRSBcIiArIHRoaXMuZHJpdmVyLmNyZWF0ZUZ1bGxUeXBlKG5ld0NvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgdGhpcy5kcml2ZXIuY3JlYXRlRnVsbFR5cGUob2xkQ29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXdDb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgbmV3Q29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAob2xkQ29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IG9sZENvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFPcm1VdGlscy5pc0FycmF5c0VxdWFsKG5ld0NvbHVtbi5lbnVtLCBvbGRDb2x1bW4uZW51bSkgfHwgbmV3Q29sdW1uLmVudW1OYW1lICE9PSBvbGRDb2x1bW4uZW51bU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlTdWZmaXggPSBuZXdDb2x1bW4uaXNBcnJheSA/IFwiW11cIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIG5ld0NvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIG9sZENvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtTmFtZVdpdGhTY2hlbWFfb2xkID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIHRydWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFbnVtTmFtZVdpdGhvdXRTY2hlbWFfb2xkID0gdGhpcy5idWlsZEVudW1OYW1lKHRhYmxlLCBvbGRDb2x1bW4sIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIG9sZCBFTlVNXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIG9sZEVudW1OYW1lICsgXCIgUkVOQU1FIFRPIFwiICsgb2xkRW51bU5hbWVXaXRob3V0U2NoZW1hX29sZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVFlQRSBcIiArIG9sZEVudW1OYW1lV2l0aFNjaGVtYV9vbGQgKyBcIiBSRU5BTUUgVE8gXCIgKyBvbGRFbnVtTmFtZVdpdGhvdXRTY2hlbWEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IEVOVU1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZUVudW1UeXBlU3FsKHRhYmxlLCBuZXdDb2x1bW4sIG5ld0VudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmRyb3BFbnVtVHlwZVNxbCh0YWJsZSwgbmV3Q29sdW1uLCBuZXdFbnVtTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbHVtbiBoYXZlIGRlZmF1bHQgdmFsdWUsIHdlIG11c3QgZHJvcCBpdCB0byBhdm9pZCBpc3N1ZXMgd2l0aCB0eXBlIGNhc3RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmRlZmF1bHQgIT09IG51bGwgJiYgb2xkQ29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXJrIGRlZmF1bHQgYXMgY2hhbmdlZCB0byBwcmV2ZW50IGRvdWJsZSB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIERFRkFVTFRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgREVGQVVMVCBcIiArIG9sZENvbHVtbi5kZWZhdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwVHlwZSA9IFwiXCIgKyBuZXdFbnVtTmFtZSArIGFycmF5U3VmZml4ICsgXCIgVVNJTkcgXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCI6OlxcXCJ0ZXh0XFxcIjo6XCIgKyBuZXdFbnVtTmFtZSArIGFycmF5U3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25UeXBlID0gXCJcIiArIG9sZEVudW1OYW1lV2l0aFNjaGVtYV9vbGQgKyBhcnJheVN1ZmZpeCArIFwiIFVTSU5HIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiOjpcXFwidGV4dFxcXCI6OlwiICsgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCArIGFycmF5U3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb2x1bW4gdG8gdXNlIG5ldyB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRZUEUgXCIgKyB1cFR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgZG93blR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGNvbHVtbiBkZWZhdWx0IG9yIGNyZWF0ZSBuZXcgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG5ld0NvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgbmV3Q29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgRFJPUCBERUZBVUxUXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCBFTlVNXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wRW51bVR5cGVTcWwodGFibGUsIG9sZENvbHVtbiwgb2xkRW51bU5hbWVXaXRoU2NoZW1hX29sZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVFbnVtVHlwZVNxbCh0YWJsZSwgb2xkQ29sdW1uLCBvbGRFbnVtTmFtZVdpdGhTY2hlbWFfb2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmlzTnVsbGFibGUgIT09IG5ld0NvbHVtbi5pc051bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc051bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgU0VUIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgTk9UIE5VTExcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIE5PVCBOVUxMXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ29sdW1uLmNvbW1lbnQgIT09IG5ld0NvbHVtbi5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQ09NTUVOVCBPTiBDT0xVTU4gXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIuXFxcIlwiICsgb2xkQ29sdW1uLm5hbWUgKyBcIlxcXCIgSVMgXCIgKyB0aGlzLmVzY2FwZUNvbW1lbnQobmV3Q29sdW1uLmNvbW1lbnQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDT01NRU5UIE9OIENPTFVNTiBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIi5cXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBJUyBcIiArIHRoaXMuZXNjYXBlQ29tbWVudChvbGRDb2x1bW4uY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb2x1bW4uaXNQcmltYXJ5ICE9PSBvbGRDb2x1bW4uaXNQcmltYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMgPSBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwcmltYXJ5IGNvbHVtbiBzdGF0ZSBjaGFuZ2VkLCB3ZSBtdXN0IGFsd2F5cyBkcm9wIGV4aXN0ZWQgY29uc3RyYWludC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa05hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1ByaW1hcnkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMucHVzaChuZXdDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBjbG9uZWRUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWUgPT09IG5ld0NvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbiA9IHByaW1hcnlDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gbmV3Q29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1ucy5zcGxpY2UocHJpbWFyeUNvbHVtbnMuaW5kZXhPZihwcmltYXJ5Q29sdW1uKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNsb25lZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gbmV3Q29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW5vdGhlciBwcmltYXJ5IGtleXMsIHdlIG11c3QgcmVjcmVhdGUgY29uc3RyYWludC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZSArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1VuaXF1ZSAhPT0gb2xkQ29sdW1uLmlzVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc1VuaXF1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW25ld0NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW25ld0NvbHVtbi5uYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgVU5JUVVFIChcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludCA9IGNsb25lZFRhYmxlLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiAhIXVuaXF1ZS5jb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBuZXdDb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS51bmlxdWVzLnNwbGljZShjbG9uZWRUYWJsZS51bmlxdWVzLmluZGV4T2YodW5pcXVlQ29uc3RyYWludCksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgVU5JUVVFIChcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDb2x1bW4uaXNHZW5lcmF0ZWQgIT09IG5ld0NvbHVtbi5pc0dlbmVyYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgIT09IFwidXVpZFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5pc0dlbmVyYXRlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyBcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiIE9XTkVEIEJZIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJEUk9QIFNFUVVFTkNFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbikpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBTRVQgREVGQVVMVCBuZXh0dmFsKCdcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiJylcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBEUk9QIERFRkFVTFRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIERST1AgREVGQVVMVFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIG5leHR2YWwoJ1wiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIG5ld0NvbHVtbikpICsgXCInKVwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkRST1AgU0VRVUVOQ0UgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGhpcy5idWlsZFNlcXVlbmNlUGF0aCh0YWJsZSwgbmV3Q29sdW1uKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyBcIiArIHRoaXMuZXNjYXBlUGF0aCh0aGlzLmJ1aWxkU2VxdWVuY2VQYXRoKHRhYmxlLCBuZXdDb2x1bW4pKSArIFwiIE9XTkVEIEJZIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiLlxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBtaWdodCBoYXZlIGNoYW5nZWQgd2hlbiB0aGUgZW51bSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uLmRlZmF1bHQgIT09IG9sZENvbHVtbi5kZWZhdWx0ICYmICFkZWZhdWx0VmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG5ld0NvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgbmV3Q29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENvbHVtbi5kZWZhdWx0ICE9PSBudWxsICYmIG9sZENvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFNFVCBERUZBVUxUIFwiICsgb2xkQ29sdW1uLmRlZmF1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIERST1AgREVGQVVMVFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkQ29sdW1uLmRlZmF1bHQgIT09IG51bGwgJiYgb2xkQ29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgRFJPUCBERUZBVUxUXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBTFRFUiBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgU0VUIERFRkFVTFQgXCIgKyBvbGRDb2x1bW4uZGVmYXVsdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV3Q29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpICE9PSAob2xkQ29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpIHx8IG5ld0NvbHVtbi5zcmlkICE9PSBvbGRDb2x1bW4uc3JpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFMVEVSIENPTFVNTiBcXFwiXCIgKyBuZXdDb2x1bW4ubmFtZSArIFwiXFxcIiBUWVBFIFwiICsgdGhpcy5kcml2ZXIuY3JlYXRlRnVsbFR5cGUobmV3Q29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUxURVIgQ09MVU1OIFxcXCJcIiArIG5ld0NvbHVtbi5uYW1lICsgXCJcXFwiIFRZUEUgXCIgKyB0aGlzLmRyaXZlci5jcmVhdGVGdWxsVHlwZShvbGRDb2x1bW4pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShuZXdDb2x1bW4uZ2VuZXJhdGVkVHlwZSAhPT0gb2xkQ29sdW1uLmdlbmVyYXRlZFR5cGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghbmV3Q29sdW1uLmdlbmVyYXRlZFR5cGUgfHwgbmV3Q29sdW1uLmdlbmVyYXRlZFR5cGUgPT09IFwiVklSVFVBTFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRUYWJsZU5hbWVXaXRoU2NoZW1hKHRhYmxlLm5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZVdpdGhTY2hlbWEgPSAoX2Iuc2VudCgpKS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFibGVOYW1lV2l0aFNjaGVtYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBSRU5BTUUgQ09MVU1OIFxcXCJcIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiIFRPIFxcXCJURU1QX09MRF9cIiArIG9sZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBcIiArIHRoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwodGFibGUsIG5ld0NvbHVtbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIlVQREFURSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBTRVQgXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCIgPSBcXFwiVEVNUF9PTERfXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTFVNTiBcXFwiVEVNUF9PTERfXCIgKyBvbGRDb2x1bW4ubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZHJpdmVyLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvbGRDb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgY2FuJ3QgY29weSBpdCBiYWNrIG9uIGRvd25ncmFkZS4gSXQgbmVlZHMgdG8gcmVnZW5lcmF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT0xVTU4gXFxcIlwiICsgbmV3Q29sdW1uLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgXCIgKyB0aGlzLmJ1aWxkQ3JlYXRlQ29sdW1uU3FsKHRhYmxlLCBvbGRDb2x1bW4pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5ld0NvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9sZENvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvbGRDb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2hhbmdlQ29sdW1ucyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hhbmdlZENvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNoYW5nZWRDb2x1bW5zXzEsIGNoYW5nZWRDb2x1bW5zXzFfMSwgX2EsIG9sZENvbHVtbiwgbmV3Q29sdW1uLCBlXzVfMTtcbiAgICAgICAgICAgIHZhciBlXzUsIF9iO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uc18xID0gX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpLCBjaGFuZ2VkQ29sdW1uc18xXzEgPSBjaGFuZ2VkQ29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBjaGFuZ2VkQ29sdW1uc18xXzEudmFsdWUsIG9sZENvbHVtbiA9IF9hLm9sZENvbHVtbiwgbmV3Q29sdW1uID0gX2EubmV3Q29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jaGFuZ2VDb2x1bW4odGFibGVPck5hbWUsIG9sZENvbHVtbiwgbmV3Q29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMV8xID0gY2hhbmdlZENvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zXzFfMSAmJiAhY2hhbmdlZENvbHVtbnNfMV8xLmRvbmUgJiYgKF9iID0gY2hhbmdlZENvbHVtbnNfMS5yZXR1cm4pKSBfYi5jYWxsKGNoYW5nZWRDb2x1bW5zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5Pck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY29sdW1uLCBjbG9uZWRUYWJsZSwgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgcGtOYW1lLCBjb2x1bW5OYW1lcywgdGFibGVDb2x1bW4sIHBrTmFtZV8yLCBjb2x1bW5OYW1lc18yLCBjb2x1bW5JbmRleCwgY29sdW1uQ2hlY2ssIGNvbHVtblVuaXF1ZSwgaGFzRW51bSwgZW51bVR5cGUsIGVzY2FwZWRFbnVtTmFtZSwgdGFibGVOYW1lV2l0aFNjaGVtYSwgdGFibGVOYW1lLCBzY2hlbWEsIGluc2VydFF1ZXJ5LCBkZWxldGVRdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW5Pck5hbWUgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbk9yTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHByaW1hcnkga2V5IGNvbnN0cmFpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNQcmltYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBjbG9uZWRUYWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBwcmltYXJ5Q29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgoY2xvbmVkVGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbiA9IGNsb25lZFRhYmxlLmZpbmRDb2x1bW5CeU5hbWUoY29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHByaW1hcnkga2V5IGhhdmUgbXVsdGlwbGUgY29sdW1ucywgd2UgbXVzdCByZWNyZWF0ZSBpdCB3aXRob3V0IGRyb3BwZWQgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtOYW1lXzIgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUoY2xvbmVkVGFibGUsIGNsb25lZFRhYmxlLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc18yID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIHByaW1hcnlDb2x1bW4ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIHBrTmFtZV8yICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzXzIgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKGNsb25lZFRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMiArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSBjbG9uZWRUYWJsZS5pbmRpY2VzLmZpbmQoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBpbmRleC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgaW5kZXguY29sdW1uTmFtZXNbMF0gPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlLmluZGljZXMuc3BsaWNlKGNsb25lZFRhYmxlLmluZGljZXMuaW5kZXhPZihjb2x1bW5JbmRleCksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcEluZGV4U3FsKHRhYmxlLCBjb2x1bW5JbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgY29sdW1uSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNoZWNrID0gY2xvbmVkVGFibGUuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGNoZWNrKSB7IHJldHVybiAhIWNoZWNrLmNvbHVtbk5hbWVzICYmIGNoZWNrLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBjaGVjay5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkNoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUuY2hlY2tzLnNwbGljZShjbG9uZWRUYWJsZS5jaGVja3MuaW5kZXhPZihjb2x1bW5DaGVjayksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY29sdW1uQ2hlY2spKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50U3FsKHRhYmxlLCBjb2x1bW5DaGVjaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVW5pcXVlID0gY2xvbmVkVGFibGUudW5pcXVlcy5maW5kKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIHVuaXF1ZS5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgdW5pcXVlLmNvbHVtbk5hbWVzWzBdID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uVW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUudW5pcXVlcy5zcGxpY2UoY2xvbmVkVGFibGUudW5pcXVlcy5pbmRleE9mKGNvbHVtblVuaXF1ZSksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIGNvbHVtblVuaXF1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVVbmlxdWVDb25zdHJhaW50U3FsKHRhYmxlLCBjb2x1bW5VbmlxdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09MVU1OIFxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2gobmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIFwiICsgdGhpcy5idWlsZENyZWF0ZUNvbHVtblNxbCh0YWJsZSwgY29sdW1uKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiIHx8IGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1lbnVtXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzRW51bVR5cGUodGFibGUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFbnVtID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNFbnVtKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSh0YWJsZSwgY29sdW1uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1UeXBlID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEVudW1OYW1lID0gXCJcXFwiXCIgKyBlbnVtVHlwZS5zY2hlbWEgKyBcIlxcXCIuXFxcIlwiICsgZW51bVR5cGUubmFtZSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZXNjYXBlZEVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlRW51bVR5cGVTcWwodGFibGUsIGNvbHVtbiwgZXNjYXBlZEVudW1OYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbHVtbi5nZW5lcmF0ZWRUeXBlID09PSBcIlNUT1JFRFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFRhYmxlTmFtZVdpdGhTY2hlbWEodGFibGUubmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVXaXRoU2NoZW1hID0gKF9iLnNlbnQoKSkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlTmFtZVdpdGhTY2hlbWFbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSB0YWJsZU5hbWVXaXRoU2NoZW1hWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UXVlcnkgPSB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuZHJpdmVyLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kcml2ZXIuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKGluc2VydFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goZGVsZXRlUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5yZW1vdmVDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zXzIsIGNvbHVtbnNfMl8xLCBjb2x1bW4sIGVfNl8xO1xuICAgICAgICAgICAgdmFyIGVfNiwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMiA9IF9fdmFsdWVzKGNvbHVtbnMpLCBjb2x1bW5zXzJfMSA9IGNvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNvbHVtbnNfMl8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BDb2x1bW4odGFibGVPck5hbWUsIGNvbHVtbildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMl8xID0gY29sdW1uc18yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzZfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uc18yXzEgJiYgIWNvbHVtbnNfMl8xLmRvbmUgJiYgKF9hID0gY29sdW1uc18yLnJldHVybikpIF9hLmNhbGwoY29sdW1uc18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV82KSB0aHJvdyBlXzYuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcHJpbWFyeSBrZXkuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlUHJpbWFyeUtleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2xvbmVkVGFibGUsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlUHJpbWFyeUtleVNxbCh0YWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIHByaW1hcnksIGJlY2F1c2UgZHJvcFByaW1hcnlLZXlTcWwgYnVpbGQgY29uc3RyYWludCBuYW1lIGZyb20gdGFibGUgcHJpbWFyeSBjb2x1bW4gbmFtZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBjb2x1bW4ubmFtZTsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc1ByaW1hcnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wUHJpbWFyeUtleVNxbChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKHRhYmxlLCBjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBjb21wb3NpdGUgcHJpbWFyeSBrZXlzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLnVwZGF0ZVByaW1hcnlLZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNsb25lZFRhYmxlLCBjb2x1bW5OYW1lcywgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgcHJpbWFyeUNvbHVtbnMsIHBrTmFtZV8zLCBjb2x1bW5OYW1lc1N0cmluZ18xLCBwa05hbWUsIGNvbHVtbk5hbWVzU3RyaW5nO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zID0gY2xvbmVkVGFibGUucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZV8zID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnByaW1hcnlLZXlOYW1lKGNsb25lZFRhYmxlLCBwcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lc1N0cmluZ18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMyArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWVfMyArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lc1N0cmluZ18xICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb2x1bW5zIGluIHRhYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkVGFibGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW4ubmFtZSkgIT09IC0xOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnkgPSB0cnVlOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZShjbG9uZWRUYWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZXNTdHJpbmcgPSBjb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwa05hbWUgKyBcIlxcXCIgUFJJTUFSWSBLRVkgKFwiICsgY29sdW1uTmFtZXNTdHJpbmcgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBEUk9QIENPTlNUUkFJTlQgXFxcIlwiICsgcGtOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VDYWNoZWRUYWJsZSh0YWJsZSwgY2xvbmVkVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGEgcHJpbWFyeSBrZXkuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFByaW1hcnlLZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wUHJpbWFyeUtleVNxbCh0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5jcmVhdGVQcmltYXJ5S2V5U3FsKHRhYmxlLCB0YWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHVuaXF1ZSBjb25zdHJhaW50IG1heSBiZSBwYXNzZWQgd2l0aG91dCBuYW1lLiBJbiB0aGlzIGNhc2Ugd2UgZ2VuZXJhdGUgdW5pcXVlIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVuaXF1ZUNvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuZHJvcFVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVVbmlxdWVDb25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVuaXF1ZUNvbnN0cmFpbnRzXzEsIHVuaXF1ZUNvbnN0cmFpbnRzXzFfMSwgdW5pcXVlQ29uc3RyYWludCwgZV83XzE7XG4gICAgICAgICAgICB2YXIgZV83LCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludHNfMSA9IF9fdmFsdWVzKHVuaXF1ZUNvbnN0cmFpbnRzKSwgdW5pcXVlQ29uc3RyYWludHNfMV8xID0gdW5pcXVlQ29uc3RyYWludHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXVuaXF1ZUNvbnN0cmFpbnRzXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnQgPSB1bmlxdWVDb25zdHJhaW50c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50c18xXzEgPSB1bmlxdWVDb25zdHJhaW50c18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzdfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNyA9IHsgZXJyb3I6IGVfN18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludHNfMV8xICYmICF1bmlxdWVDb25zdHJhaW50c18xXzEuZG9uZSAmJiAoX2EgPSB1bmlxdWVDb25zdHJhaW50c18xLnJldHVybikpIF9hLmNhbGwodW5pcXVlQ29uc3RyYWludHNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgdW5pcXVlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIHVuaXF1ZUNvbnN0cmFpbnQsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUgOiB0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUubmFtZSA9PT0gdW5pcXVlT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgdW5pcXVlIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmRyb3BVbmlxdWVDb25zdHJhaW50U3FsKHRhYmxlLCB1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVDb25zdHJhaW50c18yLCB1bmlxdWVDb25zdHJhaW50c18yXzEsIHVuaXF1ZUNvbnN0cmFpbnQsIGVfOF8xO1xuICAgICAgICAgICAgdmFyIGVfOCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzXzIgPSBfX3ZhbHVlcyh1bmlxdWVDb25zdHJhaW50cyksIHVuaXF1ZUNvbnN0cmFpbnRzXzJfMSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF1bmlxdWVDb25zdHJhaW50c18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlQ29uc3RyYWludHNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wVW5pcXVlQ29uc3RyYWludCh0YWJsZU9yTmFtZSwgdW5pcXVlQ29uc3RyYWludCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzXzJfMSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOF8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV84ID0geyBlcnJvcjogZV84XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWVDb25zdHJhaW50c18yXzEgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzXzJfMS5kb25lICYmIChfYSA9IHVuaXF1ZUNvbnN0cmFpbnRzXzIucmV0dXJuKSkgX2EuY2FsbCh1bmlxdWVDb25zdHJhaW50c18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV84KSB0aHJvdyBlXzguZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja0NvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyB1bmlxdWUgY29uc3RyYWludCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIHVuaXF1ZSBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NvbnN0cmFpbnQubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jaGVja0NvbnN0cmFpbnROYW1lKHRhYmxlLCBjaGVja0NvbnN0cmFpbnQuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50U3FsKHRhYmxlLCBjaGVja0NvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hlY2tDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBjaGVja0NvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoY2hlY2tDb25zdHJhaW50KSB7IHJldHVybiBfdGhpcy5jcmVhdGVDaGVja0NvbnN0cmFpbnQodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwocHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENoZWNrQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY2hlY2tPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hlY2tDb25zdHJhaW50LCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb25zdHJhaW50ID0gY2hlY2tPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNoZWNrID8gY2hlY2tPck5hbWUgOiB0YWJsZS5jaGVja3MuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBjaGVja09yTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgY2hlY2sgY29uc3RyYWludCB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFwiICsgdGFibGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuZHJvcENoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUNoZWNrQ29uc3RyYWludFNxbCh0YWJsZSwgY2hlY2tDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENoZWNrQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gY2hlY2tDb25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGNoZWNrQ29uc3RyYWludCkgeyByZXR1cm4gX3RoaXMuZHJvcENoZWNrQ29uc3RyYWludCh0YWJsZU9yTmFtZSwgY2hlY2tDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHVuaXF1ZSBjb25zdHJhaW50IG1heSBiZSBwYXNzZWQgd2l0aG91dCBuYW1lLiBJbiB0aGlzIGNhc2Ugd2UgZ2VuZXJhdGUgdW5pcXVlIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1c2lvbkNvbnN0cmFpbnQubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25Db25zdHJhaW50Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQuZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludFNxbCh0YWJsZSwgZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wRXhjbHVzaW9uQ29uc3RyYWludFNxbCh0YWJsZSwgZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZEV4Y2x1c2lvbkNvbnN0cmFpbnQoZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleGNsdXNpb25Db25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBleGNsdXNpb25Db25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnQodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBleGNsdXNpb24gY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGV4Y2x1c2lvbkNvbnN0cmFpbnQsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25Db25zdHJhaW50ID0gZXhjbHVzaW9uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVFeGNsdXNpb24gPyBleGNsdXNpb25Pck5hbWUgOiB0YWJsZS5leGNsdXNpb25zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gZXhjbHVzaW9uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVzaW9uQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgZXhjbHVzaW9uIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmRyb3BFeGNsdXNpb25Db25zdHJhaW50U3FsKHRhYmxlLCBleGNsdXNpb25Db25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRTcWwodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVFeGNsdXNpb25Db25zdHJhaW50KGV4Y2x1c2lvbkNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcyA9IGV4Y2x1c2lvbkNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZXhjbHVzaW9uQ29uc3RyYWludCkgeyByZXR1cm4gX3RoaXMuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnQodGFibGVPck5hbWUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZvcmVpZ24ga2V5LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBGSyBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIEZLIG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcmVpZ25LZXkubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUodGFibGUsIGZvcmVpZ25LZXkuY29sdW1uTmFtZXMsIHRoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZEZvcmVpZ25LZXkoZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBmb3JlaWduIGtleXMuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRm9yZWlnbktleXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXlzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c18xLCBmb3JlaWduS2V5c18xXzEsIGZvcmVpZ25LZXksIGVfOV8xO1xuICAgICAgICAgICAgdmFyIGVfOSwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzEgPSBfX3ZhbHVlcyhmb3JlaWduS2V5cyksIGZvcmVpZ25LZXlzXzFfMSA9IGZvcmVpZ25LZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFmb3JlaWduS2V5c18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVGb3JlaWduS2V5KHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNfMV8xID0gZm9yZWlnbktleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV85XzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzkgPSB7IGVycm9yOiBlXzlfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXlzXzFfMSAmJiAhZm9yZWlnbktleXNfMV8xLmRvbmUgJiYgKF9hID0gZm9yZWlnbktleXNfMS5yZXR1cm4pKSBfYS5jYWxsKGZvcmVpZ25LZXlzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleSBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBmb3JlaWduS2V5LCB1cCwgZG93bjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleSA9IGZvcmVpZ25LZXlPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkgPyBmb3JlaWduS2V5T3JOYW1lIDogdGFibGUuZm9yZWlnbktleXMuZmluZChmdW5jdGlvbiAoZmspIHsgcmV0dXJuIGZrLm5hbWUgPT09IGZvcmVpZ25LZXlPck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JlaWduS2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTdXBwbGllZCBmb3JlaWduIGtleSB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFwiICsgdGFibGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuZHJvcEZvcmVpZ25LZXlTcWwodGFibGUsIGZvcmVpZ25LZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuY3JlYXRlRm9yZWlnbktleVNxbCh0YWJsZSwgZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZm9yZWlnbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleXMgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9yZWlnbktleXNfMiwgZm9yZWlnbktleXNfMl8xLCBmb3JlaWduS2V5LCBlXzEwXzE7XG4gICAgICAgICAgICB2YXIgZV8xMCwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzIgPSBfX3ZhbHVlcyhmb3JlaWduS2V5cyksIGZvcmVpZ25LZXlzXzJfMSA9IGZvcmVpZ25LZXlzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFmb3JlaWduS2V5c18yXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleXNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wRm9yZWlnbktleSh0YWJsZU9yTmFtZSwgZm9yZWlnbktleSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlzXzJfMSA9IGZvcmVpZ25LZXlzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTBfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTAgPSB7IGVycm9yOiBlXzEwXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JlaWduS2V5c18yXzEgJiYgIWZvcmVpZ25LZXlzXzJfMS5kb25lICYmIChfYSA9IGZvcmVpZ25LZXlzXzIucmV0dXJuKSkgX2EuY2FsbChmb3JlaWduS2V5c18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMCkgdGhyb3cgZV8xMC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRleC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgdXAsIGRvd247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluZGV4Lm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUodGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHRoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmRyb3BJbmRleFNxbCh0YWJsZSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRpY2VzXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlc18xLCBpbmRpY2VzXzFfMSwgaW5kZXgsIGVfMTFfMTtcbiAgICAgICAgICAgIHZhciBlXzExLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc18xID0gX192YWx1ZXMoaW5kaWNlcyksIGluZGljZXNfMV8xID0gaW5kaWNlc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhaW5kaWNlc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGljZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVJbmRleCh0YWJsZU9yTmFtZSwgaW5kZXgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzFfMSA9IGluZGljZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMV8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMSA9IHsgZXJyb3I6IGVfMTFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGljZXNfMV8xICYmICFpbmRpY2VzXzFfMS5kb25lICYmIChfYSA9IGluZGljZXNfMS5yZXR1cm4pKSBfYS5jYWxsKGluZGljZXNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTEpIHRocm93IGVfMTEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGV4IGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgaW5kZXgsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lIDogdGFibGUuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWUgPT09IGluZGV4T3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGluZGV4IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSB0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbiBpbmRpY2VzIGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRpY2VzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBpbmRpY2VzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbmRpY2VzXzIsIGluZGljZXNfMl8xLCBpbmRleCwgZV8xMl8xO1xuICAgICAgICAgICAgdmFyIGVfMTIsIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzIgPSBfX3ZhbHVlcyhpbmRpY2VzKSwgaW5kaWNlc18yXzEgPSBpbmRpY2VzXzIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFpbmRpY2VzXzJfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BJbmRleCh0YWJsZU9yTmFtZSwgaW5kZXgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzXzJfMSA9IGluZGljZXNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xMiA9IHsgZXJyb3I6IGVfMTJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGljZXNfMl8xICYmICFpbmRpY2VzXzJfMS5kb25lICYmIChfYSA9IGluZGljZXNfMi5yZXR1cm4pKSBfYS5jYWxsKGluZGljZXNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgdGFibGUgY29udGVudHMuXG4gICAgICogTm90ZTogdGhpcyBvcGVyYXRpb24gdXNlcyBTUUwncyBUUlVOQ0FURSBxdWVyeSB3aGljaCBjYW5ub3QgYmUgcmV2ZXJ0ZWQgaW4gdHJhbnNhY3Rpb25zLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyVGFibGUgPSBmdW5jdGlvbiAodGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlRSVU5DQVRFIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlTmFtZSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRhYmxlcyBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzY2hlbWFzLCBzY2hlbWFOYW1lc1N0cmluZywgdmVyc2lvbiwgc2VsZWN0Vmlld0Ryb3BzUXVlcnksIGRyb3BWaWV3UXVlcmllcywgc2VsZWN0TWF0Vmlld0Ryb3BzUXVlcnksIGRyb3BNYXRWaWV3UXVlcmllcywgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5LCBkcm9wVGFibGVRdWVyaWVzLCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBtZXRhZGF0YS5zY2hlbWE7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2NoZW1hRXhpc3QgPSAhIXNjaGVtYXMuZmluZChmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgPT09IG1ldGFkYXRhLnNjaGVtYTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjaGVtYUV4aXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLnB1c2gobWV0YWRhdGEuc2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hcy5wdXNoKHRoaXMuZHJpdmVyLm9wdGlvbnMuc2NoZW1hIHx8IFwiY3VycmVudF9zY2hlbWEoKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYU5hbWVzU3RyaW5nID0gc2NoZW1hcy5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gXCJjdXJyZW50X3NjaGVtYSgpXCIgPyBuYW1lIDogXCInXCIgKyBuYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCAxMywgLCAxOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRWZXJzaW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHZpZXdzXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIElGIEVYSVNUUyBcXFwiJyB8fCBzY2hlbWFuYW1lIHx8ICdcXFwiLlxcXCInIHx8IHZpZXduYW1lIHx8ICdcXFwiIENBU0NBREU7JyBhcyBcXFwicXVlcnlcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJGUk9NIFxcXCJwZ192aWV3c1xcXCIgV0hFUkUgXFxcInNjaGVtYW5hbWVcXFwiIElOIChcIiArIHNjaGVtYU5hbWVzU3RyaW5nICsgXCIpIEFORCBcXFwidmlld25hbWVcXFwiIE5PVCBJTiAoJ2dlb2dyYXBoeV9jb2x1bW5zJywgJ2dlb21ldHJ5X2NvbHVtbnMnLCAncmFzdGVyX2NvbHVtbnMnLCAncmFzdGVyX292ZXJ2aWV3cycpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RWaWV3RHJvcHNRdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wVmlld1F1ZXJpZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChkcm9wVmlld1F1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZlcnNpb25VdGlscy5pc0dyZWF0ZXJPckVxdWFsKHZlcnNpb24sIFwiOS4zXCIpKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE1hdFZpZXdEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgTUFURVJJQUxJWkVEIFZJRVcgSUYgRVhJU1RTIFxcXCInIHx8IHNjaGVtYW5hbWUgfHwgJ1xcXCIuXFxcIicgfHwgbWF0dmlld25hbWUgfHwgJ1xcXCIgQ0FTQ0FERTsnIGFzIFxcXCJxdWVyeVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkZST00gXFxcInBnX21hdHZpZXdzXFxcIiBXSEVSRSBcXFwic2NoZW1hbmFtZVxcXCIgSU4gKFwiICsgc2NoZW1hTmFtZXNTdHJpbmcgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNlbGVjdE1hdFZpZXdEcm9wc1F1ZXJ5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BNYXRWaWV3UXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BNYXRWaWV3UXVlcmllcy5tYXAoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5KHFbXCJxdWVyeVwiXSk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgSUYgRVhJU1RTIFxcXCInIHx8IHNjaGVtYW5hbWUgfHwgJ1xcXCIuXFxcIicgfHwgdGFibGVuYW1lIHx8ICdcXFwiIENBU0NBREU7JyBhcyBcXFwicXVlcnlcXFwiIEZST00gXFxcInBnX3RhYmxlc1xcXCIgV0hFUkUgXFxcInNjaGVtYW5hbWVcXFwiIElOIChcIiArIHNjaGVtYU5hbWVzU3RyaW5nICsgXCIpIEFORCBcXFwidGFibGVuYW1lXFxcIiBOT1QgSU4gKCdzcGF0aWFsX3JlZl9zeXMnKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBlbnVtIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BFbnVtVHlwZXMoc2NoZW1hTmFtZXNTdHJpbmcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgZW51bSB0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVmlld3MgPSBmdW5jdGlvbiAodmlld05hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoYXNUYWJsZSwgY3VycmVudERhdGFiYXNlLCBjdXJyZW50U2NoZW1hLCB2aWV3c0NvbmRpdGlvbiwgcXVlcnksIGRiVmlld3M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRoaXMuZ2V0VHlwZW9ybU1ldGFkYXRhVGFibGVOYW1lKCkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFibGUgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1RhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50RGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhYmFzZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q3VycmVudFNjaGVtYSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjaGVtYSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdzQ29uZGl0aW9uID0gdmlld05hbWVzLmxlbmd0aCA9PT0gMCA/IFwiMT0xXCIgOiB2aWV3TmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh0YWJsZU5hbWUpIHsgcmV0dXJuIF90aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZU5hbWUpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjaGVtYSA9IF9hLnNjaGVtYSwgdGFibGVOYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IF90aGlzLmRyaXZlci5vcHRpb25zLnNjaGVtYSB8fCBjdXJyZW50U2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIoXFxcInRcXFwiLlxcXCJzY2hlbWFcXFwiID0gJ1wiICsgc2NoZW1hICsgXCInIEFORCBcXFwidFxcXCIuXFxcIm5hbWVcXFwiID0gJ1wiICsgdGFibGVOYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IFwiU0VMRUNUIFxcXCJ0XFxcIi4qIEZST00gXCIgKyB0aGlzLmVzY2FwZVBhdGgodGhpcy5nZXRUeXBlb3JtTWV0YWRhdGFUYWJsZU5hbWUoKSkgKyBcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY2F0YWxvZ1xcXCIuXFxcInBnX2NsYXNzXFxcIiBcXFwiY1xcXCIgT04gXFxcImNcXFwiLlxcXCJyZWxuYW1lXFxcIiA9IFxcXCJ0XFxcIi5cXFwibmFtZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwiblxcXCIgT04gXFxcIm5cXFwiLlxcXCJvaWRcXFwiID0gXFxcImNcXFwiLlxcXCJyZWxuYW1lc3BhY2VcXFwiIEFORCBcXFwiblxcXCIuXFxcIm5zcG5hbWVcXFwiID0gXFxcInRcXFwiLlxcXCJzY2hlbWFcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwidFxcXCIuXFxcInR5cGVcXFwiIElOICgnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXICsgXCInLCAnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyArIFwiJykgXCIgKyAodmlld3NDb25kaXRpb24gPyBcIkFORCAoXCIgKyB2aWV3c0NvbmRpdGlvbiArIFwiKVwiIDogXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBkYlZpZXdzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRiVmlld3MubWFwKGZ1bmN0aW9uIChkYlZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgVmlldygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gZGJWaWV3W1wic2NoZW1hXCJdID09PSBjdXJyZW50U2NoZW1hICYmICFfdGhpcy5kcml2ZXIub3B0aW9ucy5zY2hlbWEgPyB1bmRlZmluZWQgOiBkYlZpZXdbXCJzY2hlbWFcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGF0YWJhc2UgPSBjdXJyZW50RGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuc2NoZW1hID0gZGJWaWV3W1wic2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Lm5hbWUgPSBfdGhpcy5kcml2ZXIuYnVpbGRUYWJsZU5hbWUoZGJWaWV3W1wibmFtZVwiXSwgc2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5leHByZXNzaW9uID0gZGJWaWV3W1widmFsdWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcubWF0ZXJpYWxpemVkID0gZGJWaWV3W1widHlwZVwiXSA9PT0gTWV0YWRhdGFUYWJsZVR5cGUuTUFURVJJQUxJWkVEX1ZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBhbGwgdGFibGVzICh3aXRoIGdpdmVuIG5hbWVzKSBmcm9tIHRoZSBkYXRhYmFzZSBhbmQgY3JlYXRlcyBhIFRhYmxlIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVGFibGVzID0gZnVuY3Rpb24gKHRhYmxlTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTY2hlbWEsIGN1cnJlbnREYXRhYmFzZSwgZGJUYWJsZXMsIHRhYmxlc1NxbCwgX2EsIF9iLCBfYywgX2QsIHRhYmxlc0NvbmRpdGlvbiwgdGFibGVzU3FsLCBfZSwgX2YsIF9nLCBfaCwgY29sdW1uc0NvbmRpdGlvbiwgY29sdW1uc1NxbCwgY29uc3RyYWludHNDb25kaXRpb24sIGNvbnN0cmFpbnRzU3FsLCBpbmRpY2VzU3FsLCBmb3JlaWduS2V5c0NvbmRpdGlvbiwgaGFzUmVsaXNwYXJ0aXRpb25Db2x1bW4sIGlzUGFydGl0aW9uQ29uZGl0aW9uLCBmb3JlaWduS2V5c1NxbCwgX2osIGRiQ29sdW1ucywgZGJDb25zdHJhaW50cywgZGJJbmRpY2VzLCBkYkZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2spIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9rLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRhYmxlcyBnaXZlbiB0aGVuIG5vIG5lZWQgdG8gcHJvY2VlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlTmFtZXMgJiYgdGFibGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50U2NoZW1hKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2NoZW1hID0gX2suc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDdXJyZW50RGF0YWJhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRhYmFzZSA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiVGFibGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0YWJsZU5hbWVzKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlc1NxbCA9IFwiU0VMRUNUIFxcXCJ0YWJsZV9zY2hlbWFcXFwiLCBcXFwidGFibGVfbmFtZVxcXCIgRlJPTSBcXFwiaW5mb3JtYXRpb25fc2NoZW1hXFxcIi5cXFwidGFibGVzXFxcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSAoX2EgPSBkYlRhYmxlcy5wdXNoKS5hcHBseTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gW2RiVGFibGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kID0gW1tdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkodGFibGVzU3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmFwcGx5KF9hLCBfYy5jb25jYXQoW19fc3ByZWFkQXJyYXkuYXBwbHkodm9pZCAwLCBfZC5jb25jYXQoW19fcmVhZC5hcHBseSh2b2lkIDAsIFtfay5zZW50KCldKSwgZmFsc2VdKSldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzQ29uZGl0aW9uID0gdGFibGVOYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhYmxlTmFtZSkgeyByZXR1cm4gX3RoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlTmFtZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZU5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgKHNjaGVtYSB8fCBjdXJyZW50U2NoZW1hKSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgdGFibGVOYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNTcWwgPSBcIlNFTEVDVCBcXFwidGFibGVfc2NoZW1hXFxcIiwgXFxcInRhYmxlX25hbWVcXFwiIEZST00gXFxcImluZm9ybWF0aW9uX3NjaGVtYVxcXCIuXFxcInRhYmxlc1xcXCIgV0hFUkUgXCIgKyB0YWJsZXNDb25kaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBfZiA9IChfZSA9IGRiVGFibGVzLnB1c2gpLmFwcGx5O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2cgPSBbZGJUYWJsZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2ggPSBbW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeSh0YWJsZXNTcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2YuYXBwbHkoX2UsIF9nLmNvbmNhdChbX19zcHJlYWRBcnJheS5hcHBseSh2b2lkIDAsIF9oLmNvbmNhdChbX19yZWFkLmFwcGx5KHZvaWQgMCwgW19rLnNlbnQoKV0pLCBmYWxzZV0pKV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9rLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFibGVzIHdlcmUgbm90IGZvdW5kIGluIHRoZSBkYiwgbm8gbmVlZCB0byBwcm9jZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJUYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNDb25kaXRpb24gPSBkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlX3NjaGVtYSA9IF9hLnRhYmxlX3NjaGVtYSwgdGFibGVfbmFtZSA9IF9hLnRhYmxlX25hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJ0YWJsZV9zY2hlbWFcXFwiID0gJ1wiICsgdGFibGVfc2NoZW1hICsgXCInIEFORCBcXFwidGFibGVfbmFtZVxcXCIgPSAnXCIgKyB0YWJsZV9uYW1lICsgXCInKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zU3FsID0gXCJTRUxFQ1QgY29sdW1ucy4qLCBwZ19jYXRhbG9nLmNvbF9kZXNjcmlwdGlvbigoJ1xcXCInIHx8IHRhYmxlX2NhdGFsb2cgfHwgJ1xcXCIuXFxcIicgfHwgdGFibGVfc2NoZW1hIHx8ICdcXFwiLlxcXCInIHx8IHRhYmxlX25hbWUgfHwgJ1xcXCInKTo6cmVnY2xhc3M6Om9pZCwgb3JkaW5hbF9wb3NpdGlvbikgQVMgZGVzY3JpcHRpb24sIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIignXFxcIicgfHwgXFxcInVkdF9zY2hlbWFcXFwiIHx8ICdcXFwiLlxcXCInIHx8IFxcXCJ1ZHRfbmFtZVxcXCIgfHwgJ1xcXCInKTo6XFxcInJlZ3R5cGVcXFwiIEFTIFxcXCJyZWd0eXBlXFxcIiwgcGdfY2F0YWxvZy5mb3JtYXRfdHlwZShcXFwiY29sX2F0dHJcXFwiLlxcXCJhdHR0eXBpZFxcXCIsIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dHR5cG1vZFxcXCIpIEFTIFxcXCJmb3JtYXRfdHlwZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRlJPTSBcXFwiaW5mb3JtYXRpb25fc2NoZW1hXFxcIi5cXFwiY29sdW1uc1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTEVGVCBKT0lOIFxcXCJwZ19jYXRhbG9nXFxcIi5cXFwicGdfYXR0cmlidXRlXFxcIiBBUyBcXFwiY29sX2F0dHJcXFwiIE9OIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dG5hbWVcXFwiID0gXFxcImNvbHVtbnNcXFwiLlxcXCJjb2x1bW5fbmFtZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQU5EIFxcXCJjb2xfYXR0clxcXCIuXFxcImF0dHJlbGlkXFxcIiA9ICggXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU0VMRUNUIFxcXCJjbHNcXFwiLlxcXCJvaWRcXFwiIEZST00gXFxcInBnX2NhdGFsb2dcXFwiLlxcXCJwZ19jbGFzc1xcXCIgQVMgXFxcImNsc1xcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTEVGVCBKT0lOIFxcXCJwZ19jYXRhbG9nXFxcIi5cXFwicGdfbmFtZXNwYWNlXFxcIiBBUyBcXFwibnNcXFwiIE9OIFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwiY2xzXFxcIi5cXFwicmVsbmFtZXNwYWNlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJXSEVSRSBcXFwiY2xzXFxcIi5cXFwicmVsbmFtZVxcXCIgPSBcXFwiY29sdW1uc1xcXCIuXFxcInRhYmxlX25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFORCBcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiA9IFxcXCJjb2x1bW5zXFxcIi5cXFwidGFibGVfc2NoZW1hXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIldIRVJFIFwiICsgY29sdW1uc0NvbmRpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzQ29uZGl0aW9uID0gZGJUYWJsZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZV9zY2hlbWEgPSBfYS50YWJsZV9zY2hlbWEsIHRhYmxlX25hbWUgPSBfYS50YWJsZV9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIihcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiA9ICdcIiArIHRhYmxlX3NjaGVtYSArIFwiJyBBTkQgXFxcInRcXFwiLlxcXCJyZWxuYW1lXFxcIiA9ICdcIiArIHRhYmxlX25hbWUgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzU3FsID0gXCJTRUxFQ1QgXFxcIm5zXFxcIi5cXFwibnNwbmFtZVxcXCIgQVMgXFxcInRhYmxlX3NjaGVtYVxcXCIsIFxcXCJ0XFxcIi5cXFwicmVsbmFtZVxcXCIgQVMgXFxcInRhYmxlX25hbWVcXFwiLCBcXFwiY25zdFxcXCIuXFxcImNvbm5hbWVcXFwiIEFTIFxcXCJjb25zdHJhaW50X25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwZ19nZXRfY29uc3RyYWludGRlZihcXFwiY25zdFxcXCIuXFxcIm9pZFxcXCIpIEFTIFxcXCJleHByZXNzaW9uXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ0FTRSBcXFwiY25zdFxcXCIuXFxcImNvbnR5cGVcXFwiIFdIRU4gJ3AnIFRIRU4gJ1BSSU1BUlknIFdIRU4gJ3UnIFRIRU4gJ1VOSVFVRScgV0hFTiAnYycgVEhFTiAnQ0hFQ0snIFdIRU4gJ3gnIFRIRU4gJ0VYQ0xVREUnIEVORCBBUyBcXFwiY29uc3RyYWludF90eXBlXFxcIiwgXFxcImFcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZST00gXFxcInBnX2NvbnN0cmFpbnRcXFwiIFxcXCJjbnN0XFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19jbGFzc1xcXCIgXFxcInRcXFwiIE9OIFxcXCJ0XFxcIi5cXFwib2lkXFxcIiA9IFxcXCJjbnN0XFxcIi5cXFwiY29ucmVsaWRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5zXFxcIiBPTiBcXFwibnNcXFwiLlxcXCJvaWRcXFwiID0gXFxcImNuc3RcXFwiLlxcXCJjb25uYW1lc3BhY2VcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkxFRlQgSk9JTiBcXFwicGdfYXR0cmlidXRlXFxcIiBcXFwiYVxcXCIgT04gXFxcImFcXFwiLlxcXCJhdHRyZWxpZFxcXCIgPSBcXFwiY25zdFxcXCIuXFxcImNvbnJlbGlkXFxcIiBBTkQgXFxcImFcXFwiLlxcXCJhdHRudW1cXFwiID0gQU5ZIChcXFwiY25zdFxcXCIuXFxcImNvbmtleVxcXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwidFxcXCIuXFxcInJlbGtpbmRcXFwiIElOICgncicsICdwJykgQU5EIChcIiArIGNvbnN0cmFpbnRzQ29uZGl0aW9uICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1NxbCA9IFwiU0VMRUNUIFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9zY2hlbWFcXFwiLCBcXFwidFxcXCIuXFxcInJlbG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9uYW1lXFxcIiwgXFxcImlcXFwiLlxcXCJyZWxuYW1lXFxcIiBBUyBcXFwiY29uc3RyYWludF9uYW1lXFxcIiwgXFxcImFcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDQVNFIFxcXCJpeFxcXCIuXFxcImluZGlzdW5pcXVlXFxcIiBXSEVOICd0JyBUSEVOICdUUlVFJyBFTFNFJ0ZBTFNFJyBFTkQgQVMgXFxcImlzX3VuaXF1ZVxcXCIsIHBnX2dldF9leHByKFxcXCJpeFxcXCIuXFxcImluZHByZWRcXFwiLCBcXFwiaXhcXFwiLlxcXCJpbmRyZWxpZFxcXCIpIEFTIFxcXCJjb25kaXRpb25cXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwidHlwZXNcXFwiLlxcXCJ0eXBuYW1lXFxcIiBBUyBcXFwidHlwZV9uYW1lXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJGUk9NIFxcXCJwZ19jbGFzc1xcXCIgXFxcInRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX2luZGV4XFxcIiBcXFwiaXhcXFwiIE9OIFxcXCJpeFxcXCIuXFxcImluZHJlbGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19hdHRyaWJ1dGVcXFwiIFxcXCJhXFxcIiBPTiBcXFwiYVxcXCIuXFxcImF0dHJlbGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiAgQU5EIFxcXCJhXFxcIi5cXFwiYXR0bnVtXFxcIiA9IEFOWSAoXFxcIml4XFxcIi5cXFwiaW5ka2V5XFxcIikgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwibnNcXFwiIE9OIFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwidFxcXCIuXFxcInJlbG5hbWVzcGFjZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY2xhc3NcXFwiIFxcXCJpXFxcIiBPTiBcXFwiaVxcXCIuXFxcIm9pZFxcXCIgPSBcXFwiaXhcXFwiLlxcXCJpbmRleHJlbGlkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ190eXBlXFxcIiBcXFwidHlwZXNcXFwiIE9OIFxcXCJ0eXBlc1xcXCIuXFxcIm9pZFxcXCIgPSBcXFwiYVxcXCIuXFxcImF0dHR5cGlkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJMRUZUIEpPSU4gXFxcInBnX2NvbnN0cmFpbnRcXFwiIFxcXCJjbnN0XFxcIiBPTiBcXFwiY25zdFxcXCIuXFxcImNvbm5hbWVcXFwiID0gXFxcImlcXFwiLlxcXCJyZWxuYW1lXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFUkUgXFxcInRcXFwiLlxcXCJyZWxraW5kXFxcIiBJTiAoJ3InLCAncCcpIEFORCBcXFwiY25zdFxcXCIuXFxcImNvbnR5cGVcXFwiIElTIE5VTEwgQU5EIChcIiArIGNvbnN0cmFpbnRzQ29uZGl0aW9uICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNDb25kaXRpb24gPSBkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlX3NjaGVtYSA9IF9hLnRhYmxlX3NjaGVtYSwgdGFibGVfbmFtZSA9IF9hLnRhYmxlX25hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiID0gJ1wiICsgdGFibGVfc2NoZW1hICsgXCInIEFORCBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiA9ICdcIiArIHRhYmxlX25hbWUgKyBcIicpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaGFzU3VwcG9ydEZvclBhcnRpdGlvbmVkVGFibGVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNSZWxpc3BhcnRpdGlvbkNvbHVtbiA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFydGl0aW9uQ29uZGl0aW9uID0gaGFzUmVsaXNwYXJ0aXRpb25Db2x1bW4gPyBcIiBBTkQgXFxcImNsXFxcIi5cXFwicmVsaXNwYXJ0aXRpb25cXFwiID0gJ2YnXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXNTcWwgPSBcIlNFTEVDVCBcXFwiY29uXFxcIi5cXFwiY29ubmFtZVxcXCIgQVMgXFxcImNvbnN0cmFpbnRfbmFtZVxcXCIsIFxcXCJjb25cXFwiLlxcXCJuc3BuYW1lXFxcIiBBUyBcXFwidGFibGVfc2NoZW1hXFxcIiwgXFxcImNvblxcXCIuXFxcInJlbG5hbWVcXFwiIEFTIFxcXCJ0YWJsZV9uYW1lXFxcIiwgXFxcImF0dDJcXFwiLlxcXCJhdHRuYW1lXFxcIiBBUyBcXFwiY29sdW1uX25hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwibnNcXFwiLlxcXCJuc3BuYW1lXFxcIiBBUyBcXFwicmVmZXJlbmNlZF90YWJsZV9zY2hlbWFcXFwiLCBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiBBUyBcXFwicmVmZXJlbmNlZF90YWJsZV9uYW1lXFxcIiwgXFxcImF0dFxcXCIuXFxcImF0dG5hbWVcXFwiIEFTIFxcXCJyZWZlcmVuY2VkX2NvbHVtbl9uYW1lXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmZkZWx0eXBlXFxcIiBBUyBcXFwib25fZGVsZXRlXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcImNvblxcXCIuXFxcImNvbmZ1cGR0eXBlXFxcIiBBUyBcXFwib25fdXBkYXRlXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmRlZmVycmFibGVcXFwiIEFTIFxcXCJkZWZlcnJhYmxlXFxcIiwgXFxcImNvblxcXCIuXFxcImNvbmRlZmVycmVkXFxcIiBBUyBcXFwiZGVmZXJyZWRcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkZST00gKCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTRUxFQ1QgVU5ORVNUIChcXFwiY29uMVxcXCIuXFxcImNvbmtleVxcXCIpIEFTIFxcXCJwYXJlbnRcXFwiLCBVTk5FU1QgKFxcXCJjb24xXFxcIi5cXFwiY29uZmtleVxcXCIpIEFTIFxcXCJjaGlsZFxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29uZnJlbGlkXFxcIiwgXFxcImNvbjFcXFwiLlxcXCJjb25yZWxpZFxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29ubmFtZVxcXCIsIFxcXCJjb24xXFxcIi5cXFwiY29udHlwZVxcXCIsIFxcXCJuc1xcXCIuXFxcIm5zcG5hbWVcXFwiLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXFwiY2xcXFwiLlxcXCJyZWxuYW1lXFxcIiwgXFxcImNvbjFcXFwiLlxcXCJjb25kZWZlcnJhYmxlXFxcIiwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ0FTRSBXSEVOIFxcXCJjb24xXFxcIi5cXFwiY29uZGVmZXJyZWRcXFwiIFRIRU4gJ0lOSVRJQUxMWSBERUZFUlJFRCcgRUxTRSAnSU5JVElBTExZIElNTUVESUFURScgRU5EIGFzIGNvbmRlZmVycmVkLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDQVNFIFxcXCJjb24xXFxcIi5cXFwiY29uZmRlbHR5cGVcXFwiIFdIRU4gJ2EnIFRIRU4gJ05PIEFDVElPTicgV0hFTiAncicgVEhFTiAnUkVTVFJJQ1QnIFdIRU4gJ2MnIFRIRU4gJ0NBU0NBREUnIFdIRU4gJ24nIFRIRU4gJ1NFVCBOVUxMJyBXSEVOICdkJyBUSEVOICdTRVQgREVGQVVMVCcgRU5EIGFzIFxcXCJjb25mZGVsdHlwZVxcXCIsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNBU0UgXFxcImNvbjFcXFwiLlxcXCJjb25mdXBkdHlwZVxcXCIgV0hFTiAnYScgVEhFTiAnTk8gQUNUSU9OJyBXSEVOICdyJyBUSEVOICdSRVNUUklDVCcgV0hFTiAnYycgVEhFTiAnQ0FTQ0FERScgV0hFTiAnbicgVEhFTiAnU0VUIE5VTEwnIFdIRU4gJ2QnIFRIRU4gJ1NFVCBERUZBVUxUJyBFTkQgYXMgXFxcImNvbmZ1cGR0eXBlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJGUk9NIFxcXCJwZ19jbGFzc1xcXCIgXFxcImNsXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19uYW1lc3BhY2VcXFwiIFxcXCJuc1xcXCIgT04gXFxcImNsXFxcIi5cXFwicmVsbmFtZXNwYWNlXFxcIiA9IFxcXCJuc1xcXCIuXFxcIm9pZFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfY29uc3RyYWludFxcXCIgXFxcImNvbjFcXFwiIE9OIFxcXCJjb24xXFxcIi5cXFwiY29ucmVsaWRcXFwiID0gXFxcImNsXFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFUkUgXFxcImNvbjFcXFwiLlxcXCJjb250eXBlXFxcIiA9ICdmJyBBTkQgKFwiICsgZm9yZWlnbktleXNDb25kaXRpb24gKyBcIikgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIikgXFxcImNvblxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfYXR0cmlidXRlXFxcIiBcXFwiYXR0XFxcIiBPTiBcXFwiYXR0XFxcIi5cXFwiYXR0cmVsaWRcXFwiID0gXFxcImNvblxcXCIuXFxcImNvbmZyZWxpZFxcXCIgQU5EIFxcXCJhdHRcXFwiLlxcXCJhdHRudW1cXFwiID0gXFxcImNvblxcXCIuXFxcImNoaWxkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiSU5ORVIgSk9JTiBcXFwicGdfY2xhc3NcXFwiIFxcXCJjbFxcXCIgT04gXFxcImNsXFxcIi5cXFwib2lkXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJjb25mcmVsaWRcXFwiIFwiICsgaXNQYXJ0aXRpb25Db25kaXRpb24pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5zXFxcIiBPTiBcXFwiY2xcXFwiLlxcXCJyZWxuYW1lc3BhY2VcXFwiID0gXFxcIm5zXFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19hdHRyaWJ1dGVcXFwiIFxcXCJhdHQyXFxcIiBPTiBcXFwiYXR0MlxcXCIuXFxcImF0dHJlbGlkXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJjb25yZWxpZFxcXCIgQU5EIFxcXCJhdHQyXFxcIi5cXFwiYXR0bnVtXFxcIiA9IFxcXCJjb25cXFwiLlxcXCJwYXJlbnRcXFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoY29sdW1uc1NxbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoY29uc3RyYWludHNTcWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KGluZGljZXNTcWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KGZvcmVpZ25LZXlzU3FsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9qID0gX19yZWFkLmFwcGx5KHZvaWQgMCwgW19rLnNlbnQoKSwgNF0pLCBkYkNvbHVtbnMgPSBfalswXSwgZGJDb25zdHJhaW50cyA9IF9qWzFdLCBkYkluZGljZXMgPSBfalsyXSwgZGJGb3JlaWduS2V5cyA9IF9qWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlcyBmb3IgbG9hZGVkIHRhYmxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKGRiVGFibGVzLm1hcChmdW5jdGlvbiAoZGJUYWJsZSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIGdldFNjaGVtYUZyb21LZXksIHNjaGVtYSwgX2EsIHRhYmxlVW5pcXVlQ29uc3RyYWludHMsIHRhYmxlQ2hlY2tDb25zdHJhaW50cywgdGFibGVFeGNsdXNpb25Db25zdHJhaW50cywgdGFibGVGb3JlaWduS2V5Q29uc3RyYWludHMsIHRhYmxlSW5kZXhDb25zdHJhaW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBuZXcgVGFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbUtleSA9IGZ1bmN0aW9uIChkYk9iamVjdCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGJPYmplY3Rba2V5XSA9PT0gY3VycmVudFNjaGVtYSAmJiAoIV90aGlzLmRyaXZlci5vcHRpb25zLnNjaGVtYSB8fCBfdGhpcy5kcml2ZXIub3B0aW9ucy5zY2hlbWEgPT09IGN1cnJlbnRTY2hlbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRiT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGdldFNjaGVtYUZyb21LZXkoZGJUYWJsZSwgXCJ0YWJsZV9zY2hlbWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmRhdGFiYXNlID0gY3VycmVudERhdGFiYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zY2hlbWEgPSBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lID0gdGhpcy5kcml2ZXIuYnVpbGRUYWJsZU5hbWUoZGJUYWJsZVtcInRhYmxlX25hbWVcIl0sIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW5zIGZyb20gdGhlIGxvYWRlZCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRiQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGRiQ29sdW1uKSB7IHJldHVybiAoZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdID09PSBkYlRhYmxlW1widGFibGVfbmFtZVwiXSAmJiBkYkNvbHVtbltcInRhYmxlX3NjaGVtYVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX3NjaGVtYVwiXSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZGJDb2x1bW4pIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQ29uc3RyYWludHMsIHRhYmxlQ29sdW1uLCBuYW1lXzEsIGJ1aWx0RW51bU5hbWUsIGVudW1OYW1lLCBzcWwsIHJlc3VsdHMsIHR5cGUsIGdlb21ldHJ5Q29sdW1uU3FsLCByZXN1bHRzLCBnZW9ncmFwaHlDb2x1bW5TcWwsIHJlc3VsdHMsIGxlbmd0aF8xLCBtYXRjaCwgdW5pcXVlQ29uc3RyYWludHMsIGlzQ29uc3RyYWludENvbXBvc2l0ZSwgc2VyaWFsRGVmYXVsdE5hbWUsIHNlcmlhbERlZmF1bHRQYXRoLCBkZWZhdWx0V2l0aG91dFF1b3RlcywgYXNFeHByZXNzaW9uUXVlcnksIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uQ29uc3RyYWludHMgPSBkYkNvbnN0cmFpbnRzLmZpbHRlcihmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb2x1bW5fbmFtZVwiXSA9PT0gZGJDb2x1bW5bXCJjb2x1bW5fbmFtZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5uYW1lID0gZGJDb2x1bW5bXCJjb2x1bW5fbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gZGJDb2x1bW5bXCJyZWd0eXBlXCJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29sdW1uLnR5cGUgPT09IFwibnVtZXJpY1wiIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwiZGVjaW1hbFwiIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwiZmxvYXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlc2UgcHJvcGVydGllcyB3YXMgc2V0LCBhbmQgYW5vdGhlciB3YXMgbm90LCBQb3N0Z3JlcyBzZXRzICcwJyBpbiB0byB1bnNwZWNpZmllZCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzZXQgJ3VuZGVmaW5lZCcgaW4gdG8gdW5zcGVjaWZpZWQgcHJvcGVydHkgdG8gYXZvaWQgY2hhbmdpbmcgY29sdW1uIG9uIHN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl0gIT09IG51bGwgJiYgIXRoaXMuaXNEZWZhdWx0Q29sdW1uUHJlY2lzaW9uKHRhYmxlLCB0YWJsZUNvbHVtbiwgZGJDb2x1bW5bXCJudW1lcmljX3ByZWNpc2lvblwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnByZWNpc2lvbiA9IGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGJDb2x1bW5bXCJudW1lcmljX3NjYWxlXCJdICE9PSBudWxsICYmICF0aGlzLmlzRGVmYXVsdENvbHVtblNjYWxlKHRhYmxlLCB0YWJsZUNvbHVtbiwgZGJDb2x1bW5bXCJudW1lcmljX3NjYWxlXCJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ucHJlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbltcIm51bWVyaWNfc2NhbGVcIl0gIT09IG51bGwgJiYgIXRoaXMuaXNEZWZhdWx0Q29sdW1uU2NhbGUodGFibGUsIHRhYmxlQ29sdW1uLCBkYkNvbHVtbltcIm51bWVyaWNfc2NhbGVcIl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zY2FsZSA9IGRiQ29sdW1uW1wibnVtZXJpY19zY2FsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcIm51bWVyaWNfcHJlY2lzaW9uXCJdICE9PSBudWxsICYmICF0aGlzLmlzRGVmYXVsdENvbHVtblByZWNpc2lvbih0YWJsZSwgdGFibGVDb2x1bW4sIGRiQ29sdW1uW1wibnVtZXJpY19wcmVjaXNpb25cIl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVDb2x1bW4udHlwZSA9PT0gXCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZSB3aXRob3V0IHRpbWUgem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZSB3aXRoIHRpbWUgem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4udHlwZSA9PT0gXCJ0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5wcmVjaXNpb24gPSAhdGhpcy5pc0RlZmF1bHRDb2x1bW5QcmVjaXNpb24odGFibGUsIHRhYmxlQ29sdW1uLCBkYkNvbHVtbltcImRhdGV0aW1lX3ByZWNpc2lvblwiXSkgPyBkYkNvbHVtbltcImRhdGV0aW1lX3ByZWNpc2lvblwiXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGJDb2x1bW5bXCJkYXRhX3R5cGVcIl0gPT09IFwiVVNFUi1ERUZJTkVEXCIgfHwgZGJDb2x1bW5bXCJkYXRhX3R5cGVcIl0gPT09IFwiQVJSQVlcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSh0YWJsZSwgdGFibGVDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGBlbnVtTmFtZWAgaXMgc3BlY2lmaWVkIGJ5IHVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfMSA9IChfYS5zZW50KCkpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRFbnVtTmFtZSA9IHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgdGFibGVDb2x1bW4sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZSA9IGJ1aWx0RW51bU5hbWUgIT09IG5hbWVfMSA/IG5hbWVfMSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlNFTEVDVCBcXFwiZVxcXCIuXFxcImVudW1sYWJlbFxcXCIgQVMgXFxcInZhbHVlXFxcIiBGUk9NIFxcXCJwZ19lbnVtXFxcIiBcXFwiZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX3R5cGVcXFwiIFxcXCJ0XFxcIiBPTiBcXFwidFxcXCIuXFxcIm9pZFxcXCIgPSBcXFwiZVxcXCIuXFxcImVudW10eXBpZFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklOTkVSIEpPSU4gXFxcInBnX25hbWVzcGFjZVxcXCIgXFxcIm5cXFwiIE9OIFxcXCJuXFxcIi5cXFwib2lkXFxcIiA9IFxcXCJ0XFxcIi5cXFwidHlwbmFtZXNwYWNlXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFxcXCJuXFxcIi5cXFwibnNwbmFtZVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORCBcXFwidFxcXCIuXFxcInR5cG5hbWVcXFwiID0gJ1wiICsgKGVudW1OYW1lIHx8IG5hbWVfMSkgKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gXCJlbnVtXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmVudW0gPSByZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZXN1bHRbXCJ2YWx1ZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmVudW1OYW1lID0gZW51bU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbltcImRhdGFfdHlwZVwiXSA9PT0gXCJBUlJBWVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzQXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGFibGVDb2x1bW4udHlwZS5yZXBsYWNlKFwiW11cIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0eXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVDb2x1bW4udHlwZSA9PT0gXCJnZW9tZXRyeVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnlDb2x1bW5TcWwgPSBcIlNFTEVDVCAqIEZST00gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImZfdGFibGVfc2NoZW1hXFxcIiBcXFwidGFibGVfc2NoZW1hXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX3RhYmxlX25hbWVcXFwiIFxcXCJ0YWJsZV9uYW1lXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX2dlb21ldHJ5X2NvbHVtblxcXCIgXFxcImNvbHVtbl9uYW1lXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJzcmlkXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gXFxcImdlb21ldHJ5X2NvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICkgQVMgX1xcbiAgICAgICAgICAgICAgICAgICAgICBXSEVSRVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbHVtbl9uYW1lXFxcIiA9ICdcIiArIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0gKyBcIicgQU5EXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShnZW9tZXRyeUNvbHVtblNxbCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zcGF0aWFsRmVhdHVyZVR5cGUgPSByZXN1bHRzWzBdLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnNyaWQgPSByZXN1bHRzWzBdLnNyaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZUNvbHVtbi50eXBlID09PSBcImdlb2dyYXBoeVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvZ3JhcGh5Q29sdW1uU3FsID0gXCJTRUxFQ1QgKiBGUk9NIChcXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJmX3RhYmxlX3NjaGVtYVxcXCIgXFxcInRhYmxlX3NjaGVtYVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiZl90YWJsZV9uYW1lXFxcIiBcXFwidGFibGVfbmFtZVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiZl9nZW9ncmFwaHlfY29sdW1uXFxcIiBcXFwiY29sdW1uX25hbWVcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInNyaWRcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBcXFwiZ2VvZ3JhcGh5X2NvbHVtbnNcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICkgQVMgX1xcbiAgICAgICAgICAgICAgICAgICAgICBXSEVSRVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNvbHVtbl9uYW1lXFxcIiA9ICdcIiArIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0gKyBcIicgQU5EXFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIGRiQ29sdW1uW1widGFibGVfc2NoZW1hXCJdICsgXCInIEFORFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgZGJDb2x1bW5bXCJ0YWJsZV9uYW1lXCJdICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShnZW9ncmFwaHlDb2x1bW5TcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uc3BhdGlhbEZlYXR1cmVUeXBlID0gcmVzdWx0c1swXS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5zcmlkID0gcmVzdWx0c1swXS5zcmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgb25seSBjb2x1bW5zIHRoYXQgaGF2ZSBsZW5ndGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIud2l0aExlbmd0aENvbHVtblR5cGVzLmluZGV4T2YodGFibGVDb2x1bW4udHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbHVtbi5pc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IC9cXCgoXFxkKylcXCkvLmV4ZWMoZGJDb2x1bW5bXCJmb3JtYXRfdHlwZVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfMSA9IG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGJDb2x1bW5bXCJjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGhcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF8xID0gZGJDb2x1bW5bXCJjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGhcIl0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmxlbmd0aCA9ICF0aGlzLmlzRGVmYXVsdENvbHVtbkxlbmd0aCh0YWJsZSwgdGFibGVDb2x1bW4sIGxlbmd0aF8xKSA/IGxlbmd0aF8xIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc051bGxhYmxlID0gZGJDb2x1bW5bXCJpc19udWxsYWJsZVwiXSA9PT0gXCJZRVNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc1ByaW1hcnkgPSAhIWNvbHVtbkNvbnN0cmFpbnRzLmZpbmQoZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHsgcmV0dXJuIGNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiUFJJTUFSWVwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cyA9IGNvbHVtbkNvbnN0cmFpbnRzLmZpbHRlcihmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludFtcImNvbnN0cmFpbnRfdHlwZVwiXSA9PT0gXCJVTklRVUVcIjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25zdHJhaW50Q29tcG9zaXRlID0gdW5pcXVlQ29uc3RyYWludHMuZXZlcnkoZnVuY3Rpb24gKHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRiQ29uc3RyYWludHMuc29tZShmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7IHJldHVybiBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiVU5JUVVFXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRiQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gdW5pcXVlQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGJDb25zdHJhaW50W1wiY29sdW1uX25hbWVcIl0gIT09IGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzVW5pcXVlID0gdW5pcXVlQ29uc3RyYWludHMubGVuZ3RoID4gMCAmJiAhaXNDb25zdHJhaW50Q29tcG9zaXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19pZGVudGl0eSA9PT0gXCJZRVNcIikgeyAvLyBQb3N0Z3JlcyAxMCsgSWRlbnRpdHkgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzR2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gXCJpZGVudGl0eVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdICE9PSBudWxsICYmIGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxEZWZhdWx0TmFtZSA9IFwibmV4dHZhbCgnXCIgKyB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKHRhYmxlLCBkYkNvbHVtbltcImNvbHVtbl9uYW1lXCJdKSArIFwiJzo6cmVnY2xhc3MpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbERlZmF1bHRQYXRoID0gXCJuZXh0dmFsKCdcIiArIHRoaXMuYnVpbGRTZXF1ZW5jZVBhdGgodGFibGUsIGRiQ29sdW1uW1wiY29sdW1uX25hbWVcIl0pICsgXCInOjpyZWdjbGFzcylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFdpdGhvdXRRdW90ZXMgPSBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdLnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFdpdGhvdXRRdW90ZXMgPT09IHNlcmlhbERlZmF1bHROYW1lIHx8IGRlZmF1bHRXaXRob3V0UXVvdGVzID09PSBzZXJpYWxEZWZhdWx0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdID09PSBcImdlbl9yYW5kb21fdXVpZCgpXCIgfHwgL151dWlkX2dlbmVyYXRlX3ZcXGRcXChcXCkvLnRlc3QoZGJDb2x1bW5bXCJjb2x1bW5fZGVmYXVsdFwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmlzR2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9IFwidXVpZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0gPT09IFwibm93KClcIiB8fCBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdLmluZGV4T2YoXCInbm93Jzo6dGV4dFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmRlZmF1bHQgPSBkYkNvbHVtbltcImNvbHVtbl9kZWZhdWx0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZGVmYXVsdCA9IGRiQ29sdW1uW1wiY29sdW1uX2RlZmF1bHRcIl0ucmVwbGFjZSgvOjpbXFx3XFxzXFwuXFxbXFxdXFxcIl0rL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZGVmYXVsdCA9IHRhYmxlQ29sdW1uLmRlZmF1bHQucmVwbGFjZSgvXigtP1xcZCspJC8sIFwiJyQxJ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkYkNvbHVtbltcImlzX2dlbmVyYXRlZFwiXSA9PT0gXCJBTFdBWVNcIiAmJiBkYkNvbHVtbltcImdlbmVyYXRpb25fZXhwcmVzc2lvblwiXSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHBvc3RncmVzIHRoZXJlIGlzIG5vIFZJUlRVQUwgZ2VuZXJhdGVkIGNvbHVtbiB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9IFwiU1RPUkVEXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNFeHByZXNzaW9uUXVlcnkgPSBcIlNFTEVDVCAqIEZST00gXFxcInR5cGVvcm1fbWV0YWRhdGFcXFwiIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFwiIFdIRVJFIFxcXCJ0YWJsZVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfbmFtZVwiXSArIFwiJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChcIiBBTkQgXFxcIm5hbWVcXFwiID0gJ1wiICsgdGFibGVDb2x1bW4ubmFtZSArIFwiJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChcIiBBTkQgXFxcInNjaGVtYVxcXCIgPSAnXCIgKyBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdICsgXCInXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFwiIEFORCBcXFwiZGF0YWJhc2VcXFwiID0gJ1wiICsgdGhpcy5kcml2ZXIuZGF0YWJhc2UgKyBcIidcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoXCIgQU5EIFxcXCJ0eXBlXFxcIiA9ICdcIiArIE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4gKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShhc0V4cHJlc3Npb25RdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0gJiYgcmVzdWx0c1swXS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5hc0V4cHJlc3Npb24gPSByZXN1bHRzWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uYXNFeHByZXNzaW9uID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmNvbW1lbnQgPSBkYkNvbHVtbltcImRlc2NyaXB0aW9uXCJdID8gZGJDb2x1bW5bXCJkZXNjcmlwdGlvblwiXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb2x1bW5bXCJjaGFyYWN0ZXJfc2V0X25hbWVcIl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmNoYXJzZXQgPSBkYkNvbHVtbltcImNoYXJhY3Rlcl9zZXRfbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb2x1bW5bXCJjb2xsYXRpb25fbmFtZVwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uY29sbGF0aW9uID0gZGJDb2x1bW5bXCJjb2xsYXRpb25fbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGFibGVDb2x1bW5dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBjb2x1bW5zIGZyb20gdGhlIGxvYWRlZCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmNvbHVtbnMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlVW5pcXVlQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiVU5JUVVFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKGRiQ29uc3RyYWludCkgeyByZXR1cm4gZGJDb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUudW5pcXVlcyA9IHRhYmxlVW5pcXVlQ29uc3RyYWludHMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5pcXVlcyA9IGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkMpIHsgcmV0dXJuIGRiQ1tcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiB1bmlxdWVzLm1hcChmdW5jdGlvbiAodSkgeyByZXR1cm4gdVtcImNvbHVtbl9uYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNoZWNrQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiQ0hFQ0tcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoZGJDb25zdHJhaW50KSB7IHJldHVybiBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5jaGVja3MgPSB0YWJsZUNoZWNrQ29uc3RyYWludHMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tzID0gZGJDb25zdHJhaW50cy5maWx0ZXIoZnVuY3Rpb24gKGRiQykgeyByZXR1cm4gZGJDW1wiY29uc3RyYWludF9uYW1lXCJdID09PSBjb25zdHJhaW50W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVDaGVjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogY2hlY2tzLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gY1tcImNvbHVtbl9uYW1lXCJdOyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBjb25zdHJhaW50W1wiZXhwcmVzc2lvblwiXS5yZXBsYWNlKC9eXFxzKkNIRUNLXFxzKlxcKCguKilcXClcXHMqJC9pLCBcIiQxXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRXhjbHVzaW9uQ29uc3RyYWludHMgPSBPcm1VdGlscy51bmlxKGRiQ29uc3RyYWludHMuZmlsdGVyKGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGJDb25zdHJhaW50W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGRiVGFibGVbXCJ0YWJsZV9zY2hlbWFcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbnN0cmFpbnRbXCJjb25zdHJhaW50X3R5cGVcIl0gPT09IFwiRVhDTFVERVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uIChkYkNvbnN0cmFpbnQpIHsgcmV0dXJuIGRiQ29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmV4Y2x1c2lvbnMgPSB0YWJsZUV4Y2x1c2lvbkNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUV4Y2x1c2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBjb25zdHJhaW50W1wiZXhwcmVzc2lvblwiXS5zdWJzdHJpbmcoOCkgLy8gdHJpbSBFWENMVURFIGZyb20gc3RhcnQgb2YgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJGb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYkZvcmVpZ25LZXlbXCJ0YWJsZV9uYW1lXCJdID09PSBkYlRhYmxlW1widGFibGVfbmFtZVwiXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiRm9yZWlnbktleVtcInRhYmxlX3NjaGVtYVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX3NjaGVtYVwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXlbXCJjb25zdHJhaW50X25hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cyA9IHRhYmxlRm9yZWlnbktleUNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9yZWlnbktleXMgPSBkYkZvcmVpZ25LZXlzLmZpbHRlcihmdW5jdGlvbiAoZGJGaykgeyByZXR1cm4gZGJGa1tcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gZGJGb3JlaWduS2V5W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlZmVyZW5jZWQgdGFibGUgbG9jYXRlZCBpbiBjdXJyZW50bHkgdXNlZCBzY2hlbWEsIHdlIGRvbid0IG5lZWQgdG8gY29uY2F0IHNjaGVtYSBuYW1lIHRvIHRhYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NoZW1hID0gZ2V0U2NoZW1hRnJvbUtleShkYkZvcmVpZ25LZXksIFwicmVmZXJlbmNlZF90YWJsZV9zY2hlbWFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlZFRhYmxlTmFtZSA9IF90aGlzLmRyaXZlci5idWlsZFRhYmxlTmFtZShkYkZvcmVpZ25LZXlbXCJyZWZlcmVuY2VkX3RhYmxlX25hbWVcIl0sIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGJGb3JlaWduS2V5W1wiY29uc3RyYWludF9uYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBmb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24gKGRiRmspIHsgcmV0dXJuIGRiRmtbXCJjb2x1bW5fbmFtZVwiXTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogcmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZXM6IGZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZGJGaykgeyByZXR1cm4gZGJGa1tcInJlZmVyZW5jZWRfY29sdW1uX25hbWVcIl07IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBkYkZvcmVpZ25LZXlbXCJvbl9kZWxldGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IGRiRm9yZWlnbktleVtcIm9uX3VwZGF0ZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJhYmxlOiBkYkZvcmVpZ25LZXlbXCJkZWZlcnJhYmxlXCJdID8gZGJGb3JlaWduS2V5W1wiZGVmZXJyZWRcIl0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlSW5kZXhDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJJbmRpY2VzLmZpbHRlcihmdW5jdGlvbiAoZGJJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYkluZGV4W1widGFibGVfbmFtZVwiXSA9PT0gZGJUYWJsZVtcInRhYmxlX25hbWVcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkluZGV4W1widGFibGVfc2NoZW1hXCJdID09PSBkYlRhYmxlW1widGFibGVfc2NoZW1hXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wiY29uc3RyYWludF9uYW1lXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5kaWNlcyA9IHRhYmxlSW5kZXhDb25zdHJhaW50cy5tYXAoZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRpY2VzID0gZGJJbmRpY2VzLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhbXCJ0YWJsZV9zY2hlbWFcIl0gPT09IGNvbnN0cmFpbnRbXCJ0YWJsZV9zY2hlbWFcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXhbXCJ0YWJsZV9uYW1lXCJdID09PSBjb25zdHJhaW50W1widGFibGVfbmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmRleFtcImNvbnN0cmFpbnRfbmFtZVwiXSA9PT0gY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RyYWludFtcImNvbnN0cmFpbnRfbmFtZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGlbXCJjb2x1bW5fbmFtZVwiXTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWU6IGNvbnN0cmFpbnRbXCJpc191bmlxdWVcIl0gPT09IFwiVFJVRVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiBjb25zdHJhaW50W1wiY29uZGl0aW9uXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3BhdGlhbDogaW5kaWNlcy5ldmVyeShmdW5jdGlvbiAoaSkgeyByZXR1cm4gX3RoaXMuZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGlbXCJ0eXBlX25hbWVcIl0pID49IDA7IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRnVsbHRleHQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0YWJsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgdGFibGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlU3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjcmVhdGVGb3JlaWduS2V5cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1uRGVmaW5pdGlvbnMgPSB0YWJsZS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5idWlsZENyZWF0ZUNvbHVtblNxbCh0YWJsZSwgY29sdW1uKTsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICB2YXIgc3FsID0gXCJDUkVBVEUgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgKFwiICsgY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgICAgIHRhYmxlLmNvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzVW5pcXVlOyB9KVxuICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGlzVW5pcXVlRXhpc3QgPSB0YWJsZS51bmlxdWVzLnNvbWUoZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gdW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiB1bmlxdWUuY29sdW1uTmFtZXNbMF0gPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgIGlmICghaXNVbmlxdWVFeGlzdClcbiAgICAgICAgICAgICAgICB0YWJsZS51bmlxdWVzLnB1c2gobmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgW2NvbHVtbi5uYW1lXSksXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBbY29sdW1uLm5hbWVdXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHVuaXF1ZXNTcWwgPSB0YWJsZS51bmlxdWVzLm1hcChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaXF1ZU5hbWUgPSB1bmlxdWUubmFtZSA/IHVuaXF1ZS5uYW1lIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZSh0YWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSB1bmlxdWUuY29sdW1uTmFtZXMubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkNPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlTmFtZSArIFwiXFxcIiBVTklRVUUgKFwiICsgY29sdW1uTmFtZXMgKyBcIilcIjtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyB1bmlxdWVzU3FsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWJsZS5jaGVja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGNoZWNrc1NxbCA9IHRhYmxlLmNoZWNrcy5tYXAoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoZWNrTmFtZSA9IGNoZWNrLm5hbWUgPyBjaGVjay5uYW1lIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jaGVja0NvbnN0cmFpbnROYW1lKHRhYmxlLCBjaGVjay5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT05TVFJBSU5UIFxcXCJcIiArIGNoZWNrTmFtZSArIFwiXFxcIiBDSEVDSyAoXCIgKyBjaGVjay5leHByZXNzaW9uICsgXCIpXCI7XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzcWwgKz0gXCIsIFwiICsgY2hlY2tzU3FsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWJsZS5leGNsdXNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBleGNsdXNpb25zU3FsID0gdGFibGUuZXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikge1xuICAgICAgICAgICAgICAgIHZhciBleGNsdXNpb25OYW1lID0gZXhjbHVzaW9uLm5hbWUgPyBleGNsdXNpb24ubmFtZSA6IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGFibGUsIGV4Y2x1c2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT05TVFJBSU5UIFxcXCJcIiArIGV4Y2x1c2lvbk5hbWUgKyBcIlxcXCIgRVhDTFVERSBcIiArIGV4Y2x1c2lvbi5leHByZXNzaW9uO1xuICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBcIiArIGV4Y2x1c2lvbnNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmZvcmVpZ25LZXlzLmxlbmd0aCA+IDAgJiYgY3JlYXRlRm9yZWlnbktleXMpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c1NxbCA9IHRhYmxlLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZmspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmay5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmay5uYW1lKVxuICAgICAgICAgICAgICAgICAgICBmay5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZSh0YWJsZSwgZmsuY29sdW1uTmFtZXMsIF90aGlzLmdldFRhYmxlUGF0aChmayksIGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBcIkNPTlNUUkFJTlQgXFxcIlwiICsgZmsubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBSRUZFUkVOQ0VTIFwiICsgX3RoaXMuZXNjYXBlUGF0aChfdGhpcy5nZXRUYWJsZVBhdGgoZmspKSArIFwiIChcIiArIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICAgICAgICAgIGlmIChmay5vbkRlbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludCArPSBcIiBPTiBERUxFVEUgXCIgKyBmay5vbkRlbGV0ZTtcbiAgICAgICAgICAgICAgICBpZiAoZmsub25VcGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgKz0gXCIgT04gVVBEQVRFIFwiICsgZmsub25VcGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGZrLmRlZmVycmFibGUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgKz0gXCIgREVGRVJSQUJMRSBcIiArIGZrLmRlZmVycmFibGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzcWwgKz0gXCIsIFwiICsgZm9yZWlnbktleXNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5zID0gdGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIGlmIChwcmltYXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcHJpbWFyeUtleU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUodGFibGUsIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkpO1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBDT05TVFJBSU5UIFxcXCJcIiArIHByaW1hcnlLZXlOYW1lICsgXCJcXFwiIFBSSU1BUlkgS0VZIChcIiArIGNvbHVtbk5hbWVzICsgXCIpXCI7XG4gICAgICAgIH1cbiAgICAgICAgc3FsICs9IFwiKVwiO1xuICAgICAgICB0YWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChpdCkgeyByZXR1cm4gaXQuY29tbWVudDsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChpdCkgeyByZXR1cm4gc3FsICs9IFwiOyBDT01NRU5UIE9OIENPTFVNTiBcIiArIF90aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIuXFxcIlwiICsgaXQubmFtZSArIFwiXFxcIiBJUyBcIiArIF90aGlzLmVzY2FwZUNvbW1lbnQoaXQuY29tbWVudCk7IH0pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KHNxbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBQb3N0Z3JlcyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFZlcnNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTSE9XIFNFUlZFUl9WRVJTSU9OXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdFswXVtcInNlcnZlcl92ZXJzaW9uXCJdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCB0YWJsZSBzcWwuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFRhYmxlU3FsID0gZnVuY3Rpb24gKHRhYmxlT3JQYXRoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJEUk9QIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlT3JQYXRoKSk7XG4gICAgfTtcbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVWaWV3U3FsID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgdmFyIG1hdGVyaWFsaXplZENsYXVzZSA9IHZpZXcubWF0ZXJpYWxpemVkID8gXCJNQVRFUklBTElaRUQgXCIgOiBcIlwiO1xuICAgICAgICB2YXIgdmlld05hbWUgPSB0aGlzLmVzY2FwZVBhdGgodmlldyk7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFwiICsgbWF0ZXJpYWxpemVkQ2xhdXNlICsgXCJWSUVXIFwiICsgdmlld05hbWUgKyBcIiBBUyBcIiArIHZpZXcuZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFwiICsgbWF0ZXJpYWxpemVkQ2xhdXNlICsgXCJWSUVXIFwiICsgdmlld05hbWUgKyBcIiBBUyBcIiArIHZpZXcuZXhwcmVzc2lvbih0aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5pbnNlcnRWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2NoZW1hLCBfYSwgc2NoZW1hLCBuYW1lLCB0eXBlLCBleHByZXNzaW9uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY2hlbWEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHZpZXcpLCBzY2hlbWEgPSBfYS5zY2hlbWEsIG5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGN1cnJlbnRTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdmlldy5tYXRlcmlhbGl6ZWQgPyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyA6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gdHlwZW9mIHZpZXcuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHZpZXcuZXhwcmVzc2lvbi50cmltKCkgOiB2aWV3LmV4cHJlc3Npb24odGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHsgdHlwZTogdHlwZSwgc2NoZW1hOiBzY2hlbWEsIG5hbWU6IG5hbWUsIHZhbHVlOiBleHByZXNzaW9uIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlld1NxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHZhciBtYXRlcmlhbGl6ZWRDbGF1c2UgPSB2aWV3Lm1hdGVyaWFsaXplZCA/IFwiTUFURVJJQUxJWkVEIFwiIDogXCJcIjtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkRST1AgXCIgKyBtYXRlcmlhbGl6ZWRDbGF1c2UgKyBcIlZJRVcgXCIgKyB0aGlzLmVzY2FwZVBhdGgodmlldykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbW92ZSB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kZWxldGVWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2NoZW1hLCBfYSwgc2NoZW1hLCBuYW1lLCB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTY2hlbWEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHZpZXcpLCBzY2hlbWEgPSBfYS5zY2hlbWEsIG5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IGN1cnJlbnRTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdmlldy5tYXRlcmlhbGl6ZWQgPyBNZXRhZGF0YVRhYmxlVHlwZS5NQVRFUklBTElaRURfVklFVyA6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoeyB0eXBlOiB0eXBlLCBzY2hlbWE6IHNjaGVtYSwgbmFtZTogbmFtZSB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgRU5VTSB0eXBlIGZyb20gZ2l2ZW4gc2NoZW1hcy5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRW51bVR5cGVzID0gZnVuY3Rpb24gKHNjaGVtYU5hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3REcm9wc1F1ZXJ5LCBkcm9wUXVlcmllcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3REcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVFlQRSBJRiBFWElTVFMgXFxcIicgfHwgbi5uc3BuYW1lIHx8ICdcXFwiLlxcXCInIHx8IHQudHlwbmFtZSB8fCAnXFxcIiBDQVNDQURFOycgYXMgXFxcInF1ZXJ5XFxcIiBGUk9NIFxcXCJwZ190eXBlXFxcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfZW51bVxcXCIgXFxcImVcXFwiIE9OIFxcXCJlXFxcIi5cXFwiZW51bXR5cGlkXFxcIiA9IFxcXCJ0XFxcIi5cXFwib2lkXFxcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJJTk5FUiBKT0lOIFxcXCJwZ19uYW1lc3BhY2VcXFwiIFxcXCJuXFxcIiBPTiBcXFwiblxcXCIuXFxcIm9pZFxcXCIgPSBcXFwidFxcXCIuXFxcInR5cG5hbWVzcGFjZVxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFxcXCJuXFxcIi5cXFwibnNwbmFtZVxcXCIgSU4gKFwiICsgc2NoZW1hTmFtZXMgKyBcIikgR1JPVVAgQlkgXFxcIm5cXFwiLlxcXCJuc3BuYW1lXFxcIiwgXFxcInRcXFwiLlxcXCJ0eXBuYW1lXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0RHJvcHNRdWVyeSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BRdWVyaWVzLm1hcChmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMucXVlcnkocVtcInF1ZXJ5XCJdKTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnVtIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmhhc0VudW1UeXBlID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYSwgZW51bU5hbWUsIHNxbCwgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFibGUpLnNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXNjaGVtYSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEN1cnJlbnRTY2hlbWEoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIGNvbHVtbiwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gXCJTRUxFQ1QgXFxcIm5cXFwiLlxcXCJuc3BuYW1lXFxcIiwgXFxcInRcXFwiLlxcXCJ0eXBuYW1lXFxcIiBGUk9NIFxcXCJwZ190eXBlXFxcIiBcXFwidFxcXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSU5ORVIgSk9JTiBcXFwicGdfbmFtZXNwYWNlXFxcIiBcXFwiblxcXCIgT04gXFxcIm5cXFwiLlxcXCJvaWRcXFwiID0gXFxcInRcXFwiLlxcXCJ0eXBuYW1lc3BhY2VcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcXFwiblxcXCIuXFxcIm5zcG5hbWVcXFwiID0gJ1wiICsgc2NoZW1hICsgXCInIEFORCBcXFwidFxcXCIuXFxcInR5cG5hbWVcXFwiID0gJ1wiICsgZW51bU5hbWUgKyBcIidcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHNxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBFTlVNIHR5cGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUVudW1UeXBlU3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4sIGVudW1OYW1lKSB7XG4gICAgICAgIGlmICghZW51bU5hbWUpXG4gICAgICAgICAgICBlbnVtTmFtZSA9IHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgY29sdW1uKTtcbiAgICAgICAgdmFyIGVudW1WYWx1ZXMgPSBjb2x1bW4uZW51bS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBcIidcIiArIHZhbHVlLnJlcGxhY2UoXCInXCIsIFwiJydcIikgKyBcIidcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFRZUEUgXCIgKyBlbnVtTmFtZSArIFwiIEFTIEVOVU0oXCIgKyBlbnVtVmFsdWVzICsgXCIpXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBFTlVNIHR5cGUgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BFbnVtVHlwZVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uLCBlbnVtTmFtZSkge1xuICAgICAgICBpZiAoIWVudW1OYW1lKVxuICAgICAgICAgICAgZW51bU5hbWUgPSB0aGlzLmJ1aWxkRW51bU5hbWUodGFibGUsIGNvbHVtbik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJEUk9QIFRZUEUgXCIgKyBlbnVtTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY3JlYXRlIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSBpbmRleC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgXCIgKyAoaW5kZXguaXNVbmlxdWUgPyBcIlVOSVFVRSBcIiA6IFwiXCIpICsgXCJJTkRFWCBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIE9OIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIFwiICsgKGluZGV4LmlzU3BhdGlhbCA/IFwiVVNJTkcgR2lTVCBcIiA6IFwiXCIpICsgXCIoXCIgKyBjb2x1bW5zICsgXCIpIFwiICsgKGluZGV4LndoZXJlID8gXCJXSEVSRSBcIiArIGluZGV4LndoZXJlIDogXCJcIikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGRyb3AgaW5kZXggc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgdmFyIGluZGV4TmFtZSA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lLm5hbWUgOiBpbmRleE9yTmFtZTtcbiAgICAgICAgdmFyIHNjaGVtYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKS5zY2hlbWE7XG4gICAgICAgIHJldHVybiBzY2hlbWEgPyBuZXcgUXVlcnkoXCJEUk9QIElOREVYIFxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyBpbmRleE5hbWUgKyBcIlxcXCJcIikgOiBuZXcgUXVlcnkoXCJEUk9QIElOREVYIFxcXCJcIiArIGluZGV4TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgcHJpbWFyeSBrZXkgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVByaW1hcnlLZXlTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIHZhciBwcmltYXJ5S2V5TmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5wcmltYXJ5S2V5TmFtZSh0YWJsZSwgY29sdW1uTmFtZXMpO1xuICAgICAgICB2YXIgY29sdW1uTmFtZXNTdHJpbmcgPSBjb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcIiArIHRoaXMuZXNjYXBlUGF0aCh0YWJsZSkgKyBcIiBBREQgQ09OU1RSQUlOVCBcXFwiXCIgKyBwcmltYXJ5S2V5TmFtZSArIFwiXFxcIiBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lc1N0cmluZyArIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHByaW1hcnkga2V5IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wUHJpbWFyeUtleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSB0YWJsZS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICB2YXIgcHJpbWFyeUtleU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kucHJpbWFyeUtleU5hbWUodGFibGUsIGNvbHVtbk5hbWVzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBwcmltYXJ5S2V5TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgdW5pcXVlIGNvbnN0cmFpbnQgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gdW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4gKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgdW5pcXVlQ29uc3RyYWludC5uYW1lICsgXCJcXFwiIFVOSVFVRSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHVuaXF1ZSBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVW5pcXVlQ29uc3RyYWludFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgdW5pcXVlT3JOYW1lKSB7XG4gICAgICAgIHZhciB1bmlxdWVOYW1lID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUubmFtZSA6IHVuaXF1ZU9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBjaGVjayBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVDaGVja0NvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgQUREIENPTlNUUkFJTlQgXFxcIlwiICsgY2hlY2tDb25zdHJhaW50Lm5hbWUgKyBcIlxcXCIgQ0hFQ0sgKFwiICsgY2hlY2tDb25zdHJhaW50LmV4cHJlc3Npb24gKyBcIilcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCBjaGVjayBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ2hlY2tDb25zdHJhaW50U3FsID0gZnVuY3Rpb24gKHRhYmxlLCBjaGVja09yTmFtZSkge1xuICAgICAgICB2YXIgY2hlY2tOYW1lID0gY2hlY2tPck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNoZWNrID8gY2hlY2tPck5hbWUubmFtZSA6IGNoZWNrT3JOYW1lO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQUxURVIgVEFCTEUgXCIgKyB0aGlzLmVzY2FwZVBhdGgodGFibGUpICsgXCIgRFJPUCBDT05TVFJBSU5UIFxcXCJcIiArIGNoZWNrTmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBjcmVhdGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgc3FsLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUV4Y2x1c2lvbkNvbnN0cmFpbnRTcWwgPSBmdW5jdGlvbiAodGFibGUsIGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIGV4Y2x1c2lvbkNvbnN0cmFpbnQubmFtZSArIFwiXFxcIiBFWENMVURFIFwiICsgZXhjbHVzaW9uQ29uc3RyYWludC5leHByZXNzaW9uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGV4Y2x1c2lvbiBjb25zdHJhaW50IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRXhjbHVzaW9uQ29uc3RyYWludFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZXhjbHVzaW9uT3JOYW1lKSB7XG4gICAgICAgIHZhciBleGNsdXNpb25OYW1lID0gZXhjbHVzaW9uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVFeGNsdXNpb24gPyBleGNsdXNpb25Pck5hbWUubmFtZSA6IGV4Y2x1c2lvbk9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBleGNsdXNpb25OYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBmb3JlaWduIGtleSBzcWwuXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRm9yZWlnbktleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZm9yZWlnbktleSkge1xuICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbiArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4gKyBcIlxcXCJcIjsgfSkuam9pbihcIixcIik7XG4gICAgICAgIHZhciBzcWwgPSBcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIEFERCBDT05TVFJBSU5UIFxcXCJcIiArIGZvcmVpZ25LZXkubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBcIiArXG4gICAgICAgICAgICAoXCJSRUZFUkVOQ0VTIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpKSArIFwiKFwiICsgcmVmZXJlbmNlZENvbHVtbk5hbWVzICsgXCIpXCIpO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5vbkRlbGV0ZSlcbiAgICAgICAgICAgIHNxbCArPSBcIiBPTiBERUxFVEUgXCIgKyBmb3JlaWduS2V5Lm9uRGVsZXRlO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5vblVwZGF0ZSlcbiAgICAgICAgICAgIHNxbCArPSBcIiBPTiBVUERBVEUgXCIgKyBmb3JlaWduS2V5Lm9uVXBkYXRlO1xuICAgICAgICBpZiAoZm9yZWlnbktleS5kZWZlcnJhYmxlKVxuICAgICAgICAgICAgc3FsICs9IFwiIERFRkVSUkFCTEUgXCIgKyBmb3JlaWduS2V5LmRlZmVycmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoc3FsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGZvcmVpZ24ga2V5IHNxbC5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleVNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICB2YXIgZm9yZWlnbktleU5hbWUgPSBmb3JlaWduS2V5T3JOYW1lIGluc3RhbmNlb2YgVGFibGVGb3JlaWduS2V5ID8gZm9yZWlnbktleU9yTmFtZS5uYW1lIDogZm9yZWlnbktleU9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFwiICsgdGhpcy5lc2NhcGVQYXRoKHRhYmxlKSArIFwiIERST1AgQ09OU1RSQUlOVCBcXFwiXCIgKyBmb3JlaWduS2V5TmFtZSArIFwiXFxcIlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBzZXF1ZW5jZSBuYW1lIGZyb20gZ2l2ZW4gdGFibGUgYW5kIGNvbHVtbi5cbiAgICAgKi9cbiAgICBQb3N0Z3Jlc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5idWlsZFNlcXVlbmNlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHZhciB0YWJsZU5hbWUgPSB0aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZSkudGFibGVOYW1lO1xuICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gY29sdW1uT3JOYW1lLm5hbWUgOiBjb2x1bW5Pck5hbWU7XG4gICAgICAgIHZhciBzZXFOYW1lID0gdGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lICsgXCJfc2VxXCI7XG4gICAgICAgIGlmIChzZXFOYW1lLmxlbmd0aCA+IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWF4QWxpYXNMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG5vdGUgZG9lc24ndCB5ZXQgaGFuZGxlIGNvcm5lciBjYXNlcyB3aGVyZSAubGVuZ3RoIGRpZmZlcnMgZnJvbSBudW1iZXIgb2YgVVRGLTggYnl0ZXNcbiAgICAgICAgICAgIHNlcU5hbWUgPSB0YWJsZU5hbWUuc3Vic3RyaW5nKDAsIDI5KSArIFwiX1wiICsgY29sdW1uTmFtZS5zdWJzdHJpbmcoMCwgTWF0aC5tYXgoMjksIDYzIC0gKHRhYmxlLm5hbWUubGVuZ3RoKSAtIDUpKSArIFwiX3NlcVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXFOYW1lO1xuICAgIH07XG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRTZXF1ZW5jZVBhdGggPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbk9yTmFtZSkge1xuICAgICAgICB2YXIgc2NoZW1hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFibGUpLnNjaGVtYTtcbiAgICAgICAgcmV0dXJuIHNjaGVtYSA/IHNjaGVtYSArIFwiLlwiICsgdGhpcy5idWlsZFNlcXVlbmNlTmFtZSh0YWJsZSwgY29sdW1uT3JOYW1lKSA6IHRoaXMuYnVpbGRTZXF1ZW5jZU5hbWUodGFibGUsIGNvbHVtbk9yTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgRU5VTSB0eXBlIG5hbWUgZnJvbSBnaXZlbiB0YWJsZSBhbmQgY29sdW1uLlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmJ1aWxkRW51bU5hbWUgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgd2l0aFNjaGVtYSwgZGlzYWJsZUVzY2FwZSwgdG9PbGQpIHtcbiAgICAgICAgaWYgKHdpdGhTY2hlbWEgPT09IHZvaWQgMCkgeyB3aXRoU2NoZW1hID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YWJsZSksIHNjaGVtYSA9IF9hLnNjaGVtYSwgdGFibGVOYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICB2YXIgZW51bU5hbWUgPSBjb2x1bW4uZW51bU5hbWUgPyBjb2x1bW4uZW51bU5hbWUgOiB0YWJsZU5hbWUgKyBcIl9cIiArIGNvbHVtbi5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIl9lbnVtXCI7XG4gICAgICAgIGlmIChzY2hlbWEgJiYgd2l0aFNjaGVtYSlcbiAgICAgICAgICAgIGVudW1OYW1lID0gc2NoZW1hICsgXCIuXCIgKyBlbnVtTmFtZTtcbiAgICAgICAgaWYgKHRvT2xkKVxuICAgICAgICAgICAgZW51bU5hbWUgPSBlbnVtTmFtZSArIFwiX29sZFwiO1xuICAgICAgICByZXR1cm4gZW51bU5hbWUuc3BsaXQoXCIuXCIpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVFc2NhcGUgPyBpIDogXCJcXFwiXCIgKyBpICsgXCJcXFwiXCI7XG4gICAgICAgIH0pLmpvaW4oXCIuXCIpO1xuICAgIH07XG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0VXNlckRlZmluZWRUeXBlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZSwgY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgc2NoZW1hLCBuYW1lLCByZXN1bHQsIHVkdE5hbWU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhYmxlKSwgc2NoZW1hID0gX2Euc2NoZW1hLCBuYW1lID0gX2EudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhc2NoZW1hKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q3VycmVudFNjaGVtYSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgXFxcInVkdF9zY2hlbWFcXFwiLCBcXFwidWR0X25hbWVcXFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJGUk9NIFxcXCJpbmZvcm1hdGlvbl9zY2hlbWFcXFwiLlxcXCJjb2x1bW5zXFxcIiBXSEVSRSBcXFwidGFibGVfc2NoZW1hXFxcIiA9ICdcIiArIHNjaGVtYSArIFwiJyBBTkQgXFxcInRhYmxlX25hbWVcXFwiID0gJ1wiICsgbmFtZSArIFwiJyBBTkQgXFxcImNvbHVtbl9uYW1lXFxcIj0nXCIgKyBjb2x1bW4ubmFtZSArIFwiJ1wiKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1ZHROYW1lID0gcmVzdWx0WzBdW1widWR0X25hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWR0TmFtZS5pbmRleE9mKFwiX1wiKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkdE5hbWUgPSB1ZHROYW1lLnN1YnN0cigxLCB1ZHROYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHJlc3VsdFswXVtcInVkdF9zY2hlbWFcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHVkdE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIGEgZ2l2ZW4gY29tbWVudCBzbyBpdCdzIHNhZmUgdG8gaW5jbHVkZSBpbiBhIHF1ZXJ5LlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmVzY2FwZUNvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCkge1xuICAgICAgICBpZiAoIWNvbW1lbnQgfHwgY29tbWVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5VTExcIjtcbiAgICAgICAgfVxuICAgICAgICBjb21tZW50ID0gY29tbWVudFxuICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCInJ1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTAwMDAvZywgXCJcIik7IC8vIE51bGwgYnl0ZXMgYXJlbid0IGFsbG93ZWQgaW4gY29tbWVudHNcbiAgICAgICAgcmV0dXJuIFwiJ1wiICsgY29tbWVudCArIFwiJ1wiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXNjYXBlcyBnaXZlbiB0YWJsZSBvciB2aWV3IHBhdGguXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuZXNjYXBlUGF0aCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5kcml2ZXIucGFyc2VUYWJsZU5hbWUodGFyZ2V0KSwgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZU5hbWUgPSBfYS50YWJsZU5hbWU7XG4gICAgICAgIGlmIChzY2hlbWEgJiYgc2NoZW1hICE9PSB0aGlzLmRyaXZlci5zZWFyY2hTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIHNjaGVtYSArIFwiXFxcIi5cXFwiXCIgKyB0YWJsZU5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcXFwiXCIgKyB0YWJsZU5hbWUgKyBcIlxcXCJcIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGFibGUgbmFtZSB3aXRoIHRhYmxlIHNjaGVtYVxuICAgICAqIE5vdGU6IFdpdGhvdXQgJyBvciBcIlxuICAgICAqL1xuICAgIFBvc3RncmVzUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFRhYmxlTmFtZVdpdGhTY2hlbWEgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZU5hbWUsIHNjaGVtYVJlc3VsdCwgc2NoZW1hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGFyZ2V0IGluc3RhbmNlb2YgVGFibGUgPyB0YXJnZXQubmFtZSA6IHRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlTmFtZS5pbmRleE9mKFwiLlwiKSA9PT0gLTEpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJTRUxFQ1QgY3VycmVudF9zY2hlbWEoKVwiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IHNjaGVtYVJlc3VsdFswXVtcImN1cnJlbnRfc2NoZW1hXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHNjaGVtYSArIFwiLlwiICsgdGFibGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGFibGVOYW1lLnNwbGl0KFwiLlwiKVswXSArIFwiLlwiICsgdGFibGVOYW1lLnNwbGl0KFwiLlwiKVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgcXVlcnkgZm9yIGNyZWF0ZSBjb2x1bW4uXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRDcmVhdGVDb2x1bW5TcWwgPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbikge1xuICAgICAgICB2YXIgYyA9IFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5pc0dlbmVyYXRlZCA9PT0gdHJ1ZSAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIikge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaWRlbnRpdHlcIikgeyAvLyBQb3N0Z3JlcyAxMCsgSWRlbnRpdHkgZ2VuZXJhdGVkIGNvbHVtblxuICAgICAgICAgICAgICAgIGMgKz0gXCIgXCIgKyBjb2x1bW4udHlwZSArIFwiIEdFTkVSQVRFRCBCWSBERUZBVUxUIEFTIElERU5USVRZXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gY2xhc3NpYyBTRVJJQUwgcHJpbWFyeSBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiaW50ZWdlclwiIHx8IGNvbHVtbi50eXBlID09PSBcImludFwiIHx8IGNvbHVtbi50eXBlID09PSBcImludDRcIilcbiAgICAgICAgICAgICAgICAgICAgYyArPSBcIiBTRVJJQUxcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwic21hbGxpbnRcIiB8fCBjb2x1bW4udHlwZSA9PT0gXCJpbnQyXCIpXG4gICAgICAgICAgICAgICAgICAgIGMgKz0gXCIgU01BTExTRVJJQUxcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiYmlnaW50XCIgfHwgY29sdW1uLnR5cGUgPT09IFwiaW50OFwiKVxuICAgICAgICAgICAgICAgICAgICBjICs9IFwiIEJJR1NFUklBTFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gXCJlbnVtXCIgfHwgY29sdW1uLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIikge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuYnVpbGRFbnVtTmFtZSh0YWJsZSwgY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNBcnJheSlcbiAgICAgICAgICAgICAgICBjICs9IFwiIGFycmF5XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNvbHVtbi5pc0dlbmVyYXRlZCB8fCBjb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICAgIGMgKz0gXCIgXCIgKyB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZUZ1bGxUeXBlKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ0hBUkFDVEVSIFNFVCwgQ09MTEFURSwgTk9UIE5VTEwgYW5kIERFRkFVTFQgZG8gbm90IGV4aXN0IG9uIGdlbmVyYXRlZCAodmlydHVhbCkgY29sdW1uc1xuICAgICAgICAvLyBBbHNvLCBwb3N0Z3JlcyBvbmx5IHN1cHBvcnRzIHRoZSBzdG9yZWQgZ2VuZXJhdGVkIGNvbHVtbiB0eXBlXG4gICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkVHlwZSA9PT0gXCJTVE9SRURcIiAmJiBjb2x1bW4uYXNFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjICs9IFwiIEdFTkVSQVRFRCBBTFdBWVMgQVMgKFwiICsgY29sdW1uLmFzRXhwcmVzc2lvbiArIFwiKSBTVE9SRURcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY2hhcnNldClcbiAgICAgICAgICAgICAgICBjICs9IFwiIENIQVJBQ1RFUiBTRVQgXFxcIlwiICsgY29sdW1uLmNoYXJzZXQgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sbGF0aW9uKVxuICAgICAgICAgICAgICAgIGMgKz0gXCIgQ09MTEFURSBcXFwiXCIgKyBjb2x1bW4uY29sbGF0aW9uICsgXCJcXFwiXCI7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzTnVsbGFibGUgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgYyArPSBcIiBOT1QgTlVMTFwiO1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmRlZmF1bHQgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgYyArPSBcIiBERUZBVUxUIFwiICsgY29sdW1uLmRlZmF1bHQ7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiICYmICFjb2x1bW4uZGVmYXVsdClcbiAgICAgICAgICAgICAgICBjICs9IFwiIERFRkFVTFQgXCIgKyB0aGlzLmRyaXZlci51dWlkR2VuZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBQb3N0Z3JlU1FMIHNlcnZlciBoYXMgc3VwcG9ydCBmb3IgcGFydGl0aW9uZWQgdGFibGVzXG4gICAgICovXG4gICAgUG9zdGdyZXNRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzU3VwcG9ydEZvclBhcnRpdGlvbmVkVGFibGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIFRSVUUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBXSEVSRSB0YWJsZV9uYW1lID0gJ3BnX2NsYXNzJyBhbmQgY29sdW1uX25hbWUgPSAncmVsaXNwYXJ0aXRpb24nXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBQb3N0Z3Jlc1F1ZXJ5UnVubmVyO1xufShCYXNlUXVlcnlSdW5uZXIpKTtcbmV4cG9ydCB7IFBvc3RncmVzUXVlcnlSdW5uZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UG9zdGdyZXNRdWVyeVJ1bm5lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4vUmVhY3ROYXRpdmVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyT3B0aW9uTm90U2V0RXJyb3JcIjtcbmltcG9ydCB7IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbnZhciBSZWFjdE5hdGl2ZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVhY3ROYXRpdmVEcml2ZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlYWN0TmF0aXZlRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGF0YWJhc2UgPSBfdGhpcy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHNldFxuICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZGF0YWJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IoXCJkYXRhYmFzZVwiKTtcbiAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLmxvY2F0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlck9wdGlvbk5vdFNldEVycm9yKFwibG9jYXRpb25cIik7XG4gICAgICAgIC8vIGxvYWQgc3FsaXRlIHBhY2thZ2VcbiAgICAgICAgX3RoaXMubG9hZERlcGVuZGVuY2llcygpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgY29ubmVjdGlvbiB3aXRoIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlRHJpdmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAob2ssIGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKG9rLCBmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBSZWFjdE5hdGl2ZURyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29ubmVjdGlvbiB3aXRoIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBSZWFjdE5hdGl2ZURyaXZlci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5vcHRpb25zLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBfdGhpcy5vcHRpb25zLmxvY2F0aW9uLFxuICAgICAgICAgICAgfSwgX3RoaXMub3B0aW9ucy5leHRyYSB8fCB7fSk7XG4gICAgICAgICAgICBfdGhpcy5zcWxpdGUub3BlbkRhdGFiYXNlKG9wdGlvbnMsIGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZUNvbm5lY3Rpb24gPSBkYjtcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuYWJsZSBmb3JlaWduIGtleXMgaW4gc3FsaXRlIHRvIG1ha2Ugc3VyZSBhbGwgZm9yZWlnbiBrZXkgcmVsYXRlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtpbmcgcHJvcGVybHkuIHRoaXMgYWxzbyBtYWtlcyBvbkRlbGV0ZSB3b3JrIHdpdGggc3FsaXRlLlxuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OO1wiLCBbXSwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBvayhkYXRhYmFzZUNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgZHJpdmVyIGRlcGVuZGVuY3kgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHksIHRoZW4gdHJ5IHRvIGxvYWQgaXQgdmlhIFwicmVxdWlyZVwiLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlRHJpdmVyLnByb3RvdHlwZS5sb2FkRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHNxbGl0ZSA9IHRoaXMub3B0aW9ucy5kcml2ZXIgfHwgcmVxdWlyZShcInJlYWN0LW5hdGl2ZS1zcWxpdGUtc3RvcmFnZVwiKTtcbiAgICAgICAgICAgIHRoaXMuc3FsaXRlID0gc3FsaXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yKFwiUmVhY3QtTmF0aXZlXCIsIFwicmVhY3QtbmF0aXZlLXNxbGl0ZS1zdG9yYWdlXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3ROYXRpdmVEcml2ZXI7XG59KEFic3RyYWN0U3FsaXRlRHJpdmVyKSk7XG5leHBvcnQgeyBSZWFjdE5hdGl2ZURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFjdE5hdGl2ZURyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyIH0gZnJvbSBcIi4uLy4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJcIjtcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJlc3VsdFwiO1xuLyoqXG4gKiBSdW5zIHF1ZXJpZXMgb24gYSBzaW5nbGUgc3FsaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gKi9cbnZhciBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyLCBfc3VwZXIpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyKGRyaXZlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh0aGlzLmlzUmVsZWFzZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2VDb25uZWN0aW9uLCBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VDb25uZWN0aW9uID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbi5leGVjdXRlU3FsKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBmdW5jdGlvbiAocmF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIHNsb3cgcXVlcmllcyBpZiBtYXhRdWVyeUV4ZWN1dGlvbiB0aW1lIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhRdWVyeUV4ZWN1dGlvblRpbWUgPSBfdGhpcy5kcml2ZXIub3B0aW9ucy5tYXhRdWVyeUV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5RW5kVGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeUV4ZWN1dGlvblRpbWUgPSBxdWVyeUVuZFRpbWUgLSBxdWVyeVN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UXVlcnlFeGVjdXRpb25UaW1lICYmIHF1ZXJ5RXhlY3V0aW9uVGltZSA+IG1heFF1ZXJ5RXhlY3V0aW9uVGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5U2xvdyhxdWVyeUV4ZWN1dGlvblRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpZCBvZiBpbnNlcnRlZCByb3csIGlmIHF1ZXJ5IHdhcyBpbnNlcnQgc3RhdGVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zdWJzdHIoMCwgMTEpID09PSBcIklOU0VSVCBJTlRPXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJhdy5pbnNlcnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93c0FmZmVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFmZmVjdGVkID0gcmF3LnJvd3NBZmZlY3RlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhdy5oYXNPd25Qcm9wZXJ0eSgncm93cycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3LnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMucHVzaChyYXcucm93cy5pdGVtKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmF3ID0gcmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlY29yZHMgPSByZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlU3RydWN0dXJlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2socmVzdWx0LnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeUVycm9yKGVyciwgcXVlcnksIHBhcmFtZXRlcnMsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKG5ldyBRdWVyeUZhaWxlZEVycm9yKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTsgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGFyYW1ldHJpemVzIGdpdmVuIG9iamVjdCBvZiB2YWx1ZXMuIFVzZWQgdG8gY3JlYXRlIGNvbHVtbj12YWx1ZSBxdWVyaWVzLlxuICAgICAqL1xuICAgIFJlYWN0TmF0aXZlUXVlcnlSdW5uZXIucHJvdG90eXBlLnBhcmFtZXRyaXplID0gZnVuY3Rpb24gKG9iamVjdExpdGVyYWwsIHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IHZvaWQgMCkgeyBzdGFydEluZGV4ID0gMDsgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0TGl0ZXJhbCkubWFwKGZ1bmN0aW9uIChrZXksIGluZGV4KSB7IHJldHVybiBcIlxcXCJcIiArIGtleSArIFwiXFxcIlwiICsgXCI9P1wiOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBSZWFjdE5hdGl2ZVF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWN0TmF0aXZlUXVlcnlSdW5uZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9EYXRlVXRpbHNcIjtcbmltcG9ydCB7IFJkYm1zU2NoZW1hQnVpbGRlciB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci9SZGJtc1NjaGVtYUJ1aWxkZXJcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBBcHBseVZhbHVlVHJhbnNmb3JtZXJzIH0gZnJvbSBcIi4uLy4uL3V0aWwvQXBwbHlWYWx1ZVRyYW5zZm9ybWVyc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vRHJpdmVyVXRpbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdmlldy9WaWV3XCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG4vKipcbiAqIE9yZ2FuaXplcyBjb21tdW5pY2F0aW9uIHdpdGggc3FsaXRlIERCTVMuXG4gKi9cbnZhciBBYnN0cmFjdFNxbGl0ZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQWJzdHJhY3RTcWxpdGVEcml2ZXIoY29ubmVjdGlvbikge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUmVwbGljYXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRyZWUgdGFibGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyZWVTdXBwb3J0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgbGlzdCBvZiBzdXBwb3J0ZWQgY29sdW1uIGRhdGEgdHlwZXMgYnkgYSBkcml2ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly93d3cudHV0b3JpYWxzcG9pbnQuY29tL3NxbGl0ZS9zcWxpdGVfZGF0YV90eXBlcy5odG1cbiAgICAgICAgICogQHNlZSBodHRwczovL3NxbGl0ZS5vcmcvZGF0YXR5cGUzLmh0bWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3VwcG9ydGVkRGF0YVR5cGVzID0gW1xuICAgICAgICAgICAgXCJpbnRcIixcbiAgICAgICAgICAgIFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgXCJ0aW55aW50XCIsXG4gICAgICAgICAgICBcInNtYWxsaW50XCIsXG4gICAgICAgICAgICBcIm1lZGl1bWludFwiLFxuICAgICAgICAgICAgXCJiaWdpbnRcIixcbiAgICAgICAgICAgIFwidW5zaWduZWQgYmlnIGludFwiLFxuICAgICAgICAgICAgXCJpbnQyXCIsXG4gICAgICAgICAgICBcImludDhcIixcbiAgICAgICAgICAgIFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgXCJjaGFyYWN0ZXJcIixcbiAgICAgICAgICAgIFwidmFyY2hhclwiLFxuICAgICAgICAgICAgXCJ2YXJ5aW5nIGNoYXJhY3RlclwiLFxuICAgICAgICAgICAgXCJuY2hhclwiLFxuICAgICAgICAgICAgXCJuYXRpdmUgY2hhcmFjdGVyXCIsXG4gICAgICAgICAgICBcIm52YXJjaGFyXCIsXG4gICAgICAgICAgICBcInRleHRcIixcbiAgICAgICAgICAgIFwiY2xvYlwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcImJsb2JcIixcbiAgICAgICAgICAgIFwicmVhbFwiLFxuICAgICAgICAgICAgXCJkb3VibGVcIixcbiAgICAgICAgICAgIFwiZG91YmxlIHByZWNpc2lvblwiLFxuICAgICAgICAgICAgXCJmbG9hdFwiLFxuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICAgICAgXCJib29sZWFuXCIsXG4gICAgICAgICAgICBcImRhdGVcIixcbiAgICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgICAgXCJkYXRldGltZVwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHR5cGUgb2YgdXBzZXJ0IHN1cHBvcnRlZCBieSBkcml2ZXIgaWYgYW55XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1cHBvcnRlZFVwc2VydFR5cGUgPSBcIm9uLWNvbmZsaWN0LWRvLXVwZGF0ZVwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBsaXN0IG9mIGNvbHVtbiBkYXRhIHR5cGVzIHRoYXQgc3VwcG9ydCBsZW5ndGggYnkgYSBkcml2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndpdGhMZW5ndGhDb2x1bW5UeXBlcyA9IFtcbiAgICAgICAgICAgIFwiY2hhcmFjdGVyXCIsXG4gICAgICAgICAgICBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIFwidmFyeWluZyBjaGFyYWN0ZXJcIixcbiAgICAgICAgICAgIFwibmNoYXJcIixcbiAgICAgICAgICAgIFwibmF0aXZlIGNoYXJhY3RlclwiLFxuICAgICAgICAgICAgXCJudmFyY2hhclwiLFxuICAgICAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcImJsb2JcIixcbiAgICAgICAgICAgIFwiY2xvYlwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2Ygc3BhdGlhbCBjb2x1bW4gZGF0YSB0eXBlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3BhdGlhbFR5cGVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1uIGRhdGEgdHlwZXMgdGhhdCBzdXBwb3J0IHByZWNpc2lvbiBieSBhIGRyaXZlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2l0aFByZWNpc2lvbkNvbHVtblR5cGVzID0gW1xuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcImRvdWJsZVwiLFxuICAgICAgICAgICAgXCJkb3VibGUgcHJlY2lzaW9uXCIsXG4gICAgICAgICAgICBcImZsb2F0XCIsXG4gICAgICAgICAgICBcInJlYWxcIixcbiAgICAgICAgICAgIFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICBcImRhdGVcIixcbiAgICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgICAgXCJkYXRldGltZVwiXG4gICAgICAgIF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1uIGRhdGEgdHlwZXMgdGhhdCBzdXBwb3J0IHNjYWxlIGJ5IGEgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aXRoU2NhbGVDb2x1bW5UeXBlcyA9IFtcbiAgICAgICAgICAgIFwicmVhbFwiLFxuICAgICAgICAgICAgXCJkb3VibGVcIixcbiAgICAgICAgICAgIFwiZG91YmxlIHByZWNpc2lvblwiLFxuICAgICAgICAgICAgXCJmbG9hdFwiLFxuICAgICAgICAgICAgXCJyZWFsXCIsXG4gICAgICAgICAgICBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIFwiZGVjaW1hbFwiLFxuICAgICAgICBdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3JtIGhhcyBzcGVjaWFsIGNvbHVtbnMgYW5kIHdlIG5lZWQgdG8ga25vdyB3aGF0IGRhdGFiYXNlIGNvbHVtbiB0eXBlcyBzaG91bGQgYmUgZm9yIHRob3NlIHR5cGVzLlxuICAgICAgICAgKiBDb2x1bW4gdHlwZXMgYXJlIGRyaXZlciBkZXBlbmRhbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcHBlZERhdGFUeXBlcyA9IHtcbiAgICAgICAgICAgIGNyZWF0ZURhdGU6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgIGNyZWF0ZURhdGVEZWZhdWx0OiBcImRhdGV0aW1lKCdub3cnKVwiLFxuICAgICAgICAgICAgdXBkYXRlRGF0ZTogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgdXBkYXRlRGF0ZURlZmF1bHQ6IFwiZGF0ZXRpbWUoJ25vdycpXCIsXG4gICAgICAgICAgICBkZWxldGVEYXRlOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICBkZWxldGVEYXRlTnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIHRyZWVMZXZlbDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBtaWdyYXRpb25JZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBtaWdyYXRpb25OYW1lOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIG1pZ3JhdGlvblRpbWVzdGFtcDogXCJiaWdpbnRcIixcbiAgICAgICAgICAgIGNhY2hlSWQ6IFwiaW50XCIsXG4gICAgICAgICAgICBjYWNoZUlkZW50aWZpZXI6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgY2FjaGVUaW1lOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgY2FjaGVEdXJhdGlvbjogXCJpbnRcIixcbiAgICAgICAgICAgIGNhY2hlUXVlcnk6IFwidGV4dFwiLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHQ6IFwidGV4dFwiLFxuICAgICAgICAgICAgbWV0YWRhdGFUeXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgIG1ldGFkYXRhRGF0YWJhc2U6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFTY2hlbWE6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFUYWJsZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgICBtZXRhZGF0YU5hbWU6IFwidmFyY2hhclwiLFxuICAgICAgICAgICAgbWV0YWRhdGFWYWx1ZTogXCJ0ZXh0XCIsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb24ub3B0aW9ucztcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IERyaXZlclV0aWxzLmJ1aWxkRHJpdmVyT3B0aW9ucyh0aGlzLm9wdGlvbnMpLmRhdGFiYXNlO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5kYXRhYmFzZUNvbm5lY3Rpb24gPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFrZXMgYW55IGFjdGlvbiBhZnRlciBjb25uZWN0aW9uIChlLmcuIGNyZWF0ZSBleHRlbnNpb25zIGluIFBvc3RncmVzIGRyaXZlcikuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmFmdGVyQ29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGNvbm5lY3Rpb24gd2l0aCBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKG9rLCBmYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5jbG9zZShmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBlcnIgPyBmYWlsKGVycikgOiBvaygpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNjaGVtYSBidWlsZGVyIHVzZWQgdG8gYnVpbGQgYW5kIHN5bmMgYSBzY2hlbWEuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZVNjaGVtYUJ1aWxkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmRibXNTY2hlbWFCdWlsZGVyKHRoaXMuY29ubmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBnaXZlbiB2YWx1ZSB0byBhIHZhbHVlIHRvIGJlIHBlcnNpc3RlZCwgYmFzZWQgb24gaXRzIGNvbHVtbiB0eXBlIGFuZCBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucHJlcGFyZVBlcnNpc3RlbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gQm9vbGVhbiB8fCBjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5taXhlZERhdGVUb1RpbWVTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiB8fCBjb2x1bW5NZXRhZGF0YS50eXBlID09PSBEYXRlKSB7XG4gICAgICAgICAgICAvLyB0byBzdHJpbmcgY29udmVyc2F0aW9uIG5lZWRzIGJlY2F1c2UgU1FMaXRlIHN0b3JlcyBkYXRlIGFzIGludGVnZXIgbnVtYmVyLCB3aGVuIGRhdGUgY2FtZSBhcyBPYmplY3RcbiAgICAgICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGB0b1VUQ2AgY29udmVyc2lvblxuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5taXhlZERhdGVUb1V0Y0RhdGV0aW1lU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1hcnJheVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLnNpbXBsZUFycmF5VG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwic2ltcGxlLWpzb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IFwic2ltcGxlLWVudW1cIikge1xuICAgICAgICAgICAgcmV0dXJuIERhdGVVdGlscy5zaW1wbGVFbnVtVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGdpdmVuIHZhbHVlIHRvIGEgdmFsdWUgdG8gYmUgaHlkcmF0ZWQsIGJhc2VkIG9uIGl0cyBjb2x1bW4gdHlwZSBvciBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucHJlcGFyZUh5ZHJhdGVkVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyID8gQXBwbHlWYWx1ZVRyYW5zZm9ybWVycy50cmFuc2Zvcm1Gcm9tKGNvbHVtbk1ldGFkYXRhLnRyYW5zZm9ybWVyLCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IEJvb2xlYW4gfHwgY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IGNvbHVtbk1ldGFkYXRhLnR5cGUgPT09IERhdGUpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRml4IGRhdGUgY29udmVyc2lvbiBpc3N1ZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIElmIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgc3RyaW5nIGlzIFwiMjAxOC0wMy0xNCAwMjozMzozMy45MDZcIiwgU2FmYXJpIChhbmQgaU9TIFdLV2ViVmlldykgd2lsbCBjb252ZXJ0IGl0IHRvIGFuIGludmFsaWQgZGF0ZSBvYmplY3QuXG4gICAgICAgICAgICAgKiBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgZGF0ZSBzdHJpbmcgdG8gXCIyMDE4LTAzLTE0VDAyOjMzOjMzLjkwNlpcIiBhbmQgU2FmYXJpIHdpbGwgY29udmVydCBpdCBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogSVNPIDg2MDFcbiAgICAgICAgICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdmFyaW91cyB2YWxpZCB0aW1lIHN0cmluZyBmb3JtYXRzIGEgc3FsaXRlIHRpbWUgc3RyaW5nIG1pZ2h0IGhhdmU6XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuc3FsaXRlLm9yZy9sYW5nX2RhdGVmdW5jLmh0bWxcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGZpeGVzIHdlIG1heSBuZWVkIHRvIGRvOlxuICAgICAgICAgICAgICAgIC8vICAgMSkgQWRkICdUJyBzZXBhcmF0b3IgaWYgc3BhY2UgaXMgdXNlZCBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gICAyKSBBZGQgJ1onIFVUQyBzdWZmaXggaWYgbm8gdGltZXpvbmUgb3Igb2Zmc2V0IHNwZWNpZmllZFxuICAgICAgICAgICAgICAgIGlmICgvXlxcZFxcZFxcZFxcZC1cXGRcXGQtXFxkXFxkIFxcZFxcZDpcXGRcXGQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIiBcIiwgXCJUXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoL15cXGRcXGRcXGRcXGQtXFxkXFxkLVxcZFxcZFRcXGRcXGQ6XFxkXFxkKDpcXGRcXGQoXFwuXFxkXFxkXFxkKT8pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IFwiWlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm5vcm1hbGl6ZUh5ZHJhdGVkRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1peGVkRGF0ZVRvRGF0ZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJ0aW1lXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1peGVkVGltZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1hcnJheVwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUFycmF5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW5NZXRhZGF0YS50eXBlID09PSBcInNpbXBsZS1qc29uXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLnN0cmluZ1RvU2ltcGxlSnNvbih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uTWV0YWRhdGEudHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUVudW0odmFsdWUsIGNvbHVtbk1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICB2YWx1ZSA9IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtRnJvbShjb2x1bW5NZXRhZGF0YS50cmFuc2Zvcm1lciwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBwYXJhbWV0ZXJzIGluIHRoZSBnaXZlbiBzcWwgd2l0aCBzcGVjaWFsIGVzY2FwaW5nIGNoYXJhY3RlclxuICAgICAqIGFuZCBhbiBhcnJheSBvZiBwYXJhbWV0ZXIgbmFtZXMgdG8gYmUgcGFzc2VkIHRvIGEgcXVlcnkuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmVzY2FwZVF1ZXJ5V2l0aFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoc3FsLCBwYXJhbWV0ZXJzLCBuYXRpdmVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlc2NhcGVkUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG5hdGl2ZVBhcmFtZXRlcnMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBNYXBwaW5nIGJvb2xlYW4gdmFsdWVzIHRvIHRoZWlyIG51bWVyaWMgcmVwcmVzZW50YXRpb25cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmF0aXZlUGFyYW1ldGVyc1trZXldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbWV0ZXJzW2tleV0gPT09IHRydWUgPyAxIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbWV0ZXJzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnMgfHwgIU9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBbc3FsLCBlc2NhcGVkUGFyYW1ldGVyc107XG4gICAgICAgIHNxbCA9IHNxbC5yZXBsYWNlKC86KFxcLlxcLlxcLik/KFtBLVphLXowLTlfLl0rKS9nLCBmdW5jdGlvbiAoZnVsbCwgaXNBcnJheSwga2V5KSB7XG4gICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmdWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRQYXJhbWV0ZXJzLnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcmVhdGVQYXJhbWV0ZXIoa2V5LCBlc2NhcGVkUGFyYW1ldGVycy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjYXBlZFBhcmFtZXRlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKGtleSwgZXNjYXBlZFBhcmFtZXRlcnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH0pOyAvLyB0b2RvOiBtYWtlIHJlcGxhY2Ugb25seSBpbiB2YWx1ZSBzdGF0ZW1lbnRzLCBvdGhlcndpc2UgcHJvYmxlbXNcbiAgICAgICAgcmV0dXJuIFtzcWwsIGVzY2FwZWRQYXJhbWV0ZXJzXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgYSBjb2x1bW4gbmFtZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGQgZnVsbCB0YWJsZSBuYW1lIHdpdGggZGF0YWJhc2UgbmFtZSwgc2NoZW1hIG5hbWUgYW5kIHRhYmxlIG5hbWUuXG4gICAgICogRS5nLiBteURCLm15U2NoZW1hLm15VGFibGVcbiAgICAgKlxuICAgICAqIFJldHVybnMgb25seSBzaW1wbGUgdGFibGUgbmFtZSBiZWNhdXNlIGFsbCBpbmhlcml0ZWQgZHJpdmVycyBkb2VzIG5vdCBzdXBwb3J0cyBzY2hlbWEgYW5kIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5idWlsZFRhYmxlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUsIHNjaGVtYSwgZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlTmFtZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgdGFyZ2V0IHRhYmxlIG5hbWUgb3Igb3RoZXIgdHlwZXMgYW5kIHJldHVybiBhIG5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUucGFyc2VUYWJsZU5hbWUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBkcml2ZXJEYXRhYmFzZSA9IHRoaXMuZGF0YWJhc2U7XG4gICAgICAgIHZhciBkcml2ZXJTY2hlbWEgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBWaWV3KSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VkID0gdGhpcy5wYXJzZVRhYmxlTmFtZSh0YXJnZXQubmFtZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiB0YXJnZXQuZGF0YWJhc2UgfHwgcGFyc2VkLmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnNjaGVtYSB8fCBwYXJzZWQuc2NoZW1hIHx8IGRyaXZlclNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IHBhcnNlZC50YWJsZU5hbWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZUZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgIHZhciBwYXJzZWQgPSB0aGlzLnBhcnNlVGFibGVOYW1lKHRhcmdldC5yZWZlcmVuY2VkVGFibGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRhcmdldC5yZWZlcmVuY2VkRGF0YWJhc2UgfHwgcGFyc2VkLmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnJlZmVyZW5jZWRTY2hlbWEgfHwgcGFyc2VkLnNjaGVtYSB8fCBkcml2ZXJTY2hlbWEsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lOiBwYXJzZWQudGFibGVOYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gRW50aXR5TWV0YWRhdGEgdGFibGVOYW1lIGlzIG5ldmVyIGEgcGF0aFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZTogdGFyZ2V0LmRhdGFiYXNlIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdGFyZ2V0LnNjaGVtYSB8fCBkcml2ZXJTY2hlbWEsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lOiB0YXJnZXQudGFibGVOYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0cyA9IHRhcmdldC5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2U6IHBhcnRzWzBdIHx8IGRyaXZlckRhdGFiYXNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogcGFydHNbMV0gfHwgZHJpdmVyU2NoZW1hLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZTogcGFydHNbMl1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBkcml2ZXJEYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHBhcnRzWzBdLFxuICAgICAgICAgICAgICAgIHRhYmxlTmFtZTogcGFydHNbMV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBkcml2ZXJEYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IGRyaXZlclNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWU6IHRhcmdldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRhdGFiYXNlIHR5cGUgZnJvbSBhIGdpdmVuIGNvbHVtbiBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUubm9ybWFsaXplVHlwZSA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBOdW1iZXIgfHwgY29sdW1uLnR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJjaGFyXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IEJvb2xlYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcInZhcmNoYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtYXJyYXlcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInNpbXBsZS1qc29uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzaW1wbGUtZW51bVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ2YXJjaGFyXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLnR5cGUgfHwgXCJcIjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBcImRlZmF1bHRcIiB2YWx1ZSBvZiB0aGUgY29sdW1uLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVEZWZhdWx0ID0gZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBjb2x1bW5NZXRhZGF0YS5kZWZhdWx0O1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlID8gXCIxXCIgOiBcIjBcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIidcIiArIGRlZmF1bHRWYWx1ZSArIFwiJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IG51bGwgfHwgZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCIgKyBkZWZhdWx0VmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIFwiaXNVbmlxdWVcIiB2YWx1ZSBvZiB0aGUgY29sdW1uLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5ub3JtYWxpemVJc1VuaXF1ZSA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5lbnRpdHlNZXRhZGF0YS51bmlxdWVzLnNvbWUoZnVuY3Rpb24gKHVxKSB7IHJldHVybiB1cS5jb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiB1cS5jb2x1bW5zWzBdID09PSBjb2x1bW47IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBjb2x1bW4gbGVuZ3RoIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGRlZmF1bHQgbGVuZ3RoIHZhbHVlcy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuZ2V0Q29sdW1uTGVuZ3RoID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gY29sdW1uLmxlbmd0aCA/IGNvbHVtbi5sZW5ndGgudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIFwiZGVmYXVsdFwiIHZhbHVlIG9mIHRoZSBjb2x1bW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZUZ1bGxUeXBlID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB2YXIgdHlwZSA9IGNvbHVtbi50eXBlO1xuICAgICAgICBpZiAoY29sdW1uLmVudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBcInZhcmNoYXJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmxlbmd0aCkge1xuICAgICAgICAgICAgdHlwZSArPSBcIihcIiArIGNvbHVtbi5sZW5ndGggKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSBudWxsICYmIGNvbHVtbi5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2NhbGUgIT09IG51bGwgJiYgY29sdW1uLnNjYWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHR5cGUgKz0gXCIoXCIgKyBjb2x1bW4ucHJlY2lzaW9uICsgXCIsXCIgKyBjb2x1bW4uc2NhbGUgKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSBudWxsICYmIGNvbHVtbi5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdHlwZSArPSBcIihcIiArIGNvbHVtbi5wcmVjaXNpb24gKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmlzQXJyYXkpXG4gICAgICAgICAgICB0eXBlICs9IFwiIGFycmF5XCI7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogT2J0YWlucyBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGEgbWFzdGVyIHNlcnZlci5cbiAgICAgKiBVc2VkIGZvciByZXBsaWNhdGlvbi5cbiAgICAgKiBJZiByZXBsaWNhdGlvbiBpcyBub3Qgc2V0dXAgdGhlbiByZXR1cm5zIGRlZmF1bHQgY29ubmVjdGlvbidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLm9idGFpbk1hc3RlckNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9idGFpbnMgYSBuZXcgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBhIHNsYXZlIHNlcnZlci5cbiAgICAgKiBVc2VkIGZvciByZXBsaWNhdGlvbi5cbiAgICAgKiBJZiByZXBsaWNhdGlvbiBpcyBub3Qgc2V0dXAgdGhlbiByZXR1cm5zIG1hc3RlciAoZGVmYXVsdCkgY29ubmVjdGlvbidzIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLm9idGFpblNsYXZlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBnZW5lcmF0ZWQgbWFwIG9mIHZhbHVlcyBnZW5lcmF0ZWQgb3IgcmV0dXJuZWQgYnkgZGF0YWJhc2UgYWZ0ZXIgSU5TRVJUIHF1ZXJ5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVHZW5lcmF0ZWRNYXAgPSBmdW5jdGlvbiAobWV0YWRhdGEsIGluc2VydFJlc3VsdCwgZW50aXR5SW5kZXgsIGVudGl0eU51bSkge1xuICAgICAgICB2YXIgZ2VuZXJhdGVkTWFwID0gbWV0YWRhdGEuZ2VuZXJhdGVkQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiAmJiBpbnNlcnRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBXaGVuIElOU0VSVCBzdGF0ZW1lbnQgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgdGhlIGxhc3QgaW5zZXJ0ZWQgcm93IElEIGlzIHJldHVybmVkLlxuICAgICAgICAgICAgICAgIC8vIHNlZSBhbHNvOiBTcWxpdGVRdWVyeVJ1bm5lci5xdWVyeSgpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbnNlcnRSZXN1bHQgLSBlbnRpdHlOdW0gKyBlbnRpdHlJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZSA9IGluc2VydFZhbHVlW2dlbmVyYXRlZENvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaWZmZXJlbnRpYXRlIGNvbHVtbnMgb2YgdGhpcyB0YWJsZSBhbmQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBjb2x1bW4gbWV0YWRhdGFzIGNvbHVtbnNcbiAgICAgKiBhbmQgcmV0dXJucyBvbmx5IGNoYW5nZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmZpbmRDaGFuZ2VkQ29sdW1ucyA9IGZ1bmN0aW9uICh0YWJsZUNvbHVtbnMsIGNvbHVtbk1ldGFkYXRhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY29sdW1uTWV0YWRhdGFzLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZUNvbHVtbiA9IHRhYmxlQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgICAgICBpZiAoIXRhYmxlQ29sdW1uKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UgZG9uJ3QgbmVlZCBuZXcgY29sdW1ucywgd2Ugb25seSBuZWVkIGV4aXN0IGFuZCBjaGFuZ2VkXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInRhYmxlOlwiLCBjb2x1bW5NZXRhZGF0YS5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJuYW1lOlwiLCB0YWJsZUNvbHVtbi5uYW1lLCBjb2x1bW5NZXRhZGF0YS5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlOlwiLCB0YWJsZUNvbHVtbi50eXBlLCB0aGlzLm5vcm1hbGl6ZVR5cGUoY29sdW1uTWV0YWRhdGEpKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibGVuZ3RoOlwiLCB0YWJsZUNvbHVtbi5sZW5ndGgsIGNvbHVtbk1ldGFkYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInByZWNpc2lvbjpcIiwgdGFibGVDb2x1bW4ucHJlY2lzaW9uLCBjb2x1bW5NZXRhZGF0YS5wcmVjaXNpb24pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzY2FsZTpcIiwgdGFibGVDb2x1bW4uc2NhbGUsIGNvbHVtbk1ldGFkYXRhLnNjYWxlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY29tbWVudDpcIiwgdGFibGVDb2x1bW4uY29tbWVudCwgY29sdW1uTWV0YWRhdGEuY29tbWVudCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlZmF1bHQ6XCIsIHRoaXMubm9ybWFsaXplRGVmYXVsdChjb2x1bW5NZXRhZGF0YSksIGNvbHVtbk1ldGFkYXRhLmRlZmF1bHQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc1ByaW1hcnk6XCIsIHRhYmxlQ29sdW1uLmlzUHJpbWFyeSwgY29sdW1uTWV0YWRhdGEuaXNQcmltYXJ5KTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXNOdWxsYWJsZTpcIiwgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSwgY29sdW1uTWV0YWRhdGEuaXNOdWxsYWJsZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzVW5pcXVlOlwiLCB0YWJsZUNvbHVtbi5pc1VuaXF1ZSwgdGhpcy5ub3JtYWxpemVJc1VuaXF1ZShjb2x1bW5NZXRhZGF0YSkpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpc0dlbmVyYXRlZDpcIiwgdGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQsIGNvbHVtbk1ldGFkYXRhLmlzR2VuZXJhdGVkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlQ29sdW1uLm5hbWUgIT09IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZVxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnR5cGUgIT09IF90aGlzLm5vcm1hbGl6ZVR5cGUoY29sdW1uTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4ubGVuZ3RoICE9PSBjb2x1bW5NZXRhZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICB8fCB0YWJsZUNvbHVtbi5wcmVjaXNpb24gIT09IGNvbHVtbk1ldGFkYXRhLnByZWNpc2lvblxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLnNjYWxlICE9PSBjb2x1bW5NZXRhZGF0YS5zY2FsZVxuICAgICAgICAgICAgICAgIC8vICB8fCB0YWJsZUNvbHVtbi5jb21tZW50ICE9PSBjb2x1bW5NZXRhZGF0YS5jb21tZW50IHx8IC8vIHRvZG9cbiAgICAgICAgICAgICAgICB8fCBfdGhpcy5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbk1ldGFkYXRhKSAhPT0gdGFibGVDb2x1bW4uZGVmYXVsdFxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLmlzUHJpbWFyeSAhPT0gY29sdW1uTWV0YWRhdGEuaXNQcmltYXJ5XG4gICAgICAgICAgICAgICAgfHwgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSAhPT0gY29sdW1uTWV0YWRhdGEuaXNOdWxsYWJsZVxuICAgICAgICAgICAgICAgIHx8IHRhYmxlQ29sdW1uLmlzVW5pcXVlICE9PSBfdGhpcy5ub3JtYWxpemVJc1VuaXF1ZShjb2x1bW5NZXRhZGF0YSlcbiAgICAgICAgICAgICAgICB8fCAoY29sdW1uTWV0YWRhdGEuZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIiAmJiB0YWJsZUNvbHVtbi5pc0dlbmVyYXRlZCAhPT0gY29sdW1uTWV0YWRhdGEuaXNHZW5lcmF0ZWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkcml2ZXIgc3VwcG9ydHMgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkcml2ZXIgc3VwcG9ydHMgdXVpZCB2YWx1ZXMgZ2VuZXJhdGlvbiBvbiBpdHMgb3duLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5pc1VVSURHZW5lcmF0aW9uU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgZHJpdmVyIHN1cHBvcnRzIGZ1bGx0ZXh0IGluZGljZXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmlzRnVsbFRleHRDb2x1bW5UeXBlU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVzY2FwZWQgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVQYXJhbWV0ZXIgPSBmdW5jdGlvbiAocGFyYW1ldGVyTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgLy8gcmV0dXJuIFwiJFwiICsgKGluZGV4ICsgMSk7XG4gICAgICAgIHJldHVybiBcIj9cIjtcbiAgICAgICAgLy8gcmV0dXJuIFwiJFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNvbm5lY3Rpb24gd2l0aCB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVEcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkRvIG5vdCB1c2UgQWJzdHJhY3RTcWxpdGUgZGlyZWN0bHksIGl0IGhhcyB0byBiZSB1c2VkIHdpdGggb25lIG9mIHRoZSBzcWxpdGUgZHJpdmVyc1wiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIGRyaXZlciBkZXBlbmRlbmN5IGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5LCB0aGVuIHRyeSB0byBsb2FkIGl0IHZpYSBcInJlcXVpcmVcIi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZURyaXZlci5wcm90b3R5cGUubG9hZERlcGVuZGVuY2llcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHRoZSBzcGVjaWZpYyBkcml2ZXJcbiAgICB9O1xuICAgIHJldHVybiBBYnN0cmFjdFNxbGl0ZURyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdFNxbGl0ZURyaXZlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9UcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvclwiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZVwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUluZGV4XCI7XG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi4vUXVlcnlcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBCYXNlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL0Jhc2VRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgVGFibGVDaGVjayB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbmltcG9ydCB7IE1ldGFkYXRhVGFibGVUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL01ldGFkYXRhVGFibGVUeXBlXCI7XG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBzcWxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqL1xudmFyIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcy91c2VzIGRhdGFiYXNlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbiBwb29sIHRvIHBlcmZvcm0gZnVydGhlciBvcGVyYXRpb25zLlxuICAgICAqIFJldHVybnMgb2J0YWluZWQgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZHJpdmVyLmRhdGFiYXNlQ29ubmVjdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB1c2VkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICogV2UganVzdCBjbGVhciBsb2FkZWQgdGFibGVzIGFuZCBzcWwgaW4gbWVtb3J5LCBiZWNhdXNlIHNxbGl0ZSBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb25uZWN0aW9ucyB0aHVzIHF1ZXJ5IHJ1bm5lcnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRUYWJsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jbGVhclNxbE1lbW9yeSgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdGFydHMgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0aW9uTGV2ZWwpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsICE9PSBcIlJFQUQgVU5DT01NSVRURURcIiAmJiBpc29sYXRpb25MZXZlbCAhPT0gXCJTRVJJQUxJWkFCTEVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTUUxpdGUgb25seSBzdXBwb3J0cyBTRVJJQUxJWkFCTEUgYW5kIFJFQUQgVU5DT01NSVRURUQgaXNvbGF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXNvbGF0aW9uTGV2ZWwgPT09IFwiUkVBRCBVTkNPTU1JVFRFRFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gZmFsc2VcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uU3RhcnQnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiQkVHSU4gVFJBTlNBQ1RJT05cIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblN0YXJ0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoJ0JlZm9yZVRyYW5zYWN0aW9uQ29tbWl0JyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiQ09NTUlUXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJvbGxiYWNrcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUucm9sbGJhY2tUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQmVmb3JlVHJhbnNhY3Rpb25Sb2xsYmFjaycpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlJPTExCQUNLXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdCgnQWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrJyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyByYXcgZGF0YSBzdHJlYW0uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBvbkVuZCwgb25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc3FsaXRlIGRyaXZlci5cIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUgZGF0YWJhc2UgbmFtZXMgaW5jbHVkaW5nIHN5c3RlbSBkYXRhYmFzZXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0RGF0YWJhc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZShbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHNjaGVtYSBuYW1lcyBpbmNsdWRpbmcgc3lzdGVtIHNjaGVtYXMuXG4gICAgICogSWYgZGF0YWJhc2UgcGFyYW1ldGVyIHNwZWNpZmllZCwgcmV0dXJucyBzY2hlbWFzIG9mIHRoYXQgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0U2NoZW1hcyA9IGZ1bmN0aW9uIChkYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZShbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoZmFsc2UpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZVxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldEN1cnJlbnREYXRhYmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGFibGUgc2NoZW1hc1wiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZSBzY2hlbWFcbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRDdXJyZW50U2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0YWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5oYXNUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGVOYW1lLCBzcWwsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yTmFtZS5uYW1lIDogdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlNFTEVDVCAqIEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiA9ICdcIiArIHRhYmxlTmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzcWwpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdC5sZW5ndGggPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaGFzQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZU5hbWUsIHNxbCwgY29sdW1ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yTmFtZS5uYW1lIDogdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcWwgPSBcIlBSQUdNQSB0YWJsZV9pbmZvKFxcXCJcIiArIHRhYmxlTmFtZSArIFwiXFxcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgISFjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uW1wibmFtZVwiXSA9PT0gY29sdW1uTmFtZTsgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmTm90RXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRGF0YWJhc2UgPSBmdW5jdGlvbiAoZGF0YWJhc2UsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVTY2hlbWEgPSBmdW5jdGlvbiAoc2NoZW1hUGF0aCwgaWZOb3RFeGlzdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIHRhYmxlIHNjaGVtYS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYVBhdGgsIGlmRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBpZk5vdEV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgY3JlYXRlSW5kaWNlcykge1xuICAgICAgICBpZiAoaWZOb3RFeGlzdCA9PT0gdm9pZCAwKSB7IGlmTm90RXhpc3QgPSBmYWxzZTsgfVxuICAgICAgICBpZiAoY3JlYXRlRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBjcmVhdGVGb3JlaWduS2V5cyA9IHRydWU7IH1cbiAgICAgICAgaWYgKGNyZWF0ZUluZGljZXMgPT09IHZvaWQgMCkgeyBjcmVhdGVJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBRdWVyaWVzLCBkb3duUXVlcmllcywgaXNUYWJsZUV4aXN0O1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZOb3RFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RhYmxlRXhpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVUYWJsZVNxbCh0YWJsZSwgY3JlYXRlRm9yZWlnbktleXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgaW5kZXggbWF5IGJlIHBhc3NlZCB3aXRob3V0IG5hbWUuIEluIHRoaXMgY2FzZSB3ZSBnZW5lcmF0ZSBpbmRleCBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluZGV4Lm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUodGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFRhYmxlID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBpZkV4aXN0LCBkcm9wRm9yZWlnbktleXMsIGRyb3BJbmRpY2VzKSB7XG4gICAgICAgIGlmIChkcm9wRm9yZWlnbktleXMgPT09IHZvaWQgMCkgeyBkcm9wRm9yZWlnbktleXMgPSB0cnVlOyB9XG4gICAgICAgIGlmIChkcm9wSW5kaWNlcyA9PT0gdm9pZCAwKSB7IGRyb3BJbmRpY2VzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNUYWJsZUV4aXN0LCBjcmVhdGVGb3JlaWduS2V5cywgdGFibGUsIF9hLCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWZFeGlzdCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmhhc1RhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFibGVFeGlzdCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUYWJsZUV4aXN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvcmVpZ25LZXlzID0gZHJvcEZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKF90aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUsIGlmRXhpc3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5jcmVhdGVUYWJsZVNxbCh0YWJsZSwgY3JlYXRlRm9yZWlnbktleXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB2aWV3LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVZpZXcgPSBmdW5jdGlvbiAodmlldykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBRdWVyaWVzLCBkb3duUXVlcmllcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmluc2VydFZpZXdEZWZpbml0aW9uU3FsKHZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wVmlldyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZpZXdOYW1lLCB2aWV3LCB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWUgPSB0YXJnZXQgaW5zdGFuY2VvZiBWaWV3ID8gdGFyZ2V0Lm5hbWUgOiB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFZpZXcodmlld05hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuaW5zZXJ0Vmlld0RlZmluaXRpb25TcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVZpZXdTcWwodmlldykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIHRoZSBnaXZlbiB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZW5hbWVUYWJsZSA9IGZ1bmN0aW9uIChvbGRUYWJsZU9yTmFtZSwgbmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbGRUYWJsZSwgX2EsIG5ld1RhYmxlLCB1cCwgZG93bjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvbGRUYWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9sZFRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZShvbGRUYWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlID0gb2xkVGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBuZXdUYWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG5ld1RhYmxlTmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvd24gPSBuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcXFwiXCIgKyBuZXdUYWJsZU5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBvbGQgdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRUYWJsZS5uYW1lID0gbmV3VGFibGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSB1bmlxdWUgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnVuaXF1ZXMuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKG5ld1RhYmxlLCB1bmlxdWUuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWUgZm9yZWlnbiBrZXkgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmZvcmVpZ25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKG5ld1RhYmxlLCBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLCBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVuYW1lIGluZGljZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLmluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUobmV3VGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY3JlYXRlIHRhYmxlIHdpdGggbmV3IGNvbnN0cmFpbnQgbmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVjcmVhdGVUYWJsZShuZXdUYWJsZSwgb2xkVGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGFibGUgd2l0aCBuZXcgY29uc3RyYWludCBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29sdW1uIGZyb20gdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuYWRkQ29sdW1uID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuYWRkQ29sdW1ucyh0YWJsZSwgW2NvbHVtbl0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbHVtbnMgZnJvbSB0aGUgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5hZGRDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkQ29sdW1uKGNvbHVtbik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgY29sdW1uIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZW5hbWVDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIG9sZFRhYmxlQ29sdW1uT3JOYW1lLCBuZXdUYWJsZUNvbHVtbk9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBvbGRDb2x1bW4sIG5ld0NvbHVtbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uID0gb2xkVGFibGVDb2x1bW5Pck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbiA/IG9sZFRhYmxlQ29sdW1uT3JOYW1lIDogdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IG9sZFRhYmxlQ29sdW1uT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2xkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXFxcIlwiICsgb2xkVGFibGVDb2x1bW5Pck5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIiB0YWJsZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2x1bW4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VGFibGVDb2x1bW5Pck5hbWUgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbiA9IG5ld1RhYmxlQ29sdW1uT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uID0gb2xkQ29sdW1uLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uLm5hbWUgPSBuZXdUYWJsZUNvbHVtbk9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNoYW5nZUNvbHVtbih0YWJsZSwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jaGFuZ2VDb2x1bW4gPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIG9sZFRhYmxlQ29sdW1uT3JOYW1lLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgb2xkQ29sdW1uO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW4gPSBvbGRUYWJsZUNvbHVtbk9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uID8gb2xkVGFibGVDb2x1bW5Pck5hbWUgOiB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gb2xkVGFibGVDb2x1bW5Pck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcXFwiXCIgKyBvbGRUYWJsZUNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiIHRhYmxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2hhbmdlQ29sdW1ucyh0YWJsZSwgW3sgb2xkQ29sdW1uOiBvbGRDb2x1bW4sIG5ld0NvbHVtbjogbmV3Q29sdW1uIH1dKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKiBDaGFuZ2VkIGNvbHVtbiBsb29zZXMgYWxsIGl0cyBrZXlzIGluIHRoZSBkYi5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jaGFuZ2VDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGFuZ2VkQ29sdW1ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlZENvbHVtblNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtbi5uYW1lICE9PSBjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uVW5pcXVlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMuc3BsaWNlKHVuaXF1ZS5jb2x1bW5OYW1lcy5pbmRleE9mKGNoYW5nZWRDb2x1bW5TZXQub2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZS5jb2x1bW5OYW1lcy5wdXNoKGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLm5hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKGNoYW5nZWRUYWJsZSwgdW5pcXVlLmNvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMoY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4pLmZvckVhY2goZnVuY3Rpb24gKGZrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmay5jb2x1bW5OYW1lcy5zcGxpY2UoZmsuY29sdW1uTmFtZXMuaW5kZXhPZihjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbi5uYW1lKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmay5jb2x1bW5OYW1lcy5wdXNoKGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmsubmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUoY2hhbmdlZFRhYmxlLCBmay5jb2x1bW5OYW1lcywgX3RoaXMuZ2V0VGFibGVQYXRoKGZrKSwgZmsucmVmZXJlbmNlZENvbHVtbk5hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uSW5kaWNlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbikuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbk5hbWVzLnNwbGljZShpbmRleC5jb2x1bW5OYW1lcy5pbmRleE9mKGNoYW5nZWRDb2x1bW5TZXQub2xkQ29sdW1uLm5hbWUpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbk5hbWVzLnB1c2goY2hhbmdlZENvbHVtblNldC5uZXdDb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUoY2hhbmdlZFRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gY2hhbmdlZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUuY29sdW1uc1tjaGFuZ2VkVGFibGUuY29sdW1ucy5pbmRleE9mKG9yaWdpbmFsQ29sdW1uKV0gPSBjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcENvbHVtbiA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNvbHVtbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gY29sdW1uT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW5Pck5hbWUgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbk9yTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbk9yTmFtZSArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BDb2x1bW5zKHRhYmxlLCBbY29sdW1uXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDb2x1bW5zID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbkluc3RhbmNlID0gY29sdW1uIGluc3RhbmNlb2YgVGFibGVDb2x1bW4gPyBjb2x1bW4gOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5JbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbiArIFwiXFxcIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLnJlbW92ZUNvbHVtbihjb2x1bW5JbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLmZpbmRDb2x1bW5VbmlxdWVzKGNvbHVtbkluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uSW5kaWNlcyhjb2x1bW5JbnN0YW5jZSkuZm9yRWFjaChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5yZW1vdmVJbmRleChpbmRleCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5maW5kQ29sdW1uRm9yZWlnbktleXMoY29sdW1uSW5zdGFuY2UpLmZvckVhY2goZnVuY3Rpb24gKGZrKSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlRm9yZWlnbktleShmayk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwcmltYXJ5IGtleS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVQcmltYXJ5S2V5ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjb2x1bW5OYW1lcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uTmFtZXMuZmluZChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gY29sdW1uTmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBjb2x1bW5zIGFzIHByaW1hcnkgaW4gb3JpZ2luYWwgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUudXBkYXRlUHJpbWFyeUtleXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLnJlc29sdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhIHByaW1hcnkga2V5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BQcmltYXJ5S2V5ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgcHJpbWFyeSBjb2x1bW5zIGFzIG5vbi1wcmltYXJ5IGluIG9yaWdpbmFsIHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlT3JOYW1lLCBbdW5pcXVlQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdW5pcXVlIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCB1bmlxdWVDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYW4gdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIHVuaXF1ZU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCB1bmlxdWVDb25zdHJhaW50O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50ID0gdW5pcXVlT3JOYW1lIGluc3RhbmNlb2YgVGFibGVVbmlxdWUgPyB1bmlxdWVPck5hbWUgOiB0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUubmFtZSA9PT0gdW5pcXVlT3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlQ29uc3RyYWludClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiU3VwcGxpZWQgdW5pcXVlIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIFt1bmlxdWVDb25zdHJhaW50XSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB1bmlxdWUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcFVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCB1bmlxdWVDb25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVDaGVja0NvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyh0YWJsZU9yTmFtZSwgW2NoZWNrQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNoZWNrIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUNoZWNrQ29uc3RyYWludHMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hhbmdlZFRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVja0NvbnN0cmFpbnQpIHsgcmV0dXJuIGNoYW5nZWRUYWJsZS5hZGRDaGVja0NvbnN0cmFpbnQoY2hlY2tDb25zdHJhaW50KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja09yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGVja0NvbnN0cmFpbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludCA9IGNoZWNrT3JOYW1lIGluc3RhbmNlb2YgVGFibGVDaGVjayA/IGNoZWNrT3JOYW1lIDogdGFibGUuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gY2hlY2tPck5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NvbnN0cmFpbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGNoZWNrIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wQ2hlY2tDb25zdHJhaW50cyh0YWJsZSwgW2NoZWNrQ29uc3RyYWludF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGNoZWNrIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BDaGVja0NvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBjaGVja0NvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIGNoYW5nZWRUYWJsZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhYmxlT3JOYW1lIGluc3RhbmNlb2YgVGFibGUpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGFibGVPck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludHMuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2tDb25zdHJhaW50KSB7IHJldHVybiBjaGFuZ2VkVGFibGUucmVtb3ZlQ2hlY2tDb25zdHJhaW50KGNoZWNrQ29uc3RyYWludCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVFeGNsdXNpb25Db25zdHJhaW50cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZXhjbHVzaW9uQ29uc3RyYWludHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBleGNsdXNpb24gY29uc3RyYWludHMuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnQgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGV4Y2x1c2lvbk9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBleGNsdXNpb24gY29uc3RyYWludHMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleGNsdXNpb25Db25zdHJhaW50cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNxbGl0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZvcmVpZ24ga2V5LlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGZvcmVpZ25LZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZUZvcmVpZ25LZXlzKHRhYmxlT3JOYW1lLCBbZm9yZWlnbktleV0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZm9yZWlnbiBrZXlzLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNyZWF0ZUZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBmb3JlaWduS2V5cykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBjaGFuZ2VkVGFibGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRhYmxlT3JOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBjaGFuZ2VkVGFibGUuYWRkRm9yZWlnbktleShmb3JlaWduS2V5KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBmb3JlaWduIGtleSBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wRm9yZWlnbktleSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleU9yTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIF9hLCBmb3JlaWduS2V5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5ID0gZm9yZWlnbktleU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlRm9yZWlnbktleSA/IGZvcmVpZ25LZXlPck5hbWUgOiB0YWJsZS5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChmaykgeyByZXR1cm4gZmsubmFtZSA9PT0gZm9yZWlnbktleU9yTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcmVpZ25LZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGZvcmVpZ24ga2V5IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcEZvcmVpZ25LZXlzKHRhYmxlT3JOYW1lLCBbZm9yZWlnbktleV0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGEgZm9yZWlnbiBrZXlzIGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BGb3JlaWduS2V5cyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgZm9yZWlnbktleXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgY2hhbmdlZFRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleXMuZm9yRWFjaChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gY2hhbmdlZFRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZm9yZWlnbktleSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5kZXguXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kZXggPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgX2EsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgaW5kZXggbWF5IGJlIHBhc3NlZCB3aXRob3V0IG5hbWUuIEluIHRoaXMgY2FzZSB3ZSBnZW5lcmF0ZSBpbmRleCBuYW1lIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKHRhYmxlLCBpbmRleC5jb2x1bW5OYW1lcywgaW5kZXgud2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSB0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duID0gdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cCwgZG93bildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbmRpY2VzXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUluZGV4KHRhYmxlT3JOYW1lLCBpbmRleCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwocHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGV4IGZyb20gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BJbmRleCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaW5kZXhPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCBfYSwgaW5kZXgsIHVwLCBkb3duO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0YWJsZU9yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lIDogdGFibGUuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWUgPT09IGluZGV4T3JOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBsaWVkIGluZGV4IHdhcyBub3QgZm91bmQgaW4gdGFibGUgXCIgKyB0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93biA9IHRoaXMuY3JlYXRlSW5kZXhTcWwodGFibGUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlSW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGljZXMgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuZHJvcEluZGljZXMgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGluZGljZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBfdGhpcy5kcm9wSW5kZXgodGFibGVPck5hbWUsIGluZGV4KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCB0YWJsZSBjb250ZW50cy5cbiAgICAgKiBOb3RlOiB0aGlzIG9wZXJhdGlvbiB1c2VzIFNRTCdzIFRSVU5DQVRFIHF1ZXJ5IHdoaWNoIGNhbm5vdCBiZSByZXZlcnRlZCBpbiB0cmFuc2FjdGlvbnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2xlYXJUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiREVMRVRFIEZST00gXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRhYmxlcyBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmNsZWFyRGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RWaWV3RHJvcHNRdWVyeSwgZHJvcFZpZXdRdWVyaWVzLCBzZWxlY3RUYWJsZURyb3BzUXVlcnksIGRyb3BUYWJsZVF1ZXJpZXMsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT0ZGO1wiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzMsIDksIDE0LCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnkgPSBcIlNFTEVDVCAnRFJPUCBWSUVXIFxcXCInIHx8IG5hbWUgfHwgJ1xcXCI7JyBhcyBxdWVyeSBGUk9NIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBXSEVSRSBcXFwidHlwZVxcXCIgPSAndmlldydcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoc2VsZWN0Vmlld0Ryb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFZpZXdRdWVyaWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoZHJvcFZpZXdRdWVyaWVzLm1hcChmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMucXVlcnkocVtcInF1ZXJ5XCJdKTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0VGFibGVEcm9wc1F1ZXJ5ID0gXCJTRUxFQ1QgJ0RST1AgVEFCTEUgXFxcIicgfHwgbmFtZSB8fCAnXFxcIjsnIGFzIHF1ZXJ5IEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZScgQU5EIFxcXCJuYW1lXFxcIiAhPSAnc3FsaXRlX3NlcXVlbmNlJ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShzZWxlY3RUYWJsZURyb3BzUXVlcnkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcFRhYmxlUXVlcmllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRyb3BUYWJsZVF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxKSB7IHJldHVybiBfdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxMCwgMTIsICwgMTNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTjtcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5sb2FkVmlld3MgPSBmdW5jdGlvbiAodmlld05hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBoYXNUYWJsZSwgdmlld05hbWVzU3RyaW5nLCBxdWVyeSwgZGJWaWV3cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5oYXNUYWJsZSh0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYmxlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWVzU3RyaW5nID0gdmlld05hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gXCInXCIgKyBuYW1lICsgXCInXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gXCJTRUxFQ1QgXFxcInRcXFwiLiogRlJPTSBcXFwiXCIgKyB0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpICsgXCJcXFwiIFxcXCJ0XFxcIiBJTk5FUiBKT0lOIFxcXCJzcWxpdGVfbWFzdGVyXFxcIiBzIE9OIFxcXCJzXFxcIi5cXFwibmFtZVxcXCIgPSBcXFwidFxcXCIuXFxcIm5hbWVcXFwiIEFORCBcXFwic1xcXCIuXFxcInR5cGVcXFwiID0gJ3ZpZXcnIFdIRVJFIFxcXCJ0XFxcIi5cXFwidHlwZVxcXCIgPSAnXCIgKyBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld05hbWVzU3RyaW5nLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgQU5EIFxcXCJ0XFxcIi5cXFwibmFtZVxcXCIgSU4gKFwiICsgdmlld05hbWVzU3RyaW5nICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHF1ZXJ5KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiVmlld3MgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGJWaWV3cy5tYXAoZnVuY3Rpb24gKGRiVmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcubmFtZSA9IGRiVmlld1tcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZXhwcmVzc2lvbiA9IGRiVmlld1tcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHRhYmxlcyAod2l0aCBnaXZlbiBuYW1lcykgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIGNyZWF0ZXMgYSBUYWJsZSBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUubG9hZFRhYmxlcyA9IGZ1bmN0aW9uICh0YWJsZU5hbWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYlRhYmxlcywgdGFibGVzU3FsLCBfYSwgX2IsIF9jLCBfZCwgdGFibGVOYW1lc1N0cmluZ18xLCB0YWJsZXNTcWwsIF9lLCBfZiwgX2csIF9oLCB0YWJsZU5hbWVzU3RyaW5nLCBkYkluZGljZXNEZWY7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfaikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2oubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gdGFibGVzIGdpdmVuIHRoZW4gbm8gbmVlZCB0byBwcm9jZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVOYW1lcyAmJiB0YWJsZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGFibGVOYW1lcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNTcWwgPSBcIlNFTEVDVCAqIEZST00gXFxcInNxbGl0ZV9tYXN0ZXJcXFwiIFdIRVJFIFxcXCJ0eXBlXFxcIiA9ICd0YWJsZSdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gZGJUYWJsZXMucHVzaCkuYXBwbHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYyA9IFtkYlRhYmxlc107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZCA9IFtbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHRhYmxlc1NxbCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5hcHBseShfYSwgX2MuY29uY2F0KFtfX3NwcmVhZEFycmF5LmFwcGx5KHZvaWQgMCwgX2QuY29uY2F0KFtfX3JlYWQuYXBwbHkodm9pZCAwLCBbX2ouc2VudCgpXSksIGZhbHNlXSkpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZXNTdHJpbmdfMSA9IHRhYmxlTmFtZXMubWFwKGZ1bmN0aW9uICh0YWJsZU5hbWUpIHsgcmV0dXJuIFwiJ1wiICsgdGFibGVOYW1lICsgXCInXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlc1NxbCA9IFwiU0VMRUNUICogRlJPTSBcXFwic3FsaXRlX21hc3RlclxcXCIgV0hFUkUgXFxcInR5cGVcXFwiID0gJ3RhYmxlJyBBTkQgXFxcIm5hbWVcXFwiIElOIChcIiArIHRhYmxlTmFtZXNTdHJpbmdfMSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2YgPSAoX2UgPSBkYlRhYmxlcy5wdXNoKS5hcHBseTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9nID0gW2RiVGFibGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oID0gW1tdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkodGFibGVzU3FsKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mLmFwcGx5KF9lLCBfZy5jb25jYXQoW19fc3ByZWFkQXJyYXkuYXBwbHkodm9pZCAwLCBfaC5jb25jYXQoW19fcmVhZC5hcHBseSh2b2lkIDAsIFtfai5zZW50KCldKSwgZmFsc2VdKSldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfai5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhYmxlcyB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgZGIsIG5vIG5lZWQgdG8gcHJvY2VlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiVGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVzU3RyaW5nID0gZGJUYWJsZXMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gX2EubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCInXCIgKyBuYW1lICsgXCInXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KFwiU0VMRUNUICogRlJPTSBcXFwic3FsaXRlX21hc3RlclxcXCIgV0hFUkUgXFxcInR5cGVcXFwiID0gJ2luZGV4JyBBTkQgXFxcInRibF9uYW1lXFxcIiBJTiAoXCIgKyB0YWJsZU5hbWVzU3RyaW5nICsgXCIpXCIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmRpY2VzRGVmID0gX2ouc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlIHNjaGVtYXMgZm9yIGxvYWRlZCB0YWJsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLmFsbChkYlRhYmxlcy5tYXAoZnVuY3Rpb24gKGRiVGFibGUpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBzcWwsIF9hLCBkYkNvbHVtbnMsIGRiSW5kaWNlcywgZGJGb3JlaWduS2V5cywgYXV0b0luY3JlbWVudENvbHVtbk5hbWUsIHRhYmxlU3FsLCBhdXRvSW5jcmVtZW50SW5kZXgsIGNvbW1hLCBicmFja2V0LCB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cywgdW5pcXVlUmVnZXhSZXN1bHQsIHVuaXF1ZU1hcHBpbmdzLCB1bmlxdWVSZWdleCwgdGFibGVVbmlxdWVQcm9taXNlcywgX2IsIHJlc3VsdCwgcmVnZXhwLCBpbmRpY2VzUHJvbWlzZXMsIGluZGljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLm5hbWUgPSBkYlRhYmxlW1wibmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsID0gZGJUYWJsZVtcInNxbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkoXCJQUkFHTUEgdGFibGVfaW5mbyhcXFwiXCIgKyBkYlRhYmxlW1wibmFtZVwiXSArIFwiXFxcIilcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeShcIlBSQUdNQSBpbmRleF9saXN0KFxcXCJcIiArIGRiVGFibGVbXCJuYW1lXCJdICsgXCJcXFwiKVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5X2xpc3QoXFxcIlwiICsgZGJUYWJsZVtcIm5hbWVcIl0gKyBcIlxcXCIpXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQuYXBwbHkodm9pZCAwLCBbX2Muc2VudCgpLCAzXSksIGRiQ29sdW1ucyA9IF9hWzBdLCBkYkluZGljZXMgPSBfYVsxXSwgZGJGb3JlaWduS2V5cyA9IF9hWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVTcWwgPSBkYlRhYmxlW1wic3FsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50SW5kZXggPSB0YWJsZVNxbC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJBVVRPSU5DUkVNRU5UXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0luY3JlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUgPSB0YWJsZVNxbC5zdWJzdHIoMCwgYXV0b0luY3JlbWVudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gYXV0b0luY3JlbWVudENvbHVtbk5hbWUubGFzdEluZGV4T2YoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldCA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmxhc3RJbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihjb21tYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUgPSBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoMCwgYXV0b0luY3JlbWVudENvbHVtbk5hbWUubGFzdEluZGV4T2YoXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5pbmRleE9mKFwiXFxcIlwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYnJhY2tldCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cihicmFja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLnN1YnN0cigwLCBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5sYXN0SW5kZXhPZihcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID0gYXV0b0luY3JlbWVudENvbHVtbk5hbWUuc3Vic3RyKGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmluZGV4T2YoXCJcXFwiXCIpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGNvbHVtbnMgZnJvbSB0aGUgbG9hZGVkIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY29sdW1ucyA9IGRiQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGRiQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLm5hbWUgPSBkYkNvbHVtbltcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi50eXBlID0gZGJDb2x1bW5bXCJ0eXBlXCJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5kZWZhdWx0ID0gZGJDb2x1bW5bXCJkZmx0X3ZhbHVlXCJdICE9PSBudWxsICYmIGRiQ29sdW1uW1wiZGZsdF92YWx1ZVwiXSAhPT0gdW5kZWZpbmVkID8gZGJDb2x1bW5bXCJkZmx0X3ZhbHVlXCJdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSA9IGRiQ29sdW1uW1wibm90bnVsbFwiXSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkga2V5cyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgd2l0aCAxLCBjb2x1bW5zIHRoYXQgYXJlbid0IHByaW1hcnkga2V5cyBhcmUgbWFya2VkIHdpdGggMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNQcmltYXJ5ID0gZGJDb2x1bW5bXCJwa1wiXSA+IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5jb21tZW50ID0gXCJcIjsgLy8gU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgY29sdW1uIGNvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc0dlbmVyYXRlZCA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID09PSBkYkNvbHVtbltcIm5hbWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVDb2x1bW4uaXNHZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29sdW1uLnR5cGUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBlbnVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudW1NYXRjaCA9IHNxbC5tYXRjaChuZXcgUmVnRXhwKFwiXFxcIihcIiArIHRhYmxlQ29sdW1uLm5hbWUgKyBcIilcXFwiIHZhcmNoYXIgQ0hFQ0tcXFxccypcXFxcKFxcXFxzKlxcXFwxXFxcXHMrSU5cXFxccypcXFxcKCgnW14nXSsnKD86XFxcXHMqLFxcXFxzKidbXiddKycpKylcXFxccypcXFxcKVxcXFxzKlxcXFwpXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gZW51bVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5lbnVtID0gZW51bU1hdGNoWzJdLnN1YnN0cigxLCBlbnVtTWF0Y2hbMl0ubGVuZ3RoIC0gMikuc3BsaXQoXCInLCdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgZGF0YXR5cGUgYW5kIGF0dGVtcHQgdG8gcmV0cmlldmUgbGVuZ3RoLCBwcmVjaXNpb24gYW5kIHNjYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gdGFibGVDb2x1bW4udHlwZS5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bGxUeXBlID0gdGFibGVDb2x1bW4udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YVR5cGVfMSA9IGZ1bGxUeXBlLnN1YnN0cigwLCBwb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV90aGlzLmRyaXZlci53aXRoTGVuZ3RoQ29sdW1uVHlwZXMuZmluZChmdW5jdGlvbiAoY29sKSB7IHJldHVybiBjb2wgPT09IGRhdGFUeXBlXzE7IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBwYXJzZUludChmdWxsVHlwZS5zdWJzdHJpbmcocG9zICsgMSwgZnVsbFR5cGUubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5sZW5ndGggPSBsZW4udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSBkYXRhVHlwZV8xOyAvLyByZW1vdmUgdGhlIGxlbmd0aCBwYXJ0IGZyb20gdGhlIGRhdGF0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX3RoaXMuZHJpdmVyLndpdGhQcmVjaXNpb25Db2x1bW5UeXBlcy5maW5kKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbCA9PT0gZGF0YVR5cGVfMTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChcIl5cIiArIGRhdGFUeXBlXzEgKyBcIlxcXFwoKFxcXFxkKyksP1xcXFxzPyhcXFxcZCspP1xcXFwpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGZ1bGxUeXBlLm1hdGNoKHJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ucHJlY2lzaW9uID0gK21hdGNoZXNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX3RoaXMuZHJpdmVyLndpdGhTY2FsZUNvbHVtblR5cGVzLmZpbmQoZnVuY3Rpb24gKGNvbCkgeyByZXR1cm4gY29sID09PSBkYXRhVHlwZV8xOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1syXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnNjYWxlID0gK21hdGNoZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4udHlwZSA9IGRhdGFUeXBlXzE7IC8vIHJlbW92ZSB0aGUgcHJlY2lzaW9uL3NjYWxlIHBhcnQgZnJvbSB0aGUgZGF0YXR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cyA9IE9ybVV0aWxzLnVuaXEoZGJGb3JlaWduS2V5cywgZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1wiaWRcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5mb3JlaWduS2V5cyA9IHRhYmxlRm9yZWlnbktleUNvbnN0cmFpbnRzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG93bkZvcmVpZ25LZXlzID0gZGJGb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1wiaWRcIl0gPT09IGZvcmVpZ25LZXlbXCJpZFwiXSAmJiBkYkZvcmVpZ25LZXlbXCJ0YWJsZVwiXSA9PT0gZm9yZWlnbktleVtcInRhYmxlXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lcyA9IG93bkZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXlbXCJmcm9tXCJdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBvd25Gb3JlaWduS2V5cy5tYXAoZnVuY3Rpb24gKGRiRm9yZWlnbktleSkgeyByZXR1cm4gZGJGb3JlaWduS2V5W1widG9cIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVpbGQgZm9yZWlnbiBrZXkgbmFtZSwgYmVjYXVzZSB3ZSBjYW4gbm90IGdldCBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBma05hbWUgPSBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKHRhYmxlLCBjb2x1bW5OYW1lcywgZm9yZWlnbktleS5yZWZlcmVuY2VkVGFibGVOYW1lLCBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmtOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBjb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBmb3JlaWduS2V5W1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWVzOiByZWZlcmVuY2VkQ29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGU6IGZvcmVpZ25LZXlbXCJvbl9kZWxldGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IGZvcmVpZ25LZXlbXCJvbl91cGRhdGVcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlTWFwcGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlUmVnZXggPSAvQ09OU1RSQUlOVCBcIihbXlwiXSopXCIgVU5JUVVFIFxcKCguKj8pXFwpL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodW5pcXVlUmVnZXhSZXN1bHQgPSB1bmlxdWVSZWdleC5leGVjKHNxbCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB1bmlxdWVSZWdleFJlc3VsdFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB1bmlxdWVSZWdleFJlc3VsdFsyXS5zdWJzdHIoMSwgdW5pcXVlUmVnZXhSZXN1bHRbMl0ubGVuZ3RoIC0gMikuc3BsaXQoXCJcXFwiLCBcXFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVVuaXF1ZVByb21pc2VzID0gZGJJbmRpY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wib3JpZ2luXCJdID09PSBcInVcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXgpIHsgcmV0dXJuIGRiSW5kZXhbXCJuYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXhOYW1lKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGJJbmRleCwgaW5kZXhJbmZvcywgaW5kZXhDb2x1bW5zLCBjb2x1bW4sIGZvdW5kTWFwcGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiSW5kZXggPSBkYkluZGljZXMuZmluZChmdW5jdGlvbiAoZGJJbmRleCkgeyByZXR1cm4gZGJJbmRleFtcIm5hbWVcIl0gPT09IGRiSW5kZXhOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnkoXCJQUkFHTUEgaW5kZXhfaW5mbyhcXFwiXCIgKyBkYkluZGV4W1wibmFtZVwiXSArIFwiXFxcIilcIildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluZm9zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb2x1bW5zID0gaW5kZXhJbmZvc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uIChpbmRleEluZm8xLCBpbmRleEluZm8yKSB7IHJldHVybiBwYXJzZUludChpbmRleEluZm8xW1wic2Vxbm9cIl0pIC0gcGFyc2VJbnQoaW5kZXhJbmZvMltcInNlcW5vXCJdKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpbmRleEluZm8pIHsgcmV0dXJuIGluZGV4SW5mb1tcIm5hbWVcIl07IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4Q29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSB0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFpbmRleENvbHVtbnMuZmluZChmdW5jdGlvbiAoaW5kZXhDb2x1bW4pIHsgcmV0dXJuIGluZGV4Q29sdW1uID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwcGluZyA9IHVuaXF1ZU1hcHBpbmdzLmZpbmQoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZy5jb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4Q29sdW1ucy5pbmRleE9mKGNvbHVtbikgIT09IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFRhYmxlVW5pcXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm91bmRNYXBwaW5nID8gZm91bmRNYXBwaW5nLm5hbWUgOiB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUodGFibGUsIGluZGV4Q29sdW1ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBpbmRleENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSB0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGFibGVVbmlxdWVQcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IudW5pcXVlcyA9IChfYy5zZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHAgPSAvQ09OU1RSQUlOVCBcIihbXlwiXSopXCIgQ0hFQ0sgKFxcKC4qP1xcKSkoWyxdfFspXSQpL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNxbCkpICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuY2hlY2tzLnB1c2gobmV3IFRhYmxlQ2hlY2soeyBuYW1lOiByZXN1bHRbMV0sIGV4cHJlc3Npb246IHJlc3VsdFsyXSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1Byb21pc2VzID0gZGJJbmRpY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wib3JpZ2luXCJdID09PSBcImNcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRiSW5kZXgpIHsgcmV0dXJuIGRiSW5kZXhbXCJuYW1lXCJdOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfSkgLy8gdW5xaXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChkYkluZGV4TmFtZSkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4RGVmLCBjb25kaXRpb24sIGRiSW5kZXgsIGluZGV4SW5mb3MsIGluZGV4Q29sdW1ucywgaXNVbmlxdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleERlZiA9IGRiSW5kaWNlc0RlZi5maW5kKGZ1bmN0aW9uIChkYkluZGV4RGVmKSB7IHJldHVybiBkYkluZGV4RGVmW1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gL1dIRVJFICguKikvLmV4ZWMoaW5kZXhEZWZbXCJzcWxcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmRleCA9IGRiSW5kaWNlcy5maW5kKGZ1bmN0aW9uIChkYkluZGV4KSB7IHJldHVybiBkYkluZGV4W1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShcIlBSQUdNQSBpbmRleF9pbmZvKFxcXCJcIiArIGRiSW5kZXhbXCJuYW1lXCJdICsgXCJcXFwiKVwiKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SW5mb3MgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvbHVtbnMgPSBpbmRleEluZm9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24gKGluZGV4SW5mbzEsIGluZGV4SW5mbzIpIHsgcmV0dXJuIHBhcnNlSW50KGluZGV4SW5mbzFbXCJzZXFub1wiXSkgLSBwYXJzZUludChpbmRleEluZm8yW1wic2Vxbm9cIl0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4SW5mbykgeyByZXR1cm4gaW5kZXhJbmZvW1wibmFtZVwiXTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGRiSW5kZXhbXCJ1bmlxdWVcIl0gPT09IFwiMVwiIHx8IGRiSW5kZXhbXCJ1bmlxdWVcIl0gPT09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFRhYmxlSW5kZXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRiSW5kZXhbXCJuYW1lXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogaW5kZXhDb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaXF1ZTogaXNVbmlxdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiBjb25kaXRpb24gPyBjb25kaXRpb25bMV0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaW5kaWNlc1Byb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbmRpY2VzID0gaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiAhIWluZGV4OyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRhYmxlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSB0YWJsZSBzcWwuXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVGFibGVTcWwgPSBmdW5jdGlvbiAodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwcmltYXJ5Q29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnk7IH0pO1xuICAgICAgICB2YXIgaGFzQXV0b0luY3JlbWVudCA9IHByaW1hcnlDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCI7IH0pO1xuICAgICAgICB2YXIgc2tpcFByaW1hcnkgPSBwcmltYXJ5Q29sdW1ucy5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoc2tpcFByaW1hcnkgJiYgaGFzQXV0b0luY3JlbWVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBBVVRPSU5DUkVNRU5UIG9uIGNvbXBvc2l0ZSBwcmltYXJ5IGtleVwiKTtcbiAgICAgICAgdmFyIGNvbHVtbkRlZmluaXRpb25zID0gdGFibGUuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuYnVpbGRDcmVhdGVDb2x1bW5TcWwoY29sdW1uLCBza2lwUHJpbWFyeSk7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgdmFyIHNxbCA9IFwiQ1JFQVRFIFRBQkxFIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCIgKFwiICsgY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgICAgIC8vIG5lZWQgZm9yIGBhZGRDb2x1bW4oKWAgbWV0aG9kLCBiZWNhdXNlIGl0IHJlY3JlYXRlcyB0YWJsZS5cbiAgICAgICAgdGFibGUuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNVbmlxdWU7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgaXNVbmlxdWVFeGlzdCA9IHRhYmxlLnVuaXF1ZXMuc29tZShmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID09PSAxICYmIHVuaXF1ZS5jb2x1bW5OYW1lc1swXSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgaWYgKCFpc1VuaXF1ZUV4aXN0KVxuICAgICAgICAgICAgICAgIHRhYmxlLnVuaXF1ZXMucHVzaChuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRhYmxlLCBbY29sdW1uLm5hbWVdKSxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZXM6IFtjb2x1bW4ubmFtZV1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGFibGUudW5pcXVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgdW5pcXVlc1NxbCA9IHRhYmxlLnVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdW5pcXVlTmFtZSA9IHVuaXF1ZS5uYW1lID8gdW5pcXVlLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRhYmxlLCB1bmlxdWUuY29sdW1uTmFtZXMpO1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lcyA9IHVuaXF1ZS5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQ09OU1RSQUlOVCBcXFwiXCIgKyB1bmlxdWVOYW1lICsgXCJcXFwiIFVOSVFVRSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBcIiArIHVuaXF1ZXNTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmNoZWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2tzU3FsID0gdGFibGUuY2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hlY2tOYW1lID0gY2hlY2submFtZSA/IGNoZWNrLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmNoZWNrQ29uc3RyYWludE5hbWUodGFibGUsIGNoZWNrLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkNPTlNUUkFJTlQgXFxcIlwiICsgY2hlY2tOYW1lICsgXCJcXFwiIENIRUNLIChcIiArIGNoZWNrLmV4cHJlc3Npb24gKyBcIilcIjtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyBjaGVja3NTcWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlLmZvcmVpZ25LZXlzLmxlbmd0aCA+IDAgJiYgY3JlYXRlRm9yZWlnbktleXMpIHtcbiAgICAgICAgICAgIHZhciBmb3JlaWduS2V5c1NxbCA9IHRhYmxlLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZmspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZXMgPSBmay5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFmay5uYW1lKVxuICAgICAgICAgICAgICAgICAgICBmay5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZSh0YWJsZSwgZmsuY29sdW1uTmFtZXMsIF90aGlzLmdldFRhYmxlUGF0aChmayksIGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IGZrLnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBcIkNPTlNUUkFJTlQgXFxcIlwiICsgZmsubmFtZSArIFwiXFxcIiBGT1JFSUdOIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKSBSRUZFUkVOQ0VTIFxcXCJcIiArIGZrLnJlZmVyZW5jZWRUYWJsZU5hbWUgKyBcIlxcXCIgKFwiICsgcmVmZXJlbmNlZENvbHVtbk5hbWVzICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgaWYgKGZrLm9uRGVsZXRlKVxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50ICs9IFwiIE9OIERFTEVURSBcIiArIGZrLm9uRGVsZXRlO1xuICAgICAgICAgICAgICAgIGlmIChmay5vblVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludCArPSBcIiBPTiBVUERBVEUgXCIgKyBmay5vblVwZGF0ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RyYWludDtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIHNxbCArPSBcIiwgXCIgKyBmb3JlaWduS2V5c1NxbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWVzID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgc3FsICs9IFwiLCBQUklNQVJZIEtFWSAoXCIgKyBjb2x1bW5OYW1lcyArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIHNxbCArPSBcIilcIjtcbiAgICAgICAgdmFyIHRhYmxlTWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZW50aXR5TWV0YWRhdGFzLmZpbmQoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgaWYgKHRhYmxlTWV0YWRhdGEgJiYgdGFibGVNZXRhZGF0YS53aXRob3V0Um93aWQpIHtcbiAgICAgICAgICAgIHNxbCArPSBcIiBXSVRIT1VUIFJPV0lEXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShzcWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGRyb3AgdGFibGUgc3FsLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BUYWJsZVNxbCA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgaWZFeGlzdCkge1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGFibGVPck5hbWUgaW5zdGFuY2VvZiBUYWJsZSA/IHRhYmxlT3JOYW1lLm5hbWUgOiB0YWJsZU9yTmFtZTtcbiAgICAgICAgdmFyIHF1ZXJ5ID0gaWZFeGlzdCA/IFwiRFJPUCBUQUJMRSBJRiBFWElTVFMgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCIgOiBcIkRST1AgVEFCTEUgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkocXVlcnkpO1xuICAgIH07XG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuY3JlYXRlVmlld1NxbCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiQ1JFQVRFIFZJRVcgXFxcIlwiICsgdmlldy5uYW1lICsgXCJcXFwiIEFTIFwiICsgdmlldy5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgVklFVyBcXFwiXCIgKyB2aWV3Lm5hbWUgKyBcIlxcXCIgQVMgXCIgKyB2aWV3LmV4cHJlc3Npb24odGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuaW5zZXJ0Vmlld0RlZmluaXRpb25TcWwgPSBmdW5jdGlvbiAodmlldykge1xuICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3LmV4cHJlc3Npb24gPT09IFwic3RyaW5nXCIgPyB2aWV3LmV4cHJlc3Npb24udHJpbSgpIDogdmlldy5leHByZXNzaW9uKHRoaXMuY29ubmVjdGlvbikuZ2V0UXVlcnkoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLlZJRVcsXG4gICAgICAgICAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHZpZXcgc3FsLlxuICAgICAqL1xuICAgIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRyb3BWaWV3U3FsID0gZnVuY3Rpb24gKHZpZXdPclBhdGgpIHtcbiAgICAgICAgdmFyIHZpZXdOYW1lID0gdmlld09yUGF0aCBpbnN0YW5jZW9mIFZpZXcgPyB2aWV3T3JQYXRoLm5hbWUgOiB2aWV3T3JQYXRoO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFwiRFJPUCBWSUVXIFxcXCJcIiArIHZpZXdOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbW92ZSB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kZWxldGVWaWV3RGVmaW5pdGlvblNxbCA9IGZ1bmN0aW9uICh2aWV3T3JQYXRoKSB7XG4gICAgICAgIHZhciB2aWV3TmFtZSA9IHZpZXdPclBhdGggaW5zdGFuY2VvZiBWaWV3ID8gdmlld09yUGF0aC5uYW1lIDogdmlld09yUGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHsgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuVklFVywgbmFtZTogdmlld05hbWUgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY3JlYXRlIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5jcmVhdGVJbmRleFNxbCA9IGZ1bmN0aW9uICh0YWJsZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSBpbmRleC5jb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uTmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoXCJDUkVBVEUgXCIgKyAoaW5kZXguaXNVbmlxdWUgPyBcIlVOSVFVRSBcIiA6IFwiXCIpICsgXCJJTkRFWCBcXFwiXCIgKyBpbmRleC5uYW1lICsgXCJcXFwiIE9OIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCIgKFwiICsgY29sdW1ucyArIFwiKSBcIiArIChpbmRleC53aGVyZSA/IFwiV0hFUkUgXCIgKyBpbmRleC53aGVyZSA6IFwiXCIpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIGluZGV4IHNxbC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5kcm9wSW5kZXhTcWwgPSBmdW5jdGlvbiAoaW5kZXhPck5hbWUpIHtcbiAgICAgICAgdmFyIGluZGV4TmFtZSA9IGluZGV4T3JOYW1lIGluc3RhbmNlb2YgVGFibGVJbmRleCA/IGluZGV4T3JOYW1lLm5hbWUgOiBpbmRleE9yTmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcIkRST1AgSU5ERVggXFxcIlwiICsgaW5kZXhOYW1lICsgXCJcXFwiXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgcXVlcnkgZm9yIGNyZWF0ZSBjb2x1bW4uXG4gICAgICovXG4gICAgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5wcm90b3R5cGUuYnVpbGRDcmVhdGVDb2x1bW5TcWwgPSBmdW5jdGlvbiAoY29sdW1uLCBza2lwUHJpbWFyeSkge1xuICAgICAgICB2YXIgYyA9IFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIENvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjICs9IFwiIFwiICsgdGhpcy5kcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuY3JlYXRlRnVsbFR5cGUoY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uLmVudW0pXG4gICAgICAgICAgICBjICs9IFwiIENIRUNLKCBcIiArIGNvbHVtbi5uYW1lICsgXCIgSU4gKFwiICsgY29sdW1uLmVudW0ubWFwKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiJ1wiICsgdmFsICsgXCInXCI7IH0pLmpvaW4oXCIsXCIpICsgXCIpIClcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5pc1ByaW1hcnkgJiYgIXNraXBQcmltYXJ5KVxuICAgICAgICAgICAgYyArPSBcIiBQUklNQVJZIEtFWVwiO1xuICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkID09PSB0cnVlICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIpIC8vIGRvbid0IHVzZSBza2lwUHJpbWFyeSBoZXJlIHNpbmNlIHVwZGF0ZXMgY2FuIHVwZGF0ZSBhbHJlYWR5IGV4aXN0IHByaW1hcnkgd2l0aG91dCBhdXRvIGluYy5cbiAgICAgICAgICAgIGMgKz0gXCIgQVVUT0lOQ1JFTUVOVFwiO1xuICAgICAgICBpZiAoY29sdW1uLmNvbGxhdGlvbilcbiAgICAgICAgICAgIGMgKz0gXCIgQ09MTEFURSBcIiArIGNvbHVtbi5jb2xsYXRpb247XG4gICAgICAgIGlmIChjb2x1bW4uaXNOdWxsYWJsZSAhPT0gdHJ1ZSlcbiAgICAgICAgICAgIGMgKz0gXCIgTk9UIE5VTExcIjtcbiAgICAgICAgaWYgKGNvbHVtbi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmRlZmF1bHQgIT09IG51bGwpXG4gICAgICAgICAgICBjICs9IFwiIERFRkFVTFQgKFwiICsgY29sdW1uLmRlZmF1bHQgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfTtcbiAgICBBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZWNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKG5ld1RhYmxlLCBvbGRUYWJsZSwgbWlncmF0ZURhdGEpIHtcbiAgICAgICAgaWYgKG1pZ3JhdGVEYXRhID09PSB2b2lkIDApIHsgbWlncmF0ZURhdGEgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1cFF1ZXJpZXMsIGRvd25RdWVyaWVzLCBuZXdDb2x1bW5OYW1lcywgb2xkQ29sdW1uTmFtZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBvbGQgdGFibGUgaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKF90aGlzLmRyb3BJbmRleFNxbChpbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwob2xkVGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0YWJsZSBuYW1lIGludG8gJ3RlbXBvcmFyeV90YWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBcInRlbXBvcmFyeV9cIiArIG5ld1RhYmxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3IHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlU3FsKG5ld1RhYmxlLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKG5ld1RhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWdyYXRlIGFsbCBkYXRhIGZyb20gdGhlIG9sZCB0YWJsZSBpbnRvIG5ldyB0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pZ3JhdGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uTmFtZXMgPSBuZXdUYWJsZS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW5OYW1lcyA9IG9sZFRhYmxlLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFwiXFxcIlwiICsgY29sdW1uLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRUYWJsZS5jb2x1bW5zLmxlbmd0aCA8IG5ld1RhYmxlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbk5hbWVzID0gbmV3VGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFRhYmxlLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBcIlxcXCJcIiArIGNvbHVtbi5uYW1lICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkVGFibGUuY29sdW1ucy5sZW5ndGggPiBuZXdUYWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb2x1bW5OYW1lcyA9IG9sZFRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUYWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gXCJcXFwiXCIgKyBjb2x1bW4ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIklOU0VSVCBJTlRPIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCIoXCIgKyBuZXdDb2x1bW5OYW1lcyArIFwiKSBTRUxFQ1QgXCIgKyBvbGRDb2x1bW5OYW1lcyArIFwiIEZST00gXFxcIlwiICsgb2xkVGFibGUubmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJJTlNFUlQgSU5UTyBcXFwiXCIgKyBvbGRUYWJsZS5uYW1lICsgXCJcXFwiKFwiICsgb2xkQ29sdW1uTmFtZXMgKyBcIikgU0VMRUNUIFwiICsgbmV3Q29sdW1uTmFtZXMgKyBcIiBGUk9NIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCBvbGQgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKG9sZFRhYmxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwob2xkVGFibGUsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBvbGQgdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKG5ldyBRdWVyeShcIkFMVEVSIFRBQkxFIFxcXCJcIiArIG5ld1RhYmxlLm5hbWUgKyBcIlxcXCIgUkVOQU1FIFRPIFxcXCJcIiArIG9sZFRhYmxlLm5hbWUgKyBcIlxcXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChuZXcgUXVlcnkoXCJBTFRFUiBUQUJMRSBcXFwiXCIgKyBvbGRUYWJsZS5uYW1lICsgXCJcXFwiIFJFTkFNRSBUTyBcXFwiXCIgKyBuZXdUYWJsZS5uYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLm5hbWUgPSBvbGRUYWJsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjcmVhdGUgdGFibGUgaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpbmRleCBtYXkgYmUgcGFzc2VkIHdpdGhvdXQgbmFtZS4gSW4gdGhpcyBjYXNlIHdlIGdlbmVyYXRlIGluZGV4IG5hbWUgbWFudWFsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUobmV3VGFibGUsIGluZGV4LmNvbHVtbk5hbWVzLCBpbmRleC53aGVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goX3RoaXMuY3JlYXRlSW5kZXhTcWwobmV3VGFibGUsIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChfdGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKG9sZFRhYmxlLCBuZXdUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXI7XG59KEJhc2VRdWVyeVJ1bm5lcikpO1xuZXhwb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVEcml2ZXJcIjtcbmltcG9ydCB7IFNxbGpzUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi9TcWxqc1F1ZXJ5UnVubmVyXCI7XG5pbXBvcnQgeyBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yXCI7XG5pbXBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvclwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JcIjtcbnZhciBTcWxqc0RyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3FsanNEcml2ZXIsIF9zdXBlcik7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFNxbGpzRHJpdmVyKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbikgfHwgdGhpcztcbiAgICAgICAgLy8gSWYgYXV0b1NhdmUgaXMgZW5hYmxlZCBieSB1c2VyLCBsb2NhdGlvbiBvciBhdXRvU2F2ZUNhbGxiYWNrIGhhdmUgdG8gYmUgc2V0XG4gICAgICAgIC8vIGJlY2F1c2UgZWl0aGVyIGF1dG9TYXZlIHNhdmVzIHRvIGxvY2F0aW9uIG9yIGNhbGxzIGF1dG9TYXZlQ2FsbGJhY2suXG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF1dG9TYXZlICYmICFfdGhpcy5vcHRpb25zLmxvY2F0aW9uICYmICFfdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcihcImxvY2F0aW9uIG9yIGF1dG9TYXZlQ2FsbGJhY2tcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9hZCBzcWwuanMgcGFja2FnZVxuICAgICAgICBfdGhpcy5sb2FkRGVwZW5kZW5jaWVzKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EuZGF0YWJhc2VDb25uZWN0aW9uID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsb3NlcyBjb25uZWN0aW9uIHdpdGggZGF0YWJhc2UuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHJ1bm5lciB1c2VkIHRvIGV4ZWN1dGUgZGF0YWJhc2UgcXVlcmllcy5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gbmV3IFNxbGpzUXVlcnlSdW5uZXIodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBkYXRhYmFzZSBmcm9tIGEgZ2l2ZW4gZmlsZSAoTm9kZS5qcyksIGxvY2FsIHN0b3JhZ2Uga2V5IChicm93c2VyKSBvciBhcnJheS5cbiAgICAgKiBUaGlzIHdpbGwgZGVsZXRlIHRoZSBjdXJyZW50IGRhdGFiYXNlIVxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEsIGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMpIHtcbiAgICAgICAgaWYgKGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMgPT09IHZvaWQgMCkgeyBjaGVja0lmRmlsZU9yTG9jYWxTdG9yYWdlRXhpc3RzID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YWJhc2UsIGxvY2FsU3RvcmFnZUNvbnRlbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSA9PT0gXCJzdHJpbmdcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoUGxhdGZvcm1Ub29scy50eXBlID09PSBcIm5vZGVcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSBzaG91bGQgYmUgYSBwYXRoIHRvIHRoZSBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGxhdGZvcm1Ub29scy5maWxlRXhpc3QoZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSA9IFBsYXRmb3JtVG9vbHMucmVhZEZpbGVTeW5jKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQoZGF0YWJhc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrSWZGaWxlT3JMb2NhbFN0b3JhZ2VFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiRmlsZSBcIiArIGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEgKyBcIiBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBhbmQgY2hlY2tJZkZpbGVPckxvY2FsU3RvcmFnZUV4aXN0cyBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG9wZW4gYSBkYXRhYmFzZSB3aXRob3V0IGltcG9ydGluZyBhbiBleGlzdGluZyBmaWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgd2lsbCBiZSB3cml0dGVuIG9uIGZpcnN0IHdyaXRlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb25XaXRoSW1wb3J0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUNvbnRlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlTG9jYWxGb3JhZ2UpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cubG9jYWxmb3JhZ2UpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2luZG93LmxvY2FsZm9yYWdlLmdldEl0ZW0oZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2VDb250ZW50ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2FsZm9yYWdlIGlzIG5vdCBkZWZpbmVkIC0gcGxlYXNlIGltcG9ydCBsb2NhbGZvcmFnZS5qcyBpbnRvIHlvdXIgc2l0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlQ29udGVudCA9IFBsYXRmb3JtVG9vbHMuZ2V0R2xvYmFsVmFyaWFibGUoKS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShmaWxlTmFtZU9yTG9jYWxTdG9yYWdlT3JEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsU3RvcmFnZSB2YWx1ZSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uV2l0aEltcG9ydChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZUNvbnRlbnQpKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0lmRmlsZU9yTG9jYWxTdG9yYWdlRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkZpbGUgXCIgKyBmaWxlTmFtZU9yTG9jYWxTdG9yYWdlT3JEYXRhICsgXCIgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgdmFsdWUgZG9lc24ndCBleGlzdCBhbmQgY2hlY2tJZkZpbGVPckxvY2FsU3RvcmFnZUV4aXN0cyBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG9wZW4gYSBkYXRhYmFzZSB3aXRob3V0IGltcG9ydGluZyBhbnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgdmFsdWUgd2lsbCBiZSB3cml0dGVuIG9uIGZpcnN0IHdyaXRlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb25XaXRoSW1wb3J0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQoZmlsZU5hbWVPckxvY2FsU3RvcmFnZU9yRGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXZlZCB0aGUgY3VycmVudCBkYXRhYmFzZSB0byB0aGUgZ2l2ZW4gZmlsZSAoTm9kZS5qcyksIGxvY2FsIHN0b3JhZ2Uga2V5IChicm93c2VyKSBvclxuICAgICAqIGluZGV4ZWREQiBrZXkgKGJyb3dzZXIgd2l0aCBlbmFibGVkIHVzZUxvY2FsRm9yYWdlIG9wdGlvbikuXG4gICAgICogSWYgbm8gbG9jYXRpb24gcGF0aCBpcyBnaXZlbiwgdGhlIGxvY2F0aW9uIHBhdGggaW4gdGhlIG9wdGlvbnMgKGlmIHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXRoLCBjb250ZW50LCBlXzEsIGRhdGFiYXNlLCBkYXRhYmFzZUFycmF5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhdGlvbiAmJiAhdGhpcy5vcHRpb25zLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vIGxvY2F0aW9uIGlzIHNldCwgc3BlY2lmeSBhIGxvY2F0aW9uIHBhcmFtZXRlciBvciBhZGQgdGhlIGxvY2F0aW9uIG9wdGlvbiB0byB5b3VyIGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0aGlzLm9wdGlvbnMubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShQbGF0Zm9ybVRvb2xzLnR5cGUgPT09IFwibm9kZVwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gQnVmZmVyLmZyb20odGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXhwb3J0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUGxhdGZvcm1Ub29scy53cml0ZUZpbGUocGF0aCwgY29udGVudCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvdWxkIG5vdCBzYXZlIGRhdGFiYXNlLCBlcnJvcjogXCIgKyBlXzEpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5leHBvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlQXJyYXkgPSBbXS5zbGljZS5jYWxsKGRhdGFiYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZUxvY2FsRm9yYWdlKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmxvY2FsZm9yYWdlKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdpbmRvdy5sb2NhbGZvcmFnZS5zZXRJdGVtKHBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGFiYXNlQXJyYXkpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJsb2NhbGZvcmFnZSBpcyBub3QgZGVmaW5lZCAtIHBsZWFzZSBpbXBvcnQgbG9jYWxmb3JhZ2UuanMgaW50byB5b3VyIHNpdGVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmdldEdsb2JhbFZhcmlhYmxlKCkubG9jYWxTdG9yYWdlLnNldEl0ZW0ocGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YWJhc2VBcnJheSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdGhlIFF1ZXJ5UnVubmVyIHdoZW4gYSBjaGFuZ2UgdG8gdGhlIGRhdGFiYXNlIGlzIG1hZGUuXG4gICAgICogSWYgYSBjdXN0b20gYXV0b1NhdmVDYWxsYmFjayBpcyBzcGVjaWZpZWQsIGl0IGdldCdzIGNhbGxlZCB3aXRoIHRoZSBkYXRhYmFzZSBhcyBVaW50OEFycmF5LFxuICAgICAqIG90aGVyd2lzZSB0aGUgc2F2ZSBtZXRob2QgaXMgY2FsbGVkIHdoaWNoIHNhdmVzIGl0IHRvIGZpbGUgKE5vZGUuanMpLCBsb2NhbCBzdG9yYWdlIChicm93c2VyKVxuICAgICAqIG9yIGluZGV4ZWREQiAoYnJvd3NlciB3aXRoIGVuYWJsZWQgdXNlTG9jYWxGb3JhZ2Ugb3B0aW9uKS5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuYXV0b1NhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF1dG9TYXZlKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2spIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5vcHRpb25zLmF1dG9TYXZlQ2FsbGJhY2sodGhpcy5leHBvcnQoKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNhdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRhYmFzZSBhcyBVaW50OEFycmF5LlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5leHBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbi5leHBvcnQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZ2VuZXJhdGVkIG1hcCBvZiB2YWx1ZXMgZ2VuZXJhdGVkIG9yIHJldHVybmVkIGJ5IGRhdGFiYXNlIGFmdGVyIElOU0VSVCBxdWVyeS5cbiAgICAgKi9cbiAgICBTcWxqc0RyaXZlci5wcm90b3R5cGUuY3JlYXRlR2VuZXJhdGVkTWFwID0gZnVuY3Rpb24gKG1ldGFkYXRhLCBpbnNlcnRSZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGdlbmVyYXRlZE1hcCA9IG1ldGFkYXRhLmdlbmVyYXRlZENvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGdlbmVyYXRlZENvbHVtbikge1xuICAgICAgICAgICAgLy8gc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgaW5zZXJ0ZWQgaWQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20va3JpcGtlbi9zcWwuanMvaXNzdWVzLzc3XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1uLmlzUHJpbWFyeSAmJiBnZW5lcmF0ZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gXCJTRUxFQ1QgbGFzdF9pbnNlcnRfcm93aWQoKVwiO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfdGhpcy5kYXRhYmFzZUNvbm5lY3Rpb24uZXhlYyhxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIGdlbmVyYXRlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcChyZXN1bHRbMF0udmFsdWVzWzBdWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZSwgcXVlcnksIFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhnZW5lcmF0ZWRNYXApLmxlbmd0aCA+IDAgPyBnZW5lcmF0ZWRNYXAgOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlLlxuICAgICAqIElmIHRoZSBsb2NhdGlvbiBvcHRpb24gaXMgc2V0LCB0aGUgZGF0YWJhc2UgaXMgbG9hZGVkIGZpcnN0LlxuICAgICAqL1xuICAgIFNxbGpzRHJpdmVyLnByb3RvdHlwZS5jcmVhdGVEYXRhYmFzZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQodGhpcy5vcHRpb25zLmxvY2F0aW9uLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0YWJhc2VDb25uZWN0aW9uV2l0aEltcG9ydCh0aGlzLm9wdGlvbnMuZGF0YWJhc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb25uZWN0aW9uIHdpdGggYW4gb3B0aW9uYWwgZGF0YWJhc2UuXG4gICAgICogSWYgZGF0YWJhc2UgaXMgc3BlY2lmaWVkIGl0IGlzIGxvYWRlZCwgb3RoZXJ3aXNlIGEgbmV3IGVtcHR5IGRhdGFiYXNlIGlzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmNyZWF0ZURhdGFiYXNlQ29ubmVjdGlvbldpdGhJbXBvcnQgPSBmdW5jdGlvbiAoZGF0YWJhc2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlzTGVnYWN5VmVyc2lvbiwgc3FsaXRlLCBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVnYWN5VmVyc2lvbiA9IHR5cGVvZiB0aGlzLnNxbGl0ZS5EYXRhYmFzZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xlZ2FjeVZlcnNpb24pIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLnNxbGl0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc3FsaXRlKHRoaXMub3B0aW9ucy5zcWxKc0NvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YWJhc2UgJiYgZGF0YWJhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uID0gbmV3IHNxbGl0ZS5EYXRhYmFzZShkYXRhYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ29ubmVjdGlvbiA9IG5ldyBzcWxpdGUuRGF0YWJhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uLmV4ZWMoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gT047XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZGF0YWJhc2VDb25uZWN0aW9uXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiBkcml2ZXIgZGVwZW5kZW5jeSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSwgdGhlbiB0cnkgdG8gbG9hZCBpdCB2aWEgXCJyZXF1aXJlXCIuXG4gICAgICovXG4gICAgU3FsanNEcml2ZXIucHJvdG90eXBlLmxvYWREZXBlbmRlbmNpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChQbGF0Zm9ybVRvb2xzLnR5cGUgPT09IFwiYnJvd3NlclwiKSB7XG4gICAgICAgICAgICB2YXIgc3FsaXRlID0gdGhpcy5vcHRpb25zLmRyaXZlciB8fCB3aW5kb3cuU1FMO1xuICAgICAgICAgICAgdGhpcy5zcWxpdGUgPSBzcWxpdGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBzcWxpdGUgPSB0aGlzLm9wdGlvbnMuZHJpdmVyIHx8IFBsYXRmb3JtVG9vbHMubG9hZChcInNxbC5qc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNxbGl0ZSA9IHNxbGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvcihcInNxbC5qc1wiLCBcInNxbC5qc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFNxbGpzRHJpdmVyO1xufShBYnN0cmFjdFNxbGl0ZURyaXZlcikpO1xuZXhwb3J0IHsgU3FsanNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3FsanNEcml2ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lciB9IGZyb20gXCIuLi9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgQnJvYWRjYXN0ZXIgfSBmcm9tIFwiLi4vLi4vc3Vic2NyaWJlci9Ccm9hZGNhc3RlclwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9RdWVyeUZhaWxlZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi8uLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbi8qKlxuICogUnVucyBxdWVyaWVzIG9uIGEgc2luZ2xlIHNxbGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgU3FsanNRdWVyeVJ1bm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3FsanNRdWVyeVJ1bm5lciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3FsanNRdWVyeVJ1bm5lcihkcml2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIGEgbW9kaWZpY2F0aW9uIGhhcyBoYXBwZW5lZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgcXVlcnkgcnVubmVyIGhhcyByZXF1ZXN0ZWQgYSBzYXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIF90aGlzLmNvbm5lY3Rpb24gPSBkcml2ZXIuY29ubmVjdGlvbjtcbiAgICAgICAgX3RoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgQnJvYWRjYXN0ZXIoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgbWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBTcWxqc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlydHkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcml2ZXIuYXV0b1NhdmUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTcWxqc1F1ZXJ5UnVubmVyLnByb3RvdHlwZS5yZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBfc3VwZXIucHJvdG90eXBlLnJlbGVhc2UuY2FsbCh0aGlzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0cmFuc2FjdGlvbi5cbiAgICAgKiBFcnJvciB3aWxsIGJlIHRocm93biBpZiB0cmFuc2FjdGlvbiB3YXMgbm90IHN0YXJ0ZWQuXG4gICAgICovXG4gICAgU3FsanNRdWVyeVJ1bm5lci5wcm90b3R5cGUuY29tbWl0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgX3N1cGVyLnByb3RvdHlwZS5jb21taXRUcmFuc2FjdGlvbi5jYWxsKHRoaXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZ2l2ZW4gU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNxbGpzUXVlcnlSdW5uZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzID09PSB2b2lkIDApIHsgcGFyYW1ldGVycyA9IFtdOyB9XG4gICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0ID09PSB2b2lkIDApIHsgdXNlU3RydWN0dXJlZFJlc3VsdCA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb21tYW5kLCBkYXRhYmFzZUNvbm5lY3Rpb24sIHF1ZXJ5U3RhcnRUaW1lLCBzdGF0ZW1lbnQsIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnlFbmRUaW1lLCBxdWVyeUV4ZWN1dGlvblRpbWUsIHJlY29yZHMsIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBxdWVyeS50cmltKCkuc3BsaXQoXCIgXCIsIDEpWzBdO1xuICAgICAgICAgICAgICAgIGRhdGFiYXNlQ29ubmVjdGlvbiA9IHRoaXMuZHJpdmVyLmRhdGFiYXNlQ29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycywgdGhpcyk7XG4gICAgICAgICAgICAgICAgcXVlcnlTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBkYXRhYmFzZUNvbm5lY3Rpb24ucHJlcGFyZShxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHR5cGVvZiBwICE9PSAndW5kZWZpbmVkJyA/IHAgOiBudWxsOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1heFF1ZXJ5RXhlY3V0aW9uVGltZSA9IHRoaXMuZHJpdmVyLm9wdGlvbnMubWF4UXVlcnlFeGVjdXRpb25UaW1lO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeUVuZFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlFeGVjdXRpb25UaW1lID0gcXVlcnlFbmRUaW1lIC0gcXVlcnlTdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhRdWVyeUV4ZWN1dGlvblRpbWUgJiYgcXVlcnlFeGVjdXRpb25UaW1lID4gbWF4UXVlcnlFeGVjdXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY29ubmVjdGlvbi5sb2dnZXIubG9nUXVlcnlTbG93KHF1ZXJ5RXhlY3V0aW9uVGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzLnB1c2goc3RhdGVtZW50LmdldEFzT2JqZWN0KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBRdWVyeVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSBkYXRhYmFzZUNvbm5lY3Rpb24uZ2V0Um93c01vZGlmaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZWNvcmRzID0gcmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJhdyA9IHJlY29yZHM7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5mcmVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTdHJ1Y3R1cmVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHQucmF3XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuZnJlZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1F1ZXJ5RXJyb3IoZSwgcXVlcnksIHBhcmFtZXRlcnMsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihxdWVyeSwgcGFyYW1ldGVycywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBTcWxqc1F1ZXJ5UnVubmVyO1xufShBYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyKSk7XG5leHBvcnQgeyBTcWxqc1F1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNxbGpzUXVlcnlSdW5uZXIuanMubWFwXG4iLCIvKipcbiAqIFNxbCBzZXJ2ZXIgZHJpdmVyIHJlcXVpcmVzIHBhcmFtZXRlciB0eXBlcyB0byBiZSBzcGVjaWZpZWQgZm8gaW5wdXQgcGFyYW1ldGVycyB1c2VkIGluIHRoZSBxdWVyeS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXRyaWtzaW1lay9ub2RlLW1zc3FsI2RhdGEtdHlwZXNcbiAqL1xudmFyIE1zc3FsUGFyYW1ldGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1zc3FsUGFyYW1ldGVyKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHBhcmFtc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHVibGljIFByb3BlcnRpZXNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLnBhcmFtcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE1zc3FsUGFyYW1ldGVyO1xufSgpKTtcbmV4cG9ydCB7IE1zc3FsUGFyYW1ldGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1zc3FsUGFyYW1ldGVyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhYmFzZVR5cGUuanMubWFwXG4iLCJleHBvcnQgdmFyIE1ldGFkYXRhVGFibGVUeXBlO1xuKGZ1bmN0aW9uIChNZXRhZGF0YVRhYmxlVHlwZSkge1xuICAgIE1ldGFkYXRhVGFibGVUeXBlW1wiVklFV1wiXSA9IFwiVklFV1wiO1xuICAgIE1ldGFkYXRhVGFibGVUeXBlW1wiTUFURVJJQUxJWkVEX1ZJRVdcIl0gPSBcIk1BVEVSSUFMSVpFRF9WSUVXXCI7XG4gICAgTWV0YWRhdGFUYWJsZVR5cGVbXCJHRU5FUkFURURfQ09MVU1OXCJdID0gXCJHRU5FUkFURURfQ09MVU1OXCI7XG59KShNZXRhZGF0YVRhYmxlVHlwZSB8fCAoTWV0YWRhdGFUYWJsZVR5cGUgPSB7fSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZXRhZGF0YVRhYmxlVHlwZS5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwbGljYXRpb25Nb2RlLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9FbnRpdHlOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yXCI7XG5pbXBvcnQgeyBOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yXCI7XG5pbXBvcnQgeyBUcmVlUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1RyZWVSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRmluZE9wdGlvbnNVdGlscyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNVdGlsc1wiO1xuaW1wb3J0IHsgUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4uL3F1ZXJ5LWJ1aWxkZXIvdHJhbnNmb3JtZXIvUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi9xdWVyeS1idWlsZGVyL3RyYW5zZm9ybWVyL1BsYWluT2JqZWN0VG9EYXRhYmFzZUVudGl0eVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBDdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDdXN0b21SZXBvc2l0b3J5Q2Fubm90SW5oZXJpdFJlcG9zaXRvcnlFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DdXN0b21SZXBvc2l0b3J5Q2Fubm90SW5oZXJpdFJlcG9zaXRvcnlFcnJvclwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JlcG9zaXRvcnlOb3RGb3VuZEVycm9yXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5Tm90VHJlZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JlcG9zaXRvcnlOb3RUcmVlRXJyb3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGYWN0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUZhY3RvcnlcIjtcbmltcG9ydCB7IFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgRW50aXR5UGVyc2lzdEV4ZWN1dG9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0VudGl0eVBlcnNpc3RFeGVjdXRvclwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBFbnRpdHkgbWFuYWdlciBzdXBwb3NlZCB0byB3b3JrIHdpdGggYW55IGVudGl0eSwgYXV0b21hdGljYWxseSBmaW5kIGl0cyByZXBvc2l0b3J5IGFuZCBjYWxsIGl0cyBtZXRob2RzLFxuICogd2hhdGV2ZXIgZW50aXR5IHR5cGUgYXJlIHlvdSBwYXNzaW5nLlxuICovXG52YXIgRW50aXR5TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWFuYWdlcihjb25uZWN0aW9uLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFByb3RlY3RlZCBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9uY2UgY3JlYXRlZCBhbmQgdGhlbiByZXVzZWQgYnkgZW4gcmVwb3NpdG9yaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWluIHRvIG9iamVjdCB0cmFuc2Zvcm1lciB1c2VkIGluIGNyZWF0ZSBhbmQgbWVyZ2Ugb3BlcmF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxhaW5PYmplY3RUb0VudGl0eVRyYW5zZm9ybWVyID0gbmV3IFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lcigpO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICBpZiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgIC8vIGR5bmFtaWM6IHRoaXMucXVlcnlSdW5uZXIgPSBtYW5hZ2VyO1xuICAgICAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMucXVlcnlSdW5uZXIsIHsgbWFuYWdlcjogdGhpcyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcmFwcyBnaXZlbiBmdW5jdGlvbiBleGVjdXRpb24gKGFuZCBhbGwgb3BlcmF0aW9ucyBtYWRlIHRoZXJlKSBpbiBhIHRyYW5zYWN0aW9uLlxuICAgICAqIEFsbCBkYXRhYmFzZSBvcGVyYXRpb25zIG11c3QgYmUgZXhlY3V0ZWQgdXNpbmcgcHJvdmlkZWQgZW50aXR5IG1hbmFnZXIuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUudHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uLCBydW5JblRyYW5zYWN0aW9uUGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlzb2xhdGlvbiwgcnVuSW5UcmFuc2FjdGlvbiwgcXVlcnlSdW5uZXIsIHJlc3VsdCwgZXJyXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGlvbiA9IHR5cGVvZiBpc29sYXRpb25PclJ1bkluVHJhbnNhY3Rpb24gPT09IFwic3RyaW5nXCIgPyBpc29sYXRpb25PclJ1bkluVHJhbnNhY3Rpb24gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JblRyYW5zYWN0aW9uID0gdHlwZW9mIGlzb2xhdGlvbk9yUnVuSW5UcmFuc2FjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gaXNvbGF0aW9uT3JSdW5JblRyYW5zYWN0aW9uIDogcnVuSW5UcmFuc2FjdGlvblBhcmFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFydW5JblRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRyYW5zYWN0aW9uIG1ldGhvZCByZXF1aXJlcyBjYWxsYmFjayBpbiBzZWNvbmQgcGFyYW10ZXIgaWYgaXNvbGF0aW9uIGxldmVsIGlzIHN1cHBsaWVkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlRyYW5zYWN0aW9ucyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IE1vbmdvREIuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIgJiYgdGhpcy5xdWVyeVJ1bm5lci5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyICYmIHRoaXMucXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IHN0YXJ0IHRyYW5zYWN0aW9uIGJlY2F1c2UgaXRzIGFscmVhZHkgc3RhcnRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA4LCAxMywgMTZdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0aW9uKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oaXNvbGF0aW9uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzQgLyp5aWVsZCovLCBydW5JblRyYW5zYWN0aW9uKHF1ZXJ5UnVubmVyLm1hbmFnZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs5LCAxMSwgLCAxMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogdGhyb3cgZXJyXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocXVlcnksIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNvbm5lY3Rpb24ucXVlcnkocXVlcnksIHBhcmFtZXRlcnMsIHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgc3FsIHF1ZXJ5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmNyZWF0ZVF1ZXJ5QnVpbGRlciA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgYWxpYXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChhbGlhcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoZW50aXR5Q2xhc3MsIGFsaWFzLCBxdWVyeVJ1bm5lciB8fCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzIHx8IHF1ZXJ5UnVubmVyIHx8IHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGhhcyBhbiBpZCBieSBpdHMgRnVuY3Rpb24gdHlwZSBvciBzY2hlbWEgbmFtZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgbWF5YmVFbnRpdHkpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyB0YXJnZXRPckVudGl0eSA6IHRhcmdldE9yRW50aXR5LmNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgZW50aXR5ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/IG1heWJlRW50aXR5IDogdGFyZ2V0T3JFbnRpdHk7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGEuaGFzSWQoZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXR5IG1peGVkIGlkLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldElkID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBtYXliZUVudGl0eSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiA/IHRhcmdldE9yRW50aXR5IDogdGFyZ2V0T3JFbnRpdHkuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBlbnRpdHkgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gbWF5YmVFbnRpdHkgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5nZXRFbnRpdHlJZE1peGVkTWFwKGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBpbnN0YW5jZSBvciBpbnN0YW5jZXMuXG4gICAgICogQ2FuIGNvcHkgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgaW50byBuZXcgZW50aXRpZXMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBwbGFpbk9iamVjdE9yT2JqZWN0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICBpZiAoIXBsYWluT2JqZWN0T3JPYmplY3RzKVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmNyZWF0ZSh0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGxhaW5PYmplY3RPck9iamVjdHMpKVxuICAgICAgICAgICAgcmV0dXJuIHBsYWluT2JqZWN0T3JPYmplY3RzLm1hcChmdW5jdGlvbiAocGxhaW5FbnRpdHlMaWtlKSB7IHJldHVybiBfdGhpcy5jcmVhdGUoZW50aXR5Q2xhc3MsIHBsYWluRW50aXR5TGlrZSk7IH0pO1xuICAgICAgICB2YXIgbWVyZ2VJbnRvRW50aXR5ID0gbWV0YWRhdGEuY3JlYXRlKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICB0aGlzLnBsYWluT2JqZWN0VG9FbnRpdHlUcmFuc2Zvcm1lci50cmFuc2Zvcm0obWVyZ2VJbnRvRW50aXR5LCBwbGFpbk9iamVjdE9yT2JqZWN0cywgbWV0YWRhdGEsIHRydWUpO1xuICAgICAgICByZXR1cm4gbWVyZ2VJbnRvRW50aXR5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHR3byBlbnRpdGllcyBpbnRvIG9uZSBuZXcgZW50aXR5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBtZXJnZUludG9FbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVudGl0eUxpa2VzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBlbnRpdHlMaWtlc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICBlbnRpdHlMaWtlcy5mb3JFYWNoKGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIF90aGlzLnBsYWluT2JqZWN0VG9FbnRpdHlUcmFuc2Zvcm1lci50cmFuc2Zvcm0obWVyZ2VJbnRvRW50aXR5LCBvYmplY3QsIG1ldGFkYXRhKTsgfSk7XG4gICAgICAgIHJldHVybiBtZXJnZUludG9FbnRpdHk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBmcm9tIHRoZSBnaXZlbiBwbGFpbiBqYXZhc2NyaXB0IG9iamVjdC4gSWYgZW50aXR5IGFscmVhZHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCB0aGVuXG4gICAgICogaXQgbG9hZHMgaXQgKGFuZCBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaXQpLCByZXBsYWNlcyBhbGwgdmFsdWVzIHdpdGggdGhlIG5ldyBvbmVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAqIGFuZCByZXR1cm5zIHRoaXMgbmV3IGVudGl0eS4gVGhpcyBuZXcgZW50aXR5IGlzIGFjdHVhbGx5IGEgbG9hZGVkIGZyb20gdGhlIGRiIGVudGl0eSB3aXRoIGFsbCBwcm9wZXJ0aWVzXG4gICAgICogcmVwbGFjZWQgZnJvbSB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBlbnRpdHlMaWtlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIsIHRyYW5zZm9ybWVkRW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEoZW50aXR5Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIgPSBuZXcgUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIodGhpcy5jb25uZWN0aW9uLm1hbmFnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIudHJhbnNmb3JtKGVudGl0eUxpa2UsIG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRW50aXR5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkRW50aXR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLm1lcmdlKGVudGl0eUNsYXNzLCB0cmFuc2Zvcm1lZEVudGl0eSwgZW50aXR5TGlrZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHVuZGVmaW5lZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2F2ZXMgYSBnaXZlbiBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0YXJnZXRPckVudGl0eSBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSlcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5vcHRpb25zLm5hbWU7XG4gICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIGVtcHR5IGFycmF5IG9mIGVudGl0aWVzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpICYmIGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudGl0eSk7XG4gICAgICAgIC8vIGV4ZWN1dGUgc2F2ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlQZXJzaXN0RXhlY3V0b3IodGhpcy5jb25uZWN0aW9uLCB0aGlzLnF1ZXJ5UnVubmVyLCBcInNhdmVcIiwgdGFyZ2V0LCBlbnRpdHksIG9wdGlvbnMpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBlbnRpdHk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGdpdmVuIGVudGl0eSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgYXJyYXkgb2YgZW50aXRpZXMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudGl0eSkgJiYgZW50aXR5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW50aXR5KTtcbiAgICAgICAgLy8gZXhlY3V0ZSBzYXZlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm4gbmV3IEVudGl0eVBlcnNpc3RFeGVjdXRvcih0aGlzLmNvbm5lY3Rpb24sIHRoaXMucXVlcnlSdW5uZXIsIFwicmVtb3ZlXCIsIHRhcmdldCwgZW50aXR5LCBvcHRpb25zKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gZW50aXR5OyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAodGFyZ2V0T3JFbnRpdHksIG1heWJlRW50aXR5T3JPcHRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgLy8gbm9ybWFsaXplIG1peGVkIHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCA9IChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiAodGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0YXJnZXRPckVudGl0eSBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSB8fCB0eXBlb2YgdGFyZ2V0T3JFbnRpdHkgPT09IFwic3RyaW5nXCIpKSA/IHRhcmdldE9yRW50aXR5IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZW50aXR5ID0gdGFyZ2V0ID8gbWF5YmVFbnRpdHlPck9wdGlvbnMgOiB0YXJnZXRPckVudGl0eTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXJnZXQgPyBtYXliZU9wdGlvbnMgOiBtYXliZUVudGl0eU9yT3B0aW9ucztcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSlcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5vcHRpb25zLm5hbWU7XG4gICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIGVtcHR5IGFycmF5IG9mIGVudGl0aWVzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpICYmIGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVudGl0eSk7XG4gICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybiBuZXcgRW50aXR5UGVyc2lzdEV4ZWN1dG9yKHRoaXMuY29ubmVjdGlvbiwgdGhpcy5xdWVyeVJ1bm5lciwgXCJzb2Z0LXJlbW92ZVwiLCB0YXJnZXQsIGVudGl0eSwgb3B0aW9ucylcbiAgICAgICAgICAgIC5leGVjdXRlKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudGl0eTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZWNvdmVyID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBtYXliZUVudGl0eU9yT3B0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBtaXhlZCBwYXJhbWV0ZXJzXG4gICAgICAgIHZhciB0YXJnZXQgPSAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgKHRhcmdldE9yRW50aXR5IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdGFyZ2V0T3JFbnRpdHkgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgfHwgdHlwZW9mIHRhcmdldE9yRW50aXR5ID09PSBcInN0cmluZ1wiKSkgPyB0YXJnZXRPckVudGl0eSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGVudGl0eSA9IHRhcmdldCA/IG1heWJlRW50aXR5T3JPcHRpb25zIDogdGFyZ2V0T3JFbnRpdHk7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGFyZ2V0ID8gbWF5YmVPcHRpb25zIDogbWF5YmVFbnRpdHlPck9wdGlvbnM7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICAvLyBpZiB1c2VyIHBhc3NlZCBlbXB0eSBhcnJheSBvZiBlbnRpdGllcyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmdcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50aXR5KSAmJiBlbnRpdHkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnRpdHkpO1xuICAgICAgICAvLyBleGVjdXRlIHJlY292ZXIgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybiBuZXcgRW50aXR5UGVyc2lzdEV4ZWN1dG9yKHRoaXMuY29ubmVjdGlvbiwgdGhpcy5xdWVyeVJ1bm5lciwgXCJyZWNvdmVyXCIsIHRhcmdldCwgZW50aXR5LCBvcHRpb25zKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gZW50aXR5OyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBnaXZlbiBlbnRpdHkgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCBzbyBxdWVyeSB3aWxsIGZhaWwgaWYgZHVwbGljYXRlIGVudGl0eSBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKiBZb3UgY2FuIGV4ZWN1dGUgYnVsayBpbnNlcnRzIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0eSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhlbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLnVwc2VydCA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0eU9yRW50aXRpZXMsIGNvbmZsaWN0UGF0aHNPck9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhLCBvcHRpb25zLCB1bmlxdWVDb2x1bW5Db25zdHJhaW50cywgdXNlSW5kZXgsIGVudGl0aWVzLCBjb25mbGljdENvbHVtbnMsIG92ZXJ3cml0ZUNvbHVtbnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25mbGljdFBhdGhzT3JPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RQYXRoczogY29uZmxpY3RQYXRoc09yT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGNvbmZsaWN0UGF0aHNPck9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbkNvbnN0cmFpbnRzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICBdLCBfX3JlYWQobWV0YWRhdGEuaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGl4KSB7IHJldHVybiBpeC5pc1VuaXF1ZTsgfSkubWFwKGZ1bmN0aW9uIChpeCkgeyByZXR1cm4gaXguY29sdW1uczsgfSkpLCBmYWxzZSksIF9fcmVhZChtZXRhZGF0YS51bmlxdWVzLm1hcChmdW5jdGlvbiAodXEpIHsgcmV0dXJuIHVxLmNvbHVtbnM7IH0pKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHVzZUluZGV4ID0gdW5pcXVlQ29sdW1uQ29uc3RyYWludHMuZmluZChmdW5jdGlvbiAoaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl4Lmxlbmd0aCA9PT0gb3B0aW9ucy5jb25mbGljdFBhdGhzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb25mbGljdFBhdGhzLmV2ZXJ5KGZ1bmN0aW9uIChjb25mbGljdFByb3BlcnR5UGF0aCkgeyByZXR1cm4gaXguc29tZShmdW5jdGlvbiAoY29sKSB7IHJldHVybiBjb2wucHJvcGVydHlQYXRoID09PSBjb25mbGljdFByb3BlcnR5UGF0aDsgfSk7IH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1c2VJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBbiB1cHNlcnQgcmVxdWlyZXMgY29uZGl0aW9ucyB0aGF0IGhhdmUgYSB1bmlxdWUgY29uc3RyYWludCBidXQgbm9uZSB3YXMgZm91bmQgZm9yIGNvbmZsaWN0IHByb3BlcnRpZXM6IFwiICsgb3B0aW9ucy5jb25mbGljdFBhdGhzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyA9IFtlbnRpdHlPckVudGl0aWVzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gZW50aXR5T3JFbnRpdGllcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmxpY3RDb2x1bW5zID0gbWV0YWRhdGEubWFwUHJvcGVydHlQYXRoc1RvQ29sdW1ucyhvcHRpb25zLmNvbmZsaWN0UGF0aHMpO1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUNvbHVtbnMgPSBtZXRhZGF0YS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbCkgeyByZXR1cm4gKCFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSkgJiYgZW50aXRpZXMuc29tZShmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiB0eXBlb2YgY29sLmdldEVudGl0eVZhbHVlKGVudGl0eSkgIT09IFwidW5kZWZpbmVkXCI7IH0pOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50byh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKGVudGl0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9yVXBkYXRlKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGNvbmZsaWN0Q29sdW1ucyksIGZhbHNlKSwgX19yZWFkKG92ZXJ3cml0ZUNvbHVtbnMpLCBmYWxzZSkubWFwKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbC5kYXRhYmFzZU5hbWU7IH0pLCBjb25mbGljdENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2wpIHsgcmV0dXJuIGNvbC5kYXRhYmFzZU5hbWU7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGVudGl0eSBwYXJ0aWFsbHkuIEVudGl0eSBjYW4gYmUgZm91bmQgYnkgYSBnaXZlbiBjb25kaXRpb24ocykuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IFVQREFURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIENvbmRpdGlvbihzKSBjYW5ub3QgYmUgZW1wdHkuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHRhcmdldCwgY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHkpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgdXBkYXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAudXBkYXRlKHRhcmdldClcbiAgICAgICAgICAgICAgICAuc2V0KHBhcnRpYWxFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgLnVwZGF0ZSh0YXJnZXQpXG4gICAgICAgICAgICAgICAgLnNldChwYXJ0aWFsRW50aXR5KVxuICAgICAgICAgICAgICAgIC53aGVyZShjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGVudGl0aWVzIGJ5IGEgZ2l2ZW4gY29uZGl0aW9uKHMpLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBERUxFVEUgcXVlcnkuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgZW50aXR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBDb25kaXRpb24ocykgY2Fubm90IGJlIGVtcHR5LlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgY3JpdGVyaWEpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgZGVsZXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmUoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3JkcyB0aGUgZGVsZXRlIGRhdGUgb2YgZW50aXRpZXMgYnkgYSBnaXZlbiBjb25kaXRpb24ocykuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IERFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIENvbmRpdGlvbihzKSBjYW5ub3QgYmUgZW1wdHkuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuc29mdERlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXRPckVudGl0eSwgY3JpdGVyaWEpIHtcbiAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgZW1wdHkgY3JpdGVyaWEgb3IgZW1wdHkgbGlzdCBvZiBjcml0ZXJpYXMsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgaWYgKGNyaXRlcmlhID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBudWxsIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSA9PT0gXCJcIiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpICYmIGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZU9STUVycm9yKFwiRW1wdHkgY3JpdGVyaWEocykgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgZGVsZXRlIG1ldGhvZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3JpdGVyaWEgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNyaXRlcmlhKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAuc29mdERlbGV0ZSgpXG4gICAgICAgICAgICAgICAgLmZyb20odGFyZ2V0T3JFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoY3JpdGVyaWEpXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgLnNvZnREZWxldGUoKVxuICAgICAgICAgICAgICAgIC5mcm9tKHRhcmdldE9yRW50aXR5KVxuICAgICAgICAgICAgICAgIC53aGVyZShjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNvbmRpdGlvbihzKS5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgREVMRVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICogQ29uZGl0aW9uKHMpIGNhbm5vdCBiZSBlbXB0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gKHRhcmdldE9yRW50aXR5LCBjcml0ZXJpYSkge1xuICAgICAgICAvLyBpZiB1c2VyIHBhc3NlZCBlbXB0eSBjcml0ZXJpYSBvciBlbXB0eSBsaXN0IG9mIGNyaXRlcmlhcywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpZiAoY3JpdGVyaWEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgY3JpdGVyaWEgPT09IG51bGwgfHxcbiAgICAgICAgICAgIGNyaXRlcmlhID09PSBcIlwiIHx8XG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheShjcml0ZXJpYSkgJiYgY3JpdGVyaWEubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlT1JNRXJyb3IoXCJFbXB0eSBjcml0ZXJpYShzKSBhcmUgbm90IGFsbG93ZWQgZm9yIHRoZSBkZWxldGUgbWV0aG9kLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjcml0ZXJpYSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGNyaXRlcmlhID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICBjcml0ZXJpYSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgIC5yZXN0b3JlKClcbiAgICAgICAgICAgICAgICAuZnJvbSh0YXJnZXRPckVudGl0eSlcbiAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhjcml0ZXJpYSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAucmVzdG9yZSgpXG4gICAgICAgICAgICAgICAgLmZyb20odGFyZ2V0T3JFbnRpdHkpXG4gICAgICAgICAgICAgICAgLndoZXJlKGNyaXRlcmlhKVxuICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvdW50cyBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zLlxuICAgICAqIFVzZWZ1bCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKi9cbiAgICBFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zT3JDb25kaXRpb25zKS5nZXRDb3VudCgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5RmluZE1hbnlPcHRpb25zT3JDb25kaXRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBvcHRpb25zT3JDb25kaXRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuam9pbkVhZ2VyUmVsYXRpb25zKHFiLCBxYi5hbGlhcywgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxYi5nZXRNYW55KCldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgYW5kIGNvbmRpdGlvbnMuXG4gICAgICogQWxzbyBjb3VudHMgYWxsIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gY29uZGl0aW9ucyxcbiAgICAgKiBidXQgaWdub3JlcyBwYWdpbmF0aW9uIHNldHRpbmdzIChmcm9tIGFuZCB0YWtlIG9wdGlvbnMpLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgb3B0aW9uc09yQ29uZGl0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIHFiO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBGaW5kT3B0aW9uc1V0aWxzLmV4dHJhY3RGaW5kTWFueU9wdGlvbnNBbGlhcyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBtZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5RmluZE1hbnlPcHRpb25zT3JDb25kaXRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyhvcHRpb25zT3JDb25kaXRpb25zKSB8fCBvcHRpb25zT3JDb25kaXRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuam9pbkVhZ2VyUmVsYXRpb25zKHFiLCBxYi5hbGlhcywgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBxYi5nZXRNYW55QW5kQ291bnQoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyB3aXRoIGlkcy5cbiAgICAgKiBPcHRpb25hbGx5IGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zIGNhbiBiZSBhcHBsaWVkLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRCeUlkcyA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcWI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm8gaWRzIHBhc3NlZCwgbm8gbmVlZCB0byBleGVjdXRlIGEgcXVlcnkgLSBqdXN0IHJldHVybiBhbiBlbXB0eSBhcnJheSBvZiB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoIWlkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoW10pXTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgcWIgPSB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgRmluZE9wdGlvbnNVdGlscy5leHRyYWN0RmluZE1hbnlPcHRpb25zQWxpYXMob3B0aW9uc09yQ29uZGl0aW9ucykgfHwgbWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoIUZpbmRPcHRpb25zVXRpbHMuaXNGaW5kTWFueU9wdGlvbnMob3B0aW9uc09yQ29uZGl0aW9ucykgfHwgb3B0aW9uc09yQ29uZGl0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmpvaW5FYWdlclJlbGF0aW9ucyhxYiwgcWIuYWxpYXMsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcWIuYW5kV2hlcmVJbklkcyhpZHMpLmdldE1hbnkoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBmaXJzdCBlbnRpdHkgdGhhdCBtYXRjaGVzIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZmluZE9uZSA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZmluZE9wdGlvbnMsIG9wdGlvbnMsIG1ldGFkYXRhLCBhbGlhcywgcWIsIHBhc3NlZElkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChGaW5kT3B0aW9uc1V0aWxzLmlzRmluZE9uZU9wdGlvbnMoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0gaWRPck9wdGlvbnNPckNvbmRpdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlT3B0aW9ucyAmJiBGaW5kT3B0aW9uc1V0aWxzLmlzRmluZE9uZU9wdGlvbnMobWF5YmVPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBmaW5kT3B0aW9ucyA9IG1heWJlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QgJiYgIUZpbmRPcHRpb25zVXRpbHMuaXNGaW5kT25lT3B0aW9ucyhpZE9yT3B0aW9uc09yQ29uZGl0aW9ucykpXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBpZE9yT3B0aW9uc09yQ29uZGl0aW9ucztcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgYWxpYXMgPSBtZXRhZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChmaW5kT3B0aW9ucyAmJiBmaW5kT3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzID0gZmluZE9wdGlvbnMuam9pbi5hbGlhcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVPcHRpb25zICYmIEZpbmRPcHRpb25zVXRpbHMuaXNGaW5kT25lT3B0aW9ucyhtYXliZU9wdGlvbnMpICYmIG1heWJlT3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzID0gbWF5YmVPcHRpb25zLmpvaW4uYWxpYXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoZW50aXR5Q2xhc3MsIGFsaWFzKTtcbiAgICAgICAgICAgICAgICBwYXNzZWRJZCA9IHR5cGVvZiBpZE9yT3B0aW9uc09yQ29uZGl0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgPT09IFwibnVtYmVyXCIgfHwgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMgaW5zdGFuY2VvZiBEYXRlO1xuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluZE9wdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgKGZpbmRPcHRpb25zIHx8IHt9KSksIHsgdGFrZTogMSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1F1ZXJ5QnVpbGRlcihxYiwgZmluZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghZmluZE9wdGlvbnMgfHwgZmluZE9wdGlvbnMubG9hZEVhZ2VyUmVsYXRpb25zICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmpvaW5FYWdlclJlbGF0aW9ucyhxYiwgcWIuYWxpYXMsIHFiLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcWIud2hlcmUob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3NlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmFuZFdoZXJlSW5JZHMobWV0YWRhdGEuZW5zdXJlRW50aXR5SWRNYXAoaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHFiLmdldE9uZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucyBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmZpbmRPbmVPckZhaWwgPSBmdW5jdGlvbiAoZW50aXR5Q2xhc3MsIGlkT3JPcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmZpbmRPbmUoZW50aXR5Q2xhc3MsIGlkT3JPcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRW50aXR5Tm90Rm91bmRFcnJvcihlbnRpdHlDbGFzcywgaWRPck9wdGlvbnNPckNvbmRpdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlICh0cnVuY2F0ZXMvZHJvcHMgaXQpLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgdXNlcyBUUlVOQ0FURSBhbmQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaW4gdHJhbnNhY3Rpb25zIG9uIHNvbWUgcGxhdGZvcm1zLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU5NzI3MzgvOTI1MTUxXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhLCBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAsIDMsIDZdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNsZWFyVGFibGUobWV0YWRhdGEudGFibGVQYXRoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jcmVtZW50cyBzb21lIGNvbHVtbiBieSBwcm92aWRlZCB2YWx1ZSBvZiB0aGUgZW50aXRpZXMgbWF0Y2hlZCBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmluY3JlbWVudCA9IGZ1bmN0aW9uIChlbnRpdHlDbGFzcywgY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIGNvbHVtbiwgdmFsdWVzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlDbGFzcyk7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gbWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNvbHVtbiBcIiArIHByb3BlcnR5UGF0aCArIFwiIHdhcyBub3QgZm91bmQgaW4gXCIgKyBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIgZW50aXR5LlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJWYWx1ZSBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIiBpcyBub3QgYSBudW1iZXIuXCIpO1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IHByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2VSaWdodChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgKyBcIiArIHZhbHVlOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgXCJlbnRpdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoZW50aXR5Q2xhc3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShjb25kaXRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWNyZW1lbnRzIHNvbWUgY29sdW1uIGJ5IHByb3ZpZGVkIHZhbHVlIG9mIHRoZSBlbnRpdGllcyBtYXRjaGVkIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZGVjcmVtZW50ID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzLCBjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgY29sdW1uLCB2YWx1ZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eUNsYXNzKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBtZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFwiICsgcHJvcGVydHlQYXRoICsgXCIgd2FzIG5vdCBmb3VuZCBpbiBcIiArIG1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIodmFsdWUpKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlZhbHVlIFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIGlzIG5vdCBhIG51bWJlci5cIik7XG4gICAgICAgICAgICAgICAgdmFsdWVzID0gcHJvcGVydHlQYXRoXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiAtIFwiICsgdmFsdWU7IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGVudGl0eUNsYXNzLCBcImVudGl0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShlbnRpdHlDbGFzcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQodmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIElmIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIG1vZGUgaXMgdXNlZCwgdGhlbiByZXBvc2l0b3J5IGlzIG9idGFpbmVkIGZyb20gdGhlXG4gICAgICogcmVwb3NpdG9yeSBhZ2dyZWdhdG9yLCB3aGVyZSBlYWNoIHJlcG9zaXRvcnkgaXMgaW5kaXZpZHVhbGx5IGNyZWF0ZWQgZm9yIHRoaXMgZW50aXR5IG1hbmFnZXIuXG4gICAgICogV2hlbiBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBub3QgdXNlZCwgcmVwb3NpdG9yeSBpcyBiZWluZyBvYnRhaW5lZCBmcm9tIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldFJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyByZXBvc2l0b3J5IHdpdGggdGhpcyB0YXJnZXQgcmVnaXN0ZXJlZFxuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5oYXNNZXRhZGF0YSh0YXJnZXQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKHRoaXMuY29ubmVjdGlvbi5uYW1lLCB0YXJnZXQpO1xuICAgICAgICAvLyBmaW5kIGFscmVhZHkgY3JlYXRlZCByZXBvc2l0b3J5IGluc3RhbmNlIGFuZCByZXR1cm4gaXQgaWYgZm91bmRcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKHRhcmdldCk7XG4gICAgICAgIHZhciByZXBvc2l0b3J5ID0gdGhpcy5yZXBvc2l0b3JpZXMuZmluZChmdW5jdGlvbiAocmVwb3NpdG9yeSkgeyByZXR1cm4gcmVwb3NpdG9yeS5tZXRhZGF0YSA9PT0gbWV0YWRhdGE7IH0pO1xuICAgICAgICBpZiAocmVwb3NpdG9yeSlcbiAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5O1xuICAgICAgICAvLyBpZiByZXBvc2l0b3J5IHdhcyBub3QgZm91bmQgdGhlbiBjcmVhdGUgaXQsIHN0b3JlIGl0cyBpbnN0YW5jZSBhbmQgcmV0dXJuIGl0XG4gICAgICAgIHZhciBuZXdSZXBvc2l0b3J5ID0gbmV3IFJlcG9zaXRvcnlGYWN0b3J5KCkuY3JlYXRlKHRoaXMsIG1ldGFkYXRhLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3JpZXMucHVzaChuZXdSZXBvc2l0b3J5KTtcbiAgICAgICAgcmV0dXJuIG5ld1JlcG9zaXRvcnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICAgICAqIElmIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uIG1vZGUgaXMgdXNlZCwgdGhlbiByZXBvc2l0b3J5IGlzIG9idGFpbmVkIGZyb20gdGhlXG4gICAgICogcmVwb3NpdG9yeSBhZ2dyZWdhdG9yLCB3aGVyZSBlYWNoIHJlcG9zaXRvcnkgaXMgaW5kaXZpZHVhbGx5IGNyZWF0ZWQgZm9yIHRoaXMgZW50aXR5IG1hbmFnZXIuXG4gICAgICogV2hlbiBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBub3QgdXNlZCwgcmVwb3NpdG9yeSBpcyBiZWluZyBvYnRhaW5lZCBmcm9tIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldFRyZWVSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAvLyB0cmVlIHRhYmxlcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHNvbWUgZHJpdmVycyAobW9uZ29kYilcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIudHJlZVN1cHBvcnQgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IodGhpcy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlcG9zaXRvcnkgaXMgcmVhbCB0cmVlIHJlcG9zaXRvcnlcbiAgICAgICAgdmFyIHJlcG9zaXRvcnkgPSB0aGlzLmdldFJlcG9zaXRvcnkodGFyZ2V0KTtcbiAgICAgICAgaWYgKCEocmVwb3NpdG9yeSBpbnN0YW5jZW9mIFRyZWVSZXBvc2l0b3J5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5Tm90VHJlZUVycm9yKHRhcmdldCk7XG4gICAgICAgIHJldHVybiByZXBvc2l0b3J5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBtb25nb2RiIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3MuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZ2V0TW9uZ29SZXBvc2l0b3J5ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmdldE1vbmdvUmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBjdXN0b20gZW50aXR5IHJlcG9zaXRvcnkgbWFya2VkIHdpdGggQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlxuICAgICAqL1xuICAgIEVudGl0eU1hbmFnZXIucHJvdG90eXBlLmdldEN1c3RvbVJlcG9zaXRvcnkgPSBmdW5jdGlvbiAoY3VzdG9tUmVwb3NpdG9yeSkge1xuICAgICAgICB2YXIgZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbnRpdHlSZXBvc2l0b3JpZXMuZmluZChmdW5jdGlvbiAocmVwb3NpdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudGFyZ2V0ID09PSAoY3VzdG9tUmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gY3VzdG9tUmVwb3NpdG9yeSA6IGN1c3RvbVJlcG9zaXRvcnkuY29uc3RydWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSBlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzLmVudGl0eSA/IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlSZXBvc2l0b3J5TWV0YWRhdGFBcmdzLmVudGl0eSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2UgPSBuZXcgZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncy50YXJnZXQodGhpcywgZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAvLyBOT1RFOiBkeW5hbWljIGFjY2VzcyB0byBwcm90ZWN0ZWQgcHJvcGVydGllcy4gV2UgbmVlZCB0aGlzIHRvIHByZXZlbnQgdW53YW50ZWQgcHJvcGVydGllcyBpbiB0aG9zZSBjbGFzc2VzIHRvIGJlIGV4cG9zZWQsXG4gICAgICAgIC8vIGhvd2V2ZXIgd2UgbmVlZCB0aGVzZSBwcm9wZXJ0aWVzIGZvciBpbnRlcm5hbCB3b3JrIG9mIHRoZSBjbGFzc1xuICAgICAgICBpZiAoZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlIGluc3RhbmNlb2YgQWJzdHJhY3RSZXBvc2l0b3J5KSB7XG4gICAgICAgICAgICBpZiAoIWVudGl0eVJlcG9zaXRvcnlJbnN0YW5jZVtcIm1hbmFnZXJcIl0pXG4gICAgICAgICAgICAgICAgZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlW1wibWFuYWdlclwiXSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudGl0eVJlcG9zaXRvcnlJbnN0YW5jZSBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIGlmICghZW50aXR5TWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yKGN1c3RvbVJlcG9zaXRvcnkpO1xuICAgICAgICAgICAgZW50aXR5UmVwb3NpdG9yeUluc3RhbmNlW1wibWFuYWdlclwiXSA9IHRoaXM7XG4gICAgICAgICAgICBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2VbXCJtZXRhZGF0YVwiXSA9IGVudGl0eU1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRpdHlSZXBvc2l0b3J5SW5zdGFuY2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgZW50aXR5IG1hbmFnZXIuXG4gICAgICogVGhpcyBpcyB1c2VkIHdoZW4gZW50aXR5IG1hbmFnZXIgaXMgY3JlYXRlZCB3aXRoIGEgc2luZ2xlIHF1ZXJ5IHJ1bm5lcixcbiAgICAgKiBhbmQgdGhpcyBzaW5nbGUgcXVlcnkgcnVubmVyIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGFmdGVyIGpvYiB3aXRoIGVudGl0eSBtYW5hZ2VyIGlzIGRvbmUuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLnF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWFuYWdlcjtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNYW5hZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU1hbmFnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vRW50aXR5TWFuYWdlclwiO1xuaW1wb3J0IHsgTW9uZ29FbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vTW9uZ29FbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsanNFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vU3FsanNFbnRpdHlNYW5hZ2VyXCI7XG5pbXBvcnQgeyBTcWxqc0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsanMvU3FsanNEcml2ZXJcIjtcbi8qKlxuICogSGVscHMgdG8gY3JlYXRlIGVudGl0eSBtYW5hZ2Vycy5cbiAqL1xudmFyIEVudGl0eU1hbmFnZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVudGl0eU1hbmFnZXJGYWN0b3J5KCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBtYW5hZ2VyIGRlcGVuZCBvbiBhIGdpdmVuIGNvbm5lY3Rpb24ncyBkcml2ZXIuXG4gICAgICovXG4gICAgRW50aXR5TWFuYWdlckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb25uZWN0aW9uLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcilcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9uZ29FbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxqc0RyaXZlcilcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3FsanNFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyRmFjdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNYW5hZ2VyRmFjdG9yeSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNYW5hZ2VyRmFjdG9yeS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL0VudGl0eU1hbmFnZXJcIjtcbi8qKlxuICogQSBzcGVjaWFsIEVudGl0eU1hbmFnZXIgdGhhdCBpbmNsdWRlcyBpbXBvcnQvZXhwb3J0IGFuZCBsb2FkL3NhdmUgZnVuY3Rpb25cbiAqIHRoYXQgYXJlIHVuaXF1ZSB0byBTcWwuanMuXG4gKi9cbnZhciBTcWxqc0VudGl0eU1hbmFnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNxbGpzRW50aXR5TWFuYWdlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3FsanNFbnRpdHlNYW5hZ2VyKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcml2ZXIgPSBjb25uZWN0aW9uLmRyaXZlcjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTG9hZHMgZWl0aGVyIHRoZSBkZWZpbml0aW9uIGZyb20gYSBmaWxlIChOb2RlLmpzKSBvciBsb2NhbHN0b3JhZ2UgKGJyb3dzZXIpXG4gICAgICogb3IgdXNlcyB0aGUgZ2l2ZW4gZGVmaW5pdGlvbiB0byBvcGVuIGEgbmV3IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFNxbGpzRW50aXR5TWFuYWdlci5wcm90b3R5cGUubG9hZERhdGFiYXNlID0gZnVuY3Rpb24gKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyaXZlci5sb2FkKGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2VPckRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IGRhdGFiYXNlIHRvIGEgZmlsZSAoTm9kZS5qcykgb3IgbG9jYWxzdG9yYWdlIChicm93c2VyKVxuICAgICAqIGlmIGZpbGVOYW1lT3JMb2NhbFN0b3JhZ2UgaXMgbm90IHNldCBvcHRpb25zLmxvY2F0aW9uIGlzIHVzZWQuXG4gICAgICovXG4gICAgU3FsanNFbnRpdHlNYW5hZ2VyLnByb3RvdHlwZS5zYXZlRGF0YWJhc2UgPSBmdW5jdGlvbiAoZmlsZU5hbWVPckxvY2FsU3RvcmFnZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJpdmVyLnNhdmUoZmlsZU5hbWVPckxvY2FsU3RvcmFnZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRhYmFzZSBkZWZpbml0aW9uLlxuICAgICAqL1xuICAgIFNxbGpzRW50aXR5TWFuYWdlci5wcm90b3R5cGUuZXhwb3J0RGF0YWJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlci5leHBvcnQoKTtcbiAgICB9O1xuICAgIHJldHVybiBTcWxqc0VudGl0eU1hbmFnZXI7XG59KEVudGl0eU1hbmFnZXIpKTtcbmV4cG9ydCB7IFNxbGpzRW50aXR5TWFuYWdlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcWxqc0VudGl0eU1hbmFnZXIuanMubWFwXG4iLCIvKipcbiAqIEludGVyZmFjZSBmb3IgZW50aXR5IG1ldGFkYXRhIG1hcHBpbmdzIHN0b3JlZCBpbnNpZGUgXCJzY2hlbWFzXCIgaW5zdGVhZCBvZiBtb2RlbHMgZGVjb3JhdGVkIGJ5IGRlY29yYXRvcnMuXG4gKi9cbnZhciBFbnRpdHlTY2hlbWEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW50aXR5U2NoZW1hKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIEVudGl0eVNjaGVtYTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlTY2hlbWEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW50aXR5U2NoZW1hLmpzLm1hcFxuIiwiaW1wb3J0IHsgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vbWV0YWRhdGEtYXJncy9NZXRhZGF0YUFyZ3NTdG9yYWdlXCI7XG4vKipcbiAqIFRyYW5zZm9ybXMgZW50aXR5IHNjaGVtYSBpbnRvIG1ldGFkYXRhIGFyZ3Mgc3RvcmFnZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBqdXN0IGxpa2UgZW50aXRpZXMgcmVhZCBmcm9tIGRlY29yYXRvcnMuXG4gKi9cbnZhciBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgZW50aXR5IHNjaGVtYSBpbnRvIG5ldyBtZXRhZGF0YSBhcmdzIHN0b3JhZ2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIEVudGl0eVNjaGVtYVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAoc2NoZW1hcykge1xuICAgICAgICB2YXIgbWV0YWRhdGFBcmdzU3RvcmFnZSA9IG5ldyBNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICAgIHNjaGVtYXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5U2NoZW1hKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGVudGl0eVNjaGVtYS5vcHRpb25zO1xuICAgICAgICAgICAgLy8gYWRkIHRhYmxlIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICB2YXIgdGFibGVNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCBcInJlZ3VsYXJcIixcbiAgICAgICAgICAgICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnksXG4gICAgICAgICAgICAgICAgc3luY2hyb25pemU6IG9wdGlvbnMuc3luY2hyb25pemUsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogb3B0aW9ucy5leHByZXNzaW9uXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS50YWJsZXMucHVzaCh0YWJsZU1ldGFkYXRhKTtcbiAgICAgICAgICAgIC8vIGFkZCBjb2x1bW5zIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmNvbHVtbnMpLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gb3B0aW9ucy5jb2x1bW5zW2NvbHVtbk5hbWVdO1xuICAgICAgICAgICAgICAgIHZhciBtb2RlID0gXCJyZWd1bGFyXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5jcmVhdGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJjcmVhdGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi51cGRhdGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJ1cGRhdGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5kZWxldGVEYXRlKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJkZWxldGVEYXRlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi52ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICBtb2RlID0gXCJ2ZXJzaW9uXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi50cmVlQ2hpbGRyZW5Db3VudClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwidHJlZUNoaWxkcmVuQ291bnRcIjtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRyZWVMZXZlbClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwidHJlZUxldmVsXCI7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5vYmplY3RJZClcbiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFwib2JqZWN0SWRcIjtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ub2JqZWN0SWQgPyBcIl9pZFwiIDogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGNvbHVtbi5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sdW1uLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGNvbHVtbi5udWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBjb2x1bW4ucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGU6IGNvbHVtbi51cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IGNvbHVtbi5zZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQ6IGNvbHVtbi5pbnNlcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBjb2x1bW4ucHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogY29sdW1uLnVuaXF1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGNvbHVtbi5jb21tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogY29sdW1uLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZTogY29sdW1uLm9uVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBjb2x1bW4ucHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IGNvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiBjb2x1bW4uemVyb2ZpbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDogY29sdW1uLnVuc2lnbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogY29sdW1uLmNoYXJzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXRpb246IGNvbHVtbi5jb2xsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtOiBjb2x1bW4uZW51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogY29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFR5cGU6IGNvbHVtbi5nZW5lcmF0ZWRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHN0b3JlVHlwZTogY29sdW1uLmhzdG9yZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheTogY29sdW1uLmFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxGZWF0dXJlVHlwZTogY29sdW1uLnNwYXRpYWxGZWF0dXJlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyaWQ6IGNvbHVtbi5zcmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UuY29sdW1ucy5wdXNoKGNvbHVtbkFncnMpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0aW9uQXJncyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3k6IHR5cGVvZiBjb2x1bW4uZ2VuZXJhdGVkID09PSBcInN0cmluZ1wiID8gY29sdW1uLmdlbmVyYXRlZCA6IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5nZW5lcmF0aW9ucy5wdXNoKGdlbmVyYXRpb25BcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi51bmlxdWUpXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UudW5pcXVlcy5wdXNoKHsgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsIGNvbHVtbnM6IFtjb2x1bW5OYW1lXSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gYWRkIHJlbGF0aW9uIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLnJlbGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRpb25TY2hlbWEgPSBvcHRpb25zLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25UeXBlOiByZWxhdGlvblNjaGVtYS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXp5OiByZWxhdGlvblNjaGVtYS5sYXp5IHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcmVsYXRpb25TY2hlbWEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogcmVsYXRpb25TY2hlbWEuaW52ZXJzZVNpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyZWVQYXJlbnQ6IHJlbGF0aW9uU2NoZW1hLnRyZWVQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyZWVDaGlsZHJlbjogcmVsYXRpb25TY2hlbWEudHJlZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhZ2VyOiByZWxhdGlvblNjaGVtYS5lYWdlciB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNjYWRlOiByZWxhdGlvblNjaGVtYS5jYXNjYWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlOiByZWxhdGlvblNjaGVtYS5udWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlbGV0ZTogcmVsYXRpb25TY2hlbWEub25EZWxldGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IHJlbGF0aW9uU2NoZW1hLm9uVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmFibGU6IHJlbGF0aW9uU2NoZW1hLmRlZmVycmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogcmVsYXRpb25TY2hlbWEucHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZTogcmVsYXRpb25TY2hlbWEucGVyc2lzdGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JwaGFuZWRSb3dBY3Rpb246IHJlbGF0aW9uU2NoZW1hLm9ycGhhbmVkUm93QWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UucmVsYXRpb25zLnB1c2gocmVsYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgam9pbiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uU2NoZW1hLmpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25TY2hlbWEuam9pbkNvbHVtbiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLmpvaW5Db2x1bW5zLnB1c2goam9pbkNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbnNPcHRpb25zID0gQXJyYXkuaXNBcnJheShyZWxhdGlvblNjaGVtYS5qb2luQ29sdW1uKSA/IHJlbGF0aW9uU2NoZW1hLmpvaW5Db2x1bW4gOiBbcmVsYXRpb25TY2hlbWEuam9pbkNvbHVtbl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgam9pbkNvbHVtbnNPcHRpb25zXzEgPSBfX3ZhbHVlcyhqb2luQ29sdW1uc09wdGlvbnMpLCBqb2luQ29sdW1uc09wdGlvbnNfMV8xID0gam9pbkNvbHVtbnNPcHRpb25zXzEubmV4dCgpOyAham9pbkNvbHVtbnNPcHRpb25zXzFfMS5kb25lOyBqb2luQ29sdW1uc09wdGlvbnNfMV8xID0gam9pbkNvbHVtbnNPcHRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbk9wdGlvbiA9IGpvaW5Db2x1bW5zT3B0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHJlbGF0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBqb2luQ29sdW1uT3B0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IGpvaW5Db2x1bW5PcHRpb24ucmVmZXJlbmNlZENvbHVtbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLmpvaW5Db2x1bW5zLnB1c2goam9pbkNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2luQ29sdW1uc09wdGlvbnNfMV8xICYmICFqb2luQ29sdW1uc09wdGlvbnNfMV8xLmRvbmUgJiYgKF9hID0gam9pbkNvbHVtbnNPcHRpb25zXzEucmV0dXJuKSkgX2EuY2FsbChqb2luQ29sdW1uc09wdGlvbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgam9pbiB0YWJsZVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2Uuam9pblRhYmxlcy5wdXNoKGpvaW5UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByZWxhdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmRhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHJlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW5zOiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW4gPyBbcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW5dIDogcmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5zOiAocmVsYXRpb25TY2hlbWEuam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1uID8gW3JlbGF0aW9uU2NoZW1hLmpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbl0gOiByZWxhdGlvblNjaGVtYS5qb2luVGFibGUuaW52ZXJzZUpvaW5Db2x1bW5zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2Uuam9pblRhYmxlcy5wdXNoKGpvaW5UYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBpbmRleCBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5kaWNlcykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhBZ3JzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmRleC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlOiBpbmRleC51bmlxdWUgPT09IHRydWUgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsOiBpbmRleC5zcGF0aWFsID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHRleHQ6IGluZGV4LmZ1bGx0ZXh0ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyOiBpbmRleC5wYXJzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogaW5kZXguc3luY2hyb25pemUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmU6IGluZGV4LndoZXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlOiBpbmRleC5zcGFyc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXJnc1N0b3JhZ2UuaW5kaWNlcy5wdXNoKGluZGV4QWdycyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdW5pcXVlIG1ldGFkYXRhIGFyZ3MgZnJvbSB0aGUgc2NoZW1hXG4gICAgICAgICAgICBpZiAob3B0aW9ucy51bmlxdWVzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51bmlxdWVzLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5pcXVlQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdW5pcXVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB1bmlxdWUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUFyZ3NTdG9yYWdlLnVuaXF1ZXMucHVzaCh1bmlxdWVBZ3JzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBjaGVjayBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jaGVja3MuZm9yRWFjaChmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrQWdycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2hlY2submFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGNoZWNrLmV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5jaGVja3MucHVzaChjaGVja0FncnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIGV4Y2x1c2lvbiBtZXRhZGF0YSBhcmdzIGZyb20gdGhlIHNjaGVtYVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVzaW9ucykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhjbHVzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleGNsdXNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1c2lvbkFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGV4Y2x1c2lvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhjbHVzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFBcmdzU3RvcmFnZS5leGNsdXNpb25zLnB1c2goZXhjbHVzaW9uQXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGFBcmdzU3RvcmFnZTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lcjtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlTY2hlbWFUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlTY2hlbWFUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHRyaWVzIHRvIHJlY3JlYXRlIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgcHJldmlvdXMgY29ubmVjdGlvbiB3YXMgbm90IGNsb3NlZCB5ZXQuXG4gKi9cbnZhciBBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFscmVhZHlIYXNBY3RpdmVDb25uZWN0aW9uRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIG5hbWVkIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCJcXFwiLCBiZWNhdXNlIGNvbm5lY3Rpb24gd2l0aCBzdWNoIG5hbWUgXCIgK1xuICAgICAgICAgICAgXCJhbHJlYWR5IGV4aXN0IGFuZCBpdCBub3cgaGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHNlc3Npb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBBbHJlYWR5SGFzQWN0aXZlQ29ubmVjdGlvbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEFscmVhZHlIYXNBY3RpdmVDb25uZWN0aW9uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgc2F2ZXMgdHJlZSBjaGlsZHJlbiBlbnRpdHkgYnV0IGl0cyBwYXJlbnQgaXMgbm90IHNhdmVkIHlldC5cbiovXG52YXIgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yKGVudGl0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGF0dGFjaCBlbnRpdHkgXFxcIlwiICsgZW50aXR5TmFtZSArIFwiXFxcIiB0byBpdHMgcGFyZW50LiBQbGVhc2UgbWFrZSBzdXJlIHBhcmVudCBcIiArXG4gICAgICAgICAgICBcImlzIHNhdmVkIGluIHRoZSBkYXRhYmFzZSBiZWZvcmUgc2F2aW5nIGNoaWxkcmVuIG5vZGVzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBjb25uZWN0IHdoZW4gaGUgYWxyZWFkeSBjb25uZWN0ZWQuXG4gKi9cbnZhciBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGNyZWF0ZSBhIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCJcXFwiIGNvbm5lY3Rpb24gYmVjYXVzZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBhbHJlYWR5IGVzdGFibGlzaGVkLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90Q29ubmVjdEFscmVhZHlDb25uZWN0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RDb25uZWN0QWxyZWFkeUNvbm5lY3RlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiB1c2VyIHRyaWVzIHRvIGNyZWF0ZSBlbnRpdHkgaWQgbWFwIGZyb20gdGhlIG1peGVkIGlkIHZhbHVlLFxuICogYnV0IGlkIHZhbHVlIGlzIGEgc2luZ2xlIHZhbHVlIHdoZW4gZW50aXR5IHJlcXVpcmVzIG11bHRpcGxlIHZhbHVlcy5cbiAqL1xudmFyIENhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcihtZXRhZGF0YSwgaWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIG9iamVjdEV4YW1wbGUgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG9iamVjdCwgY29sdW1uLCBpbmRleCkge1xuICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKG9iamVjdCwgaW5kZXggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiQ2Fubm90IHVzZSBnaXZlbiBlbnRpdHkgaWQgXFxcIlwiICsgaWQgKyBcIlxcXCIgYmVjYXVzZSBcXFwiXCIgKyBtZXRhZGF0YS50YXJnZXROYW1lICsgXCJcXFwiIGNvbnRhaW5zIG11bHRpcGxlIHByaW1hcnkgY29sdW1ucywgeW91IG11c3QgcHJvdmlkZSBvYmplY3QgaW4gZm9sbG93aW5nIGZvcm06IFwiICsgSlNPTi5zdHJpbmdpZnkob2JqZWN0RXhhbXBsZSkgKyBcIiBhcyBhbiBpZC5cIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdENyZWF0ZUVudGl0eUlkTWFwRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiB1c2VyIHRyaWVzIHRvIHNhdmUvcmVtb3ZlL2V0Yy4gY29uc3RydWN0b3ItbGVzcyBvYmplY3QgKG9iamVjdCBsaXRlcmFsKSBpbnN0ZWFkIG9mIGVudGl0eS5cbiAqL1xudmFyIENhbm5vdERldGVybWluZUVudGl0eUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYW5ub3REZXRlcm1pbmVFbnRpdHlFcnJvcihvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IFwiICsgb3BlcmF0aW9uICsgXCIsIGdpdmVuIHZhbHVlIG11c3QgYmUgaW5zdGFuY2Ugb2YgZW50aXR5IGNsYXNzLCBcIiArXG4gICAgICAgICAgICBcImluc3RlYWQgb2JqZWN0IGxpdGVyYWwgaXMgZ2l2ZW4uIE9yIHlvdSBtdXN0IHNwZWNpZnkgYW4gZW50aXR5IHRhcmdldCB0byBtZXRob2QgY2FsbC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENhbm5vdERldGVybWluZUVudGl0eUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENhbm5vdERldGVybWluZUVudGl0eUVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdERldGVybWluZUVudGl0eUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gZXhlY3V0ZSBvcGVyYXRpb24gYWxsb3dlZCBvbmx5IGlmIGNvbm5lY3Rpb24gaXMgb3BlbmVkLlxuICovXG52YXIgQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBleGVjdXRlIG9wZXJhdGlvbiBvbiBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uIGJlY2F1c2UgY29ubmVjdGlvbiBpcyBub3QgeWV0IGVzdGFibGlzaGVkLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90RXhlY3V0ZU5vdENvbm5lY3RlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYW5ub3RFeGVjdXRlTm90Q29ubmVjdGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBhY2Nlc3MgZW50aXR5IG1hbmFnZXIgYmVmb3JlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCBlbnRpdHkgbWFuYWdlciBmb3IgXFxcIlwiICsgY29ubmVjdGlvbk5hbWUgKyBcIlxcXCIgY29ubmVjdGlvbiBiZWNhdXNlIGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RHZXRFbnRpdHlNYW5hZ2VyTm90Q29ubmVjdGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2Fubm90R2V0RW50aXR5TWFuYWdlck5vdENvbm5lY3RlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gT1JNIGNhbm5vdCBnZXQgbWV0aG9kIHBhcmFtZXRlcidzIHR5cGUuXG4gKiBCYXNpY2FsbHksIHdoZW4gcmVmbGVjdC1tZXRhZGF0YSBpcyBub3QgYXZhaWxhYmxlIG9yIHRzY29uZmlnIGlzIG5vdCBwcm9wZXJseSBzZXR1cC5cbiAqL1xudmFyIENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvcih0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCByZWZsZWN0ZWQgdHlwZSBmb3IgYSBcXFwiXCIgKyBtZXRob2ROYW1lICsgXCJcXFwiIG1ldGhvZCdzIHBhcmFtZXRlciBvZiBcXFwiXCIgKyB0YXJnZXQubmFtZSArIFwiXFxcIiBjbGFzcy4gXCIgK1xuICAgICAgICAgICAgXCJNYWtlIHN1cmUgeW91IGhhdmUgdHVybmVkIG9uIGFuIFxcXCJlbWl0RGVjb3JhdG9yTWV0YWRhdGFcXFwiOiB0cnVlIG9wdGlvbiBpbiB0c2NvbmZpZy5qc29uLiBcIiArXG4gICAgICAgICAgICBcIkFsc28gbWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIFxcXCJyZWZsZWN0LW1ldGFkYXRhXFxcIiBvbiB0b3Agb2YgdGhlIG1haW4gZW50cnkgZmlsZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDYW5ub3RSZWZsZWN0TWV0aG9kUGFyYW1ldGVyVHlwZUVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbm5vdFJlZmxlY3RNZXRob2RQYXJhbWV0ZXJUeXBlRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjaXJjdWxhciByZWxhdGlvbnMgZGV0ZWN0ZWQgd2l0aCBudWxsYWJsZSBzZXQgdG8gZmFsc2UuXG4gKi9cbnZhciBDaXJjdWxhclJlbGF0aW9uc0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDaXJjdWxhclJlbGF0aW9uc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENpcmN1bGFyUmVsYXRpb25zRXJyb3IocGF0aCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJDaXJjdWxhciByZWxhdGlvbnMgZGV0ZWN0ZWQ6IFwiICsgcGF0aCArIFwiLiBUbyByZXNvbHZlIHRoaXMgaXNzdWUgeW91IG5lZWQgdG8gXCIgK1xuICAgICAgICAgICAgXCJzZXQgbnVsbGFibGU6IHRydWUgc29tZXdoZXJlIGluIHRoaXMgZGVwZW5kZW5jeSBzdHJ1Y3R1cmUuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDaXJjdWxhclJlbGF0aW9uc0Vycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IENpcmN1bGFyUmVsYXRpb25zRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2lyY3VsYXJSZWxhdGlvbnNFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIE9STSBjYW5ub3QgZ2V0IGNvbHVtbidzIHR5cGUgYXV0b21hdGljYWxseS5cbiAqIEJhc2ljYWxseSwgd2hlbiByZWZsZWN0LW1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUgb3IgdHNjb25maWcgaXMgbm90IHByb3Blcmx5IHNldHVwLlxuICovXG52YXIgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNvbHVtbiB0eXBlIGZvciBcIiArIG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lICsgXCIjXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIiBpcyBub3QgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGd1ZXNzZWQuIFwiICtcbiAgICAgICAgICAgIFwiTWFrZSBzdXJlIHlvdSBoYXZlIHR1cm5lZCBvbiBhbiBcXFwiZW1pdERlY29yYXRvck1ldGFkYXRhXFxcIjogdHJ1ZSBvcHRpb24gaW4gdHNjb25maWcuanNvbi4gXCIgK1xuICAgICAgICAgICAgXCJBbHNvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBpbXBvcnRlZCBcXFwicmVmbGVjdC1tZXRhZGF0YVxcXCIgb24gdG9wIG9mIHRoZSBtYWluIGVudHJ5IGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiAoYmVmb3JlIGFueSBlbnRpdHkgaW1wb3J0ZWQpLlwiICtcbiAgICAgICAgICAgIFwiSWYgeW91IGFyZSB1c2luZyBKYXZhU2NyaXB0IGluc3RlYWQgb2YgVHlwZVNjcmlwdCB5b3UgbXVzdCBleHBsaWNpdGx5IHByb3ZpZGUgYSBjb2x1bW4gdHlwZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvbHVtblR5cGVVbmRlZmluZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdXNlciB0cmllcyB0byBleGVjdXRlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIGNvbm5lY3Rpb24gdG8gYmUgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBDb25uZWN0aW9uSXNOb3RTZXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29ubmVjdGlvbklzTm90U2V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGlvbklzTm90U2V0RXJyb3IoZGJUeXBlKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNvbm5lY3Rpb24gd2l0aCBcIiArIGRiVHlwZSArIFwiIGRhdGFiYXNlIGlzIG5vdCBlc3RhYmxpc2hlZC4gQ2hlY2sgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ29ubmVjdGlvbklzTm90U2V0RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbklzTm90U2V0RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbklzTm90U2V0RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byBnZXQgY29ubmVjdGlvbiB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICovXG52YXIgQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbm5lY3Rpb25Ob3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25Ob3RGb3VuZEVycm9yKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ29ubmVjdGlvbiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIHdhcyBub3QgZm91bmQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDb25uZWN0aW9uTm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDb25uZWN0aW9uTm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0aW9uTm90Rm91bmRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biBpZiBjdXN0b20gcmVwb3NpdG9yeSBpbmhlcml0cyBSZXBvc2l0b3J5IGNsYXNzIGhvd2V2ZXIgZW50aXR5IGlzIG5vdCBzZXQgaW4gQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlDYW5ub3RJbmhlcml0UmVwb3NpdG9yeUVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIGVudGl0eSByZXBvc2l0b3J5IFwiICsgKHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHJlcG9zaXRvcnkubmFtZSA6IHJlcG9zaXRvcnkuY29uc3RydWN0b3IubmFtZSkgKyBcIiBcIiArXG4gICAgICAgICAgICBcIiBjYW5ub3QgaW5oZXJpdCBSZXBvc2l0b3J5IGNsYXNzIHdpdGhvdXQgZW50aXR5IGJlaW5nIHNldCBpbiB0aGUgQEVudGl0eVJlcG9zaXRvcnkgZGVjb3JhdG9yLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gaWYgY3VzdG9tIHJlcG9zaXRvcmllcyB0aGF0IGV4dGVuZCBBYnN0cmFjdFJlcG9zaXRvcnkgY2xhc3NlcyBkb2VzIG5vdCBoYXZlIG1hbmFnZWQgZW50aXR5LlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIHJlcG9zaXRvcnkgXCIgKyAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gcmVwb3NpdG9yeS5uYW1lIDogcmVwb3NpdG9yeS5jb25zdHJ1Y3Rvci5uYW1lKSArIFwiIGRvZXMgbm90IGhhdmUgbWFuYWdlZCBlbnRpdHkuIFwiICtcbiAgICAgICAgICAgIFwiRGlkIHlvdSBmb3JnZXQgdG8gc3BlY2lmeSBlbnRpdHkgZm9yIGl0IEBFbnRpdHlSZXBvc2l0b3J5KE15RW50aXR5KT8gXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biBpZiBjdXN0b20gcmVwb3NpdG9yeSB3YXMgbm90IGZvdW5kLlxuICovXG52YXIgQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ3VzdG9tIHJlcG9zaXRvcnkgXCIgKyAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gcmVwb3NpdG9yeS5uYW1lIDogcmVwb3NpdG9yeS5jb25zdHJ1Y3Rvci5uYW1lKSArIFwiIHdhcyBub3QgZm91bmQuIFwiICtcbiAgICAgICAgICAgIFwiRGlkIHlvdSBmb3Jnb3QgdG8gcHV0IEBFbnRpdHlSZXBvc2l0b3J5IGRlY29yYXRvciBvbiBpdD9cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1c3RvbVJlcG9zaXRvcnlOb3RGb3VuZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBEYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3IoY29sdW1uLCBkYXRhVHlwZSwgZGF0YWJhc2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgPyBkYXRhVHlwZSA6IGRhdGFUeXBlLm5hbWU7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIkRhdGEgdHlwZSBcXFwiXCIgKyB0eXBlICsgXCJcXFwiIGluIFxcXCJcIiArIGNvbHVtbi5lbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlOYW1lICsgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXFxcIlwiICsgZGF0YWJhc2UgKyBcIlxcXCIgZGF0YWJhc2UuXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIERhdGFUeXBlTm90U3VwcG9ydGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIGlmIHNvbWUgcmVxdWlyZWQgZHJpdmVyJ3Mgb3B0aW9uIGlzIG5vdCBzZXQuXG4gKi9cbnZhciBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRHJpdmVyT3B0aW9uTm90U2V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRHJpdmVyT3B0aW9uTm90U2V0RXJyb3Iob3B0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJEcml2ZXIgb3B0aW9uIChcIiArIG9wdGlvbk5hbWUgKyBcIikgaXMgbm90IHNldC4gXCIgK1xuICAgICAgICAgICAgXCJQbGVhc2Ugc2V0IGl0IHRvIHBlcmZvcm0gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBEcml2ZXJPcHRpb25Ob3RTZXRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcXVpcmVkIGRyaXZlcidzIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xudmFyIERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvcihkcml2ZXJOYW1lLCBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZHJpdmVyTmFtZSArIFwiIHBhY2thZ2UgaGFzIG5vdCBiZWVuIGZvdW5kIGluc3RhbGxlZC4gXCIgK1xuICAgICAgICAgICAgKFwiVHJ5IHRvIGluc3RhbGwgaXQ6IG5wbSBpbnN0YWxsIFwiICsgcGFja2FnZU5hbWUgKyBcIiAtLXNhdmVcIikpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBEcml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRHJpdmVyUGFja2FnZU5vdEluc3RhbGxlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyaXZlclBhY2thZ2VOb3RJbnN0YWxsZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgRW50aXR5Q29sdW1uTm90Rm91bmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eUNvbHVtbk5vdEZvdW5kLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVudGl0eUNvbHVtbk5vdEZvdW5kKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJObyBlbnRpdHkgY29sdW1uIFxcXCJcIiArIHByb3BlcnR5UGF0aCArIFwiXFxcIiB3YXMgZm91bmQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlDb2x1bW5Ob3RGb3VuZDtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlDb2x1bW5Ob3RGb3VuZC5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IodGFyZ2V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIk5vIG1ldGFkYXRhIGZvciBcXFwiXCIgKyBfdGhpcy5zdHJpbmdpZnlUYXJnZXQodGFyZ2V0KSArIFwiXFxcIiB3YXMgZm91bmQuXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgXCJuYW1lXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWV0YWRhdGFOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG5vIHJlc3VsdCBjb3VsZCBiZSBmb3VuZCBpbiBtZXRob2RzIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byByZXR1cm4gdW5kZWZpbmVkIG9yIGFuIGVtcHR5IHNldC5cbiAqL1xudmFyIEVudGl0eU5vdEZvdW5kRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVudGl0eU5vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW50aXR5Tm90Rm91bmRFcnJvcihlbnRpdHlDbGFzcywgY3JpdGVyaWEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiQ291bGQgbm90IGZpbmQgYW55IGVudGl0eSBvZiB0eXBlIFxcXCJcIiArIF90aGlzLnN0cmluZ2lmeVRhcmdldChlbnRpdHlDbGFzcykgKyBcIlxcXCIgXCIgK1xuICAgICAgICAgICAgKFwibWF0Y2hpbmc6IFwiICsgX3RoaXMuc3RyaW5naWZ5Q3JpdGVyaWEoY3JpdGVyaWEpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFbnRpdHlOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQub3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIgJiYgXCJuYW1lXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnRpdHlOb3RGb3VuZEVycm9yLnByb3RvdHlwZS5zdHJpbmdpZnlDcml0ZXJpYSA9IGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNyaXRlcmlhLCBudWxsLCA0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgICAgIHJldHVybiBcIlwiICsgY3JpdGVyaWE7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5Tm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiByZWxhdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBmaW5kIG9wdGlvbnMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGVudGl0aWVzLlxuKi9cbnZhciBGaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3Iobm90Rm91bmRSZWxhdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgaWYgKG5vdEZvdW5kUmVsYXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiUmVsYXRpb24gXFxcIlwiICsgbm90Rm91bmRSZWxhdGlvbnNbMF0gKyBcIlxcXCIgd2FzIG5vdCBmb3VuZDsgcGxlYXNlIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3QgYW5kIHJlYWxseSBleGlzdHMgaW4geW91ciBlbnRpdHkuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJSZWxhdGlvbnMgXCIgKyBub3RGb3VuZFJlbGF0aW9ucy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiBcIlxcXCJcIiArIHJlbGF0aW9uICsgXCJcXFwiXCI7IH0pLmpvaW4oXCIsIFwiKSArIFwiIHdlcmUgbm90IGZvdW5kOyBwbGVhc2UgY2hlY2sgaWYgcmVsYXRpb25zIGFyZSBjb3JyZWN0IGFuZCB0aGV5IGV4aXN0IGluIHlvdXIgZW50aXRpZXMuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiByZWxhdGlvbiBoYXMgYXJyYXkgaW5pdGlhbGl6ZWQgd2hpY2ggaXMgZm9yYmlkZGVuIG15IE9STS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlb3JtL3R5cGVvcm0vaXNzdWVzLzEzMTlcbiAqIEBzZWUgaHR0cDovL3R5cGVvcm0uaW8vIy9yZWxhdGlvbnMtZmFxL2F2b2lkLXJlbGF0aW9uLXByb3BlcnR5LWluaXRpYWxpemVyc1xuICovXG52YXIgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbml0aWFsaXplZFJlbGF0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yKHJlbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkFycmF5IGluaXRpYWxpemF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gZW50aXR5IHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgKFwiUGxlYXNlIHJlbW92ZSBhcnJheSBpbml0aWFsaXphdGlvbiAoPSBbXSkgZnJvbSBcXFwiXCIgKyByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIuIFwiKSArXG4gICAgICAgICAgICBcIlRoaXMgaXMgT1JNIHJlcXVpcmVtZW50IHRvIG1ha2UgcmVsYXRpb25zIHRvIHdvcmsgcHJvcGVybHkuIFJlZmVyIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbml0aWFsaXplZFJlbGF0aW9uRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluaXRpYWxpemVkUmVsYXRpb25FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IHVzaW5nIFF1ZXJ5QnVpbGRlciBidXQgZG8gbm90IHNwZWNpZnkgd2hhdCB0byBpbnNlcnQuXG4gKi9cbnZhciBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluc2VydFZhbHVlc01pc3NpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBwZXJmb3JtIGluc2VydCBxdWVyeSBiZWNhdXNlIHZhbHVlcyBhcmUgbm90IGRlZmluZWQuIFwiICtcbiAgICAgICAgICAgIFwiQ2FsbCBcXFwicWIudmFsdWVzKC4uLilcXFwiIG1ldGhvZCB0byBzcGVjaWZ5IGluc2VydGVkIHZhbHVlcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEluc2VydFZhbHVlc01pc3NpbmdFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdXNlciB0cmllcyB0byBidWlsZCBhbiBVUERBVEUgcXVlcnkgd2l0aCBMSU1JVCBidXQgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4qL1xudmFyIExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiWW91ciBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IExJTUlUIG9uIFVQREFURSBzdGF0ZW1lbnRzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IExpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBzZWxlY3RlZCBzcWwgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnRzIGxvY2tpbmcuXG4gKi9cbnZhciBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiBnaXZlbiBkcml2ZXIuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1ldGFkYXRhQWxyZWFkeUV4aXN0c0Vycm9yKG1ldGFkYXRhVHlwZSwgY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbWV0YWRhdGFUeXBlICsgXCIgbWV0YWRhdGEgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBcIiArIEpTT04uc3RyaW5naWZ5KGNvbnN0cnVjdG9yKSArXG4gICAgICAgICAgICAocHJvcGVydHlOYW1lID8gXCIgb24gcHJvcGVydHkgXCIgKyBwcm9wZXJ0eU5hbWUgOiBcIi4gSWYgeW91IHByZXZpb3VzbHkgcmVuYW1lZCBvciBtb3ZlZCBlbnRpdHkgY2xhc3MsIG1ha2Ugc3VyZVwiICtcbiAgICAgICAgICAgICAgICBcIiB0aGF0IGNvbXBpbGVkIHZlcnNpb24gb2Ygb2xkIGVudGl0eSBjbGFzcyBzb3VyY2Ugd2Fzbid0IGxlZnQgaW4gdGhlIGNvbXBpbGVyIG91dHB1dCBkaXJlY3RvcnkuXCIpKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFBbHJlYWR5RXhpc3RzRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1ldGFkYXRhV2l0aFN1Y2hOYW1lQWxyZWFkeUV4aXN0c0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNZXRhZGF0YVdpdGhTdWNoTmFtZUFscmVhZHlFeGlzdHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNZXRhZGF0YVdpdGhTdWNoTmFtZUFscmVhZHlFeGlzdHNFcnJvcihtZXRhZGF0YVR5cGUsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG1ldGFkYXRhVHlwZSArIFwiIG1ldGFkYXRhIHdpdGggc3VjaCBuYW1lIFwiICsgbmFtZSArIFwiIGFscmVhZHkgZXhpc3RzLiBcIiArXG4gICAgICAgICAgICBcIkRvIHlvdSBhcHBseSBkZWNvcmF0b3IgdHdpY2U/IE9yIG1heWJlIHRyeSB0byBjaGFuZ2UgYSBuYW1lP1wiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFXaXRoU3VjaE5hbWVBbHJlYWR5RXhpc3RzRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0RlbGV0ZURhdGVDb2x1bW5FcnJvcihlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJFbnRpdHkgXFxcIlwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiXFxcIiBkb2VzIG5vdCBoYXZlIGRlbGV0ZSBkYXRlIGNvbHVtbnMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ0RlbGV0ZURhdGVDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHNwZWNpZmllcyBkcml2ZXIgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0IG9yIHN1cHBvcnRlZC5cbiAqL1xudmFyIE1pc3NpbmdEcml2ZXJFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0RyaXZlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdEcml2ZXJFcnJvcihkcml2ZXJUeXBlLCBhdmFpbGFibGVEcml2ZXJzKSB7XG4gICAgICAgIGlmIChhdmFpbGFibGVEcml2ZXJzID09PSB2b2lkIDApIHsgYXZhaWxhYmxlRHJpdmVycyA9IFtdOyB9XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIldyb25nIGRyaXZlcjogXFxcIlwiICsgZHJpdmVyVHlwZSArIFwiXFxcIiBnaXZlbi4gU3VwcG9ydGVkIGRyaXZlcnMgYXJlOiBcIiArXG4gICAgICAgICAgICAoYXZhaWxhYmxlRHJpdmVycy5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIFwiXFxcIlwiICsgZCArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIi5cIikpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nRHJpdmVyRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0RyaXZlckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pc3NpbmdEcml2ZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgTWlzc2luZ0pvaW5Db2x1bW5FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0pvaW5Db2x1bW5FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nSm9pbkNvbHVtbkVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uKSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJKb2luQ29sdW1uIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArXG4gICAgICAgICAgICAgICAgKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAuIFwiKSArXG4gICAgICAgICAgICAgICAgXCJZb3UgbmVlZCB0byBwdXQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb24gb25lIG9mIHRoZSBzaWRlcy5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIkpvaW5Db2x1bW4gaXMgbWlzc2luZyBvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIG9uZS10by1vbmUgcmVsYXRpb25zaGlwLiBcIiArXG4gICAgICAgICAgICAgICAgXCJZb3UgbmVlZCB0byBwdXQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb24gaXQuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0pvaW5Db2x1bW5FcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nSm9pbkNvbHVtbkVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pc3NpbmdKb2luQ29sdW1uRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE1pc3NpbmdKb2luVGFibGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0pvaW5UYWJsZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdKb2luVGFibGVFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbikge1xuICAgICAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiSm9pblRhYmxlIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArXG4gICAgICAgICAgICAgICAgKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcC4gXCIpICtcbiAgICAgICAgICAgICAgICBcIllvdSBuZWVkIHRvIHB1dCBkZWNvcmF0b3IgZGVjb3JhdG9yIG9uIG9uZSBvZiB0aGUgc2lkZXMuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJKb2luVGFibGUgaXMgbWlzc2luZyBvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdSBuZWVkIHRvIHB1dCBKb2luVGFibGUgZGVjb3JhdG9yIG9uIGl0LlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdKb2luVGFibGVFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nSm9pblRhYmxlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ0pvaW5UYWJsZUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiRW50aXR5IFxcXCJcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkgY29sdW1uLiBQcmltYXJ5IGNvbHVtbiBpcyByZXF1aXJlZCB0byBcIiArXG4gICAgICAgICAgICBcImhhdmUgaW4gYWxsIHlvdXIgZW50aXRpZXMuIFVzZSBAUHJpbWFyeUNvbHVtbiBkZWNvcmF0b3IgdG8gYWRkIGEgcHJpbWFyeSBjb2x1bW4gdG8geW91ciBlbnRpdHkuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWlzc2luZ1ByaW1hcnlDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG1ldGhvZCBleHBlY3RzIGVudGl0eSBidXQgaW5zdGVhZCBzb21ldGhpbmcgZWxzZSBpcyBnaXZlbi5cbiAqL1xudmFyIE11c3RCZUVudGl0eUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNdXN0QmVFbnRpdHlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNdXN0QmVFbnRpdHlFcnJvcihvcGVyYXRpb24sIHdyb25nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IFwiICsgb3BlcmF0aW9uICsgXCIsIGdpdmVuIHZhbHVlIG11c3QgYmUgYW4gZW50aXR5LCBpbnN0ZWFkIFxcXCJcIiArIHdyb25nVmFsdWUgKyBcIlxcXCIgaXMgZ2l2ZW4uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBNdXN0QmVFbnRpdHlFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBNdXN0QmVFbnRpdHlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdXN0QmVFbnRpdHlFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGNvbnN1bWVyIHRyaWVzIHRvIHVzZSBuYW1pbmcgc3RyYXRlZ3kgdGhhdCBkb2VzIG5vdCBleGlzdC5cbiAqL1xudmFyIE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmFtaW5nU3RyYXRlZ3lOb3RGb3VuZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvcihzdHJhdGVneU5hbWUsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciBuYW1lID0gc3RyYXRlZ3lOYW1lIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBzdHJhdGVneU5hbWUubmFtZSA6IHN0cmF0ZWd5TmFtZTtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiTmFtaW5nIHN0cmF0ZWd5IFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZC4gTG9va3MgbGlrZSB0aGlzIG5hbWluZyBzdHJhdGVneSBkb2VzIG5vdCBcIiArXG4gICAgICAgICAgICAoXCJleGlzdCBvciBpdCB3YXMgbm90IHJlZ2lzdGVyZWQgaW4gY3VycmVudCBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uP1wiKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTmFtaW5nU3RyYXRlZ3lOb3RGb3VuZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5hbWluZ1N0cmF0ZWd5Tm90Rm91bmRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYW1pbmdTdHJhdGVneU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiTmVzdGVkIHNldHMgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgcm9vdCBlbnRpdGllcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZFNldE11bHRpcGxlUm9vdEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gYWNjZXNzIHJlcG9zaXRvcnkgYmVmb3JlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gKi9cbnZhciBOb0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5vQ29ubmVjdGlvbkZvclJlcG9zaXRvcnlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IoY29ubmVjdGlvbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiQ2Fubm90IGdldCBhIFJlcG9zaXRvcnkgZm9yIFxcXCJcIiArIGNvbm5lY3Rpb25OYW1lICsgXCIgY29ubmVjdGlvbiwgYmVjYXVzZSBjb25uZWN0aW9uIHdpdGggdGhlIGRhdGFiYXNlIFwiICtcbiAgICAgICAgICAgIFwiaXMgbm90IGVzdGFibGlzaGVkIHlldC4gQ2FsbCBjb25uZWN0aW9uI2Nvbm5lY3QgbWV0aG9kIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTm9Db25uZWN0aW9uRm9yUmVwb3NpdG9yeUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE5vQ29ubmVjdGlvbkZvclJlcG9zaXRvcnlFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBzb21lIG9wdGlvbiBpcyBub3Qgc2V0IGluIHRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKi9cbnZhciBOb0Nvbm5lY3Rpb25PcHRpb25FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9Db25uZWN0aW9uT3B0aW9uRXJyb3Iob3B0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJPcHRpb24gXFxcIlwiICsgb3B0aW9uTmFtZSArIFwiXFxcIiBpcyBub3Qgc2V0IGluIHlvdXIgY29ubmVjdGlvbiBvcHRpb25zLCBwbGVhc2UgXCIgK1xuICAgICAgICAgICAgKFwiZGVmaW5lIFxcXCJcIiArIG9wdGlvbk5hbWUgKyBcIlxcXCIgb3B0aW9uIGluIHlvdXIgY29ubmVjdGlvbiBvcHRpb25zIG9yIG9ybWNvbmZpZy5qc29uXCIpKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTm9Db25uZWN0aW9uT3B0aW9uRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTm9Db25uZWN0aW9uT3B0aW9uRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9Db25uZWN0aW9uT3B0aW9uRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBjb25zdW1lciB0cmllcyB0byByZWxlYXNlIGVudGl0eSBtYW5hZ2VyIHRoYXQgZG9lcyBub3QgdXNlIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICovXG52YXIgTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJFbnRpdHkgbWFuYWdlciBpcyBub3QgdXNpbmcgc2luZ2xlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNhbm5vdCBiZSByZWxlYXNlZC4gXCIgK1xuICAgICAgICAgICAgXCJPbmx5IGVudGl0eSBtYW5hZ2VycyBjcmVhdGVkIGJ5IGNvbm5lY3Rpb24jY3JlYXRlRW50aXR5TWFuYWdlcldpdGhTaW5nbGVEYXRhYmFzZUNvbm5lY3Rpb24gXCIgK1xuICAgICAgICAgICAgXCJtZXRob2RzIGhhdmUgYSBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgdGhleSBzaG91bGQgYmUgcmVsZWFzZWQuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb05lZWRUb1JlbGVhc2VFbnRpdHlNYW5hZ2VyRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgTm9OZWVkVG9SZWxlYXNlRW50aXR5TWFuYWdlckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIGFuIGVudGl0eSBkb2VzIG5vdCBoYXZlIG5vIHZlcnNpb24gYW5kIG5vIHVwZGF0ZSBkYXRlIGNvbHVtbi5cbiAqL1xudmFyIE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvcihlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiRW50aXR5IFwiICsgZW50aXR5ICsgXCIgZG9lcyBub3QgaGF2ZSB2ZXJzaW9uIG9yIHVwZGF0ZSBkYXRlIGNvbHVtbnMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gYnVpbGQgU0VMRUNUIHF1ZXJ5IHVzaW5nIE9GRlNFVCB3aXRob3V0IExJTUlUIGFwcGxpZWQgYnV0IGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4qL1xudmFyIE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiUkRCTVMgZG9lcyBub3Qgc3VwcG9ydCBPRkZTRVQgd2l0aG91dCBMSU1JVCBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4gWW91IG11c3QgdXNlIGxpbWl0IGluIFwiICtcbiAgICAgICAgICAgIFwiY29uanVuY3Rpb24gd2l0aCBvZmZzZXQgZnVuY3Rpb24gKG9yIHRha2UgaW4gY29uanVuY3Rpb24gd2l0aCBza2lwIGZ1bmN0aW9uIGlmIHlvdSBhcmUgXCIgK1xuICAgICAgICAgICAgXCJ1c2luZyBwYWdpbmF0aW9uKS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gYW4gb3B0aW1pc3RpYyBsb2NrIGNhbm5vdCBiZSB1c2VkIGluIHF1ZXJ5IGJ1aWxkZXIuXG4gKi9cbnZhciBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRoZSBvcHRpbWlzdGljIGxvY2sgY2FuIGJlIHVzZWQgb25seSB3aXRoIGdldE9uZSgpIG1ldGhvZC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gYSB2ZXJzaW9uIGNoZWNrIG9uIGFuIG9iamVjdCB0aGF0IHVzZXMgb3B0aW1pc3RpYyBsb2NraW5nIHRocm91Z2ggYSB2ZXJzaW9uIGZpZWxkIGZhaWxzLlxuICovXG52YXIgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yKGVudGl0eSwgZXhwZWN0ZWRWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRoZSBvcHRpbWlzdGljIGxvY2sgb24gZW50aXR5IFwiICsgZW50aXR5ICsgXCIgZmFpbGVkLCB2ZXJzaW9uIFwiICsgZXhwZWN0ZWRWZXJzaW9uICsgXCIgd2FzIGV4cGVjdGVkLCBidXQgaXMgYWN0dWFsbHkgXCIgKyBhY3R1YWxWZXJzaW9uICsgXCIuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biAuIFRoZW9yZXRpY2FsbHkgY2FuJ3QgYmUgdGhyb3duLlxuICovXG52YXIgUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJJbnRlcm5hbCBlcnJvci4gUGVyc2lzdGVkIGVudGl0eSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIHByZXBhcmVkIG9wZXJhdGVkIGVudGl0aWVzLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBQZXJzaXN0ZWRFbnRpdHlOb3RGb3VuZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBlcnNpc3RlZEVudGl0eU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHRyYW5zYWN0aW9uIGlzIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24sIGJ1dCB0aGVyZSBpcyBub25lIG9wZW4uXG4gKi9cbnZhciBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBlc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkFuIG9wZW4gdHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgZm9yIHBlc3NpbWlzdGljIGxvY2suXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBlc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlByaW1hcnkgY29sdW1uIFwiICsgb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgKyBcIiNcIiArIHByb3BlcnR5TmFtZSArIFwiIGNhbm5vdCBiZSBudWxsYWJsZS4gXCIgK1xuICAgICAgICAgICAgXCJJdHMgbm90IGFsbG93ZWQgZm9yIHByaW1hcnkga2V5cy4gVHJ5IHRvIHJlbW92ZSBudWxsYWJsZSBvcHRpb24uXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMsIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHF1ZXJ5IGV4ZWN1dGlvbiBoYXMgZmFpbGVkLlxuKi9cbnZhciBRdWVyeUZhaWxlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWVyeUZhaWxlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXJ5RmFpbGVkRXJyb3IocXVlcnksIHBhcmFtZXRlcnMsIGRyaXZlckVycm9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRyaXZlckVycm9yLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eZXJyb3I6IC8sIFwiXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXkVycm9yOiAvLCBcIlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15SZXF1ZXN0LywgXCJcIikpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIF90aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICBfdGhpcy5kcml2ZXJFcnJvciA9IGRyaXZlckVycm9yO1xuICAgICAgICBpZiAoZHJpdmVyRXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBfID0gZHJpdmVyRXJyb3IubmFtZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgb3RoZXJQcm9wZXJ0aWVzID0gX19yZXN0KGRyaXZlckVycm9yLCBbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbihfdGhpcywgX19hc3NpZ24oe30sIG90aGVyUHJvcGVydGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5RmFpbGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUZhaWxlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlF1ZXJ5IHJ1bm5lciBhbHJlYWR5IHJlbGVhc2VkLiBDYW5ub3QgcnVuIHF1ZXJpZXMgYW55bW9yZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5UnVubmVyQWxyZWFkeVJlbGVhc2VkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeVJ1bm5lckFscmVhZHlSZWxlYXNlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gY29uc3VtZXIgdHJpZXMgdG8gdXNlIHF1ZXJ5IHJ1bm5lciBmcm9tIHF1ZXJ5IHJ1bm5lciBwcm92aWRlciBhZnRlciBpdCB3YXMgcmVsZWFzZWQuXG4gKi9cbnZhciBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBRdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvdmlkZWQgYnkgYSBxdWVyeSBydW5uZXIgd2FzIGFscmVhZHkgXCIgK1xuICAgICAgICAgICAgXCJyZWxlYXNlZCwgY2Fubm90IGNvbnRpbnVlIHRvIHVzZSBpdHMgcXVlcnlpbmcgbWV0aG9kcyBhbnltb3JlLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUXVlcnlSdW5uZXJQcm92aWRlckFscmVhZHlSZWxlYXNlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFF1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeVJ1bm5lclByb3ZpZGVyQWxyZWFkeVJlbGVhc2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBub3QgZm91bmQuXG4gKi9cbnZhciBSZXBvc2l0b3J5Tm90Rm91bmRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IoY29ubmVjdGlvbk5hbWUsIGVudGl0eUNsYXNzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIHZhciB0YXJnZXROYW1lO1xuICAgICAgICBpZiAoZW50aXR5Q2xhc3MgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEpIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcy5vcHRpb25zLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVudGl0eUNsYXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbnRpdHlDbGFzcyA9PT0gXCJvYmplY3RcIiAmJiBcIm5hbWVcIiBpbiBlbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXROYW1lID0gZW50aXR5Q2xhc3M7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IFwiTm8gcmVwb3NpdG9yeSBmb3IgXFxcIlwiICsgdGFyZ2V0TmFtZSArIFwiXFxcIiB3YXMgZm91bmQuIExvb2tzIGxpa2UgdGhpcyBlbnRpdHkgaXMgbm90IHJlZ2lzdGVyZWQgaW4gXCIgK1xuICAgICAgICAgICAgKFwiY3VycmVudCBcXFwiXCIgKyBjb25uZWN0aW9uTmFtZSArIFwiXFxcIiBjb25uZWN0aW9uP1wiKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHJlcG9zaXRvcnkgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBub3QgZm91bmQuXG4gKi9cbnZhciBSZXBvc2l0b3J5Tm90VHJlZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXBvc2l0b3J5Tm90VHJlZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlcG9zaXRvcnlOb3RUcmVlRXJyb3IoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIHRhcmdldE5hbWU7XG4gICAgICAgIGlmIChlbnRpdHlDbGFzcyBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSkge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm9wdGlvbnMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZW50aXR5Q2xhc3MgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGFyZ2V0TmFtZSA9IGVudGl0eUNsYXNzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVudGl0eUNsYXNzID09PSBcIm9iamVjdFwiICYmIFwibmFtZVwiIGluIGVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICB0YXJnZXROYW1lID0gZW50aXR5Q2xhc3MubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE5hbWUgPSBlbnRpdHlDbGFzcztcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5tZXNzYWdlID0gXCJSZXBvc2l0b3J5IG9mIHRoZSBcXFwiXCIgKyB0YXJnZXROYW1lICsgXCJcXFwiIGNsYXNzIGlzIG5vdCBhIFRyZWVSZXBvc2l0b3J5LiBUcnkgdG8gYXBwbHkgQFRyZWUgZGVjb3JhdG9yIG9uIHlvdXIgZW50aXR5LlwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZXBvc2l0b3J5Tm90VHJlZUVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFJlcG9zaXRvcnlOb3RUcmVlRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVwb3NpdG9yeU5vdFRyZWVFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHVzZXIgdHJpZXMgdG8gYnVpbGQgYSBxdWVyeSB3aXRoIFJFVFVSTklORyAvIE9VVFBVVCBzdGF0ZW1lbnQsXG4gKiBidXQgdXNlZCBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGl0LlxuICovXG52YXIgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJPVVRQVVQgb3IgUkVUVVJOSU5HIGNsYXVzZSBvbmx5IHN1cHBvcnRlZCBieSBNaWNyb3NvZnQgU1FMIFNlcnZlciBvciBQb3N0Z3JlU1FMIGRhdGFiYXNlcy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gc2FtZSBvYmplY3QgaXMgc2NoZWR1bGVkIGZvciByZW1vdmUgYW5kIHVwZGF0aW9uIGF0IHRoZSBzYW1lIHRpbWUuXG4gKi9cbnZhciBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3Ioc3ViamVjdCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJSZW1vdmVkIGVudGl0eSBcXFwiXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgaXMgYWxzbyBzY2hlZHVsZWQgZm9yIHVwZGF0ZSBvcGVyYXRpb24uIFwiICtcbiAgICAgICAgICAgIFwiTWFrZSBzdXJlIHlvdSBhcmUgbm90IHVwZGF0aW5nIGFuZCByZW1vdmluZyBzYW1lIG9iamVjdCAobm90ZSB0aGF0IHVwZGF0ZSBvciByZW1vdmUgbWF5IGJlIGV4ZWN1dGVkIGJ5IGNhc2NhZGUgb3BlcmF0aW9ucykuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG4vKipcbiAqIFRocm93biB3aGVuIG9wZXJhdGlvbiBpcyBnb2luZyB0byBiZSBleGVjdXRlZCBvbiBhIHN1YmplY3Qgd2l0aG91dCBpZGVudGlmaWVyLlxuICogVGhpcyBlcnJvciBzaG91bGQgbmV2ZXIgYmUgdGhyb3duLCBob3dldmVyIGl0IHN0aWxsIHByZXNlbnRzIHRvIHByZXZlbnQgdXNlciBmcm9tIHVwZGF0aW9uIG9yIHJlbW92aW5nIHRoZSB3aG9sZSB0YWJsZS5cbiAqIElmIHRoaXMgZXJyb3Igb2NjdXJzIHN0aWxsLCBpdCBtb3N0IHByb2JhYmx5IGlzIGFuIE9STSBpbnRlcm5hbCBwcm9ibGVtIHdoaWNoIG11c3QgYmUgcmVwb3J0ZWQgYW5kIGZpeGVkLlxuICovXG52YXIgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiSW50ZXJuYWwgZXJyb3IuIFN1YmplY3QgXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiBtdXN0IGhhdmUgYW4gaWRlbnRpZmllciB0byBwZXJmb3JtIG9wZXJhdGlvbi5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3RXaXRob3V0SWRlbnRpZmllckVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBzdGFydGVkIGFuZCB1c2VyIHRyaWVzIHRvIHJ1biBpdCBhZ2Fpbi5cbiAqL1xudmFyIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVHJhbnNhY3Rpb24gYWxyZWFkeSBzdGFydGVkIGZvciB0aGUgZ2l2ZW4gY29ubmVjdGlvbiwgY29tbWl0IGN1cnJlbnQgdHJhbnNhY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25BbHJlYWR5U3RhcnRlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbi8qKlxuICogVGhyb3duIHdoZW4gdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQgeWV0IGFuZCB1c2VyIHRyaWVzIHRvIHJ1biBjb21taXQgb3Igcm9sbGJhY2suXG4gKi9cbnZhciBUcmFuc2FjdGlvbk5vdFN0YXJ0ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlRyYW5zYWN0aW9uIGlzIG5vdCBzdGFydGVkIHlldCwgc3RhcnQgdHJhbnNhY3Rpb24gYmVmb3JlIGNvbW1pdHRpbmcgb3Igcm9sbGluZyBpdCBiYWNrLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNhY3Rpb25Ob3RTdGFydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvcihkcml2ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVHJlZSByZXBvc2l0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gXCIgKyBkcml2ZXIub3B0aW9ucy50eXBlICsgXCIgZHJpdmVyLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBUcmVlUmVwb3NpdG9yeU5vdFN1cHBvcnRlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVSZXBvc2l0b3J5Tm90U3VwcG9ydGVkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbnZhciBUeXBlT1JNRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFR5cGVPUk1FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUeXBlT1JNRXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIC8vIHJlc3RvcmUgcHJvdG90eXBlIGNoYWluIGJlY2F1c2UgdGhlIGJhc2UgYEVycm9yYCB0eXBlXG4gICAgICAgIC8vIHdpbGwgYnJlYWsgdGhlIHByb3RvdHlwZSBjaGFpbiBhIGxpdHRsZVxuICAgICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IF9uZXdUYXJnZXQucHJvdG90eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFR5cGVPUk1FcnJvci5wcm90b3R5cGUsIFwibmFtZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBUeXBlT1JNRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBUeXBlT1JNRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHlwZU9STUVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbm5vdCBwZXJmb3JtIHVwZGF0ZSBxdWVyeSBiZWNhdXNlIHVwZGF0ZSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkLiBDYWxsIFxcXCJxYi5zZXQoLi4uKVxcXCIgbWV0aG9kIHRvIHNwZWNpZnkgdXBkYXRlZCB2YWx1ZXMuXCIpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3I7XG59KFR5cGVPUk1FcnJvcikpO1xuZXhwb3J0IHsgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4vVHlwZU9STUVycm9yXCI7XG52YXIgVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbikge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJVc2luZyBKb2luQ29sdW1uIG9uIFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgaXMgd3JvbmcuIFwiICtcbiAgICAgICAgICAgIFwiWW91IGNhbiB1c2UgSm9pbkNvbHVtbiBvbmx5IG9uIG9uZS10by1vbmUgYW5kIG1hbnktdG8tb25lIHJlbGF0aW9ucy5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yO1xufShUeXBlT1JNRXJyb3IpKTtcbmV4cG9ydCB7IFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi9UeXBlT1JNRXJyb3JcIjtcbnZhciBVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBcIlVzaW5nIEpvaW5Db2x1bW4gaXMgYWxsb3dlZCBvbmx5IG9uIG9uZSBzaWRlIG9mIHRoZSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcC4gXCIgK1xuICAgICAgICAgICAgKFwiQm90aCBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgIFwiaGFzIEpvaW5UYWJsZSBkZWNvcmF0b3JzLiBDaG9vc2Ugb25lIG9mIHRoZW0gYW5kIGxlZnQgSm9pblRhYmxlIGRlY29yYXRvciBvbmx5IG9uIGl0LlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVXNpbmdKb2luQ29sdW1uT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5Db2x1bW5Pbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVXNpbmcgSm9pblRhYmxlIG9uIFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgaXMgd3JvbmcuIFwiICtcbiAgICAgICAgICAgIChlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIiBoYXMgXCIgKyByZWxhdGlvbi5yZWxhdGlvblR5cGUgKyBcIiByZWxhdGlvbiwgXCIpICtcbiAgICAgICAgICAgIFwiaG93ZXZlciB5b3UgY2FuIHVzZSBKb2luVGFibGUgb25seSBvbiBtYW55LXRvLW1hbnkgcmVsYXRpb25zLlwiKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVXNpbmdKb2luVGFibGVJc05vdEFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVzaW5nSm9pblRhYmxlSXNOb3RBbGxvd2VkRXJyb3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xudmFyIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFwiVXNpbmcgSm9pblRhYmxlIGlzIGFsbG93ZWQgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcC4gXCIgK1xuICAgICAgICAgICAgKFwiQm90aCBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgIFwiaGFzIEpvaW5UYWJsZSBkZWNvcmF0b3JzLiBDaG9vc2Ugb25lIG9mIHRoZW0gYW5kIGxlZnQgSm9pbkNvbHVtbiBkZWNvcmF0b3Igb25seSBvbiBpdC5cIikgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVzaW5nSm9pblRhYmxlT25seU9uT25lU2lkZUFsbG93ZWRFcnJvcjtcbn0oVHlwZU9STUVycm9yKSk7XG5leHBvcnQgeyBVc2luZ0pvaW5UYWJsZU9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yLmpzLm1hcFxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90UmVmbGVjdE1ldGhvZFBhcmFtZXRlclR5cGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQWxyZWFkeUhhc0FjdGl2ZUNvbm5lY3Rpb25FcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdENvbm5lY3RBbHJlYWR5Q29ubmVjdGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nvbm5lY3Rpb25Jc05vdFNldEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9DYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NZXRhZGF0YUFscmVhZHlFeGlzdHNFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90RGV0ZXJtaW5lRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1VwZGF0ZVZhbHVlc01pc3NpbmdFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHJlZVJlcG9zaXRvcnlOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0VudGl0eU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0VudGl0eU1ldGFkYXRhTm90Rm91bmRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTXVzdEJlRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL09wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ3VzdG9tUmVwb3NpdG9yeUNhbm5vdEluaGVyaXRSZXBvc2l0b3J5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1F1ZXJ5UnVubmVyUHJvdmlkZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0N1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ob0Nvbm5lY3Rpb25Gb3JSZXBvc2l0b3J5RXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0NpcmN1bGFyUmVsYXRpb25zRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Vc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nSm9pbkNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9FbnRpdHlDb2x1bW5Ob3RGb3VuZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTWlzc2luZ0RyaXZlckVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ecml2ZXJQYWNrYWdlTm90SW5zdGFsbGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdEdldEVudGl0eU1hbmFnZXJOb3RDb25uZWN0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ29ubmVjdGlvbk5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL05vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL01ldGFkYXRhV2l0aFN1Y2hOYW1lQWxyZWFkeUV4aXN0c0Vycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9Ecml2ZXJPcHRpb25Ob3RTZXRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9zaXRvcnlOb3RGb3VuZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9OYW1pbmdTdHJhdGVneU5vdEZvdW5kRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Blc3NpbWlzdGljTG9ja1RyYW5zYWN0aW9uUmVxdWlyZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmVwb3NpdG9yeU5vdFRyZWVFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9NaXNzaW5nSm9pblRhYmxlRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1F1ZXJ5RmFpbGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL05vTmVlZFRvUmVsZWFzZUVudGl0eU1hbmFnZXJFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luQ29sdW1uT25seU9uT25lU2lkZUFsbG93ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luVGFibGVPbmx5T25PbmVTaWRlQWxsb3dlZEVycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGVyc2lzdGVkRW50aXR5Tm90Rm91bmRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vVXNpbmdKb2luQ29sdW1uSXNOb3RBbGxvd2VkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0NvbHVtblR5cGVVbmRlZmluZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUXVlcnlSdW5uZXJBbHJlYWR5UmVsZWFzZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nhbm5vdEV4ZWN1dGVOb3RDb25uZWN0ZWRFcnJvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTm9Db25uZWN0aW9uT3B0aW9uRXJyb3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1FcnJvclwiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZENvbmRpdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbmRNYW55T3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmluZE9uZU9wdGlvbnMuanMubWFwXG4iLCIvKipcbiAqIEZpbmQgT3BlcmF0b3IgdXNlZCBpbiBGaW5kIENvbmRpdGlvbnMuXG4gKi9cbnZhciBGaW5kT3BlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEZpbmRPcGVyYXRvcih0eXBlLCB2YWx1ZSwgdXNlUGFyYW1ldGVyLCBtdWx0aXBsZVBhcmFtZXRlcnMsIGdldFNxbCwgb2JqZWN0TGl0ZXJhbFBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKHVzZVBhcmFtZXRlciA9PT0gdm9pZCAwKSB7IHVzZVBhcmFtZXRlciA9IHRydWU7IH1cbiAgICAgICAgaWYgKG11bHRpcGxlUGFyYW1ldGVycyA9PT0gdm9pZCAwKSB7IG11bHRpcGxlUGFyYW1ldGVycyA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91c2VQYXJhbWV0ZXIgPSB1c2VQYXJhbWV0ZXI7XG4gICAgICAgIHRoaXMuX211bHRpcGxlUGFyYW1ldGVycyA9IG11bHRpcGxlUGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fZ2V0U3FsID0gZ2V0U3FsO1xuICAgICAgICB0aGlzLl9vYmplY3RMaXRlcmFsUGFyYW1ldGVycyA9IG9iamVjdExpdGVyYWxQYXJhbWV0ZXJzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJ1c2VQYXJhbWV0ZXJcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcGFyYW1ldGVyIGlzIHVzZWQgb3Igbm90IGZvciB0aGlzIG9wZXJhdG9yLlxuICAgICAgICAgKiBFeHRyYWN0cyBmaW5hbCB2YWx1ZSBpZiB2YWx1ZSBpcyBhbm90aGVyIGZpbmQgb3BlcmF0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudXNlUGFyYW1ldGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVBhcmFtZXRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kT3BlcmF0b3IucHJvdG90eXBlLCBcIm11bHRpcGxlUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgbXVsdGlwbGUgcGFyYW1ldGVycyBtdXN0IGJlIHVzZWQgZm9yIHRoaXMgb3BlcmF0b3IuXG4gICAgICAgICAqIEV4dHJhY3RzIGZpbmFsIHZhbHVlIGlmIHZhbHVlIGlzIGFub3RoZXIgZmluZCBvcGVyYXRvci5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5tdWx0aXBsZVBhcmFtZXRlcnM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGVQYXJhbWV0ZXJzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRPcGVyYXRvci5wcm90b3R5cGUsIFwidHlwZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBUeXBlIG9mIHRoaXMgRmluZE9wZXJhdG9yXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRPcGVyYXRvci5wcm90b3R5cGUsIFwidmFsdWVcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgZmluYWwgdmFsdWUgbmVlZHMgdG8gYmUgdXNlZCBhcyBwYXJhbWV0ZXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJvYmplY3RMaXRlcmFsUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIE9iamVjdExpdGVyYWwgcGFyYW1ldGVycy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5vYmplY3RMaXRlcmFsUGFyYW1ldGVycztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RMaXRlcmFsUGFyYW1ldGVycztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kT3BlcmF0b3IucHJvdG90eXBlLCBcImNoaWxkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGNoaWxkIEZpbmRPcGVyYXRvciBpZiBpdCBleGlzdHNcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmluZE9wZXJhdG9yLnByb3RvdHlwZSwgXCJnZXRTcWxcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgU1FMIGdlbmVyYXRvclxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBGaW5kT3BlcmF0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmdldFNxbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTcWw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gRmluZE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCB7IEZpbmRPcGVyYXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5kT3BlcmF0b3IuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbmRPcGVyYXRvclR5cGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXksIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBGaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9GaW5kUmVsYXRpb25zTm90Rm91bmRFcnJvclwiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vZHJpdmVyL0RyaXZlclV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogVXRpbGl0aWVzIHRvIHdvcmsgd2l0aCBGaW5kT3B0aW9ucy5cbiAqL1xudmFyIEZpbmRPcHRpb25zVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmluZE9wdGlvbnNVdGlscygpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gb2JqZWN0IGlzIHJlYWxseSBpbnN0YW5jZSBvZiBGaW5kT25lT3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRPbmVPcHRpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgcG9zc2libGVPcHRpb25zID0gb2JqO1xuICAgICAgICByZXR1cm4gcG9zc2libGVPcHRpb25zICYmXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheShwb3NzaWJsZU9wdGlvbnMuc2VsZWN0KSB8fFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3B0aW9ucy53aGVyZSBpbnN0YW5jZW9mIE9iamVjdCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMud2hlcmUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBvc3NpYmxlT3B0aW9ucy5yZWxhdGlvbnMpIHx8XG4gICAgICAgICAgICAgICAgcG9zc2libGVPcHRpb25zLmpvaW4gaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMub3JkZXIgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMuY2FjaGUgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmNhY2hlID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMuY2FjaGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9wdGlvbnMubG9jayBpbnN0YW5jZW9mIE9iamVjdCB8fFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgaW5zdGFuY2VvZiBPYmplY3QgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmxvYWRSZWxhdGlvbklkcyA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLmxvYWRFYWdlclJlbGF0aW9ucyA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLndpdGhEZWxldGVkID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMudHJhbnNhY3Rpb24gPT09IFwiYm9vbGVhblwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiBvYmplY3QgaXMgcmVhbGx5IGluc3RhbmNlIG9mIEZpbmRNYW55T3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5pc0ZpbmRNYW55T3B0aW9ucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgdmFyIHBvc3NpYmxlT3B0aW9ucyA9IG9iajtcbiAgICAgICAgcmV0dXJuIHBvc3NpYmxlT3B0aW9ucyAmJiAodGhpcy5pc0ZpbmRPbmVPcHRpb25zKHBvc3NpYmxlT3B0aW9ucykgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMuc2tpcCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHBvc3NpYmxlT3B0aW9ucy50YWtlID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0eXBlb2YgcG9zc2libGVPcHRpb25zLnNraXAgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwb3NzaWJsZU9wdGlvbnMudGFrZSA9PT0gXCJzdHJpbmdcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gb2JqZWN0IGlzIHJlYWxseSBpbnN0YW5jZSBvZiBGaW5kT3B0aW9ucyBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5leHRyYWN0RmluZE1hbnlPcHRpb25zQWxpYXMgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9iamVjdCkgJiYgb2JqZWN0LmpvaW4pXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0LmpvaW4uYWxpYXM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGdpdmUgZmluZCBtYW55IG9wdGlvbnMgdG8gdGhlIGdpdmVuIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgRmluZE9wdGlvbnNVdGlscy5hcHBseUZpbmRNYW55T3B0aW9uc09yQ29uZGl0aW9uc1RvUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKHFiLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlPcHRpb25zVG9RdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucylcbiAgICAgICAgICAgIHJldHVybiBxYi53aGVyZShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBnaXZlIGZpbmQgb3B0aW9ucyB0byB0aGUgZ2l2ZW4gcXVlcnkgYnVpbGRlci5cbiAgICAgKi9cbiAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5T3B0aW9uc1RvUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKHFiLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIGlmIG9wdGlvbnMgYXJlIG5vdCBzZXQgdGhlbiBzaW1wbHkgcmV0dXJuIHF1ZXJ5IGJ1aWxkZXIuIFRoaXMgaXMgbWFkZSBmb3Igc2ltcGxpY2l0eSBvZiB1c2FnZS5cbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICghdGhpcy5pc0ZpbmRPbmVPcHRpb25zKG9wdGlvbnMpICYmICF0aGlzLmlzRmluZE1hbnlPcHRpb25zKG9wdGlvbnMpKSlcbiAgICAgICAgICAgIHJldHVybiBxYjtcbiAgICAgICAgaWYgKG9wdGlvbnMudHJhbnNhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHFiLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMgfHwgIXFiLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHFiO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgLy8gYXBwbHkgYWxsIG9wdGlvbnMgZnJvbSBGaW5kT3B0aW9uc1xuICAgICAgICBpZiAob3B0aW9ucy53aXRoRGVsZXRlZCkge1xuICAgICAgICAgICAgcWIud2l0aERlbGV0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgICAgIHFiLnNlbGVjdChbXSk7XG4gICAgICAgICAgICBvcHRpb25zLnNlbGVjdC5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmhhc0NvbHVtbldpdGhQcm9wZXJ0eVBhdGgoXCJcIiArIHNlbGVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3Ioc2VsZWN0ICsgXCIgY29sdW1uIHdhcyBub3QgZm91bmQgaW4gdGhlIFwiICsgbWV0YWRhdGEubmFtZSArIFwiIGVudGl0eS5cIik7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSBtZXRhZGF0YS5maW5kQ29sdW1uc1dpdGhQcm9wZXJ0eVBhdGgoXCJcIiArIHNlbGVjdCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY29sdW1uc18xID0gX192YWx1ZXMoY29sdW1ucyksIGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKTsgIWNvbHVtbnNfMV8xLmRvbmU7IGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkU2VsZWN0KHFiLmFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnNfMV8xICYmICFjb2x1bW5zXzFfMS5kb25lICYmIChfYSA9IGNvbHVtbnNfMS5yZXR1cm4pKSBfYS5jYWxsKGNvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJlbGF0aW9ucykge1xuICAgICAgICAgICAgLy8gQ29weSBiZWNhdXNlIGBhcHBseVJlbGF0aW9uc1JlY3Vyc2l2ZWx5YCBtb2RpZmllcyBpdFxuICAgICAgICAgICAgdmFyIGFsbFJlbGF0aW9ucyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChvcHRpb25zLnJlbGF0aW9ucyksIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSZWxhdGlvbnNSZWN1cnNpdmVseShxYiwgYWxsUmVsYXRpb25zLCBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCBxYi5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgXCJcIik7XG4gICAgICAgICAgICAvLyByZWN1cnNpdmUgcmVtb3ZlcyBmb3VuZCByZWxhdGlvbnMgZnJvbSBhbGxSZWxhdGlvbnMgYXJyYXlcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSByZWxhdGlvbnMgbGVmdCBpbiB0aGlzIGFycmF5IGl0IG1lYW5zIHRob3NlIHJlbGF0aW9ucyB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgZW50aXR5IHN0cnVjdHVyZVxuICAgICAgICAgICAgLy8gc28sIHdlIGdpdmUgYW4gZXhjZXB0aW9uIGFib3V0IG5vdCBmb3VuZCByZWxhdGlvbnNcbiAgICAgICAgICAgIGlmIChhbGxSZWxhdGlvbnMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmluZFJlbGF0aW9uc05vdEZvdW5kRXJyb3IoYWxsUmVsYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5qb2luKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5qb2luLmxlZnRKb2luKVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbltrZXldLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuam9pbi5pbm5lckpvaW4pXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5qb2luLmlubmVySm9pbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmlubmVySm9pbihvcHRpb25zLmpvaW4uaW5uZXJKb2luW2tleV0sIGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5qb2luLmxlZnRKb2luQW5kU2VsZWN0KVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuam9pbi5sZWZ0Sm9pbkFuZFNlbGVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luQW5kU2VsZWN0KG9wdGlvbnMuam9pbi5sZWZ0Sm9pbkFuZFNlbGVjdFtrZXldLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuam9pbi5pbm5lckpvaW5BbmRTZWxlY3QpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5qb2luLmlubmVySm9pbkFuZFNlbGVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHFiLmlubmVySm9pbkFuZFNlbGVjdChvcHRpb25zLmpvaW4uaW5uZXJKb2luQW5kU2VsZWN0W2tleV0sIGtleSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNhY2hlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhY2hlID0gb3B0aW9ucy5jYWNoZTtcbiAgICAgICAgICAgICAgICBxYi5jYWNoZShjYWNoZS5pZCwgY2FjaGUubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHFiLmNhY2hlKG9wdGlvbnMuY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmxvY2spIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxvY2subW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpIHtcbiAgICAgICAgICAgICAgICBxYi5zZXRMb2NrKG9wdGlvbnMubG9jay5tb2RlLCBvcHRpb25zLmxvY2sudmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY19yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZGlydHlfcmVhZFwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVfb3JfZmFpbFwiIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZm9yX25vX2tleV91cGRhdGVcIikge1xuICAgICAgICAgICAgICAgIHZhciB0YWJsZU5hbWVzID0gb3B0aW9ucy5sb2NrLnRhYmxlcyA/IG9wdGlvbnMubG9jay50YWJsZXMubWFwKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVBbGlhcyA9IHFiLmV4cHJlc3Npb25NYXAuYWxpYXNlcy5maW5kKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLm1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPT09IHRhYmxlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZUFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiXFxcIlwiICsgdGFibGUgKyBcIlxcXCIgaXMgbm90IHBhcnQgb2YgdGhpcyBxdWVyeVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWIuZXNjYXBlKHRhYmxlQWxpYXMubmFtZSk7XG4gICAgICAgICAgICAgICAgfSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcWIuc2V0TG9jayhvcHRpb25zLmxvY2subW9kZSwgdW5kZWZpbmVkLCB0YWJsZU5hbWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHFiLmxvYWRBbGxSZWxhdGlvbklkcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMubG9hZFJlbGF0aW9uSWRzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICBxYi5sb2FkQWxsUmVsYXRpb25JZHMob3B0aW9ucy5sb2FkUmVsYXRpb25JZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLndoZXJlKVxuICAgICAgICAgICAgcWIud2hlcmUob3B0aW9ucy53aGVyZSk7XG4gICAgICAgIGlmIChvcHRpb25zLnNraXApXG4gICAgICAgICAgICBxYi5za2lwKG9wdGlvbnMuc2tpcCk7XG4gICAgICAgIGlmIChvcHRpb25zLnRha2UpXG4gICAgICAgICAgICBxYi50YWtlKG9wdGlvbnMudGFrZSk7XG4gICAgICAgIGlmIChvcHRpb25zLm9yZGVyKVxuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5vcmRlcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gb3B0aW9ucy5vcmRlcltrZXldO1xuICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGtleSArIFwiIGNvbHVtbiB3YXMgbm90IGZvdW5kIGluIHRoZSBcIiArIG1ldGFkYXRhLm5hbWUgKyBcIiBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkFTQ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkRFU0NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkFTQ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkFTQ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiREVTQ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuYWRkT3JkZXJCeShxYi5hbGlhcyArIFwiLlwiICsga2V5LCBcIkRFU0NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAocWIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWxhdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIENvcHkgYmVjYXVzZSBgYXBwbHlSZWxhdGlvbnNSZWN1cnNpdmVseWAgbW9kaWZpZXMgaXRcbiAgICAgICAgICAgIHZhciBhbGxSZWxhdGlvbnMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQob3B0aW9ucy5yZWxhdGlvbnMpLCBmYWxzZSk7XG4gICAgICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5UmVsYXRpb25zUmVjdXJzaXZlbHkocWIsIGFsbFJlbGF0aW9ucywgcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSwgcWIuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIFwiXCIpO1xuICAgICAgICAgICAgLy8gcmVjdXJzaXZlIHJlbW92ZXMgZm91bmQgcmVsYXRpb25zIGZyb20gYWxsUmVsYXRpb25zIGFycmF5XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcmVsYXRpb25zIGxlZnQgaW4gdGhpcyBhcnJheSBpdCBtZWFucyB0aG9zZSByZWxhdGlvbnMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGVudGl0eSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgIC8vIHNvLCB3ZSBnaXZlIGFuIGV4Y2VwdGlvbiBhYm91dCBub3QgZm91bmQgcmVsYXRpb25zXG4gICAgICAgICAgICBpZiAoYWxsUmVsYXRpb25zLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbmRSZWxhdGlvbnNOb3RGb3VuZEVycm9yKGFsbFJlbGF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHFiO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBBZGRzIGpvaW5zIGZvciBhbGwgcmVsYXRpb25zIGFuZCBzdWItcmVsYXRpb25zIG9mIHRoZSBnaXZlbiByZWxhdGlvbnMgcHJvdmlkZWQgaW4gdGhlIGZpbmQgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5UmVsYXRpb25zUmVjdXJzaXZlbHkgPSBmdW5jdGlvbiAocWIsIGFsbFJlbGF0aW9ucywgYWxpYXMsIG1ldGFkYXRhLCBwcmVmaXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gZmluZCBhbGwgcmVsYXRpb25zIHRoYXQgbWF0Y2ggZ2l2ZW4gcHJlZml4XG4gICAgICAgIHZhciBtYXRjaGVkQmFzZVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhwXzEgPSBuZXcgUmVnRXhwKFwiXlwiICsgcHJlZml4LnJlcGxhY2UoXCIuXCIsIFwiXFxcXC5cIikgKyBcIlxcXFwuXCIpO1xuICAgICAgICAgICAgbWF0Y2hlZEJhc2VSZWxhdGlvbnMgPSBhbGxSZWxhdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ubWF0Y2gocmVnZXhwXzEpOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5yZXBsYWNlKHJlZ2V4cF8xLCBcIlwiKTsgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2hlZEJhc2VSZWxhdGlvbnMgPSBhbGxSZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIG1hdGNoZWQgcmVsYXRpb25zIGFuZCBhZGQgam9pbiBmb3IgdGhlbVxuICAgICAgICBtYXRjaGVkQmFzZVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYSByZWxhdGlvbiBhbGlhc1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uQWxpYXMgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKHFiLmNvbm5lY3Rpb24uZHJpdmVyLCB7IHNob3J0ZW46IHRydWUsIGpvaW5lcjogXCJfX1wiIH0sIGFsaWFzLCByZWxhdGlvbik7XG4gICAgICAgICAgICAvLyBhZGQgYSBqb2luIGZvciB0aGUgZm91bmQgcmVsYXRpb25cbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBhbGlhcyArIFwiLlwiICsgcmVsYXRpb247XG4gICAgICAgICAgICBxYi5sZWZ0Sm9pbkFuZFNlbGVjdChzZWxlY3Rpb24sIHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGFkZGVkIHJlbGF0aW9ucyBmcm9tIHRoZSBhbGxSZWxhdGlvbnMgYXJyYXksIHRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgYWxsIG5vdCBmb3VuZCByZWxhdGlvbnMgYXQgdGhlIGVuZFxuICAgICAgICAgICAgYWxsUmVsYXRpb25zLnNwbGljZShhbGxSZWxhdGlvbnMuaW5kZXhPZihwcmVmaXggPyBwcmVmaXggKyBcIi5cIiArIHJlbGF0aW9uIDogcmVsYXRpb24pLCAxKTtcbiAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIHN1Yi1yZWxhdGlvbnNcbiAgICAgICAgICAgIHZhciBqb2luID0gcWIuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5maW5kKGZ1bmN0aW9uIChqb2luKSB7IHJldHVybiBqb2luLmVudGl0eU9yUHJvcGVydHkgPT09IHNlbGVjdGlvbjsgfSk7XG4gICAgICAgICAgICBfdGhpcy5hcHBseVJlbGF0aW9uc1JlY3Vyc2l2ZWx5KHFiLCBhbGxSZWxhdGlvbnMsIGpvaW4uYWxpYXMubmFtZSwgam9pbi5tZXRhZGF0YSwgcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyByZWxhdGlvbiA6IHJlbGF0aW9uKTtcbiAgICAgICAgICAgIC8vIGpvaW4gdGhlIGVhZ2VyIHJlbGF0aW9ucyBvZiB0aGUgZm91bmQgcmVsYXRpb25cbiAgICAgICAgICAgIHZhciByZWxNZXRhZGF0YSA9IG1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEucHJvcGVydHlOYW1lID09PSByZWxhdGlvbjsgfSk7XG4gICAgICAgICAgICBpZiAocmVsTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5qb2luRWFnZXJSZWxhdGlvbnMocWIsIHJlbGF0aW9uQWxpYXMsIHJlbE1ldGFkYXRhLmludmVyc2VFbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRmluZE9wdGlvbnNVdGlscy5qb2luRWFnZXJSZWxhdGlvbnMgPSBmdW5jdGlvbiAocWIsIGFsaWFzLCBtZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBtZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIGVfMiwgX2EsIGVfMywgX2I7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIHJlbGF0aW9uIGFsaWFzXG4gICAgICAgICAgICB2YXIgcmVsYXRpb25BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMocWIuY29ubmVjdGlvbi5kcml2ZXIsIHsgc2hvcnRlbjogdHJ1ZSB9LCBxYi5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmVhZ2VySm9pblJlbGF0aW9uQWxpYXMoYWxpYXMsIHJlbGF0aW9uLnByb3BlcnR5UGF0aCkpO1xuICAgICAgICAgICAgLy8gYWRkIGEgam9pbiBmb3IgdGhlIHJlbGF0aW9uXG4gICAgICAgICAgICAvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGlvbiB3YXNuJ3Qgam9pbmVkIHlldC5cbiAgICAgICAgICAgIHZhciBhZGRKb2luID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyhxYi5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgam9pbiA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoam9pbi5jb25kaXRpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5tYXBUb1Byb3BlcnR5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uaXNNYXBwaW5nTWFueSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luLmRpcmVjdGlvbiAhPT0gXCJMRUZUXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uZW50aXR5T3JQcm9wZXJ0eSAhPT0gYWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWRkSm9pbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkFsaWFzID0gam9pbi5hbGlhcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkSm9pbikge1xuICAgICAgICAgICAgICAgIHFiLmxlZnRKb2luKGFsaWFzICsgXCIuXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsIHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRpb24gd2Fzbid0IHNlbGVjdGVkIHlldC5cbiAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgc2hhbGwgYmUgYWZ0ZXIgdGhlIGpvaW4gY2hlY2sgdG8gZGV0ZWN0IHJlbGF0aW9uQWxpYXMuXG4gICAgICAgICAgICB2YXIgYWRkU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2UgPSBfX3ZhbHVlcyhxYi5leHByZXNzaW9uTWFwLnNlbGVjdHMpLCBfZiA9IF9lLm5leHQoKTsgIV9mLmRvbmU7IF9mID0gX2UubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3QgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdC5hbGlhc05hbWUgIT09IHVuZGVmaW5lZCB8fCBzZWxlY3QudmlydHVhbCAhPT0gdW5kZWZpbmVkIHx8IHNlbGVjdC5zZWxlY3Rpb24gIT09IHJlbGF0aW9uQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlbGVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8zXzEpIHsgZV8zID0geyBlcnJvcjogZV8zXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9mICYmICFfZi5kb25lICYmIChfYiA9IF9lLnJldHVybikpIF9iLmNhbGwoX2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkU2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgcWIuYWRkU2VsZWN0KHJlbGF0aW9uQWxpYXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gKHJlY3Vyc2l2ZSkgam9pbiB0aGUgZWFnZXIgcmVsYXRpb25zXG4gICAgICAgICAgICBfdGhpcy5qb2luRWFnZXJSZWxhdGlvbnMocWIsIHJlbGF0aW9uQWxpYXMsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbmRPcHRpb25zVXRpbHM7XG59KCkpO1xuZXhwb3J0IHsgRmluZE9wdGlvbnNVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaW5kT3B0aW9uc1V0aWxzLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Kb2luT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3JkZXJCeUNvbmRpdGlvbi5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IEFueShbLi4uXSkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gQW55KHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJhbnlcIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbnkuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBCZXR3ZWVuKHgsIHkpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcImJldHdlZW5cIiwgW2Zyb20sIHRvXSwgdHJ1ZSwgdHJ1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJldHdlZW4uanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBFcXVhbChcInZhbHVlXCIpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVxdWFsKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJlcXVhbFwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVxdWFsLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSUxpa2UoXCIlU09NRSBzdHJpbmclXCIpIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIElMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJpbGlrZVwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlMaWtlLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSW4oWy4uLl0pIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEluKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJpblwiLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogSXNOdWxsKCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsKCkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwiaXNOdWxsXCIsIHVuZGVmaW5lZCwgZmFsc2UpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jc051bGwuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBMZXNzVGhhbigxMCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gTGVzc1RoYW4odmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcImxlc3NUaGFuXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc1RoYW4uanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIEV4YW1wbGU6IHsgc29tZUZpZWxkOiBMZXNzVGhhbk9yRXF1YWwoMTApIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExlc3NUaGFuT3JFcXVhbCh2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwibGVzc1RoYW5PckVxdWFsXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGVzc1RoYW5PckVxdWFsLmpzLm1hcFxuIiwiaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL0ZpbmRPcGVyYXRvclwiO1xuLyoqXG4gKiBGaW5kIE9wdGlvbnMgT3BlcmF0b3IuXG4gKiBFeGFtcGxlOiB7IHNvbWVGaWVsZDogTGlrZShcIiVzb21lIHN0aW5nJVwiKSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJsaWtlXCIsIHZhbHVlKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGlrZS5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IE1vcmVUaGFuKDEwKSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNb3JlVGhhbih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwibW9yZVRoYW5cIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3JlVGhhbi5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbi8qKlxuICogRmluZCBPcHRpb25zIE9wZXJhdG9yLlxuICogRXhhbXBsZTogeyBzb21lRmllbGQ6IE1vcmVUaGFuT3JFcXVhbCgxMCkgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gTW9yZVRoYW5PckVxdWFsKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBGaW5kT3BlcmF0b3IoXCJtb3JlVGhhbk9yRXF1YWxcIiwgdmFsdWUpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3JlVGhhbk9yRXF1YWwuanMubWFwXG4iLCJpbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vRmluZE9wZXJhdG9yXCI7XG4vKipcbiAqIEZpbmQgT3B0aW9ucyBPcGVyYXRvci5cbiAqIFVzZWQgdG8gbmVnb3RpYXRlIGV4cHJlc3Npb24uXG4gKiBFeGFtcGxlOiB7IHRpdGxlOiBub3QoXCJoZWxsb1wiKSB9IHdpbGwgcmV0dXJuIGVudGl0aWVzIHdoZXJlIHRpdGxlIG5vdCBlcXVhbCB0byBcImhlbGxvXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOb3QodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcIm5vdFwiLCB2YWx1ZSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdC5qcy5tYXBcbiIsImltcG9ydCB7IEZpbmRPcGVyYXRvciB9IGZyb20gXCIuLi9GaW5kT3BlcmF0b3JcIjtcbmV4cG9ydCBmdW5jdGlvbiBSYXcodmFsdWVPclNxbEdlbmVyYXRvciwgc3FsR2VuZXJhdG9yUGFyYW1ldGVycykge1xuICAgIGlmICh0eXBlb2YgdmFsdWVPclNxbEdlbmVyYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IEZpbmRPcGVyYXRvcihcInJhd1wiLCB2YWx1ZU9yU3FsR2VuZXJhdG9yLCBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmluZE9wZXJhdG9yKFwicmF3XCIsIFtdLCB0cnVlLCB0cnVlLCB2YWx1ZU9yU3FsR2VuZXJhdG9yLCBzcWxHZW5lcmF0b3JQYXJhbWV0ZXJzKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmF3LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCIuL21ldGFkYXRhLWFyZ3MvTWV0YWRhdGFBcmdzU3RvcmFnZVwiO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuL3BsYXRmb3JtL1BsYXRmb3JtVG9vbHNcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25PcHRpb25zUmVhZGVyIH0gZnJvbSBcIi4vY29ubmVjdGlvbi9Db25uZWN0aW9uT3B0aW9uc1JlYWRlclwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi9jb25uZWN0aW9uL0Nvbm5lY3Rpb25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBnZXRGcm9tQ29udGFpbmVyIH0gZnJvbSBcIi4vY29udGFpbmVyXCI7XG4vKipcbiAqIEdldHMgbWV0YWRhdGEgYXJncyBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpIHtcbiAgICAvLyB3ZSBzaG91bGQgc3RvcmUgbWV0YWRhdGEgc3RvcmFnZSBpbiBhIGdsb2JhbCB2YXJpYWJsZSBvdGhlcndpc2UgaXQgYnJpbmdzIHRvbyBtdWNoIHByb2JsZW1zXG4gICAgLy8gb25lIG9mIHRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgYW55IGVudGl0eSAob3IgYW55IG90aGVyKSB3aWxsIGJlIGltcG9ydGVkIGJlZm9yZSBjb25zdW1lciB3aWxsIGNhbGxcbiAgICAvLyB1c2VDb250YWluZXIgbWV0aG9kIHdpdGggaGlzIG93biBjb250YWluZXIgaW1wbGVtZW50YXRpb24sIHRoYXQgZW50aXR5IHdpbGwgYmUgcmVnaXN0ZXJlZCBpbiB0aGVcbiAgICAvLyBvbGQgb2xkIGNvbnRhaW5lciAoZGVmYXVsdCBvbmUgcG9zdCBwcm9iYWJseSkgYW5kIGNvbnN1bWVyIHdpbGwgaGlzIGVudGl0eS5cbiAgICAvLyBjYWxsaW5nIHVzZUNvbnRhaW5lciBiZWZvcmUgaGUgaW1wb3J0cyBhbnkgZW50aXR5IChvciBhbnkgb3RoZXIpIGlzIG5vdCBhbHdheXMgY29udmVuaWVudC5cbiAgICAvLyBhbm90aGVyIHJlYXNvbiBpcyB0aGF0IHdoZW4gd2UgcnVuIG1pZ3JhdGlvbnMgdHlwZW9ybSBpcyBiZWluZyBjYWxsZWQgZnJvbSBhIGdsb2JhbCBwYWNrYWdlXG4gICAgLy8gYW5kIGl0IG1heSBsb2FkIGVudGl0aWVzIHdoaWNoIHJlZ2lzdGVyIGRlY29yYXRvcnMgaW4gdHlwZW9ybSBvZiBsb2NhbCBwYWNrYWdlXG4gICAgLy8gdGhpcyBsZWFkcyB0byBpbXBvc3NpYmlsaXR5IG9mIHVzYWdlIG9mIGVudGl0aWVzIGluIG1pZ3JhdGlvbnMgYW5kIGNsaSByZWxhdGVkIG9wZXJhdGlvbnNcbiAgICB2YXIgZ2xvYmFsU2NvcGUgPSBQbGF0Zm9ybVRvb2xzLmdldEdsb2JhbFZhcmlhYmxlKCk7XG4gICAgaWYgKCFnbG9iYWxTY29wZS50eXBlb3JtTWV0YWRhdGFBcmdzU3RvcmFnZSlcbiAgICAgICAgZ2xvYmFsU2NvcGUudHlwZW9ybU1ldGFkYXRhQXJnc1N0b3JhZ2UgPSBuZXcgTWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIHJldHVybiBnbG9iYWxTY29wZS50eXBlb3JtTWV0YWRhdGFBcmdzU3RvcmFnZTtcbn1cbi8qKlxuICogUmVhZHMgY29ubmVjdGlvbiBvcHRpb25zIHN0b3JlZCBpbiBvcm1jb25maWcgY29uZmlndXJhdGlvbiBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbk9wdGlvbnMoY29ubmVjdGlvbk5hbWUpIHtcbiAgICBpZiAoY29ubmVjdGlvbk5hbWUgPT09IHZvaWQgMCkgeyBjb25uZWN0aW9uTmFtZSA9IFwiZGVmYXVsdFwiOyB9XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IENvbm5lY3Rpb25PcHRpb25zUmVhZGVyKCkuZ2V0KGNvbm5lY3Rpb25OYW1lKV07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXRzIGEgQ29ubmVjdGlvbk1hbmFnZXIgd2hpY2ggY3JlYXRlcyBjb25uZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkge1xuICAgIHJldHVybiBnZXRGcm9tQ29udGFpbmVyKENvbm5lY3Rpb25NYW5hZ2VyKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1hbmFnZXIuXG4gKlxuICogSWYgY29ubmVjdGlvbiBvcHRpb25zIHdlcmUgbm90IHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIHRyeSB0byBjcmVhdGUgY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5LFxuICogYmFzZWQgb24gY29udGVudCBvZiBvcm1jb25maWcgKGpzb24vanMveW1sL3htbC9lbnYpIGZpbGUgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogT25seSBvbmUgY29ubmVjdGlvbiBmcm9tIG9ybWNvbmZpZyB3aWxsIGJlIGNyZWF0ZWQgKG5hbWUgXCJkZWZhdWx0XCIgb3IgY29ubmVjdGlvbiB3aXRob3V0IG5hbWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zT3JOYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbk5hbWUsIG9wdGlvbnMsIF9hO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSA9IHR5cGVvZiBvcHRpb25zT3JOYW1lID09PSBcInN0cmluZ1wiID8gb3B0aW9uc09yTmFtZSA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShvcHRpb25zT3JOYW1lIGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9uc09yTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCBnZXRDb25uZWN0aW9uT3B0aW9ucyhjb25uZWN0aW9uTmFtZSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkuY3JlYXRlKG9wdGlvbnMpLmNvbm5lY3QoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9ucyBhbmQgcmVnaXN0ZXJzIHRoZW0gaW4gdGhlIG1hbmFnZXIuXG4gKlxuICogSWYgY29ubmVjdGlvbiBvcHRpb25zIHdlcmUgbm90IHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIHRyeSB0byBjcmVhdGUgY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5LFxuICogYmFzZWQgb24gY29udGVudCBvZiBvcm1jb25maWcgKGpzb24vanMveW1sL3htbC9lbnYpIGZpbGUgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogQWxsIGNvbm5lY3Rpb25zIGZyb20gdGhlIG9ybWNvbmZpZyB3aWxsIGJlIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbnM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIoKS5hbGwoKV07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb25zKSB7IHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmNyZWF0ZShvcHRpb25zKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLmFsbChjb25uZWN0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHsgcmV0dXJuIGNvbm5lY3Rpb24uY29ubmVjdCgpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0cyBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gbWFuYWdlci5cbiAqIElmIGNvbm5lY3Rpb24gbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSk7XG59XG4vKipcbiAqIEdldHMgZW50aXR5IG1hbmFnZXIgZnJvbSB0aGUgY29ubmVjdGlvbi5cbiAqIElmIGNvbm5lY3Rpb24gbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYW5hZ2VyKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkubWFuYWdlcjtcbn1cbi8qKlxuICogR2V0cyBNb25nb0RCIGVudGl0eSBtYW5hZ2VyIGZyb20gdGhlIGNvbm5lY3Rpb24uXG4gKiBJZiBjb25uZWN0aW9uIG5hbWUgd2Fzbid0IHNwZWNpZmllZCwgdGhlbiBcImRlZmF1bHRcIiBjb25uZWN0aW9uIHdpbGwgYmUgcmV0cmlldmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9uZ29NYW5hZ2VyKGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkubWFuYWdlcjtcbn1cbi8qKlxuICogR2V0cyBTcWxqcyBlbnRpdHkgbWFuYWdlciBmcm9tIGNvbm5lY3Rpb24gbmFtZS5cbiAqIFwiZGVmYXVsdFwiIGNvbm5lY3Rpb24gaXMgdXNlZCwgd2hlbiBubyBuYW1lIGlzIHNwZWNpZmllZC5cbiAqIE9ubHkgd29ya3Mgd2hlbiBTcWxqcyBkcml2ZXIgaXMgdXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNxbGpzTWFuYWdlcihjb25uZWN0aW9uTmFtZSkge1xuICAgIGlmIChjb25uZWN0aW9uTmFtZSA9PT0gdm9pZCAwKSB7IGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICByZXR1cm4gZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXQoY29ubmVjdGlvbk5hbWUpLm1hbmFnZXI7XG59XG4vKipcbiAqIEdldHMgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcG9zaXRvcnkoZW50aXR5Q2xhc3MsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkuZ2V0UmVwb3NpdG9yeShlbnRpdHlDbGFzcyk7XG59XG4vKipcbiAqIEdldHMgdHJlZSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5Q2xhc3MsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldChjb25uZWN0aW9uTmFtZSkuZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5Q2xhc3MpO1xufVxuLyoqXG4gKiBHZXRzIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1c3RvbVJlcG9zaXRvcnkoY3VzdG9tUmVwb3NpdG9yeSwgY29ubmVjdGlvbk5hbWUpIHtcbiAgICBpZiAoY29ubmVjdGlvbk5hbWUgPT09IHZvaWQgMCkgeyBjb25uZWN0aW9uTmFtZSA9IFwiZGVmYXVsdFwiOyB9XG4gICAgcmV0dXJuIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0KGNvbm5lY3Rpb25OYW1lKS5nZXRDdXN0b21SZXBvc2l0b3J5KGN1c3RvbVJlcG9zaXRvcnkpO1xufVxuLyoqXG4gKiBHZXRzIG1vbmdvZGIgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcyBvciBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9uZ29SZXBvc2l0b3J5KGVudGl0eUNsYXNzLCBjb25uZWN0aW9uTmFtZSkge1xuICAgIGlmIChjb25uZWN0aW9uTmFtZSA9PT0gdm9pZCAwKSB7IGNvbm5lY3Rpb25OYW1lID0gXCJkZWZhdWx0XCI7IH1cbiAgICByZXR1cm4gZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXQoY29ubmVjdGlvbk5hbWUpLmdldE1vbmdvUmVwb3NpdG9yeShlbnRpdHlDbGFzcyk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5QnVpbGRlcihlbnRpdHlDbGFzcywgYWxpYXMsIGNvbm5lY3Rpb25OYW1lKSB7XG4gICAgaWYgKGNvbm5lY3Rpb25OYW1lID09PSB2b2lkIDApIHsgY29ubmVjdGlvbk5hbWUgPSBcImRlZmF1bHRcIjsgfVxuICAgIGlmIChlbnRpdHlDbGFzcykge1xuICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeShlbnRpdHlDbGFzcywgY29ubmVjdGlvbk5hbWUpLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25OYW1lKS5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFscy5qcy5tYXBcbiIsIi8qIVxuICovXG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb21tb25seSBVc2VkIGV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCAqIGZyb20gXCIuL2dsb2JhbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uL0VudGl0eVRhcmdldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uL09iamVjdFR5cGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbW1vbi9PYmplY3RMaXRlcmFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21tb24vRGVlcFBhcnRpYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvY29sdW1ucy9Db2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL0NyZWF0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL0RlbGV0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ByaW1hcnlDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1VwZGF0ZURhdGVDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ZlcnNpb25Db2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL1ZpZXdDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9jb2x1bW5zL09iamVjdElkQ29sdW1uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVySW5zZXJ0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0FmdGVyTG9hZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9BZnRlclJlbW92ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9BZnRlclVwZGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9CZWZvcmVJbnNlcnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9saXN0ZW5lcnMvQmVmb3JlUmVtb3ZlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvbGlzdGVuZXJzL0JlZm9yZVVwZGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2xpc3RlbmVycy9FdmVudFN1YnNjcmliZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0luZGV4T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvSm9pbkNvbHVtbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL0pvaW5UYWJsZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9vcHRpb25zL1JlbGF0aW9uT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvRW50aXR5T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL29wdGlvbnMvVmFsdWVUcmFuc2Zvcm1lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9Kb2luQ29sdW1uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvcmVsYXRpb25zL0pvaW5UYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9NYW55VG9NYW55XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvcmVsYXRpb25zL01hbnlUb09uZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9PbmVUb01hbnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9yZWxhdGlvbnMvT25lVG9PbmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9yZWxhdGlvbnMvUmVsYXRpb25Db3VudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3JlbGF0aW9ucy9SZWxhdGlvbklkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvZW50aXR5L0VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2VudGl0eS9DaGlsZEVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL2VudGl0eS9UYWJsZUluaGVyaXRhbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvZW50aXR5LXZpZXcvVmlld0VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25NYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvdHJlZS9UcmVlTGV2ZWxDb2x1bW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci90cmVlL1RyZWVQYXJlbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci90cmVlL1RyZWVDaGlsZHJlblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL3RyZWUvVHJlZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yL0luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvVW5pcXVlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3IvQ2hlY2tcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9FeGNsdXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9HZW5lcmF0ZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvci9FbnRpdHlSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQW55XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvQmV0d2VlblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0VxdWFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvSW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9Jc051bGxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9MZXNzVGhhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0xlc3NUaGFuT3JFcXVhbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL0lMaWtlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTGlrZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL29wZXJhdG9yL01vcmVUaGFuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTW9yZVRoYW5PckVxdWFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvTm90XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvb3BlcmF0b3IvUmF3XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maW5kLW9wdGlvbnMvRmluZENvbmRpdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kTWFueU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kT25lT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclR5cGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9Kb2luT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnZXIvTG9nZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnZXIvTG9nZ2VyT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2VyL0FkdmFuY2VkQ29uc29sZUxvZ2dlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2VyL1NpbXBsZUNvbnNvbGVMb2dnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dlci9GaWxlTG9nZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5LW1hbmFnZXIvRW50aXR5TWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9CYXNlRW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L1RyZWVSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L01vbmdvUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeS9SZW1vdmVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5L1NhdmVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNoZWNrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUNvbHVtblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVFeGNsdXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlRm9yZWlnbktleVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVJbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVVbmlxdWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ2hlY2tPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1RhYmxlQ29sdW1uT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUV4Y2x1c2lvbk9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVGb3JlaWduS2V5T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUluZGV4T3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZU9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NjaGVtYS1idWlsZGVyL29wdGlvbnMvVGFibGVVbmlxdWVPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWEtYnVpbGRlci9vcHRpb25zL1ZpZXdPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvbW9uZ29kYi90eXBpbmdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvdHlwZXMvRGF0YWJhc2VUeXBlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvdHlwZXMvUmVwbGljYXRpb25Nb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kcml2ZXIvc3Fsc2VydmVyL01zc3FsUGFyYW1ldGVyXCI7XG5leHBvcnQgeyBDb25uZWN0aW9uT3B0aW9uc1JlYWRlciB9IGZyb20gXCIuL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXJcIjtcbmV4cG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9jb25uZWN0aW9uL0Nvbm5lY3Rpb25cIjtcbmV4cG9ydCB7IENvbm5lY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4vY29ubmVjdGlvbi9Db25uZWN0aW9uTWFuYWdlclwiO1xuZXhwb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9RdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvU2VsZWN0UXVlcnlCdWlsZGVyXCI7XG5leHBvcnQgeyBEZWxldGVRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyL0RlbGV0ZVF1ZXJ5QnVpbGRlclwiO1xuZXhwb3J0IHsgSW5zZXJ0UXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9JbnNlcnRRdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvVXBkYXRlUXVlcnlCdWlsZGVyXCI7XG5leHBvcnQgeyBSZWxhdGlvblF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvUmVsYXRpb25RdWVyeUJ1aWxkZXJcIjtcbmV4cG9ydCB7IEJyYWNrZXRzIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9CcmFja2V0c1wiO1xuZXhwb3J0IHsgSW5zZXJ0UmVzdWx0IH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci9yZXN1bHQvSW5zZXJ0UmVzdWx0XCI7XG5leHBvcnQgeyBVcGRhdGVSZXN1bHQgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyL3Jlc3VsdC9VcGRhdGVSZXN1bHRcIjtcbmV4cG9ydCB7IERlbGV0ZVJlc3VsdCB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvcmVzdWx0L0RlbGV0ZVJlc3VsdFwiO1xuZXhwb3J0IHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi9xdWVyeS1ydW5uZXIvUXVlcnlSZXN1bHRcIjtcbmV4cG9ydCB7IE1vbmdvRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyL01vbmdvRW50aXR5TWFuYWdlclwiO1xuZXhwb3J0IHsgTWlncmF0aW9uIH0gZnJvbSBcIi4vbWlncmF0aW9uL01pZ3JhdGlvblwiO1xuZXhwb3J0IHsgTWlncmF0aW9uRXhlY3V0b3IgfSBmcm9tIFwiLi9taWdyYXRpb24vTWlncmF0aW9uRXhlY3V0b3JcIjtcbmV4cG9ydCB7IERlZmF1bHROYW1pbmdTdHJhdGVneSB9IGZyb20gXCIuL25hbWluZy1zdHJhdGVneS9EZWZhdWx0TmFtaW5nU3RyYXRlZ3lcIjtcbmV4cG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgUGxhdGZvcm1Ub29scyB9IGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xzXCI7XG4vKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciB1c2VzIGNvbnNvbGUgdG8gbG9nIGV2ZW50cyBhbmQgdXNlIHN5bnRheCBoaWdobGlnaHRpbmcuXG4gKi9cbnZhciBBZHZhbmNlZENvbnNvbGVMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEFkdmFuY2VkQ29uc29sZUxvZ2dlcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gaXQuXG4gICAgICovXG4gICAgQWR2YW5jZWRDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcInF1ZXJ5XCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dJbmZvKFwicXVlcnk6XCIsIFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHNxbCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IHRoYXQgaXMgZmFpbGVkLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgcXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IFwiYWxsXCIgfHwgdGhpcy5vcHRpb25zID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJlcnJvclwiKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgICAgIFBsYXRmb3JtVG9vbHMubG9nRXJyb3IoXCJxdWVyeSBmYWlsZWQ6XCIsIFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHNxbCkpO1xuICAgICAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dFcnJvcihcImVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlTbG93ID0gZnVuY3Rpb24gKHRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgUGxhdGZvcm1Ub29scy5sb2dXYXJuKFwicXVlcnkgaXMgc2xvdzpcIiwgUGxhdGZvcm1Ub29scy5oaWdobGlnaHRTcWwoc3FsKSk7XG4gICAgICAgIFBsYXRmb3JtVG9vbHMubG9nV2FybihcImV4ZWN1dGlvbiB0aW1lOlwiLCB0aW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIHNjaGVtYSBidWlsZCBwcm9jZXNzLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nU2NoZW1hQnVpbGQgPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwic2NoZW1hXCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIFBsYXRmb3JtVG9vbHMubG9nKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBtaWdyYXRpb24gcnVuIHByb2Nlc3MuXG4gICAgICovXG4gICAgQWR2YW5jZWRDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dNaWdyYXRpb24gPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgUGxhdGZvcm1Ub29scy5sb2cobWVzc2FnZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGxvZ2dpbmcgdXNpbmcgZ2l2ZW4gbG9nZ2VyLCBvciBieSBkZWZhdWx0IHRvIHRoZSBjb25zb2xlLlxuICAgICAqIExvZyBoYXMgaXRzIG93biBsZXZlbCBhbmQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBBZHZhbmNlZENvbnNvbGVMb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChsZXZlbCwgbWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICAgICAgY2FzZSBcImxvZ1wiOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgPT09IFwiYWxsXCIgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcImxvZ1wiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwiaW5mb1wiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVRvb2xzLmxvZ0luZm8oXCJJTkZPOlwiLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwid2FyblwiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oUGxhdGZvcm1Ub29scy53YXJuKG1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHBhcmFtZXRlcnMgdG8gYSBzdHJpbmcuXG4gICAgICogU29tZXRpbWVzIHBhcmFtZXRlcnMgY2FuIGhhdmUgY2lyY3VsYXIgb2JqZWN0cyBhbmQgdGhlcmVmb3Igd2UgYXJlIGhhbmRsZSB0aGlzIGNhc2UgdG9vLlxuICAgICAqL1xuICAgIEFkdmFuY2VkQ29uc29sZUxvZ2dlci5wcm90b3R5cGUuc3RyaW5naWZ5UGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgLy8gbW9zdCBwcm9iYWJseSBjaXJjdWxhciBvYmplY3RzIGluIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQWR2YW5jZWRDb25zb2xlTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IEFkdmFuY2VkQ29uc29sZUxvZ2dlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZHZhbmNlZENvbnNvbGVMb2dnZXIuanMubWFwXG4iLCJpbXBvcnQgZGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBQbGF0Zm9ybVRvb2xzIH0gZnJvbSBcIi4uL3BsYXRmb3JtL1BsYXRmb3JtVG9vbHNcIjtcbi8qKlxuICogUGVyZm9ybXMgbG9nZ2luZyBvZiB0aGUgZXZlbnRzIGluIFR5cGVPUk0gdmlhIGRlYnVnIGxpYnJhcnkuXG4gKi9cbnZhciBEZWJ1Z0xvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWJ1Z0xvZ2dlcigpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5TG9nID0gZGVidWcoXCJ0eXBlb3JtOnF1ZXJ5OmxvZ1wiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5RXJyb3IgPSBkZWJ1ZyhcInR5cGVvcm06cXVlcnk6ZXJyb3JcIik7XG4gICAgICAgIHRoaXMuZGVidWdRdWVyeVNsb3cgPSBkZWJ1ZyhcInR5cGVvcm06cXVlcnk6c2xvd1wiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z1NjaGVtYUJ1aWxkID0gZGVidWcoXCJ0eXBlb3JtOnNjaGVtYVwiKTtcbiAgICAgICAgdGhpcy5kZWJ1Z01pZ3JhdGlvbiA9IGRlYnVnKFwidHlwZW9ybTptaWdyYXRpb25cIik7XG4gICAgICAgIHRoaXMuZGVidWdMb2cgPSBkZWJ1ZyhcInR5cGVvcm06bG9nXCIpO1xuICAgICAgICB0aGlzLmRlYnVnSW5mbyA9IGRlYnVnKFwidHlwZW9ybTppbmZvXCIpO1xuICAgICAgICB0aGlzLmRlYnVnV2FybiA9IGRlYnVnKFwidHlwZW9ybTp3YXJuXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gaXQuXG4gICAgICovXG4gICAgRGVidWdMb2dnZXIucHJvdG90eXBlLmxvZ1F1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z1F1ZXJ5TG9nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUxvZyhQbGF0Zm9ybVRvb2xzLmhpZ2hsaWdodFNxbChxdWVyeSkgKyBcIjtcIik7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUxvZyhcInBhcmFtZXRlcnM6XCIsIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIHF1ZXJ5IHRoYXQgZmFpbGVkLlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdRdWVyeUVycm9yLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUVycm9yKFBsYXRmb3JtVG9vbHMuaGlnaGxpZ2h0U3FsKHF1ZXJ5KSArIFwiO1wiKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z1F1ZXJ5RXJyb3IoXCJwYXJhbWV0ZXJzOlwiLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeUVycm9yKFwiZXJyb3I6IFwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeVNsb3cgPSBmdW5jdGlvbiAodGltZSwgcXVlcnksIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnUXVlcnlTbG93LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdRdWVyeVNsb3coUGxhdGZvcm1Ub29scy5oaWdobGlnaHRTcWwocXVlcnkpICsgXCI7XCIpO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgJiYgcGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnUXVlcnlTbG93KFwicGFyYW1ldGVyczpcIiwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlYnVnUXVlcnlTbG93KFwiZXhlY3V0aW9uIHRpbWU6XCIsIHRpbWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBzY2hlbWEgYnVpbGQgcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEZWJ1Z0xvZ2dlci5wcm90b3R5cGUubG9nU2NoZW1hQnVpbGQgPSBmdW5jdGlvbiAobWVzc2FnZSwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdTY2hlbWFCdWlsZC5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnU2NoZW1hQnVpbGQobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIG1pZ3JhdGlvbiBydW4gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEZWJ1Z0xvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnTWlncmF0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdNaWdyYXRpb24obWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gbG9nZ2luZyB1c2luZyBnaXZlbiBsb2dnZXIuXG4gICAgICogTG9nIGhhcyBpdHMgb3duIGxldmVsIGFuZCBtZXNzYWdlLlxuICAgICAqL1xuICAgIERlYnVnTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAobGV2ZWwsIG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgIGNhc2UgXCJsb2dcIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0xvZy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2cobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0luZm8uZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnSW5mbyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwid2FyblwiOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnV2Fybi5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWdXYXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERlYnVnTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IERlYnVnTG9nZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlYnVnTG9nZ2VyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dnZXIuanMubWFwXG4iLCJpbXBvcnQgeyBTaW1wbGVDb25zb2xlTG9nZ2VyIH0gZnJvbSBcIi4vU2ltcGxlQ29uc29sZUxvZ2dlclwiO1xuaW1wb3J0IHsgQWR2YW5jZWRDb25zb2xlTG9nZ2VyIH0gZnJvbSBcIi4vQWR2YW5jZWRDb25zb2xlTG9nZ2VyXCI7XG5pbXBvcnQgeyBGaWxlTG9nZ2VyIH0gZnJvbSBcIi4vRmlsZUxvZ2dlclwiO1xuaW1wb3J0IHsgRGVidWdMb2dnZXIgfSBmcm9tIFwiLi9EZWJ1Z0xvZ2dlclwiO1xuLyoqXG4gKiBIZWxwcyB0byBjcmVhdGUgbG9nZ2VyIGluc3RhbmNlcy5cbiAqL1xudmFyIExvZ2dlckZhY3RvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9nZ2VyRmFjdG9yeSgpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2dnZXIgZGVwZW5kIG9uIGEgZ2l2ZW4gY29ubmVjdGlvbidzIGRyaXZlci5cbiAgICAgKi9cbiAgICBMb2dnZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAobG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChsb2dnZXIgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyO1xuICAgICAgICBpZiAobG9nZ2VyKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGxvZ2dlcikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzaW1wbGUtY29uc29sZVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnNvbGVMb2dnZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhZHZhbmNlZC1jb25zb2xlXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWR2YW5jZWRDb25zb2xlTG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWJ1Z1wiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlYnVnTG9nZ2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZHZhbmNlZENvbnNvbGVMb2dnZXIob3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gTG9nZ2VyRmFjdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBMb2dnZXJGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2dlckZhY3RvcnkuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ2dlck9wdGlvbnMuanMubWFwXG4iLCIvKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciB1c2VzIGNvbnNvbGUgdG8gbG9nIGV2ZW50cyBhbmQgZG9lcyBub3QgdXNlIHN5bnRheCBoaWdobGlnaHRpbmcuXG4gKi9cbnZhciBTaW1wbGVDb25zb2xlTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBTaW1wbGVDb25zb2xlTG9nZ2VyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcInF1ZXJ5XCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeVwiICsgXCI6IFwiICsgc3FsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBxdWVyeSB0aGF0IGlzIGZhaWxlZC5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBxdWVyeSwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCB0aGlzLm9wdGlvbnMgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSAmJiB0aGlzLm9wdGlvbnMuaW5kZXhPZihcImVycm9yXCIpICE9PSAtMSkpIHtcbiAgICAgICAgICAgIHZhciBzcWwgPSBxdWVyeSArIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID8gXCIgLS0gUEFSQU1FVEVSUzogXCIgKyB0aGlzLnN0cmluZ2lmeVBhcmFtcyhwYXJhbWV0ZXJzKSA6IFwiXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeSBmYWlsZWQ6IFwiICsgc3FsKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBxdWVyeSB0aGF0IGlzIHNsb3cuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnlTbG93ID0gZnVuY3Rpb24gKHRpbWUsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB2YXIgc3FsID0gcXVlcnkgKyAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA/IFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgdGhpcy5zdHJpbmdpZnlQYXJhbXMocGFyYW1ldGVycykgOiBcIlwiKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJxdWVyeSBpcyBzbG93OiBcIiArIHNxbCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXhlY3V0aW9uIHRpbWU6IFwiICsgdGltZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dzIGV2ZW50cyBmcm9tIHRoZSBzY2hlbWEgYnVpbGQgcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5sb2dTY2hlbWFCdWlsZCA9IGZ1bmN0aW9uIChtZXNzYWdlLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zID09PSBcImFsbFwiIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJzY2hlbWFcIikgIT09IC0xKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIG1pZ3JhdGlvbnMgcnVuIHByb2Nlc3MuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBsb2dnaW5nIHVzaW5nIGdpdmVuIGxvZ2dlciwgb3IgYnkgZGVmYXVsdCB0byB0aGUgY29uc29sZS5cbiAgICAgKiBMb2cgaGFzIGl0cyBvd24gbGV2ZWwgYW5kIG1lc3NhZ2UuXG4gICAgICovXG4gICAgU2ltcGxlQ29uc29sZUxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGxldmVsLCBtZXNzYWdlLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlIFwibG9nXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwibG9nXCIpICE9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zID09PSBcImFsbFwiIHx8IChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykgJiYgdGhpcy5vcHRpb25zLmluZGV4T2YoXCJpbmZvXCIpICE9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gXCJhbGxcIiB8fCAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMpICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwid2FyblwiKSAhPT0gLTEpKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBwYXJhbWV0ZXJzIHRvIGEgc3RyaW5nLlxuICAgICAqIFNvbWV0aW1lcyBwYXJhbWV0ZXJzIGNhbiBoYXZlIGNpcmN1bGFyIG9iamVjdHMgYW5kIHRoZXJlZm9yIHdlIGFyZSBoYW5kbGUgdGhpcyBjYXNlIHRvby5cbiAgICAgKi9cbiAgICBTaW1wbGVDb25zb2xlTG9nZ2VyLnByb3RvdHlwZS5zdHJpbmdpZnlQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyAvLyBtb3N0IHByb2JhYmx5IGNpcmN1bGFyIG9iamVjdHMgaW4gcGFyYW1ldGVyc1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTaW1wbGVDb25zb2xlTG9nZ2VyO1xufSgpKTtcbmV4cG9ydCB7IFNpbXBsZUNvbnNvbGVMb2dnZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2ltcGxlQ29uc29sZUxvZ2dlci5qcy5tYXBcbiIsImltcG9ydCB7IE1ldGFkYXRhVXRpbHMgfSBmcm9tIFwiLi4vbWV0YWRhdGEtYnVpbGRlci9NZXRhZGF0YVV0aWxzXCI7XG4vKipcbiAqIFN0b3JhZ2UgYWxsIG1ldGFkYXRhcyBhcmdzIG9mIGFsbCBhdmFpbGFibGUgdHlwZXM6IHRhYmxlcywgY29sdW1ucywgc3Vic2NyaWJlcnMsIHJlbGF0aW9ucywgZXRjLlxuICogRWFjaCBtZXRhZGF0YSBhcmdzIHJlcHJlc2VudHMgc29tZSBzcGVjaWZpY2F0aW9ucyBvZiB3aGF0IGl0IHJlcHJlc2VudHMuXG4gKiBNZXRhZGF0YUFyZ3MgdXNlZCB0byBjcmVhdGUgYSByZWFsIE1ldGFkYXRhIG9iamVjdHMuXG4gKi9cbnZhciBNZXRhZGF0YUFyZ3NTdG9yYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1ldGFkYXRhQXJnc1N0b3JhZ2UoKSB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMudGFibGVzID0gW107XG4gICAgICAgIHRoaXMudHJlZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlSZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzID0gW107XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25SZXBvc2l0b3JpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1pbmdTdHJhdGVnaWVzID0gW107XG4gICAgICAgIHRoaXMuZW50aXR5U3Vic2NyaWJlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRpY2VzID0gW107XG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoZWNrcyA9IFtdO1xuICAgICAgICB0aGlzLmV4Y2x1c2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICB0aGlzLmpvaW5UYWJsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICB0aGlzLnJlbGF0aW9uSWRzID0gW107XG4gICAgICAgIHRoaXMuZW1iZWRkZWRzID0gW107XG4gICAgICAgIHRoaXMuaW5oZXJpdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuZGlzY3JpbWluYXRvclZhbHVlcyA9IFtdO1xuICAgIH1cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUYWJsZXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0KHRoaXMudGFibGVzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQ29sdW1ucyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyh0aGlzLmNvbHVtbnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kR2VuZXJhdGVkID0gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRpb25zLmZpbmQoZnVuY3Rpb24gKGdlbmVyYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihnZW5lcmF0ZWQudGFyZ2V0KSAhPT0gLTEgOiBnZW5lcmF0ZWQudGFyZ2V0ID09PSB0YXJnZXQpICYmIGdlbmVyYXRlZC5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kVHJlZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZXMuZmluZChmdW5jdGlvbiAodHJlZSkge1xuICAgICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZih0cmVlLnRhcmdldCkgIT09IC0xIDogdHJlZS50YXJnZXQgPT09IHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyUmVsYXRpb25zID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVSZWxhdGlvblByb3BlcnRpZXModGhpcy5yZWxhdGlvbnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJSZWxhdGlvbklkcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyh0aGlzLnJlbGF0aW9uSWRzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyUmVsYXRpb25Db3VudHMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0QW5kV2l0aG91dER1cGxpY2F0ZVByb3BlcnRpZXModGhpcy5yZWxhdGlvbkNvdW50cywgdGFyZ2V0KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckluZGljZXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIC8vIHRvZG86IGltcGxlbWVudCBwYXJlbnQtZW50aXR5IG92ZXJyaWRlcz9cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlcy5maWx0ZXIoZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0LmluZGV4T2YoaW5kZXgudGFyZ2V0KSAhPT0gLTEgOiBpbmRleC50YXJnZXQgPT09IHRhcmdldDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJVbmlxdWVzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodW5pcXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0LmluZGV4T2YodW5pcXVlLnRhcmdldCkgIT09IC0xIDogdW5pcXVlLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckNoZWNrcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tzLmZpbHRlcihmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihjaGVjay50YXJnZXQpICE9PSAtMSA6IGNoZWNrLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckV4Y2x1c2lvbnMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1c2lvbnMuZmlsdGVyKGZ1bmN0aW9uIChleGNsdXNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihleGNsdXNpb24udGFyZ2V0KSAhPT0gLTEgOiBleGNsdXNpb24udGFyZ2V0ID09PSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyTGlzdGVuZXJzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldCh0aGlzLmVudGl0eUxpc3RlbmVycywgdGFyZ2V0KTtcbiAgICB9O1xuICAgIE1ldGFkYXRhQXJnc1N0b3JhZ2UucHJvdG90eXBlLmZpbHRlckVtYmVkZGVkcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlRW1iZWRkZWRQcm9wZXJ0aWVzKHRoaXMuZW1iZWRkZWRzLCB0YXJnZXQpO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmluZEpvaW5UYWJsZSA9IGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luVGFibGVzLmZpbmQoZnVuY3Rpb24gKGpvaW5UYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGpvaW5UYWJsZS50YXJnZXQgPT09IHRhcmdldCAmJiBqb2luVGFibGUucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVySm9pbkNvbHVtbnMgPSBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgLy8gdG9kbzogaW1wbGVtZW50IHBhcmVudC1lbnRpdHkgb3ZlcnJpZGVzP1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQ29sdW1uLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGpvaW5Db2x1bW4ucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyU3Vic2NyaWJlcnMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlckJ5VGFyZ2V0KHRoaXMuZW50aXR5U3Vic2NyaWJlcnMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJOYW1pbmdTdHJhdGVnaWVzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJCeVRhcmdldCh0aGlzLm5hbWluZ1N0cmF0ZWdpZXMsIHRhcmdldCk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUcmFuc2FjdGlvbkVudGl0eU1hbmFnZXJzID0gZnVuY3Rpb24gKHRhcmdldCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRW50aXR5TWFuYWdlcnMuZmlsdGVyKGZ1bmN0aW9uICh0cmFuc2FjdGlvbkVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRyYW5zYWN0aW9uRW0udGFyZ2V0KSAhPT0gLTEgOiB0cmFuc2FjdGlvbkVtLnRhcmdldCA9PT0gdGFyZ2V0KSAmJiB0cmFuc2FjdGlvbkVtLm1ldGhvZE5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJUcmFuc2FjdGlvblJlcG9zaXRvcnkgPSBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25SZXBvc2l0b3JpZXMuZmlsdGVyKGZ1bmN0aW9uICh0cmFuc2FjdGlvbkVtKSB7XG4gICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRyYW5zYWN0aW9uRW0udGFyZ2V0KSAhPT0gLTEgOiB0cmFuc2FjdGlvbkVtLnRhcmdldCA9PT0gdGFyZ2V0KSAmJiB0cmFuc2FjdGlvbkVtLm1ldGhvZE5hbWUgPT09IHByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJTaW5nbGVUYWJsZUNoaWxkcmVuID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZXMuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgJiYgdGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAmJiBNZXRhZGF0YVV0aWxzLmlzSW5oZXJpdGVkKHRhYmxlLnRhcmdldCwgdGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIHRhYmxlLnR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmluZEluaGVyaXRhbmNlVHlwZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VzLmZpbmQoZnVuY3Rpb24gKGluaGVyaXRhbmNlKSB7IHJldHVybiBpbmhlcml0YW5jZS50YXJnZXQgPT09IHRhcmdldDsgfSk7XG4gICAgfTtcbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maW5kRGlzY3JpbWluYXRvclZhbHVlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVzLmZpbmQoZnVuY3Rpb24gKGRpc2NyaW1pbmF0b3JWYWx1ZSkgeyByZXR1cm4gZGlzY3JpbWluYXRvclZhbHVlLnRhcmdldCA9PT0gdGFyZ2V0OyB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMuXG4gICAgICovXG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQnlUYXJnZXQgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKHRhYmxlLnRhcmdldCkgIT09IC0xIDogdGFibGUudGFyZ2V0ID09PSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmlsdGVycyBnaXZlbiBhcnJheSBieSBhIGdpdmVuIHRhcmdldCBvciB0YXJnZXRzIGFuZCBwcmV2ZW50cyBkdXBsaWNhdGUgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgTWV0YWRhdGFBcmdzU3RvcmFnZS5wcm90b3R5cGUuZmlsdGVyQnlUYXJnZXRBbmRXaXRob3V0RHVwbGljYXRlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChhcnJheSwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBuZXdBcnJheSA9IFtdO1xuICAgICAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICB2YXIgc2FtZVRhcmdldCA9IEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5pbmRleE9mKGl0ZW0udGFyZ2V0KSAhPT0gLTEgOiBpdGVtLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKHNhbWVUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5ld0FycmF5LmZpbmQoZnVuY3Rpb24gKG5ld0l0ZW0pIHsgcmV0dXJuIG5ld0l0ZW0ucHJvcGVydHlOYW1lID09PSBpdGVtLnByb3BlcnR5TmFtZTsgfSkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMgYW5kIHByZXZlbnRzIGR1cGxpY2F0ZSByZWxhdGlvbiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVSZWxhdGlvblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICB2YXIgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgdmFyIHNhbWVUYXJnZXQgPSB0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSA/IHRhcmdldC5pbmRleE9mKGl0ZW0udGFyZ2V0KSAhPT0gLTEgOiBpdGVtLnRhcmdldCA9PT0gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKHNhbWVUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IG5ld0FycmF5LmZpbmRJbmRleChmdW5jdGlvbiAobmV3SXRlbSkgeyByZXR1cm4gbmV3SXRlbS5wcm9wZXJ0eU5hbWUgPT09IGl0ZW0ucHJvcGVydHlOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXJyYXkgJiYgZXhpc3RpbmdJbmRleCAhPT0gLTEgJiYgdGFyZ2V0LmluZGV4T2YoaXRlbS50YXJnZXQpIDwgdGFyZ2V0LmluZGV4T2YobmV3QXJyYXlbZXhpc3RpbmdJbmRleF0udGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKG5ld0FycmF5W2V4aXN0aW5nSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUudHlwZSA9IGl0ZW0udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXlbZXhpc3RpbmdJbmRleF0gPSBjbG9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhpc3RpbmdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGdpdmVuIGFycmF5IGJ5IGEgZ2l2ZW4gdGFyZ2V0IG9yIHRhcmdldHMgYW5kIHByZXZlbnRzIGR1cGxpY2F0ZSBlbWJlZGRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBNZXRhZGF0YUFyZ3NTdG9yYWdlLnByb3RvdHlwZS5maWx0ZXJCeVRhcmdldEFuZFdpdGhvdXREdXBsaWNhdGVFbWJlZGRlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoYXJyYXksIHRhcmdldCkge1xuICAgICAgICB2YXIgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgdmFyIHNhbWVUYXJnZXQgPSBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQuaW5kZXhPZihpdGVtLnRhcmdldCkgIT09IC0xIDogaXRlbS50YXJnZXQgPT09IHRhcmdldDtcbiAgICAgICAgICAgIGlmIChzYW1lVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRHVwbGljYXRlRW1iZWRkZWRQcm9wZXJ0eSA9IG5ld0FycmF5LmZpbmQoZnVuY3Rpb24gKG5ld0l0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW0ucHJlZml4ID09PSBpdGVtLnByZWZpeCAmJiBuZXdJdGVtLnByb3BlcnR5TmFtZSA9PT0gaXRlbS5wcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZUVtYmVkZGVkUHJvcGVydHkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfTtcbiAgICByZXR1cm4gTWV0YWRhdGFBcmdzU3RvcmFnZTtcbn0oKSk7XG5leHBvcnQgeyBNZXRhZGF0YUFyZ3NTdG9yYWdlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1ldGFkYXRhQXJnc1N0b3JhZ2UuanMubWFwXG4iLCJpbXBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9Gb3JlaWduS2V5TWV0YWRhdGFcIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvSW5kZXhNZXRhZGF0YVwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG4vKipcbiAqIENyZWF0ZXMgRW50aXR5TWV0YWRhdGEgZm9yIGp1bmN0aW9uIHRhYmxlcyBvZiB0aGUgY2xvc3VyZSBlbnRpdGllcy5cbiAqIENsb3N1cmUganVuY3Rpb24gdGFibGVzIGFyZSB0YWJsZXMgZ2VuZXJhdGVkIGJ5IGNsb3N1cmUgZW50aXRpZXMuXG4gKi9cbnZhciBDbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgRW50aXR5TWV0YWRhdGEgZm9yIHRoZSBjbG9zdXJlIGp1bmN0aW9uIG9mIHRoZSBnaXZlbiBjbG9zdXJlIGVudGl0eS5cbiAgICAgKi9cbiAgICBDbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBjcmVhdGUgZW50aXR5IG1ldGFkYXRhIGl0c2VsZlxuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSBuZXcgRW50aXR5TWV0YWRhdGEoe1xuICAgICAgICAgICAgcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucyAmJiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEudHJlZU9wdGlvbnMuY2xvc3VyZVRhYmxlTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5jbG9zdXJlVGFibGVOYW1lIDogcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJjbG9zdXJlLWp1bmN0aW9uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhbmNlc3RvciBhbmQgZGVzY2VuZGFudCBjb2x1bW5zIGZvciBuZXcgY2xvc3VyZSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY2xvc3VyZVR5cGU6IFwiYW5jZXN0b3JcIixcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uOiBwcmltYXJ5Q29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEudHJlZU9wdGlvbnMgJiYgcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRyZWVPcHRpb25zLmFuY2VzdG9yQ29sdW1uTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5hbmNlc3RvckNvbHVtbk5hbWUocHJpbWFyeUNvbHVtbikgOiBwcmltYXJ5Q29sdW1uLnByb3BlcnR5TmFtZSArIFwiX2FuY2VzdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHByaW1hcnlDb2x1bW4ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcHJpbWFyeUNvbHVtbi50eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLnB1c2gobmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjbG9zdXJlVHlwZTogXCJkZXNjZW5kYW50XCIsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbjogcHJpbWFyeUNvbHVtbixcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcGFyZW50Q2xvc3VyZUVudGl0eU1ldGFkYXRhLnRyZWVPcHRpb25zICYmIHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5kZXNjZW5kYW50Q29sdW1uTmFtZSA/IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlT3B0aW9ucy5kZXNjZW5kYW50Q29sdW1uTmFtZShwcmltYXJ5Q29sdW1uKSA6IHByaW1hcnlDb2x1bW4ucHJvcGVydHlOYW1lICsgXCJfZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBwcmltYXJ5Q29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHByaW1hcnlDb2x1bW4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSBbXG4gICAgICAgICAgICBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zWzBdXSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEluZGV4TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEub3duQ29sdW1uc1sxXV0sXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eU1ldGFkYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgICAgICAvLyBpZiB0cmVlIGxldmVsIGNvbHVtbiB3YXMgZGVmaW5lZCBieSBhIGNsb3N1cmUgZW50aXR5IHRoZW4gYWRkIGl0IHRvIHRoZSBqdW5jdGlvbiBjb2x1bW5zIGFzIHdlbGxcbiAgICAgICAgaWYgKHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS50cmVlTGV2ZWxDb2x1bW4pIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IFwidmlydHVhbFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IFwibGV2ZWxcIixcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudHJlZUxldmVsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiB0YWJsZSBmb3JlaWduIGtleXNcbiAgICAgICAgLy8gTm90ZTogQ0FTQ0FERSBpcyBub3QgYXBwbGllZCB0byBtc3NxbCBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGkgY2FzY2FkZSBwYXRoc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyA9IFtcbiAgICAgICAgICAgIG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRW50aXR5TWV0YWRhdGE6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEub3duQ29sdW1uc1swXV0sXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbnM6IHBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucyxcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciA/IFwiTk8gQUNUSU9OXCIgOiBcIkNBU0NBREVcIlxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9yZWlnbktleU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczogW2VudGl0eU1ldGFkYXRhLm93bkNvbHVtbnNbMV1dLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5zOiBwYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIgPyBcIk5PIEFDVElPTlwiIDogXCJDQVNDQURFXCJcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBTYXBEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NhcC9TYXBEcml2ZXJcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9Db2x1bW5NZXRhZGF0YVwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9JbmRleE1ldGFkYXRhXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEVtYmVkZGVkTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRW1iZWRkZWRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uSWRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uQ291bnRNZXRhZGF0YVwiO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lclR5cGVzIH0gZnJvbSBcIi4uL21ldGFkYXRhL3R5cGVzL0V2ZW50TGlzdGVuZXJUeXBlc1wiO1xuaW1wb3J0IHsgTWV0YWRhdGFVdGlscyB9IGZyb20gXCIuL01ldGFkYXRhVXRpbHNcIjtcbmltcG9ydCB7IEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyIH0gZnJvbSBcIi4vSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXJcIjtcbmltcG9ydCB7IENsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9IGZyb20gXCIuL0Nsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlclwiO1xuaW1wb3J0IHsgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL1JlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXJcIjtcbmltcG9ydCB7IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRW50aXR5TGlzdGVuZXJNZXRhZGF0YVwiO1xuaW1wb3J0IHsgVW5pcXVlTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvVW5pcXVlTWV0YWRhdGFcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgQ2hlY2tNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9DaGVja01ldGFkYXRhXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgRXhjbHVzaW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRXhjbHVzaW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQnVpbGRzIEVudGl0eU1ldGFkYXRhIG9iamVjdHMgYW5kIGFsbCBpdHMgc3ViLW1ldGFkYXRhcy5cbiAqL1xudmFyIEVudGl0eU1ldGFkYXRhQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24sIG1ldGFkYXRhQXJnc1N0b3JhZ2UpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlID0gbWV0YWRhdGFBcmdzU3RvcmFnZTtcbiAgICAgICAgdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciA9IG5ldyBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcihjb25uZWN0aW9uKTtcbiAgICAgICAgdGhpcy5jbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIgPSBuZXcgQ2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyKGNvbm5lY3Rpb24pO1xuICAgICAgICB0aGlzLnJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgPSBuZXcgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlcihjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIGNvbXBsZXRlIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZSBnaXZlbiBlbnRpdHkgY2xhc3Nlcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGVudGl0eUNsYXNzZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgZW50aXR5IGNsYXNzZXMgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IGFyZSBnaXZlbiB0aGVuIGRvIGZpbHRlcmluZywgb3RoZXJ3aXNlIHVzZSBhbGxcbiAgICAgICAgdmFyIGFsbFRhYmxlcyA9IGVudGl0eUNsYXNzZXMgPyB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyVGFibGVzKGVudGl0eUNsYXNzZXMpIDogdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLnRhYmxlcztcbiAgICAgICAgLy8gZmlsdGVyIG91dCB0YWJsZSBtZXRhZGF0YSBhcmdzIGZvciB0aG9zZSB3ZSByZWFsbHkgY3JlYXRlIGVudGl0eSBtZXRhZGF0YXMgYW5kIHRhYmxlcyBpbiB0aGUgZGJcbiAgICAgICAgdmFyIHJlYWxUYWJsZXMgPSBhbGxUYWJsZXMuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gdGFibGUudHlwZSA9PT0gXCJyZWd1bGFyXCIgfHwgdGFibGUudHlwZSA9PT0gXCJjbG9zdXJlXCIgfHwgdGFibGUudHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIiB8fCB0YWJsZS50eXBlID09PSBcInZpZXdcIjsgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBlbnRpdHkgbWV0YWRhdGFzIGZvciBhIHVzZXIgZGVmaW5lZCBlbnRpdGllcyAobWFya2VkIHdpdGggQEVudGl0eSBkZWNvcmF0b3Igb3IgbG9hZGVkIGZyb20gZW50aXR5IHNjaGVtYXMpXG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YXMgPSByZWFsVGFibGVzLm1hcChmdW5jdGlvbiAodGFibGVBcmdzKSB7IHJldHVybiBfdGhpcy5jcmVhdGVFbnRpdHlNZXRhZGF0YSh0YWJsZUFyZ3MpOyB9KTtcbiAgICAgICAgLy8gY29tcHV0ZSBwYXJlbnQgZW50aXR5IG1ldGFkYXRhcyBmb3IgdGFibGUgaW5oZXJpdGFuY2VcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5jb21wdXRlUGFyZW50RW50aXR5TWV0YWRhdGEoZW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyBhZnRlciBhbGwgbWV0YWRhdGFzIGNyZWF0ZWQgd2Ugc2V0IGNoaWxkIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRhYmxlIGluaGVyaXRhbmNlXG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuY2hpbGRFbnRpdHlNZXRhZGF0YXMgPSBlbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICYmIGNoaWxkTWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgJiYgTWV0YWRhdGFVdGlscy5pc0luaGVyaXRlZChjaGlsZE1ldGFkYXRhLnRhcmdldCwgbWV0YWRhdGEudGFyZ2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYnVpbGQgZW50aXR5IG1ldGFkYXRhIChzdGVwMCksIGZpcnN0IGZvciBub24tc2luZ2xlLXRhYmxlLWluaGVyaXRlZCBlbnRpdHkgbWV0YWRhdGFzIChkZXBlbmRhbnQpXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJlbnRpdHktY2hpbGRcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gZW50aXR5TWV0YWRhdGEuYnVpbGQoKTsgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGVudGl0eSBtZXRhZGF0YSAoc3RlcDApLCBub3cgZm9yIHNpbmdsZS10YWJsZS1pbmhlcml0ZWQgZW50aXR5IG1ldGFkYXRhcyAoZGVwZW5kYW50KVxuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7IH0pO1xuICAgICAgICAvLyBjb21wdXRlIGVudGl0eSBtZXRhZGF0YSBjb2x1bW5zLCByZWxhdGlvbnMsIGV0Yy4gZmlyc3QgZm9yIHRoZSByZWd1bGFyLCBub24tc2luZ2xlLXRhYmxlLWluaGVyaXRlZCBlbnRpdHkgbWV0YWRhdGFzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJlbnRpdHktY2hpbGRcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMuY29tcHV0ZUVudGl0eU1ldGFkYXRhU3RlcDEoZW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyB0aGVuIGRvIGl0IGZvciBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UgY2hpbGRyZW4gKHNpbmNlIHRoZXkgYXJlIGRlcGVuZCBvbiB0aGVpciBwYXJlbnRzIHRvIGJlIGJ1aWx0KVxuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAxKGVudGl0eU1ldGFkYXRhcywgZW50aXR5TWV0YWRhdGEpOyB9KTtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGVudGl0eSBtZXRhZGF0YSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFuZCBhbGwgaXRzIHN1Yi1tZXRhZGF0YXNcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihlbnRpdHlNZXRhZGF0YSk7IH0pO1xuICAgICAgICAvLyBjYWxjdWxhdGUgZW50aXR5IG1ldGFkYXRhJ3MgaW52ZXJzZSBwcm9wZXJ0aWVzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMuY29tcHV0ZUludmVyc2VQcm9wZXJ0aWVzKGVudGl0eU1ldGFkYXRhLCBlbnRpdHlNZXRhZGF0YXMpOyB9KTtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgZW50aXR5IG1ldGFkYXRhcyBhbmQgY3JlYXRlIGZvcmVpZ24ga2V5cyAvIGp1bmN0aW9uIGVudGl0eSBtZXRhZGF0YXMgZm9yIHRoZWlyIHJlbGF0aW9uc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgIT09IFwiZW50aXR5LWNoaWxkXCI7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBlbnRpdHkncyByZWxhdGlvbnMgam9pbiBjb2x1bW5zIChmb3IgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgb3duZXIpXG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb09uZSB8fCByZWxhdGlvbi5pc01hbnlUb09uZTsgfSkuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pbkNvbHVtbnMgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckpvaW5Db2x1bW5zKHJlbGF0aW9uLnRhcmdldCwgcmVsYXRpb24ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5yZWxhdGlvbkpvaW5Db2x1bW5CdWlsZGVyLmJ1aWxkKGpvaW5Db2x1bW5zLCByZWxhdGlvbiksIGZvcmVpZ25LZXkgPSBfYS5mb3JlaWduS2V5LCBjb2x1bW5zID0gX2EuY29sdW1ucywgdW5pcXVlQ29uc3RyYWludCA9IF9hLnVuaXF1ZUNvbnN0cmFpbnQ7IC8vIGNyZWF0ZSBhIGZvcmVpZ24ga2V5IGJhc2VkIG9uIGl0cyBtZXRhZGF0YSBhcmdzXG4gICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucmVnaXN0ZXJGb3JlaWduS2V5cyhmb3JlaWduS2V5KTsgLy8gcHVzaCBpdCB0byB0aGUgcmVsYXRpb24gYW5kIHRodXMgcmVnaXN0ZXIgdGhlcmUgYSBqb2luIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cy5wdXNoKGZvcmVpZ25LZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5yZWdpc3RlckpvaW5Db2x1bW5zKGNvbHVtbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHVuaXF1ZUNvbnN0cmFpbnQuZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogdW5pcXVlQ29uc3RyYWludC5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB1bmlxdWVDb25zdHJhaW50LnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdW5pcXVlQ29uc3RyYWludC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC53aGVyZSA9IGluZGV4LmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiIElTIE5PVCBOVUxMXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLmluZGljZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29tcHV0ZUVudGl0eU1ldGFkYXRhU3RlcDIoZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLnVuaXF1ZXMucHVzaCh1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLm93blVuaXF1ZXMucHVzaCh1bmlxdWVDb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm9yZWlnbktleSAmJiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogcmVsYXRpb24uZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBmb3JlaWduS2V5LmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbWJlZGRlZE1ldGFkYXRhLmluZGljZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiBlbnRpdHkgbWV0YWRhdGFzIGZvciBlbnRpdHkgbWFueS10by1tYW55IHJlbGF0aW9uc1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueTsgfSkuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgam9pblRhYmxlID0gX3RoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSm9pblRhYmxlKHJlbGF0aW9uLnRhcmdldCwgcmVsYXRpb24ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBqb2luIHRhYmxlIHNldCAtIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKGl0IG1lYW5zIHRoaXMgaXMgbWFueS10by1tYW55IGludmVyc2Ugc2lkZSlcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGNyZWF0ZSBhIGp1bmN0aW9uIGVudGl0eSBtZXRhZGF0YSBmb3IgYSBuZXcganVuY3Rpb24gdGFibGUgb2YgbWFueS10by1tYW55IHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgdmFyIGp1bmN0aW9uRW50aXR5TWV0YWRhdGEgPSBfdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5idWlsZChyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgICAgICAgICByZWxhdGlvbi5yZWdpc3RlckZvcmVpZ25LZXlzLmFwcGx5KHJlbGF0aW9uLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoanVuY3Rpb25FbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgcmVsYXRpb24ucmVnaXN0ZXJKb2luQ29sdW1ucyhqdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bkluZGljZXNbMF0uY29sdW1ucywganVuY3Rpb25FbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzWzFdLmNvbHVtbnMpO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uLnJlZ2lzdGVySnVuY3Rpb25FbnRpdHlNZXRhZGF0YShqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlIG5ldyBlbnRpdHkgbWV0YWRhdGEgcHJvcGVydGllcyBhbmQgcHVzaCBpdCB0byBlbnRpdHkgbWV0YWRhdGFzIHBvb2xcbiAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlSW52ZXJzZVByb3BlcnRpZXMoanVuY3Rpb25FbnRpdHlNZXRhZGF0YSwgZW50aXR5TWV0YWRhdGFzKTtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YXMucHVzaChqdW5jdGlvbkVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXBkYXRlIGVudGl0eSBtZXRhZGF0YSBkZXBlbmQgcHJvcGVydGllc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zV2l0aEpvaW5Db2x1bW5zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzV2l0aEpvaW5Db2x1bW47IH0pO1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuaGFzTm9uTnVsbGFibGVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuc29tZShmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuICFyZWxhdGlvbi5pc051bGxhYmxlIHx8IHJlbGF0aW9uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlcyBmb3IgYWxsIGNsb3N1cmUgdGFibGVzXG4gICAgICAgIGVudGl0eU1ldGFkYXRhc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobWV0YWRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIjsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIGNsb3N1cmVKdW5jdGlvbkVudGl0eU1ldGFkYXRhID0gX3RoaXMuY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLmJ1aWxkKGVudGl0eU1ldGFkYXRhKTtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlID0gY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihjbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICBfdGhpcy5jb21wdXRlSW52ZXJzZVByb3BlcnRpZXMoY2xvc3VyZUp1bmN0aW9uRW50aXR5TWV0YWRhdGEsIGVudGl0eU1ldGFkYXRhcyk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YXMucHVzaChjbG9zdXJlSnVuY3Rpb25FbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBrZXlzIGZvciB0YWJsZXMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2VcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEuaW5oZXJpdGFuY2VQYXR0ZXJuID09PSBcIlNUSVwiICYmIG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW47IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUtleXNGb3JUYWJsZUluaGVyaXRhbmNlKGVudGl0eU1ldGFkYXRhKTsgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGFsbCBpbmRpY2VzIChuZWVkIHRvIGRvIGl0IGFmdGVyIHJlbGF0aW9ucyBhbmQgdGhlaXIgam9pbiBjb2x1bW5zIGFyZSBidWlsdClcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5pbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBpbmRleC5idWlsZChfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5KTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBidWlsZCBhbGwgdW5pcXVlIGNvbnN0cmFpbnRzIChuZWVkIHRvIGRvIGl0IGFmdGVyIHJlbGF0aW9ucyBhbmQgdGhlaXIgam9pbiBjb2x1bW5zIGFyZSBidWlsdClcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS51bmlxdWVzLmZvckVhY2goZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gdW5pcXVlLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGJ1aWxkIGFsbCBjaGVjayBjb25zdHJhaW50c1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNoZWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gY2hlY2suYnVpbGQoX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYnVpbGQgYWxsIGV4Y2x1c2lvbiBjb25zdHJhaW50c1xuICAgICAgICBlbnRpdHlNZXRhZGF0YXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmV4Y2x1c2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXhjbHVzaW9uKSB7IHJldHVybiBleGNsdXNpb24uYnVpbGQoX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYWRkIGxhenkgaW5pdGlhbGl6ZXIgZm9yIGVudGl0eSByZWxhdGlvbnNcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb247IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5pc0xhenk7IH0pXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5yZWxhdGlvbkxvYWRlci5lbmFibGVMYXp5TG9hZChyZWxhdGlvbiwgZW50aXR5TWV0YWRhdGEudGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCB0YXJnZXQgPSBjb2x1bW4uZW1iZWRkZWRNZXRhZGF0YSA/IGNvbHVtbi5lbWJlZGRlZE1ldGFkYXRhLnR5cGUgOiBjb2x1bW4udGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0ZWQgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbmRHZW5lcmF0ZWQoY29sdW1uLnRhcmdldCwgY29sdW1uLnByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uaXNHZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gZ2VuZXJhdGVkLnN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVkLnN0cmF0ZWd5ID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBcInV1aWRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZW5lcmF0ZWQuc3RyYXRlZ3kgPT09IFwicm93aWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBcImludFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUgPSBjb2x1bW4udHlwZSB8fCBOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jb21wdXRlRW50aXR5TWV0YWRhdGFTdGVwMihlbnRpdHlNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW50aXR5TWV0YWRhdGFzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZW50aXR5IG1ldGFkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlIGFyZ3MuXG4gICAgICogQ3JlYXRlcyBjb2x1bW4sIHJlbGF0aW9uLCBldGMuIG1ldGFkYXRhcyBmb3IgZXZlcnl0aGluZyB0aGlzIGVudGl0eSBtZXRhZGF0YSBvd25zLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlRW50aXR5TWV0YWRhdGEgPSBmdW5jdGlvbiAodGFibGVBcmdzKSB7XG4gICAgICAgIC8vIHdlIHRha2UgYWxsIFwiaW5oZXJpdGFuY2UgdHJlZVwiIGZyb20gYSB0YXJnZXQgZW50aXR5IHRvIGNvbGxlY3QgYWxsIHN0b3JlZCBtZXRhZGF0YSBhcmdzXG4gICAgICAgIC8vIChieSBkZWNvcmF0b3JzIG9yIGluc2lkZSBlbnRpdHkgc2NoZW1hcykuIEZvciBleGFtcGxlIGZvciB0YXJnZXQgUG9zdCA8IENvbnRlbnRNb2RlbCA8IFVuaXRcbiAgICAgICAgLy8gaXQgd2lsbCBiZSBhbiBhcnJheSBvZiBbUG9zdCwgQ29udGVudE1vZGVsLCBVbml0XSBhbmQgd2UgY2FuIHRoZW4gZ2V0IGFsbCBtZXRhZGF0YSBhcmdzIG9mIHRob3NlIGNsYXNzZXNcbiAgICAgICAgdmFyIGluaGVyaXRhbmNlVHJlZSA9IHRhYmxlQXJncy50YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvblxuICAgICAgICAgICAgPyBNZXRhZGF0YVV0aWxzLmdldEluaGVyaXRhbmNlVHJlZSh0YWJsZUFyZ3MudGFyZ2V0KVxuICAgICAgICAgICAgOiBbdGFibGVBcmdzLnRhcmdldF07IC8vIHRvZG86IGltcGxlbWVudCBsYXRlciBoZXJlIGluaGVyaXRhbmNlIGZvciBzdHJpbmctdGFyZ2V0c1xuICAgICAgICB2YXIgdGFibGVJbmhlcml0YW5jZSA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSW5oZXJpdGFuY2VUeXBlKHRhYmxlQXJncy50YXJnZXQpO1xuICAgICAgICB2YXIgdGFibGVUcmVlID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbmRUcmVlKHRhYmxlQXJncy50YXJnZXQpO1xuICAgICAgICAvLyBpZiBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UgdXNlZCwgd2UgbmVlZCB0byBjb3B5IGFsbCBjaGlsZHJlbiBjb2x1bW5zIGluIHRvIHBhcmVudCB0YWJsZVxuICAgICAgICB2YXIgc2luZ2xlVGFibGVDaGlsZHJlblRhcmdldHM7XG4gICAgICAgIGlmICgodGFibGVJbmhlcml0YW5jZSAmJiB0YWJsZUluaGVyaXRhbmNlLnBhdHRlcm4gPT09IFwiU1RJXCIpIHx8IHRhYmxlQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiKSB7XG4gICAgICAgICAgICBzaW5nbGVUYWJsZUNoaWxkcmVuVGFyZ2V0cyA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZVxuICAgICAgICAgICAgICAgIC5maWx0ZXJTaW5nbGVUYWJsZUNoaWxkcmVuKHRhYmxlQXJncy50YXJnZXQpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gYXJncy50YXJnZXQ7IH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodGFyZ2V0KSB7IHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBGdW5jdGlvbjsgfSk7XG4gICAgICAgICAgICBpbmhlcml0YW5jZVRyZWUucHVzaC5hcHBseShpbmhlcml0YW5jZVRyZWUsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzaW5nbGVUYWJsZUNoaWxkcmVuVGFyZ2V0cyksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlNZXRhZGF0YSh7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB0YWJsZUFyZ3MsXG4gICAgICAgICAgICBpbmhlcml0YW5jZVRyZWU6IGluaGVyaXRhbmNlVHJlZSxcbiAgICAgICAgICAgIHRhYmxlVHJlZTogdGFibGVUcmVlLFxuICAgICAgICAgICAgaW5oZXJpdGFuY2VQYXR0ZXJuOiB0YWJsZUluaGVyaXRhbmNlID8gdGFibGVJbmhlcml0YW5jZS5wYXR0ZXJuIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb21wdXRlUGFyZW50RW50aXR5TWV0YWRhdGEgPSBmdW5jdGlvbiAoYWxsRW50aXR5TWV0YWRhdGFzLCBlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAvLyBhZnRlciBhbGwgbWV0YWRhdGFzIGNyZWF0ZWQgd2Ugc2V0IHBhcmVudCBlbnRpdHkgbWV0YWRhdGEgZm9yIHRhYmxlIGluaGVyaXRhbmNlXG4gICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhID0gYWxsRW50aXR5TWV0YWRhdGFzLmZpbmQoZnVuY3Rpb24gKGFsbEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbEVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5pbmRleE9mKGVudGl0eU1ldGFkYXRhLnRhcmdldCkgIT09IC0xICYmIGFsbEVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAxID0gZnVuY3Rpb24gKGFsbEVudGl0eU1ldGFkYXRhcywgZW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlbnRpdHlJbmhlcml0YW5jZSA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maW5kSW5oZXJpdGFuY2VUeXBlKGVudGl0eU1ldGFkYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBkaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmluZERpc2NyaW1pbmF0b3JWYWx1ZShlbnRpdHlNZXRhZGF0YS50YXJnZXQpO1xuICAgICAgICBpZiAodHlwZW9mIGRpc2NyaW1pbmF0b3JWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlID0gZGlzY3JpbWluYXRvclZhbHVlLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlID0gZW50aXR5TWV0YWRhdGEudGFyZ2V0Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIGlzIHVzZWQsIHdlIG5lZWQgdG8gbWFyayBhbGwgZW1iZWRkZWQgY29sdW1ucyBhcyBudWxsYWJsZVxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMgPSB0aGlzLmNyZWF0ZUVtYmVkZGVkc1JlY3Vyc2l2ZWx5KGVudGl0eU1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyRW1iZWRkZWRzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChlbWJlZGRlZCkge1xuICAgICAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIikge1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkLmNvbHVtbnMgPSBlbWJlZGRlZC5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5pc051bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2VcbiAgICAgICAgICAgIC5maWx0ZXJDb2x1bW5zKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgY29sdW1ucyBjcmVhdGVkIGZvciB0aGVpciBwYXJlbnRzXG4gICAgICAgICAgICBpZiAoZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YSh7IGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIC8vIGlmIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSB1c2VkLCB3ZSBuZWVkIHRvIG1hcmsgYWxsIGluaGVyaXQgdGFibGUgY29sdW1ucyBhcyBudWxsYWJsZVxuICAgICAgICAgICAgdmFyIGNvbHVtbkluU2luZ2xlVGFibGVJbmhlcml0ZWRDaGlsZCA9IGFsbEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChvdGhlckVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBvdGhlckVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIiAmJiBvdGhlckVudGl0eU1ldGFkYXRhLnRhcmdldCA9PT0gYXJncy50YXJnZXQ7IH0pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluU2luZ2xlVGFibGVJbmhlcml0ZWRDaGlsZClcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNOdWxsYWJsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZm9yIHRhYmxlIGluaGVyaXRhbmNlIHdlIG5lZWQgdG8gYWRkIGEgZGlzY3JpbWluYXRvciBjb2x1bW5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGVudGl0eUluaGVyaXRhbmNlICYmIGVudGl0eUluaGVyaXRhbmNlLmNvbHVtbikge1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEgPSBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4gJiYgZW50aXR5SW5oZXJpdGFuY2UuY29sdW1uLm5hbWUgPyBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4ubmFtZSA6IFwidHlwZVwiO1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gZGlzY3JpbWluYXRvckNvbHVtbk5hbWVfMTsgfSk7XG4gICAgICAgICAgICBpZiAoIWRpc2NyaW1pbmF0b3JDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yQ29sdW1uID0gbmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlbnRpdHlJbmhlcml0YW5jZS5jb2x1bW4gfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRpc2NyaW1pbmF0b3JDb2x1bW5OYW1lXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yQ29sdW1uLmlzVmlydHVhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGlzY3JpbWluYXRvckNvbHVtbi5pc0Rpc2NyaW1pbmF0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChkaXNjcmltaW5hdG9yQ29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3JDb2x1bW4uaXNEaXNjcmltaW5hdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgZGlzY3JpbWluYXRvciBjb2x1bW4gdG8gdGhlIGNoaWxkIGVudGl0eSBtZXRhZGF0YXNcbiAgICAgICAgLy8gZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBub3QgYmUgdGhlcmUgYXV0b21hdGljYWxseSBzaW5jZSB3ZSBhcmUgY3JlYXRpbmcgaXQgaW4gdGhlIGNvZGUgYWJvdmVcbiAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIikge1xuICAgICAgICAgICAgdmFyIGRpc2NyaW1pbmF0b3JDb2x1bW5fMSA9IGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEaXNjcmltaW5hdG9yOyB9KTtcbiAgICAgICAgICAgIGlmIChkaXNjcmltaW5hdG9yQ29sdW1uXzEgJiYgIWVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4gPT09IGRpc2NyaW1pbmF0b3JDb2x1bW5fMTsgfSkpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLnB1c2goZGlzY3JpbWluYXRvckNvbHVtbl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtaW5nU3RyYXRlZ3kgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3k7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRyZWUgaXMgdXNlZCB0aGVuIHdlIG5lZWQgdG8gYWRkIGV4dHJhIGNvbHVtbnMgZm9yIHNwZWNpZmljIHRyZWUgdHlwZXNcbiAgICAgICAgaWYgKGVudGl0eU1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm1hdGVyaWFsaXplZC1wYXRoXCIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMucHVzaChuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkUGF0aDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1wYXRoXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IC8qdHJlZS5jb2x1bW4gfHwgKi8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtaW5nU3RyYXRlZ3kubWF0ZXJpYWxpemVkUGF0aENvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVudGl0eU1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm5lc3RlZC1zZXRcIikge1xuICAgICAgICAgICAgdmFyIF9kID0gbmFtaW5nU3RyYXRlZ3kubmVzdGVkU2V0Q29sdW1uTmFtZXMsIGxlZnQgPSBfZC5sZWZ0LCByaWdodCA9IF9kLnJpZ2h0O1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuZXN0ZWRTZXRMZWZ0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6IFwidmlydHVhbFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGxlZnQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IC8qdHJlZS5jb2x1bW4gfHwgKi8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5wdXNoKG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuZXN0ZWRTZXRSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZW50aXR5TWV0YWRhdGEudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiByaWdodCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogLyp0cmVlLmNvbHVtbiB8fCAqLyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93blJlbGF0aW9ucyA9IHRoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maWx0ZXJSZWxhdGlvbnMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgcmVsYXRpb25zIGNyZWF0ZWQgZm9yIHRoZWlyIHBhcmVudHNcbiAgICAgICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50UmVsYXRpb24gPSBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5vd25SZWxhdGlvbnMuZmluZChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gYXJncy50eXBlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBhcmdzLnR5cGUoKSA6IGFyZ3MudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UmVsYXRpb24udHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHBhcmVudFJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFJlbGF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25JZHMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25JZHMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvciBzaW5nbGUgdGFibGUgY2hpbGRyZW4gd2UgcmV1c2UgcmVsYXRpb24gaWRzIGNyZWF0ZWQgZm9yIHRoZWlyIHBhcmVudHNcbiAgICAgICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eU1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhLnJlbGF0aW9uSWRzLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIHJlbGF0aW9uSWQucHJvcGVydHlOYW1lID09PSBhcmdzLnByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9uQ291bnRzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclJlbGF0aW9uQ291bnRzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2luZ2xlIHRhYmxlIGNoaWxkcmVuIHdlIHJldXNlIHJlbGF0aW9uIGNvdW50cyBjcmVhdGVkIGZvciB0aGVpciBwYXJlbnRzXG4gICAgICAgICAgICBpZiAoZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlNZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7IHJldHVybiByZWxhdGlvbkNvdW50LnByb3BlcnR5TmFtZSA9PT0gYXJncy5wcm9wZXJ0eU5hbWU7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25MaXN0ZW5lcnMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyTGlzdGVuZXJzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5jaGVja3MgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyQ2hlY2tzKGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZSkubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IFBvc3RncmVTUUwgc3VwcG9ydHMgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5leGNsdXNpb25zID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckV4Y2x1c2lvbnMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2x1c2lvbk1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBDb2Nrcm9hY2hEcml2ZXIpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyhlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVRyZWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gIWFyZ3MudW5pcXVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciB1bmlxdWVzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckluZGljZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGFyZ3MpIHsgcmV0dXJuIGFyZ3MudW5pcXVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGFyZ3MudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXJncy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogYXJncy5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIChfYSA9IGVudGl0eU1ldGFkYXRhLm93blVuaXF1ZXMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh1bmlxdWVzKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMgPSB0aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyhlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVRyZWUpLm1hcChmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE15c3FsIGFuZCBTQVAgSEFOQSBzdG9yZXMgdW5pcXVlIGNvbnN0cmFpbnRzIGFzIHVuaXF1ZSBpbmRpY2VzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgIHZhciBpbmRpY2VzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclVuaXF1ZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogYXJncy50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhcmdzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBhcmdzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIChfYiA9IGVudGl0eU1ldGFkYXRhLm93bkluZGljZXMpLnB1c2guYXBwbHkoX2IsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChpbmRpY2VzKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVzID0gdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlclVuaXF1ZXMoZW50aXR5TWV0YWRhdGEuaW5oZXJpdGFuY2VUcmVlKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAoX2MgPSBlbnRpdHlNZXRhZGF0YS5vd25VbmlxdWVzKS5wdXNoLmFwcGx5KF9jLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodW5pcXVlcyksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZnJvbSB0aGUgZ2l2ZW4gZW1iZWRkZWQgbWV0YWRhdGEgYXJncyByZWFsIGVtYmVkZGVkIG1ldGFkYXRhcyB3aXRoIGl0cyBjb2x1bW5zIGFuZCByZWxhdGlvbnMsXG4gICAgICogYW5kIGRvZXMgdGhlIHNhbWUgZm9yIGFsbCBpdHMgc3ViLWVtYmVkZGVkcyAoZ29lcyByZWN1cnNpdmVseSkuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZHNSZWN1cnNpdmVseSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZW1iZWRkZWRBcmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBlbWJlZGRlZEFyZ3MubWFwKGZ1bmN0aW9uIChlbWJlZGRlZEFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gbmV3IEVtYmVkZGVkTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGVtYmVkZGVkQXJncyB9KTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRzID0gTWV0YWRhdGFVdGlscy5nZXRJbmhlcml0YW5jZVRyZWUoZW1iZWRkZWRNZXRhZGF0YS50eXBlKTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuY29sdW1ucyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyQ29sdW1ucyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHsgY29ubmVjdGlvbjogX3RoaXMuY29ubmVjdGlvbiwgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBlbWJlZGRlZE1ldGFkYXRhOiBlbWJlZGRlZE1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZE1ldGFkYXRhLnJlbGF0aW9ucyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25zKHRhcmdldHMpLm1hcChmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25NZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgZW1iZWRkZWRNZXRhZGF0YTogZW1iZWRkZWRNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZW1iZWRkZWRNZXRhZGF0YS5saXN0ZW5lcnMgPSBfdGhpcy5tZXRhZGF0YUFyZ3NTdG9yYWdlLmZpbHRlckxpc3RlbmVycyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUxpc3RlbmVyTWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGVtYmVkZGVkTWV0YWRhdGE6IGVtYmVkZGVkTWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuaW5kaWNlcyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVySW5kaWNlcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGVtYmVkZGVkTWV0YWRhdGE6IGVtYmVkZGVkTWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEudW5pcXVlcyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyVW5pcXVlcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZU1ldGFkYXRhKHsgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLCBlbWJlZGRlZE1ldGFkYXRhOiBlbWJlZGRlZE1ldGFkYXRhLCBhcmdzOiBhcmdzIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZE1ldGFkYXRhLnJlbGF0aW9uSWRzID0gX3RoaXMubWV0YWRhdGFBcmdzU3RvcmFnZS5maWx0ZXJSZWxhdGlvbklkcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YSh7IGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSwgYXJnczogYXJncyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZW1iZWRkZWRNZXRhZGF0YS5yZWxhdGlvbkNvdW50cyA9IF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyUmVsYXRpb25Db3VudHModGFyZ2V0cykubWFwKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGEoeyBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsIGFyZ3M6IGFyZ3MgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuZW1iZWRkZWRzID0gX3RoaXMuY3JlYXRlRW1iZWRkZWRzUmVjdXJzaXZlbHkoZW50aXR5TWV0YWRhdGEsIF90aGlzLm1ldGFkYXRhQXJnc1N0b3JhZ2UuZmlsdGVyRW1iZWRkZWRzKHRhcmdldHMpKTtcbiAgICAgICAgICAgIGVtYmVkZGVkTWV0YWRhdGEuZW1iZWRkZWRzLmZvckVhY2goZnVuY3Rpb24gKHN1YkVtYmVkZGVkKSB7IHJldHVybiBzdWJFbWJlZGRlZC5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YTsgfSk7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5hbGxFbWJlZGRlZHMucHVzaChlbWJlZGRlZE1ldGFkYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGFsbCBlbnRpdHkgbWV0YWRhdGEncyBjb21wdXRlZCBwcm9wZXJ0aWVzLCBhbmQgYWxsIGl0cyBzdWItbWV0YWRhdGFzIChyZWxhdGlvbnMsIGNvbHVtbnMsIGVtYmVkcywgZXRjKS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNvbXB1dGVFbnRpdHlNZXRhZGF0YVN0ZXAyID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5mb3JFYWNoKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWQuYnVpbGQoX3RoaXMuY29ubmVjdGlvbik7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMuZm9yRWFjaChmdW5jdGlvbiAoZW1iZWRkZWQpIHtcbiAgICAgICAgICAgIGVtYmVkZGVkLmNvbHVtbnNGcm9tVHJlZS5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5idWlsZChfdGhpcy5jb25uZWN0aW9uKTsgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbnNGcm9tVHJlZS5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uYnVpbGQoKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24pOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duUmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5yZWxhdGlvbnNGcm9tVHJlZSk7IH0sIGVudGl0eU1ldGFkYXRhLm93blJlbGF0aW9ucyk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmVhZ2VyUmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzRWFnZXI7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5sYXp5UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTGF6eTsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm9uZVRvT25lUmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzT25lVG9PbmU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vbmVUb01hbnlSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb01hbnk7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5tYW55VG9PbmVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNNYW55VG9PbmU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5tYW55VG9NYW55UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueTsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bmVyT25lVG9PbmVSZWxhdGlvbnMgPSBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNPbmVUb09uZU93bmVyOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duZXJNYW55VG9NYW55UmVsYXRpb25zID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLmlzTWFueVRvTWFueU93bmVyOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uID0gZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5pc1RyZWVQYXJlbnQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbiA9IGVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNUcmVlQ2hpbGRyZW47IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zID0gZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAoY29sdW1ucywgZW1iZWRkZWQpIHsgcmV0dXJuIGNvbHVtbnMuY29uY2F0KGVtYmVkZGVkLmNvbHVtbnNGcm9tVHJlZSk7IH0sIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMpO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5saXN0ZW5lcnMgPSBlbnRpdHlNZXRhZGF0YS5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChsaXN0ZW5lcnMsIGVtYmVkZGVkKSB7IHJldHVybiBsaXN0ZW5lcnMuY29uY2F0KGVtYmVkZGVkLmxpc3RlbmVyc0Zyb21UcmVlKTsgfSwgZW50aXR5TWV0YWRhdGEub3duTGlzdGVuZXJzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYWZ0ZXJMb2FkTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9MT0FEOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYWZ0ZXJJbnNlcnRMaXN0ZW5lcnMgPSBlbnRpdHlNZXRhZGF0YS5saXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIudHlwZSA9PT0gRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX0lOU0VSVDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmFmdGVyVXBkYXRlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9VUERBVEU7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5hZnRlclJlbW92ZUxpc3RlbmVycyA9IGVudGl0eU1ldGFkYXRhLmxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lci50eXBlID09PSBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfUkVNT1ZFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlSW5zZXJ0TGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfSU5TRVJUOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlVXBkYXRlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfVVBEQVRFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzID0gZW50aXR5TWV0YWRhdGEubGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyLnR5cGUgPT09IEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfUkVNT1ZFOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuaW5kaWNlcyA9IGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKGluZGljZXMsIGVtYmVkZGVkKSB7IHJldHVybiBpbmRpY2VzLmNvbmNhdChlbWJlZGRlZC5pbmRpY2VzRnJvbVRyZWUpOyB9LCBlbnRpdHlNZXRhZGF0YS5vd25JbmRpY2VzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudW5pcXVlcyA9IGVudGl0eU1ldGFkYXRhLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHVuaXF1ZXMsIGVtYmVkZGVkKSB7IHJldHVybiB1bmlxdWVzLmNvbmNhdChlbWJlZGRlZC51bmlxdWVzRnJvbVRyZWUpOyB9LCBlbnRpdHlNZXRhZGF0YS5vd25VbmlxdWVzKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEubm9uVmlydHVhbENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiAhY29sdW1uLmlzVmlydHVhbDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmFuY2VzdG9yQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5jbG9zdXJlVHlwZSA9PT0gXCJhbmNlc3RvclwiOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGVzY2VuZGFudENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uY2xvc3VyZVR5cGUgPT09IFwiZGVzY2VuZGFudFwiOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cyA9IGVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmxlbmd0aCA+IDE7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNHZW5lcmF0ZWQgfHwgY29sdW1uLmlzT2JqZWN0SWQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5oYXNVVUlER2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc0dlbmVyYXRlZCB8fCBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIjsgfSkubGVuZ3RoID4gMDtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNDcmVhdGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNVcGRhdGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEZWxldGVEYXRlOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudmVyc2lvbkNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNWZXJzaW9uOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNEaXNjcmltaW5hdG9yOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEudHJlZUxldmVsQ29sdW1uID0gZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1RyZWVMZXZlbDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm5lc3RlZFNldExlZnRDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzTmVzdGVkU2V0TGVmdDsgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uID0gZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc05lc3RlZFNldFJpZ2h0OyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbiA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNNYXRlcmlhbGl6ZWRQYXRoOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub2JqZWN0SWRDb2x1bW4gPSBlbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzT2JqZWN0SWQ7IH0pO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5LmJ1aWxkKF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucHJvcGVydGllc01hcCA9IGVudGl0eU1ldGFkYXRhLmNyZWF0ZVByb3BlcnRpZXNNYXAoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25JZHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25JZCkgeyByZXR1cm4gcmVsYXRpb25JZC5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25Db3VudHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25Db3VudCkgeyByZXR1cm4gcmVsYXRpb25Db3VudC5idWlsZCgpOyB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEuZW1iZWRkZWRzLmZvckVhY2goZnVuY3Rpb24gKGVtYmVkZGVkKSB7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbklkc0Zyb21UcmVlLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIHJlbGF0aW9uSWQuYnVpbGQoKTsgfSk7XG4gICAgICAgICAgICBlbWJlZGRlZC5yZWxhdGlvbkNvdW50c0Zyb21UcmVlLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uQ291bnQpIHsgcmV0dXJuIHJlbGF0aW9uQ291bnQuYnVpbGQoKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgZW50aXR5IG1ldGFkYXRhJ3MgcmVsYXRpb25zIGludmVyc2Ugc2lkZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuY29tcHV0ZUludmVyc2VQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhLCBlbnRpdHlNZXRhZGF0YXMpIHtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBjb21wdXRlIGludmVyc2Ugc2lkZSAocmVsYXRlZCkgZW50aXR5IG1ldGFkYXRhcyBmb3IgYWxsIHJlbGF0aW9uIG1ldGFkYXRhc1xuICAgICAgICAgICAgdmFyIGludmVyc2VFbnRpdHlNZXRhZGF0YSA9IGVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnRhcmdldCA9PT0gcmVsYXRpb24udHlwZSB8fCAodHlwZW9mIHJlbGF0aW9uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgKG0udGFyZ2V0TmFtZSA9PT0gcmVsYXRpb24udHlwZSB8fCBtLmdpdmVuVGFibGVOYW1lID09PSByZWxhdGlvbi50eXBlKSk7IH0pO1xuICAgICAgICAgICAgaWYgKCFpbnZlcnNlRW50aXR5TWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBtZXRhZGF0YSBmb3IgXCIgKyBlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIiB3YXMgbm90IGZvdW5kLiBDaGVjayBpZiB5b3Ugc3BlY2lmaWVkIGEgY29ycmVjdCBlbnRpdHkgb2JqZWN0IGFuZCBpZiBpdCdzIGNvbm5lY3RlZCBpbiB0aGUgY29ubmVjdGlvbiBvcHRpb25zLlwiKTtcbiAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSA9IGludmVyc2VFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VTaWRlUHJvcGVydHlQYXRoID0gcmVsYXRpb24uYnVpbGRJbnZlcnNlU2lkZVByb3BlcnR5UGF0aCgpO1xuICAgICAgICAgICAgLy8gYW5kIGNvbXB1dGUgaW52ZXJzZSByZWxhdGlvbiBhbmQgbWFyayBpZiBpdCBoYXMgc3VjaFxuICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uID0gaW52ZXJzZUVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChmb3VuZFJlbGF0aW9uKSB7IHJldHVybiBmb3VuZFJlbGF0aW9uLnByb3BlcnR5UGF0aCA9PT0gcmVsYXRpb24uaW52ZXJzZVNpZGVQcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaW5kaWNlcyBmb3IgdGhlIHRhYmxlIG9mIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUtleXNGb3JUYWJsZUluaGVyaXRhbmNlID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmluZGljZXMucHVzaChuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBjb2x1bW5zOiBbZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbl0sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgdW5pcXVlOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW50aXR5TWV0YWRhdGFCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBNaXNzaW5nUHJpbWFyeUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL01pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3JcIjtcbmltcG9ydCB7IENpcmN1bGFyUmVsYXRpb25zRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ2lyY3VsYXJSZWxhdGlvbnNFcnJvclwiO1xuaW1wb3J0IHsgRGVwR3JhcGggfSBmcm9tIFwiLi4vdXRpbC9EZXBHcmFwaFwiO1xuaW1wb3J0IHsgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9EYXRhVHlwZU5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IE5vQ29ubmVjdGlvbk9wdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL05vQ29ubmVjdGlvbk9wdGlvbkVycm9yXCI7XG5pbXBvcnQgeyBJbml0aWFsaXplZFJlbGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yXCI7XG5pbXBvcnQgeyBBdXJvcmFEYXRhQXBpRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vLy8gdG9kbzogYWRkIGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0YWJsZXMgd2l0aCB0aGUgc2FtZSBuYW1lXG4vLy8gdG9kbzogYWRkIGNoZWNrcyB3aGVuIGdlbmVyYXRlZCBjb2x1bW4gLyB0YWJsZSBuYW1lcyBhcmUgdG9vIGxvbmcgZm9yIHRoZSBzcGVjaWZpYyBkcml2ZXJcbi8vIHRvZG86IHR5cGUgaW4gZnVuY3Rpb24gdmFsaWRhdGlvbiwgaW52ZXJzZSBzaWRlIGZ1bmN0aW9uIHZhbGlkYXRpb25cbi8vIHRvZG86IGNoZWNrIG9uIGJ1aWxkIGZvciBkdXBsaWNhdGUgbmFtZXMsIHNpbmNlIG5hbWluZyBjaGVja2luZyB3YXMgcmVtb3ZlZCBmcm9tIE1ldGFkYXRhU3RvcmFnZVxuLy8gdG9kbzogZHVwbGljYXRlIG5hbWUgY2hlY2tpbmcgZm9yOiB0YWJsZSwgcmVsYXRpb24sIGNvbHVtbiwgaW5kZXgsIG5hbWluZyBzdHJhdGVneSwgam9pbiB0YWJsZXMvY29sdW1ucz9cbi8vIHRvZG86IGNoZWNrIGlmIG11bHRpcGxlIHRyZWUgcGFyZW50IG1ldGFkYXRhcyBpbiB2YWxpZGF0b3Jcbi8vIHRvZG86IHRyZWUgZGVjb3JhdG9ycyBjYW4gYmUgdXNlZCBvbmx5IG9uIGNsb3N1cmUgdGFibGUgKHZhbGlkYXRpb24pXG4vLyB0b2RvOiB0aHJvdyBlcnJvciBpZiBwYXJlbnQgdHJlZSBtZXRhZGF0YSB3YXMgbm90IHNwZWNpZmllZCBpbiBhIGNsb3N1cmUgdGFibGVcbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IHR5cGUgaW4gZnVuY3Rpb24gdmFsaWRhdGlvbiwgaW52ZXJzZSBzaWRlIGZ1bmN0aW9uIHZhbGlkYXRpb25cbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IGNoZWNrIG9uIGJ1aWxkIGZvciBkdXBsaWNhdGUgbmFtZXMsIHNpbmNlIG5hbWluZyBjaGVja2luZyB3YXMgcmVtb3ZlZCBmcm9tIE1ldGFkYXRhU3RvcmFnZVxuLy8gdG9kbzogTWV0YWRhdGFBcmdzU3RvcmFnZTogZHVwbGljYXRlIG5hbWUgY2hlY2tpbmcgZm9yOiB0YWJsZSwgcmVsYXRpb24sIGNvbHVtbiwgaW5kZXgsIG5hbWluZyBzdHJhdGVneSwgam9pbiB0YWJsZXMvY29sdW1ucz9cbi8vIHRvZG86IE1ldGFkYXRhQXJnc1N0b3JhZ2U6IGNoZWNrIGZvciBkdXBsaWNhdGUgdGFyZ2V0cyB0b28gc2luY2UgdGhpcyBjaGVjayBoYXMgYmVlbiByZW1vdmVkIHRvb1xuLy8gdG9kbzogY2hlY2sgaWYgcmVsYXRpb24gZGVjb3JhdG9yIGNvbnRhaW5zIHByaW1hcnk6IHRydWUgYW5kIG51bGxhYmxlOiB0cnVlXG4vLyB0b2RvOiBjaGVjayBjb2x1bW4gbGVuZ3RoLCBwcmVjaXNpb24uIHNjYWxlXG4vLyB0b2RvOiBNeVNRTCBpbmRleCBjYW4gYmUgdW5pcXVlIG9yIHNwYXRpYWwgb3IgZnVsbHRleHRcbi8qKlxuICogVmFsaWRhdGVzIGJ1aWx0IGVudGl0eSBtZXRhZGF0YXMuXG4gKi9cbnZhciBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBhbGwgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YVZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGVNYW55ID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhcywgZHJpdmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkgeyByZXR1cm4gX3RoaXMudmFsaWRhdGUoZW50aXR5TWV0YWRhdGEsIGVudGl0eU1ldGFkYXRhcywgZHJpdmVyKTsgfSk7XG4gICAgICAgIHRoaXMudmFsaWRhdGVEZXBlbmRlbmNpZXMoZW50aXR5TWV0YWRhdGFzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUVhZ2VyUmVsYXRpb25zKGVudGl0eU1ldGFkYXRhcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgYWxsRW50aXR5TWV0YWRhdGFzLCBkcml2ZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGFibGUgbWV0YWRhdGEgaGFzIGFuIGlkXG4gICAgICAgIGlmICghZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMubGVuZ3RoICYmICFlbnRpdHlNZXRhZGF0YS5pc0p1bmN0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcmltYXJ5Q29sdW1uRXJyb3IoZW50aXR5TWV0YWRhdGEpO1xuICAgICAgICAvLyB2YWxpZGF0ZSBpZiB0YWJsZSBpcyB1c2luZyBpbmhlcml0YW5jZSBpdCBoYXMgYSBkaXNjcmltaW5hdG9yXG4gICAgICAgIC8vIGFsc28gdmFsaWRhdGUgaWYgZGlzY3JpbWluYXRvciB2YWx1ZXMgYXJlIG5vdCBlbXB0eSBhbmQgbm90IHJlcGVhdGVkXG4gICAgICAgIGlmIChlbnRpdHlNZXRhZGF0YS5pbmhlcml0YW5jZVBhdHRlcm4gPT09IFwiU1RJXCIgfHwgZW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiKSB7XG4gICAgICAgICAgICBpZiAoIWVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiB1c2luZyBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIGl0IHNob3VsZCBhbHNvIGhhdmUgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gRGlkIHlvdSBmb3JnZXQgdG8gcHV0IGRpc2NyaW1pbmF0b3IgY29sdW1uIG9wdGlvbnM/XCIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBoYXMgYW4gdW5kZWZpbmVkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIERpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgdmFyIHNhbWVEaXNjcmltaW5hdG9yVmFsdWVFbnRpdHlNZXRhZGF0YSA9IGFsbEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YSAhPT0gZW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgJiYgKG1ldGFkYXRhLmluaGVyaXRhbmNlUGF0dGVybiA9PT0gXCJTVElcIiB8fCBtZXRhZGF0YS50YWJsZVR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSA9PT0gZW50aXR5TWV0YWRhdGEuZGlzY3JpbWluYXRvclZhbHVlXG4gICAgICAgICAgICAgICAgICAgICYmIG1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5zb21lKGZ1bmN0aW9uIChwYXJlbnQpIHsgcmV0dXJuIGVudGl0eU1ldGFkYXRhLmluaGVyaXRhbmNlVHJlZS5pbmRleE9mKHBhcmVudCkgIT09IC0xOyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNhbWVEaXNjcmltaW5hdG9yVmFsdWVFbnRpdHlNZXRhZGF0YSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiRW50aXRpZXMgXCIgKyBlbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIgYW5kIFwiICsgc2FtZURpc2NyaW1pbmF0b3JWYWx1ZUVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBoYXZlIHRoZSBzYW1lIGRpc2NyaW1pbmF0b3IgdmFsdWVzLiBNYWtlIHN1cmUgdGhleSBhcmUgZGlmZmVyZW50IHdoaWxlIHVzaW5nIHRoZSBAQ2hpbGRFbnRpdHkgZGVjb3JhdG9yLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudC5yZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbkNvdW50LnJlbGF0aW9uLmlzT25lVG9PbmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlbGF0aW9uIGNvdW50IGNhbiBub3QgYmUgaW1wbGVtZW50ZWQgb24gTWFueVRvT25lIG9yIE9uZVRvT25lIHJlbGF0aW9ucy5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIShkcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpIHtcbiAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRDb2x1bW4gPSBkcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIuc3VwcG9ydGVkRGF0YVR5cGVzLmluZGV4T2Yobm9ybWFsaXplZENvbHVtbikgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVR5cGVOb3RTdXBwb3J0ZWRFcnJvcihjb2x1bW4sIG5vcm1hbGl6ZWRDb2x1bW4sIGRyaXZlci5vcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ubGVuZ3RoICYmIGRyaXZlci53aXRoTGVuZ3RoQ29sdW1uVHlwZXMuaW5kZXhPZihub3JtYWxpemVkQ29sdW1uKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDb2x1bW4gXCIgKyBjb2x1bW4ucHJvcGVydHlOYW1lICsgXCIgb2YgRW50aXR5IFwiICsgZW50aXR5TWV0YWRhdGEubmFtZSArIFwiIGRvZXMgbm90IHN1cHBvcnQgbGVuZ3RoIHByb3BlcnR5LlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT09IFwiZW51bVwiICYmICFjb2x1bW4uZW51bSAmJiAhY29sdW1uLmVudW1OYW1lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ29sdW1uIFxcXCJcIiArIGNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIlxcXCIgb2YgRW50aXR5IFxcXCJcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIlxcXCIgaXMgZGVmaW5lZCBhcyBlbnVtLCBidXQgbWlzc2luZyBcXFwiZW51bVxcXCIgb3IgXFxcImVudW1OYW1lXFxcIiBwcm9wZXJ0aWVzLlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICB2YXIgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc0dlbmVyYXRlZCAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ICE9PSBcInV1aWRcIjsgfSk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFcnJvciBpbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiBlbnRpdHkuIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhdXRvLWluY3JlbWVudCBjb2x1bW4gaW4gTXlTcWwgdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvciBteXNxbCB3ZSBhcmUgYWJsZSB0byBub3QgZGVmaW5lIGEgZGVmYXVsdCBzZWxlY3RlZCBkYXRhYmFzZSwgaW5zdGVhZCBhbGwgZW50aXRpZXMgY2FuIGhhdmUgdGhlaXIgZGF0YWJhc2VcbiAgICAgICAgLy8gZGVmaW5lZCBpbiB0aGVpciBkZWNvcmF0b3JzLiBUbyBtYWtlIGV2ZXJ5dGhpbmcgd29yayBlaXRoZXIgYWxsIGVudGl0aWVzIG11c3QgaGF2ZSBkYXRhYmFzZSBkZWZpbmUgYW5kIHdlXG4gICAgICAgIC8vIGNhbiBsaXZlIHdpdGhvdXQgZGF0YWJhc2Ugc2V0IGluIHRoZSBjb25uZWN0aW9uIG9wdGlvbnMsIGVpdGhlciBkYXRhYmFzZSBpbiB0aGUgY29ubmVjdGlvbiBvcHRpb25zIG11c3QgYmUgc2V0XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhc1dpdGhEYXRhYmFzZSA9IGFsbEVudGl0eU1ldGFkYXRhcy5maWx0ZXIoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBtZXRhZGF0YS5kYXRhYmFzZTsgfSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFzV2l0aERhdGFiYXNlLmxlbmd0aCA9PT0gMCAmJiAhZHJpdmVyLmRhdGFiYXNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb0Nvbm5lY3Rpb25PcHRpb25FcnJvcihcImRhdGFiYXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgIHZhciBjaGFyc2V0Q29sdW1ucyA9IGVudGl0eU1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5jaGFyc2V0OyB9KTtcbiAgICAgICAgICAgIGlmIChjaGFyc2V0Q29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDaGFyYWN0ZXIgc2V0IHNwZWNpZnlpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiBTcWwgU2VydmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIHJlbGF0aW9ucyBhcmUgYWxsIHdpdGhvdXQgaW5pdGlhbGl6ZWQgcHJvcGVydGllc1xuICAgICAgICB2YXIgZW50aXR5SW5zdGFuY2UgPSBlbnRpdHlNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNNYW55VG9NYW55IHx8IHJlbGF0aW9uLmlzT25lVG9NYW55KSB7XG4gICAgICAgICAgICAgICAgLy8gd2Ugc2tpcCByZWxhdGlvbnMgZm9yIHdoaWNoIHBlcnNpc3RlbmNlIGlzIGRpc2FibGVkIHNpbmNlIGluaXRpYWxpemF0aW9uIGluIHRoZW0gY2Fubm90IGhhcm0gc29tZWhvd1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGVudGl0eSByZWxhdGlvbiB2YWx1ZSBhbmQgY2hlY2sgaWYgaXRzIGFuIGFycmF5XG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uSW5pdGlhbGl6ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eUluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbkluaXRpYWxpemVkVmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5pdGlhbGl6ZWRSZWxhdGlvbkVycm9yKHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHZhbGlkYXRlIHJlbGF0aW9uc1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGpvaW4gdGFibGVzOlxuICAgICAgICAgICAgLy8gdXNpbmcgSm9pblRhYmxlIGlzIHBvc3NpYmxlIG9ubHkgb24gb25lIHNpZGUgb2YgdGhlIG1hbnktdG8tbWFueSByZWxhdGlvblxuICAgICAgICAgICAgLy8gdG9kbyhkaW1hKTogZml4XG4gICAgICAgICAgICAvLyBpZiAocmVsYXRpb24uam9pblRhYmxlKSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKCFyZWxhdGlvbi5pc01hbnlUb01hbnkpXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBVc2luZ0pvaW5UYWJsZUlzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7XG4gICAgICAgICAgICAvLyAgICAgLy8gaWYgdGhlcmUgaXMgaW52ZXJzZSBzaWRlIG9mIHRoZSByZWxhdGlvbiwgdGhlbiBjaGVjayBpZiBpdCBkb2VzIG5vdCBoYXZlIGpvaW4gdGFibGUgdG9vXG4gICAgICAgICAgICAvLyAgICAgaWYgKHJlbGF0aW9uLmhhc0ludmVyc2VTaWRlICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luVGFibGUpXG4gICAgICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBVc2luZ0pvaW5UYWJsZU9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGpvaW4gY29sdW1uczpcbiAgICAgICAgICAgIC8vIHVzaW5nIEpvaW5Db2x1bW4gaXMgcG9zc2libGUgb25seSBvbiBvbmUgc2lkZSBvZiB0aGUgcmVsYXRpb24gYW5kIG9uIG9uZS10by1vbmUsIG1hbnktdG8tb25lIHJlbGF0aW9uIHR5cGVzXG4gICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiByZWxhdGlvbiBpcyBvbmUtdG8tb25lIG9yIG1hbnktdG8tb25lXG4gICAgICAgICAgICAvLyB0b2RvKGRpbWEpOiBmaXhcbiAgICAgICAgICAgIC8qaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW4pIHtcblxuICAgICAgICAgICAgICAgIC8vIGpvaW4gY29sdW1uIGNhbiBiZSBhcHBsaWVkIG9ubHkgb24gb25lLXRvLW9uZSBhbmQgbWFueS10by1vbmUgcmVsYXRpb25zXG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5pc09uZVRvT25lICYmICFyZWxhdGlvbi5pc01hbnlUb09uZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzaW5nSm9pbkNvbHVtbklzTm90QWxsb3dlZEVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBpbnZlcnNlIHNpZGUgb2YgdGhlIHJlbGF0aW9uLCB0aGVuIGNoZWNrIGlmIGl0IGRvZXMgbm90IGhhdmUgam9pbiB0YWJsZSB0b29cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSW52ZXJzZVNpZGUgJiYgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW4gJiYgcmVsYXRpb24uaXNPbmVUb09uZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzaW5nSm9pbkNvbHVtbk9ubHlPbk9uZVNpZGVBbGxvd2VkRXJyb3IoZW50aXR5TWV0YWRhdGEsIHJlbGF0aW9uKTtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGpvaW4gY29sdW1uIHJlYWxseSBoYXMgcmVmZXJlbmNlZCBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uam9pbkNvbHVtbiAmJiAhcmVsYXRpb24uam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKGBKb2luIGNvbHVtbiBkb2VzIG5vdCBoYXZlIHJlZmVyZW5jZWQgY29sdW1uIHNldGApO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGl0cyBhIG9uZS10by1vbmUgcmVsYXRpb24gYW5kIEpvaW5Db2x1bW4gaXMgbWlzc2luZyBvbiBib3RoIHNpZGVzIG9mIHRoZSByZWxhdGlvblxuICAgICAgICAgICAgLy8gb3IgaXRzIG9uZS1zaWRlIHJlbGF0aW9uIHdpdGhvdXQgSm9pbkNvbHVtbiB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5qb2luQ29sdW1uICYmIHJlbGF0aW9uLmlzT25lVG9PbmUgJiYgKCFyZWxhdGlvbi5oYXNJbnZlcnNlU2lkZSB8fCAhcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW4pKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nSm9pbkNvbHVtbkVycm9yKGVudGl0eU1ldGFkYXRhLCByZWxhdGlvbik7Ki9cbiAgICAgICAgICAgIC8vIGlmIGl0cyBhIG1hbnktdG8tbWFueSByZWxhdGlvbiBhbmQgSm9pblRhYmxlIGlzIG1pc3Npbmcgb24gYm90aCBzaWRlcyBvZiB0aGUgcmVsYXRpb25cbiAgICAgICAgICAgIC8vIG9yIGl0cyBvbmUtc2lkZSByZWxhdGlvbiB3aXRob3V0IEpvaW5UYWJsZSB3ZSBzaG91bGQgZ2l2ZSBhbiBlcnJvclxuICAgICAgICAgICAgLy8gdG9kbyhkaW1hKTogZml4IGl0XG4gICAgICAgICAgICAvLyBpZiAoIXJlbGF0aW9uLmpvaW5UYWJsZSAmJiByZWxhdGlvbi5pc01hbnlUb01hbnkgJiYgKCFyZWxhdGlvbi5oYXNJbnZlcnNlU2lkZSB8fCAhcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5UYWJsZSkpXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IE1pc3NpbmdKb2luVGFibGVFcnJvcihlbnRpdHlNZXRhZGF0YSwgcmVsYXRpb24pO1xuICAgICAgICAgICAgLy8gdG9kbzogdmFsaWRhdGUgaWYgaXRzIG9uZS10by1vbmUgYW5kIHNpZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBqb2luIGNvbHVtbiBNVVNUIGhhdmUgaW52ZXJzZSBzaWRlXG4gICAgICAgICAgICAvLyB0b2RvOiB2YWxpZGF0ZSBpZiBpdHMgbWFueS10by1tYW55IGFuZCBzaWRlIHdoaWNoIGRvZXMgbm90IGhhdmUgam9pbiB0YWJsZSBNVVNUIGhhdmUgaW52ZXJzZSBzaWRlXG4gICAgICAgICAgICAvLyB0b2RvOiBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uLCBhbmQgaW52ZXJzZSBzaWRlIGlzIHNwZWNpZmllZCBvbmx5IG9uIG9uZSBzaWRlLCBzaGFsbCB3ZSBnaXZlIGVycm9yXG4gICAgICAgICAgICAvLyB0b2RvOiB3aXRoIG1lc3NhZ2UgbGlrZTogXCJJbnZlcnNlIHNpZGUgaXMgc3BlY2lmaWVkIG9ubHkgb24gb25lIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC4gU3BlY2lmeSBvbiBvdGhlciBzaWRlIHRvbyB0byBwcmV2ZW50IGNvbmZ1c2lvblwiLlxuICAgICAgICAgICAgLy8gdG9kbzogYWRkIHZhbGlkYXRpb24gaWYgdGhlcmUgdHdvIGVudGl0aWVzIHdpdGggdGhlIHNhbWUgdGFyZ2V0LCBhbmQgc2hvdyBlcnJvciBtZXNzYWdlIHdpdGggZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gKG1heWJlIGZpbGUgd2FzIHJlbmFtZWQvbW92ZWQgYnV0IGxlZnQgaW4gb3V0cHV0IGRpcmVjdG9yeSlcbiAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2x1bW5zIG9uIHRoZSBzYW1lIGNvbHVtbiBhcHBsaWVkLlxuICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgY29sdW1uIHR5cGUgaWYgaXMgbWlzc2luZyBpbiByZWxhdGlvbmFsIGRhdGFiYXNlcyAodGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgQ29sdW1uIHR5cGUgb2YgJHt0eXBlfSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5gKTspXG4gICAgICAgICAgICAvLyB0b2RvOiBpbmNsdWRlIGRyaXZlci1zcGVjaWZpYyBjaGVja3MuIGZvciBleGFtcGxlIGluIG1vbmdvZGIgZW1wdHkgcHJlZml4ZXMgYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgICAvLyB0b2RvOiBpZiBtdWx0aXBsZSBjb2x1bW5zIHdpdGggc2FtZSBuYW1lIC0gdGhyb3cgZXhjZXB0aW9uLCBpbmNsdWRpbmcgY2FzZXMgd2hlbiBjb2x1bW5zIGFyZSBpbiBlbWJlZHMgd2l0aCBzYW1lIHByZWZpeGVzIG9yIHdpdGhvdXQgcHJlZml4IGF0IGFsbFxuICAgICAgICAgICAgLy8gdG9kbzogaWYgbXVsdGlwbGUgcHJpbWFyeSBrZXkgdXNlZCwgYXQgbGVhc3Qgb25lIG9mIHRoZW0gbXVzdCBiZSB1bmlxdWUgb3IgQEluZGV4IGRlY29yYXRvciBtdXN0IGJlIHNldCBvbiBlbnRpdHlcbiAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGlmIGVudGl0eSB3aXRoIGR1cGxpY2F0ZSBuYW1lcywgc29tZSBkZWNvcmF0b3JzIGV4aXN0XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtYWtlIHN1cmUgY2FzY2FkZSByZW1vdmUgaXMgbm90IHNldCBmb3IgYm90aCBzaWRlcyBvZiByZWxhdGlvbnNoaXBzIChjYW4gYmUgc2V0IGluIE9uZVRvT25lIGRlY29yYXRvcnMpXG4gICAgICAgIGVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIGlzQ2lyY3VsYXJDYXNjYWRlUmVtb3ZlID0gcmVsYXRpb24uaXNDYXNjYWRlUmVtb3ZlICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiAmJiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaXNDYXNjYWRlUmVtb3ZlO1xuICAgICAgICAgICAgaWYgKGlzQ2lyY3VsYXJDYXNjYWRlUmVtb3ZlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcIiArIGVudGl0eU1ldGFkYXRhLm5hbWUgKyBcIiNcIiArIHJlbGF0aW9uLnByb3BlcnR5TmFtZSArIFwiIGFuZCBcIiArIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lICsgXCIjXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIgYm90aCBoYXMgY2FzY2FkZSByZW1vdmUgc2V0LiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiVGhpcyBtYXkgbGVhZCB0byB1bmV4cGVjdGVkIGNpcmN1bGFyIHJlbW92YWxzLiBQbGVhc2Ugc2V0IGNhc2NhZGUgcmVtb3ZlIG9ubHkgZnJvbSBvbmUgc2lkZSBvZiByZWxhdGlvbnNoaXAuXCIpO1xuICAgICAgICB9KTsgLy8gdG9kbzogbWF5YmUgYmV0dGVyIGp1c3QgZGVueSByZW1vdmFsIGZyb20gb25lIHRvIG9uZSByZWxhdGlvbiB3aXRob3V0IGpvaW4gY29sdW1uP1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBkZXBlbmRlbmNpZXMgb2YgdGhlIGVudGl0eSBtZXRhZGF0YXMuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhcykge1xuICAgICAgICB2YXIgZ3JhcGggPSBuZXcgRGVwR3JhcGgoKTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBncmFwaC5hZGROb2RlKGVudGl0eU1ldGFkYXRhLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgZW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBlbnRpdHlNZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gIXJlbGF0aW9uLmlzTnVsbGFibGU7IH0pXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGguYWRkRGVwZW5kZW5jeShlbnRpdHlNZXRhZGF0YS5uYW1lLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBncmFwaC5vdmVyYWxsT3JkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2lyY3VsYXJSZWxhdGlvbnNFcnJvcihlcnIudG9TdHJpbmcoKS5yZXBsYWNlKFwiRXJyb3I6IERlcGVuZGVuY3kgQ3ljbGUgRm91bmQ6IFwiLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBlYWdlciByZWxhdGlvbnMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGluIHRoZW0uXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGFWYWxpZGF0b3IucHJvdG90eXBlLnZhbGlkYXRlRWFnZXJSZWxhdGlvbnMgPSBmdW5jdGlvbiAoZW50aXR5TWV0YWRhdGFzKSB7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGEuZWFnZXJSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uICYmIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pc0VhZ2VyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2lyY3VsYXIgZWFnZXIgcmVsYXRpb25zIGFyZSBkaXNhbGxvd2VkLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAoZW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiI1wiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCIgY29udGFpbnMgXFxcImVhZ2VyOiB0cnVlXFxcIiwgYW5kIGl0cyBpbnZlcnNlIHNpZGUgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiI1wiICsgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLnByb3BlcnR5UGF0aCArIFwiIGNvbnRhaW5zIFxcXCJlYWdlcjogdHJ1ZVxcXCIgYXMgd2VsbC5cIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgUmVtb3ZlIFxcXCJlYWdlcjogdHJ1ZVxcXCIgZnJvbSBvbmUgc2lkZSBvZiB0aGUgcmVsYXRpb24uXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yO1xufSgpKTtcbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhVmFsaWRhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eU1ldGFkYXRhVmFsaWRhdG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNeXNxbERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbXlzcWwvTXlzcWxEcml2ZXJcIjtcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCI7XG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgRm9yZWlnbktleU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0ZvcmVpZ25LZXlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9tZXRhZGF0YS9JbmRleE1ldGFkYXRhXCI7XG5pbXBvcnQgeyBBdXJvcmFEYXRhQXBpRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9hdXJvcmEtZGF0YS1hcGkvQXVyb3JhRGF0YUFwaURyaXZlclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9vcmFjbGUvT3JhY2xlRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ3JlYXRlcyBFbnRpdHlNZXRhZGF0YSBmb3IganVuY3Rpb24gdGFibGVzLlxuICogSnVuY3Rpb24gdGFibGVzIGFyZSB0YWJsZXMgZ2VuZXJhdGVkIGJ5IG1hbnktdG8tbWFueSByZWxhdGlvbnMuXG4gKi9cbnZhciBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gSnVuY3Rpb25FbnRpdHlNZXRhZGF0YUJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIEVudGl0eU1ldGFkYXRhIGZvciB0aGUganVuY3Rpb24gb2YgdGhlIGdpdmVuIG1hbnktdG8tbWFueSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAocmVsYXRpb24sIGpvaW5UYWJsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSB0aGlzLmNvbGxlY3RSZWZlcmVuY2VkQ29sdW1ucyhyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgdmFyIGludmVyc2VSZWZlcmVuY2VkQ29sdW1ucyA9IHRoaXMuY29sbGVjdEludmVyc2VSZWZlcmVuY2VkQ29sdW1ucyhyZWxhdGlvbiwgam9pblRhYmxlKTtcbiAgICAgICAgdmFyIGpvaW5UYWJsZU5hbWUgPSBqb2luVGFibGUubmFtZSB8fCB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlTmFtZShyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWVXaXRob3V0UHJlZml4LCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lV2l0aG91dFByZWZpeCwgcmVsYXRpb24ucHJvcGVydHlQYXRoLCByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gPyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lIDogXCJcIik7XG4gICAgICAgIHZhciBlbnRpdHlNZXRhZGF0YSA9IG5ldyBFbnRpdHlNZXRhZGF0YSh7XG4gICAgICAgICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5UYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJqdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGRhdGFiYXNlOiBqb2luVGFibGUuZGF0YWJhc2UgfHwgcmVsYXRpb24uZW50aXR5TWV0YWRhdGEuZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBqb2luVGFibGUuc2NoZW1hIHx8IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnNjaGVtYSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLmJ1aWxkKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBvcmlnaW5hbCBzaWRlIGp1bmN0aW9uIGNvbHVtbnNcbiAgICAgICAgdmFyIGp1bmN0aW9uQ29sdW1ucyA9IHJlZmVyZW5jZWRDb2x1bW5zLm1hcChmdW5jdGlvbiAocmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuam9pbkNvbHVtbnMgPyBqb2luVGFibGUuam9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbkFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9PT0gcmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICEham9pbkNvbHVtbkFyZ3MubmFtZTtcbiAgICAgICAgICAgIH0pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBqb2luQ29sdW1uICYmIGpvaW5Db2x1bW4ubmFtZSA/IGpvaW5Db2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgIDogX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luVGFibGVDb2x1bW5OYW1lKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsIHJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lLCByZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uOiByZWZlcmVuY2VkQ29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAhcmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJlZmVyZW5jZWRDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIiB8fCByZWZlcmVuY2VkQ29sdW1uLnR5cGUgPT09IFwidXVpZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZlcmVuY2VkQ29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByZWZlcmVuY2VkQ29sdW1uLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcmVmZXJlbmNlZENvbHVtbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiByZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiByZWZlcmVuY2VkQ29sdW1uLnNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogcmVmZXJlbmNlZENvbHVtbi5jaGFyc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGF0aW9uOiByZWZlcmVuY2VkQ29sdW1uLmNvbGxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiByZWZlcmVuY2VkQ29sdW1uLnplcm9maWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQ6IHJlZmVyZW5jZWRDb2x1bW4uemVyb2ZpbGwgPyB0cnVlIDogcmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW06IHJlZmVyZW5jZWRDb2x1bW4uZW51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lOiByZWZlcmVuY2VkQ29sdW1uLmVudW1OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY3JlYXRlIGludmVyc2Ugc2lkZSBqdW5jdGlvbiBjb2x1bW5zXG4gICAgICAgIHZhciBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zID0gaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zLm1hcChmdW5jdGlvbiAoaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciBqb2luQ29sdW1uID0gam9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucyA/IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbkFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9PT0gaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAhIWpvaW5Db2x1bW5BcmdzLm5hbWU7XG4gICAgICAgICAgICB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lID0gam9pbkNvbHVtbiAmJiBqb2luQ29sdW1uLm5hbWUgPyBqb2luQ29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICA6IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlSW52ZXJzZUNvbHVtbk5hbWUocmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgsIGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZSwgaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW46IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcInZpcnR1YWxcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6ICFpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJ1dWlkXCIgfHwgaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIjM2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ6IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmNoYXJzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXRpb246IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmNvbGxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHplcm9maWxsOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCA/IHRydWUgOiBpbnZlcnNlUmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW06IGludmVyc2VSZWZlcmVuY2VkQ29sdW1uLmVudW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZTogaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW4uZW51bU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEdXBsaWNhdGVkQ29sdW1uTmFtZXMoanVuY3Rpb25Db2x1bW5zLCBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKTtcbiAgICAgICAgLy8gc2V0IGp1bmN0aW9uIHRhYmxlIGNvbHVtbnNcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duZXJDb2x1bW5zID0ganVuY3Rpb25Db2x1bW5zO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5pbnZlcnNlQ29sdW1ucyA9IGludmVyc2VKdW5jdGlvbkNvbHVtbnM7XG4gICAgICAgIGVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChqdW5jdGlvbkNvbHVtbnMpLCBmYWxzZSksIF9fcmVhZChpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKSwgZmFsc2UpO1xuICAgICAgICBlbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEgPSByZWxhdGlvbjsgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBqdW5jdGlvbiB0YWJsZSBmb3JlaWduIGtleXNcbiAgICAgICAgLy8gTm90ZTogVVBEQVRFIENBU0NBREUgY2xhdXNlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gT3JhY2xlLlxuICAgICAgICBlbnRpdHlNZXRhZGF0YS5mb3JlaWduS2V5cyA9IHJlbGF0aW9uLmNyZWF0ZUZvcmVpZ25LZXlDb25zdHJhaW50cyA/IFtcbiAgICAgICAgICAgIG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiBlbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGp1bmN0aW9uQ29sdW1ucyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uczogcmVmZXJlbmNlZENvbHVtbnMsXG4gICAgICAgICAgICAgICAgb25EZWxldGU6IHJlbGF0aW9uLm9uRGVsZXRlIHx8IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyID8gXCJOTyBBQ1RJT05cIiA6IHJlbGF0aW9uLm9uVXBkYXRlIHx8IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9yZWlnbktleU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczogaW52ZXJzZUp1bmN0aW9uQ29sdW1ucyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uczogaW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zLFxuICAgICAgICAgICAgICAgIG9uRGVsZXRlOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gPyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ub25EZWxldGUgOiBcIkNBU0NBREVcIixcbiAgICAgICAgICAgICAgICBvblVwZGF0ZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlclxuICAgICAgICAgICAgICAgICAgICA/IFwiTk8gQUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLm9uVXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiQ0FTQ0FERVwiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF0gOiBbXTtcbiAgICAgICAgLy8gY3JlYXRlIGp1bmN0aW9uIHRhYmxlIGluZGljZXNcbiAgICAgICAgZW50aXR5TWV0YWRhdGEub3duSW5kaWNlcyA9IFtcbiAgICAgICAgICAgIG5ldyBJbmRleE1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YTogZW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgY29sdW1uczoganVuY3Rpb25Db2x1bW5zLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSW5kZXhNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IGVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGludmVyc2VKdW5jdGlvbkNvbHVtbnMsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGVudGl0eU1ldGFkYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgICAgICAvLyBmaW5hbGx5IHJldHVybiBlbnRpdHkgbWV0YWRhdGFcbiAgICAgICAgcmV0dXJuIGVudGl0eU1ldGFkYXRhO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIHJlZmVyZW5jZWQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBqb2luIGNvbHVtbiBhcmdzLlxuICAgICAqL1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb2xsZWN0UmVmZXJlbmNlZENvbHVtbnMgPSBmdW5jdGlvbiAocmVsYXRpb24sIGpvaW5UYWJsZSkge1xuICAgICAgICB2YXIgaGFzQW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luVGFibGUuam9pbkNvbHVtbnMgPyBqb2luVGFibGUuam9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gISFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWpvaW5UYWJsZS5qb2luQ29sdW1ucyB8fCAoam9pblRhYmxlLmpvaW5Db2x1bW5zICYmICFoYXNBbnlSZWZlcmVuY2VkQ29sdW1uTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luVGFibGUuam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW4gPSByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5TmFtZSA9PT0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2VkQ29sdW1uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVmZXJlbmNlZCBjb2x1bW4gXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lICsgXCIgd2FzIG5vdCBmb3VuZCBpbiBlbnRpdHkgXCIgKyByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBpbnZlcnNlIHJlZmVyZW5jZWQgY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBqb2luIGNvbHVtbiBhcmdzLlxuICAgICAqL1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jb2xsZWN0SW52ZXJzZVJlZmVyZW5jZWRDb2x1bW5zID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBqb2luVGFibGUpIHtcbiAgICAgICAgdmFyIGhhc0ludmVyc2VKb2luQ29sdW1ucyA9ICEham9pblRhYmxlLmludmVyc2VKb2luQ29sdW1ucztcbiAgICAgICAgdmFyIGhhc0FueUludmVyc2VSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGhhc0ludmVyc2VKb2luQ29sdW1ucyA/IGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gISFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KSA6IGZhbHNlO1xuICAgICAgICBpZiAoIWhhc0ludmVyc2VKb2luQ29sdW1ucyB8fCAoaGFzSW52ZXJzZUpvaW5Db2x1bW5zICYmICFoYXNBbnlJbnZlcnNlUmVmZXJlbmNlZENvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGpvaW5UYWJsZS5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZWRDb2x1bW4gPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEub3duQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eU5hbWUgPT09IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVmZXJlbmNlZENvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlZmVyZW5jZWQgY29sdW1uIFwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uTmFtZSArIFwiIHdhcyBub3QgZm91bmQgaW4gZW50aXR5IFwiICsgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkQ29sdW1uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEp1bmN0aW9uRW50aXR5TWV0YWRhdGFCdWlsZGVyLnByb3RvdHlwZS5jaGFuZ2VEdXBsaWNhdGVkQ29sdW1uTmFtZXMgPSBmdW5jdGlvbiAoanVuY3Rpb25Db2x1bW5zLCBpbnZlcnNlSnVuY3Rpb25Db2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGp1bmN0aW9uQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChqdW5jdGlvbkNvbHVtbikge1xuICAgICAgICAgICAgaW52ZXJzZUp1bmN0aW9uQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnZlcnNlSnVuY3Rpb25Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoanVuY3Rpb25Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgPT09IGludmVyc2VKdW5jdGlvbkNvbHVtbi5naXZlbkRhdGFiYXNlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIganVuY3Rpb25Db2x1bW5OYW1lID0gX3RoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luVGFibGVDb2x1bW5EdXBsaWNhdGlvblByZWZpeChqdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUsIDEpO1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUgPSBqdW5jdGlvbkNvbHVtbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQ29sdW1uLmdpdmVuRGF0YWJhc2VOYW1lID0ganVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW52ZXJzZUp1bmN0aW9uQ29sdW1uTmFtZSA9IF90aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuam9pblRhYmxlQ29sdW1uRHVwbGljYXRpb25QcmVmaXgoaW52ZXJzZUp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGludmVyc2VKdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUgPSBpbnZlcnNlSnVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSnVuY3Rpb25Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgPSBpbnZlcnNlSnVuY3Rpb25Db2x1bW5OYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBKdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1KdW5jdGlvbkVudGl0eU1ldGFkYXRhQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogTWV0YWRhdGEgYXJncyB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqL1xudmFyIE1ldGFkYXRhVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWV0YWRhdGFVdGlscygpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBnaXZlbidzIGVudGl0eSBhbGwgaW5oZXJpdGVkIGNsYXNzZXMuXG4gICAgICogR2l2ZXMgaW4gb3JkZXIgZnJvbSBwYXJlbnRzIHRvIGNoaWxkcmVuLlxuICAgICAqIEZvciBleGFtcGxlIFBvc3QgZXh0ZW5kcyBDb250ZW50TW9kZWwgd2hpY2ggZXh0ZW5kcyBVbml0IGl0IHdpbGwgZ2l2ZVxuICAgICAqIFtVbml0LCBDb250ZW50TW9kZWwsIFBvc3RdXG4gICAgICovXG4gICAgTWV0YWRhdGFVdGlscy5nZXRJbmhlcml0YW5jZVRyZWUgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHZhciB0cmVlID0gW2VudGl0eV07XG4gICAgICAgIHZhciBnZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgICAgICAgICAgaWYgKHByb3RvICYmIHByb3RvLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0cmVlLnB1c2gocHJvdG8pO1xuICAgICAgICAgICAgICAgIGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YoZW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyB0YWJsZSBpcyBpbmhlcml0ZWQgZnJvbSBhbm90aGVyIHRhYmxlLlxuICAgICAqL1xuICAgIE1ldGFkYXRhVXRpbHMuaXNJbmhlcml0ZWQgPSBmdW5jdGlvbiAodGFyZ2V0MSwgdGFyZ2V0Mikge1xuICAgICAgICByZXR1cm4gdGFyZ2V0MS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0YXJnZXQyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmlsdGVycyBnaXZlbiBhcnJheSBvZiB0YXJnZXRzIGJ5IGEgZ2l2ZW4gY2xhc3Nlcy5cbiAgICAgKiBJZiBjbGFzc2VzIGFyZSBub3QgZ2l2ZW4sIHRoZW4gaXQgcmV0dXJucyBhcnJheSBpdHNlbGYuXG4gICAgICovXG4gICAgTWV0YWRhdGFVdGlscy5maWx0ZXJCeVRhcmdldCA9IGZ1bmN0aW9uIChhcnJheSwgY2xhc3Nlcykge1xuICAgICAgICBpZiAoIWNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0udGFyZ2V0ICYmIGNsYXNzZXMuaW5kZXhPZihpdGVtLnRhcmdldCkgIT09IC0xOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBNZXRhZGF0YVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IE1ldGFkYXRhVXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWV0YWRhdGFVdGlscy5qcy5tYXBcbiIsImltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvQ29sdW1uTWV0YWRhdGFcIjtcbmltcG9ydCB7IFVuaXF1ZU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1VuaXF1ZU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5TWV0YWRhdGEgfSBmcm9tIFwiLi4vbWV0YWRhdGEvRm9yZWlnbktleU1ldGFkYXRhXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQnVpbGRzIGpvaW4gY29sdW1uIGZvciB0aGUgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgb3duZXIgcmVsYXRpb25zLlxuICpcbiAqIENhc2VzIGl0IHNob3VsZCBjb3ZlcjpcbiAqIDEuIHdoZW4gam9pbiBjb2x1bW4gaXMgc2V0IHdpdGggY3VzdG9tIG5hbWUgYW5kIHdpdGhvdXQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZVxuICogd2UgbmVlZCBhdXRvbWF0aWNhbGx5IHNldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIC0gcHJpbWFyeSBpZHMgYnkgZGVmYXVsdFxuICogQEpvaW5Db2x1bW4oeyBuYW1lOiBcImN1c3RvbV9uYW1lXCIgfSlcbiAqXG4gKiAyLiB3aGVuIGpvaW4gY29sdW1uIGlzIHNldCB3aXRoIG9ubHkgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZVxuICogd2UgbmVlZCBhdXRvbWF0aWNhbGx5IHNldCBqb2luIGNvbHVtbiBuYW1lIC0gcmVsYXRpb24gbmFtZSArIHJlZmVyZW5jZWQgY29sdW1uIG5hbWVcbiAqIEBKb2luQ29sdW1uKHsgcmVmZXJlbmNlZENvbHVtbk5hbWU6IFwidGl0bGVcIiB9KVxuICpcbiAqIDMuIHdoZW4gam9pbiBjb2x1bW4gaXMgc2V0IHdpdGhvdXQgYm90aCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFuZCBqb2luIGNvbHVtbiBuYW1lXG4gKiB3ZSBuZWVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0IGJvdGggb2YgdGhlbVxuICogQEpvaW5Db2x1bW4oKVxuICpcbiAqIDQuIHdoZW4gam9pbiBjb2x1bW4gaXMgbm90IHNldCBhdCBhbGwgKGFzIGluIGNhc2Ugb2YgQE1hbnlUb09uZSByZWxhdGlvbilcbiAqIHdlIG5lZWQgdG8gY3JlYXRlIGpvaW4gY29sdW1uIGZvciBpdCB3aXRoIHByb3BlciByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFuZCBqb2luIGNvbHVtbiBuYW1lXG4gKlxuICogNS4gd2hlbiBtdWx0aXBsZSBqb2luIGNvbHVtbnMgc2V0IG5vbmUgb2YgcmVmZXJlbmNlZENvbHVtbk5hbWUgYW5kIG5hbWUgY2FuIGJlIG9wdGlvbmFsXG4gKiBib3RoIG9wdGlvbnMgYXJlIHJlcXVpcmVkXG4gKiBASm9pbkNvbHVtbihbXG4gKiAgICAgIHsgbmFtZTogXCJjYXRlZ29yeV90aXRsZVwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZTogXCJ0eXBlXCIgfSxcbiAqICAgICAgeyBuYW1lOiBcImNhdGVnb3J5X3RpdGxlXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBcIm5hbWVcIiB9LFxuICogXSlcbiAqXG4gKiBTaW5jZSBmb3IgbWFueS10by1vbmUgcmVsYXRpb25zIGhhdmluZyBKb2luQ29sdW1uIGRlY29yYXRvciBpcyBub3QgcmVxdWlyZWQsXG4gKiB3ZSBuZWVkIHRvIGdvIHRob3VnaHQgZWFjaCBtYW55LXRvLW9uZSByZWxhdGlvbiB3aXRob3V0IGpvaW4gY29sdW1uIGRlY29yYXRvciBzZXRcbiAqIGFuZCBjcmVhdGUgam9pbiBjb2x1bW4gbWV0YWRhdGEgYXJncyBmb3IgdGhlbS5cbiAqL1xudmFyIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgZm9yZWlnbiBrZXkgb2YgdGhlIG1hbnktdG8tb25lIG9yIG9uZS10by1vbmUgb3duZXIgcmVsYXRpb25zLlxuICAgICAqL1xuICAgIFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSB0aGlzLmNvbGxlY3RSZWZlcmVuY2VkQ29sdW1ucyhqb2luQ29sdW1ucywgcmVsYXRpb24pO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sbGVjdENvbHVtbnMoam9pbkNvbHVtbnMsIHJlbGF0aW9uLCByZWZlcmVuY2VkQ29sdW1ucyk7XG4gICAgICAgIGlmICghcmVmZXJlbmNlZENvbHVtbnMubGVuZ3RoIHx8ICFyZWxhdGlvbi5jcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMpXG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiB1bmRlZmluZWQsIGNvbHVtbnM6IGNvbHVtbnMsIHVuaXF1ZUNvbnN0cmFpbnQ6IHVuZGVmaW5lZCB9OyAvLyB0aGlzIGNhc2UgaXMgcG9zc2libGUgZm9yIG9uZS10by1vbmUgbm9uIG93bmluZyBzaWRlIGFuZCByZWxhdGlvbnMgd2l0aCBjcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMgPSBmYWxzZVxuICAgICAgICB2YXIgZm9yZWlnbktleSA9IG5ldyBGb3JlaWduS2V5TWV0YWRhdGEoe1xuICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICBuYW1pbmdTdHJhdGVneTogdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LFxuICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5zOiByZWZlcmVuY2VkQ29sdW1ucyxcbiAgICAgICAgICAgIG9uRGVsZXRlOiByZWxhdGlvbi5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiByZWxhdGlvbi5vblVwZGF0ZSxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IHJlbGF0aW9uLmRlZmVycmFibGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPcmFjbGUgZG9lcyBub3QgYWxsb3cgYm90aCBwcmltYXJ5IGFuZCB1bmlxdWUgY29uc3RyYWludHMgb24gdGhlIHNhbWUgY29sdW1uXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyICYmIGNvbHVtbnMuZXZlcnkoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSkpXG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiBmb3JlaWduS2V5LCBjb2x1bW5zOiBjb2x1bW5zLCB1bmlxdWVDb25zdHJhaW50OiB1bmRlZmluZWQgfTtcbiAgICAgICAgLy8gQ29ja3JvYWNoREIgcmVxdWlyZXMgVU5JUVVFIGNvbnN0cmFpbnRzIG9uIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgICAgICBpZiAocmVmZXJlbmNlZENvbHVtbnMubGVuZ3RoID4gMCAmJiByZWxhdGlvbi5pc09uZVRvT25lKSB7XG4gICAgICAgICAgICB2YXIgdW5pcXVlQ29uc3RyYWludCA9IG5ldyBVbmlxdWVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgZW50aXR5TWV0YWRhdGE6IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGZvcmVpZ25LZXkuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5yZWxhdGlvbkNvbnN0cmFpbnROYW1lKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgZm9yZWlnbktleS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5kYXRhYmFzZU5hbWU7IH0pKSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50LmJ1aWxkKHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneSk7XG4gICAgICAgICAgICByZXR1cm4geyBmb3JlaWduS2V5OiBmb3JlaWduS2V5LCBjb2x1bW5zOiBjb2x1bW5zLCB1bmlxdWVDb25zdHJhaW50OiB1bmlxdWVDb25zdHJhaW50IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9yZWlnbktleTogZm9yZWlnbktleSwgY29sdW1uczogY29sdW1ucywgdW5pcXVlQ29uc3RyYWludDogdW5kZWZpbmVkIH07XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ29sbGVjdHMgcmVmZXJlbmNlZCBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGpvaW4gY29sdW1uIGFyZ3MuXG4gICAgICovXG4gICAgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5wcm90b3R5cGUuY29sbGVjdFJlZmVyZW5jZWRDb2x1bW5zID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgaGFzQW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChqb2luQ29sdW1uQXJncykgeyByZXR1cm4gISFqb2luQ29sdW1uQXJncy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsgfSk7XG4gICAgICAgIHZhciBtYW55VG9PbmVXaXRob3V0Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmxlbmd0aCA9PT0gMCAmJiByZWxhdGlvbi5pc01hbnlUb09uZTtcbiAgICAgICAgdmFyIGhhc0pvaW5Db2x1bW5XaXRob3V0QW55UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBqb2luQ29sdW1ucy5sZW5ndGggPiAwICYmICFoYXNBbnlSZWZlcmVuY2VkQ29sdW1uTmFtZTtcbiAgICAgICAgaWYgKG1hbnlUb09uZVdpdGhvdXRKb2luQ29sdW1uIHx8IGhhc0pvaW5Db2x1bW5XaXRob3V0QW55UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsgLy8gY292ZXJzIGNhc2UzIGFuZCBjYXNlMVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gY2FzZXMgd2l0aCByZWZlcmVuY2VkIGNvbHVtbnMgZGVmaW5lZFxuICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1uID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLm93bkNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ucHJvcGVydHlOYW1lID09PSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lOyB9KTsgLy8gdG9kbzogY2FuIHdlIGFsc28gc2VhcmNoIGluIHJlbGF0aW9ucz9cbiAgICAgICAgICAgICAgICBpZiAoIXJlZmVyZW5jZWRDb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWZlcmVuY2VkIGNvbHVtbiBcIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWUgKyBcIiB3YXMgbm90IGZvdW5kIGluIGVudGl0eSBcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGpvaW4gY29sdW1uIGFyZ3MuXG4gICAgICovXG4gICAgUmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5wcm90b3R5cGUuY29sbGVjdENvbHVtbnMgPSBmdW5jdGlvbiAoam9pbkNvbHVtbnMsIHJlbGF0aW9uLCByZWZlcmVuY2VkQ29sdW1ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbHVtbnMubWFwKGZ1bmN0aW9uIChyZWZlcmVuY2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiByZWxhdGlvbiBoYXMgam9pbiBjb2x1bW4gd2l0aCBvbmx5IG5hbWUgc2V0IHdlIG5lZWQgdGhpcyBjaGVja1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW5NZXRhZGF0YUFyZyA9IGpvaW5Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCFqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5OYW1lIHx8IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbk5hbWUgPT09IHJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAhIWpvaW5Db2x1bW4ubmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW5OYW1lID0gam9pbkNvbHVtbk1ldGFkYXRhQXJnID8gam9pbkNvbHVtbk1ldGFkYXRhQXJnLm5hbWUgOiBfdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmpvaW5Db2x1bW5OYW1lKHJlbGF0aW9uLnByb3BlcnR5TmFtZSwgcmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uYWxDb2x1bW4gPSByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5vd25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZSA9PT0gam9pbkNvbHVtbk5hbWU7IH0pO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbmFsQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU1ldGFkYXRhOiByZWxhdGlvbi5lbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJ2aXJ0dWFsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHJlbGF0aW9uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBqb2luQ29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByZWZlcmVuY2VkQ29sdW1uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAhcmVmZXJlbmNlZENvbHVtbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVmZXJlbmNlZENvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiIHx8IHJlZmVyZW5jZWRDb2x1bW4udHlwZSA9PT0gXCJ1dWlkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIzNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmZXJlbmNlZENvbHVtbi5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlZmVyZW5jZWRDb2x1bW4ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogcmVmZXJlbmNlZENvbHVtbi5jaGFyc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogcmVmZXJlbmNlZENvbHVtbi5jb2xsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiByZWZlcmVuY2VkQ29sdW1uLnByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogcmVmZXJlbmNlZENvbHVtbi5zY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvZmlsbDogcmVmZXJlbmNlZENvbHVtbi56ZXJvZmlsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZDogcmVmZXJlbmNlZENvbHVtbi51bnNpZ25lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiByZWZlcmVuY2VkQ29sdW1uLmNvbW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bTogcmVmZXJlbmNlZENvbHVtbi5lbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1OYW1lOiByZWZlcmVuY2VkQ29sdW1uLmVudW1OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IHJlbGF0aW9uLmlzUHJpbWFyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsYWJsZTogcmVsYXRpb24uaXNOdWxsYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnJlZ2lzdGVyQ29sdW1uKHJlbGF0aW9uYWxDb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbi5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsgLy8gaXRzIGltcG9ydGFudCB0byBzZXQgaXQgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gc2V0IHJlZmVyZW5jZWQgY29sdW1uIGZvciB1c2VyIGRlZmluZWQgam9pbiBjb2x1bW5cbiAgICAgICAgICAgIHJlbGF0aW9uYWxDb2x1bW4udHlwZSA9IHJlZmVyZW5jZWRDb2x1bW4udHlwZTsgLy8gYWxzbyBzaW5jZSB0eXBlcyBvZiByZWxhdGlvbmFsIGNvbHVtbiBhbmQgam9pbiBjb2x1bW4gbXVzdCBiZSBlcXVhbCB3ZSBvdmVycmlkZSB1c2VyIGRlZmluZWQgY29sdW1uIHR5cGVcbiAgICAgICAgICAgIHJlbGF0aW9uYWxDb2x1bW4ucmVsYXRpb25NZXRhZGF0YSA9IHJlbGF0aW9uO1xuICAgICAgICAgICAgcmVsYXRpb25hbENvbHVtbi5idWlsZChfdGhpcy5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbmFsQ29sdW1uO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbkpvaW5Db2x1bW5CdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uSm9pbkNvbHVtbkJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25Kb2luQ29sdW1uQnVpbGRlci5qcy5tYXBcbiIsIi8qKlxuICogQ2hlY2sgbWV0YWRhdGEgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRhYmxlJ3MgY2hlY2sgY29uc3RyYWludHMuXG4gKi9cbnZhciBDaGVja01ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gQ2hlY2tNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBvcHRpb25zLmFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5OYW1lID0gb3B0aW9ucy5hcmdzLm5hbWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgY2hlY2sgY29uc3RyYWludCBwcm9wZXJ0aWVzLlxuICAgICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBlbnRpdHkgbWV0YWRhdGEncyBwcm9wZXJ0aWVzIG1hcCwgY29sdW1ucyBhbmQgcmVsYXRpb25zIGFyZSBidWlsdC5cbiAgICAgKi9cbiAgICBDaGVja01ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChuYW1pbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdpdmVuTmFtZSA/IHRoaXMuZ2l2ZW5OYW1lIDogbmFtaW5nU3RyYXRlZ3kuY2hlY2tDb25zdHJhaW50TmFtZSh0aGlzLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5leHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gQ2hlY2tNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBDaGVja01ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoZWNrTWV0YWRhdGEuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IE1vbmdvRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9tb25nb2RiL01vbmdvRHJpdmVyXCI7XG5pbXBvcnQgeyBGaW5kT3BlcmF0b3IgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcGVyYXRvclwiO1xuaW1wb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9IGZyb20gXCIuLi91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnNcIjtcbi8qKlxuICogVGhpcyBtZXRhZGF0YSBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgY29sdW1uLlxuICovXG52YXIgQ29sdW1uTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDb2x1bW5NZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBlJ3MgbGVuZ3RoIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBhIHByaW1hcnkga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBnZW5lcmF0ZWQgKGF1dG8gaW5jcmVtZW50IG9yIGdlbmVyYXRlZCBvdGhlciB3YXkpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0dlbmVyYXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBjYW4gY29udGFpbiBudWxscyBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgc2VsZWN0ZWQgYnkgcXVlcnkgYnVpbGRlciBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgaW5zZXJ0ZWQgYnkgZGVmYXVsdCBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5zZXJ0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gYWxsb3dzIHVwZGF0ZXMgb3Igbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFpFUk9GSUxMIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqIElmIHlvdSBzcGVjaWZ5IFpFUk9GSUxMIGZvciBhIG51bWVyaWMgY29sdW1uLCBNeVNRTCBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIFVOU0lHTkVEIGF0dHJpYnV0ZSB0byB0aGUgY29sdW1uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnplcm9maWxsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFVOU0lHTkVEIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuc2lnbmVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBjb2x1bW4gaXMgYW4gYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgdmlydHVhbC4gVmlydHVhbCBjb2x1bW5zIGFyZSBub3QgbWFwcGVkIHRvIHRoZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVmlydHVhbCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBpcyBkaXNjcmltaW5hdG9yLiBEaXNjcmltaW5hdG9yIGNvbHVtbnMgYXJlIG5vdCBtYXBwZWQgdG8gdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNEaXNjcmltaW5hdG9yID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29sdW1uIGlzIHRyZWUtbGV2ZWwgY29sdW1uLiBUcmVlLWxldmVsIGNvbHVtbnMgYXJlIHVzZWQgaW4gY2xvc3VyZSBlbnRpdGllcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmVlTGV2ZWwgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBlbnRpdHkgY3JlYXRpb24gZGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDcmVhdGVEYXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBjb2x1bW4gY29udGFpbnMgYW4gZW50aXR5IHVwZGF0ZSBkYXRlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZURhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBlbnRpdHkgZGVsZXRlIGRhdGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzRGVsZXRlRGF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29sdW1uIGNvbnRhaW5zIGFuIGVudGl0eSB2ZXJzaW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1ZlcnNpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBjb250YWlucyBhbiBvYmplY3QgaWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzT2JqZWN0SWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBuZXN0ZWQgc2V0J3MgbGVmdCBjb2x1bW4uXG4gICAgICAgICAqIFVzZWQgb25seSBpbiB0cmVlIGVudGl0aWVzIHdpdGggbmVzdGVkLXNldCB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc05lc3RlZFNldExlZnQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbHVtbiBpcyBuZXN0ZWQgc2V0J3MgcmlnaHQgY29sdW1uLlxuICAgICAgICAgKiBVc2VkIG9ubHkgaW4gdHJlZSBlbnRpdGllcyB3aXRoIG5lc3RlZC1zZXQgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNOZXN0ZWRTZXRSaWdodCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29sdW1uIGlzIG1hdGVyaWFsaXplZCBwYXRoJ3MgcGF0aCBjb2x1bW4uXG4gICAgICAgICAqIFVzZWQgb25seSBpbiB0cmVlIGVudGl0aWVzIHdpdGggbWF0ZXJpYWxpemVkIHBhdGggdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNNYXRlcmlhbGl6ZWRQYXRoID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVtYmVkZGVkTWV0YWRhdGEgPSBvcHRpb25zLmVtYmVkZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZENvbHVtbiA9IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy50YXJnZXQpXG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMubmFtZSlcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5EYXRhYmFzZU5hbWUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5uYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMudHlwZSlcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnR5cGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmxlbmd0aCA/IG9wdGlvbnMuYXJncy5vcHRpb25zLmxlbmd0aC50b1N0cmluZygpIDogXCJcIjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLndpZHRoKVxuICAgICAgICAgICAgdGhpcy53aWR0aCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLndpZHRoO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuY2hhcnNldClcbiAgICAgICAgICAgIHRoaXMuY2hhcnNldCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNoYXJzZXQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5jb2xsYXRpb24pXG4gICAgICAgICAgICB0aGlzLmNvbGxhdGlvbiA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNvbGxhdGlvbjtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnByaW1hcnkpXG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnByaW1hcnk7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0ID09PSBudWxsKSAvLyB0byBtYWtlIHN1cmUgZGVmYXVsdDogbnVsbCBpcyB0aGUgc2FtZSBhcyBudWxsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLm51bGxhYmxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5udWxsYWJsZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnNlbGVjdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc1NlbGVjdCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnNlbGVjdDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmluc2VydCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc0luc2VydCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmluc2VydDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnVwZGF0ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnVwZGF0ZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmlzVXBkYXRlID0gIW9wdGlvbnMuYXJncy5vcHRpb25zLnJlYWRvbmx5O1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuY29tbWVudClcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmNvbW1lbnQ7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMub25VcGRhdGUpXG4gICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMub25VcGRhdGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5zY2FsZSAhPT0gbnVsbCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnNjYWxlO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuemVyb2ZpbGwpIHtcbiAgICAgICAgICAgIHRoaXMuemVyb2ZpbGwgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy56ZXJvZmlsbDtcbiAgICAgICAgICAgIHRoaXMudW5zaWduZWQgPSB0cnVlOyAvLyBpZiB5b3Ugc3BlY2lmeSBaRVJPRklMTCBmb3IgYSBudW1lcmljIGNvbHVtbiwgTXlTUUwgYXV0b21hdGljYWxseSBhZGRzIHRoZSBVTlNJR05FRCBhdHRyaWJ1dGUgdG8gdGhlIGNvbHVtblxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy51bnNpZ25lZClcbiAgICAgICAgICAgIHRoaXMudW5zaWduZWQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy51bnNpZ25lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnByZWNpc2lvbiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMucHJlY2lzaW9uO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudW0gPSBPYmplY3Qua2V5cyhvcHRpb25zLmFyZ3Mub3B0aW9ucy5lbnVtKVxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbnVtZXJpYyBrZXlzIC0gdHlwZXNjcmlwdCBudW1lcmljIGVudW0gdHlwZXMgZ2VuZXJhdGUgdGhlbVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIHRoZSBkb2N1bWVudGF0aW9uOiDigJxkZWNsYXJhdGlvbiBtZXJnaW5n4oCdIG1lYW5zIHRoYXQgdGhlIGNvbXBpbGVyIG1lcmdlcyB0d28gc2VwYXJhdGUgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHdpdGggdGhlIHNhbWUgbmFtZSBpbnRvIGEgc2luZ2xlIGRlZmluaXRpb24uIFRoaXMgY29uY2VwdCBpcyBvZnRlbiB1c2VkIHRvIG1lcmdlIGVudW0gd2l0aCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgaW4gbmFtZXNwYWNlIHdlIGRlZmluZSBlLmcuIHV0aWxpdHkgbWV0aG9kcyBmb3IgY3JlYXRpbmcgZW51bS4gVGhpcyBpcyB3ZWxsIGtub3duIGluIG90aGVyIGxhbmd1YWdlc1xuICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIEphdmEgKGVudW0gbWV0aG9kcykuIEhlcmUgaW4gY2FzZSBpZiBlbnVtIGhhdmUgZnVuY3Rpb24sIHdlIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gbWV0YWRhdGEsIG90aGVyd2lzZVxuICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZWQgU1FMIHN0YXRlbWVudHMgY29udGFpbnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gd2hpY2ggbGVhZHMgaW50byBzeW50YXggZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYXQgZGF0YWJhc2Ugc2lkZS5cbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBpc05hTigra2V5KSAmJiB0eXBlb2Ygb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bVtrZXldICE9PSBcImZ1bmN0aW9uXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bVtrZXldOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW51bSA9IG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmVudW1OYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudW1OYW1lID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZW51bU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmFzRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5hc0V4cHJlc3Npb24gPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5hc0V4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFR5cGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5nZW5lcmF0ZWRUeXBlID8gb3B0aW9ucy5hcmdzLm9wdGlvbnMuZ2VuZXJhdGVkVHlwZSA6IFwiVklSVFVBTFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgICAgICAgdGhpcy5oc3RvcmVUeXBlID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuaHN0b3JlVHlwZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLmFycmF5KVxuICAgICAgICAgICAgdGhpcy5pc0FycmF5ID0gb3B0aW9ucy5hcmdzLm9wdGlvbnMuYXJyYXk7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3MubW9kZSkge1xuICAgICAgICAgICAgdGhpcy5pc1ZpcnR1YWwgPSBvcHRpb25zLmFyZ3MubW9kZSA9PT0gXCJ2aXJ0dWFsXCI7XG4gICAgICAgICAgICB0aGlzLmlzVHJlZUxldmVsID0gb3B0aW9ucy5hcmdzLm1vZGUgPT09IFwidHJlZUxldmVsXCI7XG4gICAgICAgICAgICB0aGlzLmlzQ3JlYXRlRGF0ZSA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcImNyZWF0ZURhdGVcIjtcbiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVEYXRlID0gb3B0aW9ucy5hcmdzLm1vZGUgPT09IFwidXBkYXRlRGF0ZVwiO1xuICAgICAgICAgICAgdGhpcy5pc0RlbGV0ZURhdGUgPSBvcHRpb25zLmFyZ3MubW9kZSA9PT0gXCJkZWxldGVEYXRlXCI7XG4gICAgICAgICAgICB0aGlzLmlzVmVyc2lvbiA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcInZlcnNpb25cIjtcbiAgICAgICAgICAgIHRoaXMuaXNPYmplY3RJZCA9IG9wdGlvbnMuYXJncy5tb2RlID09PSBcIm9iamVjdElkXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncy5vcHRpb25zLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG9wdGlvbnMuYXJncy5vcHRpb25zLnRyYW5zZm9ybWVyO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzLm9wdGlvbnMuc3BhdGlhbEZlYXR1cmVUeXBlKVxuICAgICAgICAgICAgdGhpcy5zcGF0aWFsRmVhdHVyZVR5cGUgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcGF0aWFsRmVhdHVyZVR5cGU7XG4gICAgICAgIGlmIChvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcmlkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLnNyaWQgPSBvcHRpb25zLmFyZ3Mub3B0aW9ucy5zcmlkO1xuICAgICAgICBpZiAodGhpcy5pc1RyZWVMZXZlbClcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLnRyZWVMZXZlbDtcbiAgICAgICAgaWYgKHRoaXMuaXNDcmVhdGVEYXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudHlwZSlcbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jcmVhdGVEYXRlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuY3JlYXRlRGF0ZURlZmF1bHQ7IH07XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5jcmVhdGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuY3JlYXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZURhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLnVwZGF0ZURhdGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdClcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy51cGRhdGVEYXRlRGVmYXVsdDsgfTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vblVwZGF0ZSlcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudXBkYXRlRGF0ZURlZmF1bHQ7XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy51cGRhdGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMudXBkYXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RlbGV0ZURhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLmRlbGV0ZURhdGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNOdWxsYWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5kZWxldGVEYXRlTnVsbGFibGU7XG4gICAgICAgICAgICAvLyBza2lwIHByZWNpc2lvbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQgdG8gXCJudWxsXCIgaW4gY29sdW1uIG9wdGlvbnMuIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBwcmVjaXNpb24gaWYgaXQgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFyZ3Mub3B0aW9ucy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5kZWxldGVEYXRlUHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMuZGVsZXRlRGF0ZVByZWNpc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1ZlcnNpb24pXG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy52ZXJzaW9uO1xuICAgICAgICBpZiAob3B0aW9ucy5jbG9zdXJlVHlwZSlcbiAgICAgICAgICAgIHRoaXMuY2xvc3VyZVR5cGUgPSBvcHRpb25zLmNsb3N1cmVUeXBlO1xuICAgICAgICBpZiAob3B0aW9ucy5uZXN0ZWRTZXRMZWZ0KVxuICAgICAgICAgICAgdGhpcy5pc05lc3RlZFNldExlZnQgPSBvcHRpb25zLm5lc3RlZFNldExlZnQ7XG4gICAgICAgIGlmIChvcHRpb25zLm5lc3RlZFNldFJpZ2h0KVxuICAgICAgICAgICAgdGhpcy5pc05lc3RlZFNldFJpZ2h0ID0gb3B0aW9ucy5uZXN0ZWRTZXRSaWdodDtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF0ZXJpYWxpemVkUGF0aClcbiAgICAgICAgICAgIHRoaXMuaXNNYXRlcmlhbGl6ZWRQYXRoID0gb3B0aW9ucy5tYXRlcmlhbGl6ZWRQYXRoO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZW50aXR5IGlkIG1hcCBmcm9tIHRoZSBnaXZlbiBlbnRpdHkgaWRzIGFycmF5LlxuICAgICAqL1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGVWYWx1ZU1hcCA9IGZ1bmN0aW9uICh2YWx1ZSwgdXNlRGF0YWJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHVzZURhdGFiYXNlTmFtZSA9PT0gdm9pZCAwKSB7IHVzZURhdGFiYXNlTmFtZSA9IGZhbHNlOyB9XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZXhhbXBsZTogcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdLmlkIHdoZXJlIFwiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIgYW5kIFwiY291bnRlcnNcIiBhcmUgZW1iZWRkZWRzXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCB2YWx1ZSBvZiBcImlkXCIgY29sdW1uIGZyb20gdGhlIHBvc3QgcmVhbCBlbnRpdHkgb2JqZWN0IGFuZCByZXR1cm4gaXQgaW4gYVxuICAgICAgICAgICAgLy8geyBkYXRhOiB7IGluZm9ybWF0aW9uOiB7IGNvdW50ZXJzOiB7IGlkOiAuLi4gfSB9IH0gfSBmb3JtYXRcbiAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXAgLSB3ZSBleHRyYWN0IGFsbCBwYXJlbnQgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoaXMgY29sdW1uLCBlLmcuIFtkYXRhLCBpbmZvcm1hdGlvbiwgY291bnRlcnNdXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcyksIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIG5vdyBuZWVkIHRvIGFjY2VzcyBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10gdG8gZ2V0IGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBjb3VudGVyc1xuICAgICAgICAgICAgLy8gYW5kIG9uIGVhY2ggc3RlcCB3ZSBuZWVkIHRvIGNyZWF0ZSBjb21wbGV4IGxpdGVyYWwgb2JqZWN0LCBlLmcuIGZpcnN0IHsgZGF0YSB9LFxuICAgICAgICAgICAgLy8gdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb24gfSB9LCB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVycyB9IH0gfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uOiB7IGNvdW50ZXJzOiBbdGhpcy5wcm9wZXJ0eU5hbWVdOiBlbnRpdHlbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXVt0aGlzLnByb3BlcnR5TmFtZV0gfSB9IH1cbiAgICAgICAgICAgIC8vIHRoaXMgcmVjdXJzaXZlIGZ1bmN0aW9uIGhlbHBzIGRvaW5nIHRoYXRcbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZXMsIG1hcCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBbcHJvcGVydHlOYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xKHByb3BlcnR5TmFtZXMsIG1hcFtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBidWdmaXggZm9yICM3MjAgd2hlbiBpbmNyZW1lbnQgbnVtYmVyIGlzIGJpZ2ludCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdHMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAoKF90aGlzLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBfdGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwicm93aWRcIikgJiYgX3RoaXMudHlwZSA9PT0gXCJiaWdpbnRcIiAmJiB2YWx1ZSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgIG1hcFt1c2VEYXRhYmFzZU5hbWUgPyBfdGhpcy5kYXRhYmFzZU5hbWUgOiBfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMShwcm9wZXJ0eU5hbWVzLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgLy8gdGhpcyBpcyBidWdmaXggZm9yICM3MjAgd2hlbiBpbmNyZW1lbnQgbnVtYmVyIGlzIGJpZ2ludCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdHMgYSBzdHJpbmdcbiAgICAgICAgICAgIGlmICgodGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIgfHwgdGhpcy5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwicm93aWRcIikgJiYgdGhpcy50eXBlID09PSBcImJpZ2ludFwiICYmIHZhbHVlICE9PSBudWxsKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBfYSA9IHt9LCBfYVt1c2VEYXRhYmFzZU5hbWUgPyB0aGlzLmRhdGFiYXNlTmFtZSA6IHRoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlLCBfYTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgY29sdW1uIHZhbHVlIGFuZCByZXR1cm5zIGl0cyBjb2x1bW4gbmFtZSB3aXRoIHRoaXMgdmFsdWUgaW4gYSBsaXRlcmFsIG9iamVjdC5cbiAgICAgKiBJZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWQgKG9yIHJlY3Vyc2l2ZSBlbWJlZGRlZCkgaXQgcmV0dXJucyBjb21wbGV4IGxpdGVyYWwgb2JqZWN0LlxuICAgICAqXG4gICAgICogRXhhbXBsZXMgd2hhdCB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIGRlcGVuZCBpZiB0aGlzIGNvbHVtbiBpcyBpbiBlbWJlZHMuXG4gICAgICogeyBpZDogMSB9IG9yIHsgdGl0bGU6IFwiaGVsbG9cIiB9LCB7IGNvdW50ZXJzOiB7IGNvZGU6IDEgfSB9LCB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnM6IHsgY29kZTogMSB9IH0gfSB9XG4gICAgICovXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmdldEVudGl0eVZhbHVlTWFwID0gZnVuY3Rpb24gKGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmV0dXJuTnVsbHMgPSBmYWxzZTsgLy8gb3B0aW9ucyAmJiBvcHRpb25zLnNraXBOdWxscyA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7IC8vIHRvZG86IHJlbW92ZSBpZiBjdXJyZW50IHdpbGwgbm90IGJyaW5nIHByb2JsZW1zLCB1bmNvbW1lbnQgaWYgaXQgd2lsbC5cbiAgICAgICAgLy8gZXh0cmFjdCBjb2x1bW4gdmFsdWUgZnJvbSBlbWJlZHMgb2YgZW50aXR5IGlmIGNvbHVtbiBpcyBpbiBlbWJlZGRlZFxuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAvLyBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZGRlZHNcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHZhbHVlIG9mIFwiaWRcIiBjb2x1bW4gZnJvbSB0aGUgcG9zdCByZWFsIGVudGl0eSBvYmplY3QgYW5kIHJldHVybiBpdCBpbiBhXG4gICAgICAgICAgICAvLyB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnM6IHsgaWQ6IC4uLiB9IH0gfSB9IGZvcm1hdFxuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWVzID0gX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGlzRW1iZWRkZWRBcnJheV8xID0gdGhpcy5lbWJlZGRlZE1ldGFkYXRhLmlzQXJyYXk7XG4gICAgICAgICAgICAvLyBub3cgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdIHRvIGdldCBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgY291bnRlcnNcbiAgICAgICAgICAgIC8vIGFuZCBvbiBlYWNoIHN0ZXAgd2UgbmVlZCB0byBjcmVhdGUgY29tcGxleCBsaXRlcmFsIG9iamVjdCwgZS5nLiBmaXJzdCB7IGRhdGEgfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uIH0gfSwgdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnMgfSB9IH0sXG4gICAgICAgICAgICAvLyB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogW3RoaXMucHJvcGVydHlOYW1lXTogZW50aXR5W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdIH0gfSB9XG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiBoZWxwcyBkb2luZyB0aGF0XG4gICAgICAgICAgICB2YXIgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMiA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWVzLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1hcCA9IGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzIocHJvcGVydHlOYW1lcywgdmFsdWVbcHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzdWJtYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYSA9IHt9LCBfYVtwcm9wZXJ0eU5hbWVdID0gc3VibWFwLCBfYTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0VtYmVkZGVkQXJyYXlfMSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9hID0ge30sIF9hW190aGlzLnByb3BlcnR5TmFtZV0gPSB2W190aGlzLnByb3BlcnR5TmFtZV0sIF9hKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtfdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgJiYgKHJldHVybk51bGxzID09PSBmYWxzZSB8fCB2YWx1ZVtfdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2IgPSB7fSwgX2JbX3RoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlW190aGlzLnByb3BlcnR5TmFtZV0sIF9iO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG1hcCA9IGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzIocHJvcGVydHlOYW1lcywgZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXApLmxlbmd0aCA+IDAgPyBtYXAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb25NZXRhZGF0YSAmJiBlbnRpdHlbdGhpcy5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5TmFtZV0gJiYgZW50aXR5W3RoaXMucmVsYXRpb25NZXRhZGF0YS5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5qb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWVNYXAoZW50aXR5W190aGlzLnJlbGF0aW9uTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sIF9hW3RoaXMucHJvcGVydHlOYW1lXSA9IG1hcCwgX2E7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgJiYgKHJldHVybk51bGxzID09PSBmYWxzZSB8fCBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdICE9PSBudWxsKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9iID0ge30sIF9iW3RoaXMucHJvcGVydHlOYW1lXSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV0sIF9iO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICogSWYgY29sdW1uIGlzIGluIGVtYmVkZGVkIChvciByZWN1cnNpdmUgZW1iZWRkZWQpIGl0IGV4dHJhY3RzIGl0cyB2YWx1ZSBmcm9tIHRoZXJlLlxuICAgICAqL1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHksIHRyYW5zZm9ybSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSB2b2lkIDApIHsgdHJhbnNmb3JtID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRkZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgdmFyIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAvLyBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZGRlZHNcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IHZhbHVlIG9mIFwiaWRcIiBjb2x1bW4gZnJvbSB0aGUgcG9zdCByZWFsIGVudGl0eSBvYmplY3RcbiAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXAgLSB3ZSBleHRyYWN0IGFsbCBwYXJlbnQgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHJlbGF0aXZlIHRvIHRoaXMgY29sdW1uLCBlLmcuIFtkYXRhLCBpbmZvcm1hdGlvbiwgY291bnRlcnNdXG4gICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcyksIGZhbHNlKTtcbiAgICAgICAgICAgIHZhciBpc0VtYmVkZGVkQXJyYXkgPSB0aGlzLmVtYmVkZGVkTWV0YWRhdGEuaXNBcnJheTtcbiAgICAgICAgICAgIC8vIG5leHQgd2UgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdW3RoaXMucHJvcGVydHlOYW1lXSB0byBnZXQgY29sdW1uIHZhbHVlIGZyb20gdGhlIGNvdW50ZXJzXG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0YWtlcyBhcnJheSBvZiBnZW5lcmF0ZWQgcHJvcGVydHkgbmFtZXMgYW5kIGdldHMgdGhlIHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXSBlbWJlZFxuICAgICAgICAgICAgdmFyIGV4dHJhY3RFbWJlZGRlZENvbHVtblZhbHVlXzMgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lcywgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgJiYgdmFsdWUgPyBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8zKHByb3BlcnR5TmFtZXMsIHZhbHVlW3Byb3BlcnR5TmFtZV0pIDogdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBnZXQgbmVzdGVkIGVtYmVkIG9iamVjdCB3ZSBnZXQgaXRzIGNvbHVtbiwgZS5nLiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRPYmplY3QgPSBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8zKHByb3BlcnR5TmFtZXMsIGVudGl0eSk7XG4gICAgICAgICAgICBpZiAoZW1iZWRkZWRPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGlvbk1ldGFkYXRhICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5nZXRFbnRpdHlWYWx1ZShlbWJlZGRlZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZWxhdGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gJiYgZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0ICYmICEoZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKGVtYmVkZGVkT2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgIShlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZW1iZWRkZWRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucmVmZXJlbmNlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VtYmVkZGVkQXJyYXkgJiYgQXJyYXkuaXNBcnJheShlbWJlZGRlZE9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbWJlZGRlZE9iamVjdC5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG9bX3RoaXMucHJvcGVydHlOYW1lXTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtYmVkZGVkT2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBuYW1lIGJ5IHByb3BlcnR5IG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb25NZXRhZGF0YSAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHRoaXMucmVsYXRpb25NZXRhZGF0YS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSAmJiAhKHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBGdW5jdGlvbikgJiYgIShyZWxhdGVkRW50aXR5IGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZWxhdGVkRW50aXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSAmJiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgT2JqZWN0ICYmICEoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEZpbmRPcGVyYXRvcikgJiYgIShlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICEoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgIShlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0aGlzLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgdmFsdWUgPSBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybVRvKHRoaXMudHJhbnNmb3JtZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBnaXZlbiBlbnRpdHkncyBjb2x1bW4gdmFsdWUuXG4gICAgICogVXNpbmcgb2YgdGhpcyBtZXRob2QgaGVscHMgdG8gc2V0IGVudGl0eSByZWxhdGlvbidzIHZhbHVlIG9mIHRoZSBsYXp5IGFuZCBub24tbGF6eSByZWxhdGlvbnMuXG4gICAgICovXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLnNldEVudGl0eVZhbHVlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV80ID0gZnVuY3Rpb24gKGVtYmVkZGVkTWV0YWRhdGFzLCBtYXApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIW9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgLy8gICAgIG9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0gPSBlbWJlZGRlZE1ldGFkYXRhLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBbZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eU5hbWVdID0gZW1iZWRkZWRNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfNChlbWJlZGRlZE1ldGFkYXRhcywgbWFwW2VtYmVkZGVkTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfNChfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLmVtYmVkZGVkTWV0YWRhdGFUcmVlKSwgZmFsc2UpLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gd2Ugd3JpdGUgYSBkZWVwIG9iamVjdCBpbiB0aGlzIGVudGl0eSBvbmx5IGlmIHRoZSBjb2x1bW4gaXMgdmlydHVhbFxuICAgICAgICAgICAgLy8gYmVjYXVzZSBpZiBpdHMgbm90IHZpcnR1YWwgaXQgbWVhbnMgdGhlIHVzZXIgZGVmaW5lZCBhIHJlYWwgY29sdW1uIGZvciB0aGlzIHJlbGF0aW9uXG4gICAgICAgICAgICAvLyBhbHNvIHdlIGRvbid0IGRvIGl0IGlmIGNvbHVtbiBpcyBpbnNpZGUgYSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmVudGl0eU1ldGFkYXRhLmlzSnVuY3Rpb24gJiYgdGhpcy5pc1ZpcnR1YWwgJiYgdGhpcy5yZWZlcmVuY2VkQ29sdW1uICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUgIT09IHRoaXMucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5wcm9wZXJ0eU5hbWUgaW4gZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV1bdGhpcy5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudGl0eVt0aGlzLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVBhdGggPSB0aGlzLmJ1aWxkUHJvcGVydHlQYXRoKCk7XG4gICAgICAgIHRoaXMucHJvcGVydHlBbGlhc05hbWUgPSB0aGlzLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lID0gdGhpcy5idWlsZERhdGFiYXNlTmFtZShjb25uZWN0aW9uKTtcbiAgICAgICAgdGhpcy5kYXRhYmFzZVBhdGggPSB0aGlzLmJ1aWxkRGF0YWJhc2VQYXRoKCk7XG4gICAgICAgIHRoaXMuZGF0YWJhc2VOYW1lV2l0aG91dFByZWZpeGVzID0gY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jb2x1bW5OYW1lKHRoaXMucHJvcGVydHlOYW1lLCB0aGlzLmdpdmVuRGF0YWJhc2VOYW1lLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgQ29sdW1uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGF0aCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVkTWV0YWRhdGEgJiYgdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMubGVuZ3RoKVxuICAgICAgICAgICAgcGF0aCA9IHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmpvaW4oXCIuXCIpICsgXCIuXCI7XG4gICAgICAgIHBhdGggKz0gdGhpcy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIC8vIHdlIGFkZCByZWZlcmVuY2UgY29sdW1uIHRvIHByb3BlcnR5IHBhdGggb25seSBpZiB0aGlzIGNvbHVtbiBpcyB2aXJ0dWFsXG4gICAgICAgIC8vIGJlY2F1c2UgaWYgaXRzIG5vdCB2aXJ0dWFsIGl0IG1lYW5zIHVzZXIgZGVmaW5lZCBhIHJlYWwgY29sdW1uIGZvciB0aGlzIHJlbGF0aW9uXG4gICAgICAgIC8vIGFsc28gd2UgZG9uJ3QgZG8gaXQgaWYgY29sdW1uIGlzIGluc2lkZSBhIGp1bmN0aW9uIHRhYmxlXG4gICAgICAgIGlmICghdGhpcy5lbnRpdHlNZXRhZGF0YS5pc0p1bmN0aW9uICYmIHRoaXMuaXNWaXJ0dWFsICYmIHRoaXMucmVmZXJlbmNlZENvbHVtbiAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lICE9PSB0aGlzLnByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgIHBhdGggKz0gXCIuXCIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIENvbHVtbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZERhdGFiYXNlUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5lbWJlZGRlZE1ldGFkYXRhICYmIHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgIHBhdGggPSB0aGlzLmVtYmVkZGVkTWV0YWRhdGEucGFyZW50UHJvcGVydHlOYW1lcy5qb2luKFwiLlwiKSArIFwiLlwiO1xuICAgICAgICBwYXRoICs9IHRoaXMuZGF0YWJhc2VOYW1lO1xuICAgICAgICAvLyB3ZSBhZGQgcmVmZXJlbmNlIGNvbHVtbiB0byBwcm9wZXJ0eSBwYXRoIG9ubHkgaWYgdGhpcyBjb2x1bW4gaXMgdmlydHVhbFxuICAgICAgICAvLyBiZWNhdXNlIGlmIGl0cyBub3QgdmlydHVhbCBpdCBtZWFucyB1c2VyIGRlZmluZWQgYSByZWFsIGNvbHVtbiBmb3IgdGhpcyByZWxhdGlvblxuICAgICAgICAvLyBhbHNvIHdlIGRvbid0IGRvIGl0IGlmIGNvbHVtbiBpcyBpbnNpZGUgYSBqdW5jdGlvbiB0YWJsZVxuICAgICAgICBpZiAoIXRoaXMuZW50aXR5TWV0YWRhdGEuaXNKdW5jdGlvbiAmJiB0aGlzLmlzVmlydHVhbCAmJiB0aGlzLnJlZmVyZW5jZWRDb2x1bW4gJiYgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSAhPT0gdGhpcy5kYXRhYmFzZU5hbWUpXG4gICAgICAgICAgICBwYXRoICs9IFwiLlwiICsgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfTtcbiAgICBDb2x1bW5NZXRhZGF0YS5wcm90b3R5cGUuYnVpbGREYXRhYmFzZU5hbWUgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB2YXIgcHJvcGVydHlOYW1lcyA9IHRoaXMuZW1iZWRkZWRNZXRhZGF0YSA/IHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcmVmaXhlcyA6IFtdO1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikgLy8gd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIGVtYmVkZGVkIG5hbWUgZm9yIHRoZSBtb25nb2RiIGNvbHVtbiBuYW1lc1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lcyA9IFtdO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5jb2x1bW5OYW1lKHRoaXMucHJvcGVydHlOYW1lLCB0aGlzLmdpdmVuRGF0YWJhc2VOYW1lLCBwcm9wZXJ0eU5hbWVzKTtcbiAgICB9O1xuICAgIHJldHVybiBDb2x1bW5NZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db2x1bW5NZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgZW1iZWRkZWQgcHJvcGVydHkuXG4gKi9cbnZhciBFbWJlZGRlZE1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW1iZWRkZWRNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb2x1bW5zIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgaW5zaWRlIHRoaXMgZW1iZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5IGxpc3RlbmVycyBpbnNpZGUgdGhpcyBlbWJlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIGFwcGxpZWQgdG8gdGhlIGVtYmVkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXF1ZXMgYXBwbGllZCB0byB0aGUgZW1iZWQgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gaWRzIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gY291bnRzIGluc2lkZSB0aGlzIGVtYmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTmVzdGVkIGVtYmVkZGFibGUgaW4gdGhpcyBlbWJlZGRhYmxlICh3aGljaCBoYXMgY3VycmVudCBlbWJlZGRlZCBhcyBwYXJlbnQgZW1iZWRkZWQpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWJlZGRlZHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZW50aXR5IHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIGNvbnN0cnVjdG9yXG4gICAgICAgICAqIG9yIHZpYSBhbGxvY2F0aW5nIGEgbmV3IG9iamVjdCB2aWEgYE9iamVjdC5jcmVhdGUoKWAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3RvciA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBlbWJlZGRlZCBpcyBpbiBhcnJheSBtb2RlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG9wdGlvbiB3b3JrcyBvbmx5IGluIG1vbmdvZGIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb2YgY3VycmVudCBlbWJlZCBhbmQgYWxsIGl0cyBwYXJlbnQgZW1iZWRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogd2UgbmVlZCB0byBnZXQgdmFsdWUgb2YgXCJpZFwiIGNvbHVtbiBmcm9tIHRoZSBwb3N0IHJlYWwgZW50aXR5IG9iamVjdC5cbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW1wiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIsIFwiY291bnRlcnNcIl1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyZW50UHJvcGVydHlOYW1lcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhcnJheSBvZiBwcmVmaXhlcyBvZiBjdXJyZW50IGVtYmVkIGFuZCBhbGwgaXRzIHBhcmVudCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBhcmVudFByZWZpeGVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGVtYmVkIG1ldGFkYXRhcyBmcm9tIGFsbCBsZXZlbHMgb2YgdGhlIHBhcmVudCB0cmVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW2VtYmVkIG1ldGFkYXRhIG9mIGRhdGEsIGVtYmVkIG1ldGFkYXRhIG9mIGluZm9ybWF0aW9uLCBlbWJlZCBtZXRhZGF0YSBvZiBjb3VudGVyc11cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YVRyZWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVtYmVkIG1ldGFkYXRhcyBmcm9tIGFsbCBsZXZlbHMgb2YgdGhlIHBhcmVudCB0cmVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBleGFtcGxlOiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10uaWQgd2hlcmUgXCJkYXRhXCIsIFwiaW5mb3JtYXRpb25cIiBhbmQgXCJjb3VudGVyc1wiIGFyZSBlbWJlZHNcbiAgICAgICAgICogdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gW2VtYmVkIG1ldGFkYXRhIG9mIGRhdGEsIGVtYmVkIG1ldGFkYXRhIG9mIGluZm9ybWF0aW9uLCBlbWJlZCBtZXRhZGF0YSBvZiBjb3VudGVyc11cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9ucyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbnMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9ucyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3RlbmVyc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2VzIG9mIHRoaXMgZW1iZWQgYW5kIGFsbCBpbmRpY2VzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kaWNlc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWVzIG9mIHRoaXMgZW1iZWQgYW5kIGFsbCB1bmlxdWVzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlc0Zyb21UcmVlID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBpZHMgb2YgdGhpcyBlbWJlZCBhbmQgYWxsIHJlbGF0aW9uIGlkcyBmcm9tIGl0cyBjaGlsZCBlbWJlZHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uSWRzRnJvbVRyZWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIGNvdW50cyBvZiB0aGlzIGVtYmVkIGFuZCBhbGwgcmVsYXRpb24gY291bnRzIGZyb20gaXRzIGNoaWxkIGVtYmVkcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IFtdO1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy5hcmdzLnR5cGUoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLmN1c3RvbVByZWZpeCA9IG9wdGlvbnMuYXJncy5wcmVmaXg7XG4gICAgICAgIHRoaXMuaXNBcnJheSA9IG9wdGlvbnMuYXJncy5pc0FycmF5O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW1iZWRkZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmICghKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mcm9tRGVzZXJpYWxpemVyKSB8fCB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLnR5cGUucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmVtYmVkZGVkcy5mb3JFYWNoKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWQuYnVpbGQoY29ubmVjdGlvbik7IH0pO1xuICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMuYnVpbGRQcmVmaXgoY29ubmVjdGlvbik7XG4gICAgICAgIHRoaXMucGFyZW50UHJvcGVydHlOYW1lcyA9IHRoaXMuYnVpbGRQYXJlbnRQcm9wZXJ0eU5hbWVzKCk7XG4gICAgICAgIHRoaXMucGFyZW50UHJlZml4ZXMgPSB0aGlzLmJ1aWxkUGFyZW50UHJlZml4ZXMoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVBhdGggPSB0aGlzLnBhcmVudFByb3BlcnR5TmFtZXMuam9pbihcIi5cIik7XG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YVRyZWUgPSB0aGlzLmJ1aWxkRW1iZWRkZWRNZXRhZGF0YVRyZWUoKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zRnJvbVRyZWUgPSB0aGlzLmJ1aWxkQ29sdW1uc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25zRnJvbVRyZWUgPSB0aGlzLmJ1aWxkUmVsYXRpb25zRnJvbVRyZWUoKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnNGcm9tVHJlZSA9IHRoaXMuYnVpbGRMaXN0ZW5lcnNGcm9tVHJlZSgpO1xuICAgICAgICB0aGlzLmluZGljZXNGcm9tVHJlZSA9IHRoaXMuYnVpbGRJbmRpY2VzRnJvbVRyZWUoKTtcbiAgICAgICAgdGhpcy51bmlxdWVzRnJvbVRyZWUgPSB0aGlzLmJ1aWxkVW5pcXVlc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25JZHNGcm9tVHJlZSA9IHRoaXMuYnVpbGRSZWxhdGlvbklkc0Zyb21UcmVlKCk7XG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IHRoaXMuYnVpbGRSZWxhdGlvbkNvdW50c0Zyb21UcmVlKCk7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLm9wdGlvbnMuZW50aXR5U2tpcENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWx3YXlzVXNpbmdDb25zdHJ1Y3RvciA9ICFjb25uZWN0aW9uLm9wdGlvbnMuZW50aXR5U2tpcENvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFBhcnRpYWxQcmVmaXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGlmIHByZWZpeCBvcHRpb24gd2FzIG5vdCBzZXQgb3IgZXhwbGljaXRseSBzZXQgdG8gdHJ1ZSAtIGRlZmF1bHQgcHJlZml4XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY3VzdG9tUHJlZml4ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBwcmVmaXggb3B0aW9uIHdhcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9yIGV4cGxpY2l0eSBzZXQgdG8gZmFsc2UgLSBkaXNhYmxlIHByZWZpeFxuICAgICAgICBpZiAodGhpcy5jdXN0b21QcmVmaXggPT09IFwiXCIgfHwgdGhpcy5jdXN0b21QcmVmaXggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIGN1c3RvbSBwcmVmaXhcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1c3RvbVByZWZpeCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmN1c3RvbVByZWZpeF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkludmFsaWQgcHJlZml4IG9wdGlvbiBnaXZlbiBmb3IgXCIgKyB0aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIiNcIiArIHRoaXMucHJvcGVydHlOYW1lKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUHJlZml4ID0gZnVuY3Rpb24gKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHZhciBwcmVmaXhlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhKVxuICAgICAgICAgICAgcHJlZml4ZXMucHVzaCh0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEuYnVpbGRQcmVmaXgoY29ubmVjdGlvbikpO1xuICAgICAgICBwcmVmaXhlcy5wdXNoLmFwcGx5KHByZWZpeGVzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5idWlsZFBhcnRpYWxQcmVmaXgoKSksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiBwcmVmaXhlcy5qb2luKFwiX1wiKTsgLy8gdG9kbzogdXNlIG5hbWluZyBzdHJhdGVneSBpbnN0ZWFkIG9mIFwiX1wiICAhISFcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUGFyZW50UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50RW1iZWRkZWRNZXRhZGF0YSA/IHRoaXMucGFyZW50RW1iZWRkZWRNZXRhZGF0YS5idWlsZFBhcmVudFByb3BlcnR5TmFtZXMoKS5jb25jYXQodGhpcy5wcm9wZXJ0eU5hbWUpIDogW3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUGFyZW50UHJlZml4ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEgPyB0aGlzLnBhcmVudEVtYmVkZGVkTWV0YWRhdGEuYnVpbGRQYXJlbnRQcmVmaXhlcygpLmNvbmNhdCh0aGlzLmJ1aWxkUGFydGlhbFByZWZpeCgpKSA6IHRoaXMuYnVpbGRQYXJ0aWFsUHJlZml4KCk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZEVtYmVkZGVkTWV0YWRhdGFUcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhID8gdGhpcy5wYXJlbnRFbWJlZGRlZE1ldGFkYXRhLmJ1aWxkRW1iZWRkZWRNZXRhZGF0YVRyZWUoKS5jb25jYXQodGhpcykgOiBbdGhpc107XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZENvbHVtbnNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAoY29sdW1ucywgZW1iZWRkZWQpIHsgcmV0dXJuIGNvbHVtbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkQ29sdW1uc0Zyb21UcmVlKCkpOyB9LCB0aGlzLmNvbHVtbnMpO1xuICAgIH07XG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGRSZWxhdGlvbnNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5idWlsZFJlbGF0aW9uc0Zyb21UcmVlKCkpOyB9LCB0aGlzLnJlbGF0aW9ucyk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZExpc3RlbmVyc0Zyb21UcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChyZWxhdGlvbnMsIGVtYmVkZGVkKSB7IHJldHVybiByZWxhdGlvbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkTGlzdGVuZXJzRnJvbVRyZWUoKSk7IH0sIHRoaXMubGlzdGVuZXJzKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkSW5kaWNlc0Zyb21UcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChyZWxhdGlvbnMsIGVtYmVkZGVkKSB7IHJldHVybiByZWxhdGlvbnMuY29uY2F0KGVtYmVkZGVkLmJ1aWxkSW5kaWNlc0Zyb21UcmVlKCkpOyB9LCB0aGlzLmluZGljZXMpO1xuICAgIH07XG4gICAgRW1iZWRkZWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGRVbmlxdWVzRnJvbVRyZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHJlbGF0aW9ucywgZW1iZWRkZWQpIHsgcmV0dXJuIHJlbGF0aW9ucy5jb25jYXQoZW1iZWRkZWQuYnVpbGRVbmlxdWVzRnJvbVRyZWUoKSk7IH0sIHRoaXMudW5pcXVlcyk7XG4gICAgfTtcbiAgICBFbWJlZGRlZE1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFJlbGF0aW9uSWRzRnJvbVRyZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVkcy5yZWR1Y2UoZnVuY3Rpb24gKHJlbGF0aW9ucywgZW1iZWRkZWQpIHsgcmV0dXJuIHJlbGF0aW9ucy5jb25jYXQoZW1iZWRkZWQuYnVpbGRSZWxhdGlvbklkc0Zyb21UcmVlKCkpOyB9LCB0aGlzLnJlbGF0aW9uSWRzKTtcbiAgICB9O1xuICAgIEVtYmVkZGVkTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkUmVsYXRpb25Db3VudHNGcm9tVHJlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRzLnJlZHVjZShmdW5jdGlvbiAocmVsYXRpb25zLCBlbWJlZGRlZCkgeyByZXR1cm4gcmVsYXRpb25zLmNvbmNhdChlbWJlZGRlZC5idWlsZFJlbGF0aW9uQ291bnRzRnJvbVRyZWUoKSk7IH0sIHRoaXMucmVsYXRpb25Db3VudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIEVtYmVkZGVkTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgRW1iZWRkZWRNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbWJlZGRlZE1ldGFkYXRhLmpzLm1hcFxuIiwiLyoqXG4gKiBUaGlzIG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBlbnRpdHkncyBsaXN0ZW5lcnMuXG4gKi9cbnZhciBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TGlzdGVuZXJNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLmVtYmVkZGVkTWV0YWRhdGEgPSBvcHRpb25zLmVtYmVkZGVkTWV0YWRhdGE7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy5hcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLmFyZ3MudHlwZTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGxpc3RlbmVyIGlzIGFsbG93ZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhLnByb3RvdHlwZS5pc0FsbG93ZWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldCA9PT0gZW50aXR5LmNvbnN0cnVjdG9yIHx8IC8vIHRvZG86IC5jb25zdHJ1Y3RvciB3b24ndCB3b3JrIGZvciBlbnRpdHkgc2NoZW1hcywgYnV0IHRoZXJlIGFyZSBubyBlbnRpdHkgbGlzdGVuZXJzIGluIHNjaGVtYXMgc2luY2UgdGhlcmUgYXJlIG5vIG9iamVjdHMsIHJpZ2h0P1xuICAgICAgICAgICAgKHRoaXMuZW50aXR5TWV0YWRhdGEudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgZW50aXR5LmNvbnN0cnVjdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXMuZW50aXR5TWV0YWRhdGEudGFyZ2V0KTsgLy8gdG9kbzogYWxzbyBuZWVkIHRvIGltcGxlbWVudCBlbnRpdHkgc2NoZW1hIGluaGVyaXRhbmNlXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBsaXN0ZW5lciBtZXRob2Qgb2YgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBFbnRpdHlMaXN0ZW5lck1ldGFkYXRhLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICBpZiAoIXRoaXMuZW1iZWRkZWRNZXRhZGF0YSlcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdKCk7XG4gICAgICAgIHRoaXMuY2FsbEVudGl0eUVtYmVkZGVkTWV0aG9kKGVudGl0eSwgdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5UGF0aC5zcGxpdChcIi5cIikpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDYWxscyBlbWJlZGRlZCBlbnRpdHkgbGlzdGVuZXIgbWV0aG9kIG5vIG1hdHRlciBob3cgbmVzdGVkIGl0IGlzLlxuICAgICAqL1xuICAgIEVudGl0eUxpc3RlbmVyTWV0YWRhdGEucHJvdG90eXBlLmNhbGxFbnRpdHlFbWJlZGRlZE1ldGhvZCA9IGZ1bmN0aW9uIChlbnRpdHksIHByb3BlcnR5UGF0aHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eVBhdGggfHwgIWVudGl0eVtwcm9wZXJ0eVBhdGhdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocHJvcGVydHlQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChlbnRpdHlbcHJvcGVydHlQYXRoXSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgZW50aXR5W3Byb3BlcnR5UGF0aF0ubWFwKGZ1bmN0aW9uIChlbWJlZGRlZCkgeyByZXR1cm4gZW1iZWRkZWRbX3RoaXMucHJvcGVydHlOYW1lXSgpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudGl0eVtwcm9wZXJ0eVBhdGhdW3RoaXMucHJvcGVydHlOYW1lXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVudGl0eVtwcm9wZXJ0eVBhdGhdKVxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbEVudGl0eUVtYmVkZGVkTWV0aG9kKGVudGl0eVtwcm9wZXJ0eVBhdGhdLCBwcm9wZXJ0eVBhdGhzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVudGl0eUxpc3RlbmVyTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgRW50aXR5TGlzdGVuZXJNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlMaXN0ZW5lck1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvciB9IGZyb20gXCIuLi9lcnJvci9DYW5ub3RDcmVhdGVFbnRpdHlJZE1hcEVycm9yXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG5pbXBvcnQgeyBzaG9ydGVuIH0gZnJvbSBcIi4uL3V0aWwvU3RyaW5nVXRpbHNcIjtcbi8qKlxuICogQ29udGFpbnMgYWxsIGVudGl0eSBtZXRhZGF0YS5cbiAqL1xudmFyIEVudGl0eU1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hpbGRyZW4gZW50aXR5IG1ldGFkYXRhcy4gVXNlZCBpbiBpbmhlcml0YW5jZSBwYXR0ZXJucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hpbGRFbnRpdHlNZXRhZGF0YXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBcImluaGVyaXRhbmNlIHRyZWVcIiBmcm9tIGEgdGFyZ2V0IGVudGl0eS5cbiAgICAgICAgICogRm9yIGV4YW1wbGUgZm9yIHRhcmdldCBQb3N0IDwgQ29udGVudE1vZGVsIDwgVW5pdCBpdCB3aWxsIGJlIGFuIGFycmF5IG9mIFtQb3N0LCBDb250ZW50TW9kZWwsIFVuaXRdLlxuICAgICAgICAgKiBJdCBhbHNvIGNvbnRhaW5zIGNoaWxkIGVudGl0aWVzIGZvciBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluaGVyaXRhbmNlVHJlZSA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgdHlwZS4gVGFibGVzIGNhbiBiZSBjbG9zdXJlLCBqdW5jdGlvbiwgZXRjLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWJsZVR5cGUgPSBcInJlZ3VsYXJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZXMgU3FsaXRlIFwiV0lUSE9VVCBST1dJRFwiIG1vZGlmaWVyIGZvciB0aGUgXCJDUkVBVEUgVEFCTEVcIiBzdGF0ZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud2l0aG91dFJvd2lkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgc2NoZW1hIHdpbGwgYmUgc3luY2hyb25pemVkIGZvciB0aGlzIGVudGl0eSBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGVyZSBhbnkgbm9uLW51bGxhYmxlIGNvbHVtbiBleGlzdCBpbiB0aGlzIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaGFzTm9uTnVsbGFibGVSZWxhdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGVudGl0eSBtZXRhZGF0YSBvZiBhIGp1bmN0aW9uIHRhYmxlLCBvciBub3QuXG4gICAgICAgICAqIEp1bmN0aW9uIHRhYmxlIGlzIGEgdGFibGUgY3JlYXRlZCBieSBtYW55LXRvLW1hbnkgcmVsYXRpb25zaGlwLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJdHMgYWxzbyBwb3NzaWJsZSB0byB1bmRlcnN0YW5kIGlmIGVudGl0eSBpcyBqdW5jdGlvbiB2aWEgdGFibGVUeXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0p1bmN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGVudGl0eSBzaG91bGQgYmUgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBvciB2aWEgYWxsb2NhdGluZyBhIG5ldyBvYmplY3QgdmlhIGBPYmplY3QuY3JlYXRlKClgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgdGFibGUgaXMgYSBqdW5jdGlvbiB0YWJsZSBvZiB0aGUgY2xvc3VyZSB0YWJsZS5cbiAgICAgICAgICogVGhpcyB0eXBlIGlzIGZvciB0YWJsZXMgdGhhdCBjb250YWluIGp1bmN0aW9uIG1ldGFkYXRhIG9mIHRoZSBjbG9zdXJlIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDbG9zdXJlSnVuY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiBlbnRpdHkncyB0YWJsZSBoYXMgbXVsdGlwbGUgcHJpbWFyeSBjb2x1bW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNNdWx0aXBsZVByaW1hcnlLZXlzID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBlbnRpdHkgbWV0YWRhdGEgaGFzIHV1aWQgZ2VuZXJhdGVkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhc1VVSURHZW5lcmF0ZWRDb2x1bW5zID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBjb2x1bW4gbWV0YWRhdGFzIGRlZmluZWQgYnkgdXNlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3duQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1ucyBvZiB0aGUgZW50aXR5LCBpbmNsdWRpbmcgY29sdW1ucyB0aGF0IGFyZSBjb21pbmcgZnJvbSB0aGUgZW1iZWRkZWRzIG9mIHRoaXMgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmNlc3RvciBjb2x1bW5zIHVzZWQgb25seSBpbiBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYW5jZXN0b3JDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXNjZW5kYW50IGNvbHVtbnMgdXNlZCBvbmx5IGluIGNsb3N1cmUganVuY3Rpb24gdGFibGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjZW5kYW50Q29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsIGNvbHVtbnMgZXhjZXB0IGZvciB2aXJ0dWFsIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vblZpcnR1YWxDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiB0aGUgY2FzZSBpZiB0aGlzIGVudGl0eSBtZXRhZGF0YSBpcyBqdW5jdGlvbiB0YWJsZSdzIGVudGl0eSBtZXRhZGF0YSxcbiAgICAgICAgICogdGhpcyB3aWxsIGNvbnRhaW4gYWxsIHJlZmVyZW5jZWQgY29sdW1ucyBvZiBvd25lciBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93bmVyQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW4gdGhlIGNhc2UgaWYgdGhpcyBlbnRpdHkgbWV0YWRhdGEgaXMganVuY3Rpb24gdGFibGUncyBlbnRpdHkgbWV0YWRhdGEsXG4gICAgICAgICAqIHRoaXMgd2lsbCBjb250YWluIGFsbCByZWZlcmVuY2VkIGNvbHVtbnMgb2YgaW52ZXJzZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmludmVyc2VDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBjb2x1bW4gd2l0aCBnZW5lcmF0ZWQgZmxhZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgcHJpbWFyeSBjb2x1bW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcmltYXJ5Q29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25SZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LCBpbmNsdWRpbmcgcmVsYXRpb25zIHRoYXQgYXJlIGNvbWluZyBmcm9tIHRoZSBlbWJlZGRlZHMgb2YgdGhpcyBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiBlYWdlciByZWxhdGlvbnMgdGhpcyBtZXRhZGF0YSBoYXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVhZ2VyUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGVhZ2VyIHJlbGF0aW9ucyB0aGlzIG1ldGFkYXRhIGhhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGF6eVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvbmx5IG9uZS10by1vbmUgcmVsYXRpb25zIG9mIHRoZSBlbnRpdHkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uZVRvT25lUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgb3duZXIgb25lLXRvLW9uZSByZWxhdGlvbnMgb2YgdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3duZXJPbmVUb09uZVJlbGF0aW9ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvbmx5IG9uZS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbmVUb01hbnlSZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgb25seSBtYW55LXRvLW9uZSByZWxhdGlvbnMgb2YgdGhlIGVudGl0eS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWFueVRvT25lUmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYW55VG9NYW55UmVsYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9ubHkgb3duZXIgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25lck1hbnlUb01hbnlSZWxhdGlvbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgb25seSBvd25lciBvbmUtdG8tb25lIGFuZCBtYW55LXRvLW9uZSByZWxhdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbGF0aW9uc1dpdGhKb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gaWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgcmVsYXRpb24gaWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbkNvdW50cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgZm9yZWlnbiBrZXkgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgZW1iZWRkZWQgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWJlZGRlZHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBlbWJlZGRlZHMgLSBlbWJlZGRlZHMgZnJvbSB0aGlzIGVudGl0eSBtZXRhZGF0YSBhbmQgZnJvbSBhbGwgY2hpbGQgZW1iZWRkZWRzLCBldGMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFsbEVtYmVkZGVkcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3Mgb3duIGluZGljZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93bkluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSdzIGluZGV4IG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3MgdW5pcXVlIG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogRW50aXR5J3Mgb3duIHVuaXF1ZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm93blVuaXF1ZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSdzIGNoZWNrIG1ldGFkYXRhcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hlY2tzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBleGNsdXNpb24gbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGNsdXNpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnRpdHkncyBvd24gbGlzdGVuZXIgbWV0YWRhdGFzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vd25MaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVudGl0eSBsaXN0ZW5lciBtZXRhZGF0YXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBMT0FEXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWZ0ZXJMb2FkTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW5lciBtZXRhZGF0YXMgd2l0aCBcIkFGVEVSIElOU0VSVFwiIHR5cGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJlZm9yZUluc2VydExpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBJTlNFUlRcIiB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hZnRlckluc2VydExpc3RlbmVycyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdGVuZXIgbWV0YWRhdGFzIHdpdGggXCJBRlRFUiBVUERBVEVcIiB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iZWZvcmVVcGRhdGVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbmVyIG1ldGFkYXRhcyB3aXRoIFwiQUZURVIgVVBEQVRFXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWZ0ZXJVcGRhdGVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbmVyIG1ldGFkYXRhcyB3aXRoIFwiQUZURVIgUkVNT1ZFXCIgdHlwZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW5lciBtZXRhZGF0YXMgd2l0aCBcIkFGVEVSIFJFTU9WRVwiIHR5cGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFmdGVyUmVtb3ZlTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5pbmhlcml0YW5jZVRyZWUgPSBvcHRpb25zLmluaGVyaXRhbmNlVHJlZSB8fCBbXTtcbiAgICAgICAgdGhpcy5pbmhlcml0YW5jZVBhdHRlcm4gPSBvcHRpb25zLmluaGVyaXRhbmNlUGF0dGVybjtcbiAgICAgICAgdGhpcy50cmVlVHlwZSA9IG9wdGlvbnMudGFibGVUcmVlID8gb3B0aW9ucy50YWJsZVRyZWUudHlwZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50cmVlT3B0aW9ucyA9IG9wdGlvbnMudGFibGVUcmVlID8gb3B0aW9ucy50YWJsZVRyZWUub3B0aW9ucyA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wYXJlbnRDbG9zdXJlRW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLnBhcmVudENsb3N1cmVFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy50YWJsZU1ldGFkYXRhQXJncyA9IG9wdGlvbnMuYXJncztcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy50YWJsZVR5cGUgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy53aXRob3V0Um93aWQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLndpdGhvdXRSb3dpZDtcbiAgICAgICAgdGhpcy5kZXBlbmRzT24gPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLmRlcGVuZHNPbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5LlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIHNldCB0byBhIGZ1bmN0aW9uIChlLmcuIGNsYXNzKSB0aGF0IGNhbiBiZSBjcmVhdGVkIHRoZW4gY3JlYXRlIGl0XG4gICAgICAgIHZhciByZXQ7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZnJvbURlc2VyaWFsaXplcikgfHwgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgICAgICByZXQgPSBuZXcgdGhpcy50YXJnZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldCA9IE9iamVjdC5jcmVhdGUodGhpcy50YXJnZXQucHJvdG90eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGF6eVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gX3RoaXMuY29ubmVjdGlvbi5yZWxhdGlvbkxvYWRlci5lbmFibGVMYXp5TG9hZChyZWxhdGlvbiwgcmV0LCBxdWVyeVJ1bm5lcik7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiBhIG5ldyBlbXB0eSBvYmplY3RcbiAgICAgICAgdmFyIG5ld09iamVjdCA9IHt9O1xuICAgICAgICB0aGlzLmxhenlSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIF90aGlzLmNvbm5lY3Rpb24ucmVsYXRpb25Mb2FkZXIuZW5hYmxlTGF6eUxvYWQocmVsYXRpb24sIG5ld09iamVjdCwgcXVlcnlSdW5uZXIpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiBlbnRpdHkgaGFzIGFuIGlkLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgaWYgKCFlbnRpdHkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwcmltYXJ5Q29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZ2l2ZW4gZW50aXR5IC8gb2JqZWN0IGNvbnRhaW5zIEFMTCBwcmltYXJ5IGtleXMgZW50aXR5IG11c3QgaGF2ZS5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgY29udGFpbnMgYWxsIG9mIHRoZW0sIGZhbHNlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIG5vdCBkZWZpbmVkLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNBbGxQcmltYXJ5S2V5cyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeUNvbHVtbnMuZXZlcnkoZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByaW1hcnlDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCBnaXZlbiBvYmplY3QgaXMgYW4gZW50aXR5IGlkIG1hcC5cbiAgICAgKiBJZiBnaXZlbiBpZCBpcyBhbiBvYmplY3QgdGhlbiBpdCBtZWFucyBpdHMgYWxyZWFkeSBpZCBtYXAuXG4gICAgICogSWYgZ2l2ZW4gaWQgaXNuJ3QgYW4gb2JqZWN0IHRoZW4gaXQgbWVhbnMgaXRzIGEgdmFsdWUgb2YgdGhlIGlkIGNvbHVtblxuICAgICAqIGFuZCBpdCBjcmVhdGVzIGEgbmV3IGlkIG1hcCB3aXRoIHRoaXMgdmFsdWUgYW5kIG5hbWUgb2YgdGhlIHByaW1hcnkgY29sdW1uLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5lbnN1cmVFbnRpdHlJZE1hcCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlUHJpbWFyeUtleXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90Q3JlYXRlRW50aXR5SWRNYXBFcnJvcih0aGlzLCBpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zWzBdLmNyZWF0ZVZhbHVlTWFwKGlkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgcHJpbWFyeSBrZXlzIG9mIHRoZSBlbnRpdHkgYW5kIHJldHVybnMgdGhlbSBpbiBhIGxpdGVyYWwgb2JqZWN0LlxuICAgICAqIEZvciBleGFtcGxlLCBmb3IgUG9zdHsgaWQ6IDEsIHRpdGxlOiBcImhlbGxvXCIgfSB3aGVyZSBpZCBpcyBwcmltYXJ5IGl0IHdpbGwgcmV0dXJuIHsgaWQ6IDEgfVxuICAgICAqIEZvciBtdWx0aXBsZSBwcmltYXJ5IGtleXMgaXQgcmV0dXJucyBtdWx0aXBsZSBrZXlzIGluIG9iamVjdC5cbiAgICAgKiBGb3IgcHJpbWFyeSBrZXlzIGluc2lkZSBlbWJlZHMgaXQgcmV0dXJucyBjb21wbGV4IG9iamVjdCBsaXRlcmFsIHdpdGgga2V5cyBpbiB0aGVtLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlJZE1hcCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgaWYgKCFlbnRpdHkpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gRW50aXR5TWV0YWRhdGEuZ2V0VmFsdWVNYXAoZW50aXR5LCB0aGlzLnByaW1hcnlDb2x1bW5zLCB7IHNraXBOdWxsczogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBcIm1peGVkIGlkIG1hcFwiLlxuICAgICAqIElmIGVudGl0eSBoYXMgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIChpZHMpIHRoZW4gaXQgd2lsbCByZXR1cm4ganVzdCByZWd1bGFyIGlkIG1hcCwgbGlrZSB3aGF0IGdldEVudGl0eUlkTWFwIHJldHVybnMuXG4gICAgICogQnV0IGlmIGVudGl0eSBoYXMgYSBzaW5nbGUgcHJpbWFyeSBrZXkgdGhlbiBpdCB3aWxsIHJldHVybiBqdXN0IHZhbHVlIG9mIHRoZSBpZCBjb2x1bW4gb2YgdGhlIGVudGl0eSwganVzdCB2YWx1ZS5cbiAgICAgKiBUaGlzIGlzIGNhbGxlZCBtaXhlZCBpZCBtYXAuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmdldEVudGl0eUlkTWl4ZWRNYXAgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIGlmICghZW50aXR5KVxuICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgdmFyIGlkTWFwID0gdGhpcy5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVByaW1hcnlLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaWRNYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaWRNYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1hcnlDb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGlkTWFwKTsgLy8gdG9kbzogd2hhdCBhYm91dCBwYXJlbnQgcHJpbWFyeSBjb2x1bW4/XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkTWFwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIGRpZmZlcmVudCBlbnRpdGllcyBieSB0aGVpciBpZHMuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXkgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuY29tcGFyZUVudGl0aWVzID0gZnVuY3Rpb24gKGZpcnN0RW50aXR5LCBzZWNvbmRFbnRpdHkpIHtcbiAgICAgICAgdmFyIGZpcnN0RW50aXR5SWRNYXAgPSB0aGlzLmdldEVudGl0eUlkTWFwKGZpcnN0RW50aXR5KTtcbiAgICAgICAgaWYgKCFmaXJzdEVudGl0eUlkTWFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgc2Vjb25kRW50aXR5SWRNYXAgPSB0aGlzLmdldEVudGl0eUlkTWFwKHNlY29uZEVudGl0eSk7XG4gICAgICAgIGlmICghc2Vjb25kRW50aXR5SWRNYXApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKGZpcnN0RW50aXR5SWRNYXAsIHNlY29uZEVudGl0eUlkTWFwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGNvbHVtbiB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZmluZENvbHVtbldpdGhQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWU7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1uIHdpdGggYSBnaXZlbiBkYXRhYmFzZSBuYW1lLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kQ29sdW1uV2l0aERhdGFiYXNlTmFtZSA9IGZ1bmN0aW9uIChkYXRhYmFzZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWUgPT09IGRhdGFiYXNlTmFtZTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjb2x1bW4gb3IgcmVsYXRpb25zaGlwIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5oYXNDb2x1bW5XaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICB2YXIgaGFzQ29sdW1uID0gdGhpcy5jb2x1bW5zLnNvbWUoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0NvbHVtbiB8fCB0aGlzLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1uIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiBjb2x1bW4gd2l0aCBwcm9wZXJ0eSBwYXRoIHdhcyBub3QgZm91bmQsIHRyeSB0byBmaW5kIGEgcmVsYXRpb24gd2l0aCBzdWNoIHByb3BlcnR5IHBhdGhcbiAgICAgICAgLy8gaWYgd2UgZmluZCByZWxhdGlvbiBhbmQgaXQgaGFzIGEgc2luZ2xlIGpvaW4gY29sdW1uIHRoZW4gaXRzIHRoZSBjb2x1bW4gdXNlciB3YXMgc2Vla2luZ1xuICAgICAgICB2YXIgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ucHJvcGVydHlQYXRoID09PSBwcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICBpZiAocmVsYXRpb24gJiYgcmVsYXRpb24uam9pbkNvbHVtbnMubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgY29sdW1ucyB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgcGF0aC5cbiAgICAgKiBQcm9wZXJ0eSBwYXRoIGNhbiBtYXRjaCBhIHJlbGF0aW9uLCBhbmQgcmVsYXRpb25zIGNhbiBjb250YWluIG11bHRpcGxlIGNvbHVtbnMuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICByZXR1cm4gW2NvbHVtbl07XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIGlmIGNvbHVtbiB3aXRoIHByb3BlcnR5IHBhdGggd2FzIG5vdCBmb3VuZCwgdHJ5IHRvIGZpbmQgYSByZWxhdGlvbiB3aXRoIHN1Y2ggcHJvcGVydHkgcGF0aFxuICAgICAgICAvLyBpZiB3ZSBmaW5kIHJlbGF0aW9uIGFuZCBpdCBoYXMgYSBzaW5nbGUgam9pbiBjb2x1bW4gdGhlbiBpdHMgdGhlIGNvbHVtbiB1c2VyIHdhcyBzZWVraW5nXG4gICAgICAgIHZhciByZWxhdGlvbiA9IHRoaXMuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICBpZiAocmVsYXRpb24gJiYgcmVsYXRpb24uam9pbkNvbHVtbnMpXG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IHBhdGguXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zLnNvbWUoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyByZWxhdGlvbiB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnMuZmluZChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIHJlbGF0aW9uLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbiBlbWJlZGRlZCB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgcGF0aC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuaGFzRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxFbWJlZGRlZHMuc29tZShmdW5jdGlvbiAoZW1iZWRkZWQpIHsgcmV0dXJuIGVtYmVkZGVkLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVtYmVkZGVkIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBwYXRoLlxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5maW5kRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoID0gZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxFbWJlZGRlZHMuZmluZChmdW5jdGlvbiAoZW1iZWRkZWQpIHsgcmV0dXJuIGVtYmVkZGVkLnByb3BlcnR5UGF0aCA9PT0gcHJvcGVydHlQYXRoOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZGF0YWJhc2VOYW1lcyBtYXBwZWQgZnJvbSBwcm92aWRlZCBwcm9wZXJ0eVBhdGhzXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEucHJvdG90eXBlLm1hcFByb3BlcnR5UGF0aHNUb0NvbHVtbnMgPSBmdW5jdGlvbiAocHJvcGVydHlQYXRocykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF90aGlzLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICBpZiAoY29sdW1uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29sdW1uTm90Rm91bmQocHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgdGhyb3VnaCBlbnRpdHkgYW5kIGZpbmRzIGFuZCBleHRyYWN0cyBhbGwgdmFsdWVzIGZyb20gcmVsYXRpb25zIGluIHRoZSBlbnRpdHkuXG4gICAgICogSWYgcmVsYXRpb24gdmFsdWUgaXMgYW4gYXJyYXkgaXRzIGJlaW5nIGZsYXR0ZW5lZC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZXh0cmFjdFJlbGF0aW9uVmFsdWVzRnJvbUVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHksIHJlbGF0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVsYXRpb25zQW5kVmFsdWVzID0gW107XG4gICAgICAgIHJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHN1YlZhbHVlKSB7IHJldHVybiByZWxhdGlvbnNBbmRWYWx1ZXMucHVzaChbcmVsYXRpb24sIHN1YlZhbHVlLCBfdGhpcy5nZXRJbnZlcnNlRW50aXR5TWV0YWRhdGEoc3ViVmFsdWUsIHJlbGF0aW9uKV0pOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRpb25zQW5kVmFsdWVzLnB1c2goW3JlbGF0aW9uLCB2YWx1ZSwgX3RoaXMuZ2V0SW52ZXJzZUVudGl0eU1ldGFkYXRhKHZhbHVlLCByZWxhdGlvbildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZWxhdGlvbnNBbmRWYWx1ZXM7XG4gICAgfTtcbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuZ2V0SW52ZXJzZUVudGl0eU1ldGFkYXRhID0gZnVuY3Rpb24gKHZhbHVlLCByZWxhdGlvbikge1xuICAgICAgICB2YXIgY2hpbGRFbnRpdHlNZXRhZGF0YSA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnRhcmdldCA9PT0gdmFsdWUuY29uc3RydWN0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2hpbGRFbnRpdHlNZXRhZGF0YSA/IGNoaWxkRW50aXR5TWV0YWRhdGEgOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGE7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBwYXRocyBmb3IgYSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIEVudGl0eU1ldGFkYXRhLmNyZWF0ZVByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgZW50aXR5LCBwcmVmaXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdm9pZCAwKSB7IHByZWZpeCA9IFwiXCI7IH1cbiAgICAgICAgdmFyIHBhdGhzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKGVudGl0eSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgZnVuY3Rpb24gaXMgbmVlZGVkIGluIHRoZSBjYXNlcyB3aGVuIGNyZWF0ZVByb3BlcnR5UGF0aCB1c2VkIG9uIHZhbHVlcyBjb250YWluZyBhIGZ1bmN0aW9uIGFzIGEgdmFsdWVcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IC51cGRhdGUoKS5zZXQoeyBuYW1lOiAoKSA9PiBgU1VCU1RSKCcnLCAxLCAyKWAgfSlcbiAgICAgICAgICAgIHZhciBwYXJlbnRQYXRoID0gcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuaGFzRW1iZWRkZWRXaXRoUHJvcGVydHlQYXRoKHBhcmVudFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YlBhdGhzID0gX3RoaXMuY3JlYXRlUHJvcGVydHlQYXRoKG1ldGFkYXRhLCBlbnRpdHlba2V5XSwgcGFyZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaC5hcHBseShwYXRocywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHN1YlBhdGhzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gcHJlZml4ID8gcHJlZml4ICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXRocztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZW50aXR5IGlkIG1hcHMuXG4gICAgICogUmV0dXJucyBpdGVtcyB0aGF0IGV4aXN0IGluIHRoZSBmaXJzdCBhcnJheSBhbmQgYWJzZW50IGluIHRoZSBzZWNvbmQgYXJyYXkuXG4gICAgICovXG4gICAgRW50aXR5TWV0YWRhdGEuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChmaXJzdElkTWFwcywgc2Vjb25kSWRNYXBzKSB7XG4gICAgICAgIHJldHVybiBmaXJzdElkTWFwcy5maWx0ZXIoZnVuY3Rpb24gKGZpcnN0SWRNYXApIHtcbiAgICAgICAgICAgIHJldHVybiAhc2Vjb25kSWRNYXBzLmZpbmQoZnVuY3Rpb24gKHNlY29uZElkTWFwKSB7IHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKGZpcnN0SWRNYXAsIHNlY29uZElkTWFwKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB2YWx1ZSBtYXAgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIGFuZCBjb2x1bW5zLlxuICAgICAqIEV4YW1wbGVzIG9mIHVzYWdlcyBhcmUgcHJpbWFyeSBjb2x1bW5zIG1hcCBhbmQgam9pbiBjb2x1bW5zIG1hcC5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5nZXRWYWx1ZU1hcCA9IGZ1bmN0aW9uIChlbnRpdHksIGNvbHVtbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlTWFwKGVudGl0eSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBub25lIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbnMgYXJlIG5vdCBtaXNzaW5nXG4gICAgICAgICAgICBpZiAobWFwID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHZhbHVlKTtcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkZXIgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEVudGl0eU1ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbmFtaW5nU3RyYXRlZ3kgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3k7XG4gICAgICAgIHZhciBlbnRpdHlQcmVmaXggPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5lbnRpdHlQcmVmaXg7XG4gICAgICAgIHZhciBlbnRpdHlTa2lwQ29uc3RydWN0b3IgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5lbnRpdHlTa2lwQ29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuZW5naW5lID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5lbmdpbmU7XG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiZW50aXR5LWNoaWxkXCIgJiYgdGhpcy5wYXJlbnRFbnRpdHlNZXRhZGF0YSA/IHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEuZGF0YWJhc2UgOiB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLmRhdGFiYXNlO1xuICAgICAgICBpZiAodGhpcy50YWJsZU1ldGFkYXRhQXJncy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5zY2hlbWE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudHlwZSA9PT0gXCJlbnRpdHktY2hpbGRcIikgJiYgdGhpcy5wYXJlbnRFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSB0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLnNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoX2EgPSB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhc093blByb3BlcnR5KFwic2NoZW1hXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLnNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdpdmVuVGFibGVOYW1lID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEgPyB0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLmdpdmVuVGFibGVOYW1lIDogdGhpcy50YWJsZU1ldGFkYXRhQXJncy5uYW1lO1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdGhpcy50YWJsZU1ldGFkYXRhQXJncy5zeW5jaHJvbml6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnRhcmdldC5uYW1lIDogdGhpcy50YWJsZU1ldGFkYXRhQXJncy50YXJnZXQ7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiY2xvc3VyZS1qdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPSBuYW1pbmdTdHJhdGVneS5jbG9zdXJlSnVuY3Rpb25UYWJsZU5hbWUodGhpcy5naXZlblRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVOYW1lV2l0aG91dFByZWZpeCA9IG5hbWluZ1N0cmF0ZWd5LnRhYmxlTmFtZSh0aGlzLnBhcmVudEVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWUsIHRoaXMucGFyZW50RW50aXR5TWV0YWRhdGEuZ2l2ZW5UYWJsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4ID0gbmFtaW5nU3RyYXRlZ3kudGFibGVOYW1lKHRoaXMudGFyZ2V0TmFtZSwgdGhpcy5naXZlblRhYmxlTmFtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXhBbGlhc0xlbmd0aCAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1heEFsaWFzTGVuZ3RoID4gMCAmJiB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgubGVuZ3RoID4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXhBbGlhc0xlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFibGVOYW1lV2l0aG91dFByZWZpeCA9IHNob3J0ZW4odGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4LCB7IHNlcGFyYXRvcjogXCJfXCIsIHNlZ21lbnRMZW5ndGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJsZU5hbWUgPSBlbnRpdHlQcmVmaXggPyBuYW1pbmdTdHJhdGVneS5wcmVmaXhUYWJsZU5hbWUoZW50aXR5UHJlZml4LCB0aGlzLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXgpIDogdGhpcy50YWJsZU5hbWVXaXRob3V0UHJlZml4O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMudGFyZ2V0ID8gdGhpcy50YXJnZXQgOiB0aGlzLnRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy50YXJnZXROYW1lID8gdGhpcy50YXJnZXROYW1lIDogdGhpcy50YWJsZU5hbWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy53aXRob3V0Um93aWQgPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLndpdGhvdXRSb3dpZCA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy50YWJsZVBhdGggPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKHRoaXMudGFibGVOYW1lLCB0aGlzLnNjaGVtYSwgdGhpcy5kYXRhYmFzZSk7XG4gICAgICAgIHRoaXMub3JkZXJCeSA9ICh0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLm9yZGVyQnkgaW5zdGFuY2VvZiBGdW5jdGlvbikgPyB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLm9yZGVyQnkodGhpcy5wcm9wZXJ0aWVzTWFwKSA6IHRoaXMudGFibGVNZXRhZGF0YUFyZ3Mub3JkZXJCeTsgLy8gdG9kbzogaXMgcHJvcGVydGllc01hcCBhdmFpbGFibGUgaGVyZT8gTG9va3MgbGlrZSBpdHMgbm90XG4gICAgICAgIGlmIChlbnRpdHlTa2lwQ29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc0Fsd2F5c1VzaW5nQ29uc3RydWN0b3IgPSAhZW50aXR5U2tpcENvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNKdW5jdGlvbiA9IHRoaXMudGFibGVNZXRhZGF0YUFyZ3MudHlwZSA9PT0gXCJjbG9zdXJlLWp1bmN0aW9uXCIgfHwgdGhpcy50YWJsZU1ldGFkYXRhQXJncy50eXBlID09PSBcImp1bmN0aW9uXCI7XG4gICAgICAgIHRoaXMuaXNDbG9zdXJlSnVuY3Rpb24gPSB0aGlzLnRhYmxlTWV0YWRhdGFBcmdzLnR5cGUgPT09IFwiY2xvc3VyZS1qdW5jdGlvblwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IGNvbHVtbiBpbiB0aGUgZW50aXR5IGFuZCByZWNvbXB1dGVzIGFsbCBkZXBlbmQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUucmVnaXN0ZXJDb2x1bW4gPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIGlmICh0aGlzLm93bkNvbHVtbnMuaW5kZXhPZihjb2x1bW4pICE9PSAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vd25Db2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5lbWJlZGRlZHMucmVkdWNlKGZ1bmN0aW9uIChjb2x1bW5zLCBlbWJlZGRlZCkgeyByZXR1cm4gY29sdW1ucy5jb25jYXQoZW1iZWRkZWQuY29sdW1uc0Zyb21UcmVlKTsgfSwgdGhpcy5vd25Db2x1bW5zKTtcbiAgICAgICAgdGhpcy5wcmltYXJ5Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgIHRoaXMuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cyA9IHRoaXMucHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMTtcbiAgICAgICAgdGhpcy5oYXNVVUlER2VuZXJhdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzR2VuZXJhdGVkIHx8IGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwidXVpZFwiOyB9KS5sZW5ndGggPiAwO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXNNYXAgPSB0aGlzLmNyZWF0ZVByb3BlcnRpZXNNYXAoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRFbnRpdHlNZXRhZGF0YXMpXG4gICAgICAgICAgICB0aGlzLmNoaWxkRW50aXR5TWV0YWRhdGFzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eU1ldGFkYXRhKSB7IHJldHVybiBlbnRpdHlNZXRhZGF0YS5yZWdpc3RlckNvbHVtbihjb2x1bW4pOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzcGVjaWFsIG9iamVjdCAtIGFsbCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgb2YgdGhlIG9iamVjdCAocGx1cyBjb2x1bW5zIGFuZCByZWxhdGlvbnMgZnJvbSBlbWJlZHMpXG4gICAgICogaW4gYSBzcGVjaWFsIGZvcm1hdCAtIHsgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUgfS5cbiAgICAgKlxuICAgICAqIGV4YW1wbGU6IFBvc3R7IGlkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY291bnRlckVtYmVkOiB7IGNvdW50OiBudW1iZXIgfSwgY2F0ZWdvcnk6IENhdGVnb3J5IH0uXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgZm9sbG93aW5nIG9iamVjdDpcbiAgICAgKiB7IGlkOiBcImlkXCIsIGNvdW50ZXJFbWJlZDogeyBjb3VudDogXCJjb3VudGVyRW1iZWQuY291bnRcIiB9LCBjYXRlZ29yeTogXCJjYXRlZ29yeVwiIH1cbiAgICAgKi9cbiAgICBFbnRpdHlNZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlUHJvcGVydGllc01hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcCA9IHt9O1xuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBPcm1VdGlscy5tZXJnZURlZXAobWFwLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAoY29sdW1uLnByb3BlcnR5UGF0aCkpOyB9KTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHsgcmV0dXJuIE9ybVV0aWxzLm1lcmdlRGVlcChtYXAsIHJlbGF0aW9uLmNyZWF0ZVZhbHVlTWFwKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBFbnRpdHlNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHlNZXRhZGF0YS5qcy5tYXBcbiIsIi8qKlxuICogRXhjbHVzaW9uIG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0YWJsZSdzIGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAqL1xudmFyIEV4Y2x1c2lvbk1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRXhjbHVzaW9uTWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncykge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvcHRpb25zLmFyZ3MudGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gb3B0aW9ucy5hcmdzLmV4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdpdmVuTmFtZSA9IG9wdGlvbnMuYXJncy5uYW1lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGV4Y2x1c2lvbiBjb25zdHJhaW50IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YSdzIHByb3BlcnRpZXMgbWFwLCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEV4Y2x1c2lvbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChuYW1pbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmdpdmVuTmFtZSA/IHRoaXMuZ2l2ZW5OYW1lIDogbmFtaW5nU3RyYXRlZ3kuZXhjbHVzaW9uQ29uc3RyYWludE5hbWUodGhpcy5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUsIHRoaXMuZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEV4Y2x1c2lvbk1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IEV4Y2x1c2lvbk1ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4Y2x1c2lvbk1ldGFkYXRhLmpzLm1hcFxuIiwiLyoqXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5J3MgZm9yZWlnbiBrZXkuXG4gKi9cbnZhciBGb3JlaWduS2V5TWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBGb3JlaWduS2V5TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJyYXkgb2YgY29sdW1ucyBvZiB0aGlzIGZvcmVpZ24ga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcnJheSBvZiByZWZlcmVuY2VkIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGFycmF5IG9mIGNvbHVtbiBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYXJyYXkgb2YgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VkRW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLnJlZmVyZW5jZWRFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5zID0gb3B0aW9ucy5yZWZlcmVuY2VkQ29sdW1ucztcbiAgICAgICAgdGhpcy5vbkRlbGV0ZSA9IG9wdGlvbnMub25EZWxldGUgfHwgXCJOTyBBQ1RJT05cIjtcbiAgICAgICAgdGhpcy5vblVwZGF0ZSA9IG9wdGlvbnMub25VcGRhdGUgfHwgXCJOTyBBQ1RJT05cIjtcbiAgICAgICAgdGhpcy5kZWZlcnJhYmxlID0gb3B0aW9ucy5kZWZlcnJhYmxlO1xuICAgICAgICBpZiAob3B0aW9ucy5uYW1pbmdTdHJhdGVneSlcbiAgICAgICAgICAgIHRoaXMuYnVpbGQob3B0aW9ucy5uYW1pbmdTdHJhdGVneSk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGZvcmVpZ24ga2V5IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YXMgYW5kIHRoZWlyIGNvbHVtbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEZvcmVpZ25LZXlNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAobmFtaW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVzID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlUGF0aCA9IHRoaXMucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnRhYmxlUGF0aDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUodGhpcy5lbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIHRoaXMucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEZvcmVpZ25LZXlNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnQgeyBGb3JlaWduS2V5TWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9yZWlnbktleU1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEluZGV4IG1ldGFkYXRhIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0YWJsZSdzIGluZGV4LlxuICovXG52YXIgSW5kZXhNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIEluZGV4TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaW5kZXggbXVzdCBiZSB1bmlxdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVW5pcXVlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgU1BBVElBTCBtb2RpZmllciBpbmRleGVzIHRoZSBlbnRpcmUgY29sdW1uIGFuZCBkb2VzIG5vdCBhbGxvdyBpbmRleGVkIGNvbHVtbnMgdG8gY29udGFpbiBOVUxMIHZhbHVlcy5cbiAgICAgICAgICogV29ya3Mgb25seSBpbiBNeVNRTC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTcGF0aWFsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgRlVMTFRFWFQgbW9kaWZpZXIgaW5kZXhlcyB0aGUgZW50aXJlIGNvbHVtbiBhbmQgZG9lcyBub3QgYWxsb3cgcHJlZml4aW5nLlxuICAgICAgICAgKiBXb3JrcyBvbmx5IGluIE15U1FMLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpbmRleCBtdXN0IHN5bmNocm9uaXplIHdpdGggZGF0YWJhc2UgaW5kZXguXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN5bmNocm9uaXplID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGV4ZWQgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTWFwIG9mIGNvbHVtbiBuYW1lcyB3aXRoIG9yZGVyIHNldC5cbiAgICAgICAgICogVXNlZCBvbmx5IGJ5IE1vbmdvREIgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IHt9O1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZE1ldGFkYXRhID0gb3B0aW9ucy5lbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hcmdzLnN5bmNocm9uaXplICE9PSBudWxsICYmIG9wdGlvbnMuYXJncy5zeW5jaHJvbml6ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luY2hyb25pemUgPSBvcHRpb25zLmFyZ3Muc3luY2hyb25pemU7XG4gICAgICAgICAgICB0aGlzLmlzVW5pcXVlID0gISFvcHRpb25zLmFyZ3MudW5pcXVlO1xuICAgICAgICAgICAgdGhpcy5pc1NwYXRpYWwgPSAhIW9wdGlvbnMuYXJncy5zcGF0aWFsO1xuICAgICAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gISFvcHRpb25zLmFyZ3MuZnVsbHRleHQ7XG4gICAgICAgICAgICB0aGlzLnBhcnNlciA9IG9wdGlvbnMuYXJncy5wYXJzZXI7XG4gICAgICAgICAgICB0aGlzLndoZXJlID0gb3B0aW9ucy5hcmdzLndoZXJlO1xuICAgICAgICAgICAgdGhpcy5pc1NwYXJzZSA9IG9wdGlvbnMuYXJncy5zcGFyc2U7XG4gICAgICAgICAgICB0aGlzLmlzQmFja2dyb3VuZCA9IG9wdGlvbnMuYXJncy5iYWNrZ3JvdW5kO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlclNlY29uZHMgPSBvcHRpb25zLmFyZ3MuZXhwaXJlQWZ0ZXJTZWNvbmRzO1xuICAgICAgICAgICAgdGhpcy5naXZlbk5hbWUgPSBvcHRpb25zLmFyZ3MubmFtZTtcbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcyA9IG9wdGlvbnMuYXJncy5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGVudGl0eSBtZXRhZGF0YSdzIHByb3BlcnRpZXMgbWFwLCBjb2x1bW5zIGFuZCByZWxhdGlvbnMgYXJlIGJ1aWx0LlxuICAgICAqL1xuICAgIEluZGV4TWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKG5hbWluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnN5bmNocm9uaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFwID0ge307XG4gICAgICAgIC8vIGlmIGNvbHVtbnMgYWxyZWFkeSBhbiBhcnJheSBvZiBzdHJpbmcgdGhlbiBzaW1wbHkgcmV0dXJuIGl0XG4gICAgICAgIGlmICh0aGlzLmdpdmVuQ29sdW1uTmFtZXMpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5Qcm9wZXJ0eVBhdGhzID0gW107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmdpdmVuQ29sdW1uTmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmVtYmVkZGVkTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eVBhdGggKyBcIi5cIiArIGNvbHVtbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5OYW1lLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb2x1bW5Qcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkgeyByZXR1cm4gbWFwW3Byb3BlcnR5UGF0aF0gPSAxOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0b2RvOiBpbmRpY2VzIGluIGVtYmVkcyBhcmUgbm90IGltcGxlbWVudGVkIGluIHRoaXMgc3ludGF4LiBkZXByZWNhdGUgdGhpcyBzeW50YXg/XG4gICAgICAgICAgICAgICAgLy8gaWYgY29sdW1ucyBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGVuIGV4ZWN1dGUgaXQgYW5kIGdldCBjb2x1bW5zIG5hbWVzIGZyb20gaXRcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0ZuUmVzdWx0XzEgPSB0aGlzLmdpdmVuQ29sdW1uTmFtZXModGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5zRm5SZXN1bHRfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IGNvbHVtbnNGblJlc3VsdF8xLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gU3RyaW5nKGkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXBbbmFtZV0gPSAxOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gbWFwW2NvbHVtbk5hbWVdID0gY29sdW1uc0ZuUmVzdWx0XzFbY29sdW1uTmFtZV07IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtblByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uV2l0aFNhbWVOYW1lID0gX3RoaXMuZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbldpdGhTYW1lTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2NvbHVtbldpdGhTYW1lTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbldpdGhTYW1lTmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNXaXRoSm9pbkNvbHVtbiAmJiByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uV2l0aFNhbWVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbldpdGhTYW1lTmFtZS5qb2luQ29sdW1ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4TmFtZSA9IF90aGlzLmdpdmVuTmFtZSA/IFwiXFxcIlwiICsgX3RoaXMuZ2l2ZW5OYW1lICsgXCJcXFwiIFwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5TmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkluZGV4IFwiICsgaW5kZXhOYW1lICsgXCJjb250YWlucyBjb2x1bW4gdGhhdCBpcyBtaXNzaW5nIGluIHRoZSBlbnRpdHkgKFwiICsgZW50aXR5TmFtZSArIFwiKTogXCIgKyBwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKGZ1bmN0aW9uICh1cGRhdGVkTWFwLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdGhpcy5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtjb2x1bW4uZGF0YWJhc2VQYXRoXSA9IG1hcFtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWUgPyB0aGlzLmdpdmVuTmFtZSA6IG5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZSh0aGlzLmVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KSwgdGhpcy53aGVyZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEluZGV4TWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgSW5kZXhNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmRleE1ldGFkYXRhLmpzLm1hcFxuIiwiaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBlbnRpdHkncyByZWxhdGlvbiBjb3VudC5cbiAqL1xudmFyIFJlbGF0aW9uQ291bnRNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uQ291bnRNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50aXR5TWV0YWRhdGEgPSBvcHRpb25zLmVudGl0eU1ldGFkYXRhO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gb3B0aW9ucy5hcmdzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkgPSBvcHRpb25zLmFyZ3MucmVsYXRpb247XG4gICAgICAgIHRoaXMuYWxpYXMgPSBvcHRpb25zLmFyZ3MuYWxpYXM7XG4gICAgICAgIHRoaXMucXVlcnlCdWlsZGVyRmFjdG9yeSA9IG9wdGlvbnMuYXJncy5xdWVyeUJ1aWxkZXJGYWN0b3J5O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIHJlbGF0aW9uIGNvdW50IG1ldGFkYXRhIHByb3BlcnRpZXMuXG4gICAgICogVGhpcyBidWlsZGVyIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGFmdGVyIGVudGl0eSBtZXRhZGF0YSwgaXRzIHByb3BlcnRpZXMgbWFwIGFuZCBhbGwgcmVsYXRpb25zIGFyZSBidWlsZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvbkNvdW50TWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRoID0gdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVsYXRpb25OYW1lT3JGYWN0b3J5KHRoaXMuZW50aXR5TWV0YWRhdGEucHJvcGVydGllc01hcCkgOiB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeTtcbiAgICAgICAgdmFyIHJlbGF0aW9uID0gdGhpcy5lbnRpdHlNZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghcmVsYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGZpbmQgcmVsYXRpb24gXCIgKyBwcm9wZXJ0eVBhdGggKyBcIi4gV3JvbmcgcmVsYXRpb24gc3BlY2lmaWVkIGZvciBAUmVsYXRpb25Db3VudCBkZWNvcmF0b3IuXCIpO1xuICAgICAgICB0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudE1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uQ291bnRNZXRhZGF0YSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkNvdW50TWV0YWRhdGEuanMubWFwXG4iLCJpbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGVudGl0eSdzIHJlbGF0aW9uIGNvdW50LlxuICovXG52YXIgUmVsYXRpb25JZE1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25JZE1ldGFkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YSA9IG9wdGlvbnMuZW50aXR5TWV0YWRhdGE7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy5hcmdzLnRhcmdldDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBvcHRpb25zLmFyZ3MucHJvcGVydHlOYW1lO1xuICAgICAgICB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeSA9IG9wdGlvbnMuYXJncy5yZWxhdGlvbjtcbiAgICAgICAgdGhpcy5hbGlhcyA9IG9wdGlvbnMuYXJncy5hbGlhcztcbiAgICAgICAgdGhpcy5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gb3B0aW9ucy5hcmdzLnF1ZXJ5QnVpbGRlckZhY3Rvcnk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyByZWxhdGlvbiBpZCB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICpcbiAgICAgKiB0b2RvOiBtYWtlIGl0IHRvIHdvcmsgaW4gZW1iZWRzIGFzIHdlbGwuXG4gICAgICovXG4gICAgUmVsYXRpb25JZE1ldGFkYXRhLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGludmVyc2VFbnRpdHkgPSB0aGlzLnJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGludmVyc2VFbnRpdHkpKSB7XG4gICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0gaW52ZXJzZUVudGl0eS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoaXRlbSk7XG4gICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoaW52ZXJzZUVudGl0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBCdWlsZGVyIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgcmVsYXRpb24gaWQgcHJvcGVydGllcy5cbiAgICAgKiBUaGlzIGJ1aWxkZXIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIgZW50aXR5IG1ldGFkYXRhLCBpdHMgcHJvcGVydGllcyBtYXAgYW5kIGFsbCByZWxhdGlvbnMgYXJlIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uSWRNZXRhZGF0YS5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSB0aGlzLnJlbGF0aW9uTmFtZU9yRmFjdG9yeSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdGhpcy5yZWxhdGlvbk5hbWVPckZhY3RvcnkodGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKSA6IHRoaXMucmVsYXRpb25OYW1lT3JGYWN0b3J5O1xuICAgICAgICB2YXIgcmVsYXRpb24gPSB0aGlzLmVudGl0eU1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKTtcbiAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgZmluZCByZWxhdGlvbiBcIiArIHByb3BlcnR5UGF0aCArIFwiLiBXcm9uZyByZWxhdGlvbiBzcGVjaWZpZWQgZm9yIEBSZWxhdGlvbklkIGRlY29yYXRvci5cIik7XG4gICAgICAgIHRoaXMucmVsYXRpb24gPSByZWxhdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbklkTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRNZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGEgfSBmcm9tIFwiLi9FbnRpdHlNZXRhZGF0YVwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBzb21lIGVudGl0eSdzIHJlbGF0aW9uLlxuICovXG52YXIgUmVsYXRpb25NZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uTWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBwYXJlbnQgKGNhbiBiZSBvbmx5IG1hbnktdG8tb25lIHJlbGF0aW9uKSByZWxhdGlvbiBpbiB0aGUgdHJlZSB0YWJsZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVHJlZVBhcmVudCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgYSBjaGlsZHJlbiAoY2FuIGJlIG9ubHkgb25lLXRvLW1hbnkgcmVsYXRpb24pIHJlbGF0aW9uIGluIHRoZSB0cmVlIHRhYmxlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmVlQ2hpbGRyZW4gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHJlbGF0aW9uJ3MgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gICAgICAgICAqIENhbiBiZSB1c2VkIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvd25lciBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyByZWxhdGlvbiBpcyBsYXppbHkgbG9hZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0xhenkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHJlbGF0aW9uIGlzIGVhZ2VybHkgbG9hZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0VhZ2VyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcGVyc2lzdGVuY2UgaXMgZW5hYmxlZCBmb3IgdGhlIHJlbGF0aW9uLlxuICAgICAgICAgKiBCeSBkZWZhdWx0IGl0cyBlbmFibGVkLCBidXQgaWYgeW91IHdhbnQgdG8gYXZvaWQgYW55IGNoYW5nZXMgaW4gdGhlIHJlbGF0aW9uIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgZGF0YWJhc2UgeW91IGNhbiBkaXNhYmxlIGl0LlxuICAgICAgICAgKiBJZiBpdHMgZGlzYWJsZWQgeW91IGNhbiBvbmx5IGNoYW5nZSBhIHJlbGF0aW9uIGZyb20gaW52ZXJzZSBzaWRlIG9mIGEgcmVsYXRpb24gb3IgdXNpbmcgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBmdW5jdGlvbmFsaXR5LlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHNpbmNlIGl0cyBkaXNhYmxpbmcgYXZvaWQgbXVsdGlwbGUgZXh0cmEgcXVlcmllcyBkdXJpbmcgZW50aXR5IHNhdmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGVuIHJlbGF0ZWQgb2JqZWN0cyBhcmUgYWxsb3dlZCB0byBiZSBpbnNlcnRlZCB0byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZUluc2VydCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgcmVtb3ZlIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0byB0cnVlIHRoZW4gcmVsYXRlZCBvYmplY3RzIGFyZSBhbGxvd2VkIHRvIGJlIHNvZnQtcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDYXNjYWRlU29mdFJlbW92ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUgdGhlbiByZWxhdGVkIG9iamVjdHMgYXJlIGFsbG93ZWQgdG8gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZWNvdmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcmVsYXRpb24gY29sdW1uIHZhbHVlIGNhbiBiZSBudWxsYWJsZSBvciBub3QuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0cnVlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgd2lsbCBiZSBjcmVhdGVkIGZvciBqb2luIGNvbHVtbnMuXG4gICAgICAgICAqIENhbiBiZSB1c2VkIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvd25lciBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3JlYXRlRm9yZWlnbktleUNvbnN0cmFpbnRzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHNpZGUgaXMgYW4gb3duZXIgb2YgdGhpcyByZWxhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPd25pbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHJlbGF0aW9uJ3MgdHlwZSBpcyBcIm9uZS10by1vbmVcIi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPbmVUb09uZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24gaXMgb3duZXIgc2lkZSBvZiB0aGUgXCJvbmUtdG8tb25lXCIgcmVsYXRpb24uXG4gICAgICAgICAqIE93bmVyIHNpZGUgbWVhbnMgdGhpcyBzaWRlIG9mIHJlbGF0aW9uIGhhcyBhIGpvaW4gY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU93bmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbiBoYXMgYSBqb2luIGNvbHVtbiAoZS5nLiBpcyBpdCBtYW55LXRvLW9uZSBvciBvbmUtdG8tb25lIG93bmVyIHNpZGUpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1dpdGhKb2luQ29sdW1uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbiBpcyBOT1Qgb3duZXIgc2lkZSBvZiB0aGUgXCJvbmUtdG8tb25lXCIgcmVsYXRpb24uXG4gICAgICAgICAqIE5PVCBvd25lciBzaWRlIG1lYW5zIHRoaXMgc2lkZSBvZiByZWxhdGlvbiBkb2VzIG5vdCBoYXZlIGEgam9pbiBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc09uZVRvT25lTm90T3duZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHJlbGF0aW9uJ3MgdHlwZSBpcyBcIm9uZS10by1tYW55XCIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzT25lVG9NYW55ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbidzIHR5cGUgaXMgXCJtYW55LXRvLW9uZVwiLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc01hbnlUb09uZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24ncyB0eXBlIGlzIFwibWFueS10by1tYW55XCIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgcmVsYXRpb24ncyB0eXBlIGlzIFwibWFueS10by1tYW55XCIsIGFuZCBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gICAgICAgICAqIE93bmVyIHNpZGUgbWVhbnMgdGhpcyBzaWRlIG9mIHJlbGF0aW9uIGhhcyBhIGpvaW4gdGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueU93bmVyID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyByZWxhdGlvbidzIHR5cGUgaXMgXCJtYW55LXRvLW1hbnlcIiwgYW5kIGlzIE5PVCBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gICAgICAgICAqIE5vdCBvd25lciBzaWRlIG1lYW5zIHRoaXMgc2lkZSBvZiByZWxhdGlvbiBkb2VzIG5vdCBoYXZlIGEgam9pbiB0YWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNNYW55VG9NYW55Tm90T3duZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvcmVpZ24ga2V5cyBjcmVhdGVkIGZvciB0aGlzIHJlbGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb3JlaWduS2V5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSm9pbiB0YWJsZSBjb2x1bW5zLlxuICAgICAgICAgKiBKb2luIGNvbHVtbnMgY2FuIGJlIG9idGFpbmVkIG9ubHkgZnJvbSBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAgICAgICAgICogRnJvbSBub24tb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb24gam9pbiBjb2x1bW5zIHdpbGwgYmUgZW1wdHkuXG4gICAgICAgICAqIElmIHRoaXMgcmVsYXRpb24gaXMgYSBtYW55LXRvLW9uZS9vbmUtdG8tb25lIHRoZW4gaXQgdGFrZXMgam9pbiBjb2x1bW5zIGZyb20gdGhlIGN1cnJlbnQgZW50aXR5LlxuICAgICAgICAgKiBJZiB0aGlzIHJlbGF0aW9uIGlzIG1hbnktdG8tbWFueSB0aGVuIGl0IHRha2VzIGFsbCBvd25lciBqb2luIGNvbHVtbnMgZnJvbSB0aGUganVuY3Rpb24gZW50aXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW52ZXJzZSBqb2luIHRhYmxlIGNvbHVtbnMuXG4gICAgICAgICAqIEludmVyc2Ugam9pbiBjb2x1bW5zIGFyZSBzdXBwb3J0ZWQgb25seSBmb3IgbWFueS10by1tYW55IHJlbGF0aW9uc1xuICAgICAgICAgKiBhbmQgY2FuIGJlIG9idGFpbmVkIG9ubHkgZnJvbSBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAgICAgICAgICogRnJvbSBub24tb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb24gam9pbiBjb2x1bW5zIHdpbGwgYmUgdW5kZWZpbmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnMgPSBbXTtcbiAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YSA9IG9wdGlvbnMuZW50aXR5TWV0YWRhdGE7XG4gICAgICAgIHRoaXMuZW1iZWRkZWRNZXRhZGF0YSA9IG9wdGlvbnMuZW1iZWRkZWRNZXRhZGF0YTtcbiAgICAgICAgdmFyIGFyZ3MgPSBvcHRpb25zLmFyZ3M7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gYXJncy50YXJnZXQ7XG4gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gYXJncy5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHRoaXMucmVsYXRpb25UeXBlID0gYXJncy5yZWxhdGlvblR5cGU7XG4gICAgICAgIGlmIChhcmdzLmludmVyc2VTaWRlUHJvcGVydHkpXG4gICAgICAgICAgICB0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkgPSBhcmdzLmludmVyc2VTaWRlUHJvcGVydHk7XG4gICAgICAgIHRoaXMuaXNMYXp5ID0gYXJncy5pc0xhenkgfHwgZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuaXNDYXNjYWRlSW5zZXJ0ID0gYXJncy5vcHRpb25zLmNhc2NhZGUgPT09IHRydWUgfHwgKGFyZ3Mub3B0aW9ucy5jYXNjYWRlIGluc3RhbmNlb2YgQXJyYXkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcImluc2VydFwiKSAhPT0gLTEpO1xuICAgICAgICAvLyB0aGlzLmlzQ2FzY2FkZVVwZGF0ZSA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChhcmdzLm9wdGlvbnMuY2FzY2FkZSBpbnN0YW5jZW9mIEFycmF5ICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJ1cGRhdGVcIikgIT09IC0xKTtcbiAgICAgICAgLy8gdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoYXJncy5vcHRpb25zLmNhc2NhZGUgaW5zdGFuY2VvZiBBcnJheSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVtb3ZlXCIpICE9PSAtMSk7XG4gICAgICAgIC8vIHRoaXMuaXNDYXNjYWRlU29mdFJlbW92ZSA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChhcmdzLm9wdGlvbnMuY2FzY2FkZSBpbnN0YW5jZW9mIEFycmF5ICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJzb2Z0LXJlbW92ZVwiKSAhPT0gLTEpO1xuICAgICAgICAvLyB0aGlzLmlzQ2FzY2FkZVJlY292ZXIgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoYXJncy5vcHRpb25zLmNhc2NhZGUgaW5zdGFuY2VvZiBBcnJheSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVjb3ZlclwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZUluc2VydCA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KGFyZ3Mub3B0aW9ucy5jYXNjYWRlKSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwiaW5zZXJ0XCIpICE9PSAtMSk7XG4gICAgICAgIHRoaXMuaXNDYXNjYWRlVXBkYXRlID0gYXJncy5vcHRpb25zLmNhc2NhZGUgPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkoYXJncy5vcHRpb25zLmNhc2NhZGUpICYmIGFyZ3Mub3B0aW9ucy5jYXNjYWRlLmluZGV4T2YoXCJ1cGRhdGVcIikgIT09IC0xKTtcbiAgICAgICAgdGhpcy5pc0Nhc2NhZGVSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShhcmdzLm9wdGlvbnMuY2FzY2FkZSkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcInJlbW92ZVwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzQ2FzY2FkZVNvZnRSZW1vdmUgPSBhcmdzLm9wdGlvbnMuY2FzY2FkZSA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShhcmdzLm9wdGlvbnMuY2FzY2FkZSkgJiYgYXJncy5vcHRpb25zLmNhc2NhZGUuaW5kZXhPZihcInNvZnQtcmVtb3ZlXCIpICE9PSAtMSk7XG4gICAgICAgIHRoaXMuaXNDYXNjYWRlUmVjb3ZlciA9IGFyZ3Mub3B0aW9ucy5jYXNjYWRlID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KGFyZ3Mub3B0aW9ucy5jYXNjYWRlKSAmJiBhcmdzLm9wdGlvbnMuY2FzY2FkZS5pbmRleE9mKFwicmVjb3ZlclwiKSAhPT0gLTEpO1xuICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGFyZ3Mub3B0aW9ucy5wcmltYXJ5IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBhcmdzLm9wdGlvbnMubnVsbGFibGUgPT09IGZhbHNlIHx8IHRoaXMuaXNQcmltYXJ5ID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLm9uRGVsZXRlID0gYXJncy5vcHRpb25zLm9uRGVsZXRlO1xuICAgICAgICB0aGlzLm9uVXBkYXRlID0gYXJncy5vcHRpb25zLm9uVXBkYXRlO1xuICAgICAgICB0aGlzLmRlZmVycmFibGUgPSBhcmdzLm9wdGlvbnMuZGVmZXJyYWJsZTtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JlaWduS2V5Q29uc3RyYWludHMgPSBhcmdzLm9wdGlvbnMuY3JlYXRlRm9yZWlnbktleUNvbnN0cmFpbnRzID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0VhZ2VyID0gYXJncy5vcHRpb25zLmVhZ2VyIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlRW5hYmxlZCA9IGFyZ3Mub3B0aW9ucy5wZXJzaXN0ZW5jZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIHRoaXMub3JwaGFuZWRSb3dBY3Rpb24gPSBhcmdzLm9wdGlvbnMub3JwaGFuZWRSb3dBY3Rpb24gfHwgXCJudWxsaWZ5XCI7XG4gICAgICAgIHRoaXMuaXNUcmVlUGFyZW50ID0gYXJncy5pc1RyZWVQYXJlbnQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaXNUcmVlQ2hpbGRyZW4gPSBhcmdzLmlzVHJlZUNoaWxkcmVuIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnR5cGUgPSBhcmdzLnR5cGUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGFyZ3MudHlwZSgpIDogYXJncy50eXBlO1xuICAgICAgICB0aGlzLmlzT25lVG9PbmUgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJvbmUtdG8tb25lXCI7XG4gICAgICAgIHRoaXMuaXNPbmVUb01hbnkgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJvbmUtdG8tbWFueVwiO1xuICAgICAgICB0aGlzLmlzTWFueVRvT25lID0gdGhpcy5yZWxhdGlvblR5cGUgPT09IFwibWFueS10by1vbmVcIjtcbiAgICAgICAgdGhpcy5pc01hbnlUb01hbnkgPSB0aGlzLnJlbGF0aW9uVHlwZSA9PT0gXCJtYW55LXRvLW1hbnlcIjtcbiAgICAgICAgdGhpcy5pc09uZVRvT25lTm90T3duZXIgPSB0aGlzLmlzT25lVG9PbmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMuaXNNYW55VG9NYW55Tm90T3duZXIgPSB0aGlzLmlzTWFueVRvTWFueSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGpvaW4gY29sdW1uIGlkcyBtYXAgZnJvbSB0aGUgZ2l2ZW4gcmVsYXRlZCBlbnRpdHkgaWRzIGFycmF5LlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmdldFJlbGF0aW9uSWRNYXAgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHRoaXMuaXNPd25pbmcgPyB0aGlzLmpvaW5Db2x1bW5zIDogdGhpcy5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHZhciByZWZlcmVuY2VkQ29sdW1ucyA9IGpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uOyB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbnRpdHlcIiwgZW50aXR5KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWZlcmVuY2VkQ29sdW1uc1wiLCByZWZlcmVuY2VkQ29sdW1ucyk7XG4gICAgICAgIHJldHVybiBFbnRpdHlNZXRhZGF0YS5nZXRWYWx1ZU1hcChlbnRpdHksIHJlZmVyZW5jZWRDb2x1bW5zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCBnaXZlbiBvYmplY3QgaXMgYW4gZW50aXR5IGlkIG1hcC5cbiAgICAgKiBJZiBnaXZlbiBpZCBpcyBhbiBvYmplY3QgdGhlbiBpdCBtZWFucyBpdHMgYWxyZWFkeSBpZCBtYXAuXG4gICAgICogSWYgZ2l2ZW4gaWQgaXNuJ3QgYW4gb2JqZWN0IHRoZW4gaXQgbWVhbnMgaXRzIGEgdmFsdWUgb2YgdGhlIGlkIGNvbHVtblxuICAgICAqIGFuZCBpdCBjcmVhdGVzIGEgbmV3IGlkIG1hcCB3aXRoIHRoaXMgdmFsdWUgYW5kIG5hbWUgb2YgdGhlIHByaW1hcnkgY29sdW1uLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmVuc3VyZVJlbGF0aW9uSWRNYXAgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB2YXIgam9pbkNvbHVtbnMgPSB0aGlzLmlzT3duaW5nID8gdGhpcy5qb2luQ29sdW1ucyA6IHRoaXMuaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zO1xuICAgICAgICB2YXIgcmVmZXJlbmNlZENvbHVtbnMgPSBqb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHsgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbjsgfSk7XG4gICAgICAgIGlmIChyZWZlcmVuY2VkQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBjcmVhdGUgcmVsYXRpb24gaWQgbWFwIGZvciBhIHNpbmdsZSB2YWx1ZSBiZWNhdXNlIHJlbGF0aW9uIGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZWQgY29sdW1ucy5cIik7XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkQ29sdW1uc1swXS5jcmVhdGVWYWx1ZU1hcChpZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqIElmIGNvbHVtbiBpcyBpbiBlbWJlZGRlZCAob3IgcmVjdXJzaXZlIGVtYmVkZGVkKSBpdCBleHRyYWN0cyBpdHMgdmFsdWUgZnJvbSB0aGVyZS5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5nZXRFbnRpdHlWYWx1ZSA9IGZ1bmN0aW9uIChlbnRpdHksIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGVudGl0eSA9PT0gbnVsbCB8fCBlbnRpdHkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGV4dHJhY3QgY29sdW1uIHZhbHVlIGZyb20gZW1iZWRkZWRzIG9mIGVudGl0eSBpZiBjb2x1bW4gaXMgaW4gZW1iZWRkZWRcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZXhhbXBsZTogcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdLmlkIHdoZXJlIFwiZGF0YVwiLCBcImluZm9ybWF0aW9uXCIgYW5kIFwiY291bnRlcnNcIiBhcmUgZW1iZWRkZWRzXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCB2YWx1ZSBvZiBcImlkXCIgY29sdW1uIGZyb20gdGhlIHBvc3QgcmVhbCBlbnRpdHkgb2JqZWN0XG4gICAgICAgICAgICAvLyBmaXJzdCBzdGVwIC0gd2UgZXh0cmFjdCBhbGwgcGFyZW50IHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSByZWxhdGl2ZSB0byB0aGlzIGNvbHVtbiwgZS5nLiBbZGF0YSwgaW5mb3JtYXRpb24sIGNvdW50ZXJzXVxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBuZXh0IHdlIG5lZWQgdG8gYWNjZXNzIHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXVt0aGlzLnByb3BlcnR5TmFtZV0gdG8gZ2V0IGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBjb3VudGVyc1xuICAgICAgICAgICAgLy8gdGhpcyByZWN1cnNpdmUgZnVuY3Rpb24gdGFrZXMgYXJyYXkgb2YgZ2VuZXJhdGVkIHByb3BlcnR5IG5hbWVzIGFuZCBnZXRzIHRoZSBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc10gZW1iZWRcbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZXMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMShwcm9wZXJ0eU5hbWVzLCB2YWx1ZVtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gb25jZSB3ZSBnZXQgbmVzdGVkIGVtYmVkIG9iamVjdCB3ZSBnZXQgaXRzIGNvbHVtbiwgZS5nLiBwb3N0W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRPYmplY3QgPSBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8xKHByb3BlcnR5TmFtZXMsIGVudGl0eSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRPYmplY3RbXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCJdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdFtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl07XG4gICAgICAgICAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbWJlZGRlZE9iamVjdCA/IGVtYmVkZGVkT2JqZWN0W3RoaXMuaXNMYXp5ID8gXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCIgOiB0aGlzLnByb3BlcnR5TmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBuYW1lIGJ5IHByb3BlcnR5IG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXp5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudGl0eVtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eVtcIl9fXCIgKyB0aGlzLnByb3BlcnR5TmFtZSArIFwiX19cIl07XG4gICAgICAgICAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlbdGhpcy5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5W3RoaXMucHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBnaXZlbiBlbnRpdHkncyByZWxhdGlvbidzIHZhbHVlLlxuICAgICAqIFVzaW5nIG9mIHRoaXMgbWV0aG9kIGhlbHBzIHRvIHNldCBlbnRpdHkgcmVsYXRpb24ncyB2YWx1ZSBvZiB0aGUgbGF6eSBhbmQgbm9uLWxhenkgcmVsYXRpb25zLlxuICAgICAqXG4gICAgICogSWYgbWVyZ2UgaXMgc2V0IHRvIHRydWUsIGl0IG1lcmdlcyBnaXZlbiB2YWx1ZSBpbnRvIGN1cnJlbnRseVxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLnNldEVudGl0eVZhbHVlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHRoaXMuaXNMYXp5ID8gXCJfX1wiICsgdGhpcy5wcm9wZXJ0eU5hbWUgKyBcIl9fXCIgOiB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcCAtIHdlIGV4dHJhY3QgYWxsIHBhcmVudCBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgcmVsYXRpdmUgdG8gdGhpcyBjb2x1bW4sIGUuZy4gW2RhdGEsIGluZm9ybWF0aW9uLCBjb3VudGVyc11cbiAgICAgICAgICAgIHZhciBleHRyYWN0RW1iZWRkZWRDb2x1bW5WYWx1ZV8yID0gZnVuY3Rpb24gKGVtYmVkZGVkTWV0YWRhdGFzLCBtYXApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIW9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgLy8gICAgIG9iamVjdFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0gPSBlbWJlZGRlZE1ldGFkYXRhLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBlbWJlZGRlZE1ldGFkYXRhID0gZW1iZWRkZWRNZXRhZGF0YXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1iZWRkZWRNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcFtlbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBbZW1iZWRkZWRNZXRhZGF0YS5wcm9wZXJ0eU5hbWVdID0gZW1iZWRkZWRNZXRhZGF0YS5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMihlbWJlZGRlZE1ldGFkYXRhcywgbWFwW2VtYmVkZGVkTWV0YWRhdGEucHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMihfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLmVtYmVkZGVkTWV0YWRhdGFUcmVlKSwgZmFsc2UpLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW50aXR5W3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBlbnRpdHkgaWQgbWFwIGZyb20gdGhlIGdpdmVuIGVudGl0eSBpZHMgYXJyYXkuXG4gICAgICovXG4gICAgUmVsYXRpb25NZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlVmFsdWVNYXAgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBleHRyYWN0IGNvbHVtbiB2YWx1ZSBmcm9tIGVtYmVkcyBvZiBlbnRpdHkgaWYgY29sdW1uIGlzIGluIGVtYmVkZGVkXG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IHBvc3RbZGF0YV1baW5mb3JtYXRpb25dW2NvdW50ZXJzXS5pZCB3aGVyZSBcImRhdGFcIiwgXCJpbmZvcm1hdGlvblwiIGFuZCBcImNvdW50ZXJzXCIgYXJlIGVtYmVkZGVkc1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdmFsdWUgb2YgXCJpZFwiIGNvbHVtbiBmcm9tIHRoZSBwb3N0IHJlYWwgZW50aXR5IG9iamVjdCBhbmQgcmV0dXJuIGl0IGluIGFcbiAgICAgICAgICAgIC8vIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogeyBpZDogLi4uIH0gfSB9IH0gZm9ybWF0XG4gICAgICAgICAgICAvLyBmaXJzdCBzdGVwIC0gd2UgZXh0cmFjdCBhbGwgcGFyZW50IHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSByZWxhdGl2ZSB0byB0aGlzIGNvbHVtbiwgZS5nLiBbZGF0YSwgaW5mb3JtYXRpb24sIGNvdW50ZXJzXVxuICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5lbWJlZGRlZE1ldGFkYXRhLnBhcmVudFByb3BlcnR5TmFtZXMpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBub3cgbmVlZCB0byBhY2Nlc3MgcG9zdFtkYXRhXVtpbmZvcm1hdGlvbl1bY291bnRlcnNdIHRvIGdldCBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgY291bnRlcnNcbiAgICAgICAgICAgIC8vIGFuZCBvbiBlYWNoIHN0ZXAgd2UgbmVlZCB0byBjcmVhdGUgY29tcGxleCBsaXRlcmFsIG9iamVjdCwgZS5nLiBmaXJzdCB7IGRhdGEgfSxcbiAgICAgICAgICAgIC8vIHRoZW4geyBkYXRhOiB7IGluZm9ybWF0aW9uIH0gfSwgdGhlbiB7IGRhdGE6IHsgaW5mb3JtYXRpb246IHsgY291bnRlcnMgfSB9IH0sXG4gICAgICAgICAgICAvLyB0aGVuIHsgZGF0YTogeyBpbmZvcm1hdGlvbjogeyBjb3VudGVyczogW3RoaXMucHJvcGVydHlOYW1lXTogZW50aXR5W2RhdGFdW2luZm9ybWF0aW9uXVtjb3VudGVyc11bdGhpcy5wcm9wZXJ0eU5hbWVdIH0gfSB9XG4gICAgICAgICAgICAvLyB0aGlzIHJlY3Vyc2l2ZSBmdW5jdGlvbiBoZWxwcyBkb2luZyB0aGF0XG4gICAgICAgICAgICB2YXIgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWVzLCBtYXApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW3Byb3BlcnR5TmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyhwcm9wZXJ0eU5hbWVzLCBtYXBbcHJvcGVydHlOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtfdGhpcy5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEVtYmVkZGVkQ29sdW1uVmFsdWVfMyhwcm9wZXJ0eU5hbWVzLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIG5vIGVtYmVkcyAtIG5vIHByb2JsZW1zLiBTaW1wbHkgcmV0dXJuIGNvbHVtbiBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgdmFsdWUgb2YgdGhlIGVudGl0eVxuICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sIF9hW3RoaXMucHJvcGVydHlOYW1lXSA9IHZhbHVlLCBfYTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQnVpbGRlciBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHNvbWUgZGVwZW5kIHJlbGF0aW9uIG1ldGFkYXRhIHByb3BlcnRpZXMuXG4gICAgICogVGhpcyBidWlsZGVyIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGFmdGVyIGVtYmVkZGVkIG1ldGFkYXRhIHRyZWUgd2FzIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHRoaXMuYnVpbGRQcm9wZXJ0eVBhdGgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBnaXZlbiBmb3JlaWduIGtleXMgaW4gdGhlIHJlbGF0aW9uLlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9yZWlnbiBrZXkgaW4gdGhlIHJlbGF0aW9uLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLnJlZ2lzdGVyRm9yZWlnbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGZvcmVpZ25LZXlzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBmb3JlaWduS2V5c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuZm9yZWlnbktleXMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChmb3JlaWduS2V5cyksIGZhbHNlKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgZ2l2ZW4gam9pbiBjb2x1bW5zIGluIHRoZSByZWxhdGlvbi5cbiAgICAgKiBUaGlzIGJ1aWxkZXIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGpvaW4gY29sdW1uIGluIHRoZSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5yZWdpc3RlckpvaW5Db2x1bW5zID0gZnVuY3Rpb24gKGpvaW5Db2x1bW5zLCBpbnZlcnNlSm9pbkNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGpvaW5Db2x1bW5zID09PSB2b2lkIDApIHsgam9pbkNvbHVtbnMgPSBbXTsgfVxuICAgICAgICBpZiAoaW52ZXJzZUpvaW5Db2x1bW5zID09PSB2b2lkIDApIHsgaW52ZXJzZUpvaW5Db2x1bW5zID0gW107IH1cbiAgICAgICAgdGhpcy5qb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zO1xuICAgICAgICB0aGlzLmludmVyc2VKb2luQ29sdW1ucyA9IGludmVyc2VKb2luQ29sdW1ucztcbiAgICAgICAgdGhpcy5pc093bmluZyA9IHRoaXMuaXNNYW55VG9PbmUgfHwgKCh0aGlzLmlzTWFueVRvTWFueSB8fCB0aGlzLmlzT25lVG9PbmUpICYmIHRoaXMuam9pbkNvbHVtbnMubGVuZ3RoID4gMCk7XG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU93bmVyID0gdGhpcy5pc09uZVRvT25lICYmIHRoaXMuaXNPd25pbmc7XG4gICAgICAgIHRoaXMuaXNPbmVUb09uZU5vdE93bmVyID0gdGhpcy5pc09uZVRvT25lICYmICF0aGlzLmlzT3duaW5nO1xuICAgICAgICB0aGlzLmlzTWFueVRvTWFueU93bmVyID0gdGhpcy5pc01hbnlUb01hbnkgJiYgdGhpcy5pc093bmluZztcbiAgICAgICAgdGhpcy5pc01hbnlUb01hbnlOb3RPd25lciA9IHRoaXMuaXNNYW55VG9NYW55ICYmICF0aGlzLmlzT3duaW5nO1xuICAgICAgICB0aGlzLmlzV2l0aEpvaW5Db2x1bW4gPSB0aGlzLmlzTWFueVRvT25lIHx8IHRoaXMuaXNPbmVUb09uZU93bmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgZ2l2ZW4ganVuY3Rpb24gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2QgY2FuIGJlIGNhbGxlZCBhZnRlciBqdW5jdGlvbiBlbnRpdHkgbWV0YWRhdGEgZm9yIHRoZSBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgUmVsYXRpb25NZXRhZGF0YS5wcm90b3R5cGUucmVnaXN0ZXJKdW5jdGlvbkVudGl0eU1ldGFkYXRhID0gZnVuY3Rpb24gKGp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy5qdW5jdGlvbkVudGl0eU1ldGFkYXRhID0ganVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5qb2luVGFibGVOYW1lID0ganVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgIGlmICh0aGlzLmludmVyc2VSZWxhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbnZlcnNlUmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSA9IGp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICB0aGlzLmpvaW5UYWJsZU5hbWUgPSBqdW5jdGlvbkVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIGludmVyc2Ugc2lkZSBwcm9wZXJ0eSBwYXRoIGJhc2VkIG9uIGdpdmVuIGludmVyc2Ugc2lkZSBwcm9wZXJ0eSBmYWN0b3J5LlxuICAgICAqIFRoaXMgYnVpbGRlciBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlciBwcm9wZXJ0aWVzIG1hcCBvZiB0aGUgaW52ZXJzZSBlbnRpdHkgbWV0YWRhdGEgd2FzIGJ1aWxkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkSW52ZXJzZVNpZGVQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkpIHtcbiAgICAgICAgICAgIHZhciBvd25lckVudGl0eVByb3BlcnRpZXNNYXAgPSB0aGlzLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdpdmVuSW52ZXJzZVNpZGVQcm9wZXJ0eUZhY3RvcnkgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5naXZlbkludmVyc2VTaWRlUHJvcGVydHlGYWN0b3J5KG93bmVyRW50aXR5UHJvcGVydGllc01hcCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ2l2ZW5JbnZlcnNlU2lkZVByb3BlcnR5RmFjdG9yeSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5naXZlbkludmVyc2VTaWRlUHJvcGVydHlGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNUcmVlUGFyZW50ICYmIHRoaXMuZW50aXR5TWV0YWRhdGEudHJlZUNoaWxkcmVuUmVsYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudGl0eU1ldGFkYXRhLnRyZWVDaGlsZHJlblJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVHJlZUNoaWxkcmVuICYmIHRoaXMuZW50aXR5TWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlNZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbGF0aW9uJ3MgcHJvcGVydHkgcGF0aCBiYXNlZCBvbiBpdHMgZW1iZWRkZWQgdHJlZS5cbiAgICAgKi9cbiAgICBSZWxhdGlvbk1ldGFkYXRhLnByb3RvdHlwZS5idWlsZFByb3BlcnR5UGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVtYmVkZGVkTWV0YWRhdGEgfHwgIXRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRNZXRhZGF0YS5wYXJlbnRQcm9wZXJ0eU5hbWVzLmpvaW4oXCIuXCIpICsgXCIuXCIgKyB0aGlzLnByb3BlcnR5TmFtZTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbk1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uTWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25NZXRhZGF0YS5qcy5tYXBcbiIsImltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBVbmlxdWUgbWV0YWRhdGEgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRhYmxlJ3MgdW5pcXVlIGNvbnN0cmFpbnRzLlxuICovXG52YXIgVW5pcXVlTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBVbmlxdWVNZXRhZGF0YShvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWUgY29sdW1ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTWFwIG9mIGNvbHVtbiBuYW1lcyB3aXRoIG9yZGVyIHNldC5cbiAgICAgICAgICogVXNlZCBvbmx5IGJ5IE1vbmdvREIgZHJpdmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IHt9O1xuICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhID0gb3B0aW9ucy5lbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZE1ldGFkYXRhID0gb3B0aW9ucy5lbWJlZGRlZE1ldGFkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IG9wdGlvbnMuYXJncy50YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLmdpdmVuTmFtZSA9IG9wdGlvbnMuYXJncy5uYW1lO1xuICAgICAgICAgICAgdGhpcy5naXZlbkNvbHVtbk5hbWVzID0gb3B0aW9ucy5hcmdzLmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIEJ1aWxkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgc29tZSBkZXBlbmQgdW5pcXVlIGNvbnN0cmFpbnQgcHJvcGVydGllcy5cbiAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgZW50aXR5IG1ldGFkYXRhJ3MgcHJvcGVydGllcyBtYXAsIGNvbHVtbnMgYW5kIHJlbGF0aW9ucyBhcmUgYnVpbHQuXG4gICAgICovXG4gICAgVW5pcXVlTWV0YWRhdGEucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKG5hbWluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtYXAgPSB7fTtcbiAgICAgICAgLy8gaWYgY29sdW1ucyBhbHJlYWR5IGFuIGFycmF5IG9mIHN0cmluZyB0aGVuIHNpbXBseSByZXR1cm4gaXRcbiAgICAgICAgaWYgKHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcykge1xuICAgICAgICAgICAgdmFyIGNvbHVtblByb3BlcnR5UGF0aHMgPSBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZ2l2ZW5Db2x1bW5OYW1lcykpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5Qcm9wZXJ0eVBhdGhzID0gdGhpcy5naXZlbkNvbHVtbk5hbWVzLm1hcChmdW5jdGlvbiAoY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZW1iZWRkZWRNZXRhZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbWJlZGRlZE1ldGFkYXRhLnByb3BlcnR5UGF0aCArIFwiLlwiICsgY29sdW1uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7IHJldHVybiBtYXBbcHJvcGVydHlQYXRoXSA9IDE7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgY29sdW1ucyBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcnJheSBvZiBmaWVsZCBuYW1lcyB0aGVuIGV4ZWN1dGUgaXQgYW5kIGdldCBjb2x1bW5zIG5hbWVzIGZyb20gaXRcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uc0ZuUmVzdWx0XzEgPSB0aGlzLmdpdmVuQ29sdW1uTmFtZXModGhpcy5lbnRpdHlNZXRhZGF0YS5wcm9wZXJ0aWVzTWFwKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5zRm5SZXN1bHRfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocyA9IGNvbHVtbnNGblJlc3VsdF8xLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gU3RyaW5nKGkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXBbbmFtZV0gPSAxOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblByb3BlcnR5UGF0aHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zRm5SZXN1bHRfMSkuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gbWFwW2NvbHVtbk5hbWVdID0gY29sdW1uc0ZuUmVzdWx0XzFbY29sdW1uTmFtZV07IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtblByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uV2l0aFNhbWVOYW1lID0gX3RoaXMuZW50aXR5TWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggPT09IHByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbldpdGhTYW1lTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2NvbHVtbldpdGhTYW1lTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbldpdGhTYW1lTmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnJlbGF0aW9ucy5maW5kKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24uaXNXaXRoSm9pbkNvbHVtbiAmJiByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uV2l0aFNhbWVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbldpdGhTYW1lTmFtZS5qb2luQ29sdW1ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4TmFtZSA9IF90aGlzLmdpdmVuTmFtZSA/IFwiXFxcIlwiICsgX3RoaXMuZ2l2ZW5OYW1lICsgXCJcXFwiIFwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICB2YXIgZW50aXR5TmFtZSA9IF90aGlzLmVudGl0eU1ldGFkYXRhLnRhcmdldE5hbWU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlVuaXF1ZSBjb25zdHJhaW50IFwiICsgaW5kZXhOYW1lICsgXCJjb250YWlucyBjb2x1bW4gdGhhdCBpcyBtaXNzaW5nIGluIHRoZSBlbnRpdHkgKFwiICsgZW50aXR5TmFtZSArIFwiKTogXCIgKyBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmNvbmNhdChiKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lc1dpdGhPcmRlcmluZ01hcCA9IE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKGZ1bmN0aW9uICh1cGRhdGVkTWFwLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdGhpcy5lbnRpdHlNZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLnByb3BlcnR5UGF0aCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4pXG4gICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtjb2x1bW4uZGF0YWJhc2VQYXRoXSA9IG1hcFtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5naXZlbk5hbWUgPyB0aGlzLmdpdmVuTmFtZSA6IG5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKHRoaXMuZW50aXR5TWV0YWRhdGEudGFibGVOYW1lLCB0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWU7IH0pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gVW5pcXVlTWV0YWRhdGE7XG59KCkpO1xuZXhwb3J0IHsgVW5pcXVlTWV0YWRhdGEgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5pcXVlTWV0YWRhdGEuanMubWFwXG4iLCIvKipcbiAqIFByb3ZpZGVzIGEgY29uc3RhbnRzIGZvciBlYWNoIGVudGl0eSBsaXN0ZW5lciB0eXBlLlxuICovXG52YXIgRXZlbnRMaXN0ZW5lclR5cGVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50TGlzdGVuZXJUeXBlcygpIHtcbiAgICB9XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX0xPQUQgPSBcImFmdGVyLWxvYWRcIjtcbiAgICBFdmVudExpc3RlbmVyVHlwZXMuQkVGT1JFX0lOU0VSVCA9IFwiYmVmb3JlLWluc2VydFwiO1xuICAgIEV2ZW50TGlzdGVuZXJUeXBlcy5BRlRFUl9JTlNFUlQgPSBcImFmdGVyLWluc2VydFwiO1xuICAgIEV2ZW50TGlzdGVuZXJUeXBlcy5CRUZPUkVfVVBEQVRFID0gXCJiZWZvcmUtdXBkYXRlXCI7XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkFGVEVSX1VQREFURSA9IFwiYWZ0ZXItdXBkYXRlXCI7XG4gICAgRXZlbnRMaXN0ZW5lclR5cGVzLkJFRk9SRV9SRU1PVkUgPSBcImJlZm9yZS1yZW1vdmVcIjtcbiAgICBFdmVudExpc3RlbmVyVHlwZXMuQUZURVJfUkVNT1ZFID0gXCJhZnRlci1yZW1vdmVcIjtcbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lclR5cGVzO1xufSgpKTtcbmV4cG9ydCB7IEV2ZW50TGlzdGVuZXJUeXBlcyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudExpc3RlbmVyVHlwZXMuanMubWFwXG4iLCIvKipcbiAqIFJlcHJlc2VudHMgZW50aXR5IG9mIHRoZSBtaWdyYXRpb24gaW4gdGhlIGRhdGFiYXNlLlxuICovXG52YXIgTWlncmF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBNaWdyYXRpb24oaWQsIHRpbWVzdGFtcCwgbmFtZSwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gTWlncmF0aW9uO1xufSgpKTtcbmV4cG9ydCB7IE1pZ3JhdGlvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NaWdyYXRpb24uanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IE1pZ3JhdGlvbiB9IGZyb20gXCIuL01pZ3JhdGlvblwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBNc3NxbFBhcmFtZXRlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL01zc3FsUGFyYW1ldGVyXCI7XG5pbXBvcnQgeyBSZGJtc1NjaGVtYUJ1aWxkZXIgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvUmRibXNTY2hlbWFCdWlsZGVyXCI7XG5pbXBvcnQgeyBNb25nb0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvbW9uZ29kYi9Nb25nb0RyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEV4ZWN1dGVzIG1pZ3JhdGlvbnM6IHJ1bnMgcGVuZGluZyBhbmQgcmV2ZXJ0cyBwcmV2aW91c2x5IGV4ZWN1dGVkIG1pZ3JhdGlvbnMuXG4gKi9cbnZhciBNaWdyYXRpb25FeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gTWlncmF0aW9uRXhlY3V0b3IoY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBob3cgbWlncmF0aW9ucyBzaG91bGQgYmUgcnVuIGluIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogICBhbGw6IGFsbCBtaWdyYXRpb25zIGFyZSBydW4gaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICogICBub25lOiBhbGwgbWlncmF0aW9ucyBhcmUgcnVuIHdpdGhvdXQgYSB0cmFuc2FjdGlvblxuICAgICAgICAgKiAgIGVhY2g6IGVhY2ggbWlncmF0aW9uIGlzIHJ1biBpbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gXCJhbGxcIjtcbiAgICAgICAgdmFyIHNjaGVtYSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5zY2hlbWE7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2U7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc0RhdGFiYXNlID0gZGF0YWJhc2U7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc1NjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5taWdyYXRpb25zVGFibGVOYW1lID0gY29ubmVjdGlvbi5vcHRpb25zLm1pZ3JhdGlvbnNUYWJsZU5hbWUgfHwgXCJtaWdyYXRpb25zXCI7XG4gICAgICAgIHRoaXMubWlncmF0aW9uc1RhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZSh0aGlzLm1pZ3JhdGlvbnNUYWJsZU5hbWUsIHNjaGVtYSwgZGF0YWJhc2UpO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gZXhlY3V0ZSBhIHNpbmdsZSBtaWdyYXRpb24gZ2l2ZW4uXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMud2l0aFF1ZXJ5UnVubmVyKGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWlncmF0aW9uLmluc3RhbmNlLnVwKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbWlncmF0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1pZ3JhdGlvbnMuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldEFsbE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0TWlncmF0aW9ucygpKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBleGVjdXRlZCBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5nZXRFeGVjdXRlZE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMud2l0aFF1ZXJ5UnVubmVyKGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkRXhlY3V0ZWRNaWdyYXRpb25zKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9hLnNlbnQoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBwZW5kaW5nIG1pZ3JhdGlvbnMuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldFBlbmRpbmdNaWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYWxsTWlncmF0aW9ucywgZXhlY3V0ZWRNaWdyYXRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEFsbE1pZ3JhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1pZ3JhdGlvbnMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEV4ZWN1dGVkTWlncmF0aW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbE1pZ3JhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFleGVjdXRlZE1pZ3JhdGlvbnMuZmluZChmdW5jdGlvbiAoZXhlY3V0ZWRNaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlZE1pZ3JhdGlvbi5uYW1lID09PSBtaWdyYXRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gZXhlY3V0ZWQgbWlncmF0aW9uLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5pbnNlcnRNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhRdWVyeVJ1bm5lcihmdW5jdGlvbiAocSkgeyByZXR1cm4gX3RoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocSwgbWlncmF0aW9uKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGFuIGV4ZWN1dGVkIG1pZ3JhdGlvbi5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUuZGVsZXRlTWlncmF0aW9uID0gZnVuY3Rpb24gKG1pZ3JhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoUXVlcnlSdW5uZXIoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIF90aGlzLmRlbGV0ZUV4ZWN1dGVkTWlncmF0aW9uKHEsIG1pZ3JhdGlvbik7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTGlzdHMgYWxsIG1pZ3JhdGlvbnMgYW5kIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQgb3Igbm90XG4gICAgICogcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSB1bmFwcGxpZWQgbWlncmF0aW9uc1xuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5zaG93TWlncmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGhhc1VuYXBwbGllZE1pZ3JhdGlvbnMsIHF1ZXJ5UnVubmVyLCBleGVjdXRlZE1pZ3JhdGlvbnMsIGFsbE1pZ3JhdGlvbnMsIF9sb29wXzEsIHRoaXNfMSwgYWxsTWlncmF0aW9uc18xLCBhbGxNaWdyYXRpb25zXzFfMSwgbWlncmF0aW9uO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmFwcGxpZWRNaWdyYXRpb25zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9ucyB0YWJsZSBpZiBpdHMgbm90IGNyZWF0ZWQgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1pZ3JhdGlvbnNUYWJsZUlmTm90RXhpc3QocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG1pZ3JhdGlvbnMgdGFibGUgaWYgaXRzIG5vdCBjcmVhdGVkIHlldFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkRXhlY3V0ZWRNaWdyYXRpb25zKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkTWlncmF0aW9ucyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1pZ3JhdGlvbnMgPSB0aGlzLmdldE1pZ3JhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEgPSBmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGVkTWlncmF0aW9uID0gZXhlY3V0ZWRNaWdyYXRpb25zLmZpbmQoZnVuY3Rpb24gKGV4ZWN1dGVkTWlncmF0aW9uKSB7IHJldHVybiBleGVjdXRlZE1pZ3JhdGlvbi5uYW1lID09PSBtaWdyYXRpb24ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGVkTWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcIiBbWF0gXCIgKyBtaWdyYXRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmFwcGxpZWRNaWdyYXRpb25zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiIFsgXSBcIiArIG1pZ3JhdGlvbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhbGxNaWdyYXRpb25zXzEgPSBfX3ZhbHVlcyhhbGxNaWdyYXRpb25zKSwgYWxsTWlncmF0aW9uc18xXzEgPSBhbGxNaWdyYXRpb25zXzEubmV4dCgpOyAhYWxsTWlncmF0aW9uc18xXzEuZG9uZTsgYWxsTWlncmF0aW9uc18xXzEgPSBhbGxNaWdyYXRpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZ3JhdGlvbiA9IGFsbE1pZ3JhdGlvbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKG1pZ3JhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxNaWdyYXRpb25zXzFfMSAmJiAhYWxsTWlncmF0aW9uc18xXzEuZG9uZSAmJiAoX2EgPSBhbGxNaWdyYXRpb25zXzEucmV0dXJuKSkgX2EuY2FsbChhbGxNaWdyYXRpb25zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgaGFzVW5hcHBsaWVkTWlncmF0aW9uc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYWxsIHBlbmRpbmcgbWlncmF0aW9ucy4gUGVuZGluZyBtaWdyYXRpb25zIGFyZSBtaWdyYXRpb25zIHRoYXQgYXJlIG5vdCB5ZXQgZXhlY3V0ZWQsXG4gICAgICogdGh1cyBub3Qgc2F2ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5leGVjdXRlUGVuZGluZ01pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgc2NoZW1hQnVpbGRlciwgZXhlY3V0ZWRNaWdyYXRpb25zLCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLCBhbGxNaWdyYXRpb25zLCBzdWNjZXNzTWlncmF0aW9ucywgcGVuZGluZ01pZ3JhdGlvbnMsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIF9sb29wXzIsIHRoaXNfMiwgcGVuZGluZ01pZ3JhdGlvbnNfMSwgcGVuZGluZ01pZ3JhdGlvbnNfMV8xLCBtaWdyYXRpb24sIGVfMl8xLCBlcnJfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIG1pZ3JhdGlvbnMgdGFibGUgaWYgaXRzIG5vdCBjcmVhdGVkIHlldFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVNaWdyYXRpb25zVGFibGVJZk5vdEV4aXN0KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtaWdyYXRpb25zIHRhYmxlIGlmIGl0cyBub3QgY3JlYXRlZCB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUJ1aWxkZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZVNjaGVtYUJ1aWxkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjaGVtYUJ1aWxkZXIgaW5zdGFuY2VvZiBSZGJtc1NjaGVtYUJ1aWxkZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHNjaGVtYUJ1aWxkZXIuY3JlYXRlTWV0YWRhdGFUYWJsZUlmTmVjZXNzYXJ5KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRFeGVjdXRlZE1pZ3JhdGlvbnMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbiA9IHRoaXMuZ2V0TGF0ZXN0VGltZXN0YW1wTWlncmF0aW9uKGV4ZWN1dGVkTWlncmF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxNaWdyYXRpb25zID0gdGhpcy5nZXRNaWdyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzTWlncmF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pZ3JhdGlvbnMgPSBhbGxNaWdyYXRpb25zLmZpbHRlcihmdW5jdGlvbiAobWlncmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGV4ZWN1dGVkIG1pZ3JhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRlZE1pZ3JhdGlvbiA9IGV4ZWN1dGVkTWlncmF0aW9ucy5maW5kKGZ1bmN0aW9uIChleGVjdXRlZE1pZ3JhdGlvbikgeyByZXR1cm4gZXhlY3V0ZWRNaWdyYXRpb24ubmFtZSA9PT0gbWlncmF0aW9uLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZE1pZ3JhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiBpcyBuZXcgYW5kIG5vdCBleGVjdXRlZC4gbm93IGNoZWNrIGlmIGl0cyB0aW1lc3RhbXAgaXMgY29ycmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uICYmIG1pZ3JhdGlvbi50aW1lc3RhbXAgPCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLnRpbWVzdGFtcClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgTmV3IG1pZ3JhdGlvbiBmb3VuZDogJHttaWdyYXRpb24ubmFtZX0sIGhvd2V2ZXIgdGhpcyBtaWdyYXRpb24ncyB0aW1lc3RhbXAgaXMgbm90IHZhbGlkLiBNaWdyYXRpb24ncyB0aW1lc3RhbXAgc2hvdWxkIG5vdCBiZSBvbGRlciB0aGVuIG1pZ3JhdGlvbnMgYWxyZWFkeSBleGVjdXRlZCBpbiB0aGUgZGF0YWJhc2UuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgY2hlY2sgaXMgcGFzc2VkIG1lYW5zIHRoYXQgbWlncmF0aW9uIHdhcyBub3QgcnVuIHlldCBhbmQgd2UgbmVlZCB0byBydW4gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcGVuZGluZ01pZ3JhdGlvbnMubGVuZ3RoKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJObyBtaWdyYXRpb25zIGFyZSBwZW5kaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGluZm9ybWF0aW9uIGFib3V0IG1pZ3JhdGlvbiBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoZXhlY3V0ZWRNaWdyYXRpb25zLmxlbmd0aCArIFwiIG1pZ3JhdGlvbnMgYXJlIGFscmVhZHkgbG9hZGVkIGluIHRoZSBkYXRhYmFzZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKGFsbE1pZ3JhdGlvbnMubGVuZ3RoICsgXCIgbWlncmF0aW9ucyB3ZXJlIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKGxhc3RUaW1lRXhlY3V0ZWRNaWdyYXRpb24ubmFtZSArIFwiIGlzIHRoZSBsYXN0IGV4ZWN1dGVkIG1pZ3JhdGlvbi4gSXQgd2FzIGV4ZWN1dGVkIG9uIFwiICsgbmV3IERhdGUobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi50aW1lc3RhbXApLnRvU3RyaW5nKCkgKyBcIi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKHBlbmRpbmdNaWdyYXRpb25zLmxlbmd0aCArIFwiIG1pZ3JhdGlvbnMgYXJlIG5ldyBtaWdyYXRpb25zIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy50cmFuc2FjdGlvbiA9PT0gXCJhbGxcIiAmJiAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbOSwgMjAsIDI1LCAyOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMiA9IGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzXzIudHJhbnNhY3Rpb24gPT09IFwiZWFjaFwiICYmICFxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb24uaW5zdGFuY2UudXAocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nTWlncmF0aW9uKFwiTWlncmF0aW9uIFxcXCJcIiArIG1pZ3JhdGlvbi5uYW1lICsgXCJcXFwiIGhhcyBiZWVuIGZhaWxlZCwgZXJyb3I6IFwiICsgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gbm93IHdoZW4gbWlncmF0aW9uIGlzIGV4ZWN1dGVkIHdlIG5lZWQgdG8gaW5zZXJ0IHJlY29yZCBhYm91dCBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbildO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnRyYW5zYWN0aW9uID09PSBcImVhY2hcIiAmJiB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NNaWdyYXRpb25zLnB1c2gobWlncmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJNaWdyYXRpb24gXCIgKyBtaWdyYXRpb24ubmFtZSArIFwiIGhhcyBiZWVuIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzIgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMTAsIDE1LCAxNiwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWdyYXRpb25zXzEgPSBfX3ZhbHVlcyhwZW5kaW5nTWlncmF0aW9ucyksIHBlbmRpbmdNaWdyYXRpb25zXzFfMSA9IHBlbmRpbmdNaWdyYXRpb25zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXBlbmRpbmdNaWdyYXRpb25zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb24gPSBwZW5kaW5nTWlncmF0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMihtaWdyYXRpb24pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTWlncmF0aW9uc18xXzEgPSBwZW5kaW5nTWlncmF0aW9uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ01pZ3JhdGlvbnNfMV8xICYmICFwZW5kaW5nTWlncmF0aW9uc18xXzEuZG9uZSAmJiAoX2EgPSBwZW5kaW5nTWlncmF0aW9uc18xLnJldHVybikpIF9hLmNhbGwocGVuZGluZ01pZ3JhdGlvbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy50cmFuc2FjdGlvbiA9PT0gXCJhbGxcIiAmJiB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE5O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OiByZXR1cm4gWzMgLypicmVhayovLCAyOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMjEsIDIzLCAsIDI0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMjRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OiB0aHJvdyBlcnJfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMucXVlcnlSdW5uZXIpIHJldHVybiBbMyAvKmJyZWFrKi8sIDI3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OiByZXR1cm4gWzIgLypyZXR1cm4qLywgc3VjY2Vzc01pZ3JhdGlvbnNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldmVydHMgbGFzdCBtaWdyYXRpb24gdGhhdCB3ZXJlIHJ1bi5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUudW5kb0xhc3RNaWdyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgZXhlY3V0ZWRNaWdyYXRpb25zLCBsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLCBhbGxNaWdyYXRpb25zLCBtaWdyYXRpb25Ub1JldmVydCwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgZXJyXzIsIHJvbGxiYWNrRXJyb3JfMjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtaWdyYXRpb25zIHRhYmxlIGlmIGl0cyBub3QgY3JlYXRlZCB5ZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTWlncmF0aW9uc1RhYmxlSWZOb3RFeGlzdChxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbWlncmF0aW9ucyB0YWJsZSBpZiBpdHMgbm90IGNyZWF0ZWQgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRFeGVjdXRlZE1pZ3JhdGlvbnMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWRNaWdyYXRpb25zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbiA9IHRoaXMuZ2V0TGF0ZXN0RXhlY3V0ZWRNaWdyYXRpb24oZXhlY3V0ZWRNaWdyYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1pZ3JhdGlvbnMgZm91bmQgaW4gdGhlIGRhdGFiYXNlIHRoZW4gbm90aGluZyB0byByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJObyBtaWdyYXRpb25zIHdhcyBmb3VuZCBpbiB0aGUgZGF0YWJhc2UuIE5vdGhpbmcgdG8gcmV2ZXJ0IVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxNaWdyYXRpb25zID0gdGhpcy5nZXRNaWdyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25Ub1JldmVydCA9IGFsbE1pZ3JhdGlvbnMuZmluZChmdW5jdGlvbiAobWlncmF0aW9uKSB7IHJldHVybiBtaWdyYXRpb24ubmFtZSA9PT0gbGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1pZ3JhdGlvbnMgZm91bmQgaW4gdGhlIGRhdGFiYXNlIHRoZW4gbm90aGluZyB0byByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWlncmF0aW9uVG9SZXZlcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vIG1pZ3JhdGlvbiBcIiArIGxhc3RUaW1lRXhlY3V0ZWRNaWdyYXRpb24ubmFtZSArIFwiIHdhcyBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuIE1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGlzIG1pZ3JhdGlvbiBpbiB5b3VyIGNvZGViYXNlIGFuZCBpdHMgaW5jbHVkZWQgaW4gdGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgaW5mb3JtYXRpb24gYWJvdXQgbWlncmF0aW9uIGV4ZWN1dGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChleGVjdXRlZE1pZ3JhdGlvbnMubGVuZ3RoICsgXCIgbWlncmF0aW9ucyBhcmUgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIGRhdGFiYXNlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQobGFzdFRpbWVFeGVjdXRlZE1pZ3JhdGlvbi5uYW1lICsgXCIgaXMgdGhlIGxhc3QgZXhlY3V0ZWQgbWlncmF0aW9uLiBJdCB3YXMgZXhlY3V0ZWQgb24gXCIgKyBuZXcgRGF0ZShsYXN0VGltZUV4ZWN1dGVkTWlncmF0aW9uLnRpbWVzdGFtcCkudG9TdHJpbmcoKSArIFwiLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJOb3cgcmV2ZXJ0aW5nIGl0Li4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHRoaXMudHJhbnNhY3Rpb24gIT09IFwibm9uZVwiKSAmJiAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbNCwgOSwgMTQsIDE3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtaWdyYXRpb25Ub1JldmVydC5pbnN0YW5jZS5kb3duKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZGVsZXRlRXhlY3V0ZWRNaWdyYXRpb24ocXVlcnlSdW5uZXIsIG1pZ3JhdGlvblRvUmV2ZXJ0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJNaWdyYXRpb24gXCIgKyBtaWdyYXRpb25Ub1JldmVydC5uYW1lICsgXCIgaGFzIGJlZW4gcmV2ZXJ0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMyAvKmJyZWFrKi8sIDE3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEwLCAxMiwgLCAxM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogdGhyb3cgZXJyXzI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYmxlIFwibWlncmF0aW9uc1wiIHRoYXQgd2lsbCBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBleGVjdXRlZCBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5jcmVhdGVNaWdyYXRpb25zVGFibGVJZk5vdEV4aXN0ID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZUV4aXN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZHJpdmVyIGlzIG1vbmdvIG5vIG5lZWQgdG8gY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuaGFzVGFibGUodGhpcy5taWdyYXRpb25zVGFibGUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVFeGlzdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRhYmxlRXhpc3QpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY3JlYXRlVGFibGUobmV3IFRhYmxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMubWlncmF0aW9uc0RhdGFiYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHRoaXMubWlncmF0aW9uc1NjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5taWdyYXRpb25zVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWlncmF0aW9uSWQgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblN0cmF0ZWd5OiBcImluY3JlbWVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvblRpbWVzdGFtcCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvbk5hbWUgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdWxsYWJsZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGFsbCBtaWdyYXRpb25zIHRoYXQgd2VyZSBleGVjdXRlZCBhbmQgc2F2ZWQgaW50byB0aGUgZGF0YWJhc2UgKHNvcnRzIGJ5IGlkKS5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUubG9hZEV4ZWN1dGVkTWlncmF0aW9ucyA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbW9uZ29SdW5uZXIsIG1pZ3JhdGlvbnNSYXc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbmdvUnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtb25nb1J1bm5lci5kYXRhYmFzZUNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRiKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0aW9uKHRoaXMubWlncmF0aW9uc1RhYmxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCh7IFwiX2lkXCI6IC0xIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3JkZXJCeSh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShcImlkXCIpLCBcIkRFU0NcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbSh0aGlzLm1pZ3JhdGlvbnNUYWJsZSwgdGhpcy5taWdyYXRpb25zVGFibGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSYXdNYW55KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25zUmF3ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG1pZ3JhdGlvbnNSYXcubWFwKGZ1bmN0aW9uIChtaWdyYXRpb25SYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNaWdyYXRpb24ocGFyc2VJbnQobWlncmF0aW9uUmF3W1wiaWRcIl0pLCBwYXJzZUludChtaWdyYXRpb25SYXdbXCJ0aW1lc3RhbXBcIl0pLCBtaWdyYXRpb25SYXdbXCJuYW1lXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgbWlncmF0aW9ucyB0aGF0IHNldHVwIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldE1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtaWdyYXRpb25zID0gdGhpcy5jb25uZWN0aW9uLm1pZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25DbGFzc05hbWUgPSBtaWdyYXRpb24ubmFtZSB8fCBtaWdyYXRpb24uY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgIHZhciBtaWdyYXRpb25UaW1lc3RhbXAgPSBwYXJzZUludChtaWdyYXRpb25DbGFzc05hbWUuc3Vic3RyKC0xMyksIDEwKTtcbiAgICAgICAgICAgIGlmICghbWlncmF0aW9uVGltZXN0YW1wIHx8IGlzTmFOKG1pZ3JhdGlvblRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKG1pZ3JhdGlvbkNsYXNzTmFtZSArIFwiIG1pZ3JhdGlvbiBuYW1lIGlzIHdyb25nLiBNaWdyYXRpb24gY2xhc3MgbmFtZSBzaG91bGQgaGF2ZSBhIEphdmFTY3JpcHQgdGltZXN0YW1wIGFwcGVuZGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgTWlncmF0aW9uKHVuZGVmaW5lZCwgbWlncmF0aW9uVGltZXN0YW1wLCBtaWdyYXRpb25DbGFzc05hbWUsIG1pZ3JhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlTWlncmF0aW9ucyhtaWdyYXRpb25zKTtcbiAgICAgICAgLy8gc29ydCB0aGVtIGJ5IHRpbWVzdGFtcFxuICAgICAgICByZXR1cm4gbWlncmF0aW9ucy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLnRpbWVzdGFtcCAtIGIudGltZXN0YW1wOyB9KTtcbiAgICB9O1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5jaGVja0ZvckR1cGxpY2F0ZU1pZ3JhdGlvbnMgPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgbWlncmF0aW9uTmFtZXMgPSBtaWdyYXRpb25zLm1hcChmdW5jdGlvbiAobWlncmF0aW9uKSB7IHJldHVybiBtaWdyYXRpb24ubmFtZTsgfSk7XG4gICAgICAgIHZhciBkdXBsaWNhdGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1pZ3JhdGlvbk5hbWVzLmZpbHRlcihmdW5jdGlvbiAobWlncmF0aW9uTmFtZSwgaW5kZXgpIHsgcmV0dXJuIG1pZ3JhdGlvbk5hbWVzLmluZGV4T2YobWlncmF0aW9uTmFtZSkgPCBpbmRleDsgfSkpKTtcbiAgICAgICAgaWYgKGR1cGxpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJEdXBsaWNhdGUgbWlncmF0aW9uczogXCIgKyBkdXBsaWNhdGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBsYXRlc3QgbWlncmF0aW9uIChzb3J0cyBieSB0aW1lc3RhbXApIGluIHRoZSBnaXZlbiBhcnJheSBvZiBtaWdyYXRpb25zLlxuICAgICAqL1xuICAgIE1pZ3JhdGlvbkV4ZWN1dG9yLnByb3RvdHlwZS5nZXRMYXRlc3RUaW1lc3RhbXBNaWdyYXRpb24gPSBmdW5jdGlvbiAobWlncmF0aW9ucykge1xuICAgICAgICB2YXIgc29ydGVkTWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChtaWdyYXRpb24pIHsgcmV0dXJuIG1pZ3JhdGlvbjsgfSkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXApICogLTE7IH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkTWlncmF0aW9ucy5sZW5ndGggPiAwID8gc29ydGVkTWlncmF0aW9uc1swXSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBsYXRlc3QgbWlncmF0aW9uIGluIHRoZSBnaXZlbiBhcnJheSBvZiBtaWdyYXRpb25zLlxuICAgICAqIFBSRTogTWlncmF0aW9uIGFycmF5IG11c3QgYmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgaWQuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmdldExhdGVzdEV4ZWN1dGVkTWlncmF0aW9uID0gZnVuY3Rpb24gKHNvcnRlZE1pZ3JhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRlZE1pZ3JhdGlvbnMubGVuZ3RoID4gMCA/IHNvcnRlZE1pZ3JhdGlvbnNbMF0gOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIG5ldyBleGVjdXRlZCBtaWdyYXRpb24ncyBkYXRhIGludG8gbWlncmF0aW9ucyB0YWJsZS5cbiAgICAgKi9cbiAgICBNaWdyYXRpb25FeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0RXhlY3V0ZWRNaWdyYXRpb24gPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIsIG1pZ3JhdGlvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzLCBtb25nb1J1bm5lciwgcWI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW1widGltZXN0YW1wXCJdID0gbmV3IE1zc3FsUGFyYW1ldGVyKG1pZ3JhdGlvbi50aW1lc3RhbXAsIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1pZ3JhdGlvblRpbWVzdGFtcCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW1wibmFtZVwiXSA9IG5ldyBNc3NxbFBhcmFtZXRlcihtaWdyYXRpb24ubmFtZSwgdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWlncmF0aW9uTmFtZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbXCJ0aW1lc3RhbXBcIl0gPSBtaWdyYXRpb24udGltZXN0YW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tcIm5hbWVcIl0gPSBtaWdyYXRpb24ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNb25nb0RyaXZlcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9uZ29SdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG1vbmdvUnVubmVyLmRhdGFiYXNlQ29ubmVjdGlvbi5kYih0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFiYXNlKS5jb2xsZWN0aW9uKHRoaXMubWlncmF0aW9uc1RhYmxlTmFtZSkuaW5zZXJ0T25lKHZhbHVlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcWIgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8odGhpcy5taWdyYXRpb25zVGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZWxldGUgcHJldmlvdXNseSBleGVjdXRlZCBtaWdyYXRpb24ncyBkYXRhIGZyb20gdGhlIG1pZ3JhdGlvbnMgdGFibGUuXG4gICAgICovXG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLmRlbGV0ZUV4ZWN1dGVkTWlncmF0aW9uID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyLCBtaWdyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMsIG1vbmdvUnVubmVyLCBxYjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc1tcInRpbWVzdGFtcFwiXSA9IG5ldyBNc3NxbFBhcmFtZXRlcihtaWdyYXRpb24udGltZXN0YW1wLCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5taWdyYXRpb25UaW1lc3RhbXAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJuYW1lXCJdID0gbmV3IE1zc3FsUGFyYW1ldGVyKG1pZ3JhdGlvbi5uYW1lLCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5taWdyYXRpb25OYW1lIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJ0aW1lc3RhbXBcIl0gPSBtaWdyYXRpb24udGltZXN0YW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNbXCJuYW1lXCJdID0gbWlncmF0aW9uLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTW9uZ29Ecml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbmdvUnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtb25nb1J1bm5lci5kYXRhYmFzZUNvbm5lY3Rpb24uZGIodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhYmFzZSkuY29sbGVjdGlvbih0aGlzLm1pZ3JhdGlvbnNUYWJsZU5hbWUpLmRlbGV0ZU9uZShjb25kaXRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxYi5kZWxldGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbSh0aGlzLm1pZ3JhdGlvbnNUYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKHFiLmVzY2FwZShcInRpbWVzdGFtcFwiKSArIFwiID0gOnRpbWVzdGFtcFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYW5kV2hlcmUocWIuZXNjYXBlKFwibmFtZVwiKSArIFwiID0gOm5hbWVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMoY29uZGl0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTWlncmF0aW9uRXhlY3V0b3IucHJvdG90eXBlLndpdGhRdWVyeVJ1bm5lciA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgLCAyLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY2FsbGJhY2socXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVyeVJ1bm5lcikgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE1pZ3JhdGlvbkV4ZWN1dG9yO1xufSgpKTtcbmV4cG9ydCB7IE1pZ3JhdGlvbkV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1pZ3JhdGlvbkV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBSYW5kb21HZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9SYW5kb21HZW5lcmF0b3JcIjtcbmltcG9ydCB7IGNhbWVsQ2FzZSwgc25ha2VDYXNlLCB0aXRsZUNhc2UgfSBmcm9tIFwiLi4vdXRpbC9TdHJpbmdVdGlsc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVcIjtcbi8qKlxuICogTmFtaW5nIHN0cmF0ZWd5IHRoYXQgaXMgdXNlZCBieSBkZWZhdWx0LlxuICovXG52YXIgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHROYW1pbmdTdHJhdGVneSgpIHtcbiAgICAgICAgdGhpcy5uZXN0ZWRTZXRDb2x1bW5OYW1lcyA9IHsgbGVmdDogXCJuc2xlZnRcIiwgcmlnaHQ6IFwibnNyaWdodFwiIH07XG4gICAgICAgIHRoaXMubWF0ZXJpYWxpemVkUGF0aENvbHVtbk5hbWUgPSBcIm1wYXRoXCI7XG4gICAgfVxuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuZ2V0VGFibGVOYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lKSB7XG4gICAgICAgIGlmICh0YWJsZU9yTmFtZSBpbnN0YW5jZW9mIFRhYmxlKSB7XG4gICAgICAgICAgICB0YWJsZU9yTmFtZSA9IHRhYmxlT3JOYW1lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlT3JOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgdGFibGUgbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXROYW1lIE5hbWUgb2YgdGhlIHRhcmdldCBlbnRpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHRhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtIHVzZXJTcGVjaWZpZWROYW1lIEZvciBleGFtcGxlIGlmIHVzZXIgc3BlY2lmaWVkIGEgdGFibGUgbmFtZSBpbiBhIGRlY29yYXRvciwgZS5nLiBARW50aXR5KFwibmFtZVwiKVxuICAgICAqL1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUudGFibGVOYW1lID0gZnVuY3Rpb24gKHRhcmdldE5hbWUsIHVzZXJTcGVjaWZpZWROYW1lKSB7XG4gICAgICAgIHJldHVybiB1c2VyU3BlY2lmaWVkTmFtZSA/IHVzZXJTcGVjaWZpZWROYW1lIDogc25ha2VDYXNlKHRhcmdldE5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRhYmxlIG5hbWUgZm9yIGEganVuY3Rpb24gdGFibGUgb2YgYSBjbG9zdXJlIHRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9yaWdpbmFsQ2xvc3VyZVRhYmxlTmFtZSBOYW1lIG9mIHRoZSBjbG9zdXJlIHRhYmxlIHdoaWNoIG93bnMgdGhpcyBqdW5jdGlvbiB0YWJsZS5cbiAgICAgKi9cbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmNsb3N1cmVKdW5jdGlvblRhYmxlTmFtZSA9IGZ1bmN0aW9uIChvcmlnaW5hbENsb3N1cmVUYWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ2xvc3VyZVRhYmxlTmFtZSArIFwiX2Nsb3N1cmVcIjtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuY29sdW1uTmFtZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUsIGN1c3RvbU5hbWUsIGVtYmVkZGVkUHJlZml4ZXMpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBjdXN0b21OYW1lIHx8IHByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKGVtYmVkZGVkUHJlZml4ZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShlbWJlZGRlZFByZWZpeGVzLmpvaW4oXCJfXCIpKSArIHRpdGxlQ2FzZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLnJlbGF0aW9uTmFtZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUucHJpbWFyeUtleU5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICByZXR1cm4gXCJQS19cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUudW5pcXVlQ29uc3RyYWludE5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICByZXR1cm4gXCJVUV9cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUucmVsYXRpb25Db25zdHJhaW50TmFtZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMsIHdoZXJlKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICBpZiAod2hlcmUpXG4gICAgICAgICAgICBrZXkgKz0gXCJfXCIgKyB3aGVyZTtcbiAgICAgICAgcmV0dXJuIFwiUkVMX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5kZWZhdWx0Q29uc3RyYWludE5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBjb2x1bW5OYW1lO1xuICAgICAgICByZXR1cm4gXCJERl9cIiArIFJhbmRvbUdlbmVyYXRvci5zaGExKGtleSkuc3Vic3RyKDAsIDI3KTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuZm9yZWlnbktleU5hbWUgPSBmdW5jdGlvbiAodGFibGVPck5hbWUsIGNvbHVtbk5hbWVzLCBfcmVmZXJlbmNlZFRhYmxlUGF0aCwgX3JlZmVyZW5jZWRDb2x1bW5OYW1lcykge1xuICAgICAgICAvLyBzb3J0IGluY29taW5nIGNvbHVtbiBuYW1lcyB0byBhdm9pZCBpc3N1ZSB3aGVuIFtcImlkXCIsIFwibmFtZVwiXSBhbmQgW1wibmFtZVwiLCBcImlkXCJdIGFycmF5c1xuICAgICAgICB2YXIgY2xvbmVkQ29sdW1uTmFtZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29sdW1uTmFtZXMpLCBmYWxzZSk7XG4gICAgICAgIGNsb25lZENvbHVtbk5hbWVzLnNvcnQoKTtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBjbG9uZWRDb2x1bW5OYW1lcy5qb2luKFwiX1wiKTtcbiAgICAgICAgcmV0dXJuIFwiRktfXCIgKyBSYW5kb21HZW5lcmF0b3Iuc2hhMShrZXkpLnN1YnN0cigwLCAyNyk7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmluZGV4TmFtZSA9IGZ1bmN0aW9uICh0YWJsZU9yTmFtZSwgY29sdW1uTmFtZXMsIHdoZXJlKSB7XG4gICAgICAgIC8vIHNvcnQgaW5jb21pbmcgY29sdW1uIG5hbWVzIHRvIGF2b2lkIGlzc3VlIHdoZW4gW1wiaWRcIiwgXCJuYW1lXCJdIGFuZCBbXCJuYW1lXCIsIFwiaWRcIl0gYXJyYXlzXG4gICAgICAgIHZhciBjbG9uZWRDb2x1bW5OYW1lcyA9IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChjb2x1bW5OYW1lcyksIGZhbHNlKTtcbiAgICAgICAgY2xvbmVkQ29sdW1uTmFtZXMuc29ydCgpO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGFibGVPck5hbWUpO1xuICAgICAgICB2YXIgcmVwbGFjZWRUYWJsZU5hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgICAgICB2YXIga2V5ID0gcmVwbGFjZWRUYWJsZU5hbWUgKyBcIl9cIiArIGNsb25lZENvbHVtbk5hbWVzLmpvaW4oXCJfXCIpO1xuICAgICAgICBpZiAod2hlcmUpXG4gICAgICAgICAgICBrZXkgKz0gXCJfXCIgKyB3aGVyZTtcbiAgICAgICAgcmV0dXJuIFwiSURYX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5jaGVja0NvbnN0cmFpbnROYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleHByZXNzaW9uLCBpc0VudW0pIHtcbiAgICAgICAgdmFyIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHRhYmxlT3JOYW1lKTtcbiAgICAgICAgdmFyIHJlcGxhY2VkVGFibGVOYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgdmFyIGtleSA9IHJlcGxhY2VkVGFibGVOYW1lICsgXCJfXCIgKyBleHByZXNzaW9uO1xuICAgICAgICB2YXIgbmFtZSA9IFwiQ0hLX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgICAgICByZXR1cm4gaXNFbnVtID8gbmFtZSArIFwiX0VOVU1cIiA6IG5hbWU7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmV4Y2x1c2lvbkNvbnN0cmFpbnROYW1lID0gZnVuY3Rpb24gKHRhYmxlT3JOYW1lLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHZhciB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZSh0YWJsZU9yTmFtZSk7XG4gICAgICAgIHZhciByZXBsYWNlZFRhYmxlTmFtZSA9IHRhYmxlTmFtZS5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgIHZhciBrZXkgPSByZXBsYWNlZFRhYmxlTmFtZSArIFwiX1wiICsgZXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIFwiWENMX1wiICsgUmFuZG9tR2VuZXJhdG9yLnNoYTEoa2V5KS5zdWJzdHIoMCwgMjYpO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5qb2luQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChyZWxhdGlvbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2UocmVsYXRpb25OYW1lICsgXCJfXCIgKyByZWZlcmVuY2VkQ29sdW1uTmFtZSk7XG4gICAgfTtcbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLmpvaW5UYWJsZU5hbWUgPSBmdW5jdGlvbiAoZmlyc3RUYWJsZU5hbWUsIHNlY29uZFRhYmxlTmFtZSwgZmlyc3RQcm9wZXJ0eU5hbWUsIHNlY29uZFByb3BlcnR5TmFtZSkge1xuICAgICAgICByZXR1cm4gc25ha2VDYXNlKGZpcnN0VGFibGVOYW1lICsgXCJfXCIgKyBmaXJzdFByb3BlcnR5TmFtZS5yZXBsYWNlKC9cXC4vZ2ksIFwiX1wiKSArIFwiX1wiICsgc2Vjb25kVGFibGVOYW1lKTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuam9pblRhYmxlQ29sdW1uRHVwbGljYXRpb25QcmVmaXggPSBmdW5jdGlvbiAoY29sdW1uTmFtZSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUgKyBcIl9cIiArIGluZGV4O1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5qb2luVGFibGVDb2x1bW5OYW1lID0gZnVuY3Rpb24gKHRhYmxlTmFtZSwgcHJvcGVydHlOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjYW1lbENhc2UodGFibGVOYW1lICsgXCJfXCIgKyAoY29sdW1uTmFtZSA/IGNvbHVtbk5hbWUgOiBwcm9wZXJ0eU5hbWUpKTtcbiAgICB9O1xuICAgIERlZmF1bHROYW1pbmdTdHJhdGVneS5wcm90b3R5cGUuam9pblRhYmxlSW52ZXJzZUNvbHVtbk5hbWUgPSBmdW5jdGlvbiAodGFibGVOYW1lLCBwcm9wZXJ0eU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9pblRhYmxlQ29sdW1uTmFtZSh0YWJsZU5hbWUsIHByb3BlcnR5TmFtZSwgY29sdW1uTmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGdsb2JhbGx5IHNldCBwcmVmaXggdG8gdGhlIHRhYmxlIG5hbWUuXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgbm8gbWF0dGVyIGlmIHByZWZpeCB3YXMgc2V0IG9yIG5vdC5cbiAgICAgKiBUYWJsZSBuYW1lIGlzIGVpdGhlciB1c2VyJ3MgZ2l2ZW4gdGFibGUgbmFtZSwgZWl0aGVyIG5hbWUgZ2VuZXJhdGVkIGZyb20gZW50aXR5IHRhcmdldC5cbiAgICAgKiBOb3RlIHRoYXQgdGFibGUgbmFtZSBjb21lcyBoZXJlIGFscmVhZHkgbm9ybWFsaXplZCBieSAjdGFibGVOYW1lIG1ldGhvZC5cbiAgICAgKi9cbiAgICBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kucHJvdG90eXBlLnByZWZpeFRhYmxlTmFtZSA9IGZ1bmN0aW9uIChwcmVmaXgsIHRhYmxlTmFtZSkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgdGFibGVOYW1lO1xuICAgIH07XG4gICAgRGVmYXVsdE5hbWluZ1N0cmF0ZWd5LnByb3RvdHlwZS5lYWdlckpvaW5SZWxhdGlvbkFsaWFzID0gZnVuY3Rpb24gKGFsaWFzLCBwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGFsaWFzICsgXCJfXCIgKyBwcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmF1bHROYW1pbmdTdHJhdGVneTtcbn0oKSk7XG5leHBvcnQgeyBEZWZhdWx0TmFtaW5nU3RyYXRlZ3kgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVmYXVsdE5hbWluZ1N0cmF0ZWd5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE11c3RCZUVudGl0eUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL011c3RCZUVudGl0eUVycm9yXCI7XG5pbXBvcnQgeyBTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi9TdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IENhbm5vdERldGVybWluZUVudGl0eUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0Nhbm5vdERldGVybWluZUVudGl0eUVycm9yXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcIi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT25lVG9NYW55U3ViamVjdEJ1aWxkZXIgfSBmcm9tIFwiLi9zdWJqZWN0LWJ1aWxkZXIvT25lVG9NYW55U3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IE9uZVRvT25lSW52ZXJzZVNpZGVTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9PbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9NYW55VG9NYW55U3ViamVjdEJ1aWxkZXJcIjtcbmltcG9ydCB7IFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlciB9IGZyb20gXCIuL1N1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlclwiO1xuaW1wb3J0IHsgQ2FzY2FkZXNTdWJqZWN0QnVpbGRlciB9IGZyb20gXCIuL3N1YmplY3QtYnVpbGRlci9DYXNjYWRlc1N1YmplY3RCdWlsZGVyXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG4vKipcbiAqIFBlcnNpc3RzIGEgc2luZ2xlIGVudGl0eSBvciBtdWx0aXBsZSBlbnRpdGllcyAtIHNhdmVzIG9yIHJlbW92ZXMgdGhlbS5cbiAqL1xudmFyIEVudGl0eVBlcnNpc3RFeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRW50aXR5UGVyc2lzdEV4ZWN1dG9yKGNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyLCBtb2RlLCB0YXJnZXQsIGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHBlcnNpc3RlbmNlIG9wZXJhdGlvbiBvYiBnaXZlbiBlbnRpdHkgb3IgZW50aXRpZXMuXG4gICAgICovXG4gICAgRW50aXR5UGVyc2lzdEV4ZWN1dG9yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIG9sZFF1ZXJ5UnVubmVyRGF0YSwgZW50aXRpZXMsIGVudGl0aWVzSW5DaHVua3MsIGV4ZWN1dG9ycywgZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zLCBpc1RyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLCBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnNfMV8xLCBleGVjdXRvciwgZV8xXzEsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVudGl0eSB3ZSBhcmUgZ29pbmcgdG8gc2F2ZSBpcyB2YWxpZCBhbmQgaXMgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW50aXR5IHx8IHR5cGVvZiB0aGlzLmVudGl0eSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IE11c3RCZUVudGl0eUVycm9yKHRoaXMubW9kZSwgdGhpcy5lbnRpdHkpKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBNVVNUIGNhbGwgXCJmYWtlXCIgcmVzb2x2ZSBoZXJlIHRvIG1ha2Ugc3VyZSBhbGwgcHJvcGVydGllcyBvZiBsYXppbHkgbG9hZGVkIHJlbGF0aW9ucyBhcmUgcmVzb2x2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgTVVTVCBjYWxsIFwiZmFrZVwiIHJlc29sdmUgaGVyZSB0byBtYWtlIHN1cmUgYWxsIHByb3BlcnRpZXMgb2YgbGF6aWx5IGxvYWRlZCByZWxhdGlvbnMgYXJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMucXVlcnlSdW5uZXIgfHwgdGhpcy5jb25uZWN0aW9uLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRRdWVyeVJ1bm5lckRhdGEgPSBxdWVyeVJ1bm5lci5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsyLCAsIDIyLCAyNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuZW50aXR5KSA/IHRoaXMuZW50aXR5IDogW3RoaXMuZW50aXR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzSW5DaHVua3MgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNodW5rICYmIHRoaXMub3B0aW9ucy5jaHVuayA+IDAgPyBPcm1VdGlscy5jaHVuayhlbnRpdGllcywgdGhpcy5vcHRpb25zLmNodW5rKSA6IFtlbnRpdGllc107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChlbnRpdGllc0luQ2h1bmtzLm1hcChmdW5jdGlvbiAoZW50aXRpZXMpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YmplY3RzLCBjYXNjYWRlc1N1YmplY3RCdWlsZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgc3ViamVjdHMgZm9yIGFsbCBlbnRpdGllcyB3ZSByZWNlaXZlZCBmb3IgdGhlIHBlcnNpc3RlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eVRhcmdldCA9IF90aGlzLnRhcmdldCA/IF90aGlzLnRhcmdldCA6IGVudGl0eS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlUYXJnZXQgPT09IE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90RGV0ZXJtaW5lRW50aXR5RXJyb3IoX3RoaXMubW9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5wdXNoKG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogX3RoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlUYXJnZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlSW5zZXJ0ZWQ6IF90aGlzLm1vZGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogX3RoaXMubW9kZSA9PT0gXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlUmVtb3ZlZDogX3RoaXMubW9kZSA9PT0gXCJyZW1vdmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZVNvZnRSZW1vdmVkOiBfdGhpcy5tb2RlID09PSBcInNvZnQtcmVtb3ZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVSZWNvdmVyZWQ6IF90aGlzLm1vZGUgPT09IFwicmVjb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNjYWRlc1N1YmplY3RCdWlsZGVyID0gbmV3IENhc2NhZGVzU3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHN0ZXAgd2UgYnVpbGQgbGlzdCBvZiBzdWJqZWN0cyB3ZSB3aWxsIG9wZXJhdGUgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3ViamVjdHMgYXJlIHN1YmplY3RzIHRoYXQgd2UgbmVlZCB0byBpbnNlcnQgb3IgdXBkYXRlIGFsb25nc2lkZSB3aXRoIG1haW4gcGVyc2lzdGVkIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZXNTdWJqZWN0QnVpbGRlci5idWlsZChzdWJqZWN0LCBfdGhpcy5tb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcImJ1aWxkaW5nIGNhc2NhZGVzLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGRhdGFiYXNlIGVudGl0aWVzIGZvciBhbGwgc3ViamVjdHMgd2UgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHN0ZXAgaXMgdG8gbG9hZCBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIG9wZXJhdGUgc3ViamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwibG9hZGluZy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlcihxdWVyeVJ1bm5lciwgc3ViamVjdHMpLmxvYWQodGhpcy5tb2RlKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCJidWlsZGluZyBjYXNjYWRlcy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIHN1YmplY3RzIHdlIGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBzdGVwIGlzIHRvIGxvYWQgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFsbCBvcGVyYXRlIHN1YmplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcImxvYWRpbmcuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwibG9hZGluZy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwib3RoZXIgc3ViamVjdHMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGFsbCByZWxhdGVkIHN1YmplY3RzIGFuZCBjaGFuZ2UgbWFwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcInNhdmVcIiB8fCB0aGlzLm1vZGUgPT09IFwic29mdC1yZW1vdmVcIiB8fCB0aGlzLm1vZGUgPT09IFwicmVjb3ZlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25lVG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpLmJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyKHN1YmplY3RzKS5idWlsZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlcihzdWJqZWN0cykuYnVpbGQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tdXN0QmVSZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpLmJ1aWxkRm9yQWxsUmVtb3ZhbChzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCJvdGhlciBzdWJqZWN0cy4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiYnVpbGRpbmcgc3ViamVjdHMuLi5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3ViamVjdHNcIiwgc3ViamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzdWJqZWN0IGV4ZWN1dG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgU3ViamVjdEV4ZWN1dG9yKHF1ZXJ5UnVubmVyLCBzdWJqZWN0cywgdGhpcy5vcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvcnMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnMgPSBleGVjdXRvcnMuZmlsdGVyKGZ1bmN0aW9uIChleGVjdXRvcikgeyByZXR1cm4gZXhlY3V0b3IuaGFzRXhlY3V0YWJsZU9wZXJhdGlvbnM7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbNCwgMTYsICwgMjFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb24gIT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzYsIDExLCAxMiwgMTNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xID0gX192YWx1ZXMoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zKSwgZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMSA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvciA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBleGVjdXRvci5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xXzEgPSBleGVjdXRvcnNXaXRoRXhlY3V0YWJsZU9wZXJhdGlvbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMSAmJiAhZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzFfMS5kb25lICYmIChfYSA9IGV4ZWN1dG9yc1dpdGhFeGVjdXRhYmxlT3BlcmF0aW9uc18xLnJldHVybikpIF9hLmNhbGwoZXhlY3V0b3JzV2l0aEV4ZWN1dGFibGVPcGVyYXRpb25zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlzVHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9PT0gdHJ1ZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFszIC8qYnJlYWsqLywgMjFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUcmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxNywgMTksICwgMjBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6IHJldHVybiBbMyAvKmJyZWFrKi8sIDI1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmRhdGEgPSBvbGRRdWVyeVJ1bm5lckRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXJ5UnVubmVyKSByZXR1cm4gWzMgLypicmVhayovLCAyNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBFbnRpdHlQZXJzaXN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgRW50aXR5UGVyc2lzdEV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGl0eVBlcnNpc3RFeGVjdXRvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBTdWJqZWN0IGlzIGEgc3ViamVjdCBvZiBwZXJzaXN0ZW5jZS5cbiAqIEl0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZW50aXR5IHRoYXQgbmVlZHMgdG8gYmUgcGVyc2lzdGVkOlxuICogLSB3aGF0IGVudGl0eSBzaG91bGQgYmUgcGVyc2lzdGVkXG4gKiAtIHdoYXQgaXMgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAqIC0gd2hhdCBlbnRpdHkgbWV0YWRhdGEgb2YgdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAqIC0gd2hhdCBpcyBhbGxvd2VkIHRvIHdpdGggcGVyc2lzdGVkIGVudGl0eSAoaW5zZXJ0L3VwZGF0ZS9yZW1vdmUpXG4gKlxuICogSGF2aW5nIHRoaXMgY29sbGVjdGlvbiBvZiBzdWJqZWN0cyB3ZSBjYW4gcGVyZm9ybSBkYXRhYmFzZSBxdWVyaWVzLlxuICovXG52YXIgU3ViamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YmplY3QgaWRlbnRpZmllci5cbiAgICAgICAgICogVGhpcyBpZGVudGlmaWVyIGlzIG5vdCBsaW1pdGVkIHRvIHRhYmxlIGVudGl0eSBwcmltYXJ5IGNvbHVtbnMuXG4gICAgICAgICAqIFRoaXMgY2FuIGJlIGVudGl0eSBpZCBvciBpZHMgYXMgd2VsbCBhcyBzb21lIHVuaXF1ZSBlbnRpdHkgcHJvcGVydGllcywgbGlrZSBuYW1lIG9yIHRpdGxlLlxuICAgICAgICAgKiBJbnNlcnQgLyBVcGRhdGUgLyBSZW1vdmUgb3BlcmF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBnaXZlbiBpZGVudGlmaWVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weSBvZiBlbnRpdHkgYnV0IHdpdGggcmVsYXRpb25hbCBpZHMgZnVsZmlsbGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGRhdGFiYXNlIGVudGl0eSB3YXMgbG9hZGVkLlxuICAgICAgICAgKiBObyBtYXR0ZXIgaWYgaXQgd2FzIGZvdW5kIG9yIG5vdCwgaXQgaW5kaWNhdGVzIHRoZSBmYWN0IG9mIGxvYWRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGFuZ2VzIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gdGhlIGRhdGFiYXNlIGZvciB0aGUgZ2l2ZW4gc3ViamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbmdlTWFwcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGlzIHN1YmplY3QgZWl0aGVyIGlzIG5ld2x5IHBlcnNpc3RlZCwgZWl0aGVyIGNhbiBiZSBpbnNlcnRlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVJbnNlcnRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFRoaXMgbWVhbnMgdGhhdCB0aGlzIHN1YmplY3QgZWl0aGVyIHdhcyBwZXJzaXN0ZWQsIGVpdGhlciBjYW4gYmUgdXBkYXRlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzdWJqZWN0IE1VU1QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICogVGhpcyBtZWFucyB0aGF0IHRoaXMgc3ViamVjdCBlaXRoZXIgd2FzIHJlbW92ZWQsIGVpdGhlciB3YXMgcmVtb3ZlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubXVzdEJlUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgc29mdC1yZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhpcyBzdWJqZWN0IGVpdGhlciB3YXMgc29mdC1yZW1vdmVkLCBlaXRoZXIgd2FzIHNvZnQtcmVtb3ZlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVTb2Z0UmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3ViamVjdCBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgdGhpcyBzdWJqZWN0IGVpdGhlciB3YXMgcmVjb3ZlcmVkLCBlaXRoZXIgd2FzIHJlY292ZXJlZCBieSBjYXNjYWRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FuQmVSZWNvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9ucyB1cGRhdGVkIGJ5IHRoZSBjaGFuZ2UgbWFwcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlZFJlbGF0aW9uTWFwcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiB1cGRhdGVkIGNvbHVtbnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlmZkNvbHVtbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgdXBkYXRlZCByZWxhdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlmZlJlbGF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy5lbnRpdHkgPSBvcHRpb25zLmVudGl0eTtcbiAgICAgICAgdGhpcy5wYXJlbnRTdWJqZWN0ID0gb3B0aW9ucy5wYXJlbnRTdWJqZWN0O1xuICAgICAgICBpZiAob3B0aW9ucy5jYW5CZUluc2VydGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlSW5zZXJ0ZWQgPSBvcHRpb25zLmNhbkJlSW5zZXJ0ZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLmNhbkJlVXBkYXRlZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5jYW5CZVVwZGF0ZWQgPSBvcHRpb25zLmNhbkJlVXBkYXRlZDtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVzdEJlUmVtb3ZlZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5tdXN0QmVSZW1vdmVkID0gb3B0aW9ucy5tdXN0QmVSZW1vdmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5jYW5CZVNvZnRSZW1vdmVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlU29mdFJlbW92ZWQgPSBvcHRpb25zLmNhbkJlU29mdFJlbW92ZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLmNhbkJlUmVjb3ZlcmVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhbkJlUmVjb3ZlcmVkID0gb3B0aW9ucy5jYW5CZVJlY292ZXJlZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gb3B0aW9ucy5pZGVudGlmaWVyO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFuZ2VNYXBzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoX2EgPSB0aGlzLmNoYW5nZU1hcHMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChvcHRpb25zLmNoYW5nZU1hcHMpLCBmYWxzZSkpO1xuICAgICAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdC5wcm90b3R5cGUsIFwibXVzdEJlSW5zZXJ0ZWRcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBzdWJqZWN0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgaW5zZXJ0ZWQgKGV4cGxpY2l0bHkgcGVyc2lzdGVkIG9yIGJ5IGNhc2NhZGVzKVxuICAgICAgICAgKiBhbmQgaWYgaXQgZG9lcyBub3QgaGF2ZSBkYXRhYmFzZSBlbnRpdHkgc2V0LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW5CZUluc2VydGVkICYmICF0aGlzLmRhdGFiYXNlRW50aXR5O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN1YmplY3QucHJvdG90eXBlLCBcIm11c3RCZVVwZGF0ZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgc3ViamVjdCBtdXN0IGJlIHVwZGF0ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgdXBkYXRlZCAoZXhwbGljaXRseSBwZXJzaXN0ZWQgb3IgYnkgY2FzY2FkZXMpXG4gICAgICAgICAqIGFuZCBpZiBpdCBkb2VzIGhhdmUgZGlmZmVyZW50aWF0ZWQgY29sdW1ucyBvciByZWxhdGlvbnMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbkJlVXBkYXRlZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID09PSBmYWxzZSB8fCAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCAmJiB0aGlzLmRhdGFiYXNlRW50aXR5KSkgJiZcbiAgICAgICAgICAgICAgICAvLyAoKHRoaXMuZW50aXR5ICYmIHRoaXMuZGF0YWJhc2VFbnRpdHkpIHx8ICghdGhpcy5lbnRpdHkgJiYgIXRoaXMuZGF0YWJhc2VFbnRpdHkpKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTWFwcy5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN1YmplY3QucHJvdG90eXBlLCBcIm11c3RCZVNvZnRSZW1vdmVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHN1YmplY3QgbXVzdCBiZSBzb2Z0LXJlbW92ZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgc29mdC1yZW1vdmVkIChleHBsaWNpdGx5IHBlcnNpc3RlZCBvciBieSBjYXNjYWRlcylcbiAgICAgICAgICogYW5kIGlmIGl0IGRvZXMgaGF2ZSBkaWZmZXJlbnRpYXRlZCBjb2x1bW5zIG9yIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuQmVTb2Z0UmVtb3ZlZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmRhdGFiYXNlRW50aXR5TG9hZGVkID09PSBmYWxzZSB8fCAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCAmJiB0aGlzLmRhdGFiYXNlRW50aXR5KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3ViamVjdC5wcm90b3R5cGUsIFwibXVzdEJlUmVjb3ZlcmVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGlzIHN1YmplY3QgbXVzdCBiZSByZWNvdmVyZWQgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqIFN1YmplY3QgY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlIGlmIGl0IGlzIGFsbG93ZWQgdG8gYmUgcmVjb3ZlcmVkIChleHBsaWNpdGx5IHBlcnNpc3RlZCBvciBieSBjYXNjYWRlcylcbiAgICAgICAgICogYW5kIGlmIGl0IGRvZXMgaGF2ZSBkaWZmZXJlbnRpYXRlZCBjb2x1bW5zIG9yIHJlbGF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuQmVSZWNvdmVyZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5kYXRhYmFzZUVudGl0eUxvYWRlZCA9PT0gZmFsc2UgfHwgKHRoaXMuZGF0YWJhc2VFbnRpdHlMb2FkZWQgJiYgdGhpcy5kYXRhYmFzZUVudGl0eSkpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB2YWx1ZSBzZXQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgLyB1cGRhdGVkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBWYWx1ZSBzZXQgaXMgYmFzZWQgb24gdGhlIGVudGl0eSBhbmQgY2hhbmdlIG1hcHMgb2YgdGhlIHN1YmplY3QuXG4gICAgICogSW1wb3J0YW50IG5vdGU6IHRoaXMgbWV0aG9kIHBvcHMgZGF0YSBmcm9tIHRoaXMgc3ViamVjdCdzIGNoYW5nZSBtYXBzLlxuICAgICAqL1xuICAgIFN1YmplY3QucHJvdG90eXBlLmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgdmFyIGNoYW5nZVNldCA9IHRoaXMuY2hhbmdlTWFwcy5yZWR1Y2UoZnVuY3Rpb24gKHVwZGF0ZU1hcCwgY2hhbmdlTWFwKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjaGFuZ2VNYXAudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlZCBjb2x1bW5zIGNhbiByZWZlciBvbiB2YWx1ZXMgYm90aCB3aGljaCB3ZXJlIGp1c3QgaW5zZXJ0ZWQgYW5kIHdoaWNoIHdlcmUgcHJlc2VudCBpbiB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICAvLyBpZiBlbnRpdHkgd2FzIGp1c3QgaW5zZXJ0ZWQgdmFsdWVTZXRzIG11c3QgY29udGFpbiBhbGwgdmFsdWVzIGZyb20gdGhlIGVudGl0eSBhbmQgdmFsdWVzIGp1c3QgaW5zZXJ0ZWQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAgICAgLy8gc28sIGhlcmUgd2UgY2hlY2sgaWYgd2UgaGF2ZSBhIHZhbHVlIHNldCB0aGVuIHdlIHNpbXBseSB1c2UgaXQgYXMgdmFsdWUgdG8gZ2V0IG91ciByZWZlcmVuY2UgY29sdW1uIHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzaW1wbHkgdXNlIGFuIGVudGl0eSB3aGljaCBjYW5ub3QgYmUganVzdCBpbnNlcnRlZCBhdCB0aGUgbW9tZW50IGFuZCBoYXZlIGFsbCBuZWNlc3NhcnkgZGF0YVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuaW5zZXJ0ZWRWYWx1ZVNldCA/IHZhbHVlLmluc2VydGVkVmFsdWVTZXQgOiB2YWx1ZS5lbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSA9IGNoYW5nZU1hcC52YWx1ZUZhY3RvcnkgPyBjaGFuZ2VNYXAudmFsdWVGYWN0b3J5KHZhbHVlKSA6IGNoYW5nZU1hcC5jb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpO1xuICAgICAgICAgICAgdmFyIHZhbHVlTWFwO1xuICAgICAgICAgICAgaWYgKF90aGlzLm1ldGFkYXRhLmlzSnVuY3Rpb24gJiYgY2hhbmdlTWFwLmNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhbHVlTWFwID0gY2hhbmdlTWFwLmNvbHVtbi5jcmVhdGVWYWx1ZU1hcChjaGFuZ2VNYXAuY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5nZU1hcC5jb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZU1hcCA9IGNoYW5nZU1hcC5jb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhbmdlTWFwLnJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gdmFsdWUgY2FuIGJlIGEgcmVsYXRlZCBvYmplY3QsIGZvciBleGFtcGxlOiBwb3N0LnF1ZXN0aW9uID0geyBpZDogMSB9XG4gICAgICAgICAgICAgICAgLy8gb3IgdmFsdWUgY2FuIGJlIGEgbnVsbCBvciBkaXJlY3QgcmVsYXRpb24gaWQsIGUuZy4gcG9zdC5xdWVzdGlvbiA9IDFcbiAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYSBkaXJlY3Rpb24gcmVsYXRpb24gaWQgdGhlbiB3ZSBqdXN0IHNldCBpdCB0byB0aGUgdmFsdWVNYXAsXG4gICAgICAgICAgICAgICAgLy8gaG93ZXZlciBpZiBpdHMgYW4gb2JqZWN0IHRoZW4gd2UgbmVlZCB0byBleHRyYWN0IGl0cyByZWxhdGlvbiBpZCBtYXAgYW5kIHNldCBpdCB0byB0aGUgdmFsdWVNYXBcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHJlbGF0aW9uIGlkLCBlLmcuIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYW5kIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGU6IHsgaWQ6IDEgfSB3aGljaCB0aGVuIHdpbGwgYmUgc2V0IHRvIHJlbGF0aW9uLCBlLmcuIHBvc3QuY2F0ZWdvcnkgPSB7IGlkOiAxIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uSWQgPSBjaGFuZ2VNYXAucmVsYXRpb24uZ2V0UmVsYXRpb25JZE1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCByZWxhdGlvbiBpZCBjYW4gYmUgZW1wdHksIGZvciBleGFtcGxlIGluIHRoZSBjYXNlIHdoZW4geW91IGluc2VydCBhIG5ldyBwb3N0IHdpdGggY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJvdGggcG9zdCBhbmQgY2F0ZWdvcnkgYXJlIG5ld2x5IGluc2VydGVkIG9iamVjdHMgKGJ5IGNhc2NhZGVzKSBhbmQgaW4gdGhpcyBjYXNlIGNhdGVnb3J5IHdpbGwgbm90IGhhdmUgaWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSBuZWVkIHRvIGluc2VydCBwb3N0IHdpdGhvdXQgcXVlc3Rpb24gaWQgYW5kIHVwZGF0ZSBwb3N0J3MgcXVlc3Rpb25JZCBvbmNlIHF1ZXN0aW9uIGJlIGluc2VydGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQncyB3aHkgd2UgY3JlYXRlIGEgbmV3IGNoYW5nZU1hcCBvcGVyYXRpb24gZm9yIGZ1dHVyZSB1cGRhdGlvbiBvZiB0aGUgcG9zdCBlbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXMucHVzaChjaGFuZ2VNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2FuQmVVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVNYXA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXAgPSBjaGFuZ2VNYXAucmVsYXRpb24uY3JlYXRlVmFsdWVNYXAocmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRSZWxhdGlvbk1hcHMucHVzaCh7IHJlbGF0aW9uOiBjaGFuZ2VNYXAucmVsYXRpb24sIHZhbHVlOiByZWxhdGlvbklkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gdmFsdWUgY2FuIGJlIFwibnVsbFwiIG9yIGRpcmVjdCByZWxhdGlvbiBpZCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlTWFwID0gY2hhbmdlTWFwLnJlbGF0aW9uLmNyZWF0ZVZhbHVlTWFwKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlZFJlbGF0aW9uTWFwcy5wdXNoKHsgcmVsYXRpb246IGNoYW5nZU1hcC5yZWxhdGlvbiwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlRGVlcCh1cGRhdGVNYXAsIHZhbHVlTWFwKTtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VNYXBzID0gY2hhbmdlTWFwc1dpdGhvdXRWYWx1ZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VTZXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvbXB1dGVzIGVudGl0eVdpdGhGdWxmaWxsZWRJZHMgYW5kIGlkZW50aWZpZXIgd2hlbiBlbnRpdHkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBTdWJqZWN0LnByb3RvdHlwZS5yZWNvbXB1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLmVudGl0eSkge1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5lbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50U3ViamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbi5yZWxhdGlvbk1ldGFkYXRhICYmIHByaW1hcnlDb2x1bW4ucmVsYXRpb25NZXRhZGF0YS5pbnZlcnNlRW50aXR5TWV0YWRhdGEgPT09IF90aGlzLnBhcmVudFN1YmplY3QubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByaW1hcnlDb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShfdGhpcy5wYXJlbnRTdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLnNldEVudGl0eVZhbHVlKF90aGlzLmVudGl0eVdpdGhGdWxmaWxsZWRJZHMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyID0gdGhpcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcCh0aGlzLmVudGl0eVdpdGhGdWxmaWxsZWRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YWJhc2VFbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IHRoaXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAodGhpcy5kYXRhYmFzZUVudGl0eSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTdWJqZWN0O1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3QgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViamVjdC5qcy5tYXBcbiIsImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gXCIuLi91dGlsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9IGZyb20gXCIuLi91dGlsL0FwcGx5VmFsdWVUcmFuc2Zvcm1lcnNcIjtcbi8qKlxuICogRmluZHMgd2hhdCBjb2x1bW5zIGFyZSBjaGFuZ2VkIGluIHRoZSBzdWJqZWN0IGVudGl0aWVzLlxuICovXG52YXIgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB3aGF0IGNvbHVtbnMgYXJlIGNoYW5nZWQgaW4gdGhlIHN1YmplY3QgZW50aXRpZXMuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGUgPSBmdW5jdGlvbiAoc3ViamVjdHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuY29tcHV0ZURpZmZDb2x1bW5zKHN1YmplY3QpO1xuICAgICAgICAgICAgX3RoaXMuY29tcHV0ZURpZmZSZWxhdGlvbmFsQ29sdW1ucyhzdWJqZWN0cywgc3ViamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIERpZmZlcmVudGlhdGUgY29sdW1ucyBmcm9tIHRoZSB1cGRhdGVkIGVudGl0eSBhbmQgZW50aXR5IHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGVEaWZmQ29sdW1ucyA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHBlcnNpc3RlZCBlbnRpdHkgdGhlbiBub3RoaW5nIHRvIGNvbXB1dGUgY2hhbmdlZCBpbiBpdFxuICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgc3BlY2lhbCBjb2x1bW5zXG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbCB8fFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pc0Rpc2NyaW1pbmF0b3IgLy8gfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc1VwZGF0ZURhdGUgfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc1ZlcnNpb24gfHxcbiAgICAgICAgICAgIC8vIGNvbHVtbi5pc0NyZWF0ZURhdGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgY2hhbmdlTWFwID0gc3ViamVjdC5jaGFuZ2VNYXBzLmZpbmQoZnVuY3Rpb24gKGNoYW5nZU1hcCkgeyByZXR1cm4gY2hhbmdlTWFwLmNvbHVtbiA9PT0gY29sdW1uOyB9KTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VNYXApIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0LmNoYW5nZU1hcHMuc3BsaWNlKHN1YmplY3QuY2hhbmdlTWFwcy5pbmRleE9mKGNoYW5nZU1hcCksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZ2V0IHVzZXIgcHJvdmlkZWQgdmFsdWUgLSBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgdXNlciBwcm92aWRlZCBwZXJzaXN0ZWQgZW50aXR5XG4gICAgICAgICAgICB2YXIgZW50aXR5VmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcGVyZm9ybSBvcGVyYXRpb24gb3ZlciB1bmRlZmluZWQgcHJvcGVydGllcyAoYnV0IHdlIERPIG5lZWQgbnVsbCBwcm9wZXJ0aWVzISlcbiAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRhdGFiYXNlIGVudGl0eSB0aGVuIGFsbCBjb2x1bW5zIGFyZSB0cmVhdGVkIGFzIG5ldywgZS5nLiBjaGFuZ2VkXG4gICAgICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgdHJhbnNmb3JtIGRhdGFiYXNlIHZhbHVlIGZvciBqc29uIC8ganNvbmIgZm9yIGNvbXBhcmlzb24gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICB2YXIgc2hvdWxkVHJhbnNmb3JtRGF0YWJhc2VFbnRpdHkgPSBjb2x1bW4udHlwZSAhPT0gXCJqc29uXCIgJiYgY29sdW1uLnR5cGUgIT09IFwianNvbmJcIjtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGF0YWJhc2UgdmFsdWUgb2YgdGhlIGNvbHVtblxuICAgICAgICAgICAgICAgIHZhciBkYXRhYmFzZVZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHNob3VsZFRyYW5zZm9ybURhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IFwicmVsYXRpb25hbCBjb2x1bW5zXCIgb25seSBpbiB0aGUgY2FzZSBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uIG9iamVjdCBpbiBlbnRpdHlcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLnJlbGF0aW9uTWV0YWRhdGEuZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRWYWx1ZSA9IGVudGl0eVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBzcGVjaWFsIHZhbHVlcyB0byBtYWtlIHByb3BlciBjb21wYXJpc2lvblxuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb0RhdGVTdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRpbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aW1lIHdpdGggdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZSB3aXRob3V0IHRpbWUgem9uZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRpbWV0elwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb1RpbWVTdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZXRpbWUyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGggdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wIHdpdGggbG9jYWwgdGltZSB6b25lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZXN0YW1wdHpcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBEYXRlVXRpbHMubWl4ZWREYXRlVG9VdGNEYXRldGltZVN0cmluZyhlbnRpdHlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VWYWx1ZSA9IERhdGVVdGlscy5taXhlZERhdGVUb1V0Y0RhdGV0aW1lU3RyaW5nKGRhdGFiYXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJqc29uYlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGRvZXNuJ3Qgd29yayBiZWNhdXNlIHBvc3RncmVzcWwgc29ydHMganNvbmIgYmVmb3JlIHNhdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IHRyeSB0byBzYXZlIGpzb24gJ1t7XCJtZXNzYWdlc1wiOiBcIlwiLCBcImF0dHJpYnV0ZSBLZXlcIjogXCJcIiwgXCJsZXZlbFwiOlwiXCJ9XSAnIGFzIGpzb25iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcG9zdGdyZXNxbCB3aWxsIHNhdmUgaXQgYXMgJ1t7XCJsZXZlbFwiOiBcIlwiLCBcIm1lc3NhZ2VcIjpcIlwiLCBcImF0dHJpYnV0ZUtleVwiOiBcIlwifV0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmRlZXBDb21wYXJlKGVudGl0eVZhbHVlLCBkYXRhYmFzZVZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNpbXBsZS1hcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5zaW1wbGVBcnJheVRvU3RyaW5nKGVudGl0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZVZhbHVlID0gRGF0ZVV0aWxzLnNpbXBsZUFycmF5VG9TdHJpbmcoZGF0YWJhc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2ltcGxlLWVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVmFsdWUgPSBEYXRlVXRpbHMuc2ltcGxlRW51bVRvU3RyaW5nKGVudGl0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZVZhbHVlID0gRGF0ZVV0aWxzLnNpbXBsZUVudW1Ub1N0cmluZyhkYXRhYmFzZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaW1wbGUtanNvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcoZW50aXR5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlVmFsdWUgPSBEYXRlVXRpbHMuc2ltcGxlSnNvblRvU3RyaW5nKGRhdGFiYXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtVG8oY29sdW1uLnRyYW5zZm9ybWVyLCBlbnRpdHlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGNoYW5nZWQgLSB0aGVuIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFZhbHVlIGluc3RhbmNlb2YgQnVmZmVyICYmIGRhdGFiYXNlVmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZS5lcXVhbHMoZGF0YWJhc2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gZGF0YWJhc2VWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJqZWN0LmRpZmZDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIHN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZW50aXR5VmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpZmZlcmVuY2UgY29sdW1ucyBvZiB0aGUgb3duaW5nIG9uZS10by1vbmUgYW5kIG1hbnktdG8tb25lIGNvbHVtbnMuXG4gICAgICovXG4gICAgU3ViamVjdENoYW5nZWRDb2x1bW5zQ29tcHV0ZXIucHJvdG90eXBlLmNvbXB1dGVEaWZmUmVsYXRpb25hbENvbHVtbnMgPSBmdW5jdGlvbiAoYWxsU3ViamVjdHMsIHN1YmplY3QpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVkIGVudGl0eSB0aGVuIG5vdGhpbmcgdG8gY29tcHV0ZSBjaGFuZ2VkIGluIGl0XG4gICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zV2l0aEpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIHJlbGF0ZWQgZW50aXR5IGZyb20gdGhlIHBlcnNpc3RlZCBlbnRpdHlcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5ID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcGVyZm9ybSBvcGVyYXRpb24gb3ZlciB1bmRlZmluZWQgcHJvcGVydGllcyAoYnV0IHdlIERPIG5lZWQgbnVsbCBwcm9wZXJ0aWVzISlcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGF0YWJhc2UgZW50aXR5IHRoZW4gYWxsIHJlbGF0aW9uYWwgY29sdW1ucyBhcmUgdHJlYXRlZCBhcyBuZXcsIGUuZy4gY2hhbmdlZFxuICAgICAgICAgICAgaWYgKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGNvdmVyIHR3byBzY2VuYXJpb3M6XG4gICAgICAgICAgICAgICAgLy8gMS4gcmVsYXRlZCBlbnRpdHkgY2FuIGJlIGFub3RoZXIgZW50aXR5IHdoaWNoIGlzIG5hdHVyYWwgd2F5XG4gICAgICAgICAgICAgICAgLy8gMi4gcmVsYXRlZCBlbnRpdHkgY2FuIGJlIGp1c3QgYW4gZW50aXR5IGlkXG4gICAgICAgICAgICAgICAgLy8gaWYgcmVsYXRpb24gZW50aXR5IGlzIGp1c3QgYSByZWxhdGlvbiBpZCBzZXQgKGZvciBleGFtcGxlIHBvc3QudGFnID0gMSlcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNyZWF0ZSBhbiBpZCBtYXAgZnJvbSBpdCB0byBtYWtlIGEgcHJvcGVyIGNvbXBhcmlzaW9uXG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgIT09IG51bGwgJiYgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRpb24uZ2V0UmVsYXRpb25JZE1hcChyZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGRhdGFiYXNlIHJlbGF0ZWQgZW50aXR5LiBTaW5jZSBsb2FkUmVsYXRpb25JZHMgYXJlIHVzZWQgb24gZGF0YWJhc2VFbnRpdHlcbiAgICAgICAgICAgICAgICAvLyByZWxhdGVkIGVudGl0eSB3aWxsIGNvbnRhaW4gb25seSBpdHMgcmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgdmFyIGRhdGFiYXNlUmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgICAgICAvLyBpZiByZWxhdGlvbiBpZHMgYXJlIGVxdWFsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgYW55dGhpbmdcbiAgICAgICAgICAgICAgICB2YXIgYXJlUmVsYXRlZElkc0VxdWFsID0gT3JtVXRpbHMuY29tcGFyZUlkcyhyZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCwgZGF0YWJhc2VSZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZVJlbGF0ZWRJZHNFcXVhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmRpZmZSZWxhdGlvbnMucHVzaChyZWxhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gaW5zZXJ0ZWQgc3ViamVjdCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9mIHRoZSBwZXJzaXN0ZWQgZW50aXR5IHRoZW4gdXNlIGl0IGFzIHJlbGF0ZWQgZW50aXR5XG4gICAgICAgICAgICAvLyB0aGlzIGNvZGUgaXMgdXNlZCBmb3IgcmVsYXRlZCBlbnRpdGllcyB3aXRob3V0IGlkcyB0byBiZSBwcm9wZXJseSBpbnNlcnRlZCAoYW5kIHRoZW4gdXBkYXRlZCBpZiBuZWVkZWQpXG4gICAgICAgICAgICB2YXIgdmFsdWVTdWJqZWN0ID0gYWxsU3ViamVjdHMuZmluZChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVJbnNlcnRlZCAmJiBzdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTsgfSk7XG4gICAgICAgICAgICBpZiAodmFsdWVTdWJqZWN0KVxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHkgPSB2YWx1ZVN1YmplY3Q7XG4gICAgICAgICAgICAvLyBmaW5kIGlmIHRoZXJlIGlzIGFscmVhZHkgYSByZWxhdGlvbiB0byBiZSBjaGFuZ2VkXG4gICAgICAgICAgICB2YXIgY2hhbmdlTWFwID0gc3ViamVjdC5jaGFuZ2VNYXBzLmZpbmQoZnVuY3Rpb24gKGNoYW5nZU1hcCkgeyByZXR1cm4gY2hhbmdlTWFwLnJlbGF0aW9uID09PSByZWxhdGlvbjsgfSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlTWFwKSB7IC8vIGFuZCB1cGRhdGUgaXRzIHZhbHVlIGlmIGl0IHdhcyBmb3VuZFxuICAgICAgICAgICAgICAgIGNoYW5nZU1hcC52YWx1ZSA9IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gaWYgaXQgd2Fzbid0IGZvdW5kIGFkZCBhIG5ldyByZWxhdGlvbiBmb3IgY2hhbmdlXG4gICAgICAgICAgICAgICAgc3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWxhdGVkRW50aXR5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBMb2FkcyBkYXRhYmFzZSBlbnRpdGllcyBmb3IgYWxsIG9wZXJhdGUgc3ViamVjdHMgd2hpY2ggZG8gbm90IGhhdmUgZGF0YWJhc2UgZW50aXR5IHNldC5cbiAqIEFsbCBlbnRpdGllcyB0aGF0IHdlIGxvYWQgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFyZSBtYXJrZWQgYXMgdXBkYXRlZCBvciBpbnNlcnRlZC5cbiAqIFRvIHVuZGVyc3RhbmQgd2hpY2ggb2YgdGhlbSByZWFsbHkgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCB3ZSBuZWVkIHRvIGxvYWRcbiAqIHRoZWlyIG9yaWdpbmFsIHJlcHJlc2VudGF0aW9ucyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAqL1xudmFyIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlcihxdWVyeVJ1bm5lciwgc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICB0aGlzLnN1YmplY3RzID0gc3ViamVjdHM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogTG9hZHMgZGF0YWJhc2UgZW50aXRpZXMgZm9yIGFsbCBzdWJqZWN0cy5cbiAgICAgKlxuICAgICAqIGxvYWRBbGxSZWxhdGlvbnMgZmxhZyBpcyB1c2VkIHRvIGxvYWQgYWxsIHJlbGF0aW9uIGlkcyBvZiB0aGUgb2JqZWN0LCBubyBtYXR0ZXIgaWYgdGhleSBwcmVzZW50IGluIHN1YmplY3QgZW50aXR5IG9yIG5vdC5cbiAgICAgKiBUaGlzIG9wdGlvbiBpcyB1c2VkIGZvciBkZWxldGlvbi5cbiAgICAgKi9cbiAgICBTdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAob3BlcmF0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSB0aGlzLmdyb3VwQnlFbnRpdHlUYXJnZXRzKCkubWFwKGZ1bmN0aW9uIChzdWJqZWN0R3JvdXApIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxsSWRzLCBhbGxTdWJqZWN0cywgbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocywgZmluZE9wdGlvbnMsIGVudGl0aWVzLCBhbGxTdWJqZWN0c18xLCBhbGxTdWJqZWN0c18xXzEsIHN1YmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxJZHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RHcm91cC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGxvYWQgaWYgc3ViamVjdCBhbHJlYWR5IGhhcyBhIGRhdGFiYXNlIGVudGl0eSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgfHwgIXN1YmplY3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsSWRzLnB1c2goc3ViamVjdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsU3ViamVjdHMucHVzaChzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBubyBpZHMgZm91bmQgKG1lYW5zIGFsbCBlbnRpdGllcyBhcmUgbmV3IGFuZCBoYXZlIGdlbmVyYXRlZCBpZHMpIC0gdGhlbiBub3RoaW5nIHRvIGxvYWQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbElkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBzYXZlLCBzb2Z0LXJlbW92ZSBhbmQgcmVjb3ZlciBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGFsbCBwcm9wZXJ0eSBwYXRocyBvZiB0aGUgcmVsYXRpb25zIHdlIG5lZWQgdG8gbG9hZCByZWxhdGlvbiBpZHMgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2UgLSB0aGlzIHdheSB3ZSBkb24ndCBsb2FkIHJlbGF0aW9uIGlkcyBmb3IgZW50aXRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9zZSByZWxhdGlvbnMgYXJlIHVuZGVmaW5lZCwgYW5kIHNpbmNlIHRoZXkgYXJlIHVuZGVmaW5lZCBpdHMgcmVhbGx5IHBvaW50bGVzcyB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgc29tZXRoaW5nIGZvciB0aGVtLCBzaW5jZSB1bmRlZmluZWQgcHJvcGVydGllcyBhcmUgc2tpcHBlZCBieSB0aGUgb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiIHx8IG9wZXJhdGlvblR5cGUgPT09IFwic29mdC1yZW1vdmVcIiB8fCBvcGVyYXRpb25UeXBlID09PSBcInJlY292ZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0R3JvdXAuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0cyBhbGwgcmVsYXRpb24gcHJvcGVydHkgcGF0aHMgdGhhdCBleGlzdCBpbiB0aGUgcGVyc2lzdGVkIGVudGl0eS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzLmluZGV4T2YocmVsYXRpb24ucHJvcGVydHlQYXRoKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZWxhdGlvblByb3BlcnR5UGF0aHMucHVzaChyZWxhdGlvbi5wcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gcmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciByZW1vdmUgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBsb2FkIGp1bmN0aW9uIHJlbGF0aW9uIGlkcyBzaW5jZSBvbmx5IHRoZXkgYXJlIHJlbW92ZWQgYnkgY2FzY2FkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocy5wdXNoLmFwcGx5KC8vIHJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25Qcm9wZXJ0eVBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViamVjdEdyb3VwLnN1YmplY3RzWzBdLm1ldGFkYXRhLm1hbnlUb01hbnlSZWxhdGlvbnMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbikgeyByZXR1cm4gcmVsYXRpb24ucHJvcGVydHlQYXRoOyB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRWFnZXJSZWxhdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkUmVsYXRpb25JZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uczogbG9hZFJlbGF0aW9uUHJvcGVydHlQYXRocyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVNaXhlZE1hcDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc29mdC1kZWxldGVkIGVudGl0aWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbG9hZGVkIGVudGl0aWVzIGZvciByZWNvdmVyIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoRGVsZXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVwb3NpdG9yeShzdWJqZWN0R3JvdXAudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRCeUlkcyhhbGxJZHMsIGZpbmRPcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdoZW4gd2UgaGF2ZSBlbnRpdGllcyB3ZSBuZWVkIHRvIGZpbmQgc3ViamVjdCBvZiBlYWNoIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbnNlcnQgdGhhdCBlbnRpdHkgaW50byBkYXRhYmFzZSBlbnRpdHkgb2YgdGhlIGZvdW5kIHN1YmplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJqZWN0cyA9IF90aGlzLmZpbmRCeVBlcnNpc3RFbnRpdHlMaWtlKHN1YmplY3RHcm91cC50YXJnZXQsIGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgPSBlbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YmplY3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmlkZW50aWZpZXIgPSBzdWJqZWN0Lm1ldGFkYXRhLmhhc0FsbFByaW1hcnlLZXlzKGVudGl0eSkgPyBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2F5IHdlIHRlbGwgd2hhdCBzdWJqZWN0cyB3ZSB0cmllZCB0byBsb2FkIGRhdGFiYXNlIGVudGl0aWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYWxsU3ViamVjdHNfMSA9IF9fdmFsdWVzKGFsbFN1YmplY3RzKSwgYWxsU3ViamVjdHNfMV8xID0gYWxsU3ViamVjdHNfMS5uZXh0KCk7ICFhbGxTdWJqZWN0c18xXzEuZG9uZTsgYWxsU3ViamVjdHNfMV8xID0gYWxsU3ViamVjdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QgPSBhbGxTdWJqZWN0c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmRhdGFiYXNlRW50aXR5TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFN1YmplY3RzXzFfMSAmJiAhYWxsU3ViamVjdHNfMV8xLmRvbmUgJiYgKF9hID0gYWxsU3ViamVjdHNfMS5yZXR1cm4pKSBfYS5jYWxsKGFsbFN1YmplY3RzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChwcm9taXNlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGaW5kcyBzdWJqZWN0cyB3aGVyZSBlbnRpdHkgbGlrZSBnaXZlbiBzdWJqZWN0J3MgZW50aXR5LlxuICAgICAqIENvbXBhcmlzaW9uIG1hZGUgYnkgZW50aXR5IGlkLlxuICAgICAqIE11bHRpcGxlIHN1YmplY3RzIG1heSBiZSByZXR1cm5lZCBpZiBkdXBsaWNhdGVzIGFyZSBwcmVzZW50IGluIHRoZSBzdWJqZWN0IGFycmF5LlxuICAgICAqIFRoaXMgd2lsbCBsaWtlbHkgcmVzdWx0IGluIHRoZSBzYW1lIHJvdyBiZWluZyB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5wcm90b3R5cGUuZmluZEJ5UGVyc2lzdEVudGl0eUxpa2UgPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSA9PT0gZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QubWV0YWRhdGEudGFyZ2V0ID09PSBlbnRpdHlUYXJnZXQgJiYgc3ViamVjdC5tZXRhZGF0YS5jb21wYXJlRW50aXRpZXMoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzLCBlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdyb3VwcyBnaXZlbiBTdWJqZWN0IG9iamVjdHMgaW50byBncm91cHMgc2VwYXJhdGVkIGJ5IGVudGl0eSB0YXJnZXRzLlxuICAgICAqL1xuICAgIFN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5wcm90b3R5cGUuZ3JvdXBCeUVudGl0eVRhcmdldHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmplY3RzLnJlZHVjZShmdW5jdGlvbiAoZ3JvdXBzLCBvcGVyYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gZ3JvdXBzLmZpbmQoZnVuY3Rpb24gKGdyb3VwKSB7IHJldHVybiBncm91cC50YXJnZXQgPT09IG9wZXJhdGVkRW50aXR5Lm1ldGFkYXRhLnRhcmdldDsgfSk7XG4gICAgICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB7IHRhcmdldDogb3BlcmF0ZWRFbnRpdHkubWV0YWRhdGEudGFyZ2V0LCBzdWJqZWN0czogW10gfTtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cC5zdWJqZWN0cy5wdXNoKG9wZXJhdGVkRW50aXR5KTtcbiAgICAgICAgICAgIHJldHVybiBncm91cHM7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIHJldHVybiBTdWJqZWN0RGF0YWJhc2VFbnRpdHlMb2FkZXI7XG59KCkpO1xuZXhwb3J0IHsgU3ViamVjdERhdGFiYXNlRW50aXR5TG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3REYXRhYmFzZUVudGl0eUxvYWRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyIH0gZnJvbSBcIi4vU3ViamVjdFRvcG9saWdpY2FsU29ydGVyXCI7XG5pbXBvcnQgeyBTdWJqZWN0Q2hhbmdlZENvbHVtbnNDb21wdXRlciB9IGZyb20gXCIuL1N1YmplY3RDaGFuZ2VkQ29sdW1uc0NvbXB1dGVyXCI7XG5pbXBvcnQgeyBTdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvciB9IGZyb20gXCIuLi9lcnJvci9TdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvclwiO1xuaW1wb3J0IHsgU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvU3ViamVjdFJlbW92ZWRBbmRVcGRhdGVkRXJyb3JcIjtcbmltcG9ydCB7IE1vbmdvUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29RdWVyeVJ1bm5lclwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyUmVzdWx0IH0gZnJvbSBcIi4uL3N1YnNjcmliZXIvQnJvYWRjYXN0ZXJSZXN1bHRcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yIH0gZnJvbSBcIi4vdHJlZS9OZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi90cmVlL0Nsb3N1cmVTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IgfSBmcm9tIFwiLi90cmVlL01hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3JcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIjtcbi8qKlxuICogRXhlY3V0ZXMgYWxsIGRhdGFiYXNlIG9wZXJhdGlvbnMgKGluc2VydHMsIHVwZGF0ZWQsIGRlbGV0ZXMpIHRoYXQgbXVzdCBiZSBleGVjdXRlZFxuICogd2l0aCBnaXZlbiBwZXJzaXN0ZW5jZSBzdWJqZWN0cy5cbiAqL1xudmFyIFN1YmplY3RFeGVjdXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdEV4ZWN1dG9yKHF1ZXJ5UnVubmVyLCBzdWJqZWN0cywgb3B0aW9ucykge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBQcm9wZXJ0aWVzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBleGVjdXRvciBoYXMgYW55IG9wZXJhdGlvbnMgdG8gZXhlY3V0ZSAoZS5nLiBoYXMgaW5zZXJ0IC8gdXBkYXRlIC8gZGVsZXRlIG9wZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNFeGVjdXRhYmxlT3BlcmF0aW9ucyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIGluc2VydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdWJqZWN0cyB0aGF0IG11c3QgYmUgcmVtb3ZlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YmplY3RzIHRoYXQgbXVzdCBiZSBzb2Z0LXJlbW92ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3ViamVjdHMgdGhhdCBtdXN0IGJlIHJlY292ZXJlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjb3ZlclN1YmplY3RzID0gW107XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgdGhpcy5hbGxTdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMucmVjb21wdXRlKCk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhbGwgb3BlcmF0aW9ucyBvdmVyIGdpdmVuIGFycmF5IG9mIHN1YmplY3RzLlxuICAgICAqIEV4ZWN1dGVzIHF1ZXJpZXMgdXNpbmcgZ2l2ZW4gcXVlcnkgcnVubmVyLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJyb2FkY2FzdGVyUmVzdWx0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXJSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgIT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIuYnJvYWRjYXN0QmVmb3JlRXZlbnRzRm9yQWxsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXJSZXN1bHQgPSB0aGlzLmJyb2FkY2FzdEJlZm9yZUV2ZW50c0ZvckFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBldmVudCBsaXN0ZW5lcnMgYW5kIHN1YnNjcmliZXJzIGNhbiBjYWxsIHNhdmUgbWV0aG9kcyBhbmQvb3IgdHJpZ2dlciBlbnRpdHkgY2hhbmdlcyB3ZSBuZWVkIHRvIHJlY29tcHV0ZSBvcGVyYXRpb25hbCBzdWJqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIG9ubHkgaW4gdGhlIGNhc2UgaWYgYW55IGxpc3RlbmVyIG9yIHN1YnNjcmliZXIgd2FzIHJlYWxseSBleGVjdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyb2FkY2FzdGVyUmVzdWx0ICYmIGJyb2FkY2FzdGVyUmVzdWx0LmNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi5yZWNvbXB1dGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0LnJlY29tcHV0ZSgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QucmVjb21wdXRlKCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5yZWNvbXB1dGUoKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbXB1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIucmVjb21wdXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG91ciBpbnNlcnQgc3ViamVjdHMgYXJlIHNvcnRlZCAodXNpbmcgdG9wb2xvZ2ljYWwgc29ydGluZykgdG8gbWFrZSBjYXNjYWRlIGluc2VydHMgd29yayBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwicHJlcGFyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgYWxsIGluc2VydCBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIuaW5zZXJ0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRTdWJqZWN0cyA9IG5ldyBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIodGhpcy5pbnNlcnRTdWJqZWN0cykuc29ydChcImluc2VydFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUluc2VydE9wZXJhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcIi5pbnNlcnRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbXB1dGUgdXBkYXRlIG9wZXJhdGlvbnMgc2luY2UgaW5zZXJ0aW9uIGNhbiBjcmVhdGUgdXBkYXRpb24gb3BlcmF0aW9ucyBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGl0IHdhc24ndCBhYmxlIHRvIGhhbmRsZSBvbiBpdHMgb3duIChyZWZlcmVuY2VkIGNvbHVtbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzID0gdGhpcy5hbGxTdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QubXVzdEJlVXBkYXRlZDsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVVcGRhdGVPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIudXBkYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgb3VyIHJlbW92ZSBzdWJqZWN0cyBhcmUgc29ydGVkICh1c2luZyB0b3BvbG9naWNhbCBzb3J0aW5nKSB3aGVuIG11bHRpcGxlIGVudGl0aWVzIGFyZSBwYXNzZWQgZm9yIHRoZSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIucmVtb3ZhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMgPSBuZXcgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyKHRoaXMucmVtb3ZlU3ViamVjdHMpLnNvcnQoXCJkZWxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVSZW1vdmVPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoXCIucmVtb3ZhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29tcHV0ZSBzb2Z0LXJlbW92ZSBvcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVNvZnRSZW1vdmVkOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlU29mdFJlbW92ZU9wZXJhdGlvbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgc29mdC1yZW1vdmUgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHJlY292ZXIgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVSZWNvdmVyZWQ7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSByZWNvdmVyIG9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZVJlY292ZXJPcGVyYXRpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHJlY292ZXIgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGFsbCBzcGVjaWFsIGNvbHVtbnMgaW4gcGVyc2lzdGVkIGVudGl0aWVzLCBsaWtlIGluc2VydGVkIGlkIG9yIHJlbW92ZSBpZHMgZnJvbSB0aGUgcmVtb3ZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKFwiLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5QZXJzaXN0ZWRFbnRpdGllc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlU3BlY2lhbENvbHVtbnNJblBlcnNpc3RlZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYWxsIHNwZWNpYWwgY29sdW1ucyBpbiBwZXJzaXN0ZWQgZW50aXRpZXMsIGxpa2UgaW5zZXJ0ZWQgaWQgb3IgcmVtb3ZlIGlkcyBmcm9tIHRoZSByZW1vdmVkIGVudGl0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRlU3BlY2lhbENvbHVtbnNJblBlcnNpc3RlZEVudGl0aWVzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGlzdGVuZXJzICE9PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyUmVzdWx0ID0gdGhpcy5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYnJvYWRjYXN0ZXJSZXN1bHQucHJvbWlzZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGJyb2FkY2FzdGVyUmVzdWx0LnByb21pc2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGFsbCBnaXZlbiBzdWJqZWN0cy5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFsbFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0Lm11c3RCZVVwZGF0ZWQgJiYgc3ViamVjdC5tdXN0QmVSZW1vdmVkKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdWJqZWN0UmVtb3ZlZEFuZFVwZGF0ZWRFcnJvcihzdWJqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBlbnRpdHkgcmUtY29tcHV0YXRpb25zIC0gZmluZHMgY2hhbmdlZCBjb2x1bW5zLCByZS1idWlsZHMgaW5zZXJ0L3VwZGF0ZS9yZW1vdmUgc3ViamVjdHMuXG4gICAgICovXG4gICAgU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5yZWNvbXB1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5ldyBTdWJqZWN0Q2hhbmdlZENvbHVtbnNDb21wdXRlcigpLmNvbXB1dGUodGhpcy5hbGxTdWJqZWN0cyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0U3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVJbnNlcnRlZDsgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVVcGRhdGVkOyB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVJlbW92ZWQ7IH0pO1xuICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cyA9IHRoaXMuYWxsU3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm11c3RCZVNvZnRSZW1vdmVkOyB9KTtcbiAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMgPSB0aGlzLmFsbFN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tdXN0QmVSZWNvdmVyZWQ7IH0pO1xuICAgICAgICB0aGlzLmhhc0V4ZWN1dGFibGVPcGVyYXRpb25zID0gdGhpcy5pbnNlcnRTdWJqZWN0cy5sZW5ndGggPiAwIHx8IHRoaXMudXBkYXRlU3ViamVjdHMubGVuZ3RoID4gMCB8fCB0aGlzLnJlbW92ZVN1YmplY3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubGVuZ3RoID4gMCB8fCB0aGlzLnJlY292ZXJTdWJqZWN0cy5sZW5ndGggPiAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9JTlNFUlRcIiwgXCJCRUZPUkVfVVBEQVRFXCIsIFwiQkVGT1JFX1JFTU9WRVwiIGV2ZW50cyBmb3IgYWxsIGdpdmVuIHN1YmplY3RzLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuYnJvYWRjYXN0QmVmb3JlRXZlbnRzRm9yQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEJyb2FkY2FzdGVyUmVzdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmluc2VydFN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0U3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QmVmb3JlSW5zZXJ0RXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSk7IH0pO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZW1vdmVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVJlbW92ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpOyB9KTtcbiAgICAgICAgaWYgKHRoaXMuc29mdFJlbW92ZVN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuc29mdFJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZVVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZWNvdmVyU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QmVmb3JlVXBkYXRlRXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5kYXRhYmFzZUVudGl0eSwgc3ViamVjdC5kaWZmQ29sdW1ucywgc3ViamVjdC5kaWZmUmVsYXRpb25zKTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQUZURVJfSU5TRVJUXCIsIFwiQUZURVJfVVBEQVRFXCIsIFwiQUZURVJfUkVNT1ZFXCIgZXZlbnRzIGZvciBhbGwgZ2l2ZW4gc3ViamVjdHMuXG4gICAgICogUmV0dXJucyB2b2lkIGlmIHRoZXJlIHdhc24ndCBhbnkgbGlzdGVuZXIgb3Igc3Vic2NyaWJlciBleGVjdXRlZC5cbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24uXG4gICAgICovXG4gICAgU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlckV2ZW50c0ZvckFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBCcm9hZGNhc3RlclJlc3VsdCgpO1xuICAgICAgICBpZiAodGhpcy5pbnNlcnRTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmluc2VydFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEFmdGVySW5zZXJ0RXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSk7IH0pO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEFmdGVyVXBkYXRlRXZlbnQocmVzdWx0LCBzdWJqZWN0Lm1ldGFkYXRhLCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5kYXRhYmFzZUVudGl0eSwgc3ViamVjdC5kaWZmQ29sdW1ucywgc3ViamVjdC5kaWZmUmVsYXRpb25zKTsgfSk7XG4gICAgICAgIGlmICh0aGlzLnJlbW92ZVN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJSZW1vdmVFdmVudChyZXN1bHQsIHN1YmplY3QubWV0YWRhdGEsIHN1YmplY3QuZW50aXR5LCBzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTsgfSk7XG4gICAgICAgIGlmICh0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnNvZnRSZW1vdmVTdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3RBZnRlclVwZGF0ZUV2ZW50KHJlc3VsdCwgc3ViamVjdC5tZXRhZGF0YSwgc3ViamVjdC5lbnRpdHksIHN1YmplY3QuZGF0YWJhc2VFbnRpdHksIHN1YmplY3QuZGlmZkNvbHVtbnMsIHN1YmplY3QuZGlmZlJlbGF0aW9ucyk7IH0pO1xuICAgICAgICBpZiAodGhpcy5yZWNvdmVyU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5yZWNvdmVyU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJVcGRhdGVFdmVudChyZXN1bHQsIHN1YmplY3QubWV0YWRhdGEsIHN1YmplY3QuZW50aXR5LCBzdWJqZWN0LmRhdGFiYXNlRW50aXR5LCBzdWJqZWN0LmRpZmZDb2x1bW5zLCBzdWJqZWN0LmRpZmZSZWxhdGlvbnMpOyB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGluc2VydCBvcGVyYXRpb25zLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZUluc2VydE9wZXJhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZ3JvdXBlZEluc2VydFN1YmplY3RzLCBncm91cGVkSW5zZXJ0U3ViamVjdEtleXMsIF9sb29wXzEsIHRoaXNfMSwgZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEsIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEsIGdyb3VwTmFtZSwgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdyb3VwQnVsa1N1YmplY3RzKHRoaXMuaW5zZXJ0U3ViamVjdHMsIFwiaW5zZXJ0XCIpLCAyKSwgZ3JvdXBlZEluc2VydFN1YmplY3RzID0gX2FbMF0sIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5cyA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMSA9IGZ1bmN0aW9uIChncm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViamVjdHMsIGJ1bGtJbnNlcnRNYXBzLCBidWxrSW5zZXJ0U3ViamVjdHMsIHNpbmdsZUluc2VydFN1YmplY3RzLCBtYW5hZ2VyLCBpbnNlcnRSZXN1bHRfMSwgaW5zZXJ0UmVzdWx0XzIsIF9sb29wXzIsIHNpbmdsZUluc2VydFN1YmplY3RzXzEsIHNpbmdsZUluc2VydFN1YmplY3RzXzFfMSwgc3ViamVjdCwgZV8yXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMiwgX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBncm91cGVkSW5zZXJ0U3ViamVjdHNbZ3JvdXBOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0TWFwcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bGtJbnNlcnRTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUluc2VydFN1YmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfMS5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4uZGF0YWJhc2VOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uICYmIHN1YmplY3QuZW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5lbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jcmVhdGVWYWx1ZVNldEFuZFBvcENoYW5nZU1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0TWFwcy5wdXNoKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNfMS5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBpbnNlcnQgaW4gYnVsayBpbiBmb2xsb3dpbmcgY2FzZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIHdoZW4gdGhlcmUgaXMgbm8gdmFsdWVzIGluIGluc2VydCAob25seSBkZWZhdWx0cyBhcmUgaW5zZXJ0ZWQpLCBzaW5jZSB3ZSBjYW5ub3QgdXNlIERFRkFVTFQgVkFMVUVTIGV4cHJlc3Npb24gZm9yIG11bHRpcGxlIGluc2VydGVkIHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gd2hlbiBlbnRpdHkgaXMgYSB0cmVlIHRhYmxlLCBzaW5jZSB0cmVlIHRhYmxlcyByZXF1aXJlIGV4dHJhIG9wZXJhdGlvbiBwZXIgZWFjaCBpbnNlcnRlZCByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gd2hlbiBvcmFjbGUgaXMgdXNlZCwgc2luY2Ugb3JhY2xlJ3MgYnVsayBpbnNlcnRpb24gaXMgdmVyeSBiYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmNoYW5nZU1hcHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydE1hcHMucHVzaChzdWJqZWN0LmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpc18xLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzXzEucXVlcnlSdW5uZXIubWFuYWdlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtYW5hZ2VyLmluc2VydChzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQsIGJ1bGtJbnNlcnRNYXBzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0XzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pZGVudGlmaWVyID0gaW5zZXJ0UmVzdWx0XzEuaWRlbnRpZmllcnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IGluc2VydFJlc3VsdF8xLmdlbmVyYXRlZE1hcHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPSBidWxrSW5zZXJ0TWFwc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGJ1bGtJbnNlcnRNYXBzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oc3ViamVjdHNbMF0ubWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhidWxrSW5zZXJ0TWFwcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkodGhpc18xLm9wdGlvbnMgJiYgdGhpc18xLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0XzIgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVsa0luc2VydFN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuaWRlbnRpZmllciA9IGluc2VydFJlc3VsdF8yLmlkZW50aWZpZXJzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5nZW5lcmF0ZWRNYXAgPSBpbnNlcnRSZXN1bHRfMi5nZW5lcmF0ZWRNYXBzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0ID0gYnVsa0luc2VydE1hcHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzaW5nbGVJbnNlcnRTdWJqZWN0cy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzIgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9mLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPSBzdWJqZWN0LmNyZWF0ZVZhbHVlU2V0QW5kUG9wQ2hhbmdlTWFwKCk7IC8vIGltcG9ydGFudCB0byBoYXZlIGJlY2F1c2UgcXVlcnkgYnVpbGRlciBzZXRzIGluc2VydGVkIHZhbHVlcyBpbnRvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHN1YmplY3QubWV0YWRhdGEudHJlZVR5cGUgPT09IFwibmVzdGVkLXNldFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IodGhpc18xLnF1ZXJ5UnVubmVyKS5pbnNlcnQoc3ViamVjdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkodGhpc18xLm9wdGlvbnMgJiYgdGhpc18xLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGluc2VydFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5pZGVudGlmaWVyID0gaW5zZXJ0UmVzdWx0LmlkZW50aWZpZXJzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5nZW5lcmF0ZWRNYXAgPSBpbnNlcnRSZXN1bHQuZ2VuZXJhdGVkTWFwc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzdWJqZWN0Lm1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBuZXcgQ2xvc3VyZVN1YmplY3RFeGVjdXRvcih0aGlzXzEucXVlcnlSdW5uZXIpLmluc2VydChzdWJqZWN0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJtYXRlcmlhbGl6ZWQtcGF0aFwiKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBNYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yKHRoaXNfMS5xdWVyeVJ1bm5lcikuaW5zZXJ0KHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2YubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS50cnlzLnB1c2goWzUsIDEwLCAxMSwgMTJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVJbnNlcnRTdWJqZWN0c18xID0gKGVfMiA9IHZvaWQgMCwgX192YWx1ZXMoc2luZ2xlSW5zZXJ0U3ViamVjdHMpKSwgc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xID0gc2luZ2xlSW5zZXJ0U3ViamVjdHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXNpbmdsZUluc2VydFN1YmplY3RzXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0ID0gc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8yKHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUluc2VydFN1YmplY3RzXzFfMSA9IHNpbmdsZUluc2VydFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSW5zZXJ0U3ViamVjdHNfMV8xICYmICFzaW5nbGVJbnNlcnRTdWJqZWN0c18xXzEuZG9uZSAmJiAoX2QgPSBzaW5nbGVJbnNlcnRTdWJqZWN0c18xLnJldHVybikpIF9kLmNhbGwoc2luZ2xlSW5zZXJ0U3ViamVjdHNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5jb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXBhcmVkVmFsdWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZSh2YWx1ZSwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHN1YmplY3QuZ2VuZXJhdGVkTWFwLCBwcmVwYXJlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEgPSBfX3ZhbHVlcyhncm91cGVkSW5zZXJ0U3ViamVjdEtleXMpLCBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMV8xID0gZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lID0gZ3JvdXBlZEluc2VydFN1YmplY3RLZXlzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xKGdyb3VwTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEgPSBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xXzEgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEgJiYgIWdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xXzEuZG9uZSAmJiAoX2IgPSBncm91cGVkSW5zZXJ0U3ViamVjdEtleXNfMS5yZXR1cm4pKSBfYi5jYWxsKGdyb3VwZWRJbnNlcnRTdWJqZWN0S2V5c18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVVcGRhdGVPcGVyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdXBkYXRlU3ViamVjdCwgbmVzdGVkU2V0U3ViamVjdHMsIHJlbWFpbmluZ1N1YmplY3RzLCBfYSwgX2IsIHN1YmplY3QsIG5lc3RlZFNldFByb21pc2U7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdWJqZWN0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgdXBkYXRlTWFwLCBfYSwgdXBkYXRlUXVlcnlCdWlsZGVyLCB1cGRhdGVSZXN1bHQsIHVwZGF0ZUdlbmVyYXRlZE1hcF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJqZWN0LmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdWJqZWN0V2l0aG91dElkZW50aWZpZXJFcnJvcihzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHkgPSB0aGlzLmNsb25lTW9uZ29TdWJqZWN0RW50aXR5KHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJ0aWFsRW50aXR5W3N1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJ0aWFsRW50aXR5W3N1YmplY3QubWV0YWRhdGEuY3JlYXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFwID0gc3ViamVjdC5jcmVhdGVWYWx1ZVNldEFuZFBvcENoYW5nZU1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJuZXN0ZWQtc2V0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2xvc3VyZS10YWJsZVwiOiByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1hdGVyaWFsaXplZC1wYXRoXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcih0aGlzLnF1ZXJ5UnVubmVyKS51cGRhdGUoc3ViamVjdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IodGhpcy5xdWVyeVJ1bm5lcikudXBkYXRlKHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBbNCAvKnlpZWxkKi8sIG5ldyBNYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yKHRoaXMucXVlcnlSdW5uZXIpLnVwZGF0ZShzdWJqZWN0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXJ5QnVpbGRlciA9IHRoaXMucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQodXBkYXRlTWFwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlRW50aXR5KHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucmVsb2FkID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxMaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVRdWVyeUJ1aWxkZXIud2hlcmVFbnRpdHkoc3ViamVjdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIGluIHRoaXMgY2FzZSBpZGVudGlmaWVyIGlzIGp1c3QgY29uZGl0aW9ucyBvYmplY3QgdG8gdXBkYXRlIGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB1cGRhdGVRdWVyeUJ1aWxkZXIuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlbmVyYXRlZE1hcF8xID0gdXBkYXRlUmVzdWx0LmdlbmVyYXRlZE1hcHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUdlbmVyYXRlZE1hcF8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZSh1cGRhdGVHZW5lcmF0ZWRNYXBfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVwYXJlZFZhbHVlID0gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHVwZGF0ZUdlbmVyYXRlZE1hcF8xLCBwcmVwYXJlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5nZW5lcmF0ZWRNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZ2VuZXJhdGVkTWFwID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdWJqZWN0LmdlbmVyYXRlZE1hcCwgdXBkYXRlR2VuZXJhdGVkTWFwXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDExO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdWJqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKF9hID0gX192YWx1ZXModGhpcy51cGRhdGVTdWJqZWN0cyksIF9iID0gX2EubmV4dCgpOyAhX2IuZG9uZTsgX2IgPSBfYS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJuZXN0ZWQtc2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzLnB1c2goc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdWJqZWN0cy5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkU2V0UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvaywgZmFpbCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRTZXRTdWJqZWN0c18xLCBuZXN0ZWRTZXRTdWJqZWN0c18xXzEsIHN1YmplY3QsIGVycm9yXzEsIGVfNF8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMCwgNywgOCwgOV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzXzEgPSBfX3ZhbHVlcyhuZXN0ZWRTZXRTdWJqZWN0cyksIG5lc3RlZFNldFN1YmplY3RzXzFfMSA9IG5lc3RlZFNldFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFuZXN0ZWRTZXRTdWJqZWN0c18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IG5lc3RlZFNldFN1YmplY3RzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB1cGRhdGVTdWJqZWN0KHN1YmplY3QpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNldFN1YmplY3RzXzFfMSA9IG5lc3RlZFNldFN1YmplY3RzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzMgLypicmVhayovLCA5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzRfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRTZXRTdWJqZWN0c18xXzEgJiYgIW5lc3RlZFNldFN1YmplY3RzXzFfMS5kb25lICYmIChfYSA9IG5lc3RlZFNldFN1YmplY3RzXzEucmV0dXJuKSkgX2EuY2FsbChuZXN0ZWRTZXRTdWJqZWN0c18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biBhbGwgcmVtYW5pbmcgc3ViamVjdHMgaW4gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlbWFpbmluZ1N1YmplY3RzLm1hcCh1cGRhdGVTdWJqZWN0KSksIGZhbHNlKSwgW25lc3RlZFNldFByb21pc2VdLCBmYWxzZSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGFsbCByZW1hbmluZyBzdWJqZWN0cyBpbiBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogdG9kbzogd2UgbmVlZCB0byBhcHBseSB0b3BvbG9naWNhbCBzb3J0IGhlcmUgYXMgd2VsbFxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZXhlY3V0ZVJlbW92ZU9wZXJhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZ3JvdXBlZFJlbW92ZVN1YmplY3RzLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXMsIGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xLCBncm91cE5hbWUsIHN1YmplY3RzLCBkZWxldGVNYXBzLCBtYW5hZ2VyLCBfYiwgZV81XzE7XG4gICAgICAgICAgICB2YXIgZV81LCBfYztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX19yZWFkKHRoaXMuZ3JvdXBCdWxrU3ViamVjdHModGhpcy5yZW1vdmVTdWJqZWN0cywgXCJkZWxldGVcIiksIDIpLCBncm91cGVkUmVtb3ZlU3ViamVjdHMgPSBfYVswXSwgZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgMTMsIDE0LCAxNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEgPSBfX3ZhbHVlcyhncm91cGVkUmVtb3ZlU3ViamVjdEtleXMpLCBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xID0gZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTmFtZSA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0cyA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0c1tncm91cE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTWFwcyA9IHN1YmplY3RzLm1hcChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QuaWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBtYW5hZ2VyLmRlbGV0ZShzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQsIGRlbGV0ZU1hcHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHN1YmplY3RzWzBdLm1ldGFkYXRhLnRyZWVUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJuZXN0ZWQtc2V0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjbG9zdXJlLXRhYmxlXCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcih0aGlzLnF1ZXJ5UnVubmVyKS5yZW1vdmUoc3ViamVjdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IENsb3N1cmVTdWJqZWN0RXhlY3V0b3IodGhpcy5xdWVyeVJ1bm5lcikucmVtb3ZlKHN1YmplY3RzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IFxuICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGV4ZWN1dGUgb3VyIGRlbGV0aW9uIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lmeSBlbnRpdGllcyBhbmQgc2V0IHVwZGF0ZSBlbnRpdHkgdG8gdHJ1ZSBzaW5jZSB0aGUgb25seSB0aGluZyBxdWVyeSBidWlsZGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgZG8gZm9yIHVzZSBpcyBhIHByaW1hcnkga2V5cyBkZWxldGlvbiB3aGljaCBpcyBoYW5kbGVkIGJ5IHVzIGxhdGVyIG9uY2UgcGVyc2lzdGVuY2UgaXMgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbywgd2UgZGlzYWJsZSBsaXN0ZW5lcnMgYmVjYXVzZSB3ZSBjYWxsIHRoZW0gb24gb3VyIG93biBpbiBwZXJzaXN0ZW5jZSBsYXllclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0c1swXS5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGRlbGV0ZU1hcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxMaXN0ZW5lcnMoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGV4ZWN1dGUgb3VyIGRlbGV0aW9uIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgZW50aXRpZXMgYW5kIHNldCB1cGRhdGUgZW50aXR5IHRvIHRydWUgc2luY2UgdGhlIG9ubHkgdGhpbmcgcXVlcnkgYnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBkbyBmb3IgdXNlIGlzIGEgcHJpbWFyeSBrZXlzIGRlbGV0aW9uIHdoaWNoIGlzIGhhbmRsZWQgYnkgdXMgbGF0ZXIgb25jZSBwZXJzaXN0ZW5jZSBpcyBmaW5pc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbywgd2UgZGlzYWJsZSBsaXN0ZW5lcnMgYmVjYXVzZSB3ZSBjYWxsIHRoZW0gb24gb3VyIG93biBpbiBwZXJzaXN0ZW5jZSBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xXzEgPSBncm91cGVkUmVtb3ZlU3ViamVjdEtleXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzFfMSAmJiAhZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzFfMS5kb25lICYmIChfYyA9IGdyb3VwZWRSZW1vdmVTdWJqZWN0S2V5c18xLnJldHVybikpIF9jLmNhbGwoZ3JvdXBlZFJlbW92ZVN1YmplY3RLZXlzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuY2xvbmVNb25nb1N1YmplY3RFbnRpdHkgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICB2YXIgZV82LCBfYTtcbiAgICAgICAgdmFyIHRhcmdldCA9IHt9O1xuICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHRhcmdldCwgY29sdW1uLmdldEVudGl0eVZhbHVlTWFwKHN1YmplY3QuZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNl8xKSB7IGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzYpIHRocm93IGVfNi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTb2Z0LXJlbW92ZXMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVTb2Z0UmVtb3ZlT3BlcmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubWFwKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVJlc3VsdCwgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsRW50aXR5ID0gdGhpcy5jbG9uZU1vbmdvU3ViamVjdEVudGl0eShzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5tZXRhZGF0YS5jcmVhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyID0gdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvZnREZWxldGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVudGl0eSh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlbG9hZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZUVudGl0eShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gaW4gdGhpcyBjYXNlIGlkZW50aWZpZXIgaXMganVzdCBjb25kaXRpb25zIG9iamVjdCB0byB1cGRhdGUgYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlcGFyZWRWYWx1ZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCwgcHJlcGFyZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnMgYWxsIGdpdmVuIHN1YmplY3RzIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmV4ZWN1dGVSZWNvdmVyT3BlcmF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwodGhpcy5yZWNvdmVyU3ViamVjdHMubWFwKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVJlc3VsdCwgcGFydGlhbEVudGl0eSwgbWFuYWdlciwgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ViamVjdFdpdGhvdXRJZGVudGlmaWVyRXJyb3Ioc3ViamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeVJ1bm5lciBpbnN0YW5jZW9mIE1vbmdvUXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsRW50aXR5ID0gdGhpcy5jbG9uZU1vbmdvU3ViamVjdEVudGl0eShzdWJqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4gJiYgc3ViamVjdC5tZXRhZGF0YS5jcmVhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmNyZWF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QubWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiBzdWJqZWN0Lm1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxFbnRpdHlbc3ViamVjdC5tZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uICYmIHN1YmplY3QubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbEVudGl0eVtzdWJqZWN0Lm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4ucHJvcGVydHlOYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbWFuYWdlci51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQsIHN1YmplY3QuaWRlbnRpZmllciwgcGFydGlhbEVudGl0eSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyID0gdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3RvcmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVudGl0eSh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlbG9hZCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5lbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZUVudGl0eShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gaW4gdGhpcyBjYXNlIGlkZW50aWZpZXIgaXMganVzdCBjb25kaXRpb25zIG9iamVjdCB0byB1cGRhdGUgYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZShzdWJqZWN0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBzb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdlbmVyYXRlZE1hcCA9IHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlcGFyZWRWYWx1ZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmdlbmVyYXRlZE1hcCwgcHJlcGFyZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhbGwgc3BlY2lhbCBjb2x1bW5zIG9mIHRoZSBzYXZpbmcgZW50aXRpZXMgKGNyZWF0ZSBkYXRlLCB1cGRhdGUgZGF0ZSwgdmVyc2lvbiwgZXRjLikuXG4gICAgICogQWxzbyB1cGRhdGVzIG51bGxhYmxlIGNvbHVtbnMgYW5kIGNvbHVtbnMgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5QZXJzaXN0ZWRFbnRpdGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gdXBkYXRlIGluc2VydGVkIGVudGl0eSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0aGlzLmluc2VydFN1YmplY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3BlY2lhbENvbHVtbnNJbkluc2VydGVkQW5kVXBkYXRlZEVudGl0aWVzKHRoaXMuaW5zZXJ0U3ViamVjdHMpO1xuICAgICAgICAvLyB1cGRhdGUgdXBkYXRlZCBlbnRpdHkgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5JbnNlcnRlZEFuZFVwZGF0ZWRFbnRpdGllcyh0aGlzLnVwZGF0ZVN1YmplY3RzKTtcbiAgICAgICAgLy8gdXBkYXRlIHNvZnQtcmVtb3ZlZCBlbnRpdHkgcHJvcGVydGllc1xuICAgICAgICBpZiAodGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsQ29sdW1uc0luSW5zZXJ0ZWRBbmRVcGRhdGVkRW50aXRpZXModGhpcy5zb2Z0UmVtb3ZlU3ViamVjdHMpO1xuICAgICAgICAvLyB1cGRhdGUgcmVjb3ZlcmVkIGVudGl0eSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0aGlzLnJlY292ZXJTdWJqZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNwZWNpYWxDb2x1bW5zSW5JbnNlcnRlZEFuZFVwZGF0ZWRFbnRpdGllcyh0aGlzLnJlY292ZXJTdWJqZWN0cyk7XG4gICAgICAgIC8vIHJlbW92ZSBpZHMgZnJvbSB0aGUgZW50aXRpZXMgdGhhdCB3ZXJlIHJlbW92ZWRcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlU3ViamVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW4uc2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHksIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlciBwb3N0LXBlcnNpc3QgdXBkYXRpb25zXG4gICAgICAgIHRoaXMuYWxsU3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgaWYgKCFzdWJqZWN0LmVudGl0eSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLnJlbGF0aW9uSWRzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbklkLnNldFZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW9uZ28gX2lkIHJlbW92ZVxuICAgICAgICAgICAgaWYgKF90aGlzLnF1ZXJ5UnVubmVyIGluc3RhbmNlb2YgTW9uZ29RdWVyeVJ1bm5lcikge1xuICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4uZGF0YWJhc2VOYW1lXG4gICAgICAgICAgICAgICAgICAgICYmIHN1YmplY3QubWV0YWRhdGEub2JqZWN0SWRDb2x1bW4uZGF0YWJhc2VOYW1lICE9PSBzdWJqZWN0Lm1ldGFkYXRhLm9iamVjdElkQ29sdW1uLnByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc3ViamVjdC5lbnRpdHlbc3ViamVjdC5tZXRhZGF0YS5vYmplY3RJZENvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGFsbCBzcGVjaWFsIGNvbHVtbnMgb2YgdGhlIHNhdmluZyBlbnRpdGllcyAoY3JlYXRlIGRhdGUsIHVwZGF0ZSBkYXRlLCB2ZXJzaW9uLCBldGMuKS5cbiAgICAgKiBBbHNvIHVwZGF0ZXMgbnVsbGFibGUgY29sdW1ucyBhbmQgY29sdW1ucyB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqL1xuICAgIFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUudXBkYXRlU3BlY2lhbENvbHVtbnNJbkluc2VydGVkQW5kVXBkYXRlZEVudGl0aWVzID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gc2V0IHZhbHVlcyB0byBcIm51bGxcIiBmb3IgbnVsbGFibGUgY29sdW1ucyB0aGF0IGRpZCBub3QgaGF2ZSB2YWx1ZXNcbiAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0YWJsZSBpbmhlcml0YW5jZSBpcyB1c2VkIG1ha2Ugc3VyZSB0aGlzIGNvbHVtbiBpcyBub3QgY2hpbGQncyBjb2x1bW5cbiAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC5tZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5sZW5ndGggPiAwICYmIHN1YmplY3QubWV0YWRhdGEuY2hpbGRFbnRpdHlNZXRhZGF0YXMubWFwKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0OyB9KS5pbmRleE9mKGNvbHVtbi50YXJnZXQpICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIGVudGl0aWVzIGRvZXMgbm90IGhhdmUgdmlydHVhbCBjb2x1bW5zXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5pc1ZpcnR1YWwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbnVsbGFibGUgY29sdW1uc1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNOdWxsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uVmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSByZWxhdGlvbmFsIGNvbHVtbnNcbiAgICAgICAgICAgICAgICBpZiAoc3ViamVjdC51cGRhdGVkUmVsYXRpb25NYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdC51cGRhdGVkUmVsYXRpb25NYXBzLmZvckVhY2goZnVuY3Rpb24gKHVwZGF0ZWRSZWxhdGlvbk1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFJlbGF0aW9uTWFwLnJlbGF0aW9uLmpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5LCB1cGRhdGVkUmVsYXRpb25NYXAudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh1cGRhdGVkUmVsYXRpb25NYXAudmFsdWUpIDogdXBkYXRlZFJlbGF0aW9uTWFwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG1lcmdlIGludG8gZW50aXR5IGFsbCBnZW5lcmF0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IGEgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmdlbmVyYXRlZE1hcClcbiAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKHN1YmplY3QubWV0YWRhdGEudGFyZ2V0LCBzdWJqZWN0LmVudGl0eSwgc3ViamVjdC5nZW5lcmF0ZWRNYXApO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdyb3VwcyBzdWJqZWN0cyBieSBtZXRhZGF0YSBuYW1lcyAoYnkgdGFibGVzKSB0byBtYWtlIGJ1bGsgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIHBvc3NpYmxlLlxuICAgICAqIEhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMgd2l0aCBidWxrIGluc2VydGlvbnMgb2YgZGF0YSBpbnRvIHRhYmxlcyB3aXRoIGdlbmVyYXRlZCAoaW5jcmVtZW50KSBjb2x1bW5zXG4gICAgICogaW4gc29tZSBkcml2ZXJzLiBTb21lIGRyaXZlcnMgbGlrZSBteXNxbCBhbmQgc3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgcmV0dXJuaW5nIG11bHRpcGxlIGdlbmVyYXRlZCBjb2x1bW5zXG4gICAgICogYWZ0ZXIgaW5zZXJ0aW9uIGFuZCBjYW4gb25seSByZXR1cm4gYSBzaW5nbGUgZ2VuZXJhdGVkIGNvbHVtbiB2YWx1ZSwgdGhhdCdzIHdoeSBpdHMgbm90IHBvc3NpYmxlIHRvIGRvIGJ1bGsgaW5zZXJ0aW9uLFxuICAgICAqIGJlY2F1c2UgaXQgYnJlYWtzIGluc2VydGlvbiByZXN1bHQncyBnZW5lcmF0ZWRNYXAgYW5kIGxlYWRzIHRvIHByb2JsZW1zIHdoZW4gdGhpcyBzdWJqZWN0IGlzIHVzZWQgaW4gb3RoZXIgc3ViamVjdHMgc2F2ZXMuXG4gICAgICogVGhhdCdzIHdoeSB3ZSBvbmx5IHN1cHBvcnQgYnVsa2luZyBpbiBqdW5jdGlvbiB0YWJsZXMgZm9yIHRob3NlIGRyaXZlcnMuXG4gICAgICpcbiAgICAgKiBPdGhlciBkcml2ZXJzIGxpa2UgcG9zdGdyZXMgYW5kIHNxbCBzZXJ2ZXIgc3VwcG9ydCBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IHdoaWNoIGFsbG93cyB0byByZXR1cm4gZ2VuZXJhdGVkXG4gICAgICogaWQgZm9yIGVhY2ggaW5zZXJ0ZWQgcm93LCB0aGF0J3Mgd2h5IGJ1bGsgaW5zZXJ0aW9uIGlzIG5vdCBsaW1pdGVkIHRvIGp1bmN0aW9uIHRhYmxlcyBpbiB0aGVyZS5cbiAgICAgKi9cbiAgICBTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdyb3VwQnVsa1N1YmplY3RzID0gZnVuY3Rpb24gKHN1YmplY3RzLCB0eXBlKSB7XG4gICAgICAgIHZhciBncm91cCA9IHt9O1xuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICB2YXIgZ3JvdXBpbmdBbGxvd2VkID0gdHlwZSA9PT0gXCJkZWxldGVcIiB8fCB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCk7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QsIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBpbmdBbGxvd2VkIHx8IHN1YmplY3QubWV0YWRhdGEuaXNKdW5jdGlvbiA/IHN1YmplY3QubWV0YWRhdGEubmFtZSA6IHN1YmplY3QubWV0YWRhdGEubmFtZSArIFwiX1wiICsgaW5kZXg7XG4gICAgICAgICAgICBpZiAoIWdyb3VwW2tleV0pIHtcbiAgICAgICAgICAgICAgICBncm91cFtrZXldID0gW3N1YmplY3RdO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBba2V5XS5wdXNoKHN1YmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtncm91cCwga2V5c107XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdEV4ZWN1dG9yO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0RXhlY3V0b3IuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBPcmRlcnMgaW5zZXJ0IG9yIHJlbW92ZSBzdWJqZWN0cyBpbiBwcm9wZXIgb3JkZXIgKHVzaW5nIHRvcG9sb2dpY2FsIHNvcnRpbmcpXG4gKiB0byBtYWtlIHN1cmUgaW5zZXJ0IG9yIHJlbW92ZSBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBhIHByb3BlciBvcmRlci5cbiAqL1xudmFyIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU3ViamVjdFRvcG9saWdpY2FsU29ydGVyKHN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdHMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViamVjdHMpLCBmYWxzZSk7IC8vIGNvcHkgc3ViamVjdHMgdG8gcHJldmVudCBjaGFuZ2luZyBvZiBzZW50IGFycmF5XG4gICAgICAgIHRoaXMubWV0YWRhdGFzID0gdGhpcy5nZXRVbmlxdWVNZXRhZGF0YXModGhpcy5zdWJqZWN0cyk7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTb3J0cyAob3JkZXJzKSBzdWJqZWN0cyBpbiB0aGVpciB0b3BvbG9naWNhbCBvcmRlci5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtZXRhZGF0YXMgaXQgcHJvYmFibHkgbWVhbiB0aGVyZSBpcyBubyBzdWJqZWN0cy4uLiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmVcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdWJqZWN0cztcbiAgICAgICAgdmFyIHNvcnRlZFN1YmplY3RzID0gW107XG4gICAgICAgIC8vIGZpcnN0IGlmIHdlIHNvcnQgZm9yIGRlbGV0aW9uIGFsbCBqdW5jdGlvbiBzdWJqZWN0c1xuICAgICAgICAvLyBqdW5jdGlvbiBzdWJqZWN0cyBhcmUgc3ViamVjdHMgd2l0aG91dCBlbnRpdHkgYW5kIGRhdGFiYXNlIGVudGl0eSBzZXRcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJkZWxldGVcIikge1xuICAgICAgICAgICAgdmFyIGp1bmN0aW9uU3ViamVjdHMgPSB0aGlzLnN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gIXN1YmplY3QuZW50aXR5ICYmICFzdWJqZWN0LmRhdGFiYXNlRW50aXR5OyB9KTtcbiAgICAgICAgICAgIHNvcnRlZFN1YmplY3RzLnB1c2guYXBwbHkoc29ydGVkU3ViamVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChqdW5jdGlvblN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxyZWFkeVNvcnRlZChqdW5jdGlvblN1YmplY3RzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBuZXh0IHdlIGFsd2F5cyBpbnNlcnQgZW50aXRpZXMgd2l0aCBub24tbnVsbGFibGUgcmVsYXRpb25zLCBzb3J0IHRoZW0gZmlyc3RcbiAgICAgICAgdmFyIG5vbk51bGxhYmxlRGVwZW5kZW5jaWVzID0gdGhpcy5nZXROb25OdWxsYWJsZURlcGVuZGVuY2llcygpO1xuICAgICAgICB2YXIgc29ydGVkTm9uTnVsbGFibGVFbnRpdHlUYXJnZXRzID0gdGhpcy50b3Bvc29ydChub25OdWxsYWJsZURlcGVuZGVuY2llcyk7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiaW5zZXJ0XCIpXG4gICAgICAgICAgICBzb3J0ZWROb25OdWxsYWJsZUVudGl0eVRhcmdldHMgPSBzb3J0ZWROb25OdWxsYWJsZUVudGl0eVRhcmdldHMucmV2ZXJzZSgpO1xuICAgICAgICAvLyBzbyB3ZSBoYXZlIGEgc29ydGVkIGVudGl0eSB0YXJnZXRzXG4gICAgICAgIC8vIGdvIHRob3VnaHQgZWFjaCBvZiB0aGVtIGFuZCBmaW5kIGFsbCBzdWJqZWN0cyB3aXRoIHNvcnRlZCBlbnRpdHkgdGFyZ2V0XG4gICAgICAgIC8vIGFkZCB0aG9zZSBzb3J0ZWQgdGFyZ2V0cyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBvcmlnaW5hbCBhcnJheSBvZiB0YXJnZXRzXG4gICAgICAgIHNvcnRlZE5vbk51bGxhYmxlRW50aXR5VGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChzb3J0ZWRFbnRpdHlUYXJnZXQpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHlUYXJnZXRTdWJqZWN0cyA9IF90aGlzLnN1YmplY3RzLmZpbHRlcihmdW5jdGlvbiAoc3ViamVjdCkgeyByZXR1cm4gc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lID09PSBzb3J0ZWRFbnRpdHlUYXJnZXQ7IH0pO1xuICAgICAgICAgICAgc29ydGVkU3ViamVjdHMucHVzaC5hcHBseShzb3J0ZWRTdWJqZWN0cywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVudGl0eVRhcmdldFN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIF90aGlzLnJlbW92ZUFscmVhZHlTb3J0ZWQoZW50aXR5VGFyZ2V0U3ViamVjdHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gbmV4dCBzb3J0IGFsbCBvdGhlciBlbnRpdGllc1xuICAgICAgICAvLyBzYW1lIHByb2Nlc3MgYXMgaW4gYWJvdmUgYnV0IHdpdGggb3RoZXIgZW50aXRpZXNcbiAgICAgICAgdmFyIG90aGVyRGVwZW5kZW5jaWVzID0gdGhpcy5nZXREZXBlbmRlbmNpZXMoKTtcbiAgICAgICAgdmFyIHNvcnRlZE90aGVyRW50aXR5VGFyZ2V0cyA9IHRoaXMudG9wb3NvcnQob3RoZXJEZXBlbmRlbmNpZXMpO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBcImluc2VydFwiKVxuICAgICAgICAgICAgc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzID0gc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzLnJldmVyc2UoKTtcbiAgICAgICAgc29ydGVkT3RoZXJFbnRpdHlUYXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHNvcnRlZEVudGl0eVRhcmdldCkge1xuICAgICAgICAgICAgdmFyIGVudGl0eVRhcmdldFN1YmplY3RzID0gX3RoaXMuc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7IHJldHVybiBzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldE5hbWUgPT09IHNvcnRlZEVudGl0eVRhcmdldDsgfSk7XG4gICAgICAgICAgICBzb3J0ZWRTdWJqZWN0cy5wdXNoLmFwcGx5KHNvcnRlZFN1YmplY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZW50aXR5VGFyZ2V0U3ViamVjdHMpLCBmYWxzZSkpO1xuICAgICAgICAgICAgX3RoaXMucmVtb3ZlQWxyZWFkeVNvcnRlZChlbnRpdHlUYXJnZXRTdWJqZWN0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIHNvbWV0aGluZyBsZWZ0IGluIHRoZSBzdWJqZWN0cyBhZGQgdGhlbSBhcyB3ZWxsXG4gICAgICAgIHNvcnRlZFN1YmplY3RzLnB1c2guYXBwbHkoc29ydGVkU3ViamVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLnN1YmplY3RzKSwgZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZFN1YmplY3RzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxyZWFkeSBzb3J0ZWQgc3ViamVjdHMgZnJvbSB0aGlzLnN1YmplY3RzIGxpc3Qgb2Ygc3ViamVjdHMuXG4gICAgICovXG4gICAgU3ViamVjdFRvcG9saWdpY2FsU29ydGVyLnByb3RvdHlwZS5yZW1vdmVBbHJlYWR5U29ydGVkID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnNwbGljZShfdGhpcy5zdWJqZWN0cy5pbmRleE9mKHN1YmplY3QpLCAxKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBhbGwgdW5pcXVlIG1ldGFkYXRhcyBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0cy5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLmdldFVuaXF1ZU1ldGFkYXRhcyA9IGZ1bmN0aW9uIChzdWJqZWN0cykge1xuICAgICAgICB2YXIgbWV0YWRhdGFzID0gW107XG4gICAgICAgIHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YXMuaW5kZXhPZihzdWJqZWN0Lm1ldGFkYXRhKSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgbWV0YWRhdGFzLnB1c2goc3ViamVjdC5tZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWV0YWRhdGFzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBkZXBlbmRlbmN5IHRyZWUgZm9yIGFsbCBlbnRpdHkgbWV0YWRhdGFzIHdpdGggbm9uLW51bGxhYmxlIHJlbGF0aW9ucy5cbiAgICAgKiBXZSBuZWVkIHRvIGV4ZWN1dGUgaW5zZXJ0aW9ucyBmaXJzdCBmb3IgZW50aXRpZXMgd2hpY2ggbm9uLW51bGxhYmxlIHJlbGF0aW9ucy5cbiAgICAgKi9cbiAgICBTdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIucHJvdG90eXBlLmdldE5vbk51bGxhYmxlRGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YXMucmVkdWNlKGZ1bmN0aW9uIChkZXBlbmRlbmNpZXMsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNOdWxsYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFttZXRhZGF0YS50YXJnZXROYW1lLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGRlcGVuZGVuY3kgdHJlZSBmb3IgYWxsIGVudGl0eSBtZXRhZGF0YXMgd2l0aCBub24tbnVsbGFibGUgcmVsYXRpb25zLlxuICAgICAqIFdlIG5lZWQgdG8gZXhlY3V0ZSBpbnNlcnRpb25zIGZpcnN0IGZvciBlbnRpdGllcyB3aGljaCBub24tbnVsbGFibGUgcmVsYXRpb25zLlxuICAgICAqL1xuICAgIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlci5wcm90b3R5cGUuZ2V0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YXMucmVkdWNlKGZ1bmN0aW9uIChkZXBlbmRlbmNpZXMsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNXaXRoSm9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBpZiByZWxhdGlvbiBpcyBzZWxmLXJlZmVyZW5jZWQgd2Ugc2tpcCBpdFxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEgPT09IG1ldGFkYXRhKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goW21ldGFkYXRhLnRhcmdldE5hbWUsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXROYW1lXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXM7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNvcnRzIGdpdmVuIGdyYXBoIHVzaW5nIHRvcG9sb2dpY2FsIHNvcnRpbmcgYWxnb3JpdGhtLlxuICAgICAqXG4gICAgICogQWxnb3JpdGhtIGlzIGtpbmRseSB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjZWxrbGVoci90b3Bvc29ydCByZXBvc2l0b3J5LlxuICAgICAqL1xuICAgIFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlci5wcm90b3R5cGUudG9wb3NvcnQgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgICAgICAgZnVuY3Rpb24gdW5pcXVlTm9kZXMoYXJyKSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpXzEgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpXzEgPCBsZW47IGlfMSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVkZ2UgPSBhcnJbaV8xXTtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmluZGV4T2YoZWRnZVswXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlZGdlWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmluZGV4T2YoZWRnZVsxXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlZGdlWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVzID0gdW5pcXVlTm9kZXMoZWRnZXMpO1xuICAgICAgICB2YXIgY3Vyc29yID0gbm9kZXMubGVuZ3RoLCBzb3J0ZWQgPSBuZXcgQXJyYXkoY3Vyc29yKSwgdmlzaXRlZCA9IHt9LCBpID0gY3Vyc29yO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWRbaV0pXG4gICAgICAgICAgICAgICAgdmlzaXQobm9kZXNbaV0sIGksIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB2aXNpdChub2RlLCBpLCBwcmVkZWNlc3NvcnMpIHtcbiAgICAgICAgICAgIGlmIChwcmVkZWNlc3NvcnMuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkN5Y2xpYyBkZXBlbmRlbmN5OiBcIiArIEpTT04uc3RyaW5naWZ5KG5vZGUpKTsgLy8gdG9kbzogYmV0dGVyIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIX5ub2Rlcy5pbmRleE9mKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkZvdW5kIHVua25vd24gbm9kZS4gTWFrZSBzdXJlIHRvIHByb3ZpZGVkIGFsbCBpbnZvbHZlZCBub2Rlcy4gVW5rbm93biBub2RlOiBcIiArIEpTT04uc3RyaW5naWZ5KG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aXNpdGVkW2ldKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZpc2l0ZWRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gb3V0Z29pbmcgZWRnZXNcbiAgICAgICAgICAgIHZhciBvdXRnb2luZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlWzBdID09PSBub2RlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaSA9IG91dGdvaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBwcmVkcyA9IHByZWRlY2Vzc29ycy5jb25jYXQobm9kZSk7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBvdXRnb2luZ1stLWldWzFdO1xuICAgICAgICAgICAgICAgICAgICB2aXNpdChjaGlsZCwgbm9kZXMuaW5kZXhPZihjaGlsZCksIHByZWRzKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnRlZFstLWN1cnNvcl0gPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdFRvcG9saWdpY2FsU29ydGVyO1xufSgpKTtcbmV4cG9ydCB7IFN1YmplY3RUb3BvbGlnaWNhbFNvcnRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0VG9wb2xpZ2ljYWxTb3J0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuLyoqXG4gKiBGaW5kcyBhbGwgY2FzY2FkZSBvcGVyYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0IGFuZCBjYXNjYWRlIG9wZXJhdGlvbnMgb2YgdGhlIGZvdW5kIGNhc2NhZGVkIHN1YmplY3RzLFxuICogZS5nLiBidWlsZHMgYSBjYXNjYWRlIHRyZWUgYW5kIGNyZWF0ZXMgYSBzdWJqZWN0cyBmb3IgdGhlbS5cbiAqL1xudmFyIENhc2NhZGVzU3ViamVjdEJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBDYXNjYWRlc1N1YmplY3RCdWlsZGVyKGFsbFN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuYWxsU3ViamVjdHMgPSBhbGxTdWJqZWN0cztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYSBjYXNjYWRlIHN1YmplY3RzIHRyZWUgYW5kIHB1c2hlcyB0aGVtIGluIGludG8gdGhlIGdpdmVuIGFycmF5IG9mIHN1YmplY3RzLlxuICAgICAqL1xuICAgIENhc2NhZGVzU3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKHN1YmplY3QsIG9wZXJhdGlvblR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3ViamVjdC5tZXRhZGF0YVxuICAgICAgICAgICAgLmV4dHJhY3RSZWxhdGlvblZhbHVlc0Zyb21FbnRpdHkoc3ViamVjdC5lbnRpdHksIHN1YmplY3QubWV0YWRhdGEucmVsYXRpb25zKSAvLyB0b2RvOiB3ZSBjYW4gY3JlYXRlIEVudGl0eU1ldGFkYXRhLmNhc2NhZGVSZWxhdGlvbnNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAzKSwgcmVsYXRpb24gPSBfYlswXSwgcmVsYXRpb25FbnRpdHkgPSBfYlsxXSwgcmVsYXRpb25FbnRpdHlNZXRhZGF0YSA9IF9iWzJdO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCBvbmx5IGRlZmluZWQgdmFsdWVzIGFuZCBpbnNlcnQsIHVwZGF0ZSwgc29mdC1yZW1vdmUgb3IgcmVjb3ZlciBjYXNjYWRlcyBvZiB0aGUgcmVsYXRpb24gc2hvdWxkIGJlIHNldFxuICAgICAgICAgICAgaWYgKHJlbGF0aW9uRW50aXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICByZWxhdGlvbkVudGl0eSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICghcmVsYXRpb24uaXNDYXNjYWRlSW5zZXJ0ICYmICFyZWxhdGlvbi5pc0Nhc2NhZGVVcGRhdGUgJiYgIXJlbGF0aW9uLmlzQ2FzY2FkZVNvZnRSZW1vdmUgJiYgIXJlbGF0aW9uLmlzQ2FzY2FkZVJlY292ZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIHJlbGF0aW9uIGVudGl0eSBpcyBqdXN0IGEgcmVsYXRpb24gaWQgc2V0IChmb3IgZXhhbXBsZSBwb3N0LnRhZyA9IDEpXG4gICAgICAgICAgICAvLyB0aGVuIHdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGNoZWNrIGNhc2NhZGVzIHNpbmNlIHRoZXJlIGlzIG5vIG9iamVjdCB0byBpbnNlcnQgb3IgdXBkYXRlXG4gICAgICAgICAgICBpZiAoIShyZWxhdGlvbkVudGl0eSBpbnN0YW5jZW9mIE9iamVjdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXMgdGhpcyBlbnRpdHkgaW4gbGlzdCBvZiBvcGVyYXRlZCBzdWJqZWN0cyB0aGVuIHNraXAgaXQgdG8gYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICB2YXIgYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0ID0gX3RoaXMuZmluZEJ5UGVyc2lzdEVudGl0eUxpa2UocmVsYXRpb25FbnRpdHlNZXRhZGF0YS50YXJnZXQsIHJlbGF0aW9uRW50aXR5KTtcbiAgICAgICAgICAgIGlmIChhbHJlYWR5RXhpc3RSZWxhdGlvbkVudGl0eVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlSW5zZXJ0ZWQgPT09IGZhbHNlKSAvLyBpZiBpdHMgbm90IG1hcmtlZCBmb3IgaW5zZXJ0aW9uIHlldFxuICAgICAgICAgICAgICAgICAgICBhbHJlYWR5RXhpc3RSZWxhdGlvbkVudGl0eVN1YmplY3QuY2FuQmVJbnNlcnRlZCA9IHJlbGF0aW9uLmlzQ2FzY2FkZUluc2VydCA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInNhdmVcIjtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlVXBkYXRlZCA9PT0gZmFsc2UpIC8vIGlmIGl0cyBub3QgbWFya2VkIGZvciB1cGRhdGUgeWV0XG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVVwZGF0ZWQgPSByZWxhdGlvbi5pc0Nhc2NhZGVVcGRhdGUgPT09IHRydWUgJiYgb3BlcmF0aW9uVHlwZSA9PT0gXCJzYXZlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVNvZnRSZW1vdmVkID09PSBmYWxzZSkgLy8gaWYgaXRzIG5vdCBtYXJrZWQgZm9yIHJlbW92YWwgeWV0XG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVNvZnRSZW1vdmVkID0gcmVsYXRpb24uaXNDYXNjYWRlU29mdFJlbW92ZSA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInNvZnQtcmVtb3ZlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdFJlbGF0aW9uRW50aXR5U3ViamVjdC5jYW5CZVJlY292ZXJlZCA9PT0gZmFsc2UpIC8vIGlmIGl0cyBub3QgbWFya2VkIGZvciByZWNvdmVyeSB5ZXRcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUV4aXN0UmVsYXRpb25FbnRpdHlTdWJqZWN0LmNhbkJlUmVjb3ZlcmVkID0gcmVsYXRpb24uaXNDYXNjYWRlUmVjb3ZlciA9PT0gdHJ1ZSAmJiBvcGVyYXRpb25UeXBlID09PSBcInJlY292ZXJcIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYXJrIHN1YmplY3Qgd2l0aCB3aGF0IHdlIGNhbiBkbyB3aXRoIGl0XG4gICAgICAgICAgICAvLyBhbmQgYWRkIHRvIHRoZSBhcnJheSBvZiBzdWJqZWN0cyB0byBsb2FkIG9ubHkgaWYgdGhlcmUgaXMgbm8gc2FtZSBlbnRpdHkgdGhlcmUgYWxyZWFkeVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uRW50aXR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25FbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJlbnRTdWJqZWN0OiBzdWJqZWN0LFxuICAgICAgICAgICAgICAgIGVudGl0eTogcmVsYXRpb25FbnRpdHksXG4gICAgICAgICAgICAgICAgY2FuQmVJbnNlcnRlZDogcmVsYXRpb24uaXNDYXNjYWRlSW5zZXJ0ID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogcmVsYXRpb24uaXNDYXNjYWRlVXBkYXRlID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlU29mdFJlbW92ZWQ6IHJlbGF0aW9uLmlzQ2FzY2FkZVNvZnRSZW1vdmUgPT09IHRydWUgJiYgb3BlcmF0aW9uVHlwZSA9PT0gXCJzb2Z0LXJlbW92ZVwiLFxuICAgICAgICAgICAgICAgIGNhbkJlUmVjb3ZlcmVkOiByZWxhdGlvbi5pc0Nhc2NhZGVSZWNvdmVyID09PSB0cnVlICYmIG9wZXJhdGlvblR5cGUgPT09IFwicmVjb3ZlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF90aGlzLmFsbFN1YmplY3RzLnB1c2gocmVsYXRpb25FbnRpdHlTdWJqZWN0KTtcbiAgICAgICAgICAgIC8vIGdvIHJlY3Vyc2l2ZWx5IGFuZCBmaW5kIG90aGVyIGVudGl0aWVzIHdlIG5lZWQgdG8gaW5zZXJ0L3VwZGF0ZVxuICAgICAgICAgICAgX3RoaXMuYnVpbGQocmVsYXRpb25FbnRpdHlTdWJqZWN0LCBvcGVyYXRpb25UeXBlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHN1YmplY3Qgd2hlcmUgZW50aXR5IGxpa2UgZ2l2ZW4gc3ViamVjdCdzIGVudGl0eS5cbiAgICAgKiBDb21wYXJpc2lvbiBtYWRlIGJ5IGVudGl0eSBpZC5cbiAgICAgKi9cbiAgICBDYXNjYWRlc1N1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5maW5kQnlQZXJzaXN0RW50aXR5TGlrZSA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxTdWJqZWN0cy5maW5kKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIXN1YmplY3QuZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0LmVudGl0eSA9PT0gZW50aXR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3QubWV0YWRhdGEudGFyZ2V0ID09PSBlbnRpdHlUYXJnZXQgJiYgc3ViamVjdC5tZXRhZGF0YS5jb21wYXJlRW50aXRpZXMoc3ViamVjdC5lbnRpdHlXaXRoRnVsZmlsbGVkSWRzLCBlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDYXNjYWRlc1N1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IENhc2NhZGVzU3ViamVjdEJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FzY2FkZXNTdWJqZWN0QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBCdWlsZHMgb3BlcmF0aW9ucyBuZWVkcyB0byBiZSBleGVjdXRlZCBmb3IgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgZ2l2ZW4gc3ViamVjdHMuXG4gKlxuICogYnkgZXhhbXBsZTogcG9zdCBjb250YWlucyBvd25lciBtYW55LXRvLW1hbnkgcmVsYXRpb24gd2l0aCBjYXRlZ29yaWVzIGluIHRoZSBwcm9wZXJ0eSBjYWxsZWQgXCJjYXRlZ29yaWVzXCIsIGUuZy5cbiAqICAgICAgICAgICAgIEBNYW55VG9NYW55KHR5cGUgPT4gQ2F0ZWdvcnksIGNhdGVnb3J5ID0+IGNhdGVnb3J5LnBvc3RzKSBjYXRlZ29yaWVzOiBDYXRlZ29yeVtdXG4gKiAgICAgICAgICAgICBJZiB1c2VyIGFkZHMgY2F0ZWdvcmllcyBpbnRvIHRoZSBwb3N0IGFuZCBzYXZlcyBwb3N0IHdlIG5lZWQgdG8gYmluZCB0aGVtLlxuICogICAgICAgICAgICAgVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdXBkYXRpb24gb2YganVuY3Rpb24gdGFibGUuXG4gKi9cbnZhciBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5zdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBvcGVyYXRpb25zIGZvciBhbnkgY2hhbmdlcyBpbiB0aGUgbWFueS10by1tYW55IHJlbGF0aW9ucyBvZiB0aGUgc3ViamVjdHMuXG4gICAgICovXG4gICAgTWFueVRvTWFueVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICAvLyBpZiBzdWJqZWN0IGRvZXNuJ3QgaGF2ZSBlbnRpdHkgdGhlbiBubyBuZWVkIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGluc2VydGVkIG9yIHJlbW92ZWRcbiAgICAgICAgICAgIGlmICghc3ViamVjdC5lbnRpdHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgcGVyc2lzdGVuY2UgZW5hYmxlZCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIGFuZCBidWlsZCBzdWJqZWN0IG9wZXJhdGlvbnMgZm9yIHRoZW1cbiAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEubWFueVRvTWFueVJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgcmVsYXRpb25zIGZvciB3aGljaCBwZXJzaXN0ZW5jZSBpcyBkaXNhYmxlZFxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRGb3JTdWJqZWN0UmVsYXRpb24oc3ViamVjdCwgcmVsYXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIHJlbW92YWwgb2YgYWxsIG1hbnktdG8tbWFueSByZWNvcmRzIG9mIGFsbCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0LlxuICAgICAqL1xuICAgIE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGRGb3JBbGxSZW1vdmFsID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaWYgc3ViamVjdCBkb2VzIG5vdCBoYXZlIGEgZGF0YWJhc2UgZW50aXR5IHRoZW4gaXQgbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0aGVuIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgZm9yIGRlbGV0aW9uXG4gICAgICAgIGlmICghc3ViamVjdC5kYXRhYmFzZUVudGl0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgcGVyc2lzdGVuY2UgZW5hYmxlZCBtYW55LXRvLW1hbnkgcmVsYXRpb25zIGFuZCBidWlsZCBzdWJqZWN0IG9wZXJhdGlvbnMgZm9yIHRoZW1cbiAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5tYW55VG9NYW55UmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5wZXJzaXN0ZW5jZUVuYWJsZWQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGdldCBhbGwgcmVsYXRlZCBlbnRpdGllcyAoYWN0dWFsbHkgcmVsYXRlZCBlbnRpdHkgcmVsYXRpb24gaWRzKSBiaW5kIHRvIHRoaXMgc3ViamVjdCBlbnRpdHlcbiAgICAgICAgICAgIC8vIGJ5IGV4YW1wbGU6IHJldHVybnMgY2F0ZWdvcnkgaWRzIG9mIHRoZSBwb3N0IHdlIGFyZSBjdXJyZW50bHkgd29ya2luZyB3aXRoIChzdWJqZWN0LmVudGl0eSBpcyBwb3N0KVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkc0luRGF0YWJhc2UgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmRhdGFiYXNlRW50aXR5KTtcbiAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHJlbGF0ZWQgZW50aXRpZXMgYW5kIGNyZWF0ZSBhIG5ldyBqdW5jdGlvbiBzdWJqZWN0IGZvciBlYWNoIHJvdyBpbiBqdW5jdGlvbiB0YWJsZVxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRzSW5EYXRhYmFzZS5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGp1bmN0aW9uU3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgIG11c3RCZVJlbW92ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IF90aGlzLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyKHN1YmplY3QsIHJlbGF0aW9uLCByZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB1bnNoaWZ0IGJlY2F1c2Ugd2UgbmVlZCB0byBwZXJmb3JtIHRob3NlIG9wZXJhdGlvbnMgYmVmb3JlIHBvc3QgZGVsZXRpb24gaXMgcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgLy8gYnV0IHBvc3QgZGVsZXRpb24gd2FzIGFscmVhZHkgYWRkZWQgYXMgYW4gc3ViamVjdFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGVtcG9yYXJ5IHNvbHV0aW9uLCBsYXRlciB3ZSBuZWVkIHRvIGltcGxlbWVudCBwcm9wZXIgc29ydGluZyBvZiBzdWJqZWN0cyBiZWZvcmUgdGhlaXIgcmVtb3ZhbFxuICAgICAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnB1c2goanVuY3Rpb25TdWJqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcmllc1wiIGluc2lkZSBpdCBoZXJlLlxuICAgICAqL1xuICAgIE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGRGb3JTdWJqZWN0UmVsYXRpb24gPSBmdW5jdGlvbiAoc3ViamVjdCwgcmVsYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gbG9hZCBmcm9tIGRiIGFsbCByZWxhdGlvbiBpZHMgb2YgaW52ZXJzZSBlbnRpdGllcyB0aGF0IGFyZSBcImJpbmRcIiB0byB0aGUgc3ViamVjdCdzIGVudGl0eVxuICAgICAgICAvLyB0aGlzIHdheSB3ZSBnb25uYSBjaGVjayB3aGljaCByZWxhdGlvbiBpZHMgYXJlIG1pc3NpbmcgYW5kIHdoaWNoIGFyZSBuZXcgKGUuZy4gaW5zZXJ0ZWQgb3IgcmVtb3ZlZClcbiAgICAgICAgdmFyIGRhdGFiYXNlUmVsYXRlZEVudGl0eUlkcyA9IFtdO1xuICAgICAgICAvLyBpZiBzdWJqZWN0IGRvbid0IGhhdmUgZGF0YWJhc2UgZW50aXR5IGl0IG1lYW5zIGFsbCByZWxhdGVkIGVudGl0aWVzIGluIHBlcnNpc3RlZCBzdWJqZWN0IGFyZSBuZXcgYW5kIG11c3QgYmUgYmluZFxuICAgICAgICAvLyBhbmQgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgc29tZXRoaW5nIHRoYXQgaXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChzdWJqZWN0LmRhdGFiYXNlRW50aXR5KVxuICAgICAgICAgICAgZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzID0gcmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5kYXRhYmFzZUVudGl0eSk7XG4gICAgICAgIC8vIGV4dHJhY3QgZW50aXR5J3MgcmVsYXRpb24gdmFsdWVcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogY2F0ZWdvcmllcyBpbnNpZGUgb3VyIHBvc3QgKHN1YmplY3QuZW50aXR5IGlzIHBvc3QpXG4gICAgICAgIHZhciByZWxhdGVkRW50aXRpZXMgPSByZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgIGlmIChyZWxhdGVkRW50aXRpZXMgPT09IG51bGwpIC8vIGlmIHZhbHVlIHNldCB0byBudWxsIGl0cyBlcXVhbCBpZiB3ZSBzZXQgaXQgdG8gZW1wdHkgYXJyYXkgLSBhbGwgaXRlbXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICByZWxhdGVkRW50aXRpZXMgPSBbXTtcbiAgICAgICAgaWYgKCEoQXJyYXkuaXNBcnJheShyZWxhdGVkRW50aXRpZXMpKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gZnJvbSBhbGwgcmVsYXRlZCBlbnRpdGllcyBmaW5kIG9ubHkgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kIGluIHRoZSBkYiAtIGZvciB0aGVtIHdlIHdpbGwgY3JlYXRlIG9wZXJhdGlvbiBzdWJqZWN0c1xuICAgICAgICByZWxhdGVkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgaG93IGl0IHdpbGwgd29yayBmb3IgZW50aXRpZXMgd2hpY2ggYXJlIHNhdmVkIGJ5IGNhc2NhZGVzLCBidXQgYXJlbid0IHNhdmVkIGluIHRoZSBkYXRhYmFzZSB5ZXRcbiAgICAgICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZCBmcm9tIHRoZSByZWxhdGVkIGVudGl0aWVzLCBzaW5jZSB3ZSBvbmx5IG5lZWQgaXQgZm9yIGNvbXBhcmlzaW9uXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBleHRyYWN0IGZyb20gY2F0ZWdvcnkgb25seSByZWxhdGlvbiBpZCAoY2F0ZWdvcnkgaWQsIG9yIGxldCdzIHNheSBjYXRlZ29yeSB0aXRsZSwgZGVwZW5kIG9uIGpvaW4gY29sdW1uIG9wdGlvbnMpXG4gICAgICAgICAgICB2YXIgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocmVsYXRlZEVudGl0eSk7XG4gICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBhIHN1YmplY3Qgb2YgdGhpcyByZWxhdGVkIGVudGl0eSwgbWF5YmUgaXQgd2FzIGxvYWRlZCBvciB3YXMgbWFya2VkIGZvciBwZXJzaXN0ZW5jZVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlTdWJqZWN0ID0gX3RoaXMuc3ViamVjdHMuZmluZChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gaWYgc3ViamVjdCB3aXRoIGVudGl0eSB3YXMgZm91bmQgdGFrZSBzdWJqZWN0IGlkZW50aWZpZXIgYXMgcmVsYXRpb24gaWQgbWFwIHNpbmNlIGl0IG1heSBjb250YWluIGV4dHJhIHByb3BlcnRpZXMgcmVzb2x2ZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCA9IHJlbGF0ZWRFbnRpdHlTdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGVkIGVudGl0eSByZWxhdGlvbiBpZCBtYXAgaXMgZW1wdHkgaXQgbWVhbnMgcmVsYXRlZCBlbnRpdHkgaXMgbmV3bHkgcGVyc2lzdGVkXG4gICAgICAgICAgICBpZiAoIXJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZGVjaWRlZCB0byByZW1vdmUgdGhpcyBlcnJvciBiZWNhdXNlIGl0IGJyaW5ncyBjb21wbGljYXRpb25zIHdoZW4gc2F2aW5nIG9iamVjdCB3aXRoIG5vbi1zYXZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBzdWJqZWN0IHRoZW4gaXQgbWVhbnMgdXNlciB0cmllcyB0byBiaW5kIGVudGl0eSB3aGljaCB3YXNuJ3Qgc2F2ZWRcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHBlcnNpc3RlbmNlIGJlY2F1c2UgaGUgZGlkbid0IHBhc3MgdGhpcyBlbnRpdHkgZm9yIHNhdmUgb3IgaGUgZGlkIG5vdCBzZXQgY2FzY2FkZXNcbiAgICAgICAgICAgICAgICAvLyBidXQgd2l0aG91dCBlbnRpdHkgYmVpbmcgaW5zZXJ0ZWQgd2UgY2Fubm90IGJpbmQgaXQgaW4gdGhlIHJlbGF0aW9uIG9wZXJhdGlvbiwgc28gd2UgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmVcbiAgICAgICAgICAgICAgICAvLyB3ZSBkZWNpZGVkIHRvIHJlbW92ZSB0aGlzIGVycm9yIGJlY2F1c2UgaXQgYnJpbmdzIGNvbXBsaWNhdGlvbnMgd2hlbiBzYXZpbmcgb2JqZWN0IHdpdGggbm9uLXNhdmVkIGVudGl0aWVzXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgTWFueS10by1tYW55IHJlbGF0aW9uIFwiJHtyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lfS4ke3JlbGF0aW9uLnByb3BlcnR5UGF0aH1cIiBjb250YWlucyBgICtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdGllcyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyB0aGV5IGNhbm5vdCBiZSBiaW5kIGluIHRoZSBkYXRhYmFzZS4gYCArXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXRpZXMgYmVmb3JlIGJpbmRpbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgcmVsYXRlZCBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIHBvc3QncyBjYXRlZ29yeSBpbiB0aGUgZGF0YWJhc2UgcG9zdCdzIGNhdGVnb3JpZXNcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5RXhpc3RJbkRhdGFiYXNlID0gZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzLmZpbmQoZnVuY3Rpb24gKGRhdGFiYXNlUmVsYXRlZEVudGl0eVJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMuY29tcGFyZUlkcyhkYXRhYmFzZVJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkLCByZWxhdGVkRW50aXR5UmVsYXRpb25JZE1hcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIGVudGl0eSBpcyBmb3VuZCB0aGVuIGRvbid0IGRvIGFueXRoaW5nIC0gaXQgbWVhbnMgYmluZGluZyBpbiBqdW5jdGlvbiB0YWJsZSBhbHJlYWR5IGV4aXN0LCB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlFeGlzdEluRGF0YWJhc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIG93bmVyVmFsdWUgPSByZWxhdGlvbi5pc093bmluZyA/IHN1YmplY3QgOiAocmVsYXRlZEVudGl0eVN1YmplY3QgfHwgcmVsYXRlZEVudGl0eSk7IC8vIGJ5IGV4YW1wbGU6IG93bmVyRW50aXR5TWFwIGlzIHBvc3QgZnJvbSBzdWJqZWN0IGhlcmVcbiAgICAgICAgICAgIHZhciBpbnZlcnNlVmFsdWUgPSByZWxhdGlvbi5pc093bmluZyA/IChyZWxhdGVkRW50aXR5U3ViamVjdCB8fCByZWxhdGVkRW50aXR5KSA6IHN1YmplY3Q7IC8vIGJ5IGV4YW1wbGU6IGludmVyc2VFbnRpdHlNYXAgaXMgY2F0ZWdvcnkgZnJvbSBjYXRlZ29yaWVzIGFycmF5IGhlcmVcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGZvciBpbnNlcnQgb3BlcmF0aW9uIG9mIGp1bmN0aW9uIHJvd3NcbiAgICAgICAgICAgIHZhciBqdW5jdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICBjYW5CZUluc2VydGVkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5zdWJqZWN0cy5wdXNoKGp1bmN0aW9uU3ViamVjdCk7XG4gICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bmVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICBqdW5jdGlvblN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvd25lclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZUZhY3Rvcnk6ICh2YWx1ZSkgPT4gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLmdldEVudGl0eVZhbHVlKHZhbHVlKSAvLyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiEuZ2V0RW50aXR5VmFsdWUob3duZXJFbnRpdHlNYXApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmludmVyc2VDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIGp1bmN0aW9uU3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGludmVyc2VWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVGYWN0b3J5OiAodmFsdWUpID0+IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSkgLy8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLmdldEVudGl0eVZhbHVlKGludmVyc2VFbnRpdHlNYXApLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZXQgYWxsIGludmVyc2UgZW50aXRpZXMgcmVsYXRpb24gaWRzIHRoYXQgYXJlIFwiYmluZFwiIHRvIHRoZSBjdXJyZW50bHkgcGVyc2lzdGVkIGVudGl0eVxuICAgICAgICB2YXIgY2hhbmdlZEludmVyc2VFbnRpdHlSZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICByZWxhdGVkRW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRlZEVudGl0eSkge1xuICAgICAgICAgICAgLy8gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhIS5nZXRFbnRpdHlJZE1hcChyZWxhdGVkRW50aXR5KVxuICAgICAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHJlbGF0ZWRFbnRpdHkpO1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5U3ViamVjdCA9IF90aGlzLnN1YmplY3RzLmZpbmQoZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViamVjdC5lbnRpdHkgPT09IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgPSByZWxhdGVkRW50aXR5U3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwICE9PSB1bmRlZmluZWQgJiYgcmVsYXRlZEVudGl0eVJlbGF0aW9uSWRNYXAgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgY2hhbmdlZEludmVyc2VFbnRpdHlSZWxhdGlvbklkcy5wdXNoKHJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkTWFwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG5vdyBmcm9tIGFsbCBlbnRpdGllcyBpbiB0aGUgcGVyc2lzdGVkIGVudGl0eSBmaW5kIG9ubHkgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kIGluIHRoZSBkYlxuICAgICAgICB2YXIgcmVtb3ZlZEp1bmN0aW9uRW50aXR5SWRzID0gZGF0YWJhc2VSZWxhdGVkRW50aXR5SWRzLmZpbHRlcihmdW5jdGlvbiAoZXhpc3RSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gIWNoYW5nZWRJbnZlcnNlRW50aXR5UmVsYXRpb25JZHMuZmluZChmdW5jdGlvbiAoY2hhbmdlZFJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMuY29tcGFyZUlkcyhjaGFuZ2VkUmVsYXRpb25JZCwgZXhpc3RSZWxhdGlvbklkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmluYWxseSBjcmVhdGUgYSBuZXcganVuY3Rpb24gcmVtb3ZlIG9wZXJhdGlvbnMgZm9yIG1pc3NpbmcgcmVsYXRlZCBlbnRpdGllc1xuICAgICAgICByZW1vdmVkSnVuY3Rpb25FbnRpdHlJZHMuZm9yRWFjaChmdW5jdGlvbiAocmVtb3ZlZEVudGl0eVJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgIHZhciBqdW5jdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICBtdXN0QmVSZW1vdmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IF90aGlzLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyKHN1YmplY3QsIHJlbGF0aW9uLCByZW1vdmVkRW50aXR5UmVsYXRpb25JZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgX3RoaXMuc3ViamVjdHMucHVzaChqdW5jdGlvblN1YmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaWRlbnRpZmllcnMgZm9yIGp1bmN0aW9uIHRhYmxlLlxuICAgICAqIEV4YW1wbGU6IHsgcG9zdElkOiAxLCBjYXRlZ29yeUlkOiAyIH1cbiAgICAgKi9cbiAgICBNYW55VG9NYW55U3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkSnVuY3Rpb25JZGVudGlmaWVyID0gZnVuY3Rpb24gKHN1YmplY3QsIHJlbGF0aW9uLCByZWxhdGlvbklkKSB7XG4gICAgICAgIHZhciBvd25lckVudGl0eU1hcCA9IHJlbGF0aW9uLmlzT3duaW5nID8gc3ViamVjdC5lbnRpdHkgOiByZWxhdGlvbklkO1xuICAgICAgICB2YXIgaW52ZXJzZUVudGl0eU1hcCA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb25JZCA6IHN1YmplY3QuZW50aXR5O1xuICAgICAgICB2YXIgaWRlbnRpZmllciA9IHt9O1xuICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLm93bmVyQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlRGVlcChpZGVudGlmaWVyLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUob3duZXJFbnRpdHlNYXApKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmludmVyc2VDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKGlkZW50aWZpZXIsIGNvbHVtbi5jcmVhdGVWYWx1ZU1hcChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShpbnZlcnNlRW50aXR5TWFwKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfTtcbiAgICByZXR1cm4gTWFueVRvTWFueVN1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IE1hbnlUb01hbnlTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYW55VG9NYW55U3ViamVjdEJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcIi4uL1N1YmplY3RcIjtcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWwvT3JtVXRpbHNcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCI7XG4vKipcbiAqIEJ1aWxkcyBvcGVyYXRpb25zIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGZvciBvbmUtdG8tbWFueSByZWxhdGlvbnMgb2YgdGhlIGdpdmVuIHN1YmplY3RzLlxuICpcbiAqIGJ5IGV4YW1wbGU6IHBvc3QgY29udGFpbnMgb25lLXRvLW1hbnkgcmVsYXRpb24gd2l0aCBjYXRlZ29yeSBpbiB0aGUgcHJvcGVydHkgY2FsbGVkIFwiY2F0ZWdvcmllc1wiLCBlLmcuXG4gKiAgICAgICAgICAgICBAT25lVG9NYW55KHR5cGUgPT4gQ2F0ZWdvcnksIGNhdGVnb3J5ID0+IGNhdGVnb3J5LnBvc3QpIGNhdGVnb3JpZXM6IENhdGVnb3J5W11cbiAqICAgICAgICAgICAgIElmIHVzZXIgYWRkcyBjYXRlZ29yaWVzIGludG8gdGhlIHBvc3QgYW5kIHNhdmVzIHBvc3Qgd2UgbmVlZCB0byBiaW5kIHRoZW0uXG4gKiAgICAgICAgICAgICBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB1cGRhdGlvbiBvZiBjYXRlZ29yeSB0YWJsZSBzaW5jZSBpdHMgb3duZXIgb2YgdGhlIHJlbGF0aW9uIGFuZCBjb250YWlucyBhIGpvaW4gY29sdW1uLlxuICpcbiAqIG5vdGU6IHRoaXMgY2xhc3Mgc2hhcmVzIGxvdCBvZiB0aGluZ3Mgd2l0aCBPbmVUb09uZUludmVyc2VTaWRlT3BlcmF0aW9uQnVpbGRlciwgc28gd2hlbiB5b3UgY2hhbmdlIHRoaXMgY2xhc3NcbiAqICAgICAgIG1ha2Ugc3VyZSB0byByZWZsZWN0IGNoYW5nZXMgdGhlcmUgYXMgd2VsbC5cbiAqL1xudmFyIE9uZVRvTWFueVN1YmplY3RCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gT25lVG9NYW55U3ViamVjdEJ1aWxkZXIoc3ViamVjdHMpIHtcbiAgICAgICAgdGhpcy5zdWJqZWN0cyA9IHN1YmplY3RzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhbGwgcmVxdWlyZWQgb3BlcmF0aW9ucy5cbiAgICAgKi9cbiAgICBPbmVUb01hbnlTdWJqZWN0QnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICAgICAgc3ViamVjdC5tZXRhZGF0YS5vbmVUb01hbnlSZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24ucGVyc2lzdGVuY2VFbmFibGVkID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uKHN1YmplY3QsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcmllc1wiIGluc2lkZSBpdCBoZXJlLlxuICAgICAqL1xuICAgIE9uZVRvTWFueVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZEZvclN1YmplY3RSZWxhdGlvbiA9IGZ1bmN0aW9uIChzdWJqZWN0LCByZWxhdGlvbikge1xuICAgICAgICAvLyBwcmVwYXJlIG9iamVjdHMgKHJlbGF0aW9uIGlkIG1hcHMpIGZvciB0aGUgZGF0YWJhc2UgZW50aXR5XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IHNpbmNlIHN1YmplY3QgaXMgYSBwb3N0LCB3ZSBhcmUgZXhwZWN0aW5nIHRvIGdldCBhbGwgcG9zdCdzIGNhdGVnb3JpZXMgc2F2ZWQgaW4gdGhlIGRhdGFiYXNlIGhlcmUsXG4gICAgICAgIC8vICAgICAgICAgICAgIHBhcnRpY3VsYXJseSB0aGVpciByZWxhdGlvbiBpZHMsIGUuZy4gY2F0ZWdvcnkgaWRzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gaW4gbW9zdCBjYXNlcyByZWxhdGVkRW50aXR5RGF0YWJhc2VWYWx1ZXMgd2lsbCBjb250YWluIG9ubHkgdGhlIGVudGl0eSBrZXkgcHJvcGVydGllcy5cbiAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHN1YmplY3QuZGF0YWJhc2VFbnRpdHkgY29udGFpbnMgcmVsYXRpb25zIHdpdGggbG9hZGVkIHJlbGF0aW9uIGlkcyBvbmx5LlxuICAgICAgICAvLyBob3dldmVyIGlmIHRoZSBlbnRpdHkgdXNlcyB0aGUgYWZ0ZXJMb2FkIGhvb2sgdG8gY2FsY3VsYXRlIGFueSBwcm9wZXJ0aWVzLCB0aGUgZmV0Y2hlZCBcImtleSBvYmplY3RcIiBtaWdodCBpbmNsdWRlIEFERElUSU9OQUwgcHJvcGVydGllcy5cbiAgICAgICAgLy8gdG8gaGFuZGxlIHN1Y2ggc2l0dWF0aW9ucywgd2UgcGFzcyB0aGUgZGF0YSB0byByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAgdG8gZXh0cmFjdCB0aGUga2V5IHdpdGhvdXQgYW55IG90aGVyIHByb3BlcnRpZXMuXG4gICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkcyA9IFtdO1xuICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkgeyAvLyByZWxhdGVkIGVudGl0aWVzIGluIHRoZSBkYXRhYmFzZSBjYW4gZXhpc3Qgb25seSBpZiB0aGlzIGVudGl0eSAocG9zdCkgaXMgc2F2ZWRcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbiA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZHMgPSByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbi5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGdldCByZWxhdGVkIGVudGl0aWVzIG9mIHBlcnNpc3RlZCBlbnRpdHlcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogZ2V0IGNhdGVnb3JpZXMgZnJvbSB0aGUgcGFzc2VkIHRvIHBlcnNpc3QgcG9zdCBlbnRpdHlcbiAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdGllcyA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdGllcyA9PT0gbnVsbCkgLy8gd2UgdHJlYXQgcmVsYXRpb25zIHNldCB0byBudWxsIGFzIHJlbW92ZWQsIHNvIHdlIGRvbid0IHNraXAgaXRcbiAgICAgICAgICAgIHJlbGF0ZWRFbnRpdGllcyA9IFtdO1xuICAgICAgICBpZiAocmVsYXRlZEVudGl0aWVzID09PSB1bmRlZmluZWQpIC8vIGlmIHJlbGF0aW9uIGlzIHVuZGVmaW5lZCB0aGVuIG5vdGhpbmcgdG8gdXBkYXRlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZHMgZnJvbSB0aGUgcmVsYXRlZCBlbnRpdGllcywgc2luY2Ugd2Ugb25seSBuZWVkIHRoZW0gZm9yIGNvbXBhcmlzb25cbiAgICAgICAgLy8gYnkgZXhhbXBsZTogZXh0cmFjdCBmcm9tIGNhdGVnb3JpZXMgb25seSByZWxhdGlvbiBpZHMgKGNhdGVnb3J5IGlkLCBvciBsZXQncyBzYXkgY2F0ZWdvcnkgdGl0bGUsIGRlcGVuZCBvbiBqb2luIGNvbHVtbiBvcHRpb25zKVxuICAgICAgICB2YXIgcmVsYXRlZFBlcnNpc3RlZEVudGl0eVJlbGF0aW9uSWRzID0gW107XG4gICAgICAgIHJlbGF0ZWRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGVkRW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb25JZE1hcCA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChyZWxhdGVkRW50aXR5KTsgLy8gYnkgZXhhbXBsZTogcmVsYXRpb25JZE1hcCBpcyBjYXRlZ29yeS5pZCBtYXAgaGVyZSwgZS5nLiB7IGlkOiAuLi4gfVxuICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgICAgIHZhciByZWxhdGVkRW50aXR5U3ViamVjdCA9IF90aGlzLnN1YmplY3RzLmZpbmQoZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViamVjdC5lbnRpdHkgPT09IHJlbGF0ZWRFbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgICAgICBpZiAocmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgcmVsYXRpb25JZE1hcCA9IHJlbGF0ZWRFbnRpdHlTdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIGlzIHVuZGVmaW5lZCB0aGVuIGl0IG1lYW5zIHVzZXIgYmluZHMgb2JqZWN0IHdoaWNoIGlzIG5vdCBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgeWV0XG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBpZiBwb3N0IGNvbnRhaW5zIGNhdGVnb3JpZXMgd2hpY2ggZG9lcyBub3QgaGF2ZSBpZHMgeWV0IChiZWNhdXNlIHRoZXkgYXJlIG5ldylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGl0IG1lYW5zIHRoZXkgYXJlIGFsd2F5cyBuZXdseSBpbnNlcnRlZCBhbmQgcmVsYXRpb24gdXBkYXRlIG9wZXJhdGlvbiBhbHdheXMgbXVzdCBiZSBjcmVhdGVkIGZvciB0aGVtXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHBlcmZvcm0gZGlmZmVyZW5jZSBvcGVyYXRpb24gZm9yIHRoZW0gZm9yIGJvdGggYWRkIGFuZCByZW1vdmUgYWN0aW9uc1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbklkTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZGVjaWRlZCB0byByZW1vdmUgdGhpcyBlcnJvciBiZWNhdXNlIGl0IGJyaW5ncyBjb21wbGljYXRpb25zIHdoZW4gc2F2aW5nIG9iamVjdCB3aXRoIG5vbi1zYXZlZCBlbnRpdGllc1xuICAgICAgICAgICAgICAgIC8vIGlmICghcmVsYXRlZEVudGl0eVN1YmplY3QpXG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoYE9uZS10by1tYW55IHJlbGF0aW9uIFwiJHtyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5uYW1lfS4ke3JlbGF0aW9uLnByb3BlcnR5UGF0aH1cIiBjb250YWlucyBgICtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdGllcyB3aGljaCBkbyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyB0aGV5IGNhbm5vdCBiZSBiaW5kIGluIHRoZSBkYXRhYmFzZS4gYCArXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXRpZXMgYmVmb3JlIGJpbmRpbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIG9rYXksIHNvIHJlbGF0ZWQgc3ViamVjdCBleGlzdCBhbmQgaXRzIG1hcmtlZCBmb3IgaW5zZXJ0aW9uLCB0aGVuIGFkZCBhIG5ldyBjaGFuZ2UgbWFwXG4gICAgICAgICAgICAgICAgLy8gYnkgZXhhbXBsZTogdGhpcyB3aWxsIHRlbGwgY2F0ZWdvcnkgdG8gaW5zZXJ0IGludG8gaXRzIHBvc3QgcmVsYXRpb24gb3VyIHBvc3Qgd2UgYXJlIHdvcmtpbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IGlzIG5ld2x5IGluc2VydGVkIENhdGVnb3J5U3ViamVjdFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiBpcyBNYW55VG9PbmUgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc3ViamVjdCBpcyBQb3N0IG5lZWRzIHRvIGJlIGluc2VydGVkIGludG8gQ2F0ZWdvcnlcbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3ViamVjdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgYmluZGluZyByZWFsbHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIG91ciBjYXRlZ29yeSBpZiBpdHMgYWxyZWFkeSBiaW5kIGluIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uSWRJbkRhdGFiYXNlU3ViamVjdFJlbGF0aW9uID0gcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZHMuZmluZChmdW5jdGlvbiAocmVsYXRlZERhdGFiYXNlRW50aXR5UmVsYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPcm1VdGlscy5jb21wYXJlSWRzKHJlbGF0aW9uSWRNYXAsIHJlbGF0ZWREYXRhYmFzZUVudGl0eVJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIERPRVMgTk9UIGV4aXN0IGluIHRoZSBzdWJqZWN0J3MgcmVsYXRpb24gaW4gdGhlIGRhdGFiYXNlIGl0IG1lYW5zIGl0cyBhIG5ldyByZWxhdGlvbiBhbmQgd2UgbmVlZCB0byBcImJpbmRcIiB0aGVtXG4gICAgICAgICAgICAvLyBieSBleGFtcGxlOiB0aGlzIHdpbGwgdGVsbCBjYXRlZ29yeSB0byBpbnNlcnQgaW50byBpdHMgcG9zdCByZWxhdGlvbiBvdXIgcG9zdCB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdCBpcyBuZXdseSBpbnNlcnRlZCBDYXRlZ29yeVN1YmplY3RcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiBpcyBNYW55VG9PbmUgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbklkSW5EYXRhYmFzZVN1YmplY3RSZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IHRoZW4gaXQgbWVhbnMgXCJjYXRlZ29yeVwiIHdhc24ndCBwZXJzaXN0ZWQsXG4gICAgICAgICAgICAgICAgLy8gYnV0IHNpbmNlIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgXCJjYXRlZ29yeVwiIHRhYmxlIChzaW5jZSBpdHMgYW4gb3duaW5nIHNpZGUgb2YgcmVsYXRpb24gd2l0aCBqb2luIGNvbHVtbilcbiAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgYSBuZXcgc3ViamVjdCBoZXJlOlxuICAgICAgICAgICAgICAgIGlmICghcmVsYXRlZEVudGl0eVN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IHJlbGF0aW9uSWRNYXBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnN1YmplY3RzLnB1c2gocmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3ViamVjdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgcmVsYXRlZCBlbnRpdHkgaGFzIHJlbGF0aW9uIGlkIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHJlbGF0aW9uIGlkc1xuICAgICAgICAgICAgLy8gdGhpcyBsaXN0IHdpbGwgYmUgdXNlZCBsYXRlciB0byBjb21wYXJlIHdpdGggZGF0YWJhc2UgcmVsYXRpb24gaWRzIHRvIGZpbmQgYSBkaWZmZXJlbmNlXG4gICAgICAgICAgICAvLyB3aGF0IGV4aXN0IGluIHRoaXMgYXJyYXkgYW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSBhcmUgbmV3bHkgaW5zZXJ0ZWQgcmVsYXRpb25zXG4gICAgICAgICAgICAvLyB3aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYXJyYXksIGJ1dCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgYXJlIHJlbW92ZWQgcmVsYXRpb25zXG4gICAgICAgICAgICAvLyByZW1vdmVkIHJlbGF0aW9ucyBhcmUgc2V0IHRvIG51bGwgZnJvbSBpbnZlcnNlIHNpZGUgb2YgcmVsYXRpb25cbiAgICAgICAgICAgIHJlbGF0ZWRQZXJzaXN0ZWRFbnRpdHlSZWxhdGlvbklkcy5wdXNoKHJlbGF0aW9uSWRNYXApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmluZCB3aGF0IHJlbGF0ZWQgZW50aXRpZXMgd2VyZSBhZGRlZCBhbmQgd2hhdCB3ZXJlIHJlbW92ZWQgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgd2Ugc2F2ZSBhbmQgd2hhdCBkYXRhYmFzZSBoYXNcbiAgICAgICAgRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgIC5kaWZmZXJlbmNlKHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uSWRzLCByZWxhdGVkUGVyc2lzdGVkRW50aXR5UmVsYXRpb25JZHMpXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmVtb3ZlZFJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAvLyB0b2RvOiBwcm9iYWJseSB3ZSBjYW4gaW1wcm92ZSB0aGlzIGluIHRoZSBmdXR1cmUgYnkgZmluZGluZyBlbnRpdHkgd2l0aCBjb2x1bW4gdGhvc2UgdmFsdWVzLFxuICAgICAgICAgICAgLy8gdG9kbzogbWF5YmUgaXQgd2FzIGFscmVhZHkgaW4gcGVyc2lzdGVuY2UgcHJvY2Vzcy4gVGhpcyBpcyBwb3NzaWJsZSBkdWUgdG8gdW5pcXVlIHJlcXVpcmVtZW50cyBvZiBqb2luIGNvbHVtbnNcbiAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IHdoaWNoIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiBzdWJqZWN0IG9wZXJhdGlvbiBleGVjdXRvclxuICAgICAgICAgICAgdmFyIHJlbW92ZWRSZWxhdGVkRW50aXR5U3ViamVjdCA9IG5ldyBTdWJqZWN0KHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVtb3ZlZFJlbGF0ZWRFbnRpdHlSZWxhdGlvbklkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiB8fCByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ub3JwaGFuZWRSb3dBY3Rpb24gPT09IFwibnVsbGlmeVwiKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0LmNhbkJlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0LmNoYW5nZU1hcHMgPSBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLm9ycGhhbmVkUm93QWN0aW9uID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFJlbGF0ZWRFbnRpdHlTdWJqZWN0Lm11c3RCZVJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuc3ViamVjdHMucHVzaChyZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBPbmVUb01hbnlTdWJqZWN0QnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBPbmVUb01hbnlTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVUb01hbnlTdWJqZWN0QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vU3ViamVjdFwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuLyoqXG4gKiBCdWlsZHMgb3BlcmF0aW9ucyBuZWVkcyB0byBiZSBleGVjdXRlZCBmb3Igb25lLXRvLW9uZSBub24tb3duZXIgcmVsYXRpb25zIG9mIHRoZSBnaXZlbiBzdWJqZWN0cy5cbiAqXG4gKiBieSBleGFtcGxlOiBwb3N0IGNvbnRhaW5zIG9uZS10by1vbmUgbm9uLW93bmVyIHJlbGF0aW9uIHdpdGggY2F0ZWdvcnkgaW4gdGhlIHByb3BlcnR5IGNhbGxlZCBcImNhdGVnb3J5XCIsIGUuZy5cbiAqICAgICAgICAgICAgIEBPbmVUb09uZSh0eXBlID0+IENhdGVnb3J5LCBjYXRlZ29yeSA9PiBjYXRlZ29yeS5wb3N0KSBjYXRlZ29yeTogQ2F0ZWdvcnlcbiAqICAgICAgICAgICAgIElmIHVzZXIgc2V0cyBhIGNhdGVnb3J5IGludG8gdGhlIHBvc3QgYW5kIHNhdmVzIHBvc3Qgd2UgbmVlZCB0byBiaW5kIHRoZW0uXG4gKiAgICAgICAgICAgICBUaGlzIG9wZXJhdGlvbiByZXF1aXJlcyB1cGRhdGlvbiBvZiBjYXRlZ29yeSB0YWJsZSBzaW5jZSBpdHMgb3duZXIgb2YgdGhlIHJlbGF0aW9uIGFuZCBjb250YWlucyBhIGpvaW4gY29sdW1uLlxuICpcbiAqIG5vdGU6IHRoaXMgY2xhc3Mgc2hhcmVzIGxvdCBvZiB0aGluZ3Mgd2l0aCBPbmVUb01hbnlVcGRhdGVCdWlsZGVyLCBzbyB3aGVuIHlvdSBjaGFuZ2UgdGhpcyBjbGFzc1xuICogICAgICAgbWFrZSBzdXJlIHRvIHJlZmxlY3QgY2hhbmdlcyB0aGVyZSBhcyB3ZWxsLlxuICovXG52YXIgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyKHN1YmplY3RzKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdHMgPSBzdWJqZWN0cztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYWxsIHJlcXVpcmVkIG9wZXJhdGlvbnMuXG4gICAgICovXG4gICAgT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLm9uZVRvT25lUmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCBvd25pbmcgcmVsYXRpb25zLCB0aGlzIG9wZXJhdGlvbiBpcyBvbmx5IGZvciBpbnZlcnNlIHNpZGUgb2Ygb25lLXRvLW9uZSByZWxhdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBza2lwIHJlbGF0aW9ucyBmb3Igd2hpY2ggcGVyc2lzdGVuY2UgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcgfHwgcmVsYXRpb24ucGVyc2lzdGVuY2VFbmFibGVkID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uKHN1YmplY3QsIHJlbGF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gc3ViamVjdCBhbmQgcmVsYXRpb24uXG4gICAgICpcbiAgICAgKiBieSBleGFtcGxlOiBzdWJqZWN0IGlzIFwicG9zdFwiIGVudGl0eSB3ZSBhcmUgc2F2aW5nIGhlcmUgYW5kIHJlbGF0aW9uIGlzIFwiY2F0ZWdvcnlcIiBpbnNpZGUgaXQgaGVyZS5cbiAgICAgKi9cbiAgICBPbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkRm9yU3ViamVjdFJlbGF0aW9uID0gZnVuY3Rpb24gKHN1YmplY3QsIHJlbGF0aW9uKSB7XG4gICAgICAgIC8vIHByZXBhcmUgb2JqZWN0cyAocmVsYXRpb24gaWQgbWFwKSBmb3IgdGhlIGRhdGFiYXNlIGVudGl0eVxuICAgICAgICAvLyBub3RlOiBzdWJqZWN0LmRhdGFiYXNlRW50aXR5IGNvbnRhaW5zIHJlbGF0aW9uIHdpdGggbG9hZGVkIHJlbGF0aW9uIGlkIG9ubHkgKGlkIG1hcClcbiAgICAgICAgLy8gYnkgZXhhbXBsZTogc2luY2Ugc3ViamVjdCBpcyBhIHBvc3QsIHdlIGFyZSBleHBlY3RpbmcgdG8gZ2V0IHBvc3QncyBjYXRlZ29yeSBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgaGVyZSxcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFydGljdWxhcmx5IGl0cyByZWxhdGlvbiBpZCwgZS5nLiBjYXRlZ29yeSBpZCBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIHZhciByZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc3ViamVjdC5kYXRhYmFzZUVudGl0eSkgLy8gcmVsYXRlZCBlbnRpdHkgaW4gdGhlIGRhdGFiYXNlIGNhbiBleGlzdCBvbmx5IGlmIHRoaXMgZW50aXR5IChwb3N0KSBpcyBzYXZlZFxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZGF0YWJhc2VFbnRpdHkpO1xuICAgICAgICAvLyBnZXQgcmVsYXRlZCBlbnRpdGllcyBvZiBwZXJzaXN0ZWQgZW50aXR5XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGdldCBjYXRlZ29yeSBmcm9tIHRoZSBwYXNzZWQgdG8gcGVyc2lzdCBwb3N0IGVudGl0eVxuICAgICAgICB2YXIgcmVsYXRlZEVudGl0eSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTsgLy8gYnkgZXhhbXBsZTogcmVsYXRlZEVudGl0eSBpcyBhIGNhdGVnb3J5IGhlcmVcbiAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHkgPT09IHVuZGVmaW5lZCkgLy8gaWYgcmVsYXRpb24gaXMgdW5kZWZpbmVkIHRoZW4gbm90aGluZyB0byB1cGRhdGVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gaWYgcmVsYXRlZCBlbnRpdHkgaXMgbnVsbCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgYSBiaW5kIGluIHRoZSBkYXRhYmFzZSBhbmQgdW5zZXQgaXRcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYmluZCBpbiB0aGUgZW50aXR5IHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICAvLyBieSBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5ID0gbnVsbCBhbmQgY2F0ZWdvcnkgaGFzIHRoaXMgcG9zdCBpbiB0aGUgZGF0YWJhc2UgdGhlbiB3ZSB1bnNldCBpdFxuICAgICAgICBpZiAocmVsYXRlZEVudGl0eSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaXQgbWFrZXMgc2Vuc2UgdG8gdXBkYXRlIGRhdGFiYXNlIG9ubHkgdGhlcmUgaXMgYSBwcmV2aW91c2x5IHNldCB2YWx1ZSBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChyZWxhdGVkRW50aXR5RGF0YWJhc2VSZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogcHJvYmFibHkgd2UgY2FuIGltcHJvdmUgdGhpcyBpbiB0aGUgZnV0dXJlIGJ5IGZpbmRpbmcgZW50aXR5IHdpdGggY29sdW1uIHRob3NlIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAvLyB0b2RvOiBtYXliZSBpdCB3YXMgYWxyZWFkeSBpbiBwZXJzaXN0ZW5jZSBwcm9jZXNzLiBUaGlzIGlzIHBvc3NpYmxlIGR1ZSB0byB1bmlxdWUgcmVxdWlyZW1lbnRzIG9mIGpvaW4gY29sdW1uc1xuICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IHdoaWNoIG9wZXJhdGlvbnMgd2lsbCBiZSBleGVjdXRlZCBpbiBzdWJqZWN0IG9wZXJhdGlvbiBleGVjdXRvclxuICAgICAgICAgICAgICAgIHZhciByZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN1YmplY3Q6IHN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlTWFwczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdHMucHVzaChyZW1vdmVkUmVsYXRlZEVudGl0eVN1YmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIGVsc2UgbWVhbnMgZW50aXR5IGlzIGJpbmQgaW4gdGhlIGRhdGFiYXNlXG4gICAgICAgIC8vIGV4dHJhY3Qgb25seSByZWxhdGlvbiBpZCBmcm9tIHRoZSByZWxhdGVkIGVudGl0aWVzLCBzaW5jZSB3ZSBvbmx5IG5lZWQgaXQgZm9yIGNvbXBhcmlzaW9uXG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGV4dHJhY3QgZnJvbSBjYXRlZ29yeSBvbmx5IHJlbGF0aW9uIGlkIChjYXRlZ29yeSBpZCwgb3IgbGV0J3Mgc2F5IGNhdGVnb3J5IHRpdGxlLCBkZXBlbmQgb24gam9pbiBjb2x1bW4gb3B0aW9ucylcbiAgICAgICAgdmFyIHJlbGF0aW9uSWRNYXAgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocmVsYXRlZEVudGl0eSk7IC8vIGJ5IGV4YW1wbGU6IHJlbGF0aW9uSWRNYXAgaXMgY2F0ZWdvcnkuaWQgbWFwIGhlcmUsIGUuZy4geyBpZDogLi4uIH1cbiAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzdWJqZWN0IG9mIHRoaXMgcmVsYXRlZCBlbnRpdHksIG1heWJlIGl0IHdhcyBsb2FkZWQgb3Igd2FzIG1hcmtlZCBmb3IgcGVyc2lzdGVuY2VcbiAgICAgICAgdmFyIHJlbGF0ZWRFbnRpdHlTdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5maW5kKGZ1bmN0aW9uIChvcGVyYXRlU3ViamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuICEhb3BlcmF0ZVN1YmplY3QuZW50aXR5ICYmIG9wZXJhdGVTdWJqZWN0LmVudGl0eSA9PT0gcmVsYXRlZEVudGl0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGlmIHN1YmplY3Qgd2l0aCBlbnRpdHkgd2FzIGZvdW5kIHRha2Ugc3ViamVjdCBpZGVudGlmaWVyIGFzIHJlbGF0aW9uIGlkIG1hcCBzaW5jZSBpdCBtYXkgY29udGFpbiBleHRyYSBwcm9wZXJ0aWVzIHJlc29sdmVkXG4gICAgICAgIGlmIChyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgIHJlbGF0aW9uSWRNYXAgPSByZWxhdGVkRW50aXR5U3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAvLyBpZiByZWxhdGlvbklkTWFwIGlzIHVuZGVmaW5lZCB0aGVuIGl0IG1lYW5zIHVzZXIgYmluZHMgb2JqZWN0IHdoaWNoIGlzIG5vdCBzYXZlZCBpbiB0aGUgZGF0YWJhc2UgeWV0XG4gICAgICAgIC8vIGJ5IGV4YW1wbGU6IGlmIHBvc3QgY29udGFpbnMgY2F0ZWdvcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSBpZChzKSB5ZXQgKGJlY2F1c2UgaXRzIGEgbmV3IGNhdGVnb3J5KVxuICAgICAgICAvLyAgICAgICAgICAgICBpdCBtZWFucyBpdHMgYWx3YXlzIG5ld2x5IGluc2VydGVkIGFuZCByZWxhdGlvbiB1cGRhdGUgb3BlcmF0aW9uIGFsd2F5cyBtdXN0IGJlIGNyZWF0ZWQgZm9yIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gcGVyZm9ybSBkaWZmZXJlbmNlIG9wZXJhdGlvbiBmb3IgaXQgZm9yIGJvdGggYWRkIGFuZCByZW1vdmUgYWN0aW9uc1xuICAgICAgICBpZiAoIXJlbGF0aW9uSWRNYXApIHtcbiAgICAgICAgICAgIC8vIHdlIGRlY2lkZWQgdG8gcmVtb3ZlIHRoaXMgZXJyb3IgYmVjYXVzZSBpdCBicmluZ3MgY29tcGxpY2F0aW9ucyB3aGVuIHNhdmluZyBvYmplY3Qgd2l0aCBub24tc2F2ZWQgZW50aXRpZXNcbiAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBzdWJqZWN0IHRoZW4gaXQgbWVhbnMgdXNlciB0cmllcyB0byBiaW5kIGVudGl0eSB3aGljaCB3YXNuJ3Qgc2F2ZWRcbiAgICAgICAgICAgIC8vIGluIHRoaXMgcGVyc2lzdGVuY2UgYmVjYXVzZSBoZSBkaWRuJ3QgcGFzcyB0aGlzIGVudGl0eSBmb3Igc2F2ZSBvciBoZSBkaWQgbm90IHNldCBjYXNjYWRlc1xuICAgICAgICAgICAgLy8gYnV0IHdpdGhvdXQgZW50aXR5IGJlaW5nIGluc2VydGVkIHdlIGNhbm5vdCBiaW5kIGl0IGluIHRoZSByZWxhdGlvbiBvcGVyYXRpb24sIHNvIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlXG4gICAgICAgICAgICAvLyBpZiAoIXJlbGF0ZWRFbnRpdHlTdWJqZWN0KVxuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoYE9uZS10by1vbmUgaW52ZXJzZSByZWxhdGlvbiBcIiR7cmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZX0uJHtyZWxhdGlvbi5wcm9wZXJ0eVBhdGh9XCIgY29udGFpbnMgYCArXG4gICAgICAgICAgICAvLyAgICAgICAgIGBlbnRpdHkgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlIHlldCwgdGh1cyBjYW5ub3QgYmUgYmluZCBpbiB0aGUgZGF0YWJhc2UuIGAgK1xuICAgICAgICAgICAgLy8gICAgICAgICBgUGxlYXNlIHNldHVwIGNhc2NhZGUgaW5zZXJ0aW9uIG9yIHNhdmUgZW50aXR5IGJlZm9yZSBiaW5kaW5nIGl0LmApO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGVkRW50aXR5U3ViamVjdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBva2F5LCBzbyByZWxhdGVkIHN1YmplY3QgZXhpc3QgYW5kIGl0cyBtYXJrZWQgZm9yIGluc2VydGlvbiwgdGhlbiBhZGQgYSBuZXcgY2hhbmdlIG1hcFxuICAgICAgICAgICAgLy8gYnkgZXhhbXBsZTogdGhpcyB3aWxsIHRlbGwgY2F0ZWdvcnkgdG8gaW5zZXJ0IGludG8gaXRzIHBvc3QgcmVsYXRpb24gb3VyIHBvc3Qgd2UgYXJlIHdvcmtpbmcgd2l0aFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgaXMgbmV3bHkgaW5zZXJ0ZWQgQ2F0ZWdvcnlTdWJqZWN0XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gaXMgT25lVG9PbmUgb3duZXIgcmVsYXRpb24gaW5zaWRlIENhdGVnb3J5XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QuY2hhbmdlTWFwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICByZWxhdGlvbjogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdWJqZWN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGJpbmRpbmcgcmVhbGx5IGV4aXN0IGluIHRoZSBkYXRhYmFzZVxuICAgICAgICAvLyBieSBleGFtcGxlOiBmaW5kIG91ciBwb3N0IGlmIGl0cyBhbHJlYWR5IGJpbmQgdG8gY2F0ZWdvcnkgaW4gdGhlIGRhdGFiYXNlIGFuZCBpdHMgbm90IGVxdWFsIHRvIHdoYXQgdXNlciB0cmllcyB0byBzZXRcbiAgICAgICAgdmFyIGFyZVJlbGF0ZWRJZEVxdWFsV2l0aERhdGFiYXNlID0gcmVsYXRlZEVudGl0eURhdGFiYXNlUmVsYXRpb25JZCAmJiBPcm1VdGlscy5jb21wYXJlSWRzKHJlbGF0aW9uSWRNYXAsIHJlbGF0ZWRFbnRpdHlEYXRhYmFzZVJlbGF0aW9uSWQpO1xuICAgICAgICAvLyBpZiB0aGV5IGFyZW4ndCBlcXVhbCBpdCBtZWFucyBpdHMgYSBuZXcgcmVsYXRpb24gYW5kIHdlIG5lZWQgdG8gXCJiaW5kXCIgdGhlbVxuICAgICAgICAvLyBieSBleGFtcGxlOiB0aGlzIHdpbGwgdGVsbCBjYXRlZ29yeSB0byBpbnNlcnQgaW50byBpdHMgcG9zdCByZWxhdGlvbiBvdXIgcG9zdCB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgICAgIC8vICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHlTdWJqZWN0IGlzIG5ld2x5IGluc2VydGVkIENhdGVnb3J5U3ViamVjdFxuICAgICAgICAvLyAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24gaXMgTWFueVRvT25lIHJlbGF0aW9uIGluc2lkZSBDYXRlZ29yeVxuICAgICAgICAvLyAgICAgICAgICAgICBzdWJqZWN0IGlzIFBvc3QgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBDYXRlZ29yeVxuICAgICAgICBpZiAoIWFyZVJlbGF0ZWRJZEVxdWFsV2l0aERhdGFiYXNlKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyByZWxhdGVkRW50aXR5U3ViamVjdCB0aGVuIGl0IG1lYW5zIFwiY2F0ZWdvcnlcIiB3YXNuJ3QgcGVyc2lzdGVkLFxuICAgICAgICAgICAgLy8gYnV0IHNpbmNlIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgXCJjYXRlZ29yeVwiIHRhYmxlIChzaW5jZSBpdHMgYW4gb3duaW5nIHNpZGUgb2YgcmVsYXRpb24gd2l0aCBqb2luIGNvbHVtbilcbiAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGhlcmU6XG4gICAgICAgICAgICBpZiAoIXJlbGF0ZWRFbnRpdHlTdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmVsYXRlZEVudGl0eVN1YmplY3QgPSBuZXcgU3ViamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGNhbkJlVXBkYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogcmVsYXRpb25JZE1hcFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdHMucHVzaChyZWxhdGVkRW50aXR5U3ViamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWxhdGVkRW50aXR5U3ViamVjdC5jaGFuZ2VNYXBzLnB1c2goe1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN1YmplY3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT25lVG9PbmVJbnZlcnNlU2lkZVN1YmplY3RCdWlsZGVyO1xufSgpKTtcbmV4cG9ydCB7IE9uZVRvT25lSW52ZXJzZVNpZGVTdWJqZWN0QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PbmVUb09uZUludmVyc2VTaWRlU3ViamVjdEJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXksIF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBDYW5ub3RBdHRhY2hUcmVlQ2hpbGRyZW5FbnRpdHlFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci9DYW5ub3RBdHRhY2hUcmVlQ2hpbGRyZW5FbnRpdHlFcnJvclwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uLy4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG4vKipcbiAqIEV4ZWN1dGVzIHN1YmplY3Qgb3BlcmF0aW9ucyBmb3IgY2xvc3VyZSBlbnRpdGllcy5cbiAqL1xudmFyIENsb3N1cmVTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIENsb3N1cmVTdWJqZWN0RXhlY3V0b3IocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNsb3N1cmVKdW5jdGlvbkluc2VydE1hcCwgcGFyZW50LCBlc2NhcGVfMSwgdGFibGVOYW1lLCBxdWVyeVBhcmFtc18xLCBhbmNlc3RvckNvbHVtbk5hbWVzLCBkZXNjZW5kYW50Q29sdW1uTmFtZXMsIGNoaWxkRW50aXR5SWRzMSwgd2hlcmVDb25kaXRpb247XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUp1bmN0aW9uSW5zZXJ0TWFwID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmFuY2VzdG9yQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlSnVuY3Rpb25JbnNlcnRNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBzdWJqZWN0LmlkZW50aWZpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuZGVzY2VuZGFudENvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUp1bmN0aW9uSW5zZXJ0TWFwW2NvbHVtbi5kYXRhYmFzZU5hbWVdID0gc3ViamVjdC5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgdmFsdWVzIGludG8gdGhlIGNsb3N1cmUganVuY3Rpb24gdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50byhzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLnRhYmxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlcyhjbG9zdXJlSnVuY3Rpb25JbnNlcnRNYXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbnRpdHkoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTGlzdGVuZXJzKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHZhbHVlcyBpbnRvIHRoZSBjbG9zdXJlIGp1bmN0aW9uIHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eSkgLy8gaWYgZW50aXR5IHdhcyBhdHRhY2hlZCB2aWEgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0LnBhcmVudFN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCA/IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0IDogc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV8xID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoYWxpYXMpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUoc3ViamVjdC5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS50YWJsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JDb2x1bW5OYW1lcyA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50Q29sdW1uTmFtZXMgPSBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVudGl0eUlkczEgPSBzdWJqZWN0Lm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMS5wdXNoKGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgPyBzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgOiBzdWJqZWN0LmVudGl0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJjaGlsZF9lbnRpdHlfXCIgKyBjb2x1bW4uZGF0YWJhc2VOYW1lLCBxdWVyeVBhcmFtc18xLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbiA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuZGVzY2VuZGFudENvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGVzY2FwZV8xKGNvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJZCA9IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhbm5vdEF0dGFjaFRyZWVDaGlsZHJlbkVudGl0eUVycm9yKHN1YmplY3QubWV0YWRhdGEubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNfMS5wdXNoKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyTmFtZSA9IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZVBhcmFtZXRlcihcInBhcmVudF9lbnRpdHlfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUsIHF1ZXJ5UGFyYW1zXzEubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWUgKyBcIiA9IFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIklOU0VSVCBJTlRPIFwiICsgdGFibGVOYW1lICsgXCIgKFwiICsgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYW5jZXN0b3JDb2x1bW5OYW1lcyksIGZhbHNlKSwgX19yZWFkKGRlc2NlbmRhbnRDb2x1bW5OYW1lcyksIGZhbHNlKS5qb2luKFwiLCBcIikgKyBcIikgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJTRUxFQ1QgXCIgKyBhbmNlc3RvckNvbHVtbk5hbWVzLmpvaW4oXCIsIFwiKSArIFwiLCBcIiArIGNoaWxkRW50aXR5SWRzMS5qb2luKFwiLCBcIikgKyBcIiBGUk9NIFwiICsgdGFibGVOYW1lICsgXCIgV0hFUkUgXCIgKyB3aGVyZUNvbmRpdGlvbi5qb2luKFwiIEFORCBcIikpLCBxdWVyeVBhcmFtc18xKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBDbG9zdXJlU3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50LCBlbnRpdHksIG9sZFBhcmVudCwgb2xkUGFyZW50SWQsIHBhcmVudElkLCBlc2NhcGUsIGNsb3N1cmVUYWJsZSwgYW5jZXN0b3JDb2x1bW5OYW1lcywgZGVzY2VuZGFudENvbHVtbk5hbWVzLCBjcmVhdGVTdWJRdWVyeSwgcGFyYW1ldGVycywgX2EsIF9iLCBjb2x1bW4sIHF1ZXJ5UGFyYW1zXzIsIHRhYmxlTmFtZSwgc3VwZXJBbGlhc18xLCBzdWJBbGlhc18xLCBzZWxlY3QsIGVudGl0eVdoZXJlQ29uZGl0aW9uLCBwYXJlbnRXaGVyZUNvbmRpdGlvbjtcbiAgICAgICAgICAgIHZhciBlXzEsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50ICYmIHN1YmplY3QucGFyZW50U3ViamVjdCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSBzdWJqZWN0LmRhdGFiYXNlRW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkgJiYgcGFyZW50KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QubWV0YWRhdGEudHJlZUNoaWxkcmVuUmVsYXRpb24uZ2V0RW50aXR5VmFsdWUocGFyZW50KS5maW5kKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc3ViamVjdC5pZGVudGlmaWVyKS5ldmVyeShmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIGtleSA9IF9iWzBdLCB2YWx1ZSA9IF9iWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkW2tleV0gPT09IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgaWYgdGhlIHBhcmVudCBvciB0aGUgZW50aXR5IHdoZXJlIG5ldmVyIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChvbGRQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IGlmIHRoZSBuZXcgYW5kIG9sZCBwYXJlbnRzIGFyZSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmNvbXBhcmVJZHMob2xkUGFyZW50SWQsIHBhcmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVUYWJsZSA9IHN1YmplY3QubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3RvckNvbHVtbk5hbWVzID0gY2xvc3VyZVRhYmxlLmFuY2VzdG9yQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRDb2x1bW5OYW1lcyA9IGNsb3N1cmVUYWJsZS5kZXNjZW5kYW50Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN1YlF1ZXJ5ID0gZnVuY3Rpb24gKHFiLCBhbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJBbGlhcyA9IFwic3ViXCIgKyBhbGlhcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViU2VsZWN0ID0gcWIuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChkZXNjZW5kYW50Q29sdW1uTmFtZXMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShjbG9zdXJlVGFibGUudGFibGVQYXRoLCBzdWJBbGlhcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHdoZXJlIGNvbmRpdGlvbnMgZS5nLiAoV0hFUkUgXCJzdWJkZXNjZW5kYW50XCIuXCJpZF9hbmNlc3RvclwiID0gOnZhbHVlX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKGNsb3N1cmVUYWJsZS5hbmNlc3RvckNvbHVtbnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTZWxlY3QuYW5kV2hlcmUoZXNjYXBlKHN1YkFsaWFzKSArIFwiLlwiICsgZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSA6dmFsdWVfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWIuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChkZXNjZW5kYW50Q29sdW1uTmFtZXMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShcIihcIiArIHN1YlNlbGVjdC5nZXRRdWVyeSgpICsgXCIpXCIsIGFsaWFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhzdWJTZWxlY3QuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyhzdWJqZWN0Lm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcInZhbHVlX1wiICsgY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBlbnRpdHlbY29sdW1uLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKGNsb3N1cmVUYWJsZS50YWJsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShmdW5jdGlvbiAocWIpIHsgcmV0dXJuIFwiKFwiICsgZGVzY2VuZGFudENvbHVtbk5hbWVzLmpvaW4oXCIsIFwiKSArIFwiKSBJTiAoXCIgKyBjcmVhdGVTdWJRdWVyeShxYiwgXCJkZXNjZW5kYW50XCIpICsgXCIpXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbmRXaGVyZShmdW5jdGlvbiAocWIpIHsgcmV0dXJuIFwiKFwiICsgYW5jZXN0b3JDb2x1bW5OYW1lcy5qb2luKFwiLCBcIikgKyBcIikgTk9UIElOIChcIiArIGNyZWF0ZVN1YlF1ZXJ5KHFiLCBcImFuY2VzdG9yXCIpICsgXCIpXCI7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc18yID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShjbG9zdXJlVGFibGUudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQWxpYXNfMSA9IGVzY2FwZShcInN1cGVydHJlZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YkFsaWFzXzEgPSBlc2NhcGUoXCJzdWJ0cmVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYW5jZXN0b3JDb2x1bW5OYW1lcy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIHN1cGVyQWxpYXNfMSArIFwiLlwiICsgY29sdW1uTmFtZTsgfSkpLCBmYWxzZSksIF9fcmVhZChkZXNjZW5kYW50Q29sdW1uTmFtZXMubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBzdWJBbGlhc18xICsgXCIuXCIgKyBjb2x1bW5OYW1lOyB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVdoZXJlQ29uZGl0aW9uID0gc3ViamVjdC5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS5hbmNlc3RvckNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9IGVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5SWQgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zXzIucHVzaChlbnRpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJlbnRpdHlfXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWUsIHF1ZXJ5UGFyYW1zXzIubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YkFsaWFzXzEgKyBcIi5cIiArIGNvbHVtbk5hbWUgKyBcIiA9IFwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50V2hlcmVDb25kaXRpb24gPSBzdWJqZWN0Lm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudElkID0gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2Fubm90QXR0YWNoVHJlZUNoaWxkcmVuRW50aXR5RXJyb3Ioc3ViamVjdC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc18yLnB1c2gocGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuY3JlYXRlUGFyYW1ldGVyKFwicGFyZW50X2VudGl0eV9cIiArIGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSwgcXVlcnlQYXJhbXNfMi5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXJBbGlhc18xICsgXCIuXCIgKyBjb2x1bW5OYW1lICsgXCIgPSBcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucXVlcnkoXCJJTlNFUlQgSU5UTyBcIiArIHRhYmxlTmFtZSArIFwiIChcIiArIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFuY2VzdG9yQ29sdW1uTmFtZXMpLCBmYWxzZSksIF9fcmVhZChkZXNjZW5kYW50Q29sdW1uTmFtZXMpLCBmYWxzZSkuam9pbihcIiwgXCIpICsgXCIpIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiU0VMRUNUIFwiICsgc2VsZWN0LmpvaW4oXCIsIFwiKSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBBUyBcIiArIHN1cGVyQWxpYXNfMSArIFwiLCBcIiArIHRhYmxlTmFtZSArIFwiIEFTIFwiICsgc3ViQWxpYXNfMSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRVJFIFwiICsgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZW50aXR5V2hlcmVDb25kaXRpb24pLCBmYWxzZSksIF9fcmVhZChwYXJlbnRXaGVyZUNvbmRpdGlvbiksIGZhbHNlKS5qb2luKFwiIEFORCBcIikpLCBxdWVyeVBhcmFtc18yKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBFeGVjdXRlcyBvcGVyYXRpb25zIHdoZW4gc3ViamVjdCBpcyBiZWluZyByZW1vdmVkLlxuICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIGlkZW50aWZpZXJzLCBjbG9zdXJlVGFibGUsIGdlbmVyYXRlV2hlcmVzLCBhbmNlc3RvcldoZXJlLCBkZXNjZW5kYW50V2hlcmU7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBtc3NxbCBuZWVkIHRvIGV4ZWN1dGUgZGVsZXRlcyBmb3IgdGhlIGp1bnRpb24gdGFibGUgYXMgaXQgZG9lc24ndCBzdXBwb3J0IG11bHRpIGNhc2NhZGUgcGF0aHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJqZWN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBbc3ViamVjdHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoYWxpYXMpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMgPSBzdWJqZWN0cy5tYXAoZnVuY3Rpb24gKHN1YmplY3QpIHsgcmV0dXJuIHN1YmplY3QuaWRlbnRpZmllcjsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlVGFibGUgPSBzdWJqZWN0c1swXS5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlV2hlcmVzID0gZnVuY3Rpb24gKGNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGlkZW50aWZpZXJzLm1hcChmdW5jdGlvbiAoaWRlbnRpZmllcikgeyByZXR1cm4gaWRlbnRpZmllcltjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5kYXRhYmFzZU5hbWVdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiIElOIChcIiArIGRhdGEuam9pbihcIiwgXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yV2hlcmUgPSBnZW5lcmF0ZVdoZXJlcyhjbG9zdXJlVGFibGUuYW5jZXN0b3JDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRXaGVyZSA9IGdlbmVyYXRlV2hlcmVzKGNsb3N1cmVUYWJsZS5kZXNjZW5kYW50Q29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oY2xvc3VyZVRhYmxlLnRhYmxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGFuY2VzdG9yV2hlcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcldoZXJlKGRlc2NlbmRhbnRXaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVzY2FwZWQgdGFibGUgbmFtZSB3aXRoIHNjaGVtYSBuYW1lIGlmIFNxbFNlcnZlciBvciBQb3N0Z3JlcyBkcml2ZXIgdXNlZCB3aXRoIGN1c3RvbVxuICAgICAqIHNjaGVtYSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyBlc2NhcGVkIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgQ2xvc3VyZVN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuZ2V0VGFibGVOYW1lID0gZnVuY3Rpb24gKHRhYmxlUGF0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGFibGVQYXRoLnNwbGl0KFwiLlwiKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgLy8gdGhpcyBjb25kaXRpb24gbmVlZCBiZWNhdXNlIGluIFNRTCBTZXJ2ZXIgZHJpdmVyIHdoZW4gY3VzdG9tIGRhdGFiYXNlIG5hbWUgd2FzIHNwZWNpZmllZCBhbmQgc2NoZW1hIG5hbWUgd2FzIG5vdCwgd2UgZ290IGBkYk5hbWUuLnRhYmxlTmFtZWAgc3RyaW5nLCBhbmQgZG9lc24ndCBuZWVkIHRvIGVzY2FwZSBtaWRkbGUgZW1wdHkgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gaSA9PT0gXCJcIiA/IGkgOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGUoaSk7XG4gICAgICAgIH0pLmpvaW4oXCIuXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIENsb3N1cmVTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgQ2xvc3VyZVN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbG9zdXJlU3ViamVjdEV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCI7XG4vKipcbiAqIEV4ZWN1dGVzIHN1YmplY3Qgb3BlcmF0aW9ucyBmb3IgbWF0ZXJpYWxpemVkLXBhdGggdHJlZSBlbnRpdGllcy5cbiAqL1xudmFyIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudCwgcGFyZW50SWQsIHBhcmVudFBhdGgsIGluc2VydGVkRW50aXR5SWQ7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eSkgLy8gaWYgZW50aXR5IHdhcyBhdHRhY2hlZCB2aWEgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzdWJqZWN0LnBhcmVudFN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCA/IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0IDogc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0RW50aXR5UGF0aChzdWJqZWN0LCBwYXJlbnRJZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZEVudGl0eUlkID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShzdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIl9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoc3ViamVjdC5tZXRhZGF0YS50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoKF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hW3N1YmplY3QubWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbi5wcm9wZXJ0eVBhdGhdID0gcGFyZW50UGF0aCArIGluc2VydGVkRW50aXR5SWQgKyBcIi5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoc3ViamVjdC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIG9wZXJhdGlvbnMgd2hlbiBzdWJqZWN0IGlzIGJlaW5nIHVwZGF0ZWQuXG4gICAgICovXG4gICAgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5ld1BhcmVudCwgZW50aXR5LCBvbGRQYXJlbnQsIG9sZFBhcmVudElkLCBuZXdQYXJlbnRJZCwgbmV3UGFyZW50UGF0aCwgb2xkUGFyZW50UGF0aCwgZW50aXR5UGF0aCwgcHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQYXJlbnQgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0ICYmIHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHkpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50ID0gc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QuZGF0YWJhc2VFbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eSAmJiBuZXdQYXJlbnQpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShuZXdQYXJlbnQpLmZpbmQoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmlkZW50aWZpZXIpLmV2ZXJ5KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRba2V5XSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhcmVudElkID0gc3ViamVjdC5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChvbGRQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKG5ld1BhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IGlmIHRoZSBuZXcgYW5kIG9sZCBwYXJlbnRzIGFyZSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9ybVV0aWxzLmNvbXBhcmVJZHMob2xkUGFyZW50SWQsIG5ld1BhcmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFBhdGggPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQYXJlbnRJZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldEVudGl0eVBhdGgoc3ViamVjdCwgbmV3UGFyZW50SWQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50UGF0aCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50UGF0aCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9sZFBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0RW50aXR5UGF0aChzdWJqZWN0LCBvbGRQYXJlbnRJZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnRQYXRoID0gKF9iLnNlbnQoKSkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5UGF0aCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCJfXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoID0gc3ViamVjdC5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgoX2EgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FbcHJvcGVydHlQYXRoXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiUkVQTEFDRShcIiArIHByb3BlcnR5UGF0aCArIFwiLCAnXCIgKyBvbGRQYXJlbnRQYXRoICsgZW50aXR5UGF0aCArIFwiLicsICdcIiArIG5ld1BhcmVudFBhdGggKyBlbnRpdHlQYXRoICsgXCIuJylcIjsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUocHJvcGVydHlQYXRoICsgXCIgTElLRSA6cGF0aFwiLCB7IHBhdGg6IFwiXCIgKyBvbGRQYXJlbnRQYXRoICsgZW50aXR5UGF0aCArIFwiLiVcIiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldEVudGl0eVBhdGggPSBmdW5jdGlvbiAoc3ViamVjdCwgaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlclxuICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAuc2VsZWN0KHN1YmplY3QubWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiLlwiICsgc3ViamVjdC5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCwgXCJwYXRoXCIpXG4gICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldCwgc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgLndoZXJlSW5JZHMoaWQpXG4gICAgICAgICAgICAuZ2V0UmF3T25lKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdFtcInBhdGhcIl0gOiB1bmRlZmluZWQ7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE1hdGVyaWFsaXplZFBhdGhTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgTWF0ZXJpYWxpemVkUGF0aFN1YmplY3RFeGVjdXRvciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXRlcmlhbGl6ZWRQYXRoU3ViamVjdEV4ZWN1dG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgTmVzdGVkU2V0TXVsdGlwbGVSb290RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvTmVzdGVkU2V0TXVsdGlwbGVSb290RXJyb3JcIjtcbnZhciBOZXN0ZWRTZXRJZHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVzdGVkU2V0SWRzKCkge1xuICAgIH1cbiAgICByZXR1cm4gTmVzdGVkU2V0SWRzO1xufSgpKTtcbi8qKlxuICogRXhlY3V0ZXMgc3ViamVjdCBvcGVyYXRpb25zIGZvciBuZXN0ZWQgc2V0IHRyZWUgZW50aXRpZXMuXG4gKi9cbnZhciBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIE5lc3RlZFNldFN1YmplY3RFeGVjdXRvcihxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBvcGVyYXRpb25zIHdoZW4gc3ViamVjdCBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIHRhYmxlTmFtZSwgbGVmdENvbHVtbk5hbWUsIHJpZ2h0Q29sdW1uTmFtZSwgcGFyZW50LCBwYXJlbnRJZCwgcGFyZW50TnNSaWdodCwgaXNVbmlxdWVSb290O1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKHN1YmplY3QubWV0YWRhdGEudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5OYW1lID0gZXNjYXBlKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRDb2x1bW5OYW1lID0gZXNjYXBlKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmdldEVudGl0eVZhbHVlKHN1YmplY3QuZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50ICYmIHN1YmplY3QucGFyZW50U3ViamVjdCAmJiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5KSAvLyBpZiBlbnRpdHkgd2FzIGF0dGFjaGVkIHZpYSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHN1YmplY3QucGFyZW50U3ViamVjdC5pbnNlcnRlZFZhbHVlU2V0ID8gc3ViamVjdC5wYXJlbnRTdWJqZWN0Lmluc2VydGVkVmFsdWVTZXQgOiBzdWJqZWN0LnBhcmVudFN1YmplY3QuZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROc1JpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRJZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3Qoc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLnByb3BlcnR5UGF0aCwgXCJyaWdodFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShzdWJqZWN0Lm1ldGFkYXRhLnRhcmdldCwgc3ViamVjdC5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhwYXJlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJhd09uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0ID8gcmVzdWx0W1wicmlnaHRcIl0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvY2tyb2FjaERCIHJldHVybnMgbnVtZXJpYyB0eXBlcyBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TnNSaWdodCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocGFyZW50TnNSaWdodCAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgU0VUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlZnRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFdIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiID4gXCIgKyBwYXJlbnROc1JpZ2h0ICsgXCIgVEhFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgKyAyIEVMU0UgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIEVORCxcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiICsgMiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVSRSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiID49IFwiICsgcGFyZW50TnNSaWdodCkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCwgc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKHBhcmVudE5zUmlnaHQpLCBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKHBhcmVudE5zUmlnaHQgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmlzVW5pcXVlUm9vdEVudGl0eShzdWJqZWN0LCBwYXJlbnQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWVSb290ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgYSByb290IGVudGl0eSBhbHJlYWR5IGV4aXRzIGFuZCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbmlxdWVSb290KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgT3JtVXRpbHMubWVyZ2VEZWVwKHN1YmplY3QuaW5zZXJ0ZWRWYWx1ZVNldCwgc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKDEpLCBzdWJqZWN0Lm1ldGFkYXRhLm5lc3RlZFNldFJpZ2h0Q29sdW1uLmNyZWF0ZVZhbHVlTWFwKDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQsIGVudGl0eSwgb2xkUGFyZW50LCBvbGRQYXJlbnRJZCwgcGFyZW50SWQsIGVzY2FwZV8xLCB0YWJsZU5hbWUsIGxlZnRDb2x1bW5OYW1lLCByaWdodENvbHVtbk5hbWUsIGVudGl0eUlkLCBlbnRpdHlOcywgcGFyZW50TnMsIGlzTW92aW5nVXAsIHRyZWVTaXplLCBlbnRpdHlTaXplLCB1cGRhdGVMZWZ0U2lkZSwgdXBkYXRlUmlnaHRTaWRlLCBpc1VuaXF1ZVJvb3Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uZ2V0RW50aXR5VmFsdWUoc3ViamVjdC5lbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQgJiYgc3ViamVjdC5wYXJlbnRTdWJqZWN0ICYmIHN1YmplY3QucGFyZW50U3ViamVjdC5lbnRpdHkpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc3ViamVjdC5wYXJlbnRTdWJqZWN0LmVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHN1YmplY3QuZGF0YWJhc2VFbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eSAmJiBwYXJlbnQpIC8vIGlmIGVudGl0eSB3YXMgYXR0YWNoZWQgdmlhIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gc3ViamVjdC5tZXRhZGF0YS50cmVlQ2hpbGRyZW5SZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShwYXJlbnQpLmZpbmQoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdWJqZWN0LmlkZW50aWZpZXIpLmV2ZXJ5KGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRba2V5XSA9PT0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhpdCBpZiB0aGUgcGFyZW50IG9yIHRoZSBlbnRpdHkgd2hlcmUgbmV2ZXIgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnQgPSBzdWJqZWN0Lm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKG9sZFBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IHN1YmplY3QubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4aXQgaWYgdGhlIG5ldyBhbmQgb2xkIHBhcmVudHMgYXJlIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT3JtVXRpbHMuY29tcGFyZUlkcyhvbGRQYXJlbnRJZCwgcGFyZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlXzEgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShzdWJqZWN0Lm1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uTmFtZSA9IGVzY2FwZV8xKHN1YmplY3QubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRDb2x1bW5OYW1lID0gZXNjYXBlXzEoc3ViamVjdC5tZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSBzdWJqZWN0Lm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlOcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXROZXN0ZWRTZXRJZHMoc3ViamVjdC5tZXRhZGF0YSwgZW50aXR5SWQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5TnMgPSAoX2Euc2VudCgpKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudElkKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZ2V0TmVzdGVkU2V0SWRzKHN1YmplY3QubWV0YWRhdGEsIHBhcmVudElkKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5zID0gKF9hLnNlbnQoKSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGVudGl0eU5zICE9PSB1bmRlZmluZWQgJiYgcGFyZW50TnMgIT09IHVuZGVmaW5lZCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3ZpbmdVcCA9IHBhcmVudE5zLmxlZnQgPiBlbnRpdHlOcy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVNpemUgPSBlbnRpdHlOcy5yaWdodCAtIGVudGl0eU5zLmxlZnQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U2l6ZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vdmluZ1VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U2l6ZSA9IHBhcmVudE5zLmxlZnQgLSBlbnRpdHlOcy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVNpemUgPSBwYXJlbnROcy5yaWdodCAtIGVudGl0eU5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMZWZ0U2lkZSA9IFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPj0gXCIgKyBlbnRpdHlOcy5sZWZ0ICsgXCIgQU5EIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVmdENvbHVtbk5hbWUgKyBcIiA8IFwiICsgZW50aXR5TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiICsgXCIgKyBlbnRpdHlTaXplICsgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmlnaHRTaWRlID0gXCJXSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLmxlZnQgKyBcIiBBTkQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodENvbHVtbk5hbWUgKyBcIiA8PSBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJUSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgKyBcIiArIGVudGl0eVNpemUgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTW92aW5nVXApIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIlVQREFURSBcIiArIHRhYmxlTmFtZSArIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiU0VUIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiA9IENBU0UgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZWZ0Q29sdW1uTmFtZSArIFwiIDw9IFwiICsgcGFyZW50TnMubGVmdCArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIC0gXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxlZnRTaWRlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiRUxTRSBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkQsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0Q29sdW1uTmFtZSArIFwiID0gQ0FTRSBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVOIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgPiBcIiArIGVudGl0eU5zLnJpZ2h0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodENvbHVtbk5hbWUgKyBcIiA8IFwiICsgcGFyZW50TnMubGVmdCArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiAtIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSaWdodFNpZGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJFTFNFIFwiICsgcmlnaHRDb2x1bW5OYW1lICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlNFVCBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIGxlZnRDb2x1bW5OYW1lICsgXCIgPCBcIiArIGVudGl0eU5zLmxlZnQgKyBcIiBBTkQgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVmdENvbHVtbk5hbWUgKyBcIiA+IFwiICsgcGFyZW50TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiICsgXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGVmdFNpZGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkVMU0UgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkQsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiV0hFTiBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIDwgXCIgKyBlbnRpdHlOcy5sZWZ0ICsgXCIgQU5EIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0Q29sdW1uTmFtZSArIFwiID49IFwiICsgcGFyZW50TnMucmlnaHQgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlRIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiArIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJpZ2h0U2lkZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiRUxTRSBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFTkRcIildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuaXNVbmlxdWVSb290RW50aXR5KHN1YmplY3QsIHBhcmVudCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWVSb290ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgYSByb290IGVudGl0eSBhbHJlYWR5IGV4aXRzIGFuZCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVbmlxdWVSb290KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOZXN0ZWRTZXRNdWx0aXBsZVJvb3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogRXhlY3V0ZXMgb3BlcmF0aW9ucyB3aGVuIHN1YmplY3QgaXMgYmVpbmcgcmVtb3ZlZC5cbiAgICAqL1xuICAgIE5lc3RlZFNldFN1YmplY3RFeGVjdXRvci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHN1YmplY3RzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgZXNjYXBlLCB0YWJsZU5hbWUsIGxlZnRDb2x1bW5OYW1lLCByaWdodENvbHVtbk5hbWUsIGVudGl0aWVzSWRzLCBzdWJqZWN0c18xLCBzdWJqZWN0c18xXzEsIHN1YmplY3QsIGVudGl0eUlkLCBlbnRpdGllc05zLCBlbnRpdGllc05zXzEsIGVudGl0aWVzTnNfMV8xLCBlbnRpdHksIHRyZWVTaXplLCBlXzFfMTtcbiAgICAgICAgICAgIHZhciBlXzIsIF9hLCBlXzEsIF9iO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJqZWN0cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdHMgPSBbc3ViamVjdHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBzdWJqZWN0c1swXS5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZSA9IHRoaXMuZ2V0VGFibGVOYW1lKG1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uTmFtZSA9IGVzY2FwZShtZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodENvbHVtbk5hbWUgPSBlc2NhcGUobWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzSWRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc3ViamVjdHNfMSA9IF9fdmFsdWVzKHN1YmplY3RzKSwgc3ViamVjdHNfMV8xID0gc3ViamVjdHNfMS5uZXh0KCk7ICFzdWJqZWN0c18xXzEuZG9uZTsgc3ViamVjdHNfMV8xID0gc3ViamVjdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IHN1YmplY3RzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSBtZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChzdWJqZWN0LmVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNJZHMucHVzaChlbnRpdHlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3RzXzFfMSAmJiAhc3ViamVjdHNfMV8xLmRvbmUgJiYgKF9hID0gc3ViamVjdHNfMS5yZXR1cm4pKSBfYS5jYWxsKHN1YmplY3RzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldE5lc3RlZFNldElkcyhtZXRhZGF0YSwgZW50aXRpZXNJZHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNOcyA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsyLCA3LCA4LCA5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllc05zXzEgPSBfX3ZhbHVlcyhlbnRpdGllc05zKSwgZW50aXRpZXNOc18xXzEgPSBlbnRpdGllc05zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFlbnRpdGllc05zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IGVudGl0aWVzTnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVNpemUgPSBlbnRpdHkucmlnaHQgLSBlbnRpdHkubGVmdCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnF1ZXJ5KFwiVVBEQVRFIFwiICsgdGFibGVOYW1lICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJTRVQgXCIgKyBsZWZ0Q29sdW1uTmFtZSArIFwiID0gQ0FTRSBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJXSEVOIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiA+IFwiICsgZW50aXR5LmxlZnQgKyBcIiBUSEVOIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiAtIFwiICsgdHJlZVNpemUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJFTFNFIFwiICsgbGVmdENvbHVtbk5hbWUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVORCwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHRDb2x1bW5OYW1lICsgXCIgPSBDQVNFIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIldIRU4gXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiA+IFwiICsgZW50aXR5LnJpZ2h0ICsgXCIgVEhFTiBcIiArIHJpZ2h0Q29sdW1uTmFtZSArIFwiIC0gXCIgKyB0cmVlU2l6ZSArIFwiIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkVMU0UgXCIgKyByaWdodENvbHVtbk5hbWUgKyBcIiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVORFwiKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNOc18xXzEgPSBlbnRpdGllc05zXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMV8xID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllc05zXzFfMSAmJiAhZW50aXRpZXNOc18xXzEuZG9uZSAmJiAoX2IgPSBlbnRpdGllc05zXzEucmV0dXJuKSkgX2IuY2FsbChlbnRpdGllc05zXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXN0ZWQgc2V0IGlkcyBmb3IgYSBnaXZlbiBlbnRpdHlcbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldE5lc3RlZFNldElkcyA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgaWRzKSB7XG4gICAgICAgIHZhciBzZWxlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBtZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIHJpZ2h0OiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBtZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5wcm9wZXJ0eVBhdGhcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHF1ZXJ5QnVpbGRlciA9IHRoaXMucXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc2VsZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwga2V5ID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgICAgICBxdWVyeUJ1aWxkZXIuYWRkU2VsZWN0KHZhbHVlLCBrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgLmZyb20obWV0YWRhdGEudGFyZ2V0LCBtZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgLndoZXJlSW5JZHMoaWRzKVxuICAgICAgICAgICAgLm9yZGVyQnkoc2VsZWN0LnJpZ2h0LCBcIkRFU0NcIilcbiAgICAgICAgICAgIC5nZXRSYXdNYW55KClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYSwgZV80LCBfYjtcbiAgICAgICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHJlc3VsdHNfMSA9IF9fdmFsdWVzKHJlc3VsdHMpLCByZXN1bHRzXzFfMSA9IHJlc3VsdHNfMS5uZXh0KCk7ICFyZXN1bHRzXzFfMS5kb25lOyByZXN1bHRzXzFfMSA9IHJlc3VsdHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9jID0gKGVfNCA9IHZvaWQgMCwgX192YWx1ZXMoT2JqZWN0LmtleXMoc2VsZWN0KSkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdCA/IHJlc3VsdFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvY2tyb2FjaERCIHJldHVybnMgbnVtZXJpYyB0eXBlcyBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVtrZXldID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gcGFyc2VJbnQodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfNF8xKSB7IGVfNCA9IHsgZXJyb3I6IGVfNF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0c18xXzEgJiYgIXJlc3VsdHNfMV8xLmRvbmUgJiYgKF9hID0gcmVzdWx0c18xLnJldHVybikpIF9hLmNhbGwocmVzdWx0c18xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yLnByb3RvdHlwZS5pc1VuaXF1ZVJvb3RFbnRpdHkgPSBmdW5jdGlvbiAoc3ViamVjdCwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlc2NhcGUsIHRhYmxlTmFtZSwgcGFyYW1ldGVycywgd2hlcmVDb25kaXRpb24sIGNvdW50QWxpYXMsIHJlc3VsdDtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWUgPSB0aGlzLmdldFRhYmxlTmFtZShzdWJqZWN0Lm1ldGFkYXRhLnRhYmxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbiA9IHN1YmplY3QubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSBlc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlciA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uTmFtZSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVQYXJhbWV0ZXIoXCJlbnRpdHlfXCIgKyBjb2x1bW4uZGF0YWJhc2VOYW1lLCBwYXJhbWV0ZXJzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5OYW1lICsgXCIgPSBcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFsaWFzID0gXCJjb3VudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5xdWVyeShcIlNFTEVDVCBDT1VOVCgxKSBBUyBcIiArIGVzY2FwZShjb3VudEFsaWFzKSArIFwiIEZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBXSEVSRSBcIiArIHdoZXJlQ29uZGl0aW9uLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwYXJzZUludChyZXN1bHQucmVjb3Jkc1swXVtjb3VudEFsaWFzXSkgPT09IDBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZXNjYXBlZCB0YWJsZSBuYW1lIHdpdGggc2NoZW1hIG5hbWUgaWYgU3FsU2VydmVyIG9yIFBvc3RncmVzIGRyaXZlciB1c2VkIHdpdGggY3VzdG9tXG4gICAgICogc2NoZW1hIG5hbWUsIG90aGVyd2lzZSByZXR1cm5zIGVzY2FwZWQgdGFibGUgbmFtZS5cbiAgICAgKi9cbiAgICBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3IucHJvdG90eXBlLmdldFRhYmxlTmFtZSA9IGZ1bmN0aW9uICh0YWJsZVBhdGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRhYmxlUGF0aC5zcGxpdChcIi5cIilcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgY29uZGl0aW9uIG5lZWQgYmVjYXVzZSBpbiBTUUwgU2VydmVyIGRyaXZlciB3aGVuIGN1c3RvbSBkYXRhYmFzZSBuYW1lIHdhcyBzcGVjaWZpZWQgYW5kIHNjaGVtYSBuYW1lIHdhcyBub3QsIHdlIGdvdCBgZGJOYW1lLi50YWJsZU5hbWVgIHN0cmluZywgYW5kIGRvZXNuJ3QgbmVlZCB0byBlc2NhcGUgbWlkZGxlIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgcmV0dXJuIGkgPT09IFwiXCIgPyBpIDogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGkpO1xuICAgICAgICB9KS5qb2luKFwiLlwiKTtcbiAgICB9O1xuICAgIHJldHVybiBOZXN0ZWRTZXRTdWJqZWN0RXhlY3V0b3I7XG59KCkpO1xuZXhwb3J0IHsgTmVzdGVkU2V0U3ViamVjdEV4ZWN1dG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5lc3RlZFNldFN1YmplY3RFeGVjdXRvci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogRHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqXG4gKiBJZiB3ZSBkb24ndCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucyB0eXBlb3JtIHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gcnVudGltZVxuICogYXMgd2VsbCBhcyBkdXJpbmcgd2VicGFjayBidWlsZHMuXG4gKi9cbnZhciBDb25uZWN0aW9uT3B0aW9uc0VudlJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uT3B0aW9uc0VudlJlYWRlcigpIHtcbiAgICB9XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNFbnZSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBjb25uZWN0aW9uIG9wdGlvbnMgaW4gYSBicm93c2VyIGNvbnRleHQuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIENvbm5lY3Rpb25PcHRpb25zRW52UmVhZGVyO1xufSgpKTtcbmV4cG9ydCB7IENvbm5lY3Rpb25PcHRpb25zRW52UmVhZGVyIH07XG4vKipcbiAqIER1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHMuXG4gKlxuICogSWYgd2UgZG9uJ3QgaW5jbHVkZSB0aGVzZSBmdW5jdGlvbnMgdHlwZW9ybSB3aWxsIHRocm93IGFuIGVycm9yIG9uIHJ1bnRpbWVcbiAqIGFzIHdlbGwgYXMgZHVyaW5nIHdlYnBhY2sgYnVpbGRzLlxuICovXG52YXIgQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIoKSB7XG4gICAgfVxuICAgIENvbm5lY3Rpb25PcHRpb25zWG1sUmVhZGVyLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIGNvbm5lY3Rpb24gb3B0aW9ucyBpbiBhIGJyb3dzZXIgY29udGV4dC5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk9wdGlvbnNYbWxSZWFkZXIgfTtcbi8qKlxuICogRHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqXG4gKiBJZiB3ZSBkb24ndCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucyB0eXBlb3JtIHdpbGwgdGhyb3cgYW4gZXJyb3Igb24gcnVudGltZVxuICogYXMgd2VsbCBhcyBkdXJpbmcgd2VicGFjayBidWlsZHMuXG4gKi9cbnZhciBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlcigpIHtcbiAgICB9XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNZbWxSZWFkZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgY29ubmVjdGlvbiBvcHRpb25zIGluIGEgYnJvd3NlciBjb250ZXh0LlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBDb25uZWN0aW9uT3B0aW9uc1ltbFJlYWRlciB9O1xuLyoqXG4gKiBEdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzLlxuICpcbiAqIElmIHdlIGRvbid0IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lXG4gKiBhcyB3ZWxsIGFzIGR1cmluZyB3ZWJwYWNrIGJ1aWxkcy5cbiAqL1xudmFyIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyKCkge1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9uc1JlYWRlci5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlYWQgY29ubmVjdGlvbiBvcHRpb25zIGluIGEgYnJvd3NlciBjb250ZXh0LlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbm5lY3Rpb25PcHRpb25zUmVhZGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBjb25uZWN0aW9uIG9wdGlvbnMgaW4gYSBicm93c2VyIGNvbnRleHQuXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIGNvbm5lY3Rpb24gb3B0aW9ucyBpbiBhIGJyb3dzZXIgY29udGV4dC5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ubmVjdGlvbk9wdGlvbnNSZWFkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rpb25PcHRpb25zUmVhZGVyRHVtbXkuanMubWFwXG4iLCIvKipcbiAqIER1bW15IGZ1bmN0aW9ucyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzLlxuICpcbiAqIElmIHdlIGRvbid0IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lXG4gKiBhcyB3ZWxsIGFzIGR1cmluZyB3ZWJwYWNrIGJ1aWxkcy5cbiAqL1xuLyoqXG4gKiBMb2FkcyBhbGwgZXhwb3J0ZWQgY2xhc3NlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRDbGFzc2VzRnJvbURpcmVjdG9yaWVzKGxvZ2dlciwgZGlyZWN0b3JpZXMsIGZvcm1hdHMpIHtcbiAgICBpZiAoZm9ybWF0cyA9PT0gdm9pZCAwKSB7IGZvcm1hdHMgPSBbXCIuanNcIiwgXCIuY2pzXCIsIFwiLnRzXCJdOyB9XG4gICAgcmV0dXJuIFtdO1xufVxuLyoqXG4gKiBMb2FkcyBhbGwganNvbiBmaWxlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBvcnRKc29uc0Zyb21EaXJlY3RvcmllcyhkaXJlY3RvcmllcywgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7IGZvcm1hdCA9IFwiLmpzb25cIjsgfVxuICAgIHJldHVybiBbXTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckRpcmVjdG9yeUV4cG9ydGVkQ2xhc3Nlc0xvYWRlci5qcy5tYXBcbiIsIi8qKlxuICogRHVtbXkgZHJpdmVyIGNsYXNzZXMgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkcy5cbiAqIFVzaW5nIHRob3NlIGNsYXNzZXMgcmVkdWNlcyB0aGUgYnVpbGQgc2l6ZSBieSBvbmUgdGhpcmQuXG4gKlxuICogSWYgd2UgZG9uJ3QgaW5jbHVkZSB0aG9zZSBkdW1teSBjbGFzc2VzIChhbmQganVzdCBkaXNhYmxlIHRoZSBkcml2ZXIgaW1wb3J0XG4gKiB3aXRoIGBmYWxzZWAgaW4gYHBhY2thZ2UuanNvbmApIHR5cGVvcm0gd2lsbCB0aHJvdyBhbiBlcnJvciBvbiBydW50aW1lIGFuZFxuICogZHVyaW5nIHdlYnBhY2sgYnVpbGRzIGV2ZW4gaWYgdGhvc2UgZHJpdmVyIGFyZSBub3QgdXNlZC5cbiAqL1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE1vbmdvRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vbmdvRHJpdmVyKCkge1xuICAgIH1cbiAgICByZXR1cm4gTW9uZ29Ecml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgTW9uZ29Ecml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBNb25nb1F1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1vbmdvUXVlcnlSdW5uZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBNb25nb1F1ZXJ5UnVubmVyO1xufSgpKTtcbmV4cG9ydCB7IE1vbmdvUXVlcnlSdW5uZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBNb25nb0VudGl0eU1hbmFnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9uZ29FbnRpdHlNYW5hZ2VyKCkge1xuICAgIH1cbiAgICByZXR1cm4gTW9uZ29FbnRpdHlNYW5hZ2VyO1xufSgpKTtcbmV4cG9ydCB7IE1vbmdvRW50aXR5TWFuYWdlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE1vbmdvUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb25nb1JlcG9zaXRvcnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBNb25nb1JlcG9zaXRvcnk7XG59KCkpO1xuZXhwb3J0IHsgTW9uZ29SZXBvc2l0b3J5IH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgUG9zdGdyZXNEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUG9zdGdyZXNEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBQb3N0Z3Jlc0RyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBQb3N0Z3Jlc0RyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIEF1cm9yYURhdGFBcGlEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXVyb3JhRGF0YUFwaURyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIENvY2tyb2FjaERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2Nrcm9hY2hEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBDb2Nrcm9hY2hEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgQXVyb3JhRGF0YUFwaVBvc3RncmVzRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEF1cm9yYURhdGFBcGlQb3N0Z3Jlc0RyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBBdXJvcmFEYXRhQXBpUG9zdGdyZXNEcml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBTcWxTZXJ2ZXJEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3FsU2VydmVyRHJpdmVyKCkge1xuICAgIH1cbiAgICByZXR1cm4gU3FsU2VydmVyRHJpdmVyO1xufSgpKTtcbmV4cG9ydCB7IFNxbFNlcnZlckRyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIFNhcERyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTYXBEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBTYXBEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgU2FwRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgTXlzcWxEcml2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTXlzcWxEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBNeXNxbERyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBNeXNxbERyaXZlciB9O1xuLyoqXG4gKiBETyBOT1QgSU1QT1JUIFRISVMgQ0xBU1MgLVxuICogVGhpcyBpcyBhIGR1bW15IGNsYXNzIGZvciByZXBsYWNlbWVudCB2aWEgYHBhY2thZ2UuanNvbmAgaW4gYnJvd3NlciBidWlsZHNcbiAqL1xudmFyIE9yYWNsZURyaXZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPcmFjbGVEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBPcmFjbGVEcml2ZXI7XG59KCkpO1xuZXhwb3J0IHsgT3JhY2xlRHJpdmVyIH07XG4vKipcbiAqIERPIE5PVCBJTVBPUlQgVEhJUyBDTEFTUyAtXG4gKiBUaGlzIGlzIGEgZHVtbXkgY2xhc3MgZm9yIHJlcGxhY2VtZW50IHZpYSBgcGFja2FnZS5qc29uYCBpbiBicm93c2VyIGJ1aWxkc1xuICovXG52YXIgU3FsaXRlRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNxbGl0ZURyaXZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIFNxbGl0ZURyaXZlcjtcbn0oKSk7XG5leHBvcnQgeyBTcWxpdGVEcml2ZXIgfTtcbi8qKlxuICogRE8gTk9UIElNUE9SVCBUSElTIENMQVNTIC1cbiAqIFRoaXMgaXMgYSBkdW1teSBjbGFzcyBmb3IgcmVwbGFjZW1lbnQgdmlhIGBwYWNrYWdlLmpzb25gIGluIGJyb3dzZXIgYnVpbGRzXG4gKi9cbnZhciBCZXR0ZXJTcWxpdGUzRHJpdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJldHRlclNxbGl0ZTNEcml2ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBCZXR0ZXJTcWxpdGUzRHJpdmVyO1xufSgpKTtcbmV4cG9ydCB7IEJldHRlclNxbGl0ZTNEcml2ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckRpc2FibGVkRHJpdmVyc0R1bW15LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIFBlcmZvcm1zIGxvZ2dpbmcgb2YgdGhlIGV2ZW50cyBpbiBUeXBlT1JNLlxuICogVGhpcyB2ZXJzaW9uIG9mIGxvZ2dlciBsb2dzIGV2ZXJ5dGhpbmcgaW50byBvcm1sb2dzLmxvZyBmaWxlLlxuICovXG52YXIgRHVtbXlMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRHVtbXlMb2dnZXIoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBmYWlsZWQuXG4gICAgICovXG4gICAgRHVtbXlMb2dnZXIucHJvdG90eXBlLmxvZ1F1ZXJ5RXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgcXVlcnkgdGhhdCBpcyBzbG93LlxuICAgICAqL1xuICAgIER1bW15TG9nZ2VyLnByb3RvdHlwZS5sb2dRdWVyeVNsb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBsb2dnZXIgaXMgbm90IGFwcGxpY2FibGUgaW4gYSBicm93c2VyIGNvbnRleHQnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvZ3MgZXZlbnRzIGZyb20gdGhlIHNjaGVtYSBidWlsZCBwcm9jZXNzLlxuICAgICAqL1xuICAgIER1bW15TG9nZ2VyLnByb3RvdHlwZS5sb2dTY2hlbWFCdWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGxvZ2dlciBpcyBub3QgYXBwbGljYWJsZSBpbiBhIGJyb3dzZXIgY29udGV4dCcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9ncyBldmVudHMgZnJvbSB0aGUgbWlncmF0aW9ucyBydW4gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nTWlncmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbG9nZ2VyIGlzIG5vdCBhcHBsaWNhYmxlIGluIGEgYnJvd3NlciBjb250ZXh0Jyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGxvZ2dpbmcgdXNpbmcgZ2l2ZW4gbG9nZ2VyLCBvciBieSBkZWZhdWx0IHRvIHRoZSBjb25zb2xlLlxuICAgICAqIExvZyBoYXMgaXRzIG93biBsZXZlbCBhbmQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBEdW1teUxvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbG9nZ2VyIGlzIG5vdCBhcHBsaWNhYmxlIGluIGEgYnJvd3NlciBjb250ZXh0Jyk7XG4gICAgfTtcbiAgICByZXR1cm4gRHVtbXlMb2dnZXI7XG59KCkpO1xuZXhwb3J0IHsgRHVtbXlMb2dnZXIgfTtcbnZhciBGaWxlTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWxlTG9nZ2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbGVMb2dnZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZpbGVMb2dnZXI7XG59KER1bW15TG9nZ2VyKSk7XG5leHBvcnQgeyBGaWxlTG9nZ2VyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJGaWxlTG9nZ2VyRHVtbXkuanMubWFwXG4iLCIvKipcbiAqIEJyb3dzZXIncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgdG9vbHMuXG4gKlxuICogVGhpcyBmaWxlIGdvbm5hIHJlcGxhY2UgUGxhdGZvcm1Ub29scyBmb3IgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqIEZvciBub2RlLmpzIGVudmlyb25tZW50IHRoaXMgY2xhc3MgaXMgbm90IGdldHRpbmcgcGFja2FnZWQuXG4gKiBEb24ndCB1c2UgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGluIHRoZSBjb2RlLCB1c2UgUGxhdGZvcm1Ub29scyBtZXRob2RzIGluc3RlYWQuXG4gKi9cbnZhciBQbGF0Zm9ybVRvb2xzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYXRmb3JtVG9vbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIGdsb2JhbCBzdHVmZiBjYW4gYmUgc3RvcmVkLlxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMuZ2V0R2xvYmFsVmFyaWFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmF0aXZlU2NyaXB0IHVzZXMgZ2xvYmFsLCBub3Qgd2luZG93XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyAoXCJyZXF1aXJlXCItcykgZ2l2ZW4gZmlsZSBvciBwYWNrYWdlLlxuICAgICAqIFRoaXMgb3BlcmF0aW9uIG9ubHkgc3VwcG9ydHMgb24gbm9kZSBwbGF0Zm9ybVxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMubG9hZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcmVxdWlyZShcXFwiXCIgKyBuYW1lICsgXCJcXFwiKS5cIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBnaXZlbiBwYXRoLiBEb2VzIFwicGF0aC5ub3JtYWxpemVcIi5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLnBhdGhOb3JtYWxpemUgPSBmdW5jdGlvbiAocGF0aFN0cikge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IHBhdGgubm9ybWFsaXplKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGZpbGUgZXh0ZW5zaW9uLiBEb2VzIFwicGF0aC5leHRuYW1lXCIuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5wYXRoRXh0bmFtZSA9IGZ1bmN0aW9uIChwYXRoU3RyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcGF0aC5leHRuYW1lKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlZCBnaXZlbiBwYXRoLiBEb2VzIFwicGF0aC5yZXNvbHZlXCIuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5wYXRoUmVzb2x2ZSA9IGZ1bmN0aW9uIChwYXRoU3RyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBvcHRpb24vZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC4gRmFpbGVkIG9wZXJhdGlvbjogcGF0aC5yZXNvbHZlKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGNoZWNrcyBpZiBmaWxlIGV4aXN0LiBEb2VzIFwiZnMuZXhpc3RzU3luY1wiLlxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMuZmlsZUV4aXN0ID0gZnVuY3Rpb24gKHBhdGhTdHIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gXCJicm93c2VyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBmcy5leGlzdHNTeW5jKFxcXCJcIiArIHBhdGhTdHIgKyBcIlxcXCIpLlwiKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy5kb3RlbnYgPSBmdW5jdGlvbiAocGF0aFN0cikge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGRvdGVudi5jb25maWcoeyBwYXRoOiBcXFwiXCIgKyBwYXRoU3RyICsgXCJcXFwiIH0pLlwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5nZXRFbnZWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnR5cGUgPT09IFwiYnJvd3NlclwiKVxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBwcm9jZXNzLmVudltcIiR7bmFtZX1cIl0uYCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLnJlYWRGaWxlU3luYyA9IGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGZzLnJlYWRGaWxlU3luYyhcXFwiXCIgKyBmaWxlbmFtZSArIFwiXFxcIikuXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFBsYXRmb3JtVG9vbHMuYXBwZW5kRmlsZVN5bmMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gXCJicm93c2VyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9wdGlvbi9mdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIGVudmlyb25tZW50LiBGYWlsZWQgb3BlcmF0aW9uOiBmcy5hcHBlbmRGaWxlU3luYyhcXFwiXCIgKyBmaWxlbmFtZSArIFwiXFxcIikuXCIpO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy53cml0ZUZpbGUgPSBmdW5jdGlvbiAocGF0aCwgZGF0YSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSBcImJyb3dzZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgb3B0aW9uL2Z1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZhaWxlZCBvcGVyYXRpb246IGZzLndyaXRlRmlsZShcXFwiXCIgKyBwYXRoICsgXCJcXFwiKS5cIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChudWxsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhpZ2hsaWdodHMgc3FsIHN0cmluZyB0byBiZSBwcmludCBpbiB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLmhpZ2hsaWdodFNxbCA9IGZ1bmN0aW9uIChzcWwpIHtcbiAgICAgICAgcmV0dXJuIHNxbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhpZ2hsaWdodHMganNvbiBzdHJpbmcgdG8gYmUgcHJpbnQgaW4gdGhlIGNvbnNvbGUuXG4gICAgICovXG4gICAgUGxhdGZvcm1Ub29scy5oaWdobGlnaHRKc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIGZ1bmN0aW9ucyBuZWVkZWQgYnkgQWR2YW5jZWRDb25zb2xlTG9nZ2VyIChidXQgaGVyZSB3aXRob3V0IGNoYWxrKVxuICAgICAqL1xuICAgIFBsYXRmb3JtVG9vbHMubG9nSW5mbyA9IGZ1bmN0aW9uIChwcmVmaXgsIGluZm8pIHtcbiAgICAgICAgY29uc29sZS5pbmZvKHByZWZpeCArIFwiIFwiLCBpbmZvKTtcbiAgICB9O1xuICAgIFBsYXRmb3JtVG9vbHMubG9nRXJyb3IgPSBmdW5jdGlvbiAocHJlZml4LCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHByZWZpeCArIFwiIFwiLCBlcnJvcik7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLmxvZ1dhcm4gPSBmdW5jdGlvbiAocHJlZml4LCB3YXJuaW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihwcmVmaXggKyBcIiBcIiwgd2FybmluZyk7XG4gICAgfTtcbiAgICBQbGF0Zm9ybVRvb2xzLmxvZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH07XG4gICAgUGxhdGZvcm1Ub29scy53YXJuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBwbGF0Zm9ybS5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVRvb2xzLnR5cGUgPSBcImJyb3dzZXJcIjtcbiAgICByZXR1cm4gUGxhdGZvcm1Ub29scztcbn0oKSk7XG5leHBvcnQgeyBQbGF0Zm9ybVRvb2xzIH07XG4vKipcbiAqIFRoZXNlIGNsYXNzZXMgYXJlIG5lZWRlZCBmb3Igc3RyZWFtIG9wZXJhdGlvbnMgb3JcbiAqIGluIHRoZSBtb25nb2RiIGRyaXZlci4gQm90aCBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLlxuICovXG52YXIgRXZlbnRFbWl0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlcjtcbn0oKSk7XG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfTtcbnZhciBSZWFkYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWFkYWJsZSgpIHtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWRhYmxlO1xufSgpKTtcbmV4cG9ydCB7IFJlYWRhYmxlIH07XG52YXIgV3JpdGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gV3JpdGFibGUoKSB7XG4gICAgfVxuICAgIHJldHVybiBXcml0YWJsZTtcbn0oKSk7XG5leHBvcnQgeyBXcml0YWJsZSB9O1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlci9cIikuQnVmZmVyO1xufVxuLy8gTmF0aXZlU2NyaXB0IHVzZXMgZ2xvYmFsLCBub3Qgd2luZG93XG5pZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGdsb2JhbC5CdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyL1wiKS5CdWZmZXI7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJQbGF0Zm9ybVRvb2xzLmpzLm1hcFxuIiwiaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqL1xudmFyIEFsaWFzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsaWFzKGFsaWFzKSB7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBhbGlhcyB8fCB7fSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbGlhcy5wcm90b3R5cGUsIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS50YXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWxpYXMucHJvdG90eXBlLCBcImhhc01ldGFkYXRhXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLl9tZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBbGlhcy5wcm90b3R5cGUsIFwibWV0YWRhdGFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fbWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBnZXQgZW50aXR5IG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gYWxpYXMgXFxcIlwiICsgdGhpcy5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBBbGlhcztcbn0oKSk7XG5leHBvcnQgeyBBbGlhcyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BbGlhcy5qcy5tYXBcbiIsIi8qKlxuICogU3ludGF4IHN1Z2FyLlxuICogQWxsb3dzIHRvIHVzZSBicmFja2V0cyBpbiBXSEVSRSBleHByZXNzaW9ucyBmb3IgYmV0dGVyIHN5bnRheC5cbiAqL1xudmFyIEJyYWNrZXRzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEdpdmVuIFdIRVJFIHF1ZXJ5IGJ1aWxkZXIgdGhhdCB3aWxsIGJ1aWxkIGEgV0hFUkUgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgdGFrZW4gaW50byBicmFja2V0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCcmFja2V0cyh3aGVyZUZhY3RvcnkpIHtcbiAgICAgICAgdGhpcy53aGVyZUZhY3RvcnkgPSB3aGVyZUZhY3Rvcnk7XG4gICAgfVxuICAgIHJldHVybiBCcmFja2V0cztcbn0oKSk7XG5leHBvcnQgeyBCcmFja2V0cyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CcmFja2V0cy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2NvY2tyb2FjaGRiL0NvY2tyb2FjaERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgRGVsZXRlUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0L0RlbGV0ZVJlc3VsdFwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBEZWxldGVRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlbGV0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gRGVsZXRlUXVlcnlCdWlsZGVyKGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyLCBxdWVyeVJ1bm5lcikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVEZWxldGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHJldHVybiBzcWwudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIHJhdyBkYXRhYmFzZSByZXN1bHRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzcWwsIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCBxdWVyeVJlc3VsdCwgZGVsZXRlUmVzdWx0LCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsIDExLCAxNiwgMTldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VUcmFuc2FjdGlvbiA9PT0gdHJ1ZSAmJiBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkJlZm9yZVJlbW92ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5xdWVyeShzcWwsIHBhcmFtZXRlcnMsIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVSZXN1bHQgPSBEZWxldGVSZXN1bHQuZnJvbShxdWVyeVJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJBZnRlclJlbW92ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRlbGV0ZVJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxMiwgMTQsICwgMTVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZnJvbSA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSkge1xuICAgICAgICBlbnRpdHlUYXJnZXQgPSBlbnRpdHlUYXJnZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgPyBlbnRpdHlUYXJnZXQub3B0aW9ucy5uYW1lIDogZW50aXR5VGFyZ2V0O1xuICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKG1haW5BbGlhcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IFdIRVJFIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBXSEVSRSBjb25kaXRpb25zLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBEZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hbmRXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcImFuZFwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSkgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5kV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcldoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmV0dXJuaW5nID0gZnVuY3Rpb24gKHJldHVybmluZykge1xuICAgICAgICAvLyBub3QgYWxsIGRhdGFiYXNlcyBzdXBwb3J0IHJldHVybmluZy9vdXRwdXQgY2F1c2VcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyA9IHJldHVybmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBERUxFVEUgZXhwcmVzcyB1c2VkIHRvIHBlcmZvcm0gcXVlcnkuXG4gICAgICovXG4gICAgRGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVEZWxldGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpO1xuICAgICAgICB2YXIgd2hlcmVFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVXaGVyZUV4cHJlc3Npb24oKTtcbiAgICAgICAgdmFyIHJldHVybmluZ0V4cHJlc3Npb24gPSB0aGlzLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gIT09IFwiXCIgJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyBcIiBPVVRQVVQgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uICsgd2hlcmVFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiREVMRVRFIEZST00gXCIgKyB0YWJsZU5hbWUgKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZWxldGVRdWVyeUJ1aWxkZXI7XG59KFF1ZXJ5QnVpbGRlcikpO1xuZXhwb3J0IHsgRGVsZXRlUXVlcnlCdWlsZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZVF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBSYW5kb21HZW5lcmF0b3IgfSBmcm9tIFwiLi4vdXRpbC9SYW5kb21HZW5lcmF0b3JcIjtcbmltcG9ydCB7IEluc2VydFJlc3VsdCB9IGZyb20gXCIuL3Jlc3VsdC9JbnNlcnRSZXN1bHRcIjtcbmltcG9ydCB7IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1JldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBJbnNlcnRWYWx1ZXNNaXNzaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yXCI7XG5pbXBvcnQgeyBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciB9IGZyb20gXCIuL1JldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBCcm9hZGNhc3RlclJlc3VsdCB9IGZyb20gXCIuLi9zdWJzY3JpYmVyL0Jyb2FkY2FzdGVyUmVzdWx0XCI7XG5pbXBvcnQgeyBFbnRpdHlTY2hlbWEgfSBmcm9tIFwiLi4vZW50aXR5LXNjaGVtYS9FbnRpdHlTY2hlbWFcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBJbnNlcnRRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluc2VydFF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnNlcnRRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVJbnNlcnRFeHByZXNzaW9uKCk7XG4gICAgICAgIHJldHVybiBzcWwudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIHJhdyBkYXRhYmFzZSByZXN1bHRzLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlU2V0cywgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGJyb2FkY2FzdFJlc3VsdF8xLCBkZWNsYXJlU3FsLCBzZWxlY3RPdXRwdXRTcWwsIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLCByZXR1cm5pbmdDb2x1bW5zXzEsIF9hLCBfYiwgY29sdW1uUGF0aCwgX2MsIGluc2VydFNxbCwgcGFyYW1ldGVycywgc3RhdGVtZW50cywgc3FsLCBxdWVyeVJlc3VsdCwgaW5zZXJ0UmVzdWx0LCBicm9hZGNhc3RSZXN1bHRfMiwgZXJyb3JfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXRzID0gdGhpcy5nZXRWYWx1ZVNldHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZUVuZChcIi52YWx1ZSBzZXRzXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNlciBwYXNzZWQgZW1wdHkgYXJyYXkgb2YgZW50aXRpZXMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlcyBHaXRIdWIgaXNzdWVzICMzMTExIGFuZCAjNTczNC4gSWYgd2Ugd2VyZSB0byBsZXQgdGhpcyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3b3VsZCBydW4gaW50byBwcm9ibGVtcyBkb3duc3RyZWFtLCBsaWtlIHN1YnNjcmliZXJzIGdldHRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9rZWQgd2l0aCB0aGUgZW1wdHkgYXJyYXkgd2hlcmUgdGhleSBleHBlY3QgYW4gZW50aXR5LCBhbmQgU1FMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWVyaWVzIHdpdGggYW4gZW1wdHkgVkFMVUVTIGNsYXVzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVNldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgSW5zZXJ0UmVzdWx0KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMSwgMTMsIDE4LCAyMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0UmVzdWx0XzEgPSBuZXcgQnJvYWRjYXN0ZXJSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZVNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdEJlZm9yZUluc2VydEV2ZW50KGJyb2FkY2FzdFJlc3VsdF8xLCBfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgdmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBicm9hZGNhc3RSZXN1bHRfMS53YWl0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVTcWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0U3FsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gbmV3IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yKHF1ZXJ5UnVubmVyLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfYSA9IF9fdmFsdWVzKHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcpLCBfYiA9IF9hLm5leHQoKTsgIV9iLmRvbmU7IF9iID0gX2EubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5QYXRoID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmdDb2x1bW5zXzEucHVzaC5hcHBseShyZXR1cm5pbmdDb2x1bW5zXzEsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChjb2x1bW5QYXRoKSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2QgPSBfYS5yZXR1cm4pKSBfZC5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlU2V0cy5sZW5ndGggPiAxICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMgPSByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5nZXRJbnNlcnRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnNfMS5wdXNoLmFwcGx5KHJldHVybmluZ0NvbHVtbnNfMSwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiAhcmV0dXJuaW5nQ29sdW1uc18xLmluY2x1ZGVzKGMpOyB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuaW5nQ29sdW1uc18xLmxlbmd0aCA+IDAgJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVTcWwgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVWYXJpYWJsZURlY2xhcmF0aW9uKFwiQE91dHB1dFRhYmxlXCIsIHJldHVybmluZ0NvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0U3FsID0gXCJTRUxFQ1QgKiBGUk9NIEBPdXRwdXRUYWJsZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2MgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIGluc2VydFNxbCA9IF9jWzBdLCBwYXJhbWV0ZXJzID0gX2NbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzID0gW2RlY2xhcmVTcWwsIGluc2VydFNxbCwgc2VsZWN0T3V0cHV0U3FsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNxbCA9IHN0YXRlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzICE9IG51bGw7IH0pLmpvaW4oXCI7XFxuXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0ID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0ID0gSW5zZXJ0UmVzdWx0LmZyb20ocXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVwZGF0ZUVudGl0eSA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLnRpbWUoXCIudXBkYXRpbmcgZW50aXR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuaW5zZXJ0KGluc2VydFJlc3VsdCwgdmFsdWVTZXRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZShcIi51cGRhdGluZyBlbnRpdHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RSZXN1bHRfMiA9IG5ldyBCcm9hZGNhc3RlclJlc3VsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0QWZ0ZXJJbnNlcnRFdmVudChicm9hZGNhc3RSZXN1bHRfMiwgX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIHZhbHVlU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYnJvYWRjYXN0UmVzdWx0XzIud2FpdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDEyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiBcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKFwiLmNvbW1pdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGluc2VydFJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDIwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBJTlRPIHdoaWNoIGVudGl0eSdzIHRhYmxlIGluc2VydGlvbiB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW50byA9IGZ1bmN0aW9uIChlbnRpdHlUYXJnZXQsIGNvbHVtbnMpIHtcbiAgICAgICAgZW50aXR5VGFyZ2V0ID0gZW50aXR5VGFyZ2V0IGluc3RhbmNlb2YgRW50aXR5U2NoZW1hID8gZW50aXR5VGFyZ2V0Lm9wdGlvbnMubmFtZSA6IGVudGl0eVRhcmdldDtcbiAgICAgICAgdmFyIG1haW5BbGlhcyA9IHRoaXMuY3JlYXRlRnJvbUFsaWFzKGVudGl0eVRhcmdldCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMgPSBjb2x1bW5zIHx8IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRhYmxlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmV0dXJuaW5nID0gZnVuY3Rpb24gKHJldHVybmluZykge1xuICAgICAgICAvLyBub3QgYWxsIGRhdGFiYXNlcyBzdXBwb3J0IHJldHVybmluZy9vdXRwdXQgY2F1c2VcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyA9IHJldHVybmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciBpbnNlcnRpb24gb3BlcmF0aW9ucy5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnVwZGF0ZUVudGl0eSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYWRkaXRpb25hbCBPTiBDT05GTElDVCBzdGF0ZW1lbnQgc3VwcG9ydGVkIGluIHBvc3RncmVzIGFuZCBjb2Nrcm9hY2guXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYG9ySWdub3JlYCBvciBgb3JVcGRhdGVgXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vbkNvbmZsaWN0ID0gZnVuY3Rpb24gKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub25Db25mbGljdCA9IHN0YXRlbWVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFkZGl0aW9uYWwgaWdub3JlIHN0YXRlbWVudCBzdXBwb3J0ZWQgaW4gZGF0YWJhc2VzLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JJZ25vcmUgPSBmdW5jdGlvbiAoc3RhdGVtZW50KSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQgPT09IHZvaWQgMCkgeyBzdGF0ZW1lbnQgPSB0cnVlOyB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vbklnbm9yZSA9ICEhc3RhdGVtZW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYWRkaXRpb25hbCB1cGRhdGUgc3RhdGVtZW50IHN1cHBvcnRlZCBpbiBkYXRhYmFzZXMuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vclVwZGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZW1lbnRPck92ZXJ3cml0ZSwgY29uZmxpY3RUYXJnZXQpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXRlbWVudE9yT3ZlcndyaXRlKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlID0ge1xuICAgICAgICAgICAgICAgIGNvbmZsaWN0OiBzdGF0ZW1lbnRPck92ZXJ3cml0ZSA9PT0gbnVsbCB8fCBzdGF0ZW1lbnRPck92ZXJ3cml0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdGVtZW50T3JPdmVyd3JpdGUuY29uZmxpY3RfdGFyZ2V0LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHN0YXRlbWVudE9yT3ZlcndyaXRlID09PSBudWxsIHx8IHN0YXRlbWVudE9yT3ZlcndyaXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGF0ZW1lbnRPck92ZXJ3cml0ZS5jb2x1bW5zLFxuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogc3RhdGVtZW50T3JPdmVyd3JpdGUgPT09IG51bGwgfHwgc3RhdGVtZW50T3JPdmVyd3JpdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXRlbWVudE9yT3ZlcndyaXRlLm92ZXJ3cml0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub25VcGRhdGUgPSB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IHN0YXRlbWVudE9yT3ZlcndyaXRlLFxuICAgICAgICAgICAgY29uZmxpY3Q6IGNvbmZsaWN0VGFyZ2V0LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIElOU0VSVCBleHByZXNzIHVzZWQgdG8gcGVyZm9ybSBpbnNlcnQgcXVlcnkuXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVJbnNlcnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdGFibGVOYW1lID0gdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpO1xuICAgICAgICB2YXIgdmFsdWVzRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlVmFsdWVzRXhwcmVzc2lvbigpOyAvLyBpdHMgaW1wb3J0YW50IHRvIGdldCB2YWx1ZXMgYmVmb3JlIHJldHVybmluZyBleHByZXNzaW9uIGJlY2F1c2Ugb3JhY2xlIHJlbHkgb24gbmF0aXZlIHBhcmFtZXRlcnMgYW5kIG9yZGVyaW5nIG9mIHRoZW0gaXMgaW1wb3J0YW50XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5sZW5ndGggPiAxKSA/IG51bGwgOiB0aGlzLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24oKTsgLy8gb3JhY2xlIGRvZXNudCBzdXBwb3J0IHJldHVybmluZyB3aXRoIG11bHRpLXJvdyBpbnNlcnRcbiAgICAgICAgdmFyIGNvbHVtbnNFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVDb2x1bW5OYW1lc0V4cHJlc3Npb24oKTtcbiAgICAgICAgdmFyIHF1ZXJ5ID0gXCJJTlNFUlQgXCI7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9IFwiXCIgKyAodGhpcy5leHByZXNzaW9uTWFwLm9uSWdub3JlID8gXCIgSUdOT1JFIFwiIDogXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgKz0gXCJJTlRPIFwiICsgdGFibGVOYW1lO1xuICAgICAgICAvLyBhZGQgY29sdW1ucyBleHByZXNzaW9uXG4gICAgICAgIGlmIChjb2x1bW5zRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcXVlcnkgKz0gXCIoXCIgKyBjb2x1bW5zRXhwcmVzc2lvbiArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXNFeHByZXNzaW9uICYmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpKSAvLyBzcGVjaWFsIHN5bnRheCBmb3IgbXlzcWwgREVGQVVMVCBWQUxVRVMgaW5zZXJ0aW9uXG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIoKVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBPVVRQVVQgZXhwcmVzc2lvblxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICBxdWVyeSArPSBcIiBPVVRQVVQgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBWQUxVRVMgZXhwcmVzc2lvblxuICAgICAgICBpZiAodmFsdWVzRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgXCIgKyB2YWx1ZXNFeHByZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgVkFMVUVTIFwiICsgdmFsdWVzRXhwcmVzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpIHsgLy8gc3BlY2lhbCBzeW50YXggZm9yIG15c3FsIERFRkFVTFQgVkFMVUVTIGluc2VydGlvblxuICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFZBTFVFUyAoKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgREVGQVVMVCBWQUxVRVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5zdXBwb3J0ZWRVcHNlcnRUeXBlID09PSBcIm9uLWNvbmZsaWN0LWRvLXVwZGF0ZVwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgT04gQ09ORkxJQ1QgRE8gTk9USElORyBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5vbkNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgKz0gXCIgT04gQ09ORkxJQ1QgXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAub25Db25mbGljdCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5leHByZXNzaW9uTWFwLm9uVXBkYXRlLCBvdmVyd3JpdGUgPSBfYS5vdmVyd3JpdGUsIGNvbHVtbnMgPSBfYS5jb2x1bW5zLCBjb25mbGljdCA9IF9hLmNvbmZsaWN0O1xuICAgICAgICAgICAgICAgIHZhciBjb25mbGljdFRhcmdldCA9IFwiT04gQ09ORkxJQ1RcIjtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25mbGljdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RUYXJnZXQgKz0gXCIgKCBcIiArIGNvbmZsaWN0Lm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKTsgfSkuam9pbihcIiwgXCIpICsgXCIgKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25mbGljdFRhcmdldCArPSBcIiBPTiBDT05TVFJBSU5UIFwiICsgdGhpcy5lc2NhcGUoY29uZmxpY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVyd3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiICsgY29uZmxpY3RUYXJnZXQgKyBcIiBETyBVUERBVEUgU0VUIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBvdmVyd3JpdGUgPT09IG51bGwgfHwgb3ZlcndyaXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVyd3JpdGUubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW4pICsgXCIgPSBFWENMVURFRC5cIiArIF90aGlzLmVzY2FwZShjb2x1bW4pOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiICsgY29uZmxpY3RUYXJnZXQgKyBcIiBETyBVUERBVEUgU0VUIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiID0gOlwiICsgY29sdW1uOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnN1cHBvcnRlZFVwc2VydFR5cGUgPT09IFwib24tZHVwbGljYXRlLWtleS11cGRhdGVcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5vblVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vblVwZGF0ZSwgb3ZlcndyaXRlID0gX2Iub3ZlcndyaXRlLCBjb2x1bW5zID0gX2IuY29sdW1ucztcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVyd3JpdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBvdmVyd3JpdGUubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW4pICsgXCIgPSBWQUxVRVMoXCIgKyBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiKVwiOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIFwiO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSArPSBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uKSArIFwiID0gOlwiICsgY29sdW1uOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAub25VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwib25VcGRhdGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBkYXRhYmFzZSBkcml2ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIFJFVFVSTklORyBleHByZXNzaW9uXG4gICAgICAgIGlmIChyZXR1cm5pbmdFeHByZXNzaW9uICYmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgcXVlcnkgKz0gXCIgUkVUVVJOSU5HIFwiICsgcmV0dXJuaW5nRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnNlcnRpbmcgYSBzcGVjaWZpYyB2YWx1ZSBmb3IgYW4gYXV0by1pbmNyZW1lbnQgcHJpbWFyeSBrZXkgaW4gbXNzcWwgcmVxdWlyZXMgZW5hYmxpbmcgSURFTlRJVFlfSU5TRVJUXG4gICAgICAgIC8vIElERU5USVRZX0lOU0VSVCBjYW4gb25seSBiZSBlbmFibGVkIGZvciB0YWJsZXMgd2hlcmUgdGhlcmUgaXMgYW4gSURFTlRJVFkgY29sdW1uIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgKGkuZS4gc3VwcGx5aW5nIERFRkFVTFQgaXMgcHJvaGliaXRlZCBpZiBJREVOVElUWV9JTlNFUlQgaXMgZW5hYmxlZClcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXJcbiAgICAgICAgICAgICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGFcbiAgICAgICAgICAgICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuY29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuZXhwcmVzc2lvbk1hcC5pbnNlcnRDb2x1bW5zLmxlbmd0aCA+IDAgPyBfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMuaW5kZXhPZihjb2x1bW4ucHJvcGVydHlQYXRoKSAhPT0gLTEgOiBjb2x1bW4uaXNJbnNlcnQ7IH0pXG4gICAgICAgICAgICAgICAgLnNvbWUoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuaXNPdmVycmlkaW5nQXV0b0luY3JlbWVudEJlaGF2aW9yKGNvbHVtbik7IH0pKSB7XG4gICAgICAgICAgICBxdWVyeSA9IFwiU0VUIElERU5USVRZX0lOU0VSVCBcIiArIHRhYmxlTmFtZSArIFwiIE9OOyBcIiArIHF1ZXJ5ICsgXCI7IFNFVCBJREVOVElUWV9JTlNFUlQgXCIgKyB0YWJsZU5hbWUgKyBcIiBPRkZcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGxpc3Qgb2YgY29sdW1ucyB3aGVyZSB2YWx1ZXMgbXVzdCBiZSBpbnNlcnRlZCB0by5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldEluc2VydGVkQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZiB1c2VyIHNwZWNpZmllZCBsaXN0IG9mIGNvbHVtbnMgaGUgd2FudHMgdG8gaW5zZXJ0IHRvLCB0aGVuIHdlIGZpbHRlciBvbmx5IHRoZW1cbiAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5leHByZXNzaW9uTWFwLmluc2VydENvbHVtbnMuaW5kZXhPZihjb2x1bW4ucHJvcGVydHlQYXRoKSAhPT0gLTE7XG4gICAgICAgICAgICAvLyBza2lwIGNvbHVtbnMgdGhlIHVzZXIgZG9lc24ndCB3YW50IGluY2x1ZGVkIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGlmICghY29sdW1uLmlzSW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgdXNlciBkaWQgbm90IHNwZWNpZmllZCBzdWNoIGxpc3QgdGhlbiByZXR1cm4gYWxsIGNvbHVtbnMgZXhjZXB0IGF1dG8taW5jcmVtZW50IG9uZVxuICAgICAgICAgICAgLy8gZm9yIE9yYWNsZSB3ZSByZXR1cm4gYXV0by1pbmNyZW1lbnQgY29sdW1uIGFzIHdlbGwgYmVjYXVzZSBPcmFjbGUgZG9lcyBub3Qgc3VwcG9ydCBERUZBVUxUIFZBTFVFUyBleHByZXNzaW9uXG4gICAgICAgICAgICBpZiAoY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCJcbiAgICAgICAgICAgICAgICAmJiAhKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKVxuICAgICAgICAgICAgICAgICYmICEoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcilcbiAgICAgICAgICAgICAgICAmJiAhKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIpXG4gICAgICAgICAgICAgICAgJiYgIShfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgJiYgIShfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlciAmJiBfdGhpcy5pc092ZXJyaWRpbmdBdXRvSW5jcmVtZW50QmVoYXZpb3IoY29sdW1uKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbHVtbnMgc3RyaW5nIHdoZXJlIHZhbHVlcyBtdXN0IGJlIGluc2VydGVkIHRvIGZvciBJTlNFUlQgSU5UTyBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIEluc2VydFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlQ29sdW1uTmFtZXNFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuZ2V0SW5zZXJ0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIGlmIHRoZXJlIGFyZSBubyBpbnNlcnQgY29sdW1ucyBzcGVjaWZpZWQgYW5kIHRhYmxlIHdpdGhvdXQgbWV0YWRhdGEgdXNlZFxuICAgICAgICAvLyB3ZSBnZXQgY29sdW1ucyBmcm9tIHRoZSBpbnNlcnRlZCB2YWx1ZSBtYXAsIGluIHRoZSBjYXNlIGlmIG9ubHkgb25lIGluc2VydGVkIG1hcCBpcyBzcGVjaWZpZWRcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmICF0aGlzLmV4cHJlc3Npb25NYXAuaW5zZXJ0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZVNldHMgPSB0aGlzLmdldFZhbHVlU2V0cygpO1xuICAgICAgICAgICAgaWYgKHZhbHVlU2V0cy5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlU2V0c1swXSkubWFwKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBfdGhpcy5lc2NhcGUoY29sdW1uTmFtZSk7IH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgYSB0YWJsZSBuYW1lIGFuZCBhbGwgY29sdW1uIGRhdGFiYXNlIG5hbWVzXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAuaW5zZXJ0Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIF90aGlzLmVzY2FwZShjb2x1bW5OYW1lKTsgfSkuam9pbihcIiwgXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBsaXN0IG9mIHZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbiB0aGUgVkFMVUVTIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgSW5zZXJ0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVWYWx1ZXNFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdmFsdWVTZXRzID0gdGhpcy5nZXRWYWx1ZVNldHMoKTtcbiAgICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmdldEluc2VydGVkQ29sdW1ucygpO1xuICAgICAgICAvLyBpZiBjb2x1bW4gbWV0YWRhdGFzIGFyZSBnaXZlbiB0aGVuIGFwcGx5IGFsbCBuZWNlc3Nhcnkgb3BlcmF0aW9ucyB3aXRoIHZhbHVlc1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbl8xID0gXCJcIjtcbiAgICAgICAgICAgIHZhbHVlU2V0cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZVNldCwgdmFsdWVTZXRJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciAmJiB2YWx1ZVNldHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIiBTRUxFQ1QgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIoXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCByZWFsIHZhbHVlIGZyb20gdGhlIGVudGl0eVxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWVTZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb2x1bW4gaXMgcmVsYXRpb25hbCBhbmQgdmFsdWUgaXMgYW4gb2JqZWN0IHRoZW4gZ2V0IHJlYWwgcmVmZXJlbmNlZCBjb2x1bW4gdmFsdWUgZnJvbSB0aGlzIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSBjb2x1bW4gdmFsdWUgaXMgeyBxdWVzdGlvbjogeyBpZDogMSB9IH0sIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8geyBpZDogMSB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBleHRyYWN0IFwiMVwiIGZyb20gdGhpcyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLyppZiAoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4gJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkgeyAvLyB0b2RvOiBjaGVjayBpZiB3ZSBzdGlsbCBuZWVkIGl0IHNpbmNlIGdldEVudGl0eVZhbHVlIGFscmVhZHkgaGFzIHNpbWlsYXIgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0qL1xuICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG91ciB2YWx1ZSBpcyBub3JtYWxpemVkIGJ5IGEgZHJpdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVQZXJzaXN0ZW50VmFsdWUodmFsdWUsIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3bHkgaW5zZXJ0ZWQgZW50aXRpZXMgYWx3YXlzIGhhdmUgYSB2ZXJzaW9uIGVxdWFsIHRvIDEgKGZpcnN0IHZlcnNpb24pXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsc28sIHVzZXItc3BlY2lmaWVkIHZlcnNpb24gbXVzdCBiZSBlbXB0eVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmVyc2lvbiAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGNvbHVtbi5pc05lc3RlZFNldExlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZW50aXR5TWV0YWRhdGEudGFibGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCByaWdodENvbHVtbk5hbWUgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShjb2x1bW4uZW50aXR5TWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4hLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc3Qgc3ViUXVlcnkgPSBgKFNFTEVDVCBjLm1heCArIDEgRlJPTSAoU0VMRUNUIE1BWCgke3JpZ2h0Q29sdW1uTmFtZX0pIGFzIG1heCBmcm9tICR7dGFibGVOYW1lfSkgYylgO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGV4cHJlc3Npb24gKz0gc3ViUXVlcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChjb2x1bW4uaXNOZXN0ZWRTZXRSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5lbnRpdHlNZXRhZGF0YS50YWJsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnN0IHJpZ2h0Q29sdW1uTmFtZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbi5lbnRpdHlNZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbiEuZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCBzdWJRdWVyeSA9IGAoU0VMRUNUIGMubWF4ICsgMiBGUk9NIChTRUxFQ1QgTUFYKCR7cmlnaHRDb2x1bW5OYW1lfSkgYXMgbWF4IGZyb20gJHt0YWJsZU5hbWV9KSBjKWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhwcmVzc2lvbiArPSBzdWJRdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4uaXNEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY3JlYXRlIGFuZCB1cGRhdGUgZGF0ZXMgd2UgaW5zZXJ0IGN1cnJlbnQgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8sIHdlIGRvbid0IGRvIGl0IGJlY2F1c2UgdGhpcyBjb25zdGFudCBpcyBhbHJlYWR5IGluIFwiZGVmYXVsdFwiIHZhbHVlIG9mIHRoZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggZXh0ZW5kZWQgdGltZXN0YW1wIGZ1bmN0aW9uYWxpdHksIGxpa2UgQ1VSUkVOVF9USU1FU1RBTVAoNikgZm9yIGV4YW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoY29sdW1uLmlzQ3JlYXRlRGF0ZSB8fCBjb2x1bW4uaXNVcGRhdGVEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIFwiQ1VSUkVOVF9USU1FU1RBTVBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbHVtbiBpcyBnZW5lcmF0ZWQgdXVpZCBhbmQgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBpdHMgZ2VuZXJhdGlvbiBhbmQgY3VzdG9tIGdlbmVyYXRlZCB2YWx1ZSB3YXMgbm90IHByb3ZpZGVkIGJ5IGEgdXNlciAtIHdlIGdlbmVyYXRlIGEgbmV3IHV1aWQgdmFsdWUgZm9yIGluc2VydGlvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5pc0dlbmVyYXRlZCAmJiBjb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID09PSBcInV1aWRcIiAmJiAhX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNVVUlER2VuZXJhdGlvblN1cHBvcnRlZCgpICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUmFuZG9tR2VuZXJhdG9yLnV1aWQ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlU2V0SW5kZXggaW4gX3RoaXMuZXhwcmVzc2lvbk1hcC5sb2NhbGx5R2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZFt2YWx1ZVNldEluZGV4XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZFt2YWx1ZVNldEluZGV4XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgZm9yIHRoaXMgY29sdW1uIHdhcyBub3QgcHJvdmlkZWQgdGhlbiBpbnNlcnQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfHwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHsgLy8gdW5mb3J0dW5hdGVseSBzcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBERUZBVUxUIGV4cHJlc3Npb24gaW4gSU5TRVJUIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZGVmYXVsdCAhPT0gbnVsbCkgeyAvLyB0cnkgdG8gdXNlIGRlZmF1bHQgZGVmaW5lZCBpbiB0aGUgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCJOVUxMXCI7IC8vIG90aGVyd2lzZSBzaW1wbHkgdXNlIE5VTEwgYW5kIHByYXkgaWYgY29sdW1uIGlzIG51bGxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiREVGQVVMVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gdmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYW55IG90aGVyIHJlZ3VsYXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcmFtZXRyaXplVmFsdWUoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHN0b3JlIGFycmF5IHZhbHVlcyBpbiBhIHNwZWNpYWwgY2xhc3MgdG8gbWFrZSBzdXJlIHBhcmFtZXRlciByZXBsYWNlbWVudCB3aWxsIHdvcmsgY29ycmVjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZSA9IG5ldyBBcnJheVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvbUZyb21UZXh0ID0gdXNlTGVnYWN5ID8gXCJHZW9tRnJvbVRleHRcIiA6IFwiU1RfR2VvbUZyb21UZXh0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zcmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IGdlb21Gcm9tVGV4dCArIFwiKFwiICsgcGFyYW1OYW1lICsgXCIsIFwiICsgY29sdW1uLnNyaWQgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBnZW9tRnJvbVRleHQgKyBcIihcIiArIHBhcmFtTmFtZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc3JpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIlNUX1NldFNSSUQoU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpLCBcIiArIGNvbHVtbi5zcmlkICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gY29sdW1uLnR5cGUgKyBcIjo6U1RHZW9tRnJvbVRleHQoXCIgKyBwYXJhbU5hbWUgKyBcIiwgXCIgKyAoY29sdW1uLnNyaWQgfHwgXCIwXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA9PT0gY29sdW1ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVTZXRJbmRleCA9PT0gdmFsdWVTZXRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiIEZST00gRFVBTCBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMSArPSBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgdmFsdWVTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8xICs9IFwiIEZST00gRFVBTCBVTklPTiBBTEwgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIpLCBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uXzEgKz0gXCIsIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChleHByZXNzaW9uXzEgPT09IFwiKClcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uXzE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGZvciB0YWJsZXMgd2l0aG91dCBtZXRhZGF0YVxuICAgICAgICAgICAgLy8gZ2V0IHZhbHVlcyBuZWVkcyB0byBiZSBpbnNlcnRlZFxuICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25fMiA9IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZVNldHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVTZXQsIGluc2VydGlvbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSBPYmplY3Qua2V5cyh2YWx1ZVNldCk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW5OYW1lLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIihcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZVNldFtjb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHF1ZXJpZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSB2YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgZm9yIHRoaXMgY29sdW1uIHdhcyBub3QgcHJvdmlkZWQgdGhlbiBpbnNlcnQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEFic3RyYWN0U3FsaXRlRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiTlVMTFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiREVGQVVMVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhbnkgb3RoZXIgcmVndWxhciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IF90aGlzLmNyZWF0ZVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSBPYmplY3Qua2V5cyh2YWx1ZVNldCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydGlvbkluZGV4ID09PSB2YWx1ZVNldHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25fMiArPSBcIiksIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbl8yICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbl8yID09PSBcIigpXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbl8yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFycmF5IG9mIHZhbHVlcyBuZWVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFZhbHVlU2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldDtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXQgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXRdO1xuICAgICAgICB0aHJvdyBuZXcgSW5zZXJ0VmFsdWVzTWlzc2luZ0Vycm9yKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgY29sdW1uIGlzIGFuIGF1dG8tZ2VuZXJhdGVkIHByaW1hcnkga2V5LCBidXQgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHNwZWNpZmllcyBhIHZhbHVlIGZvciBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2x1bW5cbiAgICAgKi9cbiAgICBJbnNlcnRRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmlzT3ZlcnJpZGluZ0F1dG9JbmNyZW1lbnRCZWhhdmlvciA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnlcbiAgICAgICAgICAgICYmIGNvbHVtbi5pc0dlbmVyYXRlZFxuICAgICAgICAgICAgJiYgY29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIlxuICAgICAgICAgICAgJiYgdGhpcy5nZXRWYWx1ZVNldHMoKS5zb21lKGZ1bmN0aW9uICh2YWx1ZVNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZ2V0RW50aXR5VmFsdWUodmFsdWVTZXQpICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlU2V0KSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEluc2VydFF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBJbnNlcnRRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlclV0aWxzIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyVXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBTdG9yZXMgYWxsIGpvaW4gYXR0cmlidXRlcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgYSBKT0lOIHF1ZXJ5LlxuICovXG52YXIgSm9pbkF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gSm9pbkF0dHJpYnV0ZShjb25uZWN0aW9uLCBxdWVyeUV4cHJlc3Npb25NYXAsIGpvaW5BdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAgPSBxdWVyeUV4cHJlc3Npb25NYXA7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZEV2YWx1YXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbGF0aW9uRXZhbHVhdGVkID0gZmFsc2U7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBqb2luQXR0cmlidXRlIHx8IHt9KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcImlzTWFueVwiLCB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTWFwcGluZ01hbnkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc01hcHBpbmdNYW55O1xuICAgICAgICAgICAgaWYgKHRoaXMucmVsYXRpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uaXNNYW55VG9NYW55IHx8IHRoaXMucmVsYXRpb24uaXNPbmVUb01hbnk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwiaXNTZWxlY3RlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBqb2luIGlzIHNlbGVjdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRFdmFsdWF0ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Quc2VsZWN0aW9uID09PSBfdGhpcy5hbGlhcy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEgJiYgISFfdGhpcy5tZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gX3RoaXMuYWxpYXMubmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoX3RoaXMucXVlcnlFeHByZXNzaW9uTWFwLnNlbGVjdHMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShzZWxlY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGVfMSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VsZWN0ZWRDYWNoZSA9IGdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkRXZhbHVhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWRDYWNoZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJ0YWJsZVBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiB0aGUgdGFibGUgd2hpY2ggd2Ugc2hvdWxkIGpvaW4uXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YS50YWJsZVBhdGggOiB0aGlzLmVudGl0eU9yUHJvcGVydHk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicGFyZW50QWxpYXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxpYXMgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGpvaW4uXG4gICAgICAgICAqIEZvciBleGFtcGxlLCBpZiB3ZSBqb2luIChcInBvc3QuY2F0ZWdvcnlcIiwgXCJjYXRlZ29yeUFsaWFzXCIpIHRoZW4gXCJwb3N0XCIgaXMgYSBwYXJlbnQgYWxpYXMuXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gZW50aXR5T3JQcm9wZXJ0eSB2YWx1ZS5cbiAgICAgICAgICogVGhpcyBpcyBhdmFpbGFibGUgd2hlbiBqb2luIHdhcyBtYWRlIHVzaW5nIFwicG9zdC5jYXRlZ29yeVwiIHN5bnRheC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5lbnRpdHlPclByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgdGhpcy5lbnRpdHlPclByb3BlcnR5LmluZGV4T2YoXCIuXCIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJyZWxhdGlvblByb3BlcnR5UGF0aFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwiY2F0ZWdvcnlcIiBpcyBhIHJlbGF0aW9uIHByb3BlcnR5LlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMuZW50aXR5T3JQcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudGl0eU9yUHJvcGVydHkuc3Vic3RyKHRoaXMuZW50aXR5T3JQcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSArIDEpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcInJlbGF0aW9uXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKiBSZWxhdGlvbiBjYW4gYmUgdW5kZWZpbmVkIGlmIGVudGl0eU9yUHJvcGVydHkgaXMgcmVndWxhciBlbnRpdHkgb3IgY3VzdG9tIHRhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlbGF0aW9uRXZhbHVhdGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eShfdGhpcy5lbnRpdHlPclByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbk93bmVyU2VsZWN0aW9uID0gX3RoaXMucXVlcnlFeHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShfdGhpcy5wYXJlbnRBbGlhcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChfdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbk93bmVyU2VsZWN0aW9uLm1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEucGFyZW50RW50aXR5TWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChfdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlJlbGF0aW9uIHdpdGggcHJvcGVydHkgcGF0aCBcIiArIF90aGlzLnJlbGF0aW9uUHJvcGVydHlQYXRoICsgXCIgaW4gZW50aXR5IHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxhdGlvbkNhY2hlID0gZ2V0VmFsdWUuYmluZCh0aGlzKSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25FdmFsdWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25DYWNoZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKb2luQXR0cmlidXRlLnByb3RvdHlwZSwgXCJtZXRhZGF0YVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNZXRhZGF0YSBvZiB0aGUgam9pbmVkIGVudGl0eS5cbiAgICAgICAgICogSWYgdGFibGUgd2l0aG91dCBlbnRpdHkgd2FzIGpvaW5lZCwgdGhlbiBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGVudGl0eU9yUHJvcGVydHkgaXMgcmVsYXRpb24sIGUuZy4gXCJwb3N0LmNhdGVnb3J5XCJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgIC8vIGVudGl0eU9yUHJvcGVydHkgaXMgRW50aXR5IGNsYXNzXG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmhhc01ldGFkYXRhKHRoaXMuZW50aXR5T3JQcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8qaWYgKHR5cGVvZiB0aGlzLmVudGl0eU9yUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHsgLy8gZW50aXR5T3JQcm9wZXJ0eSBpcyBhIGN1c3RvbSB0YWJsZVxuICAgIFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB0byBmaW5kIGVudGl0eSB3aXRoIHN1Y2ggbmFtZSwgdGhpcyBpcyBuZWVkZWQgd2hlbiBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCBjbGFzcyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIHRhcmdldCBpcyBhIHN0cmluZyBuYW1lIChzY2VuYXJpbyB3aGVuIHBsYWluIG9sZCBqYXZhc2NyaXB0IGlzIHVzZWQgb3IgZW50aXR5IHNjaGVtYSBpcyBsb2FkZWQgZnJvbSBmaWxlcylcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmluZChtZXRhZGF0YSA9PiBtZXRhZGF0YS5uYW1lID09PSB0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgZW50aXR5IHdpdGggc3VjaCB0YWJsZSBuYW1lLCBhbmQgdXNlIGl0cyBtZXRhZGF0YSBpZiBmb3VuZFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZW50aXR5TWV0YWRhdGFzLmZpbmQobWV0YWRhdGEgPT4gbWV0YWRhdGEudGFibGVOYW1lID09PSB0aGlzLmVudGl0eU9yUHJvcGVydHkpO1xuICAgICAgICAgICAgfSovXG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSm9pbkF0dHJpYnV0ZS5wcm90b3R5cGUsIFwianVuY3Rpb25BbGlhc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZXMgYWxpYXMgb2YganVuY3Rpb24gdGFibGUsIHdob3NlIGlkcyB3ZSBnZXQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGdldCBqdW5jdGlvbiB0YWJsZSBmb3Igam9pbiB3aXRob3V0IHJlbGF0aW9uLlwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uLmlzT3duaW5nID8gdGhpcy5wYXJlbnRBbGlhcyArIFwiX1wiICsgdGhpcy5hbGlhcy5uYW1lIDogdGhpcy5hbGlhcy5uYW1lICsgXCJfXCIgKyB0aGlzLnBhcmVudEFsaWFzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1hcFRvUHJvcGVydHlQYXJlbnRBbGlhc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcFRvUHJvcGVydHkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcFRvUHJvcGVydHkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpvaW5BdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1hcFRvUHJvcGVydHlQcm9wZXJ0eU5hbWVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXBUb1Byb3BlcnR5KVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBUb1Byb3BlcnR5LnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBKb2luQXR0cmlidXRlO1xufSgpKTtcbmV4cG9ydCB7IEpvaW5BdHRyaWJ1dGUgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Sm9pbkF0dHJpYnV0ZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5RXhwcmVzc2lvbk1hcCB9IGZyb20gXCIuL1F1ZXJ5RXhwcmVzc2lvbk1hcFwiO1xuaW1wb3J0IHsgQnJhY2tldHMgfSBmcm9tIFwiLi9CcmFja2V0c1wiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzRHJpdmVyXCI7XG5pbXBvcnQgeyBDb2Nrcm9hY2hEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2NvY2tyb2FjaGRiL0NvY2tyb2FjaERyaXZlclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IEVudGl0eVNjaGVtYSB9IGZyb20gXCIuLi9lbnRpdHktc2NoZW1hL0VudGl0eVNjaGVtYVwiO1xuaW1wb3J0IHsgRmluZE9wZXJhdG9yIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3BlcmF0b3JcIjtcbmltcG9ydCB7IEluIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9vcGVyYXRvci9JblwiO1xuaW1wb3J0IHsgRW50aXR5Q29sdW1uTm90Rm91bmQgfSBmcm9tIFwiLi4vZXJyb3IvRW50aXR5Q29sdW1uTm90Rm91bmRcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLy8gdG9kbzogY29tcGxldGVseSBjb3ZlciBxdWVyeSBidWlsZGVyIHdpdGggdGVzdHNcbi8vIHRvZG86IGVudGl0eU9yUHJvcGVydHkgY2FuIGJlIHRhcmdldCBuYW1lLiBpbXBsZW1lbnQgcHJvcGVyIGJlaGF2aW91ciBpZiBpdCBpcy5cbi8vIHRvZG86IGNoZWNrIGluIHBlcnNpc3RtZW50IGlmIGlkIGV4aXN0IG9uIG9iamVjdCBhbmQgdGhyb3cgZXhjZXB0aW9uIChjYW4gYmUgaW4gcGFydGlhbCBzZWxlY3Rpb24/KVxuLy8gdG9kbzogZml4IHByb2JsZW0gd2l0aCBsb25nIGFsaWFzZXMgZWcgZ2V0TWF4SWRlbnRpZmllckxlbmd0aFxuLy8gdG9kbzogZml4IHJlcGxhY2luZyBpbiAuc2VsZWN0KFwiQ09VTlQocG9zdC5pZCkgQVMgY250XCIpIHN0YXRlbWVudFxuLy8gdG9kbzogaW1wbGVtZW50IGpvaW5BbHdheXMgaW4gcmVsYXRpb25zIGFuZCByZWxhdGlvbklkXG4vLyB0b2RvOiBmaW5pc2ggcGFydGlhbCBzZWxlY3Rpb25cbi8vIHRvZG86IHN1Z2FyIG1ldGhvZHMgbGlrZTogLmFkZENvdW50IGFuZCAuc2VsZWN0Q291bnQsIHNlbGVjdENvdW50QW5kTWFwLCBzZWxlY3RTdW0sIHNlbGVjdFN1bUFuZE1hcCwgLi4uXG4vLyB0b2RvOiBpbXBsZW1lbnQgQFNlbGVjdCBkZWNvcmF0b3Jcbi8vIHRvZG86IGFkZCBzZWxlY3QgYW5kIG1hcCBmdW5jdGlvbnNcbi8vIHRvZG86IGltcGxlbWVudCByZWxhdGlvbi9lbnRpdHkgbG9hZGluZyBhbmQgc2V0dGluZyB0aGVtIGludG8gcHJvcGVydGllcyB3aXRoaW4gYSBzZXBhcmF0ZSBxdWVyeVxuLy8gLmxvYWRBbmRNYXAoXCJwb3N0LmNhdGVnb3JpZXNcIiwgXCJwb3N0LmNhdGVnb3JpZXNcIiwgcWIgPT4gLi4uKVxuLy8gLmxvYWRBbmRNYXAoXCJwb3N0LmNhdGVnb3JpZXNcIiwgQ2F0ZWdvcnksIHFiID0+IC4uLilcbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG52YXIgUXVlcnlCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5QnVpbGRlciBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSBnaXZlbiBDb25uZWN0aW9uIGFuZCBRdWVyeVJ1bm5lciBvYmplY3RzIG9yIGZyb20gZ2l2ZW4gb3RoZXIgUXVlcnlCdWlsZGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFF1ZXJ5QnVpbGRlcihjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNZW1vIHRvIGhlbHAga2VlcCBwbGFjZSBvZiBjdXJyZW50IHBhcmFtZXRlciBpbmRleCBmb3IgYGNyZWF0ZVBhcmFtZXRlcmBcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyYW1ldGVySW5kZXggPSAwO1xuICAgICAgICBpZiAoY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyIGluc3RhbmNlb2YgUXVlcnlCdWlsZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIuY29ubmVjdGlvbjtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIucXVlcnlSdW5uZXI7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyO1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbk1hcCh0aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUJ1aWxkZXIucHJvdG90eXBlLCBcImFsaWFzXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWFpbiBhbGlhcyBzdHJpbmcgdXNlZCBpbiB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTWFpbiBhbGlhcyBpcyBub3Qgc2V0XCIpOyAvLyB0b2RvOiBiZXR0ZXIgZXhjZXB0aW9uXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgc2VsZWN0aW9uQWxpYXNOYW1lKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInNlbGVjdFwiO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cyA9IHNlbGVjdGlvbi5tYXAoZnVuY3Rpb24gKHNlbGVjdGlvbikgeyByZXR1cm4gKHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24gfSk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSBbeyBzZWxlY3Rpb246IHNlbGVjdGlvbiwgYWxpYXNOYW1lOiBzZWxlY3Rpb25BbGlhc05hbWUgfV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBTZWxlY3RRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9TZWxlY3RRdWVyeUJ1aWxkZXJcIikuU2VsZWN0UXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNlbGVjdFF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgSU5TRVJUIHF1ZXJ5LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID0gXCJpbnNlcnRcIjtcbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBJbnNlcnRRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9JbnNlcnRRdWVyeUJ1aWxkZXJcIikuSW5zZXJ0UXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEluc2VydFF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgVVBEQVRFIHF1ZXJ5IGFuZCBhcHBsaWVzIGdpdmVuIHVwZGF0ZSB2YWx1ZXMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQsIG1heWJlVXBkYXRlU2V0KSB7XG4gICAgICAgIHZhciB1cGRhdGVTZXQgPSBtYXliZVVwZGF0ZVNldCA/IG1heWJlVXBkYXRlU2V0IDogZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQ7XG4gICAgICAgIGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0ID0gZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQgaW5zdGFuY2VvZiBFbnRpdHlTY2hlbWEgPyBlbnRpdHlPclRhYmxlTmFtZVVwZGF0ZVNldC5vcHRpb25zLm5hbWUgOiBlbnRpdHlPclRhYmxlTmFtZVVwZGF0ZVNldDtcbiAgICAgICAgaWYgKGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgdHlwZW9mIGVudGl0eU9yVGFibGVOYW1lVXBkYXRlU2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5T3JUYWJsZU5hbWVVcGRhdGVTZXQpO1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNldE1haW5BbGlhcyhtYWluQWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInVwZGF0ZVwiO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdXBkYXRlU2V0O1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFVwZGF0ZVF1ZXJ5QnVpbGRlckNscyA9IHJlcXVpcmUoXCIuL1VwZGF0ZVF1ZXJ5QnVpbGRlclwiKS5VcGRhdGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVXBkYXRlUXVlcnlCdWlsZGVyQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBERUxFVEUgcXVlcnkuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcImRlbGV0ZVwiO1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIERlbGV0ZVF1ZXJ5QnVpbGRlckNscyA9IHJlcXVpcmUoXCIuL0RlbGV0ZVF1ZXJ5QnVpbGRlclwiKS5EZWxldGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGVsZXRlUXVlcnlCdWlsZGVyQ2xzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zb2Z0RGVsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID0gXCJzb2Z0LWRlbGV0ZVwiO1xuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHMgPSByZXF1aXJlKFwiLi9Tb2Z0RGVsZXRlUXVlcnlCdWlsZGVyXCIpLlNvZnREZWxldGVRdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlckNscylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHModGhpcyk7XG4gICAgfTtcbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInJlc3RvcmVcIjtcbiAgICAgICAgLy8gbG9hZGluZyBpdCBkeW5hbWljYWxseSBiZWNhdXNlIG9mIGNpcmN1bGFyIGlzc3VlXG4gICAgICAgIHZhciBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyQ2xzID0gcmVxdWlyZShcIi4vU29mdERlbGV0ZVF1ZXJ5QnVpbGRlclwiKS5Tb2Z0RGVsZXRlUXVlcnlCdWlsZGVyO1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNvZnREZWxldGVRdWVyeUJ1aWxkZXJDbHMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyQ2xzKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBlbnRpdHkncyByZWxhdGlvbiB3aXRoIHdoaWNoIHRoaXMgcXVlcnkgYnVpbGRlciBnb25uYSB3b3JrLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUucmVsYXRpb24gPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0T3JQcm9wZXJ0eVBhdGgsIG1heWJlUHJvcGVydHlQYXRoKSB7XG4gICAgICAgIHZhciBlbnRpdHlUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gZW50aXR5VGFyZ2V0T3JQcm9wZXJ0eVBhdGggOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBhcmd1bWVudHMubGVuZ3RoID09PSAyID8gbWF5YmVQcm9wZXJ0eVBhdGggOiBlbnRpdHlUYXJnZXRPclByb3BlcnR5UGF0aDtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9IFwicmVsYXRpb25cIjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoO1xuICAgICAgICBpZiAoZW50aXR5VGFyZ2V0KSB7XG4gICAgICAgICAgICB2YXIgbWFpbkFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2FkaW5nIGl0IGR5bmFtaWNhbGx5IGJlY2F1c2Ugb2YgY2lyY3VsYXIgaXNzdWVcbiAgICAgICAgdmFyIFJlbGF0aW9uUXVlcnlCdWlsZGVyQ2xzID0gcmVxdWlyZShcIi4vUmVsYXRpb25RdWVyeUJ1aWxkZXJcIikuUmVsYXRpb25RdWVyeUJ1aWxkZXI7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVsYXRpb25RdWVyeUJ1aWxkZXJDbHMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvblF1ZXJ5QnVpbGRlckNscyh0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiByZWxhdGlvbiBvciByZWxhdGlvbnMgZXhpc3QgaW4gdGhlIGVudGl0eS5cbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVsYXRpb24gZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiB0b2RvOiBtb3ZlIHRoaXMgbWV0aG9kIHRvIG1hbmFnZXI/IG9yIGNyZWF0ZSBhIHNob3J0Y3V0P1xuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaGFzUmVsYXRpb24gPSBmdW5jdGlvbiAodGFyZ2V0LCByZWxhdGlvbikge1xuICAgICAgICB2YXIgZW50aXR5TWV0YWRhdGEgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TWV0YWRhdGEodGFyZ2V0KTtcbiAgICAgICAgdmFyIHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocmVsYXRpb24pID8gcmVsYXRpb24gOiBbcmVsYXRpb25dO1xuICAgICAgICByZXR1cm4gcmVsYXRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChyZWxhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICEhZW50aXR5TWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChyZWxhdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhIHBhcmFtZXRlciBmb3IgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaGFzUGFyYW1ldGVyID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNQYXJhbWV0ZXIoa2V5KSkgfHwga2V5IGluIHRoaXMuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBwYXJhbWV0ZXIgbmFtZSBhbmQgaXRzIHZhbHVlLlxuICAgICAqXG4gICAgICogVGhlIGtleSBmb3IgdGhpcyBwYXJhbWV0ZXJlIG1heSBjb250YWluIG51bWJlcnMsIGxldHRlcnMsIHVuZGVyc2NvcmVzLCBvciBwZXJpb2RzLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0UGFyYW1ldGVyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJGdW5jdGlvbiBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkIGluIHRoZSBwYXJhbWV0ZXJzLiBQbGVhc2UgY2hlY2sgXFxcIlwiICsga2V5ICsgXCJcXFwiIHBhcmFtZXRlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFrZXkubWF0Y2goL14oW0EtWmEtejAtOV8uXSspJC8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUXVlcnlCdWlsZGVyIHBhcmFtZXRlciBrZXlzIG1heSBvbmx5IGNvbnRhaW4gbnVtYmVycywgbGV0dGVycywgdW5kZXJzY29yZXMsIG9yIHBlcmlvZHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudFF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIuc2V0UGFyYW1ldGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkKF9jLnZhbHVlLCAyKSwga2V5ID0gX2RbMF0sIHZhbHVlID0gX2RbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlUGFyYW1ldGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gXCJvcm1fcGFyYW1fXCIgKyB0aGlzLnBhcmFtZXRlckluZGV4Kys7XG4gICAgICAgIH0gd2hpbGUgKHRoaXMuaGFzUGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpKTtcbiAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gXCI6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuYXRpdmUgcGFyYW1ldGVycyBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYHNldFBhcmFtZXRlcnNgIGluc3RlYWRcbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldE5hdGl2ZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBzZXQgcGFyZW50IHF1ZXJ5IGJ1aWxkZXIgcGFyYW1ldGVycyBhcyB3ZWxsIGluIHN1Yi1xdWVyeSBtb2RlXG4gICAgICAgIGlmICh0aGlzLnBhcmVudFF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRRdWVyeUJ1aWxkZXIuc2V0TmF0aXZlUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVyc1trZXldID0gcGFyYW1ldGVyc1trZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmV4cHJlc3Npb25NYXAucGFyYW1ldGVycyk7XG4gICAgICAgIC8vIGFkZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBwYXJhbWV0ZXIgaWYgaXQgZXhpc3RcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uICYmIG1ldGFkYXRhLnBhcmVudEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG1ldGFkYXRhLmNoaWxkRW50aXR5TWV0YWRhdGFzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkTWV0YWRhdGEpIHsgcmV0dXJuIGNoaWxkTWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbjsgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY2hpbGRNZXRhZGF0YSkgeyByZXR1cm4gY2hpbGRNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWU7IH0pO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKG1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcImRpc2NyaW1pbmF0b3JDb2x1bW5WYWx1ZXNcIl0gPSB2YWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmludHMgc3FsIHRvIHN0ZG91dCB1c2luZyBjb25zb2xlLmxvZy5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnByaW50U3FsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHF1ZXJ5ID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBnZW5lcmF0ZWQgc3FsIHRoYXQgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBQYXJhbWV0ZXJzIGluIHRoZSBxdWVyeSBhcmUgZXNjYXBlZCBmb3IgdGhlIGN1cnJlbnRseSB1c2VkIGRyaXZlci5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFNxbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKClbMF07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHF1ZXJ5IHRvIGJlIGV4ZWN1dGVkIHdpdGggYWxsIHBhcmFtZXRlcnMgdXNlZCBpbiBpdC5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFF1ZXJ5QW5kUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcyBleGVjdXRpb24gb3JkZXIgaXMgaW1wb3J0YW50IGJlY2F1c2UgZ2V0UXVlcnkgbWV0aG9kIGdlbmVyYXRlcyB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycyB2YWx1ZXNcbiAgICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5nZXRRdWVyeSgpO1xuICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5lc2NhcGVRdWVyeVdpdGhQYXJhbWV0ZXJzKHF1ZXJ5LCBwYXJhbWV0ZXJzLCB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBzcWwgZ2VuZXJhdGVkIGJ5IHF1ZXJ5IGJ1aWxkZXIgYW5kIHJldHVybnMgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNxbCwgcGFyYW1ldGVycywgcXVlcnlSdW5uZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsICwgMywgNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9iLnNlbnQoKV07IC8vIGF3YWl0IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGZpbmFsbHlcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29tcGxldGVseSBuZXcgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBVc2VzIHNhbWUgcXVlcnkgcnVubmVyIGFzIGN1cnJlbnQgUXVlcnlCdWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jb25uZWN0aW9uLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsb25lcyBxdWVyeSBidWlsZGVyIGFzIGl0IGlzLlxuICAgICAqIE5vdGU6IGl0IHVzZXMgbmV3IHF1ZXJ5IHJ1bm5lciwgaWYgeW91IHdhbnQgcXVlcnkgYnVpbGRlciB0aGF0IHVzZXMgZXhhY3RseSBzYW1lIHF1ZXJ5IHJ1bm5lcixcbiAgICAgKiB5b3UgY2FuIGNyZWF0ZSBxdWVyeSBidWlsZGVyIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciwgZm9yIGV4YW1wbGUgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcihxdWVyeUJ1aWxkZXIpXG4gICAgICogd2hlcmUgcXVlcnlCdWlsZGVyIGlzIGNsb25lZCBRdWVyeUJ1aWxkZXIuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jbHVkZXMgYSBRdWVyeSBjb21tZW50IGluIHRoZSBxdWVyeSBidWlsZGVyLiAgVGhpcyBpcyBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsXG4gICAgICogc3VjaCBhcyBmaW5kaW5nIGEgc3BlY2lmaWMgcXVlcnkgaW4gdGhlIGRhdGFiYXNlIHNlcnZlcidzIGxvZ3MsIG9yIGZvciBjYXRlZ29yaXphdGlvbiB1c2luZ1xuICAgICAqIGFuIEFQTSBwcm9kdWN0LlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBlc2NhcGluZy5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmRpc2FibGVFc2NhcGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmRpc2FibGVFc2NhcGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGFibGUgbmFtZSwgY29sdW1uIG5hbWUgb3IgYWxpYXMgbmFtZSB1c2luZyBjdXJyZW50IGRhdGFiYXNlJ3MgZXNjYXBpbmcgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAuZGlzYWJsZUVzY2FwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgb3Igb3ZlcnJpZGVzIHF1ZXJ5IGJ1aWxkZXIncyBRdWVyeVJ1bm5lci5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldFF1ZXJ5UnVubmVyID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgbGlzdGVuZXJzIGFuZCBzdWJzY3JpYmVycyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW5kIGFmdGVyIHF1ZXJ5IGV4ZWN1dGlvbi5cbiAgICAgKiBFbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jYWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byB0cnVlIHRoZSBxdWVyeSB3aWxsIGJlIHdyYXBwZWQgaW50byBhIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUudXNlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGVzY2FwZWQgdGFibGUgbmFtZSB3aXRoIHNjaGVtYSBuYW1lIGlmIFNxbFNlcnZlciBkcml2ZXIgdXNlZCB3aXRoIGN1c3RvbVxuICAgICAqIHNjaGVtYSBuYW1lLCBvdGhlcndpc2UgcmV0dXJucyBlc2NhcGVkIHRhYmxlIG5hbWUuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRUYWJsZU5hbWUgPSBmdW5jdGlvbiAodGFibGVQYXRoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0YWJsZVBhdGguc3BsaXQoXCIuXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGNvbmRpdGlvbiBuZWVkIGJlY2F1c2UgaW4gU1FMIFNlcnZlciBkcml2ZXIgd2hlbiBjdXN0b20gZGF0YWJhc2UgbmFtZSB3YXMgc3BlY2lmaWVkIGFuZCBzY2hlbWEgbmFtZSB3YXMgbm90LCB3ZSBnb3QgYGRiTmFtZS4udGFibGVOYW1lYCBzdHJpbmcsIGFuZCBkb2Vzbid0IG5lZWQgdG8gZXNjYXBlIG1pZGRsZSBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgIGlmIChpID09PSBcIlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShpKTtcbiAgICAgICAgfSkuam9pbihcIi5cIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIGluc2VydCBzaG91bGQgYmUgcGVyZm9ybWVkLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0TWFpblRhYmxlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aGVyZSB2YWx1ZXMgc2hvdWxkIGJlIGluc2VydGVkIGlzIG5vdCBzcGVjaWZpZWQuIENhbGwgXFxcInFiLmludG8oZW50aXR5KVxcXCIgbWV0aG9kIHRvIHNwZWNpZnkgaXQuXCIpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLnRhYmxlUGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMudGFibGVQYXRoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEZST00gd2hpY2ggZW50aXR5J3MgdGFibGUgc2VsZWN0L3VwZGF0ZS9kZWxldGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBBbHNvIHNldHMgYSBtYWluIHN0cmluZyBhbGlhcyBvZiB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVGcm9tQWxpYXMgPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpIHtcbiAgICAgICAgLy8gaWYgdGFibGUgaGFzIGEgbWV0YWRhdGEgdGhlbiBmaW5kIGl0IHRvIHByb3Blcmx5IGVzY2FwZSBpdHMgcHJvcGVydGllc1xuICAgICAgICAvLyBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmluZChtZXRhZGF0YSA9PiBtZXRhZGF0YS50YWJsZU5hbWUgPT09IHRhYmxlTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEoZW50aXR5VGFyZ2V0KSkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKGVudGl0eVRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZyb21cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YShlbnRpdHlUYXJnZXQpLFxuICAgICAgICAgICAgICAgIHRhYmxlUGF0aDogbWV0YWRhdGEudGFibGVQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50aXR5VGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzU3VicXVlcnkgPSBlbnRpdHlUYXJnZXQuc3Vic3RyKDAsIDEpID09PSBcIihcIiAmJiBlbnRpdHlUYXJnZXQuc3Vic3RyKC0xKSA9PT0gXCIpXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZnJvbVwiLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aDogIWlzU3VicXVlcnkgPyBlbnRpdHlUYXJnZXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHN1YlF1ZXJ5OiBpc1N1YnF1ZXJ5ID8gZW50aXR5VGFyZ2V0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5QnVpbGRlciA9IGVudGl0eVRhcmdldCh0aGlzLnN1YlF1ZXJ5KCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgICAgICAgdmFyIHN1YnF1ZXJ5ID0gc3ViUXVlcnlCdWlsZGVyLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZyb21cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IHN1YnF1ZXJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYWxsIGVudGl0eSdzIHByb3BlcnR5TmFtZSB0byBuYW1lIGluIHRoZSBnaXZlbiBzdGF0ZW1lbnQuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5yZXBsYWNlUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdmFyIGVfMiwgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9HdWlkZS9SZWd1bGFyX0V4cHJlc3Npb25zI0VzY2FwaW5nXG4gICAgICAgIHZhciBlc2NhcGVSZWdFeHAgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gcy5yZXBsYWNlKC9bLiorXFwtP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7IH07XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgICAgICB2YXIgZV8zLCBfZCwgZV80LCBfZSwgZV81LCBfZiwgZV82LCBfZywgZV83LCBfaCwgZV84LCBfajtcbiAgICAgICAgICAgIGlmICghYWxpYXMuaGFzTWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIHZhciByZXBsYWNlQWxpYXNOYW1lUHJlZml4ID0gdGhpc18xLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA/IGFsaWFzLm5hbWUgKyBcIi5cIiA6IFwiXCI7XG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnRBbGlhc05hbWVQcmVmaXggPSB0aGlzXzEuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID8gdGhpc18xLmVzY2FwZShhbGlhcy5uYW1lKSArIFwiLlwiIDogXCJcIjtcbiAgICAgICAgICAgIHZhciByZXBsYWNlbWVudHMgPSB7fTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0ICYgb3ZlcndyaXRlIHRoZSByZXBsYWNlbWVudHMgZnJvbSBsZWFzdCB0byBtb3N0IHJlbGV2YW50IGluIG91ciByZXBsYWNlbWVudHMgb2JqZWN0LlxuICAgICAgICAgICAgICAgIC8vIFRvIGRvIHRoaXMgd2UgaXRlcmF0ZSBhbmQgb3ZlcndyaXRlIGluIHRoZSBvcmRlciBvZiByZWxldmFuY2UuXG4gICAgICAgICAgICAgICAgLy8gTGVhc3QgdG8gTW9zdCBSZWxldmFudDpcbiAgICAgICAgICAgICAgICAvLyAqIFJlbGF0aW9uIFByb3BlcnR5IFBhdGggdG8gZmlyc3Qgam9pbiBjb2x1bW4ga2V5XG4gICAgICAgICAgICAgICAgLy8gKiBSZWxhdGlvbiBQcm9wZXJ0eSBQYXRoICsgQ29sdW1uIFBhdGhcbiAgICAgICAgICAgICAgICAvLyAqIENvbHVtbiBEYXRhYmFzZSBOYW1lXG4gICAgICAgICAgICAgICAgLy8gKiBDb2x1bW4gUHJvcGV0eSBOYW1lXG4gICAgICAgICAgICAgICAgLy8gKiBDb2x1bW4gUHJvcGVydHkgUGF0aFxuICAgICAgICAgICAgICAgIGZvciAodmFyIF9rID0gKGVfMyA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEucmVsYXRpb25zKSksIF9sID0gX2submV4dCgpOyAhX2wuZG9uZTsgX2wgPSBfay5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gX2wudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW3JlbGF0aW9uLnByb3BlcnR5UGF0aF0gPSByZWxhdGlvbi5qb2luQ29sdW1uc1swXS5kYXRhYmFzZU5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfbCAmJiAhX2wuZG9uZSAmJiAoX2QgPSBfay5yZXR1cm4pKSBfZC5jYWxsKF9rKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfbSA9IChlXzQgPSB2b2lkIDAsIF9fdmFsdWVzKGFsaWFzLm1ldGFkYXRhLnJlbGF0aW9ucykpLCBfbyA9IF9tLm5leHQoKTsgIV9vLmRvbmU7IF9vID0gX20ubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IF9vLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX3AgPSAoZV81ID0gdm9pZCAwLCBfX3ZhbHVlcyhfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChyZWxhdGlvbi5qb2luQ29sdW1ucyksIGZhbHNlKSwgX19yZWFkKHJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucyksIGZhbHNlKSkpLCBfcSA9IF9wLm5leHQoKTsgIV9xLmRvbmU7IF9xID0gX3AubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpvaW5Db2x1bW4gPSBfcS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlLZXkgPSByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW3Byb3BlcnR5S2V5XSA9IGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzVfMSkgeyBlXzUgPSB7IGVycm9yOiBlXzVfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3EgJiYgIV9xLmRvbmUgJiYgKF9mID0gX3AucmV0dXJuKSkgX2YuY2FsbChfcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNSkgdGhyb3cgZV81LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9vICYmICFfby5kb25lICYmIChfZSA9IF9tLnJldHVybikpIF9lLmNhbGwoX20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9yID0gKGVfNiA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfcyA9IF9yLm5leHQoKTsgIV9zLmRvbmU7IF9zID0gX3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5kYXRhYmFzZU5hbWVdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV82XzEpIHsgZV82ID0geyBlcnJvcjogZV82XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9zICYmICFfcy5kb25lICYmIChfZyA9IF9yLnJldHVybikpIF9nLmNhbGwoX3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNikgdGhyb3cgZV82LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF90ID0gKGVfNyA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfdSA9IF90Lm5leHQoKTsgIV91LmRvbmU7IF91ID0gX3QubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5wcm9wZXJ0eU5hbWVdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV83XzEpIHsgZV83ID0geyBlcnJvcjogZV83XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF91ICYmICFfdS5kb25lICYmIChfaCA9IF90LnJldHVybikpIF9oLmNhbGwoX3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF92ID0gKGVfOCA9IHZvaWQgMCwgX192YWx1ZXMoYWxpYXMubWV0YWRhdGEuY29sdW1ucykpLCBfdyA9IF92Lm5leHQoKTsgIV93LmRvbmU7IF93ID0gX3YubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfdy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzW2NvbHVtbi5wcm9wZXJ0eVBhdGhdID0gY29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84XzEpIHsgZV84ID0geyBlcnJvcjogZV84XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF93ICYmICFfdy5kb25lICYmIChfaiA9IF92LnJldHVybikpIF9qLmNhbGwoX3YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfOCkgdGhyb3cgZV84LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnRLZXlzID0gT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKTtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudEtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UobmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBhIGxvb2tiZWhpbmQgaGVyZSBzaW5jZSBpdCdzIG5vdCB3ZWxsIHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIFwiKFsgPShdfF4uezB9KVwiICtcbiAgICAgICAgICAgICAgICAgICAgKGVzY2FwZVJlZ0V4cChyZXBsYWNlQWxpYXNOYW1lUHJlZml4KSArIFwiKFwiICsgcmVwbGFjZW1lbnRLZXlzLm1hcChlc2NhcGVSZWdFeHApLmpvaW4oXCJ8XCIpICsgXCIpXCIpICtcbiAgICAgICAgICAgICAgICAgICAgXCIoPz1bID0pLF18LnswfSQpXCIsIFwiZ21cIiksIGZ1bmN0aW9uIChfLCBwcmUsIHApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBwcmUgKyByZXBsYWNlbWVudEFsaWFzTmFtZVByZWZpeCArIF90aGlzLmVzY2FwZShyZXBsYWNlbWVudHNbcF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGhpc18xID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5leHByZXNzaW9uTWFwLmFsaWFzZXMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsaWFzID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgX2xvb3BfMShhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBTlNJIFNRTCAyMDAzIHN1cHBvcnQgQyBzdHlsZSBjb21tZW50cyAtIGNvbW1lbnRzIHRoYXQgc3RhcnQgd2l0aCBgLypgIGFuZCBlbmQgd2l0aCBgKi9gXG4gICAgICAgIC8vIEluIHNvbWUgZGlhbGVjdHMgcXVlcnkgbmVzdGluZyBpcyBhdmFpbGFibGUgLSBidXQgbm90IGFsbC4gIEJlY2F1c2Ugb2YgdGhpcywgd2UnbGwgbmVlZFxuICAgICAgICAvLyB0byBzY3J1YiBcImVuZGluZ1wiIGNoYXJhY3RlcnMgZnJvbSB0aGUgU1FMIGJ1dCBvdGhlcndpc2Ugd2UgY2FuIGxlYXZlIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAvLyBhcy1pcyBhbmQgaXQgc2hvdWxkIGJlIHZhbGlkLlxuICAgICAgICByZXR1cm4gXCIvKiBcIiArIHRoaXMuZXhwcmVzc2lvbk1hcC5jb21tZW50LnJlcGxhY2UoXCIqL1wiLCBcIlwiKSArIFwiICovIFwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIldIRVJFXCIgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVdoZXJlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbnNBcnJheSA9IFtdO1xuICAgICAgICB2YXIgd2hlcmVFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVXaGVyZUNsYXVzZXNFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMpO1xuICAgICAgICBpZiAod2hlcmVFeHByZXNzaW9uLmxlbmd0aCA+IDAgJiYgd2hlcmVFeHByZXNzaW9uICE9PSBcIjE9MVwiKSB7XG4gICAgICAgICAgICBjb25kaXRpb25zQXJyYXkucHVzaCh0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKHdoZXJlRXhwcmVzc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgLy8gQWRkcyB0aGUgZ2xvYmFsIGNvbmRpdGlvbiBvZiBcIm5vbi1kZWxldGVkXCIgZm9yIHRoZSBlbnRpdHkgd2l0aCBkZWxldGUgZGF0ZSBjb2x1bW5zIGluIHNlbGVjdCBxdWVyeS5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcInNlbGVjdFwiICYmICF0aGlzLmV4cHJlc3Npb25NYXAud2l0aERlbGV0ZWQgJiYgbWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgbWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW4pICsgXCIgSVMgTlVMTFwiO1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNBcnJheS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbiAmJiBtZXRhZGF0YS5wYXJlbnRFbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgbWV0YWRhdGEuZGlzY3JpbWluYXRvckNvbHVtbi5kYXRhYmFzZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW4pICsgXCIgSU4gKDouLi5kaXNjcmltaW5hdG9yQ29sdW1uVmFsdWVzKVwiO1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNBcnJheS5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb24pO1xuICAgICAgICAgICAgY29uZGl0aW9uc0FycmF5LnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmRpdGlvbnNBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbmRpdGlvbnNBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBcIiBXSEVSRSBcIiArIGNvbmRpdGlvbnNBcnJheVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIiBXSEVSRSAoIFwiICsgY29uZGl0aW9uc0FycmF5LmpvaW4oXCIgKSBBTkQgKCBcIikgKyBcIiApXCI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJSRVRVUk5JTkdcIiAvIFwiT1VUUFVUXCIgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVJldHVybmluZ0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjb2x1bW5zID0gdGhpcy5nZXRSZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgIHZhciBkcml2ZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyO1xuICAgICAgICAvLyBhbHNvIGFkZCBjb2x1bW5zIHdlIG11c3QgYXV0by1yZXR1cm4gdG8gcGVyZm9ybSBlbnRpdHkgdXBkYXRpb25cbiAgICAgICAgLy8gaWYgdXNlciBnYXZlIGhpcyBvd24gcmV0dXJuaW5nXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZyAhPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBkcml2ZXIuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoLmFwcGx5KGNvbHVtbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnMuaW5kZXhPZihjb2x1bW4pID09PSAtMTtcbiAgICAgICAgICAgIH0pKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zRXhwcmVzc2lvbiA9IGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IF90aGlzLmVzY2FwZShjb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJpbnNlcnRcIiB8fCBfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJ1cGRhdGVcIiB8fCBfdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9PT0gXCJzb2Z0LWRlbGV0ZVwiIHx8IF90aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcInJlc3RvcmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiSU5TRVJURUQuXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShfdGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIuXCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uc0V4cHJlc3Npb24gKz0gXCIgSU5UTyBcIiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyZWF0ZVBhcmFtZXRlcih7IHR5cGU6IGRyaXZlci5jb2x1bW5UeXBlVG9OYXRpdmVQYXJhbWV0ZXIoY29sdW1uLnR5cGUpLCBkaXI6IGRyaXZlci5vcmFjbGUuQklORF9PVVQgfSk7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlID09PSBcImluc2VydFwiIHx8IHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPT09IFwidXBkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uc0V4cHJlc3Npb24gKz0gXCIgSU5UTyBAT3V0cHV0VGFibGVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uc0V4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgcmV0dXJuaW5nIC8gb3V0cHV0IGNhdXNlIGlzIHNldCB0byBhcnJheSBvZiBjb2x1bW4gbmFtZXMsXG4gICAgICogdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgY29sdW1uIG1ldGFkYXRhcyBvZiB0aG9zZSBjb2x1bW4gbmFtZXMuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRSZXR1cm5pbmdDb2x1bW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucyA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaC5hcHBseShjb2x1bW5zLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuZmluZENvbHVtbnNXaXRoUHJvcGVydHlQYXRoKGNvbHVtbk5hbWUpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlV2hlcmVDbGF1c2VzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChjbGF1c2VzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjbGF1c2VzLm1hcChmdW5jdGlvbiAoY2xhdXNlLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBfdGhpcy5jcmVhdGVXaGVyZUNvbmRpdGlvbkV4cHJlc3Npb24oY2xhdXNlLmNvbmRpdGlvbik7XG4gICAgICAgICAgICBzd2l0Y2ggKGNsYXVzZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImFuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID4gMCA/IFwiQU5EIFwiIDogXCJcIikgKyBleHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvclwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4ID4gMCA/IFwiT1IgXCIgOiBcIlwiKSArIGV4cHJlc3Npb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgICAgfSkuam9pbihcIiBcIikudHJpbSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgZ2l2ZW4gd2hlcmUgYXJndW1lbnQgLSB0cmFuc2Zvcm1zIHRvIGEgd2hlcmUgc3RyaW5nIGFsbCBmb3JtcyBpdCBjYW4gdGFrZS5cbiAgICAgKi9cbiAgICBRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChjb25kaXRpb24sIGFsd2F5c1dyYXApIHtcbiAgICAgICAgaWYgKGFsd2F5c1dyYXAgPT09IHZvaWQgMCkgeyBhbHdheXNXcmFwID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb24pKSB7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjE9MVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgcHJvYmFibHkgcmVtb3ZlIHRoaXMgZW50aXJlIGNvbmRpdGlvblxuICAgICAgICAgICAgLy8gYnV0IGZvciBub3cgdG8gcHJldmVudCBhbnkgYnJlYWtpbmcgY2hhbmdlcyBpdCBleGlzdHMuXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmxlbmd0aCA9PT0gMSAmJiAhYWx3YXlzV3JhcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdoZXJlQ2xhdXNlc0V4cHJlc3Npb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIihcIiArIHRoaXMuY3JlYXRlV2hlcmVDbGF1c2VzRXhwcmVzc2lvbihjb25kaXRpb24pICsgXCIpXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXI7XG4gICAgICAgIHN3aXRjaCAoY29uZGl0aW9uLm9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIFwibGVzc1RoYW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiA8IFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV07XG4gICAgICAgICAgICBjYXNlIFwibGVzc1RoYW5PckVxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgPD0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJtb3JlVGhhblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiID4gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJtb3JlVGhhbk9yRXF1YWxcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiA+PSBcIiArIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICAgICAgY2FzZSBcIm5vdEVxdWFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgIT0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJlcXVhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiID0gXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgIGNhc2UgXCJpbGlrZVwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBDb2Nrcm9hY2hEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgSUxJS0UgXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVVBQRVIoXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiKSBMSUtFIFVQUEVSKFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV0gKyBcIilcIjtcbiAgICAgICAgICAgIGNhc2UgXCJsaWtlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgTElLRSBcIiArIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICAgICAgY2FzZSBcImJldHdlZW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnBhcmFtZXRlcnNbMF0gKyBcIiBCRVRXRUVOIFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnNbMV0gKyBcIiBBTkQgXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1syXTtcbiAgICAgICAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24ucGFyYW1ldGVycy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIwPTFcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgSU4gKFwiICsgY29uZGl0aW9uLnBhcmFtZXRlcnMuc2xpY2UoMSkuam9pbihcIiwgXCIpICsgXCIpXCI7XG4gICAgICAgICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi5wYXJhbWV0ZXJzWzBdICsgXCIgPSBBTlkoXCIgKyBjb25kaXRpb24ucGFyYW1ldGVyc1sxXSArIFwiKVwiO1xuICAgICAgICAgICAgY2FzZSBcImlzTnVsbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24ucGFyYW1ldGVyc1swXSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgIGNhc2UgXCJub3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJOT1QoXCIgKyB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb24uY29uZGl0aW9uKSArIFwiKVwiO1xuICAgICAgICAgICAgY2FzZSBcImJyYWNrZXRzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihjb25kaXRpb24uY29uZGl0aW9uLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5zdXBwb3J0ZWQgRmluZE9wZXJhdG9yIFwiICsgRmluZE9wZXJhdG9yLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIldIRVJFXCIgY29uZGl0aW9uIGZvciBhbiBpbi1pZHMgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbiA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICB2YXIgbm9ybWFsaXplZCA9IChBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXSkubWFwKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gbWV0YWRhdGEuZW5zdXJlRW50aXR5SWRNYXAoaWQpOyB9KTtcbiAgICAgICAgLy8gdXNpbmcgaW4oLi4uaWRzKSBmb3Igc2luZ2xlIHByaW1hcnkga2V5IGVudGl0aWVzXG4gICAgICAgIGlmICghbWV0YWRhdGEuaGFzTXVsdGlwbGVQcmltYXJ5S2V5cykge1xuICAgICAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5fMSA9IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdO1xuICAgICAgICAgICAgLy8gZ2V0RW50aXR5VmFsdWUgd2lsbCB0cnkgdG8gdHJhbnNmb3JtIGBJbmAsIGl0IGlzIGEgYnVnXG4gICAgICAgICAgICAvLyB0b2RvOiByZW1vdmUgdGhpcyB0cmFuc2Zvcm1lciBjaGVjayBhZnRlciAjMjM5MCBpcyBmaXhlZFxuICAgICAgICAgICAgLy8gVGhpcyBhbHNvIGZhaWxzIGZvciBlbWJlZGRlZCAmIHJlbGF0aW9uLCBzbyB1bnRpbCB0aGF0IGlzIGZpeGVkIHNraXAgaXQuXG4gICAgICAgICAgICBpZiAoIXByaW1hcnlDb2x1bW5fMS50cmFuc2Zvcm1lciAmJiAhcHJpbWFyeUNvbHVtbl8xLnJlbGF0aW9uTWV0YWRhdGEgJiYgIXByaW1hcnlDb2x1bW5fMS5lbWJlZGRlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgIF9hW3ByaW1hcnlDb2x1bW5fMS5wcm9wZXJ0eU5hbWVdID0gSW4obm9ybWFsaXplZC5tYXAoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBwcmltYXJ5Q29sdW1uXzEuZ2V0RW50aXR5VmFsdWUoaWQsIGZhbHNlKTsgfSkpLFxuICAgICAgICAgICAgICAgICAgICBfYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEJyYWNrZXRzKGZ1bmN0aW9uIChxYikge1xuICAgICAgICAgICAgdmFyIGVfOSwgX2E7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcWIub3JXaGVyZShuZXcgQnJhY2tldHMoZnVuY3Rpb24gKHFiKSB7IHJldHVybiBxYi53aGVyZShkYXRhKTsgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbm9ybWFsaXplZF8xID0gX192YWx1ZXMobm9ybWFsaXplZCksIG5vcm1hbGl6ZWRfMV8xID0gbm9ybWFsaXplZF8xLm5leHQoKTsgIW5vcm1hbGl6ZWRfMV8xLmRvbmU7IG5vcm1hbGl6ZWRfMV8xID0gbm9ybWFsaXplZF8xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG5vcm1hbGl6ZWRfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzlfMSkgeyBlXzkgPSB7IGVycm9yOiBlXzlfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZF8xXzEgJiYgIW5vcm1hbGl6ZWRfMV8xLmRvbmUgJiYgKF9hID0gbm9ybWFsaXplZF8xLnJldHVybikpIF9hLmNhbGwobm9ybWFsaXplZF8xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZmluZENvbHVtbnNGb3JQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG4gICAgICAgIC8vIE1ha2UgYSBoZWxwZXIgdG8gaXRlcmF0ZSB0aGUgZW50aXR5ICYgcmVsYXRpb25zP1xuICAgICAgICAvLyBVc2UgdGhhdCB0byBzZXQgdGhlIGNvcnJlY3QgYWxpYXM/ICBPciB0aGUgb3RoZXIgd2F5IGFyb3VuZD9cbiAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGUgbWFpbiBhbGlhcyB3aXRoIG91ciBwcm9wZXJ0eSBwYXRoc1xuICAgICAgICB2YXIgYWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzO1xuICAgICAgICB2YXIgcm9vdCA9IFtdO1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcHJvcGVydHlQYXRoUGFydHNbMF07XG4gICAgICAgICAgICBpZiAoIShhbGlhcyA9PT0gbnVsbCB8fCBhbGlhcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWxpYXMuaGFzTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGlhcy5tZXRhZGF0YS5oYXNFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocGFydCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGVtYmVkZGVkIHRoZW4gd2Ugc2hvdWxkIGNvbWJpbmUgdGhlIHR3byBhcyBwYXJ0IG9mIG91ciBsb29rdXAuXG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBqdXN0IGJyZWFraW5nLCB3ZSBrZWVwIGdvaW5nIHdpdGggdGhpcyBpbiBjYXNlIHRoZXJlJ3MgYW4gZW1iZWRkZWQvcmVsYXRpb25cbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gZW1iZWRkZWQuXG4gICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoUGFydHMudW5zaGlmdChwcm9wZXJ0eVBhdGhQYXJ0cy5zaGlmdCgpICsgXCIuXCIgKyBwcm9wZXJ0eVBhdGhQYXJ0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsaWFzLm1ldGFkYXRhLmhhc1JlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwYXJ0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZWxhdGlvbiB0aGVuIHdlIHNob3VsZCBmaW5kIHRoZSBhbGlhc2VzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaCB0aGUgcmVsYXRpb24gJiB0aGVuIGNvbnRpbnVlIGZ1cnRoZXIgZG93blxuICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBwYXRoXG4gICAgICAgICAgICAgICAgdmFyIGpvaW5BdHRyID0gdGhpc18yLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMuZmluZChmdW5jdGlvbiAoam9pbkF0dHIpIHsgcmV0dXJuIGpvaW5BdHRyLnJlbGF0aW9uUHJvcGVydHlQYXRoID09PSBwYXJ0OyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIShqb2luQXR0ciA9PT0gbnVsbCB8fCBqb2luQXR0ciA9PT0gdm9pZCAwID8gdm9pZCAwIDogam9pbkF0dHIuYWxpYXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmdWxsUmVsYXRpb25QYXRoID0gcm9vdC5sZW5ndGggPiAwID8gcm9vdC5qb2luKFwiLlwiKSArIFwiLlwiICsgcGFydCA6IHBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGFsaWFzIGZvciByZWxhdGlvbiBhdCBcIiArIGZ1bGxSZWxhdGlvblBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbGlhcyA9IGpvaW5BdHRyLmFsaWFzO1xuICAgICAgICAgICAgICAgIHJvb3QucHVzaC5hcHBseShyb290LCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocGFydC5zcGxpdChcIi5cIikpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aFBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0aGlzXzIgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocHJvcGVydHlQYXRoUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8zKCk7XG4gICAgICAgICAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWxpYXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGFsaWFzIGZvciBwcm9wZXJ0eSBcIiArIHByb3BlcnR5UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtYWluaW5nIHBhcnRzIGFyZSBjb21iaW5lZCBiYWNrIGFuZCB1c2VkIHRvIGZpbmQgdGhlIGFjdHVhbCBwcm9wZXJ0eSBwYXRoXG4gICAgICAgIHZhciBhbGlhc1Byb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aFBhcnRzLmpvaW4oXCIuXCIpO1xuICAgICAgICB2YXIgY29sdW1ucyA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChhbGlhc1Byb3BlcnR5UGF0aCk7XG4gICAgICAgIGlmICghY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb2x1bW5Ob3RGb3VuZChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYWxpYXMsIHJvb3QsIGNvbHVtbnNdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByb3BlcnR5IHBhdGhzIGZvciBhIGdpdmVuIE9iamVjdExpdGVyYWwuXG4gICAgICovXG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVQcm9wZXJ0eVBhdGggPSBmdW5jdGlvbiAobWV0YWRhdGEsIGVudGl0eSwgcHJlZml4KSB7XG4gICAgICAgIHZhciBlXzEwLCBfYTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdm9pZCAwKSB7IHByZWZpeCA9IFwiXCI7IH1cbiAgICAgICAgdmFyIHBhdGhzID0gW107XG4gICAgICAgIHZhciBfbG9vcF80ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHBhdGggPSBwcmVmaXggPyBwcmVmaXggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICAgICAgICAgIC8vIFRoZXJlJ3MgdGltZXMgd2hlcmUgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byB0cmF2ZXJzZSBkZWVwZXIuXG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBgRmluZE9wZXJhdG9yYCwgb3IgbnVsbCwgb3Igbm90IGFuIG9iamVjdCwgdGhlbiB3ZSBkb24ndCwgZm9yIGV4YW1wbGUuXG4gICAgICAgICAgICBpZiAoZW50aXR5W2tleV0gPT09IG51bGwgfHwgdHlwZW9mIGVudGl0eVtrZXldICE9PSBcIm9iamVjdFwiIHx8IGVudGl0eVtrZXldIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmhhc0VtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJQYXRocyA9IHRoaXNfMy5jcmVhdGVQcm9wZXJ0eVBhdGgobWV0YWRhdGEsIGVudGl0eVtrZXldLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBwYXRocy5wdXNoLmFwcGx5KHBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViUGF0aHMpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuaGFzUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwYXRoKTtcbiAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFsc28gY2FzZXMgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gYmFjayBhbGwgb2YgdGhlIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHNvbWVvbmUgcGFzc2VzIHRoZSBtb2RlbCAmIHdlIGRvbid0IG5lZWQgdG8gbWFrZVxuICAgICAgICAgICAgICAgIC8vIGEgSFVHRSBgd2hlcmVgIHRvIHVuaXF1ZWx5IGxvb2sgdXAgdGhlIGVudGl0eS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhICotdG8tb25lLCB0aGVyZSdzIG9ubHkgZXZlciBvbmUgcG9zc2libGUgZW50aXR5IG9uIHRoZSBvdGhlciBzaWRlXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgdGhlIGpvaW4gY29sdW1ucyBhcmUgYWxsIGRlZmluZWQgd2UgY2FuIHJldHVybiBqdXN0IHRoZSByZWxhdGlvbiBpdHNlbGZcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGl0IHdpbGwgZmV0Y2ggb25seSB0aGUgam9pbiBjb2x1bW5zIGFuZCBkbyB0aGUgbG9va3VwLlxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFwib25lLXRvLW9uZVwiIHx8IHJlbGF0aW9uLnJlbGF0aW9uVHlwZSA9PT0gXCJtYW55LXRvLW9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChqKSB7IHJldHVybiBqLnJlZmVyZW5jZWRDb2x1bW47IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChqKSB7IHJldHVybiAhIWo7IH0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzQWxsSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5sZW5ndGggPiAwICYmIGpvaW5Db2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHlba2V5XSwgZmFsc2UpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FsbEpvaW5Db2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBcIm9uZS10by1tYW55XCIgfHwgcmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBcIm1hbnktdG8tbWFueVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBxdWVyeSBhY3Jvc3MgXCIgKyByZWxhdGlvbi5yZWxhdGlvblR5cGUgKyBcIiBmb3IgcHJvcGVydHkgXCIgKyBwYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRm9yIGFueSBvdGhlciBjYXNlLCBpZiB0aGUgYGVudGl0eVtrZXldYCBjb250YWlucyBhbGwgb2YgdGhlIHByaW1hcnkga2V5cyB3ZSBjYW4gZG8gYVxuICAgICAgICAgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlc2UuICBXZSBkb24ndCBuZWVkIHRvIGxvb2sgdXAgdmlhIGFueSBvdGhlciB2YWx1ZXMgJ2NhdXNlIHRoZXNlIGFyZVxuICAgICAgICAgICAgICAgIC8vIHRoZSB1bmlxdWUgcHJpbWFyeSBrZXlzLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHNvbWVvbmUgcGFzc2VzIHRoZSBtb2RlbCAmIHdlIGRvbid0IG5lZWQgdG8gbWFrZVxuICAgICAgICAgICAgICAgIC8vIGEgSFVHRSB3aGVyZS5cbiAgICAgICAgICAgICAgICB2YXIgcHJpbWFyeUNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgdmFyIGhhc0FsbFByaW1hcnlLZXlzID0gcHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMCAmJiBwcmltYXJ5Q29sdW1ucy5ldmVyeShmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5W2tleV0sIGZhbHNlKTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0FsbFByaW1hcnlLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJQYXRoc18xID0gcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIHBhdGggKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICAgICAgICAgICAgICBwYXRocy5wdXNoLmFwcGx5KHBhdGhzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoc3ViUGF0aHNfMSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgZWxzZSwganVzdCByZXR1cm4gZXZlcnkgcHJvcGVydHkgdGhhdCdzIGJlaW5nIHBhc3NlZCB0byB1cy5cbiAgICAgICAgICAgICAgICB2YXIgc3ViUGF0aHMgPSB0aGlzXzMuY3JlYXRlUHJvcGVydHlQYXRoKHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgZW50aXR5W2tleV0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHBhdGggKyBcIi5cIiArIHA7IH0pO1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2guYXBwbHkocGF0aHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzdWJQYXRocyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB0aGlzXzMgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhlbnRpdHkpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBfbG9vcF80KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTBfMSkgeyBlXzEwID0geyBlcnJvcjogZV8xMF8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMCkgdGhyb3cgZV8xMC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRocztcbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UHJlZGljYXRlcyA9IGZ1bmN0aW9uICh3aGVyZSkge1xuICAgICAgICB2YXIgcHJvcGVydHlQYXRocywgcHJvcGVydHlQYXRoc18xLCBwcm9wZXJ0eVBhdGhzXzFfMSwgcHJvcGVydHlQYXRoLCBfYSwgYWxpYXMsIGFsaWFzUHJvcGVydHlQYXRoLCBjb2x1bW5zLCBjb2x1bW5zXzEsIGNvbHVtbnNfMV8xLCBjb2x1bW4sIGNvbnRhaW5lZFdoZXJlLCBhbGlhc1Byb3BlcnR5UGF0aF8xLCBhbGlhc1Byb3BlcnR5UGF0aF8xXzEsIHBhcnQsIGFsaWFzUGF0aCwgcGFyYW1ldGVyVmFsdWUsIGVfMTFfMSwgZV8xMl8xLCBfYiwgX2MsIGtleSwgcGFyYW1ldGVyVmFsdWUsIGFsaWFzUGF0aCwgZV8xM18xO1xuICAgICAgICB2YXIgZV8xMiwgX2QsIGVfMTEsIF9lLCBlXzE0LCBfZiwgZV8xMywgX2c7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2gubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhzID0gdGhpcy5jcmVhdGVQcm9wZXJ0eVBhdGgodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgd2hlcmUpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzEsIDEyLCAxMywgMTRdKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoc18xID0gX192YWx1ZXMocHJvcGVydHlQYXRocyksIHByb3BlcnR5UGF0aHNfMV8xID0gcHJvcGVydHlQYXRoc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhcHJvcGVydHlQYXRoc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGhzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQodGhpcy5maW5kQ29sdW1uc0ZvclByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpLCAzKSwgYWxpYXMgPSBfYVswXSwgYWxpYXNQcm9wZXJ0eVBhdGggPSBfYVsxXSwgY29sdW1ucyA9IF9hWzJdO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzMsIDgsIDksIDEwXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnNfMSA9IChlXzExID0gdm9pZCAwLCBfX3ZhbHVlcyhjb2x1bW5zKSksIGNvbHVtbnNfMV8xID0gY29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY29sdW1uc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGNvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZWRXaGVyZSA9IHdoZXJlO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhbGlhc1Byb3BlcnR5UGF0aF8xID0gKGVfMTQgPSB2b2lkIDAsIF9fdmFsdWVzKGFsaWFzUHJvcGVydHlQYXRoKSksIGFsaWFzUHJvcGVydHlQYXRoXzFfMSA9IGFsaWFzUHJvcGVydHlQYXRoXzEubmV4dCgpOyAhYWxpYXNQcm9wZXJ0eVBhdGhfMV8xLmRvbmU7IGFsaWFzUHJvcGVydHlQYXRoXzFfMSA9IGFsaWFzUHJvcGVydHlQYXRoXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IGFsaWFzUHJvcGVydHlQYXRoXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lZFdoZXJlIHx8ICEocGFydCBpbiBjb250YWluZWRXaGVyZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkV2hlcmUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZFdoZXJlID0gY29udGFpbmVkV2hlcmVbcGFydF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTRfMSkgeyBlXzE0ID0geyBlcnJvcjogZV8xNF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc1Byb3BlcnR5UGF0aF8xXzEgJiYgIWFsaWFzUHJvcGVydHlQYXRoXzFfMS5kb25lICYmIChfZiA9IGFsaWFzUHJvcGVydHlQYXRoXzEucmV0dXJuKSkgX2YuY2FsbChhbGlhc1Byb3BlcnR5UGF0aF8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xNCkgdGhyb3cgZV8xNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLm5hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGggOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2x1bW4uZ2V0RW50aXR5VmFsdWUoY29udGFpbmVkV2hlcmUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBbYWxpYXNQYXRoLCBwYXJhbWV0ZXJWYWx1ZV1dO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zXzFfMSA9IGNvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgZV8xMV8xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBlXzExID0geyBlcnJvcjogZV8xMV8xIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uc18xXzEgJiYgIWNvbHVtbnNfMV8xLmRvbmUgJiYgKF9lID0gY29sdW1uc18xLnJldHVybikpIF9lLmNhbGwoY29sdW1uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTEpIHRocm93IGVfMTEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhzXzFfMSA9IHByb3BlcnR5UGF0aHNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6IHJldHVybiBbMyAvKmJyZWFrKi8sIDE0XTtcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBlXzEyXzEgPSBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGVfMTIgPSB7IGVycm9yOiBlXzEyXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTRdO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlQYXRoc18xXzEgJiYgIXByb3BlcnR5UGF0aHNfMV8xLmRvbmUgJiYgKF9kID0gcHJvcGVydHlQYXRoc18xLnJldHVybikpIF9kLmNhbGwocHJvcGVydHlQYXRoc18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzMgLypicmVhayovLCAyMl07XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFsxNSwgMjAsIDIxLCAyMl0pO1xuICAgICAgICAgICAgICAgICAgICBfYiA9IF9fdmFsdWVzKE9iamVjdC5rZXlzKHdoZXJlKSksIF9jID0gX2IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE2O1xuICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgIGlmICghIV9jLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE5XTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gd2hlcmVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoID0gdGhpcy5leHByZXNzaW9uTWFwLmFsaWFzTmFtZVByZWZpeGluZ0VuYWJsZWQgPyB0aGlzLmFsaWFzICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFthbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlXV07XG4gICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDE4O1xuICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgIF9jID0gX2IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgY2FzZSAxOTogcmV0dXJuIFszIC8qYnJlYWsqLywgMjJdO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIGVfMTNfMSA9IF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZV8xMyA9IHsgZXJyb3I6IGVfMTNfMSB9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyMl07XG4gICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2cgPSBfYi5yZXR1cm4pKSBfZy5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTMpIHRocm93IGVfMTMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICBjYXNlIDIyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbiA9IGZ1bmN0aW9uIChhbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlKSB7XG4gICAgICAgIHZhciBlXzE1LCBfYTtcbiAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlIGluc3RhbmNlb2YgRmluZE9wZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLnVzZVBhcmFtZXRlcikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS5vYmplY3RMaXRlcmFsUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyVmFsdWUub2JqZWN0TGl0ZXJhbFBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbWV0ZXJWYWx1ZS5tdWx0aXBsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMocGFyYW1ldGVyVmFsdWUudmFsdWUpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2godGhpcy5jcmVhdGVQYXJhbWV0ZXIodikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzE1XzEpIHsgZV8xNSA9IHsgZXJyb3I6IGVfMTVfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTUpIHRocm93IGVfMTUuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHRoaXMuY3JlYXRlUGFyYW1ldGVyKHBhcmFtZXRlclZhbHVlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLnR5cGUgPT09IFwicmF3XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyVmFsdWUuZ2V0U3FsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJWYWx1ZS5nZXRTcWwoYWxpYXNQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJlcXVhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbWV0ZXJWYWx1ZS50eXBlID09PSBcIm5vdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogcGFyYW1ldGVyVmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbihhbGlhc1BhdGgsIHBhcmFtZXRlclZhbHVlLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJub3RFcXVhbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogX19zcHJlYWRBcnJheShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBdLCBfX3JlYWQocGFyYW1ldGVycyksIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBwYXJhbWV0ZXJWYWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBfX3NwcmVhZEFycmF5KFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aFxuICAgICAgICAgICAgICAgICAgICBdLCBfX3JlYWQocGFyYW1ldGVycyksIGZhbHNlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyYW1ldGVyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiaXNOdWxsXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiZXF1YWxcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQYXJhbWV0ZXIocGFyYW1ldGVyVmFsdWUpLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0V2hlcmVDb25kaXRpb24gPSBmdW5jdGlvbiAod2hlcmUpIHtcbiAgICAgICAgdmFyIGVfMTYsIF9hLCBlXzE3LCBfYjtcbiAgICAgICAgaWYgKHR5cGVvZiB3aGVyZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHdoZXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aGVyZSBpbnN0YW5jZW9mIEJyYWNrZXRzKSB7XG4gICAgICAgICAgICB2YXIgd2hlcmVRdWVyeUJ1aWxkZXIgPSB0aGlzLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpO1xuICAgICAgICAgICAgd2hlcmVRdWVyeUJ1aWxkZXIucGFyZW50UXVlcnlCdWlsZGVyID0gdGhpcztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkO1xuICAgICAgICAgICAgd2hlcmVRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC5wYXJhbWV0ZXJzID0gdGhpcy5leHByZXNzaW9uTWFwLnBhcmFtZXRlcnM7XG4gICAgICAgICAgICB3aGVyZVF1ZXJ5QnVpbGRlci5leHByZXNzaW9uTWFwLm5hdGl2ZVBhcmFtZXRlcnMgPSB0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycztcbiAgICAgICAgICAgIHdoZXJlUXVlcnlCdWlsZGVyLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW107XG4gICAgICAgICAgICB3aGVyZS53aGVyZUZhY3Rvcnkod2hlcmVRdWVyeUJ1aWxkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJicmFja2V0c1wiLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogd2hlcmVRdWVyeUJ1aWxkZXIuZXhwcmVzc2lvbk1hcC53aGVyZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdoZXJlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB3aGVyZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2hlcmVzID0gQXJyYXkuaXNBcnJheSh3aGVyZSkgPyB3aGVyZSA6IFt3aGVyZV07XG4gICAgICAgIHZhciBjbGF1c2VzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciB3aGVyZXNfMSA9IF9fdmFsdWVzKHdoZXJlcyksIHdoZXJlc18xXzEgPSB3aGVyZXNfMS5uZXh0KCk7ICF3aGVyZXNfMV8xLmRvbmU7IHdoZXJlc18xXzEgPSB3aGVyZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2hlcmVfMSA9IHdoZXJlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgdGhlIGNvbmRpdGlvbnMgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVyIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IChlXzE3ID0gdm9pZCAwLCBfX3ZhbHVlcyh0aGlzLmdldFByZWRpY2F0ZXMod2hlcmVfMSkpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lID0gX19yZWFkKF9kLnZhbHVlLCAyKSwgYWxpYXNQYXRoID0gX2VbMF0sIHBhcmFtZXRlclZhbHVlID0gX2VbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlUHJlZGljYXRlQ29uZGl0aW9uKGFsaWFzUGF0aCwgcGFyYW1ldGVyVmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTdfMSkgeyBlXzE3ID0geyBlcnJvcjogZV8xN18xIH07IH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2IgPSBfYy5yZXR1cm4pKSBfYi5jYWxsKF9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTcpIHRocm93IGVfMTcuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhdXNlcy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IGNvbmRpdGlvbnMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTZfMSkgeyBlXzE2ID0geyBlcnJvcjogZV8xNl8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZXNfMV8xICYmICF3aGVyZXNfMV8xLmRvbmUgJiYgKF9hID0gd2hlcmVzXzEucmV0dXJuKSkgX2EuY2FsbCh3aGVyZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTYpIHRocm93IGVfMTYuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhdXNlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGF1c2VzWzBdLmNvbmRpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhdXNlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZXhlY3V0ZSBzcWwgcXVlcmllcyBpbnNpZGUgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2J0YWluUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIH07XG4gICAgcmV0dXJuIFF1ZXJ5QnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEhlbHBlciB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgUXVlcnlCdWlsZGVyLlxuICovXG52YXIgUXVlcnlCdWlsZGVyVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVlcnlCdWlsZGVyVXRpbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eSxcbiAgICAgKiBlLmcuIFwicG9zdC5jYXRlZ29yeVwiIG9yIFwicG9zdC5pZFwiLlxuICAgICAqL1xuICAgIFF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgLy8gYWxpYXMgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZyBhbmQgbXVzdCBoYXZlIGEgZG90IHNlcGFyYXRvclxuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiB8fCBzdHIuaW5kZXhPZihcIi5cIikgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBleHRyYSBhbGlhcyBhbmQgaXRzIHByb3BlcnR5IHJlbGF0aW9uXG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChzdHIuc3BsaXQoXCIuXCIpLCAyKSwgYWxpYXNOYW1lID0gX2FbMF0sIHByb3BlcnR5TmFtZSA9IF9hWzFdOyAvLyB0b2RvOiB3aGF0IGFib3V0IHJlbGF0aW9ucyBpbiBlbWJlZGRlZD9cbiAgICAgICAgaWYgKCFhbGlhc05hbWUgfHwgIXByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYWxpYXMgYW5kIHByb3BlcnR5IG11c3QgYmUgcmVwcmVzZW50ZWQgaW4gYSBzcGVjaWFsIGZvcm1hdFxuICAgICAgICAvLyBjb25zdCBhbGlhc05hbWVSZWdleHAgPSAvXlthLXpBLVowLTlfLV0rJC87XG4gICAgICAgIC8vIGlmICghYWxpYXNOYW1lUmVnZXhwLnRlc3QoYWxpYXNOYW1lKSB8fCAhYWxpYXNOYW1lUmVnZXhwLnRlc3QocHJvcGVydHlOYW1lKSlcbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHN0cmluZyBpcyBub3QgYSBzdWJxdWVyeVxuICAgICAgICBpZiAoc3RyLmluZGV4T2YoXCIoXCIpICE9PSAtMSB8fCBzdHIuaW5kZXhPZihcIilcIikgIT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBRdWVyeUJ1aWxkZXJVdGlscztcbn0oKSk7XG5leHBvcnQgeyBRdWVyeUJ1aWxkZXJVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUJ1aWxkZXJVdGlscy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFsaWFzIH0gZnJvbSBcIi4vQWxpYXNcIjtcbmltcG9ydCB7IEpvaW5BdHRyaWJ1dGUgfSBmcm9tIFwiLi9Kb2luQXR0cmlidXRlXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBDb250YWlucyBhbGwgcHJvcGVydGllcyBvZiB0aGUgUXVlcnlCdWlsZGVyIHRoYXQgbmVlZHMgdG8gYmUgYnVpbGQgYSBmaW5hbCBxdWVyeS5cbiAqL1xudmFyIFF1ZXJ5RXhwcmVzc2lvbk1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUXVlcnlFeHByZXNzaW9uTWFwKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgUXVlcnlCdWlsZGVyIHVzZWQgdG8gc2VsZWN0IGVudGl0aWVzIGFuZCBub3QgYSByYXcgcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBhbGlhc2VzIChpbmNsdWRpbmcgbWFpbiBhbGlhcykgdXNlZCBpbiB0aGUgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFsaWFzZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlcHJlc2VudHMgcXVlcnkgdHlwZS4gUXVlcnlCdWlsZGVyIGlzIGFibGUgdG8gYnVpbGQgU0VMRUNULCBVUERBVEUgYW5kIERFTEVURSBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBcInNlbGVjdFwiO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGF0YSBuZWVkcyB0byBiZSBTRUxFQ1QtZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbGVjdHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1heCBleGVjdXRpb24gdGltZSBpbiBtaWxsaXNlY29uZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubWF4RXhlY3V0aW9uVGltZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIFNFTEVDVCBpcyBESVNUSU5DVC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VsZWN0RGlzdGluY3QgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNFTEVDVCBESVNUSU5DVCBPTiBxdWVyeSAocG9zdGdyZXMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWxlY3REaXN0aW5jdE9uID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHRyYSByZXR1cm5pbmcgY29sdW1ucyB0byBiZSBhZGRlZCB0byB0aGUgcmV0dXJuaW5nIHN0YXRlbWVudCBpZiBkcml2ZXIgc3VwcG9ydHMgaXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4dHJhUmV0dXJuaW5nQ29sdW1ucyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW9uYWwgb24gY29uZmxpY3Qgc3RhdGVtZW50IHVzZWQgaW4gaW5zZXJ0aW9uIHF1ZXJ5IGluIHBvc3RncmVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkNvbmZsaWN0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wdGlvbmFsIG9uIGlnbm9yZSBzdGF0ZW1lbnQgdXNlZCBpbiBpbnNlcnRpb24gcXVlcnkgaW4gZGF0YWJhc2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbklnbm9yZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSk9JTiBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5qb2luQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb25JZCBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gY291bnQgcXVlcmllcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdIRVJFIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLndoZXJlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSEFWSU5HIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhdmluZ3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9SREVSIEJZIHF1ZXJpZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9yZGVyQnlzID0ge307XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHUk9VUCBCWSBxdWVyaWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cEJ5cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHNvZnQtZGVsZXRlZCByb3dzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBlbnRpdHkgcmVzdWx0LlxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSBzb2Z0LWRlbGV0ZWQgcm93cyBhcmUgbm90IGluY2x1ZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aXRoRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGFyYW1ldGVycyB1c2VkIHRvIGJlIGVzY2FwZWQgaW4gZmluYWwgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7fTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBhbGlhcywgdGFibGUgbmFtZXMgYW5kIGNvbHVtbiBuYW1lcyB3aWxsIGJlIGVjYXBlZCBieSBkcml2ZXIsIG9yIG5vdC5cbiAgICAgICAgICpcbiAgICAgICAgICogdG9kbzogcmVuYW1lIHRvIGlzUXVvdGluZ0Rpc2FibGVkLCBhbHNvIHRoaW5rIGlmIGl0IHNob3VsZCBiZSBuYW1lZCBcImVzY2FwaW5nXCJcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzYWJsZUVzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB2aXJ0dWFsIGNvbHVtbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGVudGl0eSByZXN1bHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIHRvZG86IHdoYXQgdG8gZG8gd2l0aCBpdD8gaXMgaXQgcHJvcGVybHkgdXNlZD8gd2hhdCBhYm91dCBwZXJzaXN0ZW5jZT9cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW5hYmxlUmVsYXRpb25JZFZhbHVlcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmEgd2hlcmUgY29uZGl0aW9uIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2Ygb3JpZ2luYWwgd2hlcmUgY29uZGl0aW9ucyB3aXRoIEFORCBrZXl3b3JkLlxuICAgICAgICAgKiBPcmlnaW5hbCBjb25kaXRpb24gd2lsbCBiZSB3cmFwcGVkIGludG8gYnJhY2tldHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbiA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcXVlcnkgYnVpbGRlciBjcmVhdGVzIGEgc3VicXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1YlF1ZXJ5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcHJvcGVydHkgbmFtZXMgYXJlIHByZWZpeGVkIHdpdGggYWxpYXMgbmFtZXMgZHVyaW5nIHByb3BlcnR5IHJlcGxhY2VtZW50LlxuICAgICAgICAgKiBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZCwgaG93ZXZlciB3ZSBuZWVkIHRoaXMgYmVjYXVzZSBhbGlhc2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFVQREFURSBhbmQgREVMRVRFIHF1ZXJpZXMsXG4gICAgICAgICAqIGJ1dCB1c2VyIGNhbiB1c2UgdGhlbSBpbiBXSEVSRSBleHByZXNzaW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcXVlcnkgcmVzdWx0IGNhY2hlIGlzIGVuYWJsZWQgb3Igbm90LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW9ucyB0aGF0IGRlZmluZSBRdWVyeUJ1aWxkZXIgYmVoYXZpb3VyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcHRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGNvbHVtbnMgd2hlcmUgZGF0YSBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gICAgICAgICAqIFVzZWQgaW4gSU5TRVJUIHF1ZXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnNlcnRDb2x1bW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIGlmIHVzZXIgd2FudHMgdG8gdXBkYXRlIG9yIGRlbGV0ZSBhIHNwZWNpZmljIGVudGl0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aGVyZUVudGl0aWVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciBpbnNlcnRpb24gLyB1cGRhdGlvbi5cbiAgICAgICAgICogVGhpcyBtYXkgcHJvZHVjZSBleHRyYSBxdWVyeSBvciB1c2UgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudCAoZGVwZW5kIG9uIGRhdGFiYXNlKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlRW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBsaXN0ZW5lcnMgYW5kIHN1YnNjcmliZXJzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbmQgYWZ0ZXIgcXVlcnkgZXhlY3V0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWxsTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBxdWVyeSBtdXN0IGJlIHdyYXBwZWQgaW50byB0cmFuc2FjdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXNlVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhIHBhcmFtZXRlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBzdGFuZGFyZCBwYXJhbWV0ZXJzIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmF0aXZlUGFyYW1ldGVycyA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogSXRlbXMgZnJvbSBhbiBlbnRpdHkgdGhhdCBoYXZlIGJlZW4gbG9jYWxseSBnZW5lcmF0ZWQgJiBhcmUgcmVjb3JkZWQgaGVyZSBmb3IgbGF0ZXIgdXNlLlxuICAgICAgICAgKiBFeGFtcGxlcyBpbmNsdWRlIHRoZSBVVUlEIGdlbmVyYXRpb24gd2hlbiB0aGUgZGF0YWJhc2UgZG9lcyBub3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgICAgICAgICogVGhlc2UgYXJlIGluY2x1ZGVkIGluIHRoZSBlbnRpdHkgaW5kZXggb3JkZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxvY2FsbHlHZW5lcmF0ZWQgPSB7fTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFF1ZXJ5RXhwcmVzc2lvbk1hcC5wcm90b3R5cGUsIFwiYWxsT3JkZXJCeXNcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIEFjY2Vzc29yc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYWxsIE9SREVSIEJZIHF1ZXJpZXMgLSBpZiBvcmRlciBieSBpcyBzcGVjaWZpZWQgYnkgdXNlciB0aGVuIGl0IHVzZXMgdGhlbSxcbiAgICAgICAgICogb3RoZXJ3aXNlIGl0IHVzZXMgZGVmYXVsdCBlbnRpdHkgb3JkZXIgYnkgaWYgaXQgd2FzIHNldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5vcmRlckJ5cykubGVuZ3RoICYmIHRoaXMubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmIHRoaXMub3B0aW9ucy5pbmRleE9mKFwiZGlzYWJsZS1nbG9iYWwtb3JkZXJcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eU9yZGVyQnlfMSA9IHRoaXMubWFpbkFsaWFzLm1ldGFkYXRhLm9yZGVyQnkgfHwge307XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eU9yZGVyQnlfMSkucmVkdWNlKGZ1bmN0aW9uIChvcmRlckJ5LCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJCeVtfdGhpcy5tYWluQWxpYXMubmFtZSArIFwiLlwiICsga2V5XSA9IGVudGl0eU9yZGVyQnlfMVtrZXldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJCeTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcmRlckJ5cztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFpbiBhbGlhcyBhbmQgYWRkcyBpdCB0byB0aGUgY3VycmVudCBleHByZXNzaW9uIG1hcC5cbiAgICAgKi9cbiAgICBRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLnNldE1haW5BbGlhcyA9IGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICAvLyBpZiBtYWluIGFsaWFzIGlzIGFscmVhZHkgc2V0IHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIGFycmF5XG4gICAgICAgIC8vIGlmICh0aGlzLm1haW5BbGlhcylcbiAgICAgICAgLy8gICAgIHRoaXMuYWxpYXNlcy5zcGxpY2UodGhpcy5hbGlhc2VzLmluZGV4T2YodGhpcy5tYWluQWxpYXMpKTtcbiAgICAgICAgLy8gc2V0IG5ldyBtYWluIGFsaWFzXG4gICAgICAgIHRoaXMubWFpbkFsaWFzID0gYWxpYXM7XG4gICAgICAgIHJldHVybiBhbGlhcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYWxpYXMgYW5kIGFkZHMgaXQgdG8gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBtYXAuXG4gICAgICovXG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5jcmVhdGVBbGlhcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBhbGlhc05hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIGlmICghYWxpYXNOYW1lICYmIG9wdGlvbnMudGFibGVQYXRoKVxuICAgICAgICAgICAgYWxpYXNOYW1lID0gb3B0aW9ucy50YWJsZVBhdGg7XG4gICAgICAgIGlmICghYWxpYXNOYW1lICYmIG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICBhbGlhc05hbWUgPSBvcHRpb25zLnRhcmdldC5uYW1lO1xuICAgICAgICBpZiAoIWFsaWFzTmFtZSAmJiB0eXBlb2Ygb3B0aW9ucy50YXJnZXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBhbGlhc05hbWUgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgICAgdmFyIGFsaWFzID0gbmV3IEFsaWFzKCk7XG4gICAgICAgIGFsaWFzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIGlmIChhbGlhc05hbWUpXG4gICAgICAgICAgICBhbGlhcy5uYW1lID0gYWxpYXNOYW1lO1xuICAgICAgICBpZiAob3B0aW9ucy5tZXRhZGF0YSlcbiAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGFyZ2V0ICYmICFhbGlhcy5oYXNNZXRhZGF0YSlcbiAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhID0gdGhpcy5jb25uZWN0aW9uLmdldE1ldGFkYXRhKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGFibGVQYXRoKVxuICAgICAgICAgICAgYWxpYXMudGFibGVQYXRoID0gb3B0aW9ucy50YWJsZVBhdGg7XG4gICAgICAgIGlmIChvcHRpb25zLnN1YlF1ZXJ5KVxuICAgICAgICAgICAgYWxpYXMuc3ViUXVlcnkgPSBvcHRpb25zLnN1YlF1ZXJ5O1xuICAgICAgICB0aGlzLmFsaWFzZXMucHVzaChhbGlhcyk7XG4gICAgICAgIHJldHVybiBhbGlhcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsaWFzIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogSWYgYWxpYXMgd2FzIG5vdCBmb3VuZCBpdCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAgICovXG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5maW5kQWxpYXNCeU5hbWUgPSBmdW5jdGlvbiAoYWxpYXNOYW1lKSB7XG4gICAgICAgIHZhciBhbGlhcyA9IHRoaXMuYWxpYXNlcy5maW5kKGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gYWxpYXMubmFtZSA9PT0gYWxpYXNOYW1lOyB9KTtcbiAgICAgICAgaWYgKCFhbGlhcylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJcXFwiXCIgKyBhbGlhc05hbWUgKyBcIlxcXCIgYWxpYXMgd2FzIG5vdCBmb3VuZC4gTWF5YmUgeW91IGZvcmdvdCB0byBqb2luIGl0P1wiKTtcbiAgICAgICAgcmV0dXJuIGFsaWFzO1xuICAgIH07XG4gICAgUXVlcnlFeHByZXNzaW9uTWFwLnByb3RvdHlwZS5maW5kQ29sdW1uQnlBbGlhc0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoYWxpYXNFeHByZXNzaW9uKSB7XG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChhbGlhc0V4cHJlc3Npb24uc3BsaXQoXCIuXCIpLCAyKSwgYWxpYXNOYW1lID0gX2FbMF0sIHByb3BlcnR5UGF0aCA9IF9hWzFdO1xuICAgICAgICB2YXIgYWxpYXMgPSB0aGlzLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpO1xuICAgICAgICByZXR1cm4gYWxpYXMubWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eU5hbWUocHJvcGVydHlQYXRoKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLCBcInJlbGF0aW9uTWV0YWRhdGFcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyByZWxhdGlvbiBtZXRhZGF0YSBvZiB0aGUgcmVsYXRpb24gdGhpcyBxdWVyeSBidWlsZGVyIHdvcmtzIHdpdGguXG4gICAgICAgICAqXG4gICAgICAgICAqIHRvZG86IGFkZCBwcm9wZXIgZXhjZXB0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWFpbkFsaWFzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFbnRpdHkgdG8gd29yayB3aXRoIGlzIG5vdCBzcGVjaWZpZWQhXCIpOyAvLyB0b2RvOiBiZXR0ZXIgbWVzc2FnZVxuICAgICAgICAgICAgdmFyIHJlbGF0aW9uTWV0YWRhdGEgPSB0aGlzLm1haW5BbGlhcy5tZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbk1ldGFkYXRhKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJSZWxhdGlvbiBcIiArIHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGggKyBcIiB3YXMgbm90IGZvdW5kIGluIGVudGl0eSBcIiArIHRoaXMubWFpbkFsaWFzLm5hbWUpOyAvLyB0b2RvOiBiZXR0ZXIgbWVzc2FnZVxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBDb3BpZXMgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgUXVlcnlFeHByZXNzaW9uTWFwIGludG8gYSBuZXcgb25lLlxuICAgICAqIFVzZWZ1bCB3aGVuIFF1ZXJ5QnVpbGRlciBuZWVkcyB0byBjcmVhdGUgYSBjb3B5IG9mIGl0c2VsZi5cbiAgICAgKi9cbiAgICBRdWVyeUV4cHJlc3Npb25NYXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWFwID0gbmV3IFF1ZXJ5RXhwcmVzc2lvbk1hcCh0aGlzLmNvbm5lY3Rpb24pO1xuICAgICAgICBtYXAucXVlcnlUeXBlID0gdGhpcy5xdWVyeVR5cGU7XG4gICAgICAgIG1hcC5zZWxlY3RzID0gdGhpcy5zZWxlY3RzLm1hcChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Q7IH0pO1xuICAgICAgICBtYXAubWF4RXhlY3V0aW9uVGltZSA9IHRoaXMubWF4RXhlY3V0aW9uVGltZTtcbiAgICAgICAgbWFwLnNlbGVjdERpc3RpbmN0ID0gdGhpcy5zZWxlY3REaXN0aW5jdDtcbiAgICAgICAgbWFwLnNlbGVjdERpc3RpbmN0T24gPSB0aGlzLnNlbGVjdERpc3RpbmN0T247XG4gICAgICAgIHRoaXMuYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykgeyByZXR1cm4gbWFwLmFsaWFzZXMucHVzaChuZXcgQWxpYXMoYWxpYXMpKTsgfSk7XG4gICAgICAgIG1hcC5tYWluQWxpYXMgPSB0aGlzLm1haW5BbGlhcztcbiAgICAgICAgbWFwLnZhbHVlc1NldCA9IHRoaXMudmFsdWVzU2V0O1xuICAgICAgICBtYXAucmV0dXJuaW5nID0gdGhpcy5yZXR1cm5pbmc7XG4gICAgICAgIG1hcC5vbkNvbmZsaWN0ID0gdGhpcy5vbkNvbmZsaWN0O1xuICAgICAgICBtYXAub25JZ25vcmUgPSB0aGlzLm9uSWdub3JlO1xuICAgICAgICBtYXAub25VcGRhdGUgPSB0aGlzLm9uVXBkYXRlO1xuICAgICAgICBtYXAuam9pbkF0dHJpYnV0ZXMgPSB0aGlzLmpvaW5BdHRyaWJ1dGVzLm1hcChmdW5jdGlvbiAoam9pbikgeyByZXR1cm4gbmV3IEpvaW5BdHRyaWJ1dGUoX3RoaXMuY29ubmVjdGlvbiwgX3RoaXMsIGpvaW4pOyB9KTtcbiAgICAgICAgbWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzID0gdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uSWQpIHsgcmV0dXJuIG5ldyBSZWxhdGlvbklkQXR0cmlidXRlKF90aGlzLCByZWxhdGlvbklkKTsgfSk7XG4gICAgICAgIG1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcyA9IHRoaXMucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7IHJldHVybiBuZXcgUmVsYXRpb25Db3VudEF0dHJpYnV0ZShfdGhpcywgcmVsYXRpb25Db3VudCk7IH0pO1xuICAgICAgICBtYXAud2hlcmVzID0gdGhpcy53aGVyZXMubWFwKGZ1bmN0aW9uICh3aGVyZSkgeyByZXR1cm4gKF9fYXNzaWduKHt9LCB3aGVyZSkpOyB9KTtcbiAgICAgICAgbWFwLmhhdmluZ3MgPSB0aGlzLmhhdmluZ3MubWFwKGZ1bmN0aW9uIChoYXZpbmcpIHsgcmV0dXJuIChfX2Fzc2lnbih7fSwgaGF2aW5nKSk7IH0pO1xuICAgICAgICBtYXAub3JkZXJCeXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9yZGVyQnlzKTtcbiAgICAgICAgbWFwLmdyb3VwQnlzID0gdGhpcy5ncm91cEJ5cy5tYXAoZnVuY3Rpb24gKGdyb3VwQnkpIHsgcmV0dXJuIGdyb3VwQnk7IH0pO1xuICAgICAgICBtYXAubGltaXQgPSB0aGlzLmxpbWl0O1xuICAgICAgICBtYXAub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIG1hcC5za2lwID0gdGhpcy5za2lwO1xuICAgICAgICBtYXAudGFrZSA9IHRoaXMudGFrZTtcbiAgICAgICAgbWFwLmxvY2tNb2RlID0gdGhpcy5sb2NrTW9kZTtcbiAgICAgICAgbWFwLmxvY2tWZXJzaW9uID0gdGhpcy5sb2NrVmVyc2lvbjtcbiAgICAgICAgbWFwLmxvY2tUYWJsZXMgPSB0aGlzLmxvY2tUYWJsZXM7XG4gICAgICAgIG1hcC53aXRoRGVsZXRlZCA9IHRoaXMud2l0aERlbGV0ZWQ7XG4gICAgICAgIG1hcC5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbWV0ZXJzKTtcbiAgICAgICAgbWFwLmRpc2FibGVFc2NhcGluZyA9IHRoaXMuZGlzYWJsZUVzY2FwaW5nO1xuICAgICAgICBtYXAuZW5hYmxlUmVsYXRpb25JZFZhbHVlcyA9IHRoaXMuZW5hYmxlUmVsYXRpb25JZFZhbHVlcztcbiAgICAgICAgbWFwLmV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbiA9IHRoaXMuZXh0cmFBcHBlbmRlZEFuZFdoZXJlQ29uZGl0aW9uO1xuICAgICAgICBtYXAuc3ViUXVlcnkgPSB0aGlzLnN1YlF1ZXJ5O1xuICAgICAgICBtYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IHRoaXMuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZDtcbiAgICAgICAgbWFwLmNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgICAgbWFwLmNhY2hlSWQgPSB0aGlzLmNhY2hlSWQ7XG4gICAgICAgIG1hcC5jYWNoZUR1cmF0aW9uID0gdGhpcy5jYWNoZUR1cmF0aW9uO1xuICAgICAgICBtYXAucmVsYXRpb25Qcm9wZXJ0eVBhdGggPSB0aGlzLnJlbGF0aW9uUHJvcGVydHlQYXRoO1xuICAgICAgICBtYXAub2YgPSB0aGlzLm9mO1xuICAgICAgICBtYXAuaW5zZXJ0Q29sdW1ucyA9IHRoaXMuaW5zZXJ0Q29sdW1ucztcbiAgICAgICAgbWFwLndoZXJlRW50aXRpZXMgPSB0aGlzLndoZXJlRW50aXRpZXM7XG4gICAgICAgIG1hcC51cGRhdGVFbnRpdHkgPSB0aGlzLnVwZGF0ZUVudGl0eTtcbiAgICAgICAgbWFwLmNhbGxMaXN0ZW5lcnMgPSB0aGlzLmNhbGxMaXN0ZW5lcnM7XG4gICAgICAgIG1hcC51c2VUcmFuc2FjdGlvbiA9IHRoaXMudXNlVHJhbnNhY3Rpb247XG4gICAgICAgIG1hcC5uYXRpdmVQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5uYXRpdmVQYXJhbWV0ZXJzKTtcbiAgICAgICAgbWFwLmNvbW1lbnQgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcbiAgICByZXR1cm4gUXVlcnlFeHByZXNzaW9uTWFwO1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5RXhwcmVzc2lvbk1hcCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUV4cHJlc3Npb25NYXAuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogV3JhcHMgZW50aXRpZXMgYW5kIGNyZWF0ZXMgZ2V0dGVycy9zZXR0ZXJzIGZvciB0aGVpciByZWxhdGlvbnNcbiAqIHRvIGJlIGFibGUgdG8gbGF6aWx5IGxvYWQgcmVsYXRpb25zIHdoZW4gYWNjZXNzaW5nIHRoZXNlIHJlbGF0aW9ucy5cbiAqL1xudmFyIFJlbGF0aW9uTG9hZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWxhdGlvbkxvYWRlcihjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2FkcyByZWxhdGlvbiBkYXRhIGZvciB0aGUgZ2l2ZW4gZW50aXR5IGFuZCBpdHMgcmVsYXRpb24uXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChxdWVyeVJ1bm5lciAmJiBxdWVyeVJ1bm5lci5pc1JlbGVhc2VkKVxuICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB1bmRlZmluZWQ7IC8vIGdldCBuZXcgb25lIGlmIGFscmVhZHkgY2xvc2VkXG4gICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRNYW55VG9PbmVPck9uZVRvT25lT3duZXIocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc09uZVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPbmVUb01hbnlPck9uZVRvT25lTm90T3duZXIocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc01hbnlUb01hbnlPd25lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbnlUb01hbnlPd25lcihyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtYW55LXRvLW1hbnkgbm9uIG93bmVyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFueVRvTWFueU5vdE93bmVyKHJlbGF0aW9uLCBlbnRpdHlPckVudGl0aWVzLCBxdWVyeVJ1bm5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGRhdGEgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIG93bmVyIHJlbGF0aW9ucy5cbiAgICAgKlxuICAgICAqIChvdykgcG9zdC5jYXRlZ29yeTw9PmNhdGVnb3J5LnBvc3RcbiAgICAgKiBsb2FkZWQ6IGNhdGVnb3J5IGZyb20gcG9zdFxuICAgICAqIGV4YW1wbGU6IFNFTEVDVCBjYXRlZ29yeS5pZCBBUyBjYXRlZ29yeV9pZCwgY2F0ZWdvcnkubmFtZSBBUyBjYXRlZ29yeV9uYW1lIEZST00gY2F0ZWdvcnkgY2F0ZWdvcnlcbiAgICAgKiAgICAgICAgICAgICAgSU5ORVIgSk9JTiBwb3N0IFBvc3QgT04gUG9zdC5jYXRlZ29yeT1jYXRlZ29yeS5pZCBXSEVSRSBQb3N0LmlkPTFcbiAgICAgKi9cbiAgICBSZWxhdGlvbkxvYWRlci5wcm90b3R5cGUubG9hZE1hbnlUb09uZU9yT25lVG9PbmVPd25lciA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSA/IGVudGl0eU9yRW50aXRpZXMgOiBbZW50aXR5T3JFbnRpdGllc107XG4gICAgICAgIHZhciBjb2x1bW5zID0gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgIHZhciBqb2luQ29sdW1ucyA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb24uam9pbkNvbHVtbnMgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgIHZhciBjb25kaXRpb25zID0gam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIiA9IFwiICsgcmVsYXRpb24ucHJvcGVydHlOYW1lICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgIHZhciBqb2luQWxpYXNOYW1lID0gcmVsYXRpb24uZW50aXR5TWV0YWRhdGEubmFtZTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdChyZWxhdGlvbi5wcm9wZXJ0eU5hbWUpIC8vIGNhdGVnb3J5XG4gICAgICAgICAgICAuZnJvbShyZWxhdGlvbi50eXBlLCByZWxhdGlvbi5wcm9wZXJ0eU5hbWUpIC8vIENhdGVnb3J5LCBjYXRlZ29yeVxuICAgICAgICAgICAgLmlubmVySm9pbihyZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS50YXJnZXQsIGpvaW5BbGlhc05hbWUsIGNvbmRpdGlvbnMpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHFiLndoZXJlKGpvaW5BbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbnNbMF0ucHJvcGVydHlQYXRoICsgXCIgSU4gKDouLi5cIiArIChqb2luQWxpYXNOYW1lICsgXCJfXCIgKyBjb2x1bW5zWzBdLnByb3BlcnR5TmFtZSkgKyBcIilcIik7XG4gICAgICAgICAgICBxYi5zZXRQYXJhbWV0ZXIoam9pbkFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUsIGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBjb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGVudGl0eSk7IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSwgZW50aXR5SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtTmFtZSA9IGpvaW5BbGlhc05hbWUgKyBcIl9lbnRpdHlfXCIgKyBlbnRpdHlJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHFiLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5BbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtTmFtZTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIjsgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICBxYi53aGVyZShjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxYi5nZXRNYW55KCk7XG4gICAgICAgIC8vIHJldHVybiBxYi5nZXRPbmUoKTsgdG9kbzogZml4IGFsbCB1c2FnZXNcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGRhdGEgZm9yIG9uZS10by1tYW55IGFuZCBvbmUtdG8tb25lIG5vdCBvd25lciByZWxhdGlvbnMuXG4gICAgICpcbiAgICAgKiBTRUxFQ1QgcG9zdFxuICAgICAqIEZST00gcG9zdCBwb3N0XG4gICAgICogV0hFUkUgcG9zdC5bam9pbkNvbHVtbi5uYW1lXSA9IGVudGl0eVtqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW5dXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWRPbmVUb01hbnlPck9uZVRvT25lTm90T3duZXIgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkoZW50aXR5T3JFbnRpdGllcykgPyBlbnRpdHlPckVudGl0aWVzIDogW2VudGl0eU9yRW50aXRpZXNdO1xuICAgICAgICB2YXIgYWxpYXNOYW1lID0gcmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB2YXIgY29sdW1ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucztcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgLnNlbGVjdChhbGlhc05hbWUpXG4gICAgICAgICAgICAuZnJvbShyZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uZW50aXR5TWV0YWRhdGEudGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHFiLndoZXJlKGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uc1swXS5wcm9wZXJ0eVBhdGggKyBcIiBJTiAoOi4uLlwiICsgKGFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUpICsgXCIpXCIpO1xuICAgICAgICAgICAgcWIuc2V0UGFyYW1ldGVyKGFsaWFzTmFtZSArIFwiX1wiICsgY29sdW1uc1swXS5wcm9wZXJ0eU5hbWUsIGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBjb2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiA9IGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gYWxpYXNOYW1lICsgXCJfZW50aXR5X1wiICsgZW50aXR5SW5kZXggKyBcIl9cIiArIGNvbHVtbkluZGV4O1xuICAgICAgICAgICAgICAgICAgICBxYi5zZXRQYXJhbWV0ZXIocGFyYW1OYW1lLCBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoY29uZGl0aW9uKSB7IHJldHVybiBcIihcIiArIGNvbmRpdGlvbiArIFwiKVwiOyB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgIHFiLndoZXJlKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHFiLmdldE1hbnkoKTtcbiAgICAgICAgLy8gcmV0dXJuIHJlbGF0aW9uLmlzT25lVG9NYW55ID8gcWIuZ2V0TWFueSgpIDogcWIuZ2V0T25lKCk7IHRvZG86IGZpeCBhbGwgdXNhZ2VzXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIGZvciBtYW55LXRvLW1hbnkgb3duZXIgcmVsYXRpb25zLlxuICAgICAqXG4gICAgICogU0VMRUNUIGNhdGVnb3J5XG4gICAgICogRlJPTSBjYXRlZ29yeSBjYXRlZ29yeVxuICAgICAqIElOTkVSIEpPSU4gcG9zdF9jYXRlZ29yaWVzIHBvc3RfY2F0ZWdvcmllc1xuICAgICAqIE9OIHBvc3RfY2F0ZWdvcmllcy5wb3N0SWQgPSA6cG9zdElkXG4gICAgICogQU5EIHBvc3RfY2F0ZWdvcmllcy5jYXRlZ29yeUlkID0gY2F0ZWdvcnkuaWRcbiAgICAgKi9cbiAgICBSZWxhdGlvbkxvYWRlci5wcm90b3R5cGUubG9hZE1hbnlUb01hbnlPd25lciA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgZW50aXR5T3JFbnRpdGllcywgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHlPckVudGl0aWVzKSA/IGVudGl0eU9yRW50aXRpZXMgOiBbZW50aXR5T3JFbnRpdGllc107XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSByZWxhdGlvbi5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIHZhciBqb2luQWxpYXMgPSByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZTtcbiAgICAgICAgdmFyIGpvaW5Db2x1bW5Db25kaXRpb25zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbkFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOICg6Li4uXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiKVwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGludmVyc2VKb2luQ29sdW1uQ29uZGl0aW9ucyA9IHJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGludmVyc2VKb2luQ29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pbkFsaWFzICsgXCIuXCIgKyBpbnZlcnNlSm9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIj1cIiArIG1haW5BbGlhcyArIFwiLlwiICsgaW52ZXJzZUpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGFyYW1ldGVycyA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLnJlZHVjZShmdW5jdGlvbiAocGFyYW1ldGVycywgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgcGFyYW1ldGVyc1tqb2luQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihxdWVyeVJ1bm5lcilcbiAgICAgICAgICAgIC5zZWxlY3QobWFpbkFsaWFzKVxuICAgICAgICAgICAgLmZyb20ocmVsYXRpb24udHlwZSwgbWFpbkFsaWFzKVxuICAgICAgICAgICAgLmlubmVySm9pbihqb2luQWxpYXMsIGpvaW5BbGlhcywgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoam9pbkNvbHVtbkNvbmRpdGlvbnMpLCBmYWxzZSksIF9fcmVhZChpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbnMpLCBmYWxzZSkuam9pbihcIiBBTkQgXCIpKVxuICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgICAgIC5nZXRNYW55KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBkYXRhIGZvciBtYW55LXRvLW1hbnkgbm90IG93bmVyIHJlbGF0aW9ucy5cbiAgICAgKlxuICAgICAqIFNFTEVDVCBwb3N0XG4gICAgICogRlJPTSBwb3N0IHBvc3RcbiAgICAgKiBJTk5FUiBKT0lOIHBvc3RfY2F0ZWdvcmllcyBwb3N0X2NhdGVnb3JpZXNcbiAgICAgKiBPTiBwb3N0X2NhdGVnb3JpZXMucG9zdElkID0gcG9zdC5pZFxuICAgICAqIEFORCBwb3N0X2NhdGVnb3JpZXMuY2F0ZWdvcnlJZCA9IHBvc3RfY2F0ZWdvcmllcy5jYXRlZ29yeUlkXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmxvYWRNYW55VG9NYW55Tm90T3duZXIgPSBmdW5jdGlvbiAocmVsYXRpb24sIGVudGl0eU9yRW50aXRpZXMsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkoZW50aXR5T3JFbnRpdGllcykgPyBlbnRpdHlPckVudGl0aWVzIDogW2VudGl0eU9yRW50aXRpZXNdO1xuICAgICAgICB2YXIgbWFpbkFsaWFzID0gcmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICB2YXIgam9pbkFsaWFzID0gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgIHZhciBqb2luQ29sdW1uQ29uZGl0aW9ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlOYW1lICsgXCIgPSBcIiArIG1haW5BbGlhcyArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoaW52ZXJzZUpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBqb2luQWxpYXMgKyBcIi5cIiArIGludmVyc2VKb2luQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOICg6Li4uXCIgKyBpbnZlcnNlSm9pbkNvbHVtbi5wcm9wZXJ0eU5hbWUgKyBcIilcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKHBhcmFtZXRlcnMsIGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnNbam9pbkNvbHVtbi5wcm9wZXJ0eU5hbWVdID0gZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICAuc2VsZWN0KG1haW5BbGlhcylcbiAgICAgICAgICAgIC5mcm9tKHJlbGF0aW9uLnR5cGUsIG1haW5BbGlhcylcbiAgICAgICAgICAgIC5pbm5lckpvaW4oam9pbkFsaWFzLCBqb2luQWxpYXMsIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGpvaW5Db2x1bW5Db25kaXRpb25zKSwgZmFsc2UpLCBfX3JlYWQoaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25zKSwgZmFsc2UpLmpvaW4oXCIgQU5EIFwiKSlcbiAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV3JhcHMgZ2l2ZW4gZW50aXR5IGFuZCBjcmVhdGVzIGdldHRlcnMvc2V0dGVycyBmb3IgaXRzIGdpdmVuIHJlbGF0aW9uXG4gICAgICogdG8gYmUgYWJsZSB0byBsYXppbHkgbG9hZCBkYXRhIHdoZW4gYWNjZXNzaW5nIHRoaXMgcmVsYXRpb24uXG4gICAgICovXG4gICAgUmVsYXRpb25Mb2FkZXIucHJvdG90eXBlLmVuYWJsZUxhenlMb2FkID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBlbnRpdHksIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciByZWxhdGlvbkxvYWRlciA9IHRoaXM7XG4gICAgICAgIHZhciBkYXRhSW5kZXggPSBcIl9fXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluIHdoYXQgcHJvcGVydHkgb2YgdGhlIGVudGl0eSBsb2FkZWQgZGF0YSB3aWxsIGJlIHN0b3JlZFxuICAgICAgICB2YXIgcHJvbWlzZUluZGV4ID0gXCJfX3Byb21pc2VfXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluIHdoYXQgcHJvcGVydHkgb2YgdGhlIGVudGl0eSBsb2FkaW5nIHByb21pc2Ugd2lsbCBiZSBzdG9yZWRcbiAgICAgICAgdmFyIHJlc29sdmVJbmRleCA9IFwiX19oYXNfXCIgKyByZWxhdGlvbi5wcm9wZXJ0eU5hbWUgKyBcIl9fXCI7IC8vIGluZGljYXRlcyBpZiByZWxhdGlvbiBkYXRhIGFscmVhZHkgd2FzIGxvYWRlZCBvciBub3QsIHdlIG5lZWQgdGhpcyBmbGFnIGlmIGxvYWRlZCBkYXRhIGlzIGVtcHR5XG4gICAgICAgIHZhciBzZXREYXRhID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGVudGl0eVtkYXRhSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICBlbnRpdHlbcmVzb2x2ZUluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGUgZW50aXR5W3Byb21pc2VJbmRleF07XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzZXRQcm9taXNlID0gZnVuY3Rpb24gKGVudGl0eSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHlbcmVzb2x2ZUluZGV4XTtcbiAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHlbZGF0YUluZGV4XTtcbiAgICAgICAgICAgIGVudGl0eVtwcm9taXNlSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZS50aGVuKFxuICAgICAgICAgICAgLy8gZW5zdXJlIGRpZmZlcmVudCB2YWx1ZSBpcyBub3QgYXNzaWduZWQgeWV0XG4gICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiBlbnRpdHlbcHJvbWlzZUluZGV4XSA9PT0gdmFsdWUgPyBzZXREYXRhKGVudGl0eSwgcmVzdWx0KSA6IHJlc3VsdDsgfSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbnRpdHksIHJlbGF0aW9uLnByb3BlcnR5TmFtZSwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcmVzb2x2ZUluZGV4XSA9PT0gdHJ1ZSB8fCB0aGlzW2RhdGFJbmRleF0gIT09IHVuZGVmaW5lZCkgLy8gaWYgcmVsYXRlZCBkYXRhIGFscmVhZHkgd2FzIGxvYWRlZCB0aGVuIHNpbXBseSByZXR1cm4gaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzW2RhdGFJbmRleF0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3Byb21pc2VJbmRleF0pIC8vIGlmIHJlbGF0ZWQgZGF0YSBpcyBsb2FkaW5nIHRoZW4gcmV0dXJuIGEgcHJvbWlzZSByZWxhdGlvbkxvYWRlciBsb2FkcyBpdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1twcm9taXNlSW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgbG9hZGVkIHlldCwgbG9hZCByZWxhdGlvbiBkYXRhIGFuZCBzYXZlIGl0IGluIHRoZSBtb2RlbCBvbmNlIHRoZXkgYXJlIGxvYWRlZFxuICAgICAgICAgICAgICAgIHZhciBsb2FkZXIgPSByZWxhdGlvbkxvYWRlci5sb2FkKHJlbGF0aW9uLCB0aGlzLCBxdWVyeVJ1bm5lcikudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZWxhdGlvbi5pc09uZVRvT25lIHx8IHJlbGF0aW9uLmlzTWFueVRvT25lID8gKHJlc3VsdC5sZW5ndGggPT09IDAgPyBudWxsIDogcmVzdWx0WzBdKSA6IHJlc3VsdDsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFByb21pc2UodGhpcywgbG9hZGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHsgLy8gaWYgc2V0IGRhdGEgaXMgYSBwcm9taXNlIHRoZW4gd2FpdCBmb3IgaXRzIHJlc29sdmUgYW5kIHNhdmUgaW4gdGhlIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9taXNlKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIGlmIGl0cyBkaXJlY3QgZGF0YSBzZXQgKG5vbiBwcm9taXNlLCBwcm9iYWJseSBub3Qgc2FmZS10eXBlZClcbiAgICAgICAgICAgICAgICAgICAgc2V0RGF0YSh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbkxvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkxvYWRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkxvYWRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvblVwZGF0ZXIgfSBmcm9tIFwiLi9SZWxhdGlvblVwZGF0ZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uUmVtb3ZlciB9IGZyb20gXCIuL1JlbGF0aW9uUmVtb3ZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEFsbG93cyB0byB3b3JrIHdpdGggZW50aXR5IHJlbGF0aW9ucyBhbmQgcGVyZm9ybSBzcGVjaWZpYyBvcGVyYXRpb25zIHdpdGggdGhvc2UgcmVsYXRpb25zLlxuICpcbiAqIHRvZG86IGFkZCB0cmFuc2FjdGlvbnMgZXZlcnl3aGVyZVxuICovXG52YXIgUmVsYXRpb25RdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlbGF0aW9uUXVlcnlCdWlsZGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlbGF0aW9uUXVlcnlCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgSW1wbGVtZW50ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBzcWwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyBlbnRpdHkgKHRhcmdldCkgd2hpY2ggcmVsYXRpb25zIHdpbGwgYmUgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvblF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2YgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vZiA9IGVudGl0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIGVudGl0eSByZWxhdGlvbidzIHZhbHVlLlxuICAgICAqIFZhbHVlIGNhbiBiZSBlbnRpdHksIGVudGl0eSBpZCBvciBlbnRpdHkgaWQgbWFwIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFdvcmtzIG9ubHkgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHJlbGF0aW9ucy5cbiAgICAgKiBGb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMgdXNlICNhZGQgYW5kICNyZW1vdmUgbWV0aG9kcyBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCB1cGRhdGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAub2YpIC8vIHRvZG86IG1vdmUgdGhpcyBjaGVjayBiZWZvcmUgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBjcmVhdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aG9zZSByZWxhdGlvbiBuZWVkcyB0byBiZSBzZXQgaXMgbm90IHNldC4gVXNlIC5vZiBtZXRob2QgdG8gZGVmaW5lIHdob3NlIHJlbGF0aW9uIHlvdSB3YW50IHRvIHNldC5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNldCBvcGVyYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKFwiSG93ZXZlciBnaXZlbiBcXFwiXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIgaGFzIFwiICsgcmVsYXRpb24ucmVsYXRpb25UeXBlICsgXCIgcmVsYXRpb24uIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVzZSAuYWRkKCkgbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgdGhlbiB1c2VyIG11c3Qgc2VuZCBpZCBtYXAgYXMgXCJ2YWx1ZVwiIGFyZ3VtZW50LiBjaGVjayBpZiBoZSByZWFsbHkgZGlkIGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW5zICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKCEodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHx8IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPCByZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmFsdWUgdG8gYmUgc2V0IGludG8gdGhlIHJlbGF0aW9uIG11c3QgYmUgYSBtYXAgb2YgcmVsYXRpb24gaWRzLCBmb3IgZXhhbXBsZTogLnNldCh7IGZpcnN0TmFtZTogXFxcIi4uLlxcXCIsIGxhc3ROYW1lOiBcXFwiLi4uXFxcIiB9KVwiKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVyID0gbmV3IFJlbGF0aW9uVXBkYXRlcih0aGlzLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVyLnVwZGF0ZSh2YWx1ZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyAoYmluZHMpIGdpdmVuIHZhbHVlIHRvIGVudGl0eSByZWxhdGlvbi5cbiAgICAgKiBWYWx1ZSBjYW4gYmUgZW50aXR5LCBlbnRpdHkgaWQgb3IgZW50aXR5IGlkIG1hcCAoaWYgZW50aXR5IGhhcyBjb21wb3NpdGUgaWRzKS5cbiAgICAgKiBWYWx1ZSBhbHNvIGNhbiBiZSBhcnJheSBvZiBlbnRpdGllcywgYXJyYXkgb2YgZW50aXR5IGlkcyBvciBhcnJheSBvZiBlbnRpdHkgaWQgbWFwcyAoaWYgZW50aXR5IGhhcyBjb21wb3NpdGUgaWRzKS5cbiAgICAgKiBXb3JrcyBvbmx5IGZvciBtYW55LXRvLW1hbnkgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucy5cbiAgICAgKiBGb3IgbWFueS10by1vbmUgYW5kIG9uZS10by1vbmUgdXNlICNzZXQgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgUmVsYXRpb25RdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIHVwZGF0ZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAub2YpIC8vIHRvZG86IG1vdmUgdGhpcyBjaGVjayBiZWZvcmUgcmVsYXRpb24gcXVlcnkgYnVpbGRlciBjcmVhdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkVudGl0eSB3aG9zZSByZWxhdGlvbiBuZWVkcyB0byBiZSBzZXQgaXMgbm90IHNldC4gVXNlIC5vZiBtZXRob2QgdG8gZGVmaW5lIHdob3NlIHJlbGF0aW9uIHlvdSB3YW50IHRvIHNldC5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBZGQgb3BlcmF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBtYW55LXRvLW1hbnkgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKFwiSG93ZXZlciBnaXZlbiBcXFwiXCIgKyByZWxhdGlvbi5wcm9wZXJ0eVBhdGggKyBcIlxcXCIgaGFzIFwiICsgcmVsYXRpb24ucmVsYXRpb25UeXBlICsgXCIgcmVsYXRpb24uIFwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlVzZSAuc2V0KCkgbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgdGhlbiB1c2VyIG11c3Qgc2VuZCBpZCBtYXAgYXMgXCJ2YWx1ZVwiIGFyZ3VtZW50LiBjaGVjayBpZiBoZSByZWFsbHkgZGlkIGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmpvaW5Db2x1bW5zICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKCEodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHx8IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPCByZWxhdGlvbi5qb2luQ29sdW1ucy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmFsdWUgdG8gYmUgc2V0IGludG8gdGhlIHJlbGF0aW9uIG11c3QgYmUgYSBtYXAgb2YgcmVsYXRpb24gaWRzLCBmb3IgZXhhbXBsZTogLnNldCh7IGZpcnN0TmFtZTogXFxcIi4uLlxcXCIsIGxhc3ROYW1lOiBcXFwiLi4uXFxcIiB9KVwiKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVyID0gbmV3IFJlbGF0aW9uVXBkYXRlcih0aGlzLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVyLnVwZGF0ZSh2YWx1ZSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyAodW5iaW5kcykgZ2l2ZW4gdmFsdWUgZnJvbSBlbnRpdHkgcmVsYXRpb24uXG4gICAgICogVmFsdWUgY2FuIGJlIGVudGl0eSwgZW50aXR5IGlkIG9yIGVudGl0eSBpZCBtYXAgKGlmIGVudGl0eSBoYXMgY29tcG9zaXRlIGlkcykuXG4gICAgICogVmFsdWUgYWxzbyBjYW4gYmUgYXJyYXkgb2YgZW50aXRpZXMsIGFycmF5IG9mIGVudGl0eSBpZHMgb3IgYXJyYXkgb2YgZW50aXR5IGlkIG1hcHMgKGlmIGVudGl0eSBoYXMgY29tcG9zaXRlIGlkcykuXG4gICAgICogV29ya3Mgb25seSBmb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMuXG4gICAgICogRm9yIG1hbnktdG8tb25lIGFuZCBvbmUtdG8tb25lIHVzZSAjc2V0IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCByZW1vdmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbk1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm9mKSAvLyB0b2RvOiBtb3ZlIHRoaXMgY2hlY2sgYmVmb3JlIHJlbGF0aW9uIHF1ZXJ5IGJ1aWxkZXIgY3JlYXRpb24/XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJFbnRpdHkgd2hvc2UgcmVsYXRpb24gbmVlZHMgdG8gYmUgc2V0IGlzIG5vdCBzZXQuIFVzZSAub2YgbWV0aG9kIHRvIGRlZmluZSB3aG9zZSByZWxhdGlvbiB5b3Ugd2FudCB0byBzZXQuXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQWRkIG9wZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbWFueS10by1tYW55IGFuZCBvbmUtdG8tbWFueSByZWxhdGlvbnMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChcIkhvd2V2ZXIgZ2l2ZW4gXFxcIlwiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCJcXFwiIGhhcyBcIiArIHJlbGF0aW9uLnJlbGF0aW9uVHlwZSArIFwiIHJlbGF0aW9uLiBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJVc2UgLnNldChudWxsKSBtZXRob2QgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgcmVtb3ZlciA9IG5ldyBSZWxhdGlvblJlbW92ZXIodGhpcywgdGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVtb3Zlci5yZW1vdmUodmFsdWUpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgKGJpbmRzKSBhbmQgcmVtb3ZlcyAodW5iaW5kcykgZ2l2ZW4gdmFsdWVzIHRvL2Zyb20gZW50aXR5IHJlbGF0aW9uLlxuICAgICAqIFZhbHVlIGNhbiBiZSBlbnRpdHksIGVudGl0eSBpZCBvciBlbnRpdHkgaWQgbWFwIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFZhbHVlIGFsc28gY2FuIGJlIGFycmF5IG9mIGVudGl0aWVzLCBhcnJheSBvZiBlbnRpdHkgaWRzIG9yIGFycmF5IG9mIGVudGl0eSBpZCBtYXBzIChpZiBlbnRpdHkgaGFzIGNvbXBvc2l0ZSBpZHMpLlxuICAgICAqIFdvcmtzIG9ubHkgZm9yIG1hbnktdG8tbWFueSBhbmQgb25lLXRvLW1hbnkgcmVsYXRpb25zLlxuICAgICAqIEZvciBtYW55LXRvLW9uZSBhbmQgb25lLXRvLW9uZSB1c2UgI3NldCBtZXRob2QgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBSZWxhdGlvblF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYWRkQW5kUmVtb3ZlID0gZnVuY3Rpb24gKGFkZGVkLCByZW1vdmVkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZW1vdmUocmVtb3ZlZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZChhZGRlZCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBlbnRpdHkncyByZWxhdGlvbiBpZC5cbiAgICBhc3luYyBnZXRJZCgpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgfSovXG4gICAgLyoqXG4gICAgICogR2V0cyBlbnRpdHkncyByZWxhdGlvbiBpZHMuXG4gICAgYXN5bmMgZ2V0SWRzKCk6IFByb21pc2U8YW55W10+IHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0qL1xuICAgIC8qKlxuICAgICAqIExvYWRzIGEgc2luZ2xlIGVudGl0eSAocmVsYXRpb25hbCkgZnJvbSB0aGUgcmVsYXRpb24uXG4gICAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgaWQgb2YgcmVsYXRpb25hbCBlbnRpdHkgdG8gZmlsdGVyIGJ5LlxuICAgICAqL1xuICAgIFJlbGF0aW9uUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkT25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMubG9hZE1hbnkoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7IHJldHVybiByZXN1bHRzWzBdOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb2FkcyBtYW55IGVudGl0aWVzIChyZWxhdGlvbmFsKSBmcm9tIHRoZSByZWxhdGlvbi5cbiAgICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBpZHMgb2YgcmVsYXRpb25hbCBlbnRpdGllcyB0byBmaWx0ZXIgYnkuXG4gICAgICovXG4gICAgUmVsYXRpb25RdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxvYWRNYW55ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2YsIG1ldGFkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIG9mID0gdGhpcy5leHByZXNzaW9uTWFwLm9mO1xuICAgICAgICAgICAgICAgIGlmICghKG9mIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5oYXNNdWx0aXBsZVByaW1hcnlLZXlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkNhbm5vdCBsb2FkIGVudGl0eSBiZWNhdXNlIG9ubHkgb25lIHByaW1hcnkga2V5IHdhcyBzcGVjaWZpZWQsIGhvd2V2ZXIgZW50aXR5IGNvbnRhaW5zIG11bHRpcGxlIHByaW1hcnkga2V5c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgb2YgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5jcmVhdGVWYWx1ZU1hcChvZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNvbm5lY3Rpb24ucmVsYXRpb25Mb2FkZXIubG9hZCh0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25NZXRhZGF0YSwgb2YsIHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvblF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBSZWxhdGlvblF1ZXJ5QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gd29yayB3aXRoIGVudGl0eSByZWxhdGlvbnMgYW5kIHBlcmZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyB3aXRoIHRob3NlIHJlbGF0aW9ucy5cbiAqXG4gKiB0b2RvOiBhZGQgdHJhbnNhY3Rpb25zIGV2ZXJ5d2hlcmVcbiAqL1xudmFyIFJlbGF0aW9uUmVtb3ZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25SZW1vdmVyKHF1ZXJ5QnVpbGRlciwgZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLnF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwID0gZXhwcmVzc2lvbk1hcDtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHJlbW92ZSBvcGVyYXRpb24gb24gYSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvblJlbW92ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIG9mcywgdmFsdWVzXzEsIHVwZGF0ZVNldF8xLCBwYXJhbWV0ZXJzXzEsIGNvbmRpdGlvbnNfMSwgY29uZGl0aW9uLCBqdW5jdGlvbk1ldGFkYXRhXzEsIG9mcywgdmFsdWVzLCBmaXJzdENvbHVtblZhbHVlcywgc2Vjb25kQ29sdW1uVmFsdWVzXzEsIHBhcmFtZXRlcnNfMiwgY29uZGl0aW9uc18yLCBjb25kaXRpb247XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbk1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbi5pc09uZVRvTWFueSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc18xID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZXRfMSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldF8xW2NvbHVtbi5wcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zXzEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mcy5mb3JFYWNoKGZ1bmN0aW9uIChvZiwgb2ZJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMS5wdXNoLmFwcGx5KGNvbmRpdGlvbnNfMSwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHZhbHVlc18xLm1hcChmdW5jdGlvbiAodmFsdWUsIHZhbHVlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJqb2luQ29sdW1uX1wiICsgb2ZJbmRleCArIFwiX1wiICsgdmFsdWVJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzFbcGFyYW1ldGVyTmFtZV0gPSBvZiBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKG9mKSA6IG9mO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpLCBfX3JlYWQocmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uLCBjb2x1bW5JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBcInByaW1hcnlDb2x1bW5fXCIgKyB2YWx1ZUluZGV4ICsgXCJfXCIgKyB2YWx1ZUluZGV4ICsgXCJfXCIgKyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbWV0ZXJOYW1lXSA9IHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbnNfMS5tYXAoZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gXCIoXCIgKyBzdHIgKyBcIilcIjsgfSkuam9pbihcIiBPUiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHVwZGF0ZVNldF8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAganVuY3Rpb25NZXRhZGF0YV8xID0gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyA9IEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLm9mKSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5vZiA6IFt0aGlzLmV4cHJlc3Npb25NYXAub2ZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbHVtblZhbHVlcyA9IHJlbGF0aW9uLmlzTWFueVRvTWFueU93bmVyID8gb2ZzIDogdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kQ29sdW1uVmFsdWVzXzEgPSByZWxhdGlvbi5pc01hbnlUb01hbnlPd25lciA/IHZhbHVlcyA6IG9mcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc18yID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbHVtblZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaXJzdENvbHVtblZhbCwgZmlyc3RDb2x1bW5WYWxJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMi5wdXNoLmFwcGx5KGNvbmRpdGlvbnNfMiwgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHNlY29uZENvbHVtblZhbHVlc18xLm1hcChmdW5jdGlvbiAoc2Vjb25kQ29sdW1uVmFsLCBzZWNvbmRDb2x1bW5WYWxJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoanVuY3Rpb25NZXRhZGF0YV8xLm93bmVyQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJmaXJzdFZhbHVlX1wiICsgZmlyc3RDb2x1bW5WYWxJbmRleCArIFwiX1wiICsgc2Vjb25kQ29sdW1uVmFsSW5kZXggKyBcIl9cIiArIGNvbHVtbkluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yW3BhcmFtZXRlck5hbWVdID0gZmlyc3RDb2x1bW5WYWwgaW5zdGFuY2VvZiBPYmplY3QgPyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShmaXJzdENvbHVtblZhbCkgOiBmaXJzdENvbHVtblZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lICsgXCIgPSA6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGZhbHNlKSwgX19yZWFkKGp1bmN0aW9uTWV0YWRhdGFfMS5pbnZlcnNlQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbiwgY29sdW1uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJzZWNvbmRWYWx1ZV9cIiArIGZpcnN0Q29sdW1uVmFsSW5kZXggKyBcIl9cIiArIHNlY29uZENvbHVtblZhbEluZGV4ICsgXCJfXCIgKyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMltwYXJhbWV0ZXJOYW1lXSA9IHNlY29uZENvbHVtblZhbCBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHNlY29uZENvbHVtblZhbCkgOiBzZWNvbmRDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZSArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBmYWxzZSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uc18yLm1hcChmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBcIihcIiArIHN0ciArIFwiKVwiOyB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVsZXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oanVuY3Rpb25NZXRhZGF0YV8xLnRhYmxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25SZW1vdmVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uUmVtb3ZlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblJlbW92ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTYXBEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NhcC9TYXBEcml2ZXJcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG4vKipcbiAqIEFsbG93cyB0byB3b3JrIHdpdGggZW50aXR5IHJlbGF0aW9ucyBhbmQgcGVyZm9ybSBzcGVjaWZpYyBvcGVyYXRpb25zIHdpdGggdGhvc2UgcmVsYXRpb25zLlxuICpcbiAqIHRvZG86IGFkZCB0cmFuc2FjdGlvbnMgZXZlcnl3aGVyZVxuICovXG52YXIgUmVsYXRpb25VcGRhdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZWxhdGlvblVwZGF0ZXIocXVlcnlCdWlsZGVyLCBleHByZXNzaW9uTWFwKSB7XG4gICAgICAgIHRoaXMucXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgc2V0IG9yIGFkZCBvcGVyYXRpb24gb24gYSByZWxhdGlvbi5cbiAgICAgKi9cbiAgICBSZWxhdGlvblVwZGF0ZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVsYXRpb24sIHVwZGF0ZVNldCwgdXBkYXRlU2V0XzEsIG9mcywgcGFyYW1ldGVyc18xLCBjb25kaXRpb25zXzEsIGNvbmRpdGlvbiwgb2ZfMSwgdXBkYXRlU2V0LCBqdW5jdGlvbk1ldGFkYXRhXzEsIG9mcywgdmFsdWVzLCBmaXJzdENvbHVtblZhbHVlcywgc2Vjb25kQ29sdW1uVmFsdWVzXzEsIGJ1bGtJbnNlcnRlZF8xO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldCA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLnJlZHVjZShmdW5jdGlvbiAodXBkYXRlU2V0LCBqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCA/IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnNldEVudGl0eVZhbHVlKHVwZGF0ZVNldCwgcmVsYXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm9mIHx8IChBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgJiYgIXRoaXMuZXhwcmVzc2lvbk1hcC5vZi5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlKHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCh1cGRhdGVTZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZUluSWRzKHRoaXMuZXhwcmVzc2lvbk1hcC5vZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lciB8fCByZWxhdGlvbi5pc09uZVRvTWFueSkgJiYgdmFsdWUgPT09IG51bGwpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldF8xID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2V0XzFbY29sdW1uLnByb3BlcnR5TmFtZV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMuZm9yRWFjaChmdW5jdGlvbiAob2YsIG9mSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4sIGNvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gXCJqb2luQ29sdW1uX1wiICsgb2ZJbmRleCArIFwiX1wiICsgY29sdW1uSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbWV0ZXJOYW1lXSA9IG9mIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUob2YpIDogb2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnNfMS5wdXNoKGNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb25zXzEubWFwKGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIFwiKFwiICsgc3RyICsgXCIpXCI7IH0pLmpvaW4oXCIgT1IgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUocmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCh1cGRhdGVTZXRfMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIgfHwgcmVsYXRpb24uaXNPbmVUb01hbnkpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIllvdSBjYW5ub3QgdXBkYXRlIHJlbGF0aW9ucyBvZiBtdWx0aXBsZSBlbnRpdGllcyB3aXRoIHRoZSBzYW1lIHJlbGF0ZWQgb2JqZWN0LiBQcm92aWRlIGEgc2luZ2xlIGVudGl0eSBpbnRvIC5vZiBtZXRob2QuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZfMSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNldCA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKHVwZGF0ZVNldCwgam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWxhdGlvblZhbHVlID0gb2ZfMSBpbnN0YW5jZW9mIE9iamVjdCA/IGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShvZl8xKSA6IG9mXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5zZXRFbnRpdHlWYWx1ZSh1cGRhdGVTZXQsIHJlbGF0aW9uVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KHVwZGF0ZVNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlSW5JZHModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uTWV0YWRhdGFfMSA9IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZnMgPSBBcnJheS5pc0FycmF5KHRoaXMuZXhwcmVzc2lvbk1hcC5vZikgPyB0aGlzLmV4cHJlc3Npb25NYXAub2YgOiBbdGhpcy5leHByZXNzaW9uTWFwLm9mXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2x1bW5WYWx1ZXMgPSByZWxhdGlvbi5pc01hbnlUb01hbnlPd25lciA/IG9mcyA6IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZENvbHVtblZhbHVlc18xID0gcmVsYXRpb24uaXNNYW55VG9NYW55T3duZXIgPyB2YWx1ZXMgOiBvZnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0ZWRfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2x1bW5WYWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlyc3RDb2x1bW5WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRDb2x1bW5WYWx1ZXNfMS5mb3JFYWNoKGZ1bmN0aW9uIChzZWNvbmRDb2x1bW5WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2VydGVkID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uTWV0YWRhdGFfMS5vd25lckNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IGZpcnN0Q29sdW1uVmFsIGluc3RhbmNlb2YgT2JqZWN0ID8gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZmlyc3RDb2x1bW5WYWwpIDogZmlyc3RDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbk1ldGFkYXRhXzEuaW52ZXJzZUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IHNlY29uZENvbHVtblZhbCBpbnN0YW5jZW9mIE9iamVjdCA/IGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKHNlY29uZENvbHVtblZhbCkgOiBzZWNvbmRDb2x1bW5WYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWxrSW5zZXJ0ZWRfMS5wdXNoKGluc2VydGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWxrSW5zZXJ0ZWRfMS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5xdWVyeUJ1aWxkZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5xdWVyeUJ1aWxkZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGJ1bGtJbnNlcnRlZF8xLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKGp1bmN0aW9uTWV0YWRhdGFfMS50YWJsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50byhqdW5jdGlvbk1ldGFkYXRhXzEudGFibGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoYnVsa0luc2VydGVkXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25VcGRhdGVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uVXBkYXRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvblVwZGF0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPcmFjbGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL29yYWNsZS9PcmFjbGVEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBVcGRhdGVzIGVudGl0eSB3aXRoIHJldHVybmluZyByZXN1bHRzIGluIHRoZSBlbnRpdHkgaW5zZXJ0IGFuZCB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqL1xudmFyIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvcihxdWVyeVJ1bm5lciwgZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcCA9IGV4cHJlc3Npb25NYXA7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGVudGl0aWVzIHdpdGggYSBzcGVjaWFsIGNvbHVtbnMgYWZ0ZXIgdXBkYXRpb24gcXVlcnkgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodXBkYXRlUmVzdWx0LCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eUluZGV4KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQsIHJldHVybmluZ0NvbHVtbnMsIHVwZGF0aW9uQ29sdW1ucywgZW50aXR5SWQsIGxvYWRlZFJldHVybmluZ0NvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgJiYgQXJyYXkuaXNBcnJheSh1cGRhdGVSZXN1bHQucmF3KSAmJiB0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdC5yYXcgPSB1cGRhdGVSZXN1bHQucmF3LnJlZHVjZShmdW5jdGlvbiAobmV3UmF3LCByYXdJdGVtLCByYXdJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYXdbX3RoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnNbcmF3SXRlbUluZGV4XS5kYXRhYmFzZU5hbWVdID0gcmF3SXRlbVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkodXBkYXRlUmVzdWx0LnJhdykgPyB1cGRhdGVSZXN1bHQucmF3W2VudGl0eUluZGV4XSA6IHVwZGF0ZVJlc3VsdC5yYXc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnMgPSB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmNyZWF0ZUdlbmVyYXRlZE1hcChtZXRhZGF0YSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmluZ0NvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGVudGl0eSwgcmV0dXJuaW5nQ29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZXN1bHQuZ2VuZXJhdGVkTWFwcy5wdXNoKHJldHVybmluZ0NvbHVtbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRpb25Db2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodXBkYXRpb25Db2x1bW5zLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IHVwZGF0ZSBlbnRpdHkgYmVjYXVzZSBlbnRpdHkgaWQgaXMgbm90IHNldCBpbiB0aGUgZW50aXR5LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gbWV0YWRhdGEudGFyZ2V0TmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdCh1cGRhdGlvbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIG1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKG1ldGFkYXRhLnRhcmdldCwgbWV0YWRhdGEudGFyZ2V0TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWxldGVkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uKFwiY3JlYXRlLXBvam9cIikgLy8gdXNlIFBPSk8gYmVjYXVzZSBjcmVhdGVkIG9iamVjdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlcywgZS5nLiBwcm9wZXJ0eSA9IG51bGwgYW5kIHRob3NlIHByb3BlcnRpZXMgbWFpZ2h0IGJlIG92ZXJyaWRkZW4gYnkgbWVyZ2UgcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPbmUoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRSZXR1cm5pbmdDb2x1bW5zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkUmV0dXJuaW5nQ29sdW1ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKG1ldGFkYXRhLnRhcmdldCwgZW50aXR5LCBsb2FkZWRSZXR1cm5pbmdDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdC5nZW5lcmF0ZWRNYXBzLnB1c2gobG9hZGVkUmV0dXJuaW5nQ29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgZW50aXRpZXMgd2l0aCBhIHNwZWNpYWwgY29sdW1ucyBhZnRlciBpbnNlcnRpb24gcXVlcnkgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoaW5zZXJ0UmVzdWx0LCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEsIGluc2VydGlvbkNvbHVtbnMsIGdlbmVyYXRlZE1hcHMsIGVudGl0eUlkcywgcmV0dXJuaW5nUmVzdWx0XzE7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uQ29sdW1ucyA9IHRoaXMuZ2V0SW5zZXJ0aW9uUmV0dXJuaW5nQ29sdW1ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkTWFwcyA9IGVudGl0aWVzLm1hcChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE9yYWNsZURyaXZlciAmJiBBcnJheS5pc0FycmF5KGluc2VydFJlc3VsdC5yYXcpICYmIF90aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0LnJhdyA9IGluc2VydFJlc3VsdC5yYXcucmVkdWNlKGZ1bmN0aW9uIChuZXdSYXcsIHJhd0l0ZW0sIHJhd0l0ZW1JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmF3W190aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zW3Jhd0l0ZW1JbmRleF0uZGF0YWJhc2VOYW1lXSA9IHJhd0l0ZW1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3UmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgdmFsdWVzIGdlbmVyYXRlZCBieSBhIGRhdGFiYXNlIGZvciB1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5pc0FycmF5KGluc2VydFJlc3VsdC5yYXcpID8gaW5zZXJ0UmVzdWx0LnJhd1tlbnRpdHlJbmRleF0gOiBpbnNlcnRSZXN1bHQucmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0ZWRNYXAgPSBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLmRyaXZlci5jcmVhdGVHZW5lcmF0ZWRNYXAobWV0YWRhdGEsIHJlc3VsdCwgZW50aXR5SW5kZXgsIGVudGl0aWVzLmxlbmd0aCkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eUluZGV4IGluIF90aGlzLmV4cHJlc3Npb25NYXAubG9jYWxseUdlbmVyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLm1lcmdlKG1ldGFkYXRhLnRhcmdldCwgZ2VuZXJhdGVkTWFwLCBfdGhpcy5leHByZXNzaW9uTWFwLmxvY2FsbHlHZW5lcmF0ZWRbZW50aXR5SW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGVudGl0eSwgZ2VuZXJhdGVkTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkTWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uZHJpdmVyLmlzUmV0dXJuaW5nU3FsU3VwcG9ydGVkKCkgPT09IGZhbHNlICYmIGluc2VydGlvbkNvbHVtbnMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWRzID0gZW50aXRpZXMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5SWQgPSBtZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGFuIGVtcHR5IGBlbnRpdHlJZGAgLSBpZiB3ZSBkb24ndCwgdGhlIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0aXZlbHkgZHJvcHMgdGhlIGB3aGVyZWAgY2xhdXNlIGVudGlyZWx5IGFuZCB0aGUgZmlyc3QgcmVjb3JkIHdpbGwgYmUgcmV0dXJuZWQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB3aGF0IHdlIHdhbnQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgdXBkYXRlIGVudGl0eSBiZWNhdXNlIGVudGl0eSBpZCBpcyBub3Qgc2V0IGluIHRoZSBlbnRpdHkuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdChpbnNlcnRpb25Db2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBtZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20obWV0YWRhdGEudGFyZ2V0LCBtZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoZW50aXR5SWRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uKFwiY3JlYXRlLXBvam9cIikgLy8gdXNlIFBPSk8gYmVjYXVzZSBjcmVhdGVkIG9iamVjdCBjYW4gY29udGFpbiBkZWZhdWx0IHZhbHVlcywgZS5nLiBwcm9wZXJ0eSA9IG51bGwgYW5kIHRob3NlIHByb3BlcnRpZXMgbWFpZ2h0IGJlIG92ZXJyaWRkZW4gYnkgbWVyZ2UgcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nUmVzdWx0XzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlci5tZXJnZShtZXRhZGF0YS50YXJnZXQsIGdlbmVyYXRlZE1hcHNbZW50aXR5SW5kZXhdLCByZXR1cm5pbmdSZXN1bHRfMVtlbnRpdHlJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIubWVyZ2UobWV0YWRhdGEudGFyZ2V0LCBlbnRpdHksIHJldHVybmluZ1Jlc3VsdF8xW2VudGl0eUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5LCBlbnRpdHlJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHlJZCA9IG1ldGFkYXRhLmdldEVudGl0eUlkTWFwKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UmVzdWx0LmlkZW50aWZpZXJzLnB1c2goZW50aXR5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFJlc3VsdC5nZW5lcmF0ZWRNYXBzLnB1c2goZ2VuZXJhdGVkTWFwc1tlbnRpdHlJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29sdW1ucyB3ZSBuZWVkIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIHdoZW4gd2UgaW5zZXJ0IGVudGl0eS5cbiAgICAgKi9cbiAgICBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5wcm90b3R5cGUuZ2V0SW5zZXJ0aW9uUmV0dXJuaW5nQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZm9yIGRhdGFiYXNlcyB3aGljaCBzdXBwb3J0IHJldHVybmluZyBzdGF0ZW1lbnQgd2UgbmVlZCB0byByZXR1cm4gZXh0cmEgY29sdW1ucyBsaWtlIGlkXG4gICAgICAgIC8vIGZvciBvdGhlciBkYXRhYmFzZXMgd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gaWQgY29sdW1uIHNpbmNlIGl0cyByZXR1cm5lZCBieSBhIGRyaXZlciBhbHJlYWR5XG4gICAgICAgIHZhciBuZWVkVG9DaGVja0dlbmVyYXRlZCA9IHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5kcml2ZXIuaXNSZXR1cm5pbmdTcWxTdXBwb3J0ZWQoKTtcbiAgICAgICAgLy8gZmlsdGVyIG91dCB0aGUgY29sdW1ucyBvZiB3aGljaCB3ZSBuZWVkIGRhdGFiYXNlIGluc2VydGVkIHZhbHVlcyB0byB1cGRhdGUgb3VyIGVudGl0eVxuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgIChuZWVkVG9DaGVja0dlbmVyYXRlZCAmJiBjb2x1bW4uaXNHZW5lcmF0ZWQpIHx8XG4gICAgICAgICAgICAgICAgY29sdW1uLmlzQ3JlYXRlRGF0ZSB8fFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pc1VwZGF0ZURhdGUgfHxcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNEZWxldGVEYXRlIHx8XG4gICAgICAgICAgICAgICAgY29sdW1uLmlzVmVyc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb2x1bW5zIHdlIG5lZWQgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2Ugd2hlbiB3ZSB1cGRhdGUgZW50aXR5LlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5nZXRVcGRhdGlvblJldHVybmluZ0NvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNVcGRhdGVEYXRlIHx8IGNvbHVtbi5pc1ZlcnNpb247XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29sdW1ucyB3ZSBuZWVkIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIHdoZW4gd2Ugc29mdCBkZWxldGUgYW5kIHJlc3RvcmUgZW50aXR5LlxuICAgICAqL1xuICAgIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLnByb3RvdHlwZS5nZXRTb2Z0RGVsZXRpb25SZXR1cm5pbmdDb2x1bW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmlzVXBkYXRlRGF0ZSB8fCBjb2x1bW4uaXNWZXJzaW9uIHx8IGNvbHVtbi5pc0RlbGV0ZURhdGU7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yO1xufSgpKTtcbmV4cG9ydCB7IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIgfSBmcm9tIFwiLi90cmFuc2Zvcm1lci9SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgU3FsU2VydmVyRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9zcWxzZXJ2ZXIvU3FsU2VydmVyRHJpdmVyXCI7XG5pbXBvcnQgeyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yXCI7XG5pbXBvcnQgeyBOb1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvciB9IGZyb20gXCIuLi9lcnJvci9Ob1ZlcnNpb25PclVwZGF0ZURhdGVDb2x1bW5FcnJvclwiO1xuaW1wb3J0IHsgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvciB9IGZyb20gXCIuLi9lcnJvci9PcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yXCI7XG5pbXBvcnQgeyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIjtcbmltcG9ydCB7IEpvaW5BdHRyaWJ1dGUgfSBmcm9tIFwiLi9Kb2luQXR0cmlidXRlXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIjtcbmltcG9ydCB7IFJlbGF0aW9uSWRMb2FkZXIgfSBmcm9tIFwiLi9yZWxhdGlvbi1pZC9SZWxhdGlvbklkTG9hZGVyXCI7XG5pbXBvcnQgeyBSZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyIH0gZnJvbSBcIi4vcmVsYXRpb24taWQvUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lclwiO1xuaW1wb3J0IHsgUmVsYXRpb25Db3VudExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRMb2FkZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgfSBmcm9tIFwiLi9yZWxhdGlvbi1jb3VudC9SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcbmltcG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0RyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvcG9zdGdyZXMvUG9zdGdyZXNEcml2ZXJcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxpdGVEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbGl0ZS1hYnN0cmFjdC9BYnN0cmFjdFNxbGl0ZURyaXZlclwiO1xuaW1wb3J0IHsgT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT2Zmc2V0V2l0aG91dExpbWl0Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eU5vdEZvdW5kRXJyb3JcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBTZWxlY3RRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNlbGVjdFF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVTZWxlY3RFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUpvaW5FeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZVdoZXJlRXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVHcm91cEJ5RXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVIYXZpbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0T2Zmc2V0RXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMb2NrRXhwcmVzc2lvbigpO1xuICAgICAgICBzcWwgPSBzcWwudHJpbSgpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnN1YlF1ZXJ5KVxuICAgICAgICAgICAgc3FsID0gXCIoXCIgKyBzcWwgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHNxbDtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3VicXVlcnkgLSBxdWVyeSB0aGF0IGNhbiBiZSB1c2VkIGluc2lkZSBvdGhlciBxdWVyaWVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc3ViUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxYiA9IHRoaXMuY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gICAgICAgIHFiLmV4cHJlc3Npb25NYXAuc3ViUXVlcnkgPSB0cnVlO1xuICAgICAgICBxYi5wYXJlbnRRdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcWI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFNFTEVDVCBxdWVyeSBhbmQgc2VsZWN0cyBnaXZlbiBkYXRhLlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBzZWxlY3Rpb25BbGlhc05hbWUpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5VHlwZSA9IFwic2VsZWN0XCI7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gc2VsZWN0aW9uLm1hcChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7IHJldHVybiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhzdWJRdWVyeUJ1aWxkZXIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnB1c2goeyBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLCBhbGlhc05hbWU6IHNlbGVjdGlvbkFsaWFzTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gW3sgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgc2VsZWN0aW9uIHRvIHRoZSBTRUxFQ1QgcXVlcnkuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRTZWxlY3QgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBzZWxlY3Rpb25BbGlhc05hbWUpIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5jb25jYXQoc2VsZWN0aW9uLm1hcChmdW5jdGlvbiAoc2VsZWN0aW9uKSB7IHJldHVybiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc3ViUXVlcnlCdWlsZGVyID0gc2VsZWN0aW9uKHRoaXMuc3ViUXVlcnkoKSk7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMoc3ViUXVlcnlCdWlsZGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBzdWJRdWVyeUJ1aWxkZXIuZ2V0UXVlcnkoKSwgYWxpYXNOYW1lOiBzZWxlY3Rpb25BbGlhc05hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IG1heCBleGVjdXRpb24gdGltZS5cbiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5tYXhFeGVjdXRpb25UaW1lID0gZnVuY3Rpb24gKG1pbGxpc2Vjb25kcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSA9IG1pbGxpc2Vjb25kcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBESVNUSU5DVC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmRpc3RpbmN0ID0gZnVuY3Rpb24gKGRpc3RpbmN0KSB7XG4gICAgICAgIGlmIChkaXN0aW5jdCA9PT0gdm9pZCAwKSB7IGRpc3RpbmN0ID0gdHJ1ZTsgfVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3QgPSBkaXN0aW5jdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXN0aW5jdCBvbiBjbGF1c2UgZm9yIFBvc3RncmVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZGlzdGluY3RPbiA9IGZ1bmN0aW9uIChkaXN0aW5jdE9uKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3REaXN0aW5jdE9uID0gZGlzdGluY3RPbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5mcm9tID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKSB7XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZEZyb20gPSBmdW5jdGlvbiAoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpIHtcbiAgICAgICAgdmFyIGFsaWFzID0gdGhpcy5jcmVhdGVGcm9tQWxpYXMoZW50aXR5VGFyZ2V0LCBhbGlhc05hbWUpO1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKGFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luID0gZnVuY3Rpb24gKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5qb2luKFwiSU5ORVJcIiwgZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGVmdEpvaW4gPSBmdW5jdGlvbiAoZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5pbm5lckpvaW5BbmRTZWxlY3QgPSBmdW5jdGlvbiAoZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcyk7XG4gICAgICAgIHRoaXMuaW5uZXJKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kU2VsZWN0ID0gZnVuY3Rpb24gKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmxlZnRKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luQW5kTWFwTWFueSA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKTtcbiAgICAgICAgdGhpcy5qb2luKFwiSU5ORVJcIiwgZW50aXR5T3JQcm9wZXJ0eSwgYWxpYXMsIGNvbmRpdGlvbiwgcGFyYW1ldGVycywgbWFwVG9Qcm9wZXJ0eSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuaW5uZXJKb2luQW5kTWFwT25lID0gZnVuY3Rpb24gKG1hcFRvUHJvcGVydHksIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmpvaW4oXCJJTk5FUlwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kTWFwTWFueSA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKTtcbiAgICAgICAgdGhpcy5qb2luKFwiTEVGVFwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxlZnRKb2luQW5kTWFwT25lID0gZnVuY3Rpb24gKG1hcFRvUHJvcGVydHksIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpO1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMsIG1hcFRvUHJvcGVydHksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHJlbGF0aW9uIGlkIGFuZCBtYXBzIGl0IGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmVsYXRpb25JZEFuZE1hcCA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCByZWxhdGlvbk5hbWUsIGFsaWFzTmFtZU9yT3B0aW9ucywgcXVlcnlCdWlsZGVyRmFjdG9yeSkge1xuICAgICAgICB2YXIgcmVsYXRpb25JZEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbklkQXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHk7XG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgICAgICBpZiAodHlwZW9mIGFsaWFzTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUuYWxpYXMgPSBhbGlhc05hbWVPck9wdGlvbnM7XG4gICAgICAgIGlmIChhbGlhc05hbWVPck9wdGlvbnMgaW5zdGFuY2VvZiBPYmplY3QgJiYgYWxpYXNOYW1lT3JPcHRpb25zLmRpc2FibGVNaXhlZE1hcClcbiAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUuZGlzYWJsZU1peGVkTWFwID0gdHJ1ZTtcbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gcXVlcnlCdWlsZGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLnB1c2gocmVsYXRpb25JZEF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChyZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uSWRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvdW50cyBudW1iZXIgb2YgZW50aXRpZXMgb2YgZW50aXR5J3MgcmVsYXRpb24gYW5kIG1hcHMgdGhlIHZhbHVlIGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmVsYXRpb25Db3VudEFuZE1hcCA9IGZ1bmN0aW9uIChtYXBUb1Byb3BlcnR5LCByZWxhdGlvbk5hbWUsIGFsaWFzTmFtZSwgcXVlcnlCdWlsZGVyRmFjdG9yeSkge1xuICAgICAgICB2YXIgcmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHk7XG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLmFsaWFzID0gYWxpYXNOYW1lO1xuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnF1ZXJ5QnVpbGRlckZhY3RvcnkgPSBxdWVyeUJ1aWxkZXJGYWN0b3J5O1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25Db3VudEF0dHJpYnV0ZXMucHVzaChyZWxhdGlvbkNvdW50QXR0cmlidXRlKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5qdW5jdGlvbkFsaWFzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHJlbGF0aW9uIGlkcyBmb3IgYWxsIHJlbGF0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgZW50aXR5LlxuICAgICAqIEFsbCByZWxhdGlvbiBpZHMgd2lsbCBiZSBtYXBwZWQgdG8gcmVsYXRpb24gcHJvcGVydHkgdGhlbXNlbGYuXG4gICAgICogSWYgYXJyYXkgb2Ygc3RyaW5ncyBpcyBnaXZlbiB0aGVuIGxvYWRzIG9ubHkgcmVsYXRpb24gaWRzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubG9hZEFsbFJlbGF0aW9uSWRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5yZWxhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZWxhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlbGF0aW9ucy5pbmRleE9mKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIF90aGlzLmxvYWRSZWxhdGlvbklkQW5kTWFwKF90aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCwgX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSArIFwiLlwiICsgcmVsYXRpb24ucHJvcGVydHlQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IFdIRVJFIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBXSEVSRSBjb25kaXRpb25zLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hbmRXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcImFuZFwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSkgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICpcbiAgICAgKiBJZHMgYXJlIG1peGVkLlxuICAgICAqIEl0IG1lYW5zIGlmIHlvdSBoYXZlIHNpbmdsZSBwcmltYXJ5IGtleSB5b3UgY2FuIHBhc3MgYSBzaW1wbGUgaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSBbMSwgMiwgM10uXG4gICAgICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIHlvdSBuZWVkIHRvIHBhc3Mgb2JqZWN0IHdpdGggcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBzcGVjaWZpZWQsXG4gICAgICogZm9yIGV4YW1wbGUgW3sgZmlyc3RJZDogMSwgc2Vjb25kSWQ6IDIgfSwgeyBmaXJzdElkOiAyLCBzZWNvbmRJZDogMyB9LCAuLi5dXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5kV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JXaGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcldoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgSEFWSU5HIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgSEFWSU5HIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBIQVZJTkcgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5oYXZpbmcgPSBmdW5jdGlvbiAoaGF2aW5nLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLnB1c2goeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGhhdmluZyB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kSGF2aW5nID0gZnVuY3Rpb24gKGhhdmluZywgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiBoYXZpbmcgfSk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JIYXZpbmcgPSBmdW5jdGlvbiAoaGF2aW5nLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLnB1c2goeyB0eXBlOiBcIm9yXCIsIGNvbmRpdGlvbjogaGF2aW5nIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIEdST1VQIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgR1JPVVAgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IEdST1VQIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5ncm91cEJ5ID0gZnVuY3Rpb24gKGdyb3VwQnkpIHtcbiAgICAgICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5ncm91cEJ5cyA9IFtncm91cEJ5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5ncm91cEJ5cyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRHcm91cEJ5ID0gZnVuY3Rpb24gKGdyb3VwQnkpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLnB1c2goZ3JvdXBCeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcXFwib3JkZXJcXFwiIGNhbiBhY2NlcHQgb25seSBcXFwiQVNDXFxcIiBhbmQgXFxcIkRFU0NcXFwiIHZhbHVlcy5cIik7XG4gICAgICAgIGlmIChudWxscyAhPT0gdW5kZWZpbmVkICYmIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiYgbnVsbHMgIT09IFwiTlVMTFMgTEFTVFwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFxcXCJudWxsc1xcXCIgY2FuIGFjY2VwdCBvbmx5IFxcXCJOVUxMUyBGSVJTVFxcXCIgYW5kIFxcXCJOVUxMUyBMQVNUXFxcIiB2YWx1ZXMuXCIpO1xuICAgICAgICBpZiAoc29ydCkge1xuICAgICAgICAgICAgaWYgKHNvcnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSBzb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IChfYSA9IHt9LCBfYVtzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfSwgX2EpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9iID0ge30sIF9iW3NvcnRdID0gb3JkZXIsIF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYWRkT3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcXFwib3JkZXJcXFwiIGNhbiBhY2NlcHQgb25seSBcXFwiQVNDXFxcIiBhbmQgXFxcIkRFU0NcXFwiIHZhbHVlcy5cIik7XG4gICAgICAgIGlmIChudWxscyAhPT0gdW5kZWZpbmVkICYmIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiYgbnVsbHMgIT09IFwiTlVMTFMgTEFTVFwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFxcXCJudWxsc1xcXCIgY2FuIGFjY2VwdCBvbmx5IFxcXCJOVUxMUyBGSVJTVFxcXCIgYW5kIFxcXCJOVUxMUyBMQVNUXFxcIiB2YWx1ZXMuXCIpO1xuICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IG9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0J3MgTElNSVQgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqIE5PVEUgdGhhdCBpdCBtYXkgbm90IHdvcmsgYXMgeW91IGV4cGVjdCBpZiB5b3UgYXJlIHVzaW5nIGpvaW5zLlxuICAgICAqIElmIHlvdSB3YW50IHRvIGltcGxlbWVudCBwYWdpbmF0aW9uLCBhbmQgeW91IGFyZSBoYXZpbmcgam9pbiBpbiB5b3VyIHF1ZXJ5LFxuICAgICAqIHRoZW4gdXNlIGluc3RlYWQgdGFrZSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmxpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCA9IHRoaXMubm9ybWFsaXplTnVtYmVyKGxpbWl0KTtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgXFxcImxpbWl0XFxcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0J3MgT0ZGU0VUIC0gc2VsZWN0aW9uIG9mZnNldC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHNraXAgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcihvZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9mZnNldCAhPT0gdW5kZWZpbmVkICYmIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIFxcXCJvZmZzZXRcXFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIG1heGltYWwgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHRha2UuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS50YWtlID0gZnVuY3Rpb24gKHRha2UpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnRha2UgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcih0YWtlKTtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlICE9PSB1bmRlZmluZWQgJiYgaXNOYU4odGhpcy5leHByZXNzaW9uTWFwLnRha2UpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIFxcXCJ0YWtlXFxcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBudW1iZXIgb2YgZW50aXRpZXMgdG8gc2tpcC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAoc2tpcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2tpcCA9IHRoaXMubm9ybWFsaXplTnVtYmVyKHNraXApO1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnNraXAgIT09IHVuZGVmaW5lZCAmJiBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAuc2tpcCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgXFxcInNraXBcXFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgY2VydGFpbiBpbmRleCB0byBiZSB1c2VkIGJ5IHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBOYW1lIG9mIGluZGV4IHRvIGJlIHVzZWQuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS51c2VJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlSW5kZXggPSBpbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2tpbmcgbW9kZS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnNldExvY2sgPSBmdW5jdGlvbiAobG9ja01vZGUsIGxvY2tWZXJzaW9uLCBsb2NrVGFibGVzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9IGxvY2tNb2RlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gPSBsb2NrVmVyc2lvbjtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMgPSBsb2NrVGFibGVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBnbG9iYWwgY29uZGl0aW9uIG9mIFwibm9uLWRlbGV0ZWRcIiBmb3IgdGhlIGVudGl0eSB3aXRoIGRlbGV0ZSBkYXRlIGNvbHVtbnMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aXRoRGVsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGZpcnN0IHJhdyByZXN1bHQgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbC5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFJhd09uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpWzBdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCByYXcgcmVzdWx0cyByZXR1cm5lZCBieSBleGVjdXRpb24gb2YgZ2VuZXJhdGVkIHF1ZXJ5IGJ1aWxkZXIgc3FsLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UmF3TWFueSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZXN1bHRzLCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCA3LCAxMiwgMTVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VUcmFuc2FjdGlvbiA9PT0gdHJ1ZSAmJiBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbOCwgMTAsICwgMTFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrRXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHF1ZXJ5UnVubmVyICE9PSB0aGlzLnF1ZXJ5UnVubmVyKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBzcWwgZ2VuZXJhdGVkIGJ5IHF1ZXJ5IGJ1aWxkZXIgYW5kIHJldHVybnMgb2JqZWN0IHdpdGggcmF3IHJlc3VsdHMgYW5kIGVudGl0aWVzIGNyZWF0ZWQgZnJvbSB0aGVtLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0UmF3QW5kRW50aXRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgcmVzdWx0cywgZXJyb3JfMiwgcm9sbGJhY2tFcnJvcl8yO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgNywgMTIsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlRW50aXRpZXNBbmRSYXdSZXN1bHRzKHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDExXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gODtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFs4LCAxMCwgLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgc2luZ2xlIGVudGl0eSByZXR1cm5lZCBieSBleGVjdXRpb24gb2YgZ2VuZXJhdGVkIHF1ZXJ5IGJ1aWxkZXIgc3FsLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0T25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cywgcmVzdWx0LCBtZXRhZGF0YSwgYWN0dWFsVmVyc2lvbiwgYWN0dWFsVmVyc2lvbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSYXdBbmRFbnRpdGllcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHMuZW50aXRpZXNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIgJiYgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFZlcnNpb24gPSBtZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmdldEVudGl0eVZhbHVlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxWZXJzaW9uLmdldFRpbWUoKSAhPT0gdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLmdldFRpbWUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja1ZlcnNpb25NaXNtYXRjaEVycm9yKG1ldGFkYXRhLm5hbWUsIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrVmVyc2lvbiwgYWN0dWFsVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbkNvbHVtbi5nZXRFbnRpdHlWYWx1ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVmVyc2lvbiAhPT0gdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IobWV0YWRhdGEubmFtZSwgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbnRpdHkgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbCBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0T25lT3JGYWlsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldE9uZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Tm90Rm91bmRFcnJvcih0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLnRhcmdldCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50aXR5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0aWVzIHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRNYW55ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJhd0FuZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHMuZW50aXRpZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgY291bnQgLSBudW1iZXIgb2YgZW50aXRpZXMgc2VsZWN0ZWQgYnkgc3FsIGdlbmVyYXRlZCBieSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQ291bnQgZXhjbHVkZXMgYWxsIGxpbWl0YXRpb25zIHNldCBieSBzZXRGaXJzdFJlc3VsdCBhbmQgc2V0TWF4UmVzdWx0cyBtZXRob2RzIGNhbGwuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZXN1bHRzLCBlcnJvcl8zLCByb2xsYmFja0Vycm9yXzM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgNywgMTIsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUNvdW50UXVlcnkocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzgsIDEwLCAsIDExXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6IHRocm93IGVycm9yXzM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGVudGl0aWVzIGFuZCBvdmVyYWxsIGVudGl0aWVzIGNvdW50ICh3aXRob3V0IGxpbWl0YXRpb24pLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBidWlsZCBwYWdpbmF0aW9uLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuZ2V0TWFueUFuZENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIGVudGl0aWVzQW5kUmF3LCBjYWNoZUlkLCBjb3VudCwgcmVzdWx0cywgZXJyb3JfNCwgcm9sbGJhY2tFcnJvcl80O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyID0gdGhpcy5vYnRhaW5RdWVyeVJ1bm5lcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDgsIDEzLCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZXhlY3V0ZUVudGl0aWVzQW5kUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllc0FuZFJhdyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeUVudGl0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVJZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBjYWNoZUlkIGZvciB0aGUgY291bnQgcXVlcnksIG9yIGl0IHdpbGwgcmV0cmVpdmUgdGhlIGFib3ZlIHF1ZXJ5IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VudCB3aWxsIHJldHVybiAwLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSAoY2FjaGVJZCkgPyBjYWNoZUlkICsgXCItY291bnRcIiA6IGNhY2hlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtlbnRpdGllc0FuZFJhdy5lbnRpdGllcywgY291bnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc3VsdHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl80ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbOSwgMTEsICwgMTJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IHRocm93IGVycm9yXzQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDE1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHJhdyBkYXRhIHN0cmVhbS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzcWwsIHBhcmFtZXRlcnMsIHF1ZXJ5UnVubmVyLCB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzLCByZWxlYXNlRm4sIHJlc3VsdHMsIGVycm9yXzUsIHJvbGxiYWNrRXJyb3JfNTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX19yZWFkKHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKCksIDIpLCBzcWwgPSBfYVswXSwgcGFyYW1ldGVycyA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgNiwgLCAxMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gX3RoaXMucXVlcnlSdW5uZXIpIC8vIG1lYW5zIHdlIGNyZWF0ZWQgb3VyIG93biBxdWVyeSBydW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHF1ZXJ5UnVubmVyLnN0cmVhbShzcWwsIHBhcmFtZXRlcnMsIHJlbGVhc2VGbiwgcmVsZWFzZUZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA3O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzcsIDksICwgMTBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl81ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiB0aHJvdyBlcnJvcl81O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZy5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNhY2hlID0gZnVuY3Rpb24gKGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQsIG1heWJlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZE9yTWlsbGlzZWNvbmRzT3JJZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVEdXJhdGlvbiA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCA9IGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVEdXJhdGlvbiA9IG1heWJlTWlsbGlzZWNvbmRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBxdWVyeSBidWlsZGVyIHdvcmtzLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0T3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChkaXJlY3Rpb24sIGVudGl0eU9yUHJvcGVydHksIGFsaWFzTmFtZSwgY29uZGl0aW9uLCBwYXJhbWV0ZXJzLCBtYXBUb1Byb3BlcnR5LCBpc01hcHBpbmdNYW55KSB7XG4gICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzIHx8IHt9KTtcbiAgICAgICAgdmFyIGpvaW5BdHRyaWJ1dGUgPSBuZXcgSm9pbkF0dHJpYnV0ZSh0aGlzLmNvbm5lY3Rpb24sIHRoaXMuZXhwcmVzc2lvbk1hcCk7XG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICBqb2luQXR0cmlidXRlLm1hcFRvUHJvcGVydHkgPSBtYXBUb1Byb3BlcnR5O1xuICAgICAgICBqb2luQXR0cmlidXRlLmlzTWFwcGluZ01hbnkgPSBpc01hcHBpbmdNYW55O1xuICAgICAgICBqb2luQXR0cmlidXRlLmVudGl0eU9yUHJvcGVydHkgPSBlbnRpdHlPclByb3BlcnR5OyAvLyByZWxhdGlvbk5hbWVcbiAgICAgICAgam9pbkF0dHJpYnV0ZS5jb25kaXRpb24gPSBjb25kaXRpb24gPyBjb25kaXRpb24gOiB1bmRlZmluZWQ7IC8vIGpvaW5JbnZlcnNlU2lkZUNvbmRpdGlvblxuICAgICAgICAvLyBqb2luQXR0cmlidXRlLmp1bmN0aW9uQWxpYXMgPSBqb2luQXR0cmlidXRlLnJlbGF0aW9uLmlzT3duaW5nID8gcGFyZW50QWxpYXMgKyBcIl9cIiArIGRlc3RpbmF0aW9uVGFibGVBbGlhcyA6IGRlc3RpbmF0aW9uVGFibGVBbGlhcyArIFwiX1wiICsgcGFyZW50QWxpYXM7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5wdXNoKGpvaW5BdHRyaWJ1dGUpO1xuICAgICAgICBpZiAoam9pbkF0dHJpYnV0ZS5tZXRhZGF0YSkge1xuICAgICAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUubWV0YWRhdGEuZGVsZXRlRGF0ZUNvbHVtbiAmJiAhdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkRlbGV0ZUNvbHVtbiA9IGFsaWFzTmFtZSArIFwiLlwiICsgam9pbkF0dHJpYnV0ZS5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElTIE5VTExcIjtcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiA9IGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uID8gXCIgXCIgKyBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiArIFwiIEFORCBcIiArIGNvbmRpdGlvbkRlbGV0ZUNvbHVtbiA6IFwiXCIgKyBjb25kaXRpb25EZWxldGVDb2x1bW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b2RvOiBmaW5kIGFuZCBzZXQgbWV0YWRhdGEgcmlnaHQgdGhlcmU/XG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUubWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUucmVsYXRpb24gJiYgam9pbkF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqb2luXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5BdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChlbnRpdHlPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViUXVlcnlCdWlsZGVyID0gZW50aXR5T3JQcm9wZXJ0eSh0aGlzLnN1YlF1ZXJ5KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhzdWJRdWVyeUJ1aWxkZXIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgICAgICAgICAgICBzdWJRdWVyeSA9IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViUXVlcnkgPSBlbnRpdHlPclByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzU3ViUXVlcnkgPSBlbnRpdHlPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24gfHwgZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgMSkgPT09IFwiKFwiICYmIGVudGl0eU9yUHJvcGVydHkuc3Vic3RyKC0xKSA9PT0gXCIpXCI7XG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoOiBpc1N1YlF1ZXJ5ID09PSBmYWxzZSA/IGVudGl0eU9yUHJvcGVydHkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IGlzU3ViUXVlcnkgPT09IHRydWUgPyBzdWJRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiU0VMRUNUIEZST01cIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVNlbGVjdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJDYW5ub3QgYnVpbGQgcXVlcnkgYmVjYXVzZSBtYWluIGFsaWFzIGlzIG5vdCBzZXQgKGNhbGwgcWIjZnJvbSBtZXRob2QpXCIpO1xuICAgICAgICAvLyB0b2RvIHRocm93IGV4Y2VwdGlvbiBpZiBzZWxlY3RzIG9yIGZyb20gaXMgbWlzc2luZ1xuICAgICAgICB2YXIgYWxsU2VsZWN0cyA9IFtdO1xuICAgICAgICB2YXIgZXhjbHVkZWRTZWxlY3RzID0gW107XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoLmFwcGx5KGFsbFNlbGVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmJ1aWxkRXNjYXBlZEVudGl0eUNvbHVtblNlbGVjdHModGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCBtZXRhZGF0YSkpLCBmYWxzZSkpO1xuICAgICAgICAgICAgZXhjbHVkZWRTZWxlY3RzLnB1c2guYXBwbHkoZXhjbHVkZWRTZWxlY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsIG1ldGFkYXRhKSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIHNlbGVjdHMgZnJvbSBqb2luc1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXNcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChqb2luKSB7XG4gICAgICAgICAgICBpZiAoam9pbi5tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaC5hcHBseShhbGxTZWxlY3RzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoX3RoaXMuYnVpbGRFc2NhcGVkRW50aXR5Q29sdW1uU2VsZWN0cyhqb2luLmFsaWFzLm5hbWUsIGpvaW4ubWV0YWRhdGEpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaC5hcHBseShleGNsdWRlZFNlbGVjdHMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChfdGhpcy5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyhqb2luLmFsaWFzLm5hbWUsIGpvaW4ubWV0YWRhdGEpKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYXNNYWluQWxpYXMgPSBfdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuc29tZShmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBqb2luLmFsaWFzLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBfdGhpcy5lc2NhcGUoam9pbi5hbGlhcy5uYW1lKSArIFwiLipcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1ZGVkU2VsZWN0ID0gX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbmQoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gam9pbi5hbGlhcy5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRTZWxlY3RzLnB1c2goZXhjbHVkZWRTZWxlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFkZCBhbGwgb3RoZXIgc2VsZWN0c1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0c1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBleGNsdWRlZFNlbGVjdHMuaW5kZXhPZihzZWxlY3QpID09PSAtMTsgfSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIGFsbFNlbGVjdHMucHVzaCh7IHNlbGVjdGlvbjogX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoc2VsZWN0LnNlbGVjdGlvbiksIGFsaWFzTmFtZTogc2VsZWN0LmFsaWFzTmFtZSB9KTsgfSk7XG4gICAgICAgIC8vIGlmIHN0aWxsIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlbiBzaW1wbHkgc2V0IGl0IHRvIGFsbCAoKilcbiAgICAgICAgaWYgKGFsbFNlbGVjdHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHsgc2VsZWN0aW9uOiBcIipcIiB9KTtcbiAgICAgICAgdmFyIGxvY2sgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICBsb2NrID0gXCIgV0lUSCAoSE9MRExPQ0ssIFJPV0xPQ0spXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZVwiOlxuICAgICAgICAgICAgICAgICAgICBsb2NrID0gXCIgV0lUSCAoVVBETE9DSywgUk9XTE9DSylcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRpcnR5X3JlYWRcIjpcbiAgICAgICAgICAgICAgICAgICAgbG9jayA9IFwiIFdJVEggKE5PTE9DSylcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGNlcnRhaW4gaW5kZXhcbiAgICAgICAgdmFyIHVzZUluZGV4ID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgIHVzZUluZGV4ID0gXCIgVVNFIElOREVYIChcIiArIHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCArIFwiKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSBhIHNlbGVjdGlvbiBxdWVyeVxuICAgICAgICB2YXIgZnJvbXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNlc1xuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIGFsaWFzLnR5cGUgPT09IFwiZnJvbVwiICYmIChhbGlhcy50YWJsZVBhdGggfHwgYWxpYXMuc3ViUXVlcnkpOyB9KVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgIGlmIChhbGlhcy5zdWJRdWVyeSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXMuc3ViUXVlcnkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShhbGlhcy5uYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5nZXRUYWJsZU5hbWUoYWxpYXMudGFibGVQYXRoKSArIFwiIFwiICsgX3RoaXMuZXNjYXBlKGFsaWFzLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNlbGVjdCA9IHRoaXMuY3JlYXRlU2VsZWN0RGlzdGluY3RFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBhbGxTZWxlY3RzLm1hcChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uICsgKHNlbGVjdC5hbGlhc05hbWUgPyBcIiBBUyBcIiArIF90aGlzLmVzY2FwZShzZWxlY3QuYWxpYXNOYW1lKSA6IFwiXCIpOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBzZWxlY3QgKyBzZWxlY3Rpb24gKyBcIiBGUk9NIFwiICsgZnJvbXMuam9pbihcIiwgXCIpICsgbG9jayArIHVzZUluZGV4O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBzZWxlY3QgfCBzZWxlY3QgZGlzdGluY3QgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVTZWxlY3REaXN0aW5jdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZXhwcmVzc2lvbk1hcCwgc2VsZWN0RGlzdGluY3QgPSBfYS5zZWxlY3REaXN0aW5jdCwgc2VsZWN0RGlzdGluY3RPbiA9IF9hLnNlbGVjdERpc3RpbmN0T24sIG1heEV4ZWN1dGlvblRpbWUgPSBfYS5tYXhFeGVjdXRpb25UaW1lO1xuICAgICAgICB2YXIgZHJpdmVyID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlcjtcbiAgICAgICAgdmFyIHNlbGVjdCA9IFwiU0VMRUNUIFwiO1xuICAgICAgICBpZiAobWF4RXhlY3V0aW9uVGltZSA+IDApIHtcbiAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgIHNlbGVjdCArPSBcIi8qKyBNQVhfRVhFQ1VUSU9OX1RJTUUoXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSArIFwiKSAqLyBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgc2VsZWN0RGlzdGluY3RPbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0RGlzdGluY3RPbk1hcCA9IHNlbGVjdERpc3RpbmN0T24ubWFwKGZ1bmN0aW9uIChvbikgeyByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMob24pOyB9KS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBPTiAoXCIgKyBzZWxlY3REaXN0aW5jdE9uTWFwICsgXCIpIFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdERpc3RpbmN0KSB7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkpPSU5cIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUpvaW5FeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBleGFtcGxlczpcbiAgICAgICAgLy8gc2VsZWN0IGZyb20gb3duaW5nIHNpZGVcbiAgICAgICAgLy8gcWIuc2VsZWN0KFwicG9zdFwiKVxuICAgICAgICAvLyAgICAgLmxlZnRKb2luQW5kU2VsZWN0KFwicG9zdC5jYXRlZ29yeVwiLCBcImNhdGVnb3J5XCIpO1xuICAgICAgICAvLyBzZWxlY3QgZnJvbSBub24tb3duaW5nIHNpZGVcbiAgICAgICAgLy8gcWIuc2VsZWN0KFwiY2F0ZWdvcnlcIilcbiAgICAgICAgLy8gICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdChcImNhdGVnb3J5LnBvc3RcIiwgXCJwb3N0XCIpO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgam9pbnMgPSB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubWFwKGZ1bmN0aW9uIChqb2luQXR0cikge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gam9pbkF0dHIucmVsYXRpb247XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25UYWJsZU5hbWUgPSBqb2luQXR0ci50YWJsZVBhdGg7XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb25UYWJsZUFsaWFzID0gam9pbkF0dHIuYWxpYXMubmFtZTtcbiAgICAgICAgICAgIHZhciBhcHBlbmRlZENvbmRpdGlvbiA9IGpvaW5BdHRyLmNvbmRpdGlvbiA/IFwiIEFORCAoXCIgKyBqb2luQXR0ci5jb25kaXRpb24gKyBcIilcIiA6IFwiXCI7XG4gICAgICAgICAgICB2YXIgcGFyZW50QWxpYXMgPSBqb2luQXR0ci5wYXJlbnRBbGlhcztcbiAgICAgICAgICAgIC8vIGlmIGpvaW4gd2FzIGJ1aWxkIHdpdGhvdXQgcmVsYXRpb24gKGUuZy4gd2l0aG91dCBcInBvc3QuY2F0ZWdvcnlcIikgdGhlbiBpdCBtZWFucyB0aGF0IHdlIGhhdmUgZGlyZWN0XG4gICAgICAgICAgICAvLyB0YWJsZSB0byBqb2luLCB3aXRob3V0IGp1bmN0aW9uIHRhYmxlIGludm9sdmVkLiBUaGlzIG1lYW5zIHdlIHNpbXBseSBqb2luIGRpcmVjdCB0YWJsZS5cbiAgICAgICAgICAgIGlmICghcGFyZW50QWxpYXMgfHwgIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlc3RpbmF0aW9uSm9pbiA9IGpvaW5BdHRyLmFsaWFzLnN1YlF1ZXJ5ID8gam9pbkF0dHIuYWxpYXMuc3ViUXVlcnkgOiBfdGhpcy5nZXRUYWJsZU5hbWUoZGVzdGluYXRpb25UYWJsZU5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIiBcIiArIGpvaW5BdHRyLmRpcmVjdGlvbiArIFwiIEpPSU4gXCIgKyBkZXN0aW5hdGlvbkpvaW4gKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICtcbiAgICAgICAgICAgICAgICAgICAgKGpvaW5BdHRyLmNvbmRpdGlvbiA/IFwiIE9OIFwiICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoam9pbkF0dHIuY29uZGl0aW9uKSA6IFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgcmVhbCBlbnRpdHkgcmVsYXRpb24gaXMgaW52b2x2ZWRcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBKT0lOIGBjYXRlZ29yeWAgYGNhdGVnb3J5YCBPTiBgY2F0ZWdvcnlgLmBpZGAgPSBgcG9zdGAuYGNhdGVnb3J5SWRgXG4gICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiA9IHJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLnByb3BlcnR5UGF0aCArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIFwiICsgam9pbkF0dHIuZGlyZWN0aW9uICsgXCIgSk9JTiBcIiArIF90aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICsgXCIgT04gXCIgKyBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWxhdGlvbi5pc09uZVRvTWFueSB8fCByZWxhdGlvbi5pc09uZVRvT25lTm90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBKT0lOIGBwb3N0YCBgcG9zdGAgT04gYHBvc3RgLmBjYXRlZ29yeUlkYCA9IGBjYXRlZ29yeWAuYGlkYFxuICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVUeXBlID09PSBcImVudGl0eS1jaGlsZFwiICYmIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZENvbmRpdGlvbiArPSBcIiBBTkQgXCIgKyBkZXN0aW5hdGlvblRhYmxlQWxpYXMgKyBcIi5cIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZSArIFwiPSdcIiArIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yVmFsdWUgKyBcIidcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24ucHJvcGVydHlQYXRoICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIiBcIiArIGpvaW5BdHRyLmRpcmVjdGlvbiArIFwiIEpPSU4gXCIgKyBfdGhpcy5nZXRUYWJsZU5hbWUoZGVzdGluYXRpb25UYWJsZU5hbWUpICsgXCIgXCIgKyBfdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArIFwiIE9OIFwiICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29uZGl0aW9uICsgYXBwZW5kZWRDb25kaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1lYW5zIG1hbnktdG8tbWFueVxuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEudGFibGVQYXRoO1xuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvbkFsaWFzXzEgPSBqb2luQXR0ci5qdW5jdGlvbkFsaWFzO1xuICAgICAgICAgICAgICAgIHZhciBqdW5jdGlvbkNvbmRpdGlvbiA9IFwiXCIsIGRlc3RpbmF0aW9uQ29uZGl0aW9uID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAganVuY3Rpb25Db25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwb3N0X2NhdGVnb3J5YC5gcG9zdElkYCA9IGBwb3N0YC5gaWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgY2F0ZWdvcnlgLmBpZGAgPSBgcG9zdF9jYXRlZ29yeWAuYGNhdGVnb3J5SWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb25UYWJsZUFsaWFzICsgXCIuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9XCIgKyBqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbmRpdGlvbiA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcG9zdF9jYXRlZ29yeWAuYGNhdGVnb3J5SWRgID0gYGNhdGVnb3J5YC5gaWRgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsgcGFyZW50QWxpYXMgKyBcIi5cIiArIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcG9zdGAuYGlkYCA9IGBwb3N0X2NhdGVnb3J5YC5gcG9zdElkYFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiPVwiICsganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgXCIgKyBqb2luQXR0ci5kaXJlY3Rpb24gKyBcIiBKT0lOIFwiICsgX3RoaXMuZ2V0VGFibGVOYW1lKGp1bmN0aW9uVGFibGVOYW1lKSArIFwiIFwiICsgX3RoaXMuZXNjYXBlKGp1bmN0aW9uQWxpYXNfMSkgKyBcIiBPTiBcIiArIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGp1bmN0aW9uQ29uZGl0aW9uKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICsgam9pbkF0dHIuZGlyZWN0aW9uICsgXCIgSk9JTiBcIiArIF90aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgKyBcIiBcIiArIF90aGlzLmVzY2FwZShkZXN0aW5hdGlvblRhYmxlQWxpYXMpICsgXCIgT04gXCIgKyBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhkZXN0aW5hdGlvbkNvbmRpdGlvbiArIGFwcGVuZGVkQ29uZGl0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBqb2lucy5qb2luKFwiIFwiKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJHUk9VUCBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIHJldHVybiBcIiBHUk9VUCBCWSBcIiArIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXModGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLmpvaW4oXCIsIFwiKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiT1JERVIgQllcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxsT3JkZXJCeXM7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmRlckJ5cykubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBcIiBPUkRFUiBCWSBcIiArIE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yZGVyQnlzW2NvbHVtbk5hbWVdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29sdW1uTmFtZSkgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm9yZGVyICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXS5udWxscztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkxJTUlUXCIgYW5kIFwiT0ZGU0VUXCIgcGFydHMgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTGltaXRPZmZzZXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBpbiB0aGUgY2FzZSBpZiBub3RoaW5nIGlzIGpvaW5lZCBpbiB0aGUgcXVlcnkgYnVpbGRlciB3ZSBkb24ndCBuZWVkIHRvIG1ha2UgdHdvIHJlcXVlc3RzIHRvIGdldCBwYWdpbmF0ZWQgcmVzdWx0c1xuICAgICAgICAvLyB3ZSBjYW4gdXNlIHJlZ3VsYXIgbGltaXQgLyBvZmZzZXQsIHRoYXQncyB3aHkgd2UgYWRkIG9mZnNldCBhbmQgbGltaXQgY29uc3RydWN0aW9uIGhlcmUgYmFzZWQgb24gc2tpcCBhbmQgdGFrZSB2YWx1ZXNcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQsIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0O1xuICAgICAgICBpZiAoIW9mZnNldCAmJiAhbGltaXQgJiYgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNraXA7XG4gICAgICAgICAgICBsaW1pdCA9IHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gYSBsaW1pdGF0aW9uIGluIFNRTCBTZXJ2ZXIncyBwYXJzZXIgaW1wbGVtZW50YXRpb24gaXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZ1xuICAgICAgICAgICAgLy8gT0ZGU0VUIG9yIEZFVENIIE5FWFQgd2l0aG91dCBhbiBPUkRFUiBCWSBjbGF1c2UgYmVpbmcgcHJvdmlkZWQuIEluIGNhc2VzIHdoZXJlIHRoZVxuICAgICAgICAgICAgLy8gdXNlciBkb2VzIG5vdCByZXF1ZXN0IG9uZSB3ZSBpbnNlcnQgYSBkdW1teSBPUkRFUiBCWSB0aGF0IGRvZXMgbm90aGluZyBhbmQgc2hvdWxkXG4gICAgICAgICAgICAvLyBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgcXVlcnkgcGxhbm5lciBvciBvbiB0aGUgb3JkZXIgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQuXG4gICAgICAgICAgICAvLyBodHRwczovL2RiYS5zdGFja2V4Y2hhbmdlLmNvbS9hLzE5Mzc5OVxuICAgICAgICAgICAgdmFyIHByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoKGxpbWl0IHx8IG9mZnNldCkgJiYgT2JqZWN0LmtleXModGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzKS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiIE9SREVSIEJZIChTRUxFQ1QgTlVMTClcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiIE9GRlNFVCBcIiArIG9mZnNldCArIFwiIFJPV1MgRkVUQ0ggTkVYVCBcIiArIGxpbWl0ICsgXCIgUk9XUyBPTkxZXCI7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIFwiIE9GRlNFVCAwIFJPV1MgRkVUQ0ggTkVYVCBcIiArIGxpbWl0ICsgXCIgUk9XUyBPTkxZXCI7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTYXBEcml2ZXIpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcikge1xuICAgICAgICAgICAgaWYgKGxpbWl0ICYmIG9mZnNldClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdCArIFwiIE9GRlNFVCBcIiArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIC0xIE9GRlNFVCBcIiArIG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTIEZFVENIIE5FWFQgXCIgKyBsaW1pdCArIFwiIFJPV1MgT05MWVwiO1xuICAgICAgICAgICAgaWYgKGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBGRVRDSCBORVhUIFwiICsgbGltaXQgKyBcIiBST1dTIE9OTFlcIjtcbiAgICAgICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIE9GRlNFVCBcIiArIG9mZnNldCArIFwiIFJPV1NcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICBpZiAob2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBcIiBPRkZTRVQgXCIgKyBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTE9DS1wiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTG9ja0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkcml2ZXIgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyO1xuICAgICAgICB2YXIgbG9ja1RhYmxlc0NsYXVzZSA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcykge1xuICAgICAgICAgICAgaWYgKCEoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgfHwgZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJMb2NrIHRhYmxlcyBub3Qgc3VwcG9ydGVkIGluIHNlbGVjdGVkIGRyaXZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2tUYWJsZXMgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9ja1RhYmxlc0NsYXVzZSA9IFwiIE9GIFwiICsgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMuam9pbihcIiwgXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBkcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBMT0NLIElOIFNIQVJFIE1PREVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBTSEFSRVwiICsgbG9ja1RhYmxlc0NsYXVzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3dyaXRlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIgfHwgZHJpdmVyIGluc3RhbmNlb2YgT3JhY2xlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBQb3N0Z3Jlc0RyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIFwiIFNLSVAgTE9DS0VEXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIFwiIE5PV0FJVFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURSBOT1dBSVRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZvcl9ub19rZXlfdXBkYXRlXCI6XG4gICAgICAgICAgICAgICAgaWYgKGRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IGRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIE5PIEtFWSBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJIQVZJTkdcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBTZWxlY3RRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUhhdmluZ0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3MgfHwgIXRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB2YXIgY29uZGl0aW9ucyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzLm1hcChmdW5jdGlvbiAoaGF2aW5nLCBpbmRleCkge1xuICAgICAgICAgICAgc3dpdGNoIChoYXZpbmcudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbmRleCA+IDAgPyBcIkFORCBcIiA6IFwiXCIpICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5kZXggPiAwID8gXCJPUiBcIiA6IFwiXCIpICsgX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGhhdmluZy5jb25kaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKCFjb25kaXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICByZXR1cm4gXCIgSEFWSU5HIFwiICsgY29uZGl0aW9ucztcbiAgICB9O1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYnVpbGRFc2NhcGVkRW50aXR5Q29sdW1uU2VsZWN0cyA9IGZ1bmN0aW9uIChhbGlhc05hbWUsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNNYWluQWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5zb21lKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZTsgfSk7XG4gICAgICAgIHZhciBjb2x1bW5zID0gW107XG4gICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaC5hcHBseShjb2x1bW5zLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQobWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzU2VsZWN0ID09PSB0cnVlOyB9KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1ucy5wdXNoLmFwcGx5KGNvbHVtbnMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChtZXRhZGF0YS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoOyB9KTtcbiAgICAgICAgfSkpLCBmYWxzZSkpO1xuICAgICAgICAvLyBpZiB1c2VyIHVzZWQgcGFydGlhbCBzZWxlY3Rpb24gYW5kIGRpZCBub3Qgc2VsZWN0IHNvbWUgcHJpbWFyeSBjb2x1bW5zIHdoaWNoIGFyZSByZXF1aXJlZCB0byBiZSBzZWxlY3RlZFxuICAgICAgICAvLyB3ZSBzZWxlY3QgdGhvc2UgcHJpbWFyeSBjb2x1bW5zIGFuZCBtYXJrIHRoZW0gYXMgXCJ2aXJ0dWFsXCIuIExhdGVyIHZpcnR1YWwgY29sdW1uIHZhbHVlcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmaW5hbCBlbnRpdHlcbiAgICAgICAgLy8gdG8gbWFrZSBlbnRpdHkgY29udGFpbiBleGFjdGx5IHdoYXQgdXNlciBzZWxlY3RlZFxuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIC8vIGhvd2V2ZXIgbm90IGluIHRoZSBjYXNlIHdoZW4gbm90aGluZyAoZXZlbiBwYXJ0aWFsKSB3YXMgc2VsZWN0ZWQgZnJvbSB0aGlzIHRhcmdldCAoZm9yIGV4YW1wbGUgam9pbnMgd2l0aG91dCBzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHZhciBub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID8gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChwcmltYXJ5Q29sdW1uKSB7IHJldHVybiBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUNvbHVtbikgPT09IC0xOyB9KSA6IFtdO1xuICAgICAgICB2YXIgYWxsQ29sdW1ucyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGNvbHVtbnMpLCBmYWxzZSksIF9fcmVhZChub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zKSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IF90aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSk7XG4gICAgICAgICAgICB2YXIgc2VsZWN0aW9uUGF0aCA9IF90aGlzLmVzY2FwZShhbGlhc05hbWUpICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzVGV4dCA9IHVzZUxlZ2FjeSA/IFwiQXNUZXh0XCIgOiBcIlNUX0FzVGV4dFwiO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXRoID0gYXNUZXh0ICsgXCIoXCIgKyBzZWxlY3Rpb25QYXRoICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKVxuICAgICAgICAgICAgICAgICAgICAvLyBjYXN0IHRvIEpTT04gdG8gdHJpZ2dlciBwYXJzaW5nIGluIHRoZSBkcml2ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5wcmVjaXNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhdGggPSBcIlNUX0FzR2VvSlNPTihcIiArIHNlbGVjdGlvblBhdGggKyBcIiwgXCIgKyBjb2x1bW4ucHJlY2lzaW9uICsgXCIpOjpqc29uXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25QYXRoID0gXCJTVF9Bc0dlb0pTT04oXCIgKyBzZWxlY3Rpb25QYXRoICsgXCIpOjpqc29uXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblBhdGggPSBzZWxlY3Rpb25QYXRoICsgXCIuVG9TdHJpbmcoKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvblBhdGgsXG4gICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmFsaWFzTmFtZSA/IHNlbGVjdGlvbi5hbGlhc05hbWUgOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCBhbGlhc05hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpLFxuICAgICAgICAgICAgICAgIC8vIHRvZG86IG5lZWQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgY3VzdG9tIHNlbGVjdGlvbi5hbGlhc05hbWUgYnJlYWtzIGh5ZHJhdG9yLiBmaXggaXQgbGF0ZXIhXG4gICAgICAgICAgICAgICAgdmlydHVhbDogc2VsZWN0aW9uID8gc2VsZWN0aW9uLnZpcnR1YWwgPT09IHRydWUgOiAoaGFzTWFpbkFsaWFzID8gZmFsc2UgOiB0cnVlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5maW5kRW50aXR5Q29sdW1uU2VsZWN0cyA9IGZ1bmN0aW9uIChhbGlhc05hbWUsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBtYWluU2VsZWN0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWU7IH0pO1xuICAgICAgICBpZiAobWFpblNlbGVjdClcbiAgICAgICAgICAgIHJldHVybiBbbWFpblNlbGVjdF07XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHNlbGVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmNvbHVtbnMuc29tZShmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWUgKyBcIi5cIiArIGNvbHVtbi5wcm9wZXJ0eVBhdGg7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY29tcHV0ZUNvdW50RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZTsgLy8gdG9kbzogd2lsbCB0aGlzIHdvcmsgd2l0aCBcImZyb21UYWJsZU5hbWVcIj9cbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YTtcbiAgICAgICAgdmFyIHByaW1hcnlDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnM7XG4gICAgICAgIHZhciBkaXN0aW5jdEFsaWFzID0gdGhpcy5lc2NhcGUobWFpbkFsaWFzKTtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IGRvaW5nIGFueXRoaW5nIHRoYXQgd2lsbCBjcmVhdGUgYSBqb2luLCB3ZSBjYW4gdXNlIGEgc2ltcGxlciBgQ09VTlRgIGluc3RlYWRcbiAgICAgICAgLy8gc28gd2UgcHJldmVudCBwb29yIHF1ZXJ5IHBhdHRlcm5zIGluIHRoZSBtb3N0IGxpa2VseSBjYXNlc1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiQ09VTlQoMSlcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSdsbCBuZWVkIHRvIGRvIHNvbWUgaGFja2VyeSB0byBnZXQgdGhlIGNvcnJlY3QgY291bnQgdmFsdWVzLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVzIGFuZCBDb2Nrcm9hY2hEQiBjYW4gcGFzcyBtdWx0aXBsZSBwYXJhbWV0ZXJzIHRvIHRoZSBgRElTVElOQ1RgIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzkuNS9zcWwtc2VsZWN0Lmh0bWwjU1FMLURJU1RJTkNUXG4gICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVChcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBkaXN0aW5jdEFsaWFzICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgIFwiKSlcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBNeVNRTCAmIE1hcmlhREIgY2FuIHBhc3MgbXVsdGlwbGUgcGFyYW1ldGVycyB0byB0aGUgYERJU1RJTkNUYCBsYW5ndWFnZSBjb25zdHJ1Y3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbWFyaWFkYi5jb20va2IvZW4vY291bnQtZGlzdGluY3QvXG4gICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVCBcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBkaXN0aW5jdEFsaWFzICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpOyB9KS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAvLyBTUUwgU2VydmVyIGhhcyBnb3R0YSBiZSBkaWZmZXJlbnQgZnJvbSBldmVyeW9uZSBlbHNlLiAgVGhleSBkb24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBkaXN0aW5jdCBjb3VudGluZyBtdWx0aXBsZSBjb2x1bW5zICYgdGhleSBkb24ndCBoYXZlIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAgICAgICAgICAvLyBjaGFyYWN0ZXJpc3RpYyBmb3IgY29uY2F0ZW5hdGluZywgc28gd2UgZ290dGEgdXNlIHRoZSBgQ09OQ0FUYCBmdW5jdGlvbi5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIElmIGl0J3MgZXhhY3RseSAxIGNvbHVtbiB3ZSBjYW4gb21pdCB0aGUgYENPTkNBVGAgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICAgICAgICAgIHZhciBjb2x1bW5zRXhwcmVzc2lvbiA9IHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikgeyByZXR1cm4gZGlzdGluY3RBbGlhcyArIFwiLlwiICsgX3RoaXMuZXNjYXBlKHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKTsgfSkuam9pbihcIiwgJ3w7fCcsIFwiKTtcbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q29sdW1ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJDT1VOVChESVNUSU5DVChcIiArIGNvbHVtbnNFeHByZXNzaW9uICsgXCIpKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiQ09VTlQoRElTVElOQ1QoQ09OQ0FUKFwiICsgY29sdW1uc0V4cHJlc3Npb24gKyBcIikpKVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCBmYWxsIGJhY2sgdG8gYSBgQ09VTlRgIGFuZCBgRElTVElOQ1RgIGFjcm9zcyBhbGwgdGhlIHByaW1hcnkgY29sdW1ucyBjb25jYXRlbmF0ZWQuXG4gICAgICAgIC8vIFBlciB0aGUgU1FMIHNwZWMsIHRoaXMgaXMgdGhlIGNhbm9uaWNhbCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBtZWNoYW5pc20gd2hpY2ggaXMgbW9zdFxuICAgICAgICAvLyBsaWtlbHkgdG8gd29yayBhY3Jvc3Mgc2VydmVycyBpbXBsZW1lbnRpbmcgdGhlIFNRTCBzdGFuZGFyZC5cbiAgICAgICAgLy8gUGxlYXNlIG5vdGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHByaW1hcnkgY29sdW1uIHRoYXQgdGhlIGNvbmNhdGVuYXRpb24gZG9lcyBub3Qgb2NjdXIgaW4gdGhpc1xuICAgICAgICAvLyBxdWVyeSBhbmQgdGhlIHF1ZXJ5IGlzIGEgc3RhbmRhcmQgYENPVU5UIERJU1RJTkNUYCBpbiB0aGF0IGNhc2UuXG4gICAgICAgIHJldHVybiBcIkNPVU5UKERJU1RJTkNUKFwiICtcbiAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gZGlzdGluY3RBbGlhcyArIFwiLlwiICsgX3RoaXMuZXNjYXBlKGMuZGF0YWJhc2VOYW1lKTsgfSkuam9pbihcIiB8fCAnfDt8JyB8fCBcIikgK1xuICAgICAgICAgICAgXCIpKVwiO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlQ291bnRRdWVyeSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY291bnRTcWwsIHJlc3VsdHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudFNxbCA9IHRoaXMuY29tcHV0ZUNvdW50RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdyb3VwQnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXAodW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGFrZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoY291bnRTcWwsIFwiY250XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcHRpb24oXCJkaXNhYmxlLWdsb2JhbC1vcmRlclwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cyB8fCAhcmVzdWx0c1swXSB8fCAhcmVzdWx0c1swXVtcImNudFwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGFyc2VJbnQocmVzdWx0c1swXVtcImNudFwiXSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyBvYmplY3Qgd2l0aCByYXcgcmVzdWx0cyBhbmQgZW50aXRpZXMgY3JlYXRlZCBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlRW50aXRpZXNBbmRSYXdSZXN1bHRzID0gZnVuY3Rpb24gKHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSwgcmVsYXRpb25JZExvYWRlciwgcmVsYXRpb25Db3VudExvYWRlciwgcmVsYXRpb25JZE1ldGFkYXRhVHJhbnNmb3JtZXIsIHJlbGF0aW9uQ291bnRNZXRhZGF0YVRyYW5zZm9ybWVyLCByYXdSZXN1bHRzLCBlbnRpdGllcywgX2EsIHNlbGVjdHMsIG9yZGVyQnlzXzEsIG1ldGFkYXRhXzEsIG1haW5BbGlhc05hbWVfMSwgcXVlcnlTZWxlY3RzLCBjb25kaXRpb24sIHBhcmFtZXRlcnNfMSwgYWxpYXNfMSwgaWRzLCBhcmVBbGxOdW1iZXJzLCByYXdSZWxhdGlvbklkUmVzdWx0cywgcmF3UmVsYXRpb25Db3VudFJlc3VsdHMsIHRyYW5zZm9ybWVyO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQWxpYXMgaXMgbm90IHNldC4gVXNlIFxcXCJmcm9tXFxcIiBtZXRob2QgdG8gc2V0IGFuIGFsaWFzLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3JlYWRcIiB8fCB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVcIiB8fCB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwicGVzc2ltaXN0aWNfcGFydGlhbF93cml0ZVwiIHx8IHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgfHwgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcImZvcl9ub19rZXlfdXBkYXRlXCIpICYmICFxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGEudmVyc2lvbkNvbHVtbiAmJiAhbWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZExvYWRlciA9IG5ldyBSZWxhdGlvbklkTG9hZGVyKHRoaXMuY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIsIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkNvdW50TG9hZGVyID0gbmV3IFJlbGF0aW9uQ291bnRMb2FkZXIodGhpcy5jb25uZWN0aW9uLCBxdWVyeVJ1bm5lciwgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyID0gbmV3IFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIodGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIgPSBuZXcgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lcih0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIudHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHRzID0gW10sIGVudGl0aWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgodGhpcy5leHByZXNzaW9uTWFwLnNraXAgfHwgdGhpcy5leHByZXNzaW9uTWFwLnRha2UpICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmNyZWF0ZU9yZGVyQnlDb21iaW5lZFdpdGhTZWxlY3RFeHByZXNzaW9uKFwiZGlzdGluY3RBbGlhc1wiKSwgMiksIHNlbGVjdHMgPSBfYVswXSwgb3JkZXJCeXNfMSA9IF9hWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfMSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluQWxpYXNOYW1lXzEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVNlbGVjdHMgPSBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW5jdEFsaWFzID0gX3RoaXMuZXNjYXBlKFwiZGlzdGluY3RBbGlhc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uQWxpYXMgPSBfdGhpcy5lc2NhcGUoRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgbWFpbkFsaWFzTmFtZV8xLCBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JkZXJCeXNfMVtjb2x1bW5BbGlhc10pIC8vIG1ha2Ugc3VyZSB3ZSBhcmVuJ3Qgb3ZlcnJpZGluZyB1c2VyLWRlZmluZWQgb3JkZXIgaW4gaW52ZXJzZSBkaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJCeXNfMVtjb2x1bW5BbGlhc10gPSBcIkFTQ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIsIFwiaWRzX1wiICsgbWFpbkFsaWFzTmFtZV8xLCBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3RpbmN0QWxpYXMgKyBcIi5cIiArIGNvbHVtbkFsaWFzICsgXCIgYXMgXFxcIlwiICsgYWxpYXMgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcih0aGlzLmNvbm5lY3Rpb24sIHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KFwiRElTVElOQ1QgXCIgKyBxdWVyeVNlbGVjdHMuam9pbihcIiwgXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0KHNlbGVjdHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKFwiKFwiICsgdGhpcy5jbG9uZSgpLm9yZGVyQnkoKS5nZXRRdWVyeSgpICsgXCIpXCIsIFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KHRoaXMuZXhwcmVzc2lvbk1hcC5za2lwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGltaXQodGhpcy5leHByZXNzaW9uTWFwLnRha2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlckJ5KG9yZGVyQnlzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoZSh0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgPyB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCwgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmF0aXZlUGFyYW1ldGVycyh0aGlzLmV4cHJlc3Npb25NYXAubmF0aXZlUGFyYW1ldGVycylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1Jlc3VsdHMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyYXdSZXN1bHRzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YV8xLmhhc011bHRpcGxlUHJpbWFyeUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSByYXdSZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFfMS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbUtleSA9IFwib3JtX2Rpc3RpbmN0X2lkc19cIiArIGluZGV4ICsgXCJfXCIgKyBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtwYXJhbUtleV0gPSByZXN1bHRbXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lXzEgKyBcIl9cIiArIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWluQWxpYXNOYW1lXzEgKyBcIi5cIiArIHByaW1hcnlDb2x1bW4ucHJvcGVydHlQYXRoICsgXCI9OlwiICsgcGFyYW1LZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzXzEgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsIFwiaWRzX1wiICsgbWFpbkFsaWFzTmFtZV8xLCBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzID0gcmF3UmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W2FsaWFzXzFdOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVBbGxOdW1iZXJzID0gaWRzLmV2ZXJ5KGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gdHlwZW9mIGlkID09PSBcIm51bWJlclwiOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlQWxsTnVtYmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlcyAjMTkwLiBpZiBhbGwgbnVtYmVycyB0aGVuIGl0cyBzYWZlIHRvIHBlcmZvcm0gcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gbWFpbkFsaWFzTmFtZV8xICsgXCIuXCIgKyBtZXRhZGF0YV8xLnByaW1hcnlDb2x1bW5zWzBdLnByb3BlcnR5UGF0aCArIFwiIElOIChcIiArIGlkcy5qb2luKFwiLCBcIikgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMVtcIm9ybV9kaXN0aW5jdF9pZHNcIl0gPSBpZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IG1haW5BbGlhc05hbWVfMSArIFwiLlwiICsgbWV0YWRhdGFfMS5wcmltYXJ5Q29sdW1uc1swXS5wcm9wZXJ0eVBhdGggKyBcIiBJTiAoOi4uLm9ybV9kaXN0aW5jdF9pZHMpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXJnZUV4cHJlc3Npb25NYXAoeyBleHRyYUFwcGVuZGVkQW5kV2hlcmVDb25kaXRpb246IGNvbmRpdGlvbiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHRzID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3UmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmF3UmVzdWx0cy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVsYXRpb25JZExvYWRlci5sb2FkKHJhd1Jlc3VsdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3UmVsYXRpb25JZFJlc3VsdHMgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZWxhdGlvbkNvdW50TG9hZGVyLmxvYWQocmF3UmVzdWx0cyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdSZWxhdGlvbkNvdW50UmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gbmV3IFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyKHRoaXMuZXhwcmVzc2lvbk1hcCwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgcmF3UmVsYXRpb25JZFJlc3VsdHMsIHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzLCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKHJhd1Jlc3VsdHMsIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkxvYWRcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSwgZW50aXRpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXM6IGVudGl0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVPcmRlckJ5Q29tYmluZWRXaXRoU2VsZWN0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChwYXJlbnRBbGlhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBpZiB0YWJsZSBoYXMgYSBkZWZhdWx0IG9yZGVyIHRoZW4gYXBwbHkgaXRcbiAgICAgICAgdmFyIG9yZGVyQnlzID0gdGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzO1xuICAgICAgICB2YXIgc2VsZWN0U3RyaW5nID0gT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChvcmRlckNyaXRlcmlhKSB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3JpdGVyaWFQYXJ0cyA9IG9yZGVyQ3JpdGVyaWEuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IF90aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKGFsaWFzTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIF90aGlzLmVzY2FwZShEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCBhbGlhc05hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChmdW5jdGlvbiAoc2VsZWN0KSB7IHJldHVybiBzZWxlY3Quc2VsZWN0aW9uID09PSBvcmRlckNyaXRlcmlhIHx8IHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWE7IH0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArIFwiLlwiICsgb3JkZXJDcml0ZXJpYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHZhciBvcmRlckJ5T2JqZWN0ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKG9yZGVyQnlzKS5mb3JFYWNoKGZ1bmN0aW9uIChvcmRlckNyaXRlcmlhKSB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3JpdGVyaWFQYXJ0cyA9IG9yZGVyQ3JpdGVyaWEuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgICAgIHZhciBhbGlhcyA9IF90aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKGFsaWFzTmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGFsaWFzLm1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG4gICAgICAgICAgICAgICAgb3JkZXJCeU9iamVjdFtfdGhpcy5lc2NhcGUocGFyZW50QWxpYXMpICsgXCIuXCIgKyBfdGhpcy5lc2NhcGUoRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgYWxpYXNOYW1lLCBjb2x1bW4uZGF0YWJhc2VOYW1lKSldID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbmQoZnVuY3Rpb24gKHNlbGVjdCkgeyByZXR1cm4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gb3JkZXJDcml0ZXJpYSB8fCBzZWxlY3QuYWxpYXNOYW1lID09PSBvcmRlckNyaXRlcmlhOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W190aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIG9yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W29yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RTdHJpbmcsIG9yZGVyQnlPYmplY3RdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgcmF3IHJlc3VsdHMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5sb2FkUmF3UmVzdWx0cyA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNxbCwgcGFyYW1ldGVycywgcXVlcnlJZCwgY2FjaGVPcHRpb25zLCBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLCBjYWNoZUVycm9yLCBlcnJvcl82LCByZXN1bHRzLCBlcnJvcl83O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3JlYWQodGhpcy5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHNxbCA9IF9hWzBdLCBwYXJhbWV0ZXJzID0gX2FbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUlkID0gc3FsICsgXCIgLS0gUEFSQU1FVEVSUzogXCIgKyBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlT3B0aW9ucyA9IHR5cGVvZiB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZSA9PT0gXCJvYmplY3RcIiA/IHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLmNhY2hlIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUgJiYgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZCkpKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLmdldEZyb21DYWNoZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uIHx8IGNhY2hlT3B0aW9ucy5kdXJhdGlvbiB8fCAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRRdWVyeVJlc3VsdENhY2hlT3B0aW9ucyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zICYmICF0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5pc0V4cGlyZWQoc2F2ZWRRdWVyeVJlc3VsdENhY2hlT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgSlNPTi5wYXJzZShzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLnJlc3VsdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzYgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl82O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5xdWVyeShzcWwsIHBhcmFtZXRlcnMsIHRydWUpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCFjYWNoZUVycm9yICYmIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlICYmICh0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgfHwgY2FjaGVPcHRpb25zLmFsd2F5c0VuYWJsZWQpKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDY7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbNiwgOCwgLCA5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5zdG9yZUluQ2FjaGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24gfHwgY2FjaGVPcHRpb25zLmR1cmF0aW9uIHx8IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogSlNPTi5zdHJpbmdpZnkocmVzdWx0cy5yZWNvcmRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMsIHF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl83ID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZU9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JfNztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6IHJldHVybiBbMiAvKnJldHVybiovLCByZXN1bHRzLnJlY29yZHNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lcmdlcyBpbnRvIGV4cHJlc3Npb24gbWFwIGdpdmVuIGV4cHJlc3Npb24gbWFwIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5tZXJnZUV4cHJlc3Npb25NYXAgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICBPYmplY3RVdGlscy5hc3NpZ24odGhpcy5leHByZXNzaW9uTWFwLCBleHByZXNzaW9uTWFwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgZ2l2ZSBudW1iZXIgLSBjb252ZXJ0cyB0byBpbnQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgU2VsZWN0UXVlcnlCdWlsZGVyLnByb3RvdHlwZS5ub3JtYWxpemVOdW1iZXIgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiIHx8IG51bSA9PT0gdW5kZWZpbmVkIHx8IG51bSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgIHJldHVybiBOdW1iZXIobnVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZXhlY3V0ZSBzcWwgcXVlcmllcyBpbnNpZGUgdGhpcyBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNlbGVjdFF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub2J0YWluUXVlcnlSdW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5UnVubmVyIHx8IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeVJ1bm5lcihcInNsYXZlXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdFF1ZXJ5QnVpbGRlcjtcbn0oUXVlcnlCdWlsZGVyKSk7XG5leHBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0UXVlcnlCdWlsZGVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yLCBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENvY2tyb2FjaERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvY29ja3JvYWNoZGIvQ29ja3JvYWNoRHJpdmVyXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWVyeUJ1aWxkZXJcIjtcbmltcG9ydCB7IFNxbFNlcnZlckRyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3Fsc2VydmVyL1NxbFNlcnZlckRyaXZlclwiO1xuaW1wb3J0IHsgUG9zdGdyZXNEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3Bvc3RncmVzL1Bvc3RncmVzRHJpdmVyXCI7XG5pbXBvcnQgeyBVcGRhdGVSZXN1bHQgfSBmcm9tIFwiLi9yZXN1bHQvVXBkYXRlUmVzdWx0XCI7XG5pbXBvcnQgeyBSZXR1cm5pbmdTdGF0ZW1lbnROb3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvci9SZXR1cm5pbmdTdGF0ZW1lbnROb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IgfSBmcm9tIFwiLi9SZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBMaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yXCI7XG5pbXBvcnQgeyBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL01pc3NpbmdEZWxldGVEYXRlQ29sdW1uRXJyb3JcIjtcbmltcG9ydCB7IE9yYWNsZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvb3JhY2xlL09yYWNsZURyaXZlclwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yL1VwZGF0ZVZhbHVlc01pc3NpbmdFcnJvclwiO1xuaW1wb3J0IHsgRW50aXR5U2NoZW1hIH0gZnJvbSBcIi4uL2VudGl0eS1zY2hlbWEvRW50aXR5U2NoZW1hXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG52YXIgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU29mdERlbGV0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gU29mdERlbGV0ZVF1ZXJ5QnVpbGRlcihjb25uZWN0aW9uT3JRdWVyeUJ1aWxkZXIsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmV4cHJlc3Npb25NYXAuYWxpYXNOYW1lUHJlZml4aW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgSW1wbGVtZW50ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBzcWwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFF1ZXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3FsID0gdGhpcy5jcmVhdGVVcGRhdGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4gc3FsLnRyaW0oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlSdW5uZXIsIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMsIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yLCBfYSwgc3FsLCBwYXJhbWV0ZXJzLCBxdWVyeVJlc3VsdCwgdXBkYXRlUmVzdWx0LCBlcnJvcl8xLCByb2xsYmFja0Vycm9yXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAxMywgMTgsIDIxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiYgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2UpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJCZWZvcmVVcGRhdGVcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yID0gbmV3IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yKHF1ZXJ5UnVubmVyLCB0aGlzLmV4cHJlc3Npb25NYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5leHRyYVJldHVybmluZ0NvbHVtbnMgPSByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci5nZXRTb2Z0RGVsZXRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgc3FsID0gX2FbMF0sIHBhcmFtZXRlcnMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnF1ZXJ5KHNxbCwgcGFyYW1ldGVycywgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdCA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdCA9IFVwZGF0ZVJlc3VsdC5mcm9tKHF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IudXBkYXRlKHVwZGF0ZVJlc3VsdCwgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSA4O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmV4cHJlc3Npb25NYXAuY2FsbExpc3RlbmVycyA9PT0gdHJ1ZSAmJiB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KFwiQWZ0ZXJVcGRhdGVcIiwgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IHJldHVybiBbMiAvKnJldHVybiovLCB1cGRhdGVSZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb25TdGFydGVkQnlVcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMTQsIDE2LCAsIDE3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sbGJhY2tFcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OiB0aHJvdyBlcnJvcl8xO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5yZWxlYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAyMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDogcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZS9zb2Z0LWRlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5mcm9tID0gZnVuY3Rpb24gKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKSB7XG4gICAgICAgIGVudGl0eVRhcmdldCA9IGVudGl0eVRhcmdldCBpbnN0YW5jZW9mIEVudGl0eVNjaGVtYSA/IGVudGl0eVRhcmdldC5vcHRpb25zLm5hbWUgOiBlbnRpdHlUYXJnZXQ7XG4gICAgICAgIHZhciBtYWluQWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZXRNYWluQWxpYXMobWFpbkFsaWFzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgV0hFUkUgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IFdIRVJFIGNvbmRpdGlvbnMuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTsgLy8gZG9uJ3QgbW92ZSB0aGlzIGJsb2NrIGJlbG93IHNpbmNlIGNvbXB1dGVXaGVyZVBhcmFtZXRlciBjYW4gYWRkIHdoZXJlIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciBjb25kaXRpb24gPSB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKTtcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9XTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vcldoZXJlID0gZnVuY3Rpb24gKHdoZXJlLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMucHVzaCh7IHR5cGU6IFwib3JcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUluSWRzID0gZnVuY3Rpb24gKGlkcykge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFuZFdoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZFdoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5vcldoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yV2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcmV0dXJuaW5nL291dHB1dCBjbGF1c2UuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5pbmcob3V0cHV0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHJldHVybmluZy9vdXRwdXQgY2xhdXNlLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJldHVybmluZyA9IGZ1bmN0aW9uIChyZXR1cm5pbmcpIHtcbiAgICAgICAgLy8gbm90IGFsbCBkYXRhYmFzZXMgc3VwcG9ydCByZXR1cm5pbmcvb3V0cHV0IGNhdXNlXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPSByZXR1cm5pbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yZGVyQnkgPSBmdW5jdGlvbiAoc29ydCwgb3JkZXIsIG51bGxzKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChvcmRlciA9PT0gdm9pZCAwKSB7IG9yZGVyID0gXCJBU0NcIjsgfVxuICAgICAgICBpZiAoc29ydCkge1xuICAgICAgICAgICAgaWYgKHNvcnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSBzb3J0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IChfYSA9IHt9LCBfYVtzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfSwgX2EpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9iID0ge30sIF9iW3NvcnRdID0gb3JkZXIsIF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFkZE9yZGVyQnkgPSBmdW5jdGlvbiAoc29ydCwgb3JkZXIsIG51bGxzKSB7XG4gICAgICAgIGlmIChvcmRlciA9PT0gdm9pZCAwKSB7IG9yZGVyID0gXCJBU0NcIjsgfVxuICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IHsgb3JkZXI6IG9yZGVyLCBudWxsczogbnVsbHMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5c1tzb3J0XSA9IG9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBMSU1JVCAtIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbiAobGltaXQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZUVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIi53aGVyZUVudGl0eSBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCBvbiBxdWVyaWVzIHdoaWNoIHVwZGF0ZSByZWFsIGVudGl0eSB0YWJsZS5cIik7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXTtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gQXJyYXkuaXNBcnJheShlbnRpdHkpID8gZW50aXR5IDogW2VudGl0eV07XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGVudGl0eUlkTWFwID0gX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghZW50aXR5SWRNYXApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlByb3ZpZGVkIGVudGl0eSBkb2VzIG5vdCBoYXZlIGlkcyBzZXQsIGNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbi5cIik7XG4gICAgICAgICAgICBfdGhpcy5vcldoZXJlSW5JZHMoZW50aXR5SWRNYXApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlRW50aXRpZXMgPSBlbnRpdGllcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgZW50aXR5IG11c3QgYmUgdXBkYXRlZCBhZnRlciB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqIFRoaXMgbWF5IHByb2R1Y2UgZXh0cmEgcXVlcnkgb3IgdXNlIFJFVFVSTklORyAvIE9VVFBVVCBzdGF0ZW1lbnQgKGRlcGVuZCBvbiBkYXRhYmFzZSkuXG4gICAgICogRW5hYmxlZCBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnVwZGF0ZUVudGl0eSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC51cGRhdGVFbnRpdHkgPSBlbmFibGVkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFVQREFURSBleHByZXNzIHVzZWQgdG8gcGVyZm9ybSBpbnNlcnQgcXVlcnkuXG4gICAgICovXG4gICAgU29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbWV0YWRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiQ2Fubm90IGdldCBlbnRpdHkgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBhbGlhcyBcXFwiXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzICsgXCJcXFwiXCIpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGVsZXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVwYXJlIGNvbHVtbnMgYW5kIHZhbHVlcyB0byBiZSB1cGRhdGVkXG4gICAgICAgIHZhciB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMgPSBbXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic29mdC1kZWxldGVcIjpcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IENVUlJFTlRfVElNRVNUQU1QXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlc3RvcmVcIjpcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IE5VTExcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJUaGUgcXVlcnlUeXBlIG11c3QgYmUgXFxcInNvZnQtZGVsZXRlXFxcIiBvciBcXFwicmVzdG9yZVxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnZlcnNpb25Db2x1bW4pXG4gICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS52ZXJzaW9uQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IFwiICsgdGhpcy5lc2NhcGUobWV0YWRhdGEudmVyc2lvbkNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgKyAxXCIpO1xuICAgICAgICBpZiAobWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbilcbiAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKHRoaXMuZXNjYXBlKG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiID0gQ1VSUkVOVF9USU1FU1RBTVBcIik7IC8vIHRvZG86IGZpeCBpc3N1ZSB3aXRoIENVUlJFTlRfVElNRVNUQU1QKDYpIGJlaW5nIHVzZWQsIGNhbiBcIkRFRkFVTFRcIiBiZSB1c2VkPyFcbiAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhIHRhYmxlIG5hbWUgYW5kIGFsbCBjb2x1bW4gZGF0YWJhc2UgbmFtZXNcbiAgICAgICAgdmFyIHdoZXJlRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVSZXR1cm5pbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGFuZCByZXR1cm4gc3FsIHVwZGF0ZSBxdWVyeVxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlVQREFURSBcIiArIHRoaXMuZ2V0VGFibGVOYW1lKHRoaXMuZ2V0TWFpblRhYmxlTmFtZSgpKSArIFwiIFNFVCBcIiArIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5qb2luKFwiLCBcIikgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiVVBEQVRFIFwiICsgdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIgU0VUIFwiICsgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLmpvaW4oXCIsIFwiKSArIFwiIE9VVFBVVCBcIiArIHJldHVybmluZ0V4cHJlc3Npb24gKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJVUERBVEUgXCIgKyB0aGlzLmdldFRhYmxlTmFtZSh0aGlzLmdldE1haW5UYWJsZU5hbWUoKSkgKyBcIiBTRVQgXCIgKyB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMuam9pbihcIiwgXCIpICsgd2hlcmVFeHByZXNzaW9uOyAvLyB0b2RvOiBob3cgZG8gd2UgcmVwbGFjZSBhbGlhc2VzIGluIHdoZXJlIHRvIG5vdGhpbmc/XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXM7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmRlckJ5cykubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBcIiBPUkRFUiBCWSBcIiArIE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yZGVyQnlzW2NvbHVtbk5hbWVdID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoY29sdW1uTmFtZSkgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm9yZGVyICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXS5udWxscztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkxJTUlUXCIgcGFydHMgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFNvZnREZWxldGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0O1xuICAgICAgICBpZiAobGltaXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaW1pdE9uVXBkYXRlTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9O1xuICAgIHJldHVybiBTb2Z0RGVsZXRlUXVlcnlCdWlsZGVyO1xufShRdWVyeUJ1aWxkZXIpKTtcbmV4cG9ydCB7IFNvZnREZWxldGVRdWVyeUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U29mdERlbGV0ZVF1ZXJ5QnVpbGRlci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19leHRlbmRzLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5LCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFNhcERyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc2FwL1NhcERyaXZlclwiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBTcWxTZXJ2ZXJEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL3NxbHNlcnZlci9TcWxTZXJ2ZXJEcml2ZXJcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgVXBkYXRlUmVzdWx0IH0gZnJvbSBcIi4vcmVzdWx0L1VwZGF0ZVJlc3VsdFwiO1xuaW1wb3J0IHsgUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUmV0dXJuaW5nU3RhdGVtZW50Tm90U3VwcG9ydGVkRXJyb3JcIjtcbmltcG9ydCB7IFJldHVybmluZ1Jlc3VsdHNFbnRpdHlVcGRhdG9yIH0gZnJvbSBcIi4vUmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3JcIjtcbmltcG9ydCB7IE15c3FsRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9teXNxbC9NeXNxbERyaXZlclwiO1xuaW1wb3J0IHsgTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0xpbWl0T25VcGRhdGVOb3RTdXBwb3J0ZWRFcnJvclwiO1xuaW1wb3J0IHsgT3JhY2xlRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9vcmFjbGUvT3JhY2xlRHJpdmVyXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWx1ZXNNaXNzaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yXCI7XG5pbXBvcnQgeyBFbnRpdHlDb2x1bW5Ob3RGb3VuZCB9IGZyb20gXCIuLi9lcnJvci9FbnRpdHlDb2x1bW5Ob3RGb3VuZFwiO1xuaW1wb3J0IHsgQXVyb3JhRGF0YUFwaURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvYXVyb3JhLWRhdGEtYXBpL0F1cm9yYURhdGFBcGlEcml2ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuLyoqXG4gKiBBbGxvd3MgdG8gYnVpbGQgY29tcGxleCBzcWwgcXVlcmllcyBpbiBhIGZhc2hpb24gd2F5IGFuZCBleGVjdXRlIHRob3NlIHF1ZXJpZXMuXG4gKi9cbnZhciBVcGRhdGVRdWVyeUJ1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVwZGF0ZVF1ZXJ5QnVpbGRlciwgX3N1cGVyKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVXBkYXRlUXVlcnlCdWlsZGVyKGNvbm5lY3Rpb25PclF1ZXJ5QnVpbGRlciwgcXVlcnlSdW5uZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29ubmVjdGlvbk9yUXVlcnlCdWlsZGVyLCBxdWVyeVJ1bm5lcikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc05hbWVQcmVmaXhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBJbXBsZW1lbnRlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgZ2VuZXJhdGVkIHNxbCBxdWVyeSB3aXRob3V0IHBhcmFtZXRlcnMgYmVpbmcgcmVwbGFjZWQuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5nZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNxbCA9IHRoaXMuY3JlYXRlQ29tbWVudCgpO1xuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVVcGRhdGVFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZU9yZGVyQnlFeHByZXNzaW9uKCk7XG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUxpbWl0RXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4gc3FsLnRyaW0oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeVJ1bm5lciwgdHJhbnNhY3Rpb25TdGFydGVkQnlVcywgZGVjbGFyZVNxbCwgc2VsZWN0T3V0cHV0U3FsLCByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciwgcmV0dXJuaW5nQ29sdW1uc18xLCBfYSwgX2IsIGNvbHVtblBhdGgsIF9jLCB1cGRhdGVTcWwsIHBhcmFtZXRlcnMsIHN0YXRlbWVudHMsIHF1ZXJ5UmVzdWx0LCB1cGRhdGVSZXN1bHQsIGVycm9yXzEsIHJvbGxiYWNrRXJyb3JfMTtcbiAgICAgICAgICAgIHZhciBlXzEsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMSwgMTMsIDE4LCAyMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmIHF1ZXJ5UnVubmVyLmlzVHJhbnNhY3Rpb25BY3RpdmUgPT09IGZhbHNlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIuYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KFwiQmVmb3JlVXBkYXRlXCIsIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEsIHRoaXMuZXhwcmVzc2lvbk1hcC52YWx1ZXNTZXQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlU3FsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE91dHB1dFNxbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvciA9IG5ldyBSZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvcihxdWVyeVJ1bm5lciwgdGhpcy5leHByZXNzaW9uTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZ0NvbHVtbnNfMSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5leHByZXNzaW9uTWFwLnJldHVybmluZykgJiYgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLmV4cHJlc3Npb25NYXAucmV0dXJuaW5nKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uUGF0aCA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xLnB1c2guYXBwbHkocmV0dXJuaW5nQ29sdW1uc18xLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5maW5kQ29sdW1uc1dpdGhQcm9wZXJ0eVBhdGgoY29sdW1uUGF0aCkpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9kID0gX2EucmV0dXJuKSkgX2QuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAudXBkYXRlRW50aXR5ID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZUVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuZXh0cmFSZXR1cm5pbmdDb2x1bW5zID0gcmV0dXJuaW5nUmVzdWx0c0VudGl0eVVwZGF0b3IuZ2V0VXBkYXRpb25SZXR1cm5pbmdDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nQ29sdW1uc18xLnB1c2guYXBwbHkocmV0dXJuaW5nQ29sdW1uc18xLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5leHByZXNzaW9uTWFwLmV4dHJhUmV0dXJuaW5nQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGMpIHsgcmV0dXJuICFyZXR1cm5pbmdDb2x1bW5zXzEuaW5jbHVkZXMoYyk7IH0pKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5pbmdDb2x1bW5zXzEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZVNxbCA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuYnVpbGRUYWJsZVZhcmlhYmxlRGVjbGFyYXRpb24oXCJAT3V0cHV0VGFibGVcIiwgcmV0dXJuaW5nQ29sdW1uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RPdXRwdXRTcWwgPSBcIlNFTEVDVCAqIEZST00gQE91dHB1dFRhYmxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYyA9IF9fcmVhZCh0aGlzLmdldFF1ZXJ5QW5kUGFyYW1ldGVycygpLCAyKSwgdXBkYXRlU3FsID0gX2NbMF0sIHBhcmFtZXRlcnMgPSBfY1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMgPSBbZGVjbGFyZVNxbCwgdXBkYXRlU3FsLCBzZWxlY3RPdXRwdXRTcWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcXVlcnlSdW5uZXIucXVlcnkoc3RhdGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHNxbCkgeyByZXR1cm4gc3FsICE9IG51bGw7IH0pLmpvaW4oXCI7XFxuXFxuXCIpLCBwYXJhbWV0ZXJzLCB0cnVlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0ID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0ID0gVXBkYXRlUmVzdWx0LmZyb20ocXVlcnlSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5leHByZXNzaW9uTWFwLnVwZGF0ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcy5sZW5ndGggPiAwKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXR1cm5pbmdSZXN1bHRzRW50aXR5VXBkYXRvci51cGRhdGUodXBkYXRlUmVzdWx0LCB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWxsTGlzdGVuZXJzID09PSB0cnVlICYmIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpKSByZXR1cm4gWzMgLypicmVhayovLCAxMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJBZnRlclVwZGF0ZVwiLCB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLCB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHVwZGF0ZVJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxNCwgMTYsICwgMTddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHF1ZXJ5UnVubmVyLnJlbGVhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDIwO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOiByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFZhbHVlcyBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0ID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBXSEVSRSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgV0hFUkUgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS53aGVyZSA9IGZ1bmN0aW9uICh3aGVyZSwgcGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW107IC8vIGRvbid0IG1vdmUgdGhpcyBibG9jayBiZWxvdyBzaW5jZSBjb21wdXRlV2hlcmVQYXJhbWV0ZXIgY2FuIGFkZCB3aGVyZSBleHByZXNzaW9uc1xuICAgICAgICB2YXIgY29uZGl0aW9uID0gdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSk7XG4gICAgICAgIGlmIChjb25kaXRpb24pXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVzID0gW3sgdHlwZTogXCJzaW1wbGVcIiwgY29uZGl0aW9uOiBjb25kaXRpb24gfV07XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IEFORCBXSEVSRSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuYW5kV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSB9KTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgT1IgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIEFkZGl0aW9uYWxseSB5b3UgY2FuIGFkZCBwYXJhbWV0ZXJzIHVzZWQgaW4gd2hlcmUgZXhwcmVzc2lvbi5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yV2hlcmUgPSBmdW5jdGlvbiAod2hlcmUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IHRoaXMuZ2V0V2hlcmVDb25kaXRpb24od2hlcmUpIH0pO1xuICAgICAgICBpZiAocGFyYW1ldGVycylcbiAgICAgICAgICAgIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUud2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2hlcmUodGhpcy5nZXRXaGVyZUluSWRzQ29uZGl0aW9uKGlkcykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmFuZFdoZXJlSW5JZHMgPSBmdW5jdGlvbiAoaWRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZFdoZXJlKHRoaXMuZ2V0V2hlcmVJbklkc0NvbmRpdGlvbihpZHMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIHdpdGggY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGlkcy5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm9yV2hlcmVJbklkcyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXR1cm5pbmcvb3V0cHV0IGNsYXVzZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLm91dHB1dCA9IGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuaW5nKG91dHB1dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXR1cm5pbmcvb3V0cHV0IGNsYXVzZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLnJldHVybmluZyA9IGZ1bmN0aW9uIChyZXR1cm5pbmcpIHtcbiAgICAgICAgLy8gbm90IGFsbCBkYXRhYmFzZXMgc3VwcG9ydCByZXR1cm5pbmcvb3V0cHV0IGNhdXNlXG4gICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLmRyaXZlci5pc1JldHVybmluZ1NxbFN1cHBvcnRlZCgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJldHVybmluZ1N0YXRlbWVudE5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZXR1cm5pbmcgPSByZXR1cm5pbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IE9SREVSIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBPUkRFUiBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUub3JkZXJCeSA9IGZ1bmN0aW9uIChzb3J0LCBvcmRlciwgbnVsbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsgb3JkZXIgPSBcIkFTQ1wiOyB9XG4gICAgICAgIGlmIChzb3J0KSB7XG4gICAgICAgICAgICBpZiAoc29ydCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHNvcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0gKF9hID0ge30sIF9hW3NvcnRdID0geyBvcmRlcjogb3JkZXIsIG51bGxzOiBudWxscyB9LCBfYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXMgPSAoX2IgPSB7fSwgX2Jbc29ydF0gPSBvcmRlciwgX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBPUkRFUiBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5hZGRPcmRlckJ5ID0gZnVuY3Rpb24gKHNvcnQsIG9yZGVyLCBudWxscykge1xuICAgICAgICBpZiAob3JkZXIgPT09IHZvaWQgMCkgeyBvcmRlciA9IFwiQVNDXCI7IH1cbiAgICAgICAgaWYgKG51bGxzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXNbc29ydF0gPSB7IG9yZGVyOiBvcmRlciwgbnVsbHM6IG51bGxzIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3JkZXJCeXNbc29ydF0gPSBvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgTElNSVQgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbiAobGltaXQpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gbGltaXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGVudGl0eSBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBUaGlzIG1heSBwcm9kdWNlIGV4dHJhIHF1ZXJ5IG9yIHVzZSBSRVRVUk5JTkcgLyBPVVRQVVQgc3RhdGVtZW50IChkZXBlbmQgb24gZGF0YWJhc2UpLlxuICAgICAqIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLndoZXJlRW50aXR5ID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMuaGFzTWV0YWRhdGEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiLndoZXJlRW50aXR5IG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIG9uIHF1ZXJpZXMgd2hpY2ggdXBkYXRlIHJlYWwgZW50aXR5IHRhYmxlLlwiKTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcyA9IFtdO1xuICAgICAgICB2YXIgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KGVudGl0eSkgPyBlbnRpdHkgOiBbZW50aXR5XTtcbiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5SWRNYXAgPSBfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKCFlbnRpdHlJZE1hcClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUHJvdmlkZWQgZW50aXR5IGRvZXMgbm90IGhhdmUgaWRzIHNldCwgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uLlwiKTtcbiAgICAgICAgICAgIF90aGlzLm9yV2hlcmVJbklkcyhlbnRpdHlJZE1hcCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2hlcmVFbnRpdGllcyA9IGVudGl0aWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBlbnRpdHkgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIHVwZGF0ZSBvcGVyYXRpb24uXG4gICAgICogVGhpcyBtYXkgcHJvZHVjZSBleHRyYSBxdWVyeSBvciB1c2UgUkVUVVJOSU5HIC8gT1VUUFVUIHN0YXRlbWVudCAoZGVwZW5kIG9uIGRhdGFiYXNlKS5cbiAgICAgKiBFbmFibGVkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVFbnRpdHkgPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXBkYXRlRW50aXR5ID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBVUERBVEUgZXhwcmVzcyB1c2VkIHRvIHBlcmZvcm0gaW5zZXJ0IHF1ZXJ5LlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHZhbHVlc1NldCA9IHRoaXMuZ2V0VmFsdWVTZXQoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSA/IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubWV0YWRhdGEgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHByZXBhcmUgY29sdW1ucyBhbmQgdmFsdWVzIHRvIGJlIHVwZGF0ZWRcbiAgICAgICAgdmFyIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcyA9IFtdO1xuICAgICAgICB2YXIgdXBkYXRlZENvbHVtbnMgPSBbXTtcbiAgICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnR5UGF0aChtZXRhZGF0YSwgdmFsdWVzU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyB0b2RvOiBtYWtlIHRoaXMgYW5kIG90aGVyIHF1ZXJ5IGJ1aWxkZXIgdG8gd29yayB3aXRoIHByb3Blcmx5IHdpdGggdGFibGVzIHdpdGhvdXQgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1ucyA9IG1ldGFkYXRhLmZpbmRDb2x1bW5zV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb2x1bW5Ob3RGb3VuZChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtbi5pc1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sdW1uLmdldEVudGl0eVZhbHVlKHZhbHVlc1NldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlUGVyc2lzdGVudFZhbHVlKHZhbHVlLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGR1cGxpY2F0aW9uIHpvbmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsgLy8gc3VwcG9ydCBmb3IgU1FMIGV4cHJlc3Npb25zIGluIHVwZGF0ZSBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSBcIiArIHZhbHVlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaChfdGhpcy5lc2NhcGUoY29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IE5VTExcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBTcWxTZXJ2ZXJEcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcmFtZXRyaXplVmFsdWUoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1OYW1lID0gX3RoaXMuY3JlYXRlUGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTGVnYWN5ID0gX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy5sZWdhY3lTcGF0aWFsU3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VvbUZyb21UZXh0ID0gdXNlTGVnYWN5ID8gXCJHZW9tRnJvbVRleHRcIiA6IFwiU1RfR2VvbUZyb21UZXh0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zcmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IGdlb21Gcm9tVGV4dCArIFwiKFwiICsgcGFyYW1OYW1lICsgXCIsIFwiICsgY29sdW1uLnNyaWQgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBnZW9tRnJvbVRleHQgKyBcIihcIiArIHBhcmFtTmFtZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIgJiYgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uc3JpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBcIlNUX1NldFNSSUQoU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpLCBcIiArIGNvbHVtbi5zcmlkICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IFwiU1RfR2VvbUZyb21HZW9KU09OKFwiICsgcGFyYW1OYW1lICsgXCIpOjpcIiArIGNvbHVtbi50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU3FsU2VydmVyRHJpdmVyICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNwYXRpYWxUeXBlcy5pbmRleE9mKGNvbHVtbi50eXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gY29sdW1uLnR5cGUgKyBcIjo6U1RHZW9tRnJvbVRleHQoXCIgKyBwYXJhbU5hbWUgKyBcIiwgXCIgKyAoY29sdW1uLnNyaWQgfHwgXCIwXCIpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpICsgXCIgPSBcIiArIGV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS52ZXJzaW9uQ29sdW1uICYmIHVwZGF0ZWRDb2x1bW5zLmluZGV4T2YobWV0YWRhdGEudmVyc2lvbkNvbHVtbikgPT09IC0xKVxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKHRoaXMuZXNjYXBlKG1ldGFkYXRhLnZlcnNpb25Db2x1bW4uZGF0YWJhc2VOYW1lKSArIFwiID0gXCIgKyB0aGlzLmVzY2FwZShtZXRhZGF0YS52ZXJzaW9uQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiArIDFcIik7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEudXBkYXRlRGF0ZUNvbHVtbiAmJiB1cGRhdGVkQ29sdW1ucy5pbmRleE9mKG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4pID09PSAtMSlcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMucHVzaCh0aGlzLmVzY2FwZShtZXRhZGF0YS51cGRhdGVEYXRlQ29sdW1uLmRhdGFiYXNlTmFtZSkgKyBcIiA9IENVUlJFTlRfVElNRVNUQU1QXCIpOyAvLyB0b2RvOiBmaXggaXNzdWUgd2l0aCBDVVJSRU5UX1RJTUVTVEFNUCg2KSBiZWluZyB1c2VkLCBjYW4gXCJERUZBVUxUXCIgYmUgdXNlZD8hXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXNTZXQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzU2V0W2tleV07XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogZHVwbGljYXRpb24gem9uZVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7IC8vIHN1cHBvcnQgZm9yIFNRTCBleHByZXNzaW9ucyBpbiB1cGRhdGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLnB1c2goX3RoaXMuZXNjYXBlKGtleSkgKyBcIiA9IFwiICsgdmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgU2FwRHJpdmVyICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKF90aGlzLmVzY2FwZShrZXkpICsgXCIgPSBOVUxMXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBzdG9yZSBhcnJheSB2YWx1ZXMgaW4gYSBzcGVjaWFsIGNsYXNzIHRvIG1ha2Ugc3VyZSBwYXJhbWV0ZXIgcmVwbGFjZW1lbnQgd2lsbCB3b3JrIGNvcnJlY3RseVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhbHVlID0gbmV3IEFycmF5UGFyYW1ldGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtTmFtZSA9IF90aGlzLmNyZWF0ZVBhcmFtZXRlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5wdXNoKF90aGlzLmVzY2FwZShrZXkpICsgXCIgPSBcIiArIHBhcmFtTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVwZGF0ZVZhbHVlc01pc3NpbmdFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdldCBhIHRhYmxlIG5hbWUgYW5kIGFsbCBjb2x1bW4gZGF0YWJhc2UgbmFtZXNcbiAgICAgICAgdmFyIHdoZXJlRXhwcmVzc2lvbiA9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKCk7XG4gICAgICAgIHZhciByZXR1cm5pbmdFeHByZXNzaW9uID0gdGhpcy5jcmVhdGVSZXR1cm5pbmdFeHByZXNzaW9uKCk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGFuZCByZXR1cm4gc3FsIHVwZGF0ZSBxdWVyeVxuICAgICAgICBpZiAocmV0dXJuaW5nRXhwcmVzc2lvbiAmJiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBPcmFjbGVEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIENvY2tyb2FjaERyaXZlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlVQREFURSBcIiArIHRoaXMuZ2V0VGFibGVOYW1lKHRoaXMuZ2V0TWFpblRhYmxlTmFtZSgpKSArIFwiIFNFVCBcIiArIHVwZGF0ZUNvbHVtbkFuZFZhbHVlcy5qb2luKFwiLCBcIikgKyB3aGVyZUV4cHJlc3Npb24gKyBcIiBSRVRVUk5JTkcgXCIgKyByZXR1cm5pbmdFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJldHVybmluZ0V4cHJlc3Npb24gJiYgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFNxbFNlcnZlckRyaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIFwiVVBEQVRFIFwiICsgdGhpcy5nZXRUYWJsZU5hbWUodGhpcy5nZXRNYWluVGFibGVOYW1lKCkpICsgXCIgU0VUIFwiICsgdXBkYXRlQ29sdW1uQW5kVmFsdWVzLmpvaW4oXCIsIFwiKSArIFwiIE9VVFBVVCBcIiArIHJldHVybmluZ0V4cHJlc3Npb24gKyB3aGVyZUV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJVUERBVEUgXCIgKyB0aGlzLmdldFRhYmxlTmFtZSh0aGlzLmdldE1haW5UYWJsZU5hbWUoKSkgKyBcIiBTRVQgXCIgKyB1cGRhdGVDb2x1bW5BbmRWYWx1ZXMuam9pbihcIiwgXCIpICsgd2hlcmVFeHByZXNzaW9uOyAvLyB0b2RvOiBob3cgZG8gd2UgcmVwbGFjZSBhbGlhc2VzIGluIHdoZXJlIHRvIG5vdGhpbmc/XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIFVwZGF0ZVF1ZXJ5QnVpbGRlci5wcm90b3R5cGUuY3JlYXRlT3JkZXJCeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBvcmRlckJ5cyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cztcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yZGVyQnlzKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiIE9SREVSIEJZIFwiICsgT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JkZXJCeXNbY29sdW1uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGNvbHVtbk5hbWUpICsgXCIgXCIgKyBvcmRlckJ5c1tjb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArIFwiIFwiICsgb3JkZXJCeXNbY29sdW1uTmFtZV0ub3JkZXIgKyBcIiBcIiArIG9yZGVyQnlzW2NvbHVtbk5hbWVdLm51bGxzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTElNSVRcIiBwYXJ0cyBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgVXBkYXRlUXVlcnlCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMaW1pdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsaW1pdCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdDtcbiAgICAgICAgaWYgKGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE15c3FsRHJpdmVyIHx8IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBdXJvcmFEYXRhQXBpRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGltaXRPblVwZGF0ZU5vdFN1cHBvcnRlZEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGFycmF5IG9mIHZhbHVlcyBuZWVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKi9cbiAgICBVcGRhdGVRdWVyeUJ1aWxkZXIucHJvdG90eXBlLmdldFZhbHVlU2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnZhbHVlc1NldCBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25NYXAudmFsdWVzU2V0O1xuICAgICAgICB0aHJvdyBuZXcgVXBkYXRlVmFsdWVzTWlzc2luZ0Vycm9yKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVXBkYXRlUXVlcnlCdWlsZGVyO1xufShRdWVyeUJ1aWxkZXIpKTtcbmV4cG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1VcGRhdGVRdWVyeUJ1aWxkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlclV0aWxzIH0gZnJvbSBcIi4uL1F1ZXJ5QnVpbGRlclV0aWxzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG52YXIgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25Db3VudEF0dHJpYnV0ZShleHByZXNzaW9uTWFwLCByZWxhdGlvbkNvdW50QXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcCA9IGV4cHJlc3Npb25NYXA7XG4gICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCByZWxhdGlvbkNvdW50QXR0cmlidXRlIHx8IHt9KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImpvaW5JbnZlcnNlU2lkZU1ldGFkYXRhXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcInBhcmVudEFsaWFzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsaWFzIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyBqb2luLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwicG9zdFwiIGlzIGEgcGFyZW50IGFsaWFzLlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uTmFtZS5zcGxpdChcIi5cIilbMF07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25Db3VudEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25Qcm9wZXJ0eVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWxhdGlvbiBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgd2Ugam9pbiAoXCJwb3N0LmNhdGVnb3J5XCIsIFwiY2F0ZWdvcnlBbGlhc1wiKSB0aGVuIFwiY2F0ZWdvcnlcIiBpcyBhIHJlbGF0aW9uIHByb3BlcnR5LlxuICAgICAgICAgKiBUaGlzIHZhbHVlIGlzIGV4dHJhY3RlZCBmcm9tIGVudGl0eU9yUHJvcGVydHkgdmFsdWUuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxpYXMgcHJvcGVydHlcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbk5hbWUuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImp1bmN0aW9uQWxpYXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZCh0aGlzLnJlbGF0aW9uTmFtZS5zcGxpdChcIi5cIiksIDIpLCBwYXJlbnRBbGlhcyA9IF9hWzBdLCByZWxhdGlvblByb3BlcnR5ID0gX2FbMV07XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50QWxpYXMgKyBcIl9cIiArIHJlbGF0aW9uUHJvcGVydHkgKyBcIl9yY1wiO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcInJlbGF0aW9uXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbGF0aW9uIG9mIHRoZSBwYXJlbnQuXG4gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgam9pbmVkLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSh0aGlzLnJlbGF0aW9uTmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkdpdmVuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsaWFzIHByb3BlcnR5XCIpO1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKSwgMiksIHBhcmVudEFsaWFzID0gX2FbMF0sIHByb3BlcnR5UGF0aCA9IF9hWzFdO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uT3duZXJTZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHBhcmVudEFsaWFzKTtcbiAgICAgICAgICAgIHZhciByZWxhdGlvbiA9IHJlbGF0aW9uT3duZXJTZWxlY3Rpb24ubWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVsYXRpb24gd2l0aCBwcm9wZXJ0eSBwYXRoIFwiICsgcHJvcGVydHlQYXRoICsgXCIgaW4gZW50aXR5IHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucHJvdG90eXBlLCBcIm1ldGFkYXRhXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1ldGFkYXRhIG9mIHRoZSBqb2luZWQgZW50aXR5LlxuICAgICAgICAgKiBJZiB0YWJsZSB3aXRob3V0IGVudGl0eSB3YXMgam9pbmVkLCB0aGVuIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5yZWxhdGlvbk5hbWUpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJHaXZlbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRBbGlhcyA9IHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHBhcmVudEFsaWFzKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25Db3VudEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwibWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVG9Qcm9wZXJ0eS5zcGxpdChcIi5cIilbMV07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudEF0dHJpYnV0ZTtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkNvdW50QXR0cmlidXRlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG52YXIgUmVsYXRpb25Db3VudExvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25Db3VudExvYWRlcihjb25uZWN0aW9uLCBxdWVyeVJ1bm5lciwgcmVsYXRpb25Db3VudEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeVJ1bm5lciA9IHF1ZXJ5UnVubmVyO1xuICAgICAgICB0aGlzLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzID0gcmVsYXRpb25Db3VudEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBSZWxhdGlvbkNvdW50TG9hZGVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKHJhd0VudGl0aWVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbmx5VW5pcXVlLCBwcm9taXNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgb25seVVuaXF1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgsIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMgPSB0aGlzLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLm1hcChmdW5jdGlvbiAocmVsYXRpb25Db3VudEF0dHIpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0aW9uLCBpbnZlcnNlUmVsYXRpb24sIHJlZmVyZW5jZUNvbHVtbk5hbWVfMSwgaW52ZXJzZVNpZGVUYWJsZSwgaW52ZXJzZVNpZGVUYWJsZU5hbWUsIGludmVyc2VTaWRlVGFibGVBbGlhcywgaW52ZXJzZVNpZGVQcm9wZXJ0eU5hbWUsIHJlZmVyZW5jZUNvbHVtblZhbHVlcywgcWIsIGpvaW5UYWJsZUNvbHVtbk5hbWVfMSwgaW52ZXJzZUpvaW5Db2x1bW5OYW1lLCBmaXJzdEp1bmN0aW9uQ29sdW1uLCBzZWNvbmRKdW5jdGlvbkNvbHVtbiwgcmVmZXJlbmNlQ29sdW1uVmFsdWVzLCBqdW5jdGlvbkFsaWFzLCBpbnZlcnNlU2lkZVRhYmxlTmFtZSwgaW52ZXJzZVNpZGVUYWJsZUFsaWFzLCBqdW5jdGlvblRhYmxlTmFtZSwgY29uZGl0aW9uLCBxYjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbkNvdW50QXR0ci5yZWxhdGlvbi5pc09uZVRvTWFueSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VSZWxhdGlvbiA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlQ29sdW1uTmFtZV8xID0gaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVUYWJsZU5hbWUgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlQWxpYXMgPSByZWxhdGlvbkNvdW50QXR0ci5hbGlhcyB8fCBpbnZlcnNlU2lkZVRhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eU5hbWUgPSBpbnZlcnNlUmVsYXRpb24ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5WYWx1ZXMgPSByYXdFbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmF3RW50aXR5KSB7IHJldHVybiByYXdFbnRpdHlbcmVsYXRpb25Db3VudEF0dHIucGFyZW50QWxpYXMgKyBcIl9cIiArIHJlZmVyZW5jZUNvbHVtbk5hbWVfMV07IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gISF2YWx1ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtblZhbHVlcyA9IHJlZmVyZW5jZUNvbHVtblZhbHVlcy5maWx0ZXIob25seVVuaXF1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHIsIHJlc3VsdHM6IFtdIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIodGhpcy5xdWVyeVJ1bm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLnNlbGVjdChpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lLCBcInBhcmVudElkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0KFwiQ09VTlQoKilcIiwgXCJjbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKGludmVyc2VTaWRlVGFibGUsIGludmVyc2VTaWRlVGFibGVBbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZShpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lICsgXCIgSU4gKDouLi5pZHMpXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkR3JvdXBCeShpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VTaWRlUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcihcImlkc1wiLCByZWZlcmVuY2VDb2x1bW5WYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBjb25kaXRpb24gKGN1c3RvbSBxdWVyeSBidWlsZGVyIGZhY3RvcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbkNvdW50QXR0ci5xdWVyeUJ1aWxkZXJGYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeShxYik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZ2V0UmF3TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2EucmVzdWx0cyA9IF9jLnNlbnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbk5hbWUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SnVuY3Rpb25Db2x1bW4gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEp1bmN0aW9uQ29sdW1uID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaXNPd25pbmcpIHsgLy8gdG9kbyBmaXggam9pbkNvbHVtbnNbMF0gYW5kIGludmVyc2VKb2luQ29sdW1uc1swXS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5UYWJsZUNvbHVtbk5hbWVfMSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUpvaW5Db2x1bW5OYW1lID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RKdW5jdGlvbkNvbHVtbiA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEuY29sdW1uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEp1bmN0aW9uQ29sdW1uID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS5jb2x1bW5zWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pblRhYmxlQ29sdW1uTmFtZV8xID0gcmVsYXRpb25Db3VudEF0dHIucmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmludmVyc2VKb2luQ29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uTmFtZSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5qb2luQ29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SnVuY3Rpb25Db2x1bW4gPSByZWxhdGlvbkNvdW50QXR0ci5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLmNvbHVtbnNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRKdW5jdGlvbkNvbHVtbiA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEuY29sdW1uc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5WYWx1ZXMgPSByYXdFbnRpdGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocmF3RW50aXR5KSB7IHJldHVybiByYXdFbnRpdHlbcmVsYXRpb25Db3VudEF0dHIucGFyZW50QWxpYXMgKyBcIl9cIiArIGpvaW5UYWJsZUNvbHVtbk5hbWVfMV07IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gISF2YWx1ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtblZhbHVlcyA9IHJlZmVyZW5jZUNvbHVtblZhbHVlcy5maWx0ZXIob25seVVuaXF1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgcmVsYXRpb25Db3VudEF0dHJpYnV0ZTogcmVsYXRpb25Db3VudEF0dHIsIHJlc3VsdHM6IFtdIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkFsaWFzID0gcmVsYXRpb25Db3VudEF0dHIuanVuY3Rpb25BbGlhcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZVNpZGVUYWJsZU5hbWUgPSByZWxhdGlvbkNvdW50QXR0ci5qb2luSW52ZXJzZVNpZGVNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VTaWRlVGFibGVBbGlhcyA9IHJlbGF0aW9uQ291bnRBdHRyLmFsaWFzIHx8IGludmVyc2VTaWRlVGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uQ291bnRBdHRyLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBqdW5jdGlvbkFsaWFzICsgXCIuXCIgKyBmaXJzdEp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiIElOIChcIiArIHJlZmVyZW5jZUNvbHVtblZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbHMpIHsgcmV0dXJuIGlzTmFOKHZhbHMpID8gXCInXCIgKyB2YWxzICsgXCInXCIgOiB2YWxzOyB9KSArIFwiKVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIEFORCBcIiArIGp1bmN0aW9uQWxpYXMgKyBcIi5cIiArIHNlY29uZEp1bmN0aW9uQ29sdW1uLnByb3BlcnR5TmFtZSArIFwiID0gXCIgKyBpbnZlcnNlU2lkZVRhYmxlQWxpYXMgKyBcIi5cIiArIGludmVyc2VKb2luQ29sdW1uTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYi5zZWxlY3QoanVuY3Rpb25BbGlhcyArIFwiLlwiICsgZmlyc3RKdW5jdGlvbkNvbHVtbi5wcm9wZXJ0eU5hbWUsIFwicGFyZW50SWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTZWxlY3QoXCJDT1VOVChcIiArIHFiLmVzY2FwZShpbnZlcnNlU2lkZVRhYmxlQWxpYXMpICsgXCIuXCIgKyBxYi5lc2NhcGUoaW52ZXJzZUpvaW5Db2x1bW5OYW1lKSArIFwiKVwiLCBcImNudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oaW52ZXJzZVNpZGVUYWJsZU5hbWUsIGludmVyc2VTaWRlVGFibGVBbGlhcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbm5lckpvaW4oanVuY3Rpb25UYWJsZU5hbWUsIGp1bmN0aW9uQWxpYXMsIGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRHcm91cEJ5KGp1bmN0aW9uQWxpYXMgKyBcIi5cIiArIGZpcnN0SnVuY3Rpb25Db2x1bW4ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgY29uZGl0aW9uIChjdXN0b20gcXVlcnkgYnVpbGRlciBmYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25Db3VudEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uQ291bnRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkocWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGU6IHJlbGF0aW9uQ291bnRBdHRyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9iLnJlc3VsdHMgPSBfYy5zZW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYildO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25Db3VudExvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbkNvdW50TG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uQ291bnRMb2FkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBSZWxhdGlvbkNvdW50QXR0cmlidXRlIH0gZnJvbSBcIi4vUmVsYXRpb25Db3VudEF0dHJpYnV0ZVwiO1xudmFyIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBieSBleGFtcGxlOlxuICAgICAgICAvLyBwb3N0IGhhcyByZWxhdGlvbiBjb3VudDpcbiAgICAgICAgLy8gQFJlbGF0aW9uQ291bnQocG9zdCA9PiBwb3N0LmNhdGVnb3JpZXMpIGNhdGVnb3J5Q291bnRcbiAgICAgICAgLy8gY2F0ZWdvcnkgaGFzIHJlbGF0aW9uIGNvdW50XG4gICAgICAgIC8vIEBSZWxhdGlvbkNvdW50KGNhdGVnb3J5ID0+IGNhdGVnb3J5LmltYWdlcykgaW1hZ2VDb3VudFxuICAgICAgICAvLyB3ZSBsb2FkIHBvc3QgYW5kIGpvaW4gY2F0ZWdvcnlcbiAgICAgICAgLy8gd2UgZXhwZWN0IHBvc3QuY2F0ZWdvcnlDb3VudCBhbmQgcG9zdC5jYXRlZ29yeS5pbWFnZUNvdW50IHRvIGhhdmUgcmVsYXRpb24gY291bnRzXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGZpcnN0IGNyZWF0ZSByZWxhdGlvbiBjb3VudCBhdHRyaWJ1dGVzIGZvciBhbGwgcmVsYXRpb24gY291bnQgbWV0YWRhdGFzIG9mIHRoZSBtYWluIHNlbGVjdGVkIG9iamVjdCAocG9zdCBmcm9tIGV4YW1wbGUpXG4gICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLnJlbGF0aW9uQ291bnRzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uQ291bnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlID0gX3RoaXMubWV0YWRhdGFUb0F0dHJpYnV0ZShfdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lLCByZWxhdGlvbkNvdW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNlY29uZCBjcmVhdGUgcmVsYXRpb24gY291bnQgYXR0cmlidXRlcyBmb3IgYWxsIHJlbGF0aW9uIGNvdW50IG1ldGFkYXRhcyBvZiBhbGwgam9pbmVkIG9iamVjdHMgKGNhdGVnb3J5IGZyb20gZXhhbXBsZSlcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGpvaW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0aGlzIGpvaW4gaGFzIGEgbWV0YWRhdGEsIGJlY2F1c2UgcmVsYXRpb24gY291bnQgY2FuIG9ubHkgd29yayBmb3IgcmVhbCBvcm0gZW50aXRpZXNcbiAgICAgICAgICAgIGlmICgham9pbi5tZXRhZGF0YSB8fCBqb2luLm1ldGFkYXRhLmlzSnVuY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgam9pbi5tZXRhZGF0YS5yZWxhdGlvbkNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbkNvdW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IF90aGlzLm1ldGFkYXRhVG9BdHRyaWJ1dGUoam9pbi5hbGlhcy5uYW1lLCByZWxhdGlvbkNvdW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUubWV0YWRhdGFUb0F0dHJpYnV0ZSA9IGZ1bmN0aW9uIChwYXJlbnRBbGlhc05hbWUsIHJlbGF0aW9uQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKHRoaXMuZXhwcmVzc2lvbk1hcCwge1xuICAgICAgICAgICAgcmVsYXRpb25OYW1lOiBwYXJlbnRBbGlhc05hbWUgKyBcIi5cIiArIHJlbGF0aW9uQ291bnQucmVsYXRpb24ucHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgbWFwVG9Qcm9wZXJ0eTogcGFyZW50QWxpYXNOYW1lICsgXCIuXCIgKyByZWxhdGlvbkNvdW50LnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGFsaWFzOiByZWxhdGlvbkNvdW50LmFsaWFzLFxuICAgICAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogcmVsYXRpb25Db3VudC5xdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXJVdGlscyB9IGZyb20gXCIuLi9RdWVyeUJ1aWxkZXJVdGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9PYmplY3RVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1R5cGVPUk1FcnJvclwiO1xuLyoqXG4gKiBTdG9yZXMgYWxsIGpvaW4gcmVsYXRpb24gaWQgYXR0cmlidXRlcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgYSBKT0lOIHF1ZXJ5LlxuICovXG52YXIgUmVsYXRpb25JZEF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gUmVsYXRpb25JZEF0dHJpYnV0ZShxdWVyeUV4cHJlc3Npb25NYXAsIHJlbGF0aW9uSWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAgPSBxdWVyeUV4cHJlc3Npb25NYXA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgcmVsYXRpb24gaWQgc2hvdWxkIE5PVCBiZSBsb2FkZWQgYXMgaWQgbWFwLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kaXNhYmxlTWl4ZWRNYXAgPSBmYWxzZTtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMsIHJlbGF0aW9uSWRBdHRyaWJ1dGUgfHwge30pO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwiam9pbkludmVyc2VTaWRlTWV0YWRhdGFcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicGFyZW50QWxpYXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxpYXMgb2YgdGhlIHBhcmVudCBvZiB0aGlzIGpvaW4uXG4gICAgICAgICAqIEZvciBleGFtcGxlLCBpZiB3ZSBqb2luIChcInBvc3QuY2F0ZWdvcnlcIiwgXCJjYXRlZ29yeUFsaWFzXCIpIHRoZW4gXCJwb3N0XCIgaXMgYSBwYXJlbnQgYWxpYXMuXG4gICAgICAgICAqIFRoaXMgdmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gZW50aXR5T3JQcm9wZXJ0eSB2YWx1ZS5cbiAgICAgICAgICogVGhpcyBpcyBhdmFpbGFibGUgd2hlbiBqb2luIHdhcyBtYWRlIHVzaW5nIFwicG9zdC5jYXRlZ29yeVwiIHN5bnRheC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFRdWVyeUJ1aWxkZXJVdGlscy5pc0FsaWFzUHJvcGVydHkodGhpcy5yZWxhdGlvbk5hbWUpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJHaXZlbiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFsaWFzIHByb3BlcnR5XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25OYW1lLnN1YnN0cigwLCB0aGlzLnJlbGF0aW9uTmFtZS5pbmRleE9mKFwiLlwiKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25Qcm9wZXJ0eVBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gcHJvcGVydHkgbmFtZSBvZiB0aGUgcGFyZW50LlxuICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGpvaW5lZC5cbiAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHdlIGpvaW4gKFwicG9zdC5jYXRlZ29yeVwiLCBcImNhdGVnb3J5QWxpYXNcIikgdGhlbiBcImNhdGVnb3J5XCIgaXMgYSByZWxhdGlvbiBwcm9wZXJ0eS5cbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBleHRyYWN0ZWQgZnJvbSBlbnRpdHlPclByb3BlcnR5IHZhbHVlLlxuICAgICAgICAgKiBUaGlzIGlzIGF2YWlsYWJsZSB3aGVuIGpvaW4gd2FzIG1hZGUgdXNpbmcgXCJwb3N0LmNhdGVnb3J5XCIgc3ludGF4LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIVF1ZXJ5QnVpbGRlclV0aWxzLmlzQWxpYXNQcm9wZXJ0eSh0aGlzLnJlbGF0aW9uTmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIkdpdmVuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYWxpYXMgcHJvcGVydHlcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbk5hbWUuc3Vic3RyKHRoaXMucmVsYXRpb25OYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwicmVsYXRpb25cIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVsYXRpb24gb2YgdGhlIHBhcmVudC5cbiAgICAgICAgICogVGhpcyBpcyB1c2VkIHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBqb2luZWQuXG4gICAgICAgICAqIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4gam9pbiB3YXMgbWFkZSB1c2luZyBcInBvc3QuY2F0ZWdvcnlcIiBzeW50YXguXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghUXVlcnlCdWlsZGVyVXRpbHMuaXNBbGlhc1Byb3BlcnR5KHRoaXMucmVsYXRpb25OYW1lKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiR2l2ZW4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbGlhcyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgICAgIHZhciByZWxhdGlvbk93bmVyU2VsZWN0aW9uID0gdGhpcy5xdWVyeUV4cHJlc3Npb25NYXAuZmluZEFsaWFzQnlOYW1lKHRoaXMucGFyZW50QWxpYXMpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmVsYXRpb25Pd25lclNlbGVjdGlvbi5tZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHRoaXMucmVsYXRpb25Qcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgaWYgKCFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiUmVsYXRpb24gd2l0aCBwcm9wZXJ0eSBwYXRoIFwiICsgdGhpcy5yZWxhdGlvblByb3BlcnR5UGF0aCArIFwiIGluIGVudGl0eSB3YXMgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGlvbklkQXR0cmlidXRlLnByb3RvdHlwZSwgXCJqdW5jdGlvbkFsaWFzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdlbmVyYXRlcyBhbGlhcyBvZiBqdW5jdGlvbiB0YWJsZSwgd2hvc2UgaWRzIHdlIGdldC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKHRoaXMucmVsYXRpb25OYW1lLnNwbGl0KFwiLlwiKSwgMiksIHBhcmVudEFsaWFzID0gX2FbMF0sIHJlbGF0aW9uUHJvcGVydHkgPSBfYVsxXTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRBbGlhcyArIFwiX1wiICsgcmVsYXRpb25Qcm9wZXJ0eSArIFwiX3JpZFwiO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbGF0aW9uSWRBdHRyaWJ1dGUucHJvdG90eXBlLCBcImp1bmN0aW9uTWV0YWRhdGFcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTWV0YWRhdGEgb2YgdGhlIGpvaW5lZCBlbnRpdHkuXG4gICAgICAgICAqIElmIGV4dHJhIGNvbmRpdGlvbiB3aXRob3V0IGVudGl0eSB3YXMgam9pbmVkLCB0aGVuIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWxhdGlvbklkQXR0cmlidXRlLnByb3RvdHlwZSwgXCJtYXBUb1Byb3BlcnR5UGFyZW50QWxpYXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcFRvUHJvcGVydHkuc3Vic3RyKDAsIHRoaXMubWFwVG9Qcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVsYXRpb25JZEF0dHJpYnV0ZS5wcm90b3R5cGUsIFwibWFwVG9Qcm9wZXJ0eVByb3BlcnR5UGF0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVG9Qcm9wZXJ0eS5zdWJzdHIodGhpcy5tYXBUb1Byb3BlcnR5LmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUmVsYXRpb25JZEF0dHJpYnV0ZTtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRBdHRyaWJ1dGUuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uLy4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiO1xuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1R5cGVPUk1FcnJvclwiO1xudmFyIFJlbGF0aW9uSWRMb2FkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSWRMb2FkZXIoY29ubmVjdGlvbiwgcXVlcnlSdW5uZXIsIHJlbGF0aW9uSWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICAgICAgdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcyA9IHJlbGF0aW9uSWRBdHRyaWJ1dGVzO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25JZExvYWRlci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChyYXdFbnRpdGllcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzID0gdGhpcy5yZWxhdGlvbklkQXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKHJlbGF0aW9uSWRBdHRyKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVzXzEsIHJlc3VsdHMsIHJlbGF0aW9uXzEsIGpvaW5Db2x1bW5zXzEsIHRhYmxlLCB0YWJsZU5hbWUsIHRhYmxlQWxpYXNfMSwgZHVwbGljYXRlc18yLCBwYXJhbWV0ZXJzXzEsIGNvbmRpdGlvbiwgcWJfMSwgcmVzdWx0cywgcmVsYXRpb24sIGpvaW5Db2x1bW5zXzIsIGludmVyc2VKb2luQ29sdW1uc18xLCBqdW5jdGlvbkFsaWFzXzEsIGludmVyc2VTaWRlVGFibGVOYW1lLCBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSwganVuY3Rpb25UYWJsZU5hbWUsIG1hcHBlZENvbHVtbnMsIHBhcmFtZXRlcnNfMiwgZHVwbGljYXRlc18zLCBqb2luQ29sdW1uQ29uZGl0aW9ucywgaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25fMSwgY29uZGl0aW9uLCBxYl8yLCByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5pc09uZVRvT25lT3duZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogUG9zdCBhbmQgVGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRSZWxhdGlvbklkQW5kTWFwKFwicG9zdC50YWdJZFwiLCBcInBvc3QudGFnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCBpdCB0byBsb2FkIGlkIG9mIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25JZEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJBZGRpdGlvbmFsIGNvbmRpdGlvbiBjYW4gbm90IGJlIHVzZWQgd2l0aCBNYW55VG9PbmUgb3IgT25lVG9PbmUgb3duZXIgcmVsYXRpb25zLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByYXdFbnRpdGllcy5tYXAoZnVuY3Rpb24gKHJhd0VudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cGxpY2F0ZVBhcnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0ci5yZWxhdGlvbi5qb2luQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2pvaW5Db2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJhd0VudGl0eVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCByZWxhdGlvbklkQXR0ci5wYXJlbnRBbGlhcywgam9pbkNvbHVtbi5kYXRhYmFzZU5hbWUpXSwgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydCA9IGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lICsgXCI6XCIgKyByZXN1bHRbam9pbkNvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVQYXJ0cy5pbmRleE9mKGR1cGxpY2F0ZVBhcnQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5wdXNoKGR1cGxpY2F0ZVBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZEF0dHIucmVsYXRpb24uZW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAocHJpbWFyeUNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShyYXdFbnRpdHlbRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5jb25uZWN0aW9uLmRyaXZlciwgcmVsYXRpb25JZEF0dHIucGFyZW50QWxpYXMsIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKV0sIHByaW1hcnlDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0gcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUgKyBcIjpcIiArIHJlc3VsdFtwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVBhcnRzLmluZGV4T2YoZHVwbGljYXRlUGFydCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVBhcnRzLnB1c2goZHVwbGljYXRlUGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5zb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlID0gZHVwbGljYXRlUGFydHMuam9pbihcIjo6XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZXNfMS5pbmRleE9mKGR1cGxpY2F0ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVzXzEucHVzaChkdXBsaWNhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0cmlidXRlOiByZWxhdGlvbklkQXR0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lcikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbl8xID0gcmVsYXRpb25JZEF0dHIucmVsYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW5zXzEgPSByZWxhdGlvbl8xLmlzT3duaW5nID8gcmVsYXRpb25fMS5qb2luQ29sdW1ucyA6IHJlbGF0aW9uXzEuaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHJlbGF0aW9uXzEuaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gcmVsYXRpb25fMS5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUFsaWFzXzEgPSByZWxhdGlvbklkQXR0ci5hbGlhcyB8fCB0YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcmF3RW50aXRpZXMubWFwKGZ1bmN0aW9uIChyYXdFbnRpdHksIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJQYXJ0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydCA9IGpvaW5Db2x1bW5zXzEubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBqb2luQ29sdW1uLmRhdGFiYXNlTmFtZSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJWYWx1ZSA9IHJhd0VudGl0eVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLCByZWxhdGlvbklkQXR0ci5wYXJlbnRBbGlhcywgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0gdGFibGVBbGlhc18xICsgXCI6XCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiOlwiICsgcGFyYW1ldGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVBhcnRzLmluZGV4T2YoZHVwbGljYXRlUGFydCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVQYXJ0cy5wdXNoKGR1cGxpY2F0ZVBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclBhcnRzW3BhcmFtZXRlck5hbWVdID0gcGFyYW1ldGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiA9IDpcIiArIHBhcmFtZXRlck5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVBhcnRzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGUgPSBkdXBsaWNhdGVQYXJ0cy5qb2luKFwiOjpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlc18yLmluZGV4T2YoZHVwbGljYXRlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMi5wdXNoKGR1cGxpY2F0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHBhcmFtZXRlcnNfMSwgcGFyYW1ldGVyUGFydHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2OyB9KS5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIjsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHdlIHdvbid0IHBlcmZvcm0gcmVkdW5kYW50IHF1ZXJpZXMgZm9yIGpvaW5lZCBkYXRhIHdoaWNoIHdhcyBub3QgZm91bmQgaW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IGlmIHBvc3QuY2F0ZWdvcnkgd2FzIG5vdCBmb3VuZCBpbiBkYiB0aGVuIG5vIG5lZWQgdG8gZXhlY3V0ZSBxdWVyeSBmb3IgY2F0ZWdvcnkuaW1hZ2VJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyByZWxhdGlvbklkQXR0cmlidXRlOiByZWxhdGlvbklkQXR0ciwgcmVzdWx0czogW10gfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlCdWlsZGVyKHRoaXMucXVlcnlSdW5uZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuYWRkU2VsZWN0KHRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgsIGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uXzEuaW52ZXJzZVJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKHByaW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuYWRkU2VsZWN0KHRhYmxlQWxpYXNfMSArIFwiLlwiICsgcHJpbWFyeUNvbHVtbi5wcm9wZXJ0eVBhdGgsIHByaW1hcnlDb2x1bW4uZGF0YWJhc2VOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzEuZnJvbSh0YWJsZSwgdGFibGVBbGlhc18xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFwiKFwiICsgY29uZGl0aW9uICsgXCIpXCIpIC8vIG5lZWQgYnJhY2tldHMgYmVjYXVzZSBpZiB3ZSBoYXZlIGFkZGl0aW9uYWwgY29uZGl0aW9uIGFuZCBubyBicmFja2V0cywgaXQgbG9va3MgbGlrZSAoYSA9IDEpIE9SIChhID0gMikgQU5EIGIgPSAxLCB0aGF0IGlzIGluY29ycmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgY29uZGl0aW9uIChjdXN0b20gcXVlcnkgYnVpbGRlciBmYWN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25JZEF0dHIucXVlcnlCdWlsZGVyRmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkocWJfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiXzEuZ2V0UmF3TWFueSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSwgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbl8xLmludmVyc2VSZWxhdGlvbi5lbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShyZXN1bHRbY29sdW1uLmRhdGFiYXNlTmFtZV0sIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZTogcmVsYXRpb25JZEF0dHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbiA9IHJlbGF0aW9uSWRBdHRyLnJlbGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uc18yID0gcmVsYXRpb24uaXNPd25pbmcgPyByZWxhdGlvbi5qb2luQ29sdW1ucyA6IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uc18xID0gcmVsYXRpb24uaXNPd25pbmcgPyByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnMgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uam9pbkNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXNfMSA9IHJlbGF0aW9uSWRBdHRyLmp1bmN0aW9uQWxpYXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VTaWRlVGFibGVOYW1lID0gcmVsYXRpb25JZEF0dHIuam9pbkludmVyc2VTaWRlTWV0YWRhdGEudGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSA9IHJlbGF0aW9uSWRBdHRyLmFsaWFzIHx8IGludmVyc2VTaWRlVGFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvblRhYmxlTmFtZSA9IHJlbGF0aW9uLmlzT3duaW5nID8gcmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWUgOiByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YS50YWJsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZENvbHVtbnMgPSByYXdFbnRpdGllcy5tYXAoZnVuY3Rpb24gKHJhd0VudGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW5Db2x1bW5zXzIucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBbam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGhdID0gcmF3RW50aXR5W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIsIHJlbGF0aW9uSWRBdHRyLnBhcmVudEFsaWFzLCBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSB3b24ndCBwZXJmb3JtIHJlZHVuZGFudCBxdWVyaWVzIGZvciBqb2luZWQgZGF0YSB3aGljaCB3YXMgbm90IGZvdW5kIGluIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiBpZiBwb3N0LmNhdGVnb3J5IHdhcyBub3QgZm91bmQgaW4gZGIgdGhlbiBubyBuZWVkIHRvIGV4ZWN1dGUgcXVlcnkgZm9yIGNhdGVnb3J5LmltYWdlSWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHJlbGF0aW9uSWRBdHRyaWJ1dGU6IHJlbGF0aW9uSWRBdHRyLCByZXN1bHRzOiBbXSB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXNfMyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uQ29uZGl0aW9ucyA9IG1hcHBlZENvbHVtbnMubWFwKGZ1bmN0aW9uIChtYXBwZWRDb2x1bW4sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHVwbGljYXRlUGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJQYXJ0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5UGFydCA9IE9iamVjdC5rZXlzKG1hcHBlZENvbHVtbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyTmFtZSA9IGtleSArIGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJWYWx1ZSA9IG1hcHBlZENvbHVtbltrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXBsaWNhdGVQYXJ0ID0ganVuY3Rpb25BbGlhc18xICsgXCI6XCIgKyBrZXkgKyBcIjpcIiArIHBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVQYXJ0cy5pbmRleE9mKGR1cGxpY2F0ZVBhcnQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlUGFydHMucHVzaChkdXBsaWNhdGVQYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJQYXJ0c1twYXJhbWV0ZXJOYW1lXSA9IHBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGtleSArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAocykgeyByZXR1cm4gczsgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlUGFydHMuc29ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZVBhcnRzLmpvaW4oXCI6OlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVzXzMuaW5kZXhPZihkdXBsaWNhdGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlc18zLnB1c2goZHVwbGljYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1ldGVyc18yLCBwYXJhbWV0ZXJQYXJ0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHM7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlSm9pbkNvbHVtbkNvbmRpdGlvbl8xID0gaW52ZXJzZUpvaW5Db2x1bW5zXzEubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVuY3Rpb25BbGlhc18xICsgXCIuXCIgKyBqb2luQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gXCIgKyBpbnZlcnNlU2lkZVRhYmxlQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBqb2luQ29sdW1uQ29uZGl0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiKFwiICsgY29uZGl0aW9uICsgXCIgQU5EIFwiICsgaW52ZXJzZUpvaW5Db2x1bW5Db25kaXRpb25fMSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiIE9SIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWJfMiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIodGhpcy5xdWVyeVJ1bm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VKb2luQ29sdW1uc18xLmZvckVhY2goZnVuY3Rpb24gKGpvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzIuYWRkU2VsZWN0KGp1bmN0aW9uQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgsIGpvaW5Db2x1bW4uZGF0YWJhc2VOYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRPcmRlckJ5KGp1bmN0aW9uQWxpYXNfMSArIFwiLlwiICsgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbnNfMi5mb3JFYWNoKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYl8yLmFkZFNlbGVjdChqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoLCBqb2luQ29sdW1uLmRhdGFiYXNlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkT3JkZXJCeShqdW5jdGlvbkFsaWFzXzEgKyBcIi5cIiArIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiXzIuZnJvbShpbnZlcnNlU2lkZVRhYmxlTmFtZSwgaW52ZXJzZVNpZGVUYWJsZUFsaWFzXzEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5uZXJKb2luKGp1bmN0aW9uVGFibGVOYW1lLCBqdW5jdGlvbkFsaWFzXzEsIGNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IGNvbmRpdGlvbiAoY3VzdG9tIHF1ZXJ5IGJ1aWxkZXIgZmFjdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uSWRBdHRyLnF1ZXJ5QnVpbGRlckZhY3RvcnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbklkQXR0ci5xdWVyeUJ1aWxkZXJGYWN0b3J5KHFiXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxYl8yLmdldFJhd01hbnkoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoam9pbkNvbHVtbnNfMiksIGZhbHNlKSwgX19yZWFkKGludmVyc2VKb2luQ29sdW1uc18xKSwgZmFsc2UpLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSA9IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHJlc3VsdFtjb2x1bW4uZGF0YWJhc2VOYW1lXSwgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGU6IHJlbGF0aW9uSWRBdHRyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKHByb21pc2VzKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVsYXRpb25JZExvYWRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZWxhdGlvbklkTG9hZGVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbGF0aW9uSWRMb2FkZXIuanMubWFwXG4iLCJpbXBvcnQgeyBSZWxhdGlvbklkQXR0cmlidXRlIH0gZnJvbSBcIi4vUmVsYXRpb25JZEF0dHJpYnV0ZVwiO1xudmFyIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIoZXhwcmVzc2lvbk1hcCkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBieSBleGFtcGxlOlxuICAgICAgICAvLyBwb3N0IGhhcyByZWxhdGlvbiBpZDpcbiAgICAgICAgLy8gQFJlbGF0aW9uSWQocG9zdCA9PiBwb3N0LmNhdGVnb3JpZXMpIGNhdGVnb3J5SWRzXG4gICAgICAgIC8vIGNhdGVnb3J5IGhhcyByZWxhdGlvbiBpZFxuICAgICAgICAvLyBAUmVsYXRpb25JZChjYXRlZ29yeSA9PiBjYXRlZ29yeS5pbWFnZXMpIGltYWdlSWRzXG4gICAgICAgIC8vIHdlIGxvYWQgcG9zdCBhbmQgam9pbiBjYXRlZ29yeVxuICAgICAgICAvLyB3ZSBleHBlY3QgcG9zdC5jYXRlZ29yeUlkcyBhbmQgcG9zdC5jYXRlZ29yeS5pbWFnZUlkcyB0byBoYXZlIHJlbGF0aW9uIGlkc1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBmaXJzdCBjcmVhdGUgcmVsYXRpb24gaWQgYXR0cmlidXRlcyBmb3IgYWxsIHJlbGF0aW9uIGlkIG1ldGFkYXRhcyBvZiB0aGUgbWFpbiBzZWxlY3RlZCBvYmplY3QgKHBvc3QgZnJvbSBleGFtcGxlKVxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcykge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5tZXRhZGF0YS5yZWxhdGlvbklkcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IF90aGlzLm1ldGFkYXRhVG9BdHRyaWJ1dGUoX3RoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMubmFtZSwgcmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZWNvbmQgY3JlYXRlIHJlbGF0aW9uIGlkIGF0dHJpYnV0ZXMgZm9yIGFsbCByZWxhdGlvbiBpZCBtZXRhZGF0YXMgb2YgYWxsIGpvaW5lZCBvYmplY3RzIChjYXRlZ29yeSBmcm9tIGV4YW1wbGUpXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChqb2luKSB7XG4gICAgICAgICAgICAvLyBlbnN1cmUgdGhpcyBqb2luIGhhcyBhIG1ldGFkYXRhLCBiZWNhdXNlIHJlbGF0aW9uIGlkIGNhbiBvbmx5IHdvcmsgZm9yIHJlYWwgb3JtIGVudGl0aWVzXG4gICAgICAgICAgICBpZiAoIWpvaW4ubWV0YWRhdGEgfHwgam9pbi5tZXRhZGF0YS5pc0p1bmN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEucmVsYXRpb25JZHMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBfdGhpcy5tZXRhZGF0YVRvQXR0cmlidXRlKGpvaW4uYWxpYXMubmFtZSwgcmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIucHJvdG90eXBlLm1ldGFkYXRhVG9BdHRyaWJ1dGUgPSBmdW5jdGlvbiAocGFyZW50QWxpYXNOYW1lLCByZWxhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25JZEF0dHJpYnV0ZSh0aGlzLmV4cHJlc3Npb25NYXAsIHtcbiAgICAgICAgICAgIHJlbGF0aW9uTmFtZTogcGFyZW50QWxpYXNOYW1lICsgXCIuXCIgKyByZWxhdGlvbklkLnJlbGF0aW9uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHk6IHBhcmVudEFsaWFzTmFtZSArIFwiLlwiICsgcmVsYXRpb25JZC5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBhbGlhczogcmVsYXRpb25JZC5hbGlhcyxcbiAgICAgICAgICAgIHF1ZXJ5QnVpbGRlckZhY3Rvcnk6IHJlbGF0aW9uSWQucXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWxhdGlvbklkTWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyO1xufSgpKTtcbmV4cG9ydCB7IFJlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lci5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBEZWxldGVRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgRGVsZXRlUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlbGV0ZVJlc3VsdCgpIHtcbiAgICB9XG4gICAgRGVsZXRlUmVzdWx0LmZyb20gPSBmdW5jdGlvbiAocXVlcnlSZXN1bHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyB0aGlzKCk7XG4gICAgICAgIHJlc3VsdC5yYXcgPSBxdWVyeVJlc3VsdC5yZWNvcmRzO1xuICAgICAgICByZXN1bHQuYWZmZWN0ZWQgPSBxdWVyeVJlc3VsdC5hZmZlY3RlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBEZWxldGVSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IHsgRGVsZXRlUmVzdWx0IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGV0ZVJlc3VsdC5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBJbnNlcnRRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgSW5zZXJ0UmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluc2VydFJlc3VsdCgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnRhaW5zIGluc2VydGVkIGVudGl0eSBpZC5cbiAgICAgICAgICogSGFzIGVudGl0eS1saWtlIHN0cnVjdHVyZSAobm90IGp1c3QgY29sdW1uIGRhdGFiYXNlIG5hbWUgYW5kIHZhbHVlcykuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkZW50aWZpZXJzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZWQgdmFsdWVzIHJldHVybmVkIGJ5IGEgZGF0YWJhc2UuXG4gICAgICAgICAqIEhhcyBlbnRpdHktbGlrZSBzdHJ1Y3R1cmUgKG5vdCBqdXN0IGNvbHVtbiBkYXRhYmFzZSBuYW1lIGFuZCB2YWx1ZXMpLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRNYXBzID0gW107XG4gICAgfVxuICAgIEluc2VydFJlc3VsdC5mcm9tID0gZnVuY3Rpb24gKHF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgdGhpcygpO1xuICAgICAgICByZXN1bHQucmF3ID0gcXVlcnlSZXN1bHQucmF3O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIEluc2VydFJlc3VsdDtcbn0oKSk7XG5leHBvcnQgeyBJbnNlcnRSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5zZXJ0UmVzdWx0LmpzLm1hcFxuIiwiLyoqXG4gKiBSZXN1bHQgb2JqZWN0IHJldHVybmVkIGJ5IFVwZGF0ZVF1ZXJ5QnVpbGRlciBleGVjdXRpb24uXG4gKi9cbnZhciBVcGRhdGVSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVXBkYXRlUmVzdWx0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29udGFpbnMgaW5zZXJ0ZWQgZW50aXR5IGlkLlxuICAgICAgICAgKiBIYXMgZW50aXR5LWxpa2Ugc3RydWN0dXJlIChub3QganVzdCBjb2x1bW4gZGF0YWJhc2UgbmFtZSBhbmQgdmFsdWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIGlkZW50aWZpZXI6IE9iamVjdExpdGVyYWxbXSA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2VuZXJhdGVkIHZhbHVlcyByZXR1cm5lZCBieSBhIGRhdGFiYXNlLlxuICAgICAgICAgKiBIYXMgZW50aXR5LWxpa2Ugc3RydWN0dXJlIChub3QganVzdCBjb2x1bW4gZGF0YWJhc2UgbmFtZSBhbmQgdmFsdWVzKS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkTWFwcyA9IFtdO1xuICAgIH1cbiAgICBVcGRhdGVSZXN1bHQuZnJvbSA9IGZ1bmN0aW9uIChxdWVyeVJlc3VsdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IHRoaXMoKTtcbiAgICAgICAgcmVzdWx0LnJhdyA9IHF1ZXJ5UmVzdWx0LnJlY29yZHM7XG4gICAgICAgIHJlc3VsdC5hZmZlY3RlZCA9IHF1ZXJ5UmVzdWx0LmFmZmVjdGVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFVwZGF0ZVJlc3VsdDtcbn0oKSk7XG5leHBvcnQgeyBVcGRhdGVSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXBkYXRlUmVzdWx0LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqL1xudmFyIExvYWRNYXBJdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvYWRNYXBJdGVtKHBsYWluRW50aXR5LCBtZXRhZGF0YSwgcGFyZW50TG9hZE1hcEl0ZW0sIHJlbGF0aW9uKSB7XG4gICAgICAgIHRoaXMucGxhaW5FbnRpdHkgPSBwbGFpbkVudGl0eTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgICAgICB0aGlzLnBhcmVudExvYWRNYXBJdGVtID0gcGFyZW50TG9hZE1hcEl0ZW07XG4gICAgICAgIHRoaXMucmVsYXRpb24gPSByZWxhdGlvbjtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvYWRNYXBJdGVtLnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb2FkTWFwSXRlbS5wcm90b3R5cGUsIFwiaWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAodGhpcy5wbGFpbkVudGl0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gTG9hZE1hcEl0ZW07XG59KCkpO1xudmFyIExvYWRNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9hZE1hcCgpIHtcbiAgICAgICAgdGhpcy5sb2FkTWFwSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvYWRNYXAucHJvdG90eXBlLCBcIm1haW5Mb2FkTWFwSXRlbVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hcEl0ZW1zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuICFpdGVtLnJlbGF0aW9uICYmICFpdGVtLnBhcmVudExvYWRNYXBJdGVtOyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIExvYWRNYXAucHJvdG90eXBlLmFkZExvYWRNYXAgPSBmdW5jdGlvbiAobmV3TG9hZE1hcCkge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMubG9hZE1hcEl0ZW1zLmZpbmQoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0udGFyZ2V0ID09PSBuZXdMb2FkTWFwLnRhcmdldCAmJiBpdGVtLmlkID09PSBuZXdMb2FkTWFwLmlkOyB9KTtcbiAgICAgICAgaWYgKCFpdGVtKVxuICAgICAgICAgICAgdGhpcy5sb2FkTWFwSXRlbXMucHVzaChuZXdMb2FkTWFwKTtcbiAgICB9O1xuICAgIExvYWRNYXAucHJvdG90eXBlLmZpbGxFbnRpdGllcyA9IGZ1bmN0aW9uICh0YXJnZXQsIGVudGl0aWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5sb2FkTWFwSXRlbXMuZmluZChmdW5jdGlvbiAobG9hZE1hcEl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZE1hcEl0ZW0udGFyZ2V0ID09PSB0YXJnZXQgJiYgbG9hZE1hcEl0ZW0ubWV0YWRhdGEuY29tcGFyZUVudGl0aWVzKGVudGl0eSwgbG9hZE1hcEl0ZW0ucGxhaW5FbnRpdHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXRlbSlcbiAgICAgICAgICAgICAgICBpdGVtLmVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBMb2FkTWFwLnByb3RvdHlwZS5ncm91cEJ5VGFyZ2V0SWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgICAgIHRoaXMubG9hZE1hcEl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGxvYWRNYXBJdGVtKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHMuZmluZChmdW5jdGlvbiAoZ3JvdXApIHsgcmV0dXJuIGdyb3VwLnRhcmdldCA9PT0gbG9hZE1hcEl0ZW0udGFyZ2V0OyB9KTtcbiAgICAgICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBncm91cCA9IHsgdGFyZ2V0OiBsb2FkTWFwSXRlbS50YXJnZXQsIGlkczogW10gfTtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cC5pZHMucHVzaChsb2FkTWFwSXRlbS5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH07XG4gICAgcmV0dXJuIExvYWRNYXA7XG59KCkpO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIHBsYWluIG9sZCBqYXZhc2NyaXB0IG9iamVjdFxuICogRW50aXR5IGlzIGNvbnN0cnVjdGVkIGJhc2VkIG9uIGl0cyBlbnRpdHkgbWV0YWRhdGEuXG4gKi9cbnZhciBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lcihtYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQbGFpbk9iamVjdFRvRGF0YWJhc2VFbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHBsYWluT2JqZWN0LCBtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbG9hZE1hcCwgZmlsbExvYWRNYXA7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGxhaW4gb2JqZWN0IGRvZXMgbm90IGhhdmUgaWQgdGhlbiBub3RoaW5nIHRvIGxvYWQgcmVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhLmhhc0FsbFByaW1hcnlLZXlzKHBsYWluT2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QoXCJHaXZlbiBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHByaW1hcnkgY29sdW1uLCBjYW5ub3QgdHJhbnNmb3JtIGl0IHRvIGRhdGFiYXNlIGVudGl0eS5cIildO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE1hcCA9IG5ldyBMb2FkTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTG9hZE1hcCA9IGZ1bmN0aW9uIChlbnRpdHksIGVudGl0eU1ldGFkYXRhLCBwYXJlbnRMb2FkTWFwSXRlbSwgcmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBMb2FkTWFwSXRlbShlbnRpdHksIGVudGl0eU1ldGFkYXRhLCBwYXJlbnRMb2FkTWFwSXRlbSwgcmVsYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXAuYWRkTG9hZE1hcChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0cmFjdFJlbGF0aW9uVmFsdWVzRnJvbUVudGl0eShlbnRpdHksIG1ldGFkYXRhLnJlbGF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2IgPSBfX3JlYWQoX2EsIDMpLCByZWxhdGlvbiA9IF9iWzBdLCB2YWx1ZSA9IF9iWzFdLCBpbnZlcnNlRW50aXR5TWV0YWRhdGEgPSBfYlsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGxMb2FkTWFwKHZhbHVlLCBpbnZlcnNlRW50aXR5TWV0YWRhdGEsIGl0ZW0sIHJlbGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsTG9hZE1hcChwbGFpbk9iamVjdCwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBhbGwgZW50aXRpZXMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGxvYWQgbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChsb2FkTWFwLmdyb3VwQnlUYXJnZXRJZHMoKS5tYXAoZnVuY3Rpb24gKHRhcmdldFdpdGhJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQnlJZHModGFyZ2V0V2l0aElkcy50YXJnZXQsIHRhcmdldFdpdGhJZHMuaWRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGVudGl0aWVzKSB7IHJldHVybiBsb2FkTWFwLmZpbGxFbnRpdGllcyh0YXJnZXRXaXRoSWRzLnRhcmdldCwgZW50aXRpZXMpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGFsbCBlbnRpdGllcyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgbG9hZCBtYXBcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggZWFjaCBpdGVtIGluIHRoZSBsb2FkIG1hcCBhbmQgc2V0IHRoZWlyIGVudGl0eSByZWxhdGlvbnNoaXAgdXNpbmcgbWV0YWRhdGEgc3RvcmVkIGluIGxvYWQgbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkTWFwLmxvYWRNYXBJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2FkTWFwSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9hZE1hcEl0ZW0ucmVsYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxvYWRNYXBJdGVtLmVudGl0eSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbG9hZE1hcEl0ZW0ucGFyZW50TG9hZE1hcEl0ZW0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkTWFwSXRlbS5yZWxhdGlvbi5pc01hbnlUb01hbnkgfHwgbG9hZE1hcEl0ZW0ucmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2FkTWFwSXRlbS5wYXJlbnRMb2FkTWFwSXRlbS5lbnRpdHlbbG9hZE1hcEl0ZW0ucmVsYXRpb24ucHJvcGVydHlOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdLnB1c2gobG9hZE1hcEl0ZW0uZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNYXBJdGVtLnBhcmVudExvYWRNYXBJdGVtLmVudGl0eVtsb2FkTWFwSXRlbS5yZWxhdGlvbi5wcm9wZXJ0eU5hbWVdID0gbG9hZE1hcEl0ZW0uZW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGxvYWRNYXAubWFpbkxvYWRNYXBJdGVtID8gbG9hZE1hcC5tYWluTG9hZE1hcEl0ZW0uZW50aXR5IDogdW5kZWZpbmVkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGxhaW5PYmplY3RUb0RhdGFiYXNlRW50aXR5VHJhbnNmb3JtZXIuanMubWFwXG4iLCIvKipcbiAqIFRyYW5zZm9ybXMgcGxhaW4gb2xkIGphdmFzY3JpcHQgb2JqZWN0XG4gKiBFbnRpdHkgaXMgY29uc3RydWN0ZWQgYmFzZWQgb24gaXRzIGVudGl0eSBtZXRhZGF0YS5cbiAqL1xudmFyIFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXIoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChuZXdFbnRpdHksIG9iamVjdCwgbWV0YWRhdGEsIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJncm91cEFuZFRyYW5zZm9ybSBlbnRpdHk6XCIsIG5ld0VudGl0eSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ3JvdXBBbmRUcmFuc2Zvcm0gb2JqZWN0OlwiLCBvYmplY3QpO1xuICAgICAgICB0aGlzLmdyb3VwQW5kVHJhbnNmb3JtKG5ld0VudGl0eSwgb2JqZWN0LCBtZXRhZGF0YSwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBuZXdFbnRpdHkpO1xuICAgICAgICByZXR1cm4gbmV3RW50aXR5O1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByaXZhdGUgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBTaW5jZSBkYiByZXR1cm5zIGEgZHVwbGljYXRlZCByb3dzIG9mIHRoZSBkYXRhIHdoZXJlIGFjY3VyYWNpZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGNhbiBiZSBkdXBsaWNhdGVkXG4gICAgICogd2UgbmVlZCB0byBncm91cCBvdXIgcmVzdWx0IGFuZCB3ZSBtdXN0IGhhdmUgc29tZSB1bmlxdWUgaWQgKHByaW1hcnkga2V5IGluIG91ciBjYXNlKVxuICAgICAqL1xuICAgIFBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUuZ3JvdXBBbmRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZW50aXR5LCBvYmplY3QsIG1ldGFkYXRhLCBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZ3JvdXBBbmRUcmFuc2Zvcm0gZW50aXR5OlwiLCBlbnRpdHkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImdyb3VwQW5kVHJhbnNmb3JtIG9iamVjdDpcIiwgb2JqZWN0KTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUgPT09IHZvaWQgMCkgeyBnZXRMYXp5UmVsYXRpb25zUHJvbWlzZVZhbHVlID0gZmFsc2U7IH1cbiAgICAgICAgLy8gY29weSByZWd1bGFyIGNvbHVtbiBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAgICBtZXRhZGF0YS5ub25WaXJ0dWFsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3RDb2x1bW5WYWx1ZSA9IGNvbHVtbi5nZXRFbnRpdHlWYWx1ZShvYmplY3QpO1xuICAgICAgICAgICAgaWYgKG9iamVjdENvbHVtblZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKGVudGl0eSwgb2JqZWN0Q29sdW1uVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gLy8gY29weSByZWxhdGlvbiBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdFxuICAgICAgICBpZiAobWV0YWRhdGEucmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgdmFyIG9iamVjdFJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKG9iamVjdCwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdFJlbGF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uLmlzTWFueVRvTWFueSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0UmVsYXRlZFZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHlSZWxhdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uc2V0RW50aXR5VmFsdWUoZW50aXR5LCBlbnRpdHlSZWxhdGVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFJlbGF0ZWRWYWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChvYmplY3RSZWxhdGVkVmFsdWVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgaXRlbSBmcm9tIHRoZSBtZXJnaW5nIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgZW50aXR5IHdlIG1lcmdlIGludG9cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3RSZWxhdGVkVmFsdWVFbnRpdHkgPSBlbnRpdHlSZWxhdGVkVmFsdWUuZmluZChmdW5jdGlvbiAoZW50aXR5UmVsYXRlZFZhbHVlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEuY29tcGFyZUVudGl0aWVzKG9iamVjdFJlbGF0ZWRWYWx1ZUl0ZW0sIGVudGl0eVJlbGF0ZWRWYWx1ZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdWNoIGl0ZW0gYWxyZWFkeSBleGlzdCB0aGVuIG1lcmdlIG5ldyBkYXRhIGludG8gaXQsIGlmIGl0cyBub3Qgd2UgY3JlYXRlIGEgbmV3IGVudGl0eSBhbmQgbWVyZ2UgaXQgaW50byB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5ID0gcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLmNyZWF0ZSh1bmRlZmluZWQsIHsgZnJvbURlc2VyaWFsaXplcjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlSZWxhdGVkVmFsdWUucHVzaChvYmplY3RSZWxhdGVkVmFsdWVFbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ3JvdXBBbmRUcmFuc2Zvcm0ob2JqZWN0UmVsYXRlZFZhbHVlRW50aXR5LCBvYmplY3RSZWxhdGVkVmFsdWVJdGVtLCByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsIGdldExhenlSZWxhdGlvbnNQcm9taXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJlbGF0ZWQgb2JqZWN0IGlzbid0IGFuIG9iamVjdCAoZGlyZWN0IHJlbGF0aW9uIGlkIGZvciBleGFtcGxlKVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IHNldCBpdCB0byB0aGUgZW50aXR5IHJlbGF0aW9uLCB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIG1vcmUgZnJvbSBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyIHdlIGRvIGl0IG9ubHkgaWYgb3JpZ2luYWwgZW50aXR5IGRvZXMgbm90IGhhdmUgdGhpcyByZWxhdGlvbiBzZXQgdG8gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZnVsbCBvdmVycmlkaW5nIG9mIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0UmVsYXRlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZW50aXR5UmVsYXRlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIG9iamVjdFJlbGF0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRpdHlSZWxhdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVJlbGF0ZWRWYWx1ZSA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5jcmVhdGUodW5kZWZpbmVkLCB7IGZyb21EZXNlcmlhbGl6ZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIGVudGl0eVJlbGF0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ3JvdXBBbmRUcmFuc2Zvcm0oZW50aXR5UmVsYXRlZFZhbHVlLCBvYmplY3RSZWxhdGVkVmFsdWUsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgZ2V0TGF6eVJlbGF0aW9uc1Byb21pc2VWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBQbGFpbk9iamVjdFRvTmV3RW50aXR5VHJhbnNmb3JtZXI7XG59KCkpO1xuZXhwb3J0IHsgUGxhaW5PYmplY3RUb05ld0VudGl0eVRyYW5zZm9ybWVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBsYWluT2JqZWN0VG9OZXdFbnRpdHlUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgT3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbC9Pcm1VdGlsc1wiO1xuaW1wb3J0IHsgRHJpdmVyVXRpbHMgfSBmcm9tIFwiLi4vLi4vZHJpdmVyL0RyaXZlclV0aWxzXCI7XG4vKipcbiAqIFRyYW5zZm9ybXMgcmF3IHNxbCByZXN1bHRzIHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlIGludG8gZW50aXR5IG9iamVjdC5cbiAqIEVudGl0eSBpcyBjb25zdHJ1Y3RlZCBiYXNlZCBvbiBpdHMgZW50aXR5IG1ldGFkYXRhLlxuICovXG52YXIgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyKGV4cHJlc3Npb25NYXAsIGRyaXZlciwgcmF3UmVsYXRpb25JZFJlc3VsdHMsIHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAgPSBleHByZXNzaW9uTWFwO1xuICAgICAgICB0aGlzLmRyaXZlciA9IGRyaXZlcjtcbiAgICAgICAgdGhpcy5yYXdSZWxhdGlvbklkUmVzdWx0cyA9IHJhd1JlbGF0aW9uSWRSZXN1bHRzO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uQ291bnRSZXN1bHRzID0gcmF3UmVsYXRpb25Db3VudFJlc3VsdHM7XG4gICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSBxdWVyeVJ1bm5lcjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFNpbmNlIGRiIHJldHVybnMgYSBkdXBsaWNhdGVkIHJvd3Mgb2YgdGhlIGRhdGEgd2hlcmUgYWNjdXJhY2llcyBvZiB0aGUgc2FtZSBvYmplY3QgY2FuIGJlIGR1cGxpY2F0ZWRcbiAgICAgKiB3ZSBuZWVkIHRvIGdyb3VwIG91ciByZXN1bHQgYW5kIHdlIG11c3QgaGF2ZSBzb21lIHVuaXF1ZSBpZCAocHJpbWFyeSBrZXkgaW4gb3VyIGNhc2UpXG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChyYXdSZXN1bHRzLCBhbGlhcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3VwKHJhd1Jlc3VsdHMsIGFsaWFzKTtcbiAgICAgICAgdmFyIGVudGl0aWVzID0gW107XG4gICAgICAgIGdyb3VwLmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgIHZhciBlbnRpdHkgPSBfdGhpcy50cmFuc2Zvcm1SYXdSZXN1bHRzR3JvdXAocmVzdWx0cywgYWxpYXMpO1xuICAgICAgICAgICAgaWYgKGVudGl0eSAhPT0gdW5kZWZpbmVkICYmICFPYmplY3QudmFsdWVzKGVudGl0eSkuZXZlcnkoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSA9PT0gbnVsbDsgfSkpXG4gICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVudGl0aWVzO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBnaXZlbiByYXcgcmVzdWx0cyBieSBpZHMgb2YgZ2l2ZW4gYWxpYXMuXG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLmdyb3VwID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGFsaWFzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgIGlmIChhbGlhcy5tZXRhZGF0YS50YWJsZVR5cGUgPT09IFwidmlld1wiKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGFsaWFzLm1ldGFkYXRhLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBhbGlhcy5uYW1lLCBjb2x1bW4uZGF0YWJhc2VOYW1lKTsgfSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhbGlhcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhfdGhpcy5kcml2ZXIsIGFsaWFzLm5hbWUsIGNvbHVtbi5kYXRhYmFzZU5hbWUpOyB9KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmF3UmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyYXdSZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5VmFsdWUgPSByYXdSZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5VmFsdWUudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleVZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleVZhbHVlO1xuICAgICAgICAgICAgfSkuam9pbihcIl9cIik7IC8vIHRvZG86IGNoZWNrIHBhcnRpYWxcbiAgICAgICAgICAgIHZhciBpdGVtcyA9IG1hcC5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtcykge1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIFtyYXdSZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2gocmF3UmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIHNldCBvZiBkYXRhIHJlc3VsdHMgaW50byBzaW5nbGUgZW50aXR5LlxuICAgICAqL1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1SYXdSZXN1bHRzR3JvdXAgPSBmdW5jdGlvbiAocmF3UmVzdWx0cywgYWxpYXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gbGV0IGhhc0NvbHVtbnMgPSBmYWxzZTsgLy8gLCBoYXNFbWJlZGRlZENvbHVtbnMgPSBmYWxzZSwgaGFzUGFyZW50Q29sdW1ucyA9IGZhbHNlLCBoYXNQYXJlbnRFbWJlZGRlZENvbHVtbnMgPSBmYWxzZTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gYWxpYXMubWV0YWRhdGE7XG4gICAgICAgIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgZGlzY3JpbWluYXRvclZhbHVlc18xID0gcmF3UmVzdWx0cy5tYXAoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBhbGlhcy5uYW1lLCBhbGlhcy5tZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uLmRhdGFiYXNlTmFtZSldOyB9KTtcbiAgICAgICAgICAgIHZhciBkaXNjcmltaW5hdG9yTWV0YWRhdGEgPSBtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGZ1bmN0aW9uIChjaGlsZEVudGl0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBkaXNjcmltaW5hdG9yVmFsdWVzXzEuZmluZChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSBjaGlsZEVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZTsgfSkgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGlzY3JpbWluYXRvck1ldGFkYXRhKVxuICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gZGlzY3JpbWluYXRvck1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRpdHkgPSB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5pbmRleE9mKFwiY3JlYXRlLXBvam9cIikgIT09IC0xID8ge30gOiBtZXRhZGF0YS5jcmVhdGUodGhpcy5xdWVyeVJ1bm5lciwgeyBmcm9tRGVzZXJpYWxpemVyOiB0cnVlIH0pO1xuICAgICAgICAvLyBnZXQgdmFsdWUgZnJvbSBjb2x1bW5zIHNlbGVjdGlvbnMgYW5kIHB1dCB0aGVtIGludG8gbmV3bHkgY3JlYXRlZCBlbnRpdHlcbiAgICAgICAgdmFyIGhhc0NvbHVtbnMgPSB0aGlzLnRyYW5zZm9ybUNvbHVtbnMocmF3UmVzdWx0cywgYWxpYXMsIGVudGl0eSwgbWV0YWRhdGEpO1xuICAgICAgICB2YXIgaGFzUmVsYXRpb25zID0gdGhpcy50cmFuc2Zvcm1Kb2lucyhyYXdSZXN1bHRzLCBlbnRpdHksIGFsaWFzLCBtZXRhZGF0YSk7XG4gICAgICAgIHZhciBoYXNSZWxhdGlvbklkcyA9IHRoaXMudHJhbnNmb3JtUmVsYXRpb25JZHMocmF3UmVzdWx0cywgYWxpYXMsIGVudGl0eSwgbWV0YWRhdGEpO1xuICAgICAgICB2YXIgaGFzUmVsYXRpb25Db3VudHMgPSB0aGlzLnRyYW5zZm9ybVJlbGF0aW9uQ291bnRzKHJhd1Jlc3VsdHMsIGFsaWFzLCBlbnRpdHkpO1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBzZWxlY3RlZCBjb2x1bW4gdGhlbiByZXR1cm4gdGhpcyBlbnRpdHlcbiAgICAgICAgLy8gc2luY2UgZW50aXR5IG11c3QgaGF2ZSBhdCBsZWFzdCBwcmltYXJ5IGNvbHVtbnMgdG8gYmUgcmVhbGx5IHNlbGVjdGVkIGFuZCB0cmFuc2Zvcm1lZCBpbnRvIGVudGl0eVxuICAgICAgICBpZiAoaGFzQ29sdW1ucylcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYW55IHNlbGVjdGVkIGNvbHVtbiB3ZSBzaG91bGQgbm90IHJldHVybiBlbnRpdHksXG4gICAgICAgIC8vIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugd2hlbiBlbnRpdHkgb25seSBjb250YWluIGEgcHJpbWFyeSBjb2x1bW4gYXMgYSByZWxhdGlvbiB0byBhbm90aGVyIGVudGl0eVxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgaXRzIGFic29sdXRlbHkgcG9zc2libGUgb3VyIGVudGl0eSB0byBub3QgaGF2ZSBhbnkgY29sdW1ucyBleGNlcHQgYSBzaW5nbGUgcmVsYXRpb25cbiAgICAgICAgdmFyIGhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnMgPSBtZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzVmlydHVhbCA9PT0gZmFsc2U7IH0pLmxlbmd0aCA9PT0gMDsgLy8gdG9kbzogY3JlYXRlIG1ldGFkYXRhLmhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnNcbiAgICAgICAgaWYgKGhhc09ubHlWaXJ0dWFsUHJpbWFyeUNvbHVtbnMgJiYgKGhhc1JlbGF0aW9ucyB8fCBoYXNSZWxhdGlvbklkcyB8fCBoYXNSZWxhdGlvbkNvdW50cykpXG4gICAgICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLy8gZ2V0IHZhbHVlIGZyb20gY29sdW1ucyBzZWxlY3Rpb25zIGFuZCBwdXQgdGhlbSBpbnRvIG9iamVjdFxuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1Db2x1bW5zID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGFsaWFzLCBlbnRpdHksIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNEYXRhID0gZmFsc2U7XG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBpZiB0YWJsZSBpbmhlcml0YW5jZSBpcyB1c2VkIG1ha2Ugc3VyZSB0aGlzIGNvbHVtbiBpcyBub3QgY2hpbGQncyBjb2x1bW5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5sZW5ndGggPiAwICYmIG1ldGFkYXRhLmNoaWxkRW50aXR5TWV0YWRhdGFzLm1hcChmdW5jdGlvbiAobWV0YWRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhLnRhcmdldDsgfSkuaW5kZXhPZihjb2x1bW4udGFyZ2V0KSAhPT0gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmF3UmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmRyaXZlciwgYWxpYXMubmFtZSwgY29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgY29sdW1uLmlzVmlydHVhbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB1c2VyIGRvZXMgbm90IHNlbGVjdGVkIHRoZSB3aG9sZSBlbnRpdHkgb3IgaGUgdXNlZCBwYXJ0aWFsIHNlbGVjdGlvbiBhbmQgZG9lcyBub3Qgc2VsZWN0IHRoaXMgcGFydGljdWxhciBjb2x1bW5cbiAgICAgICAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgYWRkIHRoaXMgY29sdW1uIGFuZCBpdHMgdmFsdWUgaW50byB0aGUgZW50aXR5XG4gICAgICAgICAgICBpZiAoIV90aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKGZ1bmN0aW9uIChzZWxlY3QpIHsgcmV0dXJuIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzLm5hbWUgfHwgc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXMubmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aDsgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29sdW1uLnNldEVudGl0eVZhbHVlKGVudGl0eSwgX3RoaXMuZHJpdmVyLnByZXBhcmVIeWRyYXRlZFZhbHVlKHZhbHVlLCBjb2x1bW4pKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgLy8gd2UgZG9uJ3QgbWFyayBpdCBhcyBoYXMgZGF0YSBiZWNhdXNlIGlmIHdlIHdpbGwgaGF2ZSBhbGwgbnVsbHMgaW4gb3VyIG9iamVjdCAtIHdlIGRvbid0IG5lZWQgc3VjaCBvYmplY3RcbiAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYXNEYXRhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBqb2luZWQgZW50aXRpZXMgaW4gdGhlIGdpdmVuIHJhdyByZXN1bHRzIGJ5IGEgZ2l2ZW4gYWxpYXMgYW5kIHN0b3JlcyB0byB0aGUgZ2l2ZW4gKHBhcmVudCkgZW50aXR5XG4gICAgICovXG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybUpvaW5zID0gZnVuY3Rpb24gKHJhd1Jlc3VsdHMsIGVudGl0eSwgYWxpYXMsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBoYXNEYXRhID0gZmFsc2U7XG4gICAgICAgIC8vIGxldCBkaXNjcmltaW5hdG9yVmFsdWU6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIC8vIGlmIChtZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uKVxuICAgICAgICAvLyAgICAgZGlzY3JpbWluYXRvclZhbHVlID0gcmF3UmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsIGFsaWFzLm5hbWUsIGFsaWFzLm1ldGFkYXRhLmRpc2NyaW1pbmF0b3JDb2x1bW4hLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAoam9pbikge1xuICAgICAgICAgICAgLy8gc2tpcCBqb2lucyB3aXRob3V0IG1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoIWpvaW4ubWV0YWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gaWYgc2ltcGxlIGxlZnQgb3IgaW5uZXIgam9pbiB3YXMgcGVyZm9ybWVkIHdpdGhvdXQgc2VsZWN0aW9uIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKCFqb2luLmlzU2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBuZWVkIHRvIGF2b2lkIHNldHRpbmcgcHJvcGVydGllcyB0aGFuIG5vdCBiZWxvbmcgdG8gZW50aXR5IHdoZW4gc2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIHVzZWQuICh0b2RvOiBjaGVjayBpZiB3ZSBzdGlsbCBuZWVkIGl0KVxuICAgICAgICAgICAgLy8gY29uc3QgbWV0YWRhdGEgPSBtZXRhZGF0YS5jaGlsZEVudGl0eU1ldGFkYXRhcy5maW5kKGNoaWxkRW50aXR5TWV0YWRhdGEgPT4gZGlzY3JpbWluYXRvclZhbHVlID09PSBjaGlsZEVudGl0eU1ldGFkYXRhLmRpc2NyaW1pbmF0b3JWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoam9pbi5yZWxhdGlvbiAmJiAhbWV0YWRhdGEucmVsYXRpb25zLmZpbmQoZnVuY3Rpb24gKHJlbGF0aW9uKSB7IHJldHVybiByZWxhdGlvbiA9PT0gam9pbi5yZWxhdGlvbjsgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gc29tZSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoaXMgam9pbiBpcyBmb3IgY3VycmVudCBhbGlhc1xuICAgICAgICAgICAgaWYgKGpvaW4ubWFwVG9Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGlmIChqb2luLm1hcFRvUHJvcGVydHlQYXJlbnRBbGlhcyAhPT0gYWxpYXMubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2luLnJlbGF0aW9uIHx8IGpvaW4ucGFyZW50QWxpYXMgIT09IGFsaWFzLm5hbWUgfHwgam9pbi5yZWxhdGlvblByb3BlcnR5UGF0aCAhPT0gam9pbi5yZWxhdGlvbi5wcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBqb2luZWQgZGF0YSBpbnRvIGVudGl0aWVzXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gX3RoaXMudHJhbnNmb3JtKHJhd1Jlc3VsdHMsIGpvaW4uYWxpYXMpO1xuICAgICAgICAgICAgcmVzdWx0ID0gIWpvaW4uaXNNYW55ID8gcmVzdWx0WzBdIDogcmVzdWx0O1xuICAgICAgICAgICAgcmVzdWx0ID0gIWpvaW4uaXNNYW55ICYmIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdDsgLy8gdGhpcyBpcyBuZWVkZWQgdG8gbWFrZSByZWxhdGlvbnMgdG8gcmV0dXJuIG51bGwgd2hlbiBpdHMgam9pbmVkIGJ1dCBub3RoaW5nIHdhcyBmb3VuZCBpbiB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkgLy8gaWYgbm90aGluZyB3YXMgam9pbmVkIHRoZW4gc2ltcGx5IHJldHVyblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGlmIGpvaW4gd2FzIG1hcHBlZCB0byBzb21lIHByb3BlcnR5IHRoZW4gc2F2ZSByZXN1bHQgdG8gdGhhdCBwcm9wZXJ0eVxuICAgICAgICAgICAgaWYgKGpvaW4ubWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgIGVudGl0eVtqb2luLm1hcFRvUHJvcGVydHlQcm9wZXJ0eU5hbWVdID0gcmVzdWx0OyAvLyB0b2RvOiBmaXggZW1iZWRzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gb3RoZXJ3aXNlIHNldCB0byByZWxhdGlvblxuICAgICAgICAgICAgICAgIGpvaW4ucmVsYXRpb24uc2V0RW50aXR5VmFsdWUoZW50aXR5LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaGFzRGF0YTtcbiAgICB9O1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1SZWxhdGlvbklkcyA9IGZ1bmN0aW9uIChyYXdTcWxSZXN1bHRzLCBhbGlhcywgZW50aXR5LCBtZXRhZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGFzRGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uSWRSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJhd1JlbGF0aW9uSWRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChyYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUucGFyZW50QWxpYXMgIT09IGFsaWFzLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmF3UmVsYXRpb25JZFJlc3VsdC5yZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uO1xuICAgICAgICAgICAgdmFyIHZhbHVlTWFwID0gX3RoaXMuY3JlYXRlVmFsdWVNYXBGcm9tSm9pbkNvbHVtbnMocmVsYXRpb24sIHJhd1JlbGF0aW9uSWRSZXN1bHQucmVsYXRpb25JZEF0dHJpYnV0ZS5wYXJlbnRBbGlhcywgcmF3U3FsUmVzdWx0cyk7XG4gICAgICAgICAgICBpZiAodmFsdWVNYXAgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZU1hcCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgaWRNYXBzID0gcmF3UmVsYXRpb25JZFJlc3VsdC5yZXN1bHRzLm1hcChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudGl0eVByaW1hcnlJZHMgPSBfdGhpcy5leHRyYWN0RW50aXR5UHJpbWFyeUlkcyhyZWxhdGlvbiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoT3JtVXRpbHMuY29tcGFyZUlkcyhlbnRpdHlQcmltYXJ5SWRzLCB2YWx1ZU1hcCkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbnM7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEucHJpbWFyeUNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1ucyA9IHJlbGF0aW9uLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKGpvaW5Db2x1bW4gPT4gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uISk7IC8vLmludmVyc2VFbnRpdHlNZXRhZGF0YS5wcmltYXJ5Q29sdW1ucy5tYXAoam9pbkNvbHVtbiA9PiBqb2luQ29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE1hbnlUb01hbnlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzT3duaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGlkTWFwID0gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGlkTWFwLCBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0W2NvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbCAmJiBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiAmJiBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eU5hbWUgIT09IGNvbHVtbi5wcm9wZXJ0eU5hbWUpIC8vIGlmIGNvbHVtbiBpcyBhIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMubWVyZ2VEZWVwKGlkTWFwLCBjb2x1bW4uY3JlYXRlVmFsdWVNYXAodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5yZWZlcmVuY2VkQ29sdW1uKSAvLyBpZiBjb2x1bW4gaXMgYSByZWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3JtVXRpbHMubWVyZ2VEZWVwKGlkTWFwLCBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5jcmVhdGVWYWx1ZU1hcCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiByYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUuZGlzYWJsZU1peGVkTWFwID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShpZE1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc1swXS5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGlkTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaWRNYXA7XG4gICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSByYXdSZWxhdGlvbklkUmVzdWx0LnJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eVByb3BlcnR5UGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICB2YXIgbWFwVG9Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzLCBtYXAsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAmJiBwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXBbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXBUb1Byb3BlcnR5KHByb3BlcnRpZXMsIG1hcFtwcm9wZXJ0eV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc09uZVRvT25lIHx8IHJlbGF0aW9uLmlzTWFueVRvT25lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkTWFwc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFRvUHJvcGVydHkocHJvcGVydGllcywgZW50aXR5LCBpZE1hcHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBUb1Byb3BlcnR5KHByb3BlcnRpZXMsIGVudGl0eSwgaWRNYXBzKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhhc0RhdGE7XG4gICAgfTtcbiAgICBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtUmVsYXRpb25Db3VudHMgPSBmdW5jdGlvbiAocmF3U3FsUmVzdWx0cywgYWxpYXMsIGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGFzRGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJhd1JlbGF0aW9uQ291bnRSZXN1bHRzXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyYXdSZWxhdGlvbkNvdW50UmVzdWx0KSB7IHJldHVybiByYXdSZWxhdGlvbkNvdW50UmVzdWx0LnJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucGFyZW50QWxpYXMgPT09IGFsaWFzLm5hbWU7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmF3UmVsYXRpb25Db3VudFJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmF3UmVsYXRpb25Db3VudFJlc3VsdC5yZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uO1xuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUNvbHVtbk5hbWU7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VDb2x1bW5OYW1lID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lOyAvLyB0b2RvOiBmaXggam9pbkNvbHVtbnNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUNvbHVtbk5hbWUgPSByZWxhdGlvbi5pc093bmluZyA/IHJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lIDogcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zWzBdLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUNvbHVtblZhbHVlID0gcmF3U3FsUmVzdWx0c1swXVtEcml2ZXJVdGlscy5idWlsZEFsaWFzKF90aGlzLmRyaXZlciwgYWxpYXMubmFtZSwgcmVmZXJlbmNlQ29sdW1uTmFtZSldOyAvLyB3ZSB1c2UgemVybyBpbmRleCBzaW5jZSBpdHMgZ3JvdXBlZCBkYXRhIC8vIHRvZG86IHNlbGVjdGlvbiB3aXRoIGFsaWFzIGZvciBlbnRpdHkgY29sdW1ucyB3b250IHdvcmtcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDb2x1bW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHJlZmVyZW5jZUNvbHVtblZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZW50aXR5W3Jhd1JlbGF0aW9uQ291bnRSZXN1bHQucmVsYXRpb25Db3VudEF0dHJpYnV0ZS5tYXBUb1Byb3BlcnR5UHJvcGVydHlOYW1lXSA9IDA7XG4gICAgICAgICAgICAgICAgcmF3UmVsYXRpb25Db3VudFJlc3VsdC5yZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0W1wicGFyZW50SWRcIl0gPT09IHJlZmVyZW5jZUNvbHVtblZhbHVlOyB9KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVudGl0eVtyYXdSZWxhdGlvbkNvdW50UmVzdWx0LnJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eVByb3BlcnR5TmFtZV0gPSBwYXJzZUludChyZXN1bHRbXCJjbnRcIl0pO1xuICAgICAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBoYXNEYXRhO1xuICAgIH07XG4gICAgUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXIucHJvdG90eXBlLmNyZWF0ZVZhbHVlTWFwRnJvbUpvaW5Db2x1bW5zID0gZnVuY3Rpb24gKHJlbGF0aW9uLCBwYXJlbnRBbGlhcywgcmF3U3FsUmVzdWx0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29sdW1ucztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgY29sdW1ucyA9IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uICh2YWx1ZU1hcCwgY29sdW1uKSB7XG4gICAgICAgICAgICByYXdTcWxSZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHJhd1NxbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb09uZSB8fCByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUocmF3U3FsUmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBwYXJlbnRBbGlhcywgY29sdW1uLmRhdGFiYXNlTmFtZSldLCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSBfdGhpcy5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUocmF3U3FsUmVzdWx0W0RyaXZlclV0aWxzLmJ1aWxkQWxpYXMoX3RoaXMuZHJpdmVyLCBwYXJlbnRBbGlhcywgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV0sIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIFJhd1NxbFJlc3VsdHNUb0VudGl0eVRyYW5zZm9ybWVyLnByb3RvdHlwZS5leHRyYWN0RW50aXR5UHJpbWFyeUlkcyA9IGZ1bmN0aW9uIChyZWxhdGlvbiwgcmVsYXRpb25JZFJhd1Jlc3VsdCkge1xuICAgICAgICB2YXIgY29sdW1ucztcbiAgICAgICAgaWYgKHJlbGF0aW9uLmlzTWFueVRvT25lIHx8IHJlbGF0aW9uLmlzT25lVG9PbmVPd25lcikge1xuICAgICAgICAgICAgY29sdW1ucyA9IHJlbGF0aW9uLmVudGl0eU1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkgfHwgcmVsYXRpb24uaXNPbmVUb09uZU5vdE93bmVyKSB7XG4gICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gcmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7IHJldHVybiBqb2luQ29sdW1uOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24uaW52ZXJzZUpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikgeyByZXR1cm4gam9pbkNvbHVtbjsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uIChkYXRhLCBjb2x1bW4pIHtcbiAgICAgICAgICAgIGRhdGFbY29sdW1uLmRhdGFiYXNlTmFtZV0gPSByZWxhdGlvbklkUmF3UmVzdWx0W2NvbHVtbi5kYXRhYmFzZU5hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9O1xuICAgIHJldHVybiBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lcjtcbn0oKSk7XG5leHBvcnQgeyBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lciB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lci5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVhZCwgX19zcHJlYWRBcnJheSwgX192YWx1ZXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4uL2RyaXZlci9RdWVyeVwiO1xuaW1wb3J0IHsgU3FsSW5NZW1vcnkgfSBmcm9tIFwiLi4vZHJpdmVyL1NxbEluTWVtb3J5XCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi91dGlsL09ybVV0aWxzXCI7XG52YXIgQmFzZVF1ZXJ5UnVubmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VRdWVyeVJ1bm5lcigpIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQdWJsaWMgUHJvcGVydGllc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29ubmVjdGlvbiBmb3IgdGhpcyBxdWVyeSBydW5uZXIgaXMgcmVsZWFzZWQuXG4gICAgICAgICAqIE9uY2UgaXRzIHJlbGVhc2VkLCBxdWVyeSBydW5uZXIgY2Fubm90IHJ1biBxdWVyaWVzIGFueW1vcmUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUmVsZWFzZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcmVzIHRlbXBvcmFyaWx5IHVzZXIgZGF0YS5cbiAgICAgICAgICogVXNlZnVsIGZvciBzaGFyaW5nIGRhdGEgd2l0aCBzdWJzY3JpYmVycy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsIHN5bmNocm9uaXplZCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2FkZWRUYWJsZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbCBzeW5jaHJvbml6ZWQgdmlld3MgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sb2FkZWRWaWV3cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIHNwZWNpYWwgcXVlcnkgcnVubmVyIG1vZGUgaW4gd2hpY2ggc3FsIHF1ZXJpZXMgd29uJ3QgYmUgZXhlY3V0ZWQgaXMgZW5hYmxlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3FsTWVtb3J5TW9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3FsLXMgc3RvcmVkIGlmIFwic3FsIGluIG1lbW9yeVwiIG1vZGUgaXMgZW5hYmxlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3FsSW5NZW1vcnkgPSBuZXcgU3FsSW5NZW1vcnkoKTtcbiAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzID0ge307XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBMb2FkcyBnaXZlbiB0YWJsZSdzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVGFibGVzKFt0YWJsZVBhdGhdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFRhYmxlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmxvYWRlZFRhYmxlcy5sZW5ndGggPiAwID8gdGhpcy5sb2FkZWRUYWJsZXNbMF0gOiB1bmRlZmluZWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIGFsbCB0YWJsZXMgKHdpdGggZ2l2ZW4gbmFtZXMpIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0VGFibGVzID0gZnVuY3Rpb24gKHRhYmxlTmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGFibGVOYW1lcykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmxvYWRUYWJsZXModGFibGVOYW1lcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IFxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjYWNoZSBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG5ldyBjYXNlICYgaXNuJ3QgdXNlZCBhbnl3aGVyZSBlbHNlIGFueXdheS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9iLnNlbnQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFRhYmxlcyh0YWJsZU5hbWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFRhYmxlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmxvYWRlZFRhYmxlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgZ2l2ZW4gdmlldydzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRWaWV3ID0gZnVuY3Rpb24gKHZpZXdQYXRoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMubG9hZFZpZXdzKFt2aWV3UGF0aF0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubG9hZGVkVmlld3MgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5sb2FkZWRWaWV3cy5sZW5ndGggPiAwID8gdGhpcy5sb2FkZWRWaWV3c1swXSA6IHVuZGVmaW5lZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTG9hZHMgZ2l2ZW4gdmlldydzIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRWaWV3cyA9IGZ1bmN0aW9uICh2aWV3UGF0aHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVmlld3Modmlld1BhdGhzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxvYWRlZFZpZXdzID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMubG9hZGVkVmlld3NdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3BlY2lhbCBxdWVyeSBydW5uZXIgbW9kZSBpbiB3aGljaCBzcWwgcXVlcmllcyB3b24ndCBiZSBleGVjdXRlZCxcbiAgICAgKiBpbnN0ZWFkIHRoZXkgd2lsbCBiZSBtZW1vcml6ZWQgaW50byBhIHNwZWNpYWwgdmFyaWFibGUgaW5zaWRlIHF1ZXJ5IHJ1bm5lci5cbiAgICAgKiBZb3UgY2FuIGdldCBtZW1vcml6ZWQgc3FsIHVzaW5nIGdldE1lbW9yeVNxbCgpIG1ldGhvZC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmVuYWJsZVNxbE1lbW9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zcWxJbk1lbW9yeSA9IG5ldyBTcWxJbk1lbW9yeSgpO1xuICAgICAgICB0aGlzLnNxbE1lbW9yeU1vZGUgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgc3BlY2lhbCBxdWVyeSBydW5uZXIgbW9kZSBpbiB3aGljaCBzcWwgcXVlcmllcyB3b24ndCBiZSBleGVjdXRlZFxuICAgICAqIHN0YXJ0ZWQgYnkgY2FsbGluZyBlbmFibGVTcWxNZW1vcnkoKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBQcmV2aW91c2x5IG1lbW9yaXplZCBzcWwgd2lsbCBiZSBmbHVzaGVkLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZGlzYWJsZVNxbE1lbW9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zcWxJbk1lbW9yeSA9IG5ldyBTcWxJbk1lbW9yeSgpO1xuICAgICAgICB0aGlzLnNxbE1lbW9yeU1vZGUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgYWxsIG1lbW9yaXplZCBzcWxzLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuY2xlYXJTcWxNZW1vcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3FsSW5NZW1vcnkgPSBuZXcgU3FsSW5NZW1vcnkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgc3FsIHN0b3JlZCBpbiB0aGUgbWVtb3J5LiBQYXJhbWV0ZXJzIGluIHRoZSBzcWwgYXJlIGFscmVhZHkgcmVwbGFjZWQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRNZW1vcnlTcWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNxbEluTWVtb3J5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdXAgc3FsIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5leGVjdXRlTWVtb3J5VXBTcWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBxdWVyeSwgcGFyYW1ldGVycywgZV8xXzE7XG4gICAgICAgICAgICB2YXIgZV8xLCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMCwgNSwgNiwgN10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLnNxbEluTWVtb3J5LnVwUXVlcmllcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gX2IudmFsdWUsIHF1ZXJ5ID0gX2MucXVlcnksIHBhcmFtZXRlcnMgPSBfYy5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMV8xID0gX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2QgPSBfYS5yZXR1cm4pKSBfZC5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGRvd24gc3FsIHF1ZXJpZXMuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5leGVjdXRlTWVtb3J5RG93blNxbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIHF1ZXJ5LCBwYXJhbWV0ZXJzLCBlXzJfMTtcbiAgICAgICAgICAgIHZhciBlXzIsIF9kO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFswLCA1LCA2LCA3XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuc3FsSW5NZW1vcnkuZG93blF1ZXJpZXMucmV2ZXJzZSgpKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MgPSBfYi52YWx1ZSwgcXVlcnkgPSBfYy5xdWVyeSwgcGFyYW1ldGVycyA9IF9jLnBhcmFtZXRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5KHF1ZXJ5LCBwYXJhbWV0ZXJzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfZCA9IF9hLnJldHVybikpIF9kLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRSZXBsaWNhdGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGU7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJvdGVjdGVkIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0cyB2aWV3IGZyb20gcHJldmlvdXNseSBsb2FkZWQgdmlld3MsIG90aGVyd2lzZSBsb2FkcyBpdCBmcm9tIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuZ2V0Q2FjaGVkVmlldyA9IGZ1bmN0aW9uICh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmlldywgZm91bmRWaWV3cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSB0aGlzLmxvYWRlZFZpZXdzLmZpbmQoZnVuY3Rpb24gKHZpZXcpIHsgcmV0dXJuIHZpZXcubmFtZSA9PT0gdmlld05hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHZpZXddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVmlld3MoW3ZpZXdOYW1lXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZpZXdzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkVmlld3MucHVzaChmb3VuZFZpZXdzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZm91bmRWaWV3c1swXV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVmlldyBcXFwiXCIgKyB2aWV3TmFtZSArIFwiXFxcIiBkb2VzIG5vdCBleGlzdC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyB0YWJsZSBmcm9tIHByZXZpb3VzbHkgbG9hZGVkIHRhYmxlcywgb3RoZXJ3aXNlIGxvYWRzIGl0IGZyb20gZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRDYWNoZWRUYWJsZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlUGF0aF8xLCB0YWJsZSwgZm91bmRUYWJsZXMsIGZvdW5kVGFibGVQYXRoXzEsIGNhY2hlZFRhYmxlO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZU5hbWUgaW4gdGhpcy5jYWNoZWRUYWJsZVBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQYXRoXzEgPSB0aGlzLmNhY2hlZFRhYmxlUGF0aHNbdGFibGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXMubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSB0YWJsZVBhdGhfMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0YWJsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5sb2FkVGFibGVzKFt0YWJsZU5hbWVdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFibGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kVGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRhYmxlUGF0aF8xID0gdGhpcy5nZXRUYWJsZVBhdGgoZm91bmRUYWJsZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFRhYmxlID0gdGhpcy5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IGZvdW5kVGFibGVQYXRoXzE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzW3RhYmxlTmFtZV0gPSB0aGlzLmdldFRhYmxlUGF0aChmb3VuZFRhYmxlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkVGFibGVzLnB1c2goZm91bmRUYWJsZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZm91bmRUYWJsZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNhY2hlZFRhYmxlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiVGFibGUgXFxcIlwiICsgdGFibGVOYW1lICsgXCJcXFwiIGRvZXMgbm90IGV4aXN0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBsb2FkZWQgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VkIHRhYmxlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUucmVwbGFjZUNhY2hlZFRhYmxlID0gZnVuY3Rpb24gKHRhYmxlLCBjaGFuZ2VkVGFibGUpIHtcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBvbGRUYWJsZVBhdGggPSB0aGlzLmdldFRhYmxlUGF0aCh0YWJsZSk7XG4gICAgICAgIHZhciBmb3VuZFRhYmxlID0gdGhpcy5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAobG9hZGVkVGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aChsb2FkZWRUYWJsZSkgPT09IG9sZFRhYmxlUGF0aDsgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9va3VwIGNhY2hlLi5cbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmVudHJpZXModGhpcy5jYWNoZWRUYWJsZVBhdGhzKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQoX2MudmFsdWUsIDIpLCBrZXkgPSBfZFswXSwgY2FjaGVkUGF0aCA9IF9kWzFdO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRQYXRoID09PSBvbGRUYWJsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRUYWJsZVBhdGhzW2tleV0gPSB0aGlzLmdldFRhYmxlUGF0aChjaGFuZ2VkVGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zXzEpIHsgZV8zID0geyBlcnJvcjogZV8zXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZFRhYmxlKSB7XG4gICAgICAgICAgICBmb3VuZFRhYmxlLmRhdGFiYXNlID0gY2hhbmdlZFRhYmxlLmRhdGFiYXNlO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5zY2hlbWEgPSBjaGFuZ2VkVGFibGUuc2NoZW1hO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5uYW1lID0gY2hhbmdlZFRhYmxlLm5hbWU7XG4gICAgICAgICAgICBmb3VuZFRhYmxlLmNvbHVtbnMgPSBjaGFuZ2VkVGFibGUuY29sdW1ucztcbiAgICAgICAgICAgIGZvdW5kVGFibGUuaW5kaWNlcyA9IGNoYW5nZWRUYWJsZS5pbmRpY2VzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5mb3JlaWduS2V5cyA9IGNoYW5nZWRUYWJsZS5mb3JlaWduS2V5cztcbiAgICAgICAgICAgIGZvdW5kVGFibGUudW5pcXVlcyA9IGNoYW5nZWRUYWJsZS51bmlxdWVzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5jaGVja3MgPSBjaGFuZ2VkVGFibGUuY2hlY2tzO1xuICAgICAgICAgICAgZm91bmRUYWJsZS5qdXN0Q3JlYXRlZCA9IGNoYW5nZWRUYWJsZS5qdXN0Q3JlYXRlZDtcbiAgICAgICAgICAgIGZvdW5kVGFibGUuZW5naW5lID0gY2hhbmdlZFRhYmxlLmVuZ2luZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5nZXRUYWJsZVBhdGggPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnBhcnNlVGFibGVOYW1lKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKHBhcnNlZC50YWJsZU5hbWUsIHBhcnNlZC5zY2hlbWEsIHBhcnNlZC5kYXRhYmFzZSk7XG4gICAgfTtcbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmJ1aWxkVGFibGVOYW1lKFwidHlwZW9ybV9tZXRhZGF0YVwiLCBvcHRpb25zLnNjaGVtYSwgb3B0aW9ucy5kYXRhYmFzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgU1FMIHF1ZXJ5IHRvIGluc2VydCBhIHJlY29yZCBpbnRvIFwidHlwZW9ybV9tZXRhZGF0YVwiIHRhYmxlLlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IF9hLmRhdGFiYXNlLCBzY2hlbWEgPSBfYS5zY2hlbWEsIHRhYmxlID0gX2EudGFibGUsIHR5cGUgPSBfYS50eXBlLCBuYW1lID0gX2EubmFtZSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkKHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgLmluc2VydCgpXG4gICAgICAgICAgICAuaW50byh0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpKVxuICAgICAgICAgICAgLnZhbHVlcyh7IGRhdGFiYXNlOiBkYXRhYmFzZSwgc2NoZW1hOiBzY2hlbWEsIHRhYmxlOiB0YWJsZSwgdHlwZTogdHlwZSwgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pXG4gICAgICAgICAgICAuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKCksIDIpLCBxdWVyeSA9IF9iWzBdLCBwYXJhbWV0ZXJzID0gX2JbMV07XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkocXVlcnksIHBhcmFtZXRlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIFNRTCBxdWVyeSB0byBkZWxldGUgYSByZWNvcmQgZnJvbSBcInR5cGVvcm1fbWV0YWRhdGFcIiB0YWJsZS5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgZGF0YWJhc2UgPSBfYS5kYXRhYmFzZSwgc2NoZW1hID0gX2Euc2NoZW1hLCB0YWJsZSA9IF9hLnRhYmxlLCB0eXBlID0gX2EudHlwZSwgbmFtZSA9IF9hLm5hbWU7XG4gICAgICAgIHZhciBxYiA9IHRoaXMuY29ubmVjdGlvbi5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgICAgICAgdmFyIGRlbGV0ZVFiID0gcWIuZGVsZXRlKClcbiAgICAgICAgICAgIC5mcm9tKHRoaXMuZ2V0VHlwZW9ybU1ldGFkYXRhVGFibGVOYW1lKCkpXG4gICAgICAgICAgICAud2hlcmUocWIuZXNjYXBlKFwidHlwZVwiKSArIFwiID0gOnR5cGVcIiwgeyB0eXBlOiB0eXBlIH0pXG4gICAgICAgICAgICAuYW5kV2hlcmUocWIuZXNjYXBlKFwibmFtZVwiKSArIFwiID0gOm5hbWVcIiwgeyBuYW1lOiBuYW1lIH0pO1xuICAgICAgICBpZiAoZGF0YWJhc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZVFiLmFuZFdoZXJlKHFiLmVzY2FwZShcImRhdGFiYXNlXCIpICsgXCIgPSA6ZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogZGF0YWJhc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgZGVsZXRlUWIuYW5kV2hlcmUocWIuZXNjYXBlKFwic2NoZW1hXCIpICsgXCIgPSA6c2NoZW1hXCIsIHsgc2NoZW1hOiBzY2hlbWEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICBkZWxldGVRYi5hbmRXaGVyZShxYi5lc2NhcGUoXCJ0YWJsZVwiKSArIFwiID0gOnRhYmxlXCIsIHsgdGFibGU6IHRhYmxlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYiA9IF9fcmVhZChkZWxldGVRYi5nZXRRdWVyeUFuZFBhcmFtZXRlcnMoKSwgMiksIHF1ZXJ5ID0gX2JbMF0sIHBhcmFtZXRlcnMgPSBfYlsxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYXQgbGVhc3Qgb25lIG9mIGNvbHVtbiBwcm9wZXJ0aWVzIHdhcyBjaGFuZ2VkLlxuICAgICAqIERvZXMgbm90IGNoZWNrcyBjb2x1bW4gdHlwZSwgbGVuZ3RoIGFuZCBhdXRvaW5jcmVtZW50LCBiZWNhdXNlIHRoZXNlIHByb3BlcnRpZXMgY2hhbmdlcyBzZXBhcmF0ZWx5LlxuICAgICAqL1xuICAgIEJhc2VRdWVyeVJ1bm5lci5wcm90b3R5cGUuaXNDb2x1bW5DaGFuZ2VkID0gZnVuY3Rpb24gKG9sZENvbHVtbiwgbmV3Q29sdW1uLCBjaGVja0RlZmF1bHQsIGNoZWNrQ29tbWVudCkge1xuICAgICAgICAvLyB0aGlzIGxvZ3MgbmVlZCB0byBkZWJ1ZyBpc3N1ZXMgaW4gY29sdW1uIGNoYW5nZSBkZXRlY3Rpb24uIERvIG5vdCBkZWxldGUgaXQhXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hhcnNldCAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jaGFyc2V0ICE9PSBuZXdDb2x1bW4uY2hhcnNldCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jaGFyc2V0LCBuZXdDb2x1bW4uY2hhcnNldCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY29sbGF0aW9uIC0tLS0tLS0tLS0tLS0tLVwiKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLmNvbGxhdGlvbiAhPT0gbmV3Q29sdW1uLmNvbGxhdGlvbik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5jb2xsYXRpb24sIG5ld0NvbHVtbi5jb2xsYXRpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInByZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5wcmVjaXNpb24gIT09IG5ld0NvbHVtbi5wcmVjaXNpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4ucHJlY2lzaW9uLCBuZXdDb2x1bW4ucHJlY2lzaW9uKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJzY2FsZSAtLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG9sZENvbHVtbi5zY2FsZSAhPT0gbmV3Q29sdW1uLnNjYWxlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLnNjYWxlLCBuZXdDb2x1bW4uc2NhbGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlZmF1bHQgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygoY2hlY2tEZWZhdWx0ICYmIG9sZENvbHVtbi5kZWZhdWx0ICE9PSBuZXdDb2x1bW4uZGVmYXVsdCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uZGVmYXVsdCwgbmV3Q29sdW1uLmRlZmF1bHQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzTnVsbGFibGUgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uaXNOdWxsYWJsZSAhPT0gbmV3Q29sdW1uLmlzTnVsbGFibGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uaXNOdWxsYWJsZSwgbmV3Q29sdW1uLmlzTnVsbGFibGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNvbW1lbnQgLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygoY2hlY2tDb21tZW50ICYmIG9sZENvbHVtbi5jb21tZW50ICE9PSBuZXdDb2x1bW4uY29tbWVudCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhvbGRDb2x1bW4uY29tbWVudCwgbmV3Q29sdW1uLmNvbW1lbnQpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVudW0gLS0tLS0tLS0tLS0tLS0tXCIpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyghT3JtVXRpbHMuaXNBcnJheXNFcXVhbChvbGRDb2x1bW4uZW51bSB8fCBbXSwgbmV3Q29sdW1uLmVudW0gfHwgW10pKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2cob2xkQ29sdW1uLmVudW0sIG5ld0NvbHVtbi5lbnVtKTtcbiAgICAgICAgcmV0dXJuIG9sZENvbHVtbi5jaGFyc2V0ICE9PSBuZXdDb2x1bW4uY2hhcnNldFxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLmNvbGxhdGlvbiAhPT0gbmV3Q29sdW1uLmNvbGxhdGlvblxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLnByZWNpc2lvbiAhPT0gbmV3Q29sdW1uLnByZWNpc2lvblxuICAgICAgICAgICAgfHwgb2xkQ29sdW1uLnNjYWxlICE9PSBuZXdDb2x1bW4uc2NhbGVcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi53aWR0aCAhPT0gbmV3Q29sdW1uLndpZHRoIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi56ZXJvZmlsbCAhPT0gbmV3Q29sdW1uLnplcm9maWxsIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi51bnNpZ25lZCAhPT0gbmV3Q29sdW1uLnVuc2lnbmVkIC8vIE15U1FMIG9ubHlcbiAgICAgICAgICAgIHx8IG9sZENvbHVtbi5hc0V4cHJlc3Npb24gIT09IG5ld0NvbHVtbi5hc0V4cHJlc3Npb24gLy8gTXlTUUwgb25seVxuICAgICAgICAgICAgfHwgKGNoZWNrRGVmYXVsdCAmJiBvbGRDb2x1bW4uZGVmYXVsdCAhPT0gbmV3Q29sdW1uLmRlZmF1bHQpXG4gICAgICAgICAgICB8fCBvbGRDb2x1bW4ub25VcGRhdGUgIT09IG5ld0NvbHVtbi5vblVwZGF0ZSAvLyBNeVNRTCBvbmx5XG4gICAgICAgICAgICB8fCBvbGRDb2x1bW4uaXNOdWxsYWJsZSAhPT0gbmV3Q29sdW1uLmlzTnVsbGFibGVcbiAgICAgICAgICAgIHx8IChjaGVja0NvbW1lbnQgJiYgb2xkQ29sdW1uLmNvbW1lbnQgIT09IG5ld0NvbHVtbi5jb21tZW50KVxuICAgICAgICAgICAgfHwgIU9ybVV0aWxzLmlzQXJyYXlzRXF1YWwob2xkQ29sdW1uLmVudW0gfHwgW10sIG5ld0NvbHVtbi5lbnVtIHx8IFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gbGVuZ3RoIGlzIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5pc0RlZmF1bHRDb2x1bW5MZW5ndGggPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgbGVuZ3RoKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YUxlbmd0aCA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZ2V0Q29sdW1uTGVuZ3RoKGNvbHVtbk1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGFMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ubGVuZ3RoLnRvU3RyaW5nKCkgPT09IGxlbmd0aC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gcHJlY2lzaW9uIGlzIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgQmFzZVF1ZXJ5UnVubmVyLnByb3RvdHlwZS5pc0RlZmF1bHRDb2x1bW5QcmVjaXNpb24gPSBmdW5jdGlvbiAodGFibGUsIGNvbHVtbiwgcHJlY2lzaW9uKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSAmJiBjb2x1bW5NZXRhZGF0YS5wcmVjaXNpb24gIT09IG51bGwgJiYgY29sdW1uTWV0YWRhdGEucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNcbiAgICAgICAgICAgICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV1cbiAgICAgICAgICAgICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ucHJlY2lzaW9uICE9PSBudWxsXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YVR5cGVEZWZhdWx0c1tjb2x1bW4udHlwZV0ucHJlY2lzaW9uID09PSBwcmVjaXNpb247XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gc2NhbGUgaXMgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmlzRGVmYXVsdENvbHVtblNjYWxlID0gZnVuY3Rpb24gKHRhYmxlLCBjb2x1bW4sIHNjYWxlKSB7XG4gICAgICAgIC8vIGlmIHRhYmxlIGhhdmUgbWV0YWRhdGEsIHdlIGNoZWNrIGlmIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gY29sdW1uIG1ldGFkYXRhXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uaGFzTWV0YWRhdGEodGFibGUubmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY29ubmVjdGlvbi5nZXRNZXRhZGF0YSh0YWJsZS5uYW1lKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5NZXRhZGF0YSA9IG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoRGF0YWJhc2VOYW1lKGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSAmJiBjb2x1bW5NZXRhZGF0YS5zY2FsZSAhPT0gbnVsbCAmJiBjb2x1bW5NZXRhZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnNjYWxlICE9PSBudWxsXG4gICAgICAgICAgICAmJiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLmRhdGFUeXBlRGVmYXVsdHNbY29sdW1uLnR5cGVdLnNjYWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5kYXRhVHlwZURlZmF1bHRzW2NvbHVtbi50eXBlXS5zY2FsZSA9PT0gc2NhbGU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCB1c2VkIHNwZWNpYWwgZm9yIHNjaGVtYSBidWlsZC5cbiAgICAgKi9cbiAgICBCYXNlUXVlcnlSdW5uZXIucHJvdG90eXBlLmV4ZWN1dGVRdWVyaWVzID0gZnVuY3Rpb24gKHVwUXVlcmllcywgZG93blF1ZXJpZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVwUXVlcmllc18xLCB1cFF1ZXJpZXNfMV8xLCBfYSwgcXVlcnksIHBhcmFtZXRlcnMsIGVfNF8xO1xuICAgICAgICAgICAgdmFyIF9iLCBfYywgZV80LCBfZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cFF1ZXJpZXMgaW5zdGFuY2VvZiBRdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXMgPSBbdXBRdWVyaWVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3duUXVlcmllcyBpbnN0YW5jZW9mIFF1ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzID0gW2Rvd25RdWVyaWVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYiA9IHRoaXMuc3FsSW5NZW1vcnkudXBRdWVyaWVzKS5wdXNoLmFwcGx5KF9iLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodXBRdWVyaWVzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChfYyA9IHRoaXMuc3FsSW5NZW1vcnkuZG93blF1ZXJpZXMpLnB1c2guYXBwbHkoX2MsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChkb3duUXVlcmllcyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzcWwtaW4tbWVtb3J5IG1vZGUgaXMgZW5hYmxlZCB0aGVuIHNpbXBseSBzdG9yZSBzcWwgaW4gbWVtb3J5IGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNxbE1lbW9yeU1vZGUgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cFF1ZXJpZXNfMSA9IF9fdmFsdWVzKHVwUXVlcmllcyksIHVwUXVlcmllc18xXzEgPSB1cFF1ZXJpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXVwUXVlcmllc18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHVwUXVlcmllc18xXzEudmFsdWUsIHF1ZXJ5ID0gX2EucXVlcnksIHBhcmFtZXRlcnMgPSBfYS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwUXVlcmllc18xXzEgPSB1cFF1ZXJpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV80XzEgPSBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwUXVlcmllc18xXzEgJiYgIXVwUXVlcmllc18xXzEuZG9uZSAmJiAoX2QgPSB1cFF1ZXJpZXNfMS5yZXR1cm4pKSBfZC5jYWxsKHVwUXVlcmllc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlUXVlcnlSdW5uZXI7XG59KCkpO1xuZXhwb3J0IHsgQmFzZVF1ZXJ5UnVubmVyIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VRdWVyeVJ1bm5lci5qcy5tYXBcbiIsIi8qKlxuICogUmVzdWx0IG9iamVjdCByZXR1cm5lZCBieSBVcGRhdGVRdWVyeUJ1aWxkZXIgZXhlY3V0aW9uLlxuICovXG52YXIgUXVlcnlSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVlcnlSZXN1bHQoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSb3dzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXJ5UmVzdWx0O1xufSgpKTtcbmV4cG9ydCB7IFF1ZXJ5UmVzdWx0IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXJ5UmVzdWx0LmpzLm1hcFxuIiwiaW1wb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeURvZXNOb3RIYXZlRW50aXR5RXJyb3JcIjtcbmltcG9ydCB7IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwiLi4vZ2xvYmFsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvQ3VzdG9tUmVwb3NpdG9yeU5vdEZvdW5kRXJyb3JcIjtcbi8qKlxuICogUHJvdmlkZXMgYWJzdHJhY3QgY2xhc3MgZm9yIGN1c3RvbSByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIG9yaWdpbmFsIG9ybSBSZXBvc2l0b3J5LlxuICogQ29udGFpbnMgYWxsIG1vc3QtbmVjZXNzYXJ5IG1ldGhvZHMgdG8gc2ltcGxpZnkgY29kZSBpbiB0aGUgY3VzdG9tIHJlcG9zaXRvcnkuXG4gKiBBbGwgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIHRodXMgbm90IGV4cG9zZWQgYW5kIGl0IGFsbG93cyB0byBjcmVhdGUgZW5jYXBzdWxhdGVkIGN1c3RvbSByZXBvc2l0b3J5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xudmFyIEFic3RyYWN0UmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBYnN0cmFjdFJlcG9zaXRvcnkoKSB7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdFJlcG9zaXRvcnkucHJvdG90eXBlLCBcInJlcG9zaXRvcnlcIiwge1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIFByb3RlY3RlZCBBY2Nlc3NvcnNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgb3JpZ2luYWwgT1JNIHJlcG9zaXRvcnkgZm9yIHRoZSBlbnRpdHkgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgICAgICogSWYgY3VycmVudCByZXBvc2l0b3J5IGRvZXMgbm90IG1hbmFnZSBhbnkgZW50aXR5LCB0aGVuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuZ2V0Q3VzdG9tUmVwb3NpdG9yeVRhcmdldCh0aGlzKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21SZXBvc2l0b3J5RG9lc05vdEhhdmVFbnRpdHlFcnJvcih0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUsIFwidHJlZVJlcG9zaXRvcnlcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgb3JpZ2luYWwgT1JNIHRyZWUgcmVwb3NpdG9yeSBmb3IgdGhlIGVudGl0eSB0aGF0IGlzIG1hbmFnZWQgYnkgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgICAgKiBJZiBjdXJyZW50IHJlcG9zaXRvcnkgZG9lcyBub3QgbWFuYWdlIGFueSBlbnRpdHksIHRoZW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5nZXRDdXN0b21SZXBvc2l0b3J5VGFyZ2V0KHRoaXMpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRUcmVlUmVwb3NpdG9yeSh0YXJnZXQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkncyBlbnRpdHkgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNxbCBxdWVyeS5cbiAgICAgKiBJZiBjdXJyZW50IHJlcG9zaXRvcnkgZG9lcyBub3QgbWFuYWdlIGFueSBlbnRpdHksIHRoZW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmdldEN1c3RvbVJlcG9zaXRvcnlUYXJnZXQodGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVJlcG9zaXRvcnlEb2VzTm90SGF2ZUVudGl0eUVycm9yKHRoaXMuY29uc3RydWN0b3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFJlcG9zaXRvcnkodGFyZ2V0KS5jcmVhdGVRdWVyeUJ1aWxkZXIoYWxpYXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gZW50aXR5IHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgQWJzdHJhY3RSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGVRdWVyeUJ1aWxkZXJGb3IgPSBmdW5jdGlvbiAoZW50aXR5LCBhbGlhcykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5Rm9yKGVudGl0eSkuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9yaWdpbmFsIE9STSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuZ2V0UmVwb3NpdG9yeUZvciA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRSZXBvc2l0b3J5KGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBvcmlnaW5hbCBPUk0gdHJlZSByZXBvc2l0b3J5IGZvciB0aGUgZ2l2ZW4gZW50aXR5IGNsYXNzLlxuICAgICAqL1xuICAgIEFic3RyYWN0UmVwb3NpdG9yeS5wcm90b3R5cGUuZ2V0VHJlZVJlcG9zaXRvcnlGb3IgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0VHJlZVJlcG9zaXRvcnkoZW50aXR5KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcml2YXRlIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0cyBjdXN0b20gcmVwb3NpdG9yeSdzIG1hbmFnZWQgZW50aXR5LlxuICAgICAqIElmIGdpdmVuIGN1c3RvbSByZXBvc2l0b3J5IGRvZXMgbm90IG1hbmFnZSBhbnkgZW50aXR5IHRoZW4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RSZXBvc2l0b3J5LnByb3RvdHlwZS5nZXRDdXN0b21SZXBvc2l0b3J5VGFyZ2V0ID0gZnVuY3Rpb24gKGN1c3RvbVJlcG9zaXRvcnkpIHtcbiAgICAgICAgdmFyIGVudGl0eVJlcG9zaXRvcnlNZXRhZGF0YUFyZ3MgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZW50aXR5UmVwb3NpdG9yaWVzLmZpbmQoZnVuY3Rpb24gKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5LnRhcmdldCA9PT0gKGN1c3RvbVJlcG9zaXRvcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGN1c3RvbVJlcG9zaXRvcnkgOiBjdXN0b21SZXBvc2l0b3J5LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW50aXR5UmVwb3NpdG9yeU1ldGFkYXRhQXJncylcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21SZXBvc2l0b3J5Tm90Rm91bmRFcnJvcihjdXN0b21SZXBvc2l0b3J5KTtcbiAgICAgICAgcmV0dXJuIGVudGl0eVJlcG9zaXRvcnlNZXRhZGF0YUFyZ3MuZW50aXR5O1xuICAgIH07XG4gICAgcmV0dXJuIEFic3RyYWN0UmVwb3NpdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBBYnN0cmFjdFJlcG9zaXRvcnkgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJzdHJhY3RSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSBcIi4uL2dsb2JhbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT2JqZWN0VXRpbHNcIjtcbi8qKlxuICogQmFzZSBhYnN0cmFjdCBlbnRpdHkgZm9yIGFsbCBlbnRpdGllcywgdXNlZCBpbiBBY3RpdmVSZWNvcmQgcGF0dGVybnMuXG4gKi9cbnZhciBCYXNlRW50aXR5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VFbnRpdHkoKSB7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZW50aXR5IGhhcyBhbiBpZC5cbiAgICAgKiBJZiBlbnRpdHkgY29tcG9zaXRlIGNvbXBvc2UgaWRzLCBpdCB3aWxsIGNoZWNrIHRoZW0gYWxsLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLmhhc0lkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuaGFzSWQodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYXZlcyBjdXJyZW50IGVudGl0eSBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICogSWYgZW50aXR5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhYmFzZSB0aGVuIGluc2VydHMsIG90aGVyd2lzZSB1cGRhdGVzLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuc2F2ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgY3VycmVudCBlbnRpdHkgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0UmVwb3NpdG9yeSgpLnJlbW92ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIGN1cnJlbnQgZW50aXR5LlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRSZXBvc2l0b3J5KCkuc29mdFJlbW92ZSh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY292ZXJzIGEgZ2l2ZW4gZW50aXR5IGluIHRoZSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnByb3RvdHlwZS5yZWNvdmVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuZ2V0UmVwb3NpdG9yeSgpLnJlY292ZXIodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWxvYWRzIGVudGl0eSBkYXRhIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJhc2UsIG5ld2VzdEVudGl0eTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYmFzZS5nZXRSZXBvc2l0b3J5KCkuZmluZE9uZU9yRmFpbChiYXNlLmdldElkKHRoaXMpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VzdEVudGl0eSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFV0aWxzLmFzc2lnbih0aGlzLCBuZXdlc3RFbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25uZWN0aW9uIHRvIGJlIHVzZWQgYnkgZW50aXR5LlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkudXNlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMudXNlZENvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBjdXJyZW50IGVudGl0eSdzIFJlcG9zaXRvcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5nZXRSZXBvc2l0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMudXNlZENvbm5lY3Rpb24gfHwgZ2V0Q29ubmVjdGlvbigpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRSZXBvc2l0b3J5KHRoaXMpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2VFbnRpdHksIFwidGFyZ2V0XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgb2JqZWN0IHRoYXQgaXMgbWFuYWdlZCBieSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICAgICAqIElmIHRoaXMgcmVwb3NpdG9yeSBtYW5hZ2VzIGVudGl0eSBmcm9tIHNjaGVtYSxcbiAgICAgICAgICogdGhlbiBpdCByZXR1cm5zIGEgbmFtZSBvZiB0aGF0IHNjaGVtYSBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkudGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGVudGl0eSBoYXMgYW4gaWQuXG4gICAgICogSWYgZW50aXR5IGNvbXBvc2l0ZSBjb21wb3NlIGlkcywgaXQgd2lsbCBjaGVjayB0aGVtIGFsbC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lmhhc0lkID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuaGFzSWQoZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXR5IG1peGVkIGlkLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuZ2V0SWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5nZXRJZChlbnRpdHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jcmVhdGVRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgaW5zdGFuY2UgYW5kIGNvcGllcyBhbGwgZW50aXR5IHByb3BlcnRpZXMgZnJvbSB0aGlzIG9iamVjdCBpbnRvIGEgbmV3IGVudGl0eS5cbiAgICAgICogTm90ZSB0aGF0IGl0IGNvcGllcyBvbmx5IHByb3BlcnRpZXMgdGhhdCBwcmVzZW50IGluIGVudGl0eSBzY2hlbWEuXG4gICAgICAqL1xuICAgIEJhc2VFbnRpdHkuY3JlYXRlID0gZnVuY3Rpb24gKGVudGl0eU9yRW50aXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZShlbnRpdHlPckVudGl0aWVzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lcmdlcyBtdWx0aXBsZSBlbnRpdGllcyAob3IgZW50aXR5LWxpa2Ugb2JqZWN0cykgaW50byBhIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lm1lcmdlID0gZnVuY3Rpb24gKG1lcmdlSW50b0VudGl0eSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBlbnRpdHlMaWtlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZW50aXR5TGlrZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuZ2V0UmVwb3NpdG9yeSgpKS5tZXJnZS5hcHBseShfYSwgX19zcHJlYWRBcnJheShbbWVyZ2VJbnRvRW50aXR5XSwgX19yZWFkKGVudGl0eUxpa2VzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGZyb20gdGhlIGdpdmVuIHBsYWluIGphdmFzY3JpcHQgb2JqZWN0LiBJZiBlbnRpdHkgYWxyZWFkeSBleGlzdCBpbiB0aGUgZGF0YWJhc2UsIHRoZW5cbiAgICAgKiBpdCBsb2FkcyBpdCAoYW5kIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBpdCksIHJlcGxhY2VzIGFsbCB2YWx1ZXMgd2l0aCB0aGUgbmV3IG9uZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0XG4gICAgICogYW5kIHJldHVybnMgdGhpcyBuZXcgZW50aXR5LiBUaGlzIG5ldyBlbnRpdHkgaXMgYWN0dWFsbHkgYSBsb2FkZWQgZnJvbSB0aGUgZGIgZW50aXR5IHdpdGggYWxsIHByb3BlcnRpZXNcbiAgICAgKiByZXBsYWNlZCBmcm9tIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGdpdmVuIGVudGl0eS1saWtlIG9iamVjdCBtdXN0IGhhdmUgYW4gZW50aXR5IGlkIC8gcHJpbWFyeSBrZXkgdG8gZmluZCBlbnRpdHkgYnkuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgZW50aXR5IHdpdGggZ2l2ZW4gaWQgd2FzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnByZWxvYWQgPSBmdW5jdGlvbiAoZW50aXR5TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkucHJlbG9hZChlbnRpdHlMaWtlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNhdmVzIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuc2F2ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5zYXZlKGVudGl0eU9yRW50aXRpZXMsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnJlbW92ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5yZW1vdmUoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIHRoZSBkZWxldGUgZGF0ZSBvZiBvbmUgb3IgbWFueSBnaXZlbiBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuc29mdFJlbW92ZShlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBnaXZlbiBlbnRpdHkgaW50byB0aGUgZGF0YWJhc2UuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLCBzbyBxdWVyeSB3aWxsIGZhaWwgaWYgZHVwbGljYXRlIGVudGl0eSBpcyBiZWluZyBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5Lmluc2VydCA9IGZ1bmN0aW9uIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmluc2VydChlbnRpdHksIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBlbnRpdHkgcGFydGlhbGx5LiBFbnRpdHkgY2FuIGJlIGZvdW5kIGJ5IGEgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgVVBEQVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS51cGRhdGUgPSBmdW5jdGlvbiAoY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLnVwZGF0ZShjcml0ZXJpYSwgcGFydGlhbEVudGl0eSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgZ2l2ZW4gZW50aXR5IGludG8gdGhlIGRhdGFiYXNlLCB1bmxlc3MgYSB1bmlxdWUgY29uc3RyYWludCBjb25mbGljdHMgdGhlbiB1cGRhdGVzIHRoZSBlbnRpdHlcbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgSU5TRVJUIC4uLiBPTiBDT05GTElDVCBETyBVUERBVEUvT04gRFVQTElDQVRFIEtFWSBVUERBVEUgcXVlcnkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS51cHNlcnQgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgY29uZmxpY3RQYXRoc09yT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkudXBzZXJ0KGVudGl0eU9yRW50aXRpZXMsIGNvbmZsaWN0UGF0aHNPck9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSByZW1vdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IERFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEJhc2VFbnRpdHkuZGVsZXRlID0gZnVuY3Rpb24gKGNyaXRlcmlhLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5kZWxldGUoY3JpdGVyaWEsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ291bnRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5jb3VudChvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmZpbmQob3B0aW9uc09yQ29uZGl0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGZpbmQgb3B0aW9ucyBvciBjb25kaXRpb25zLlxuICAgICAqIEFsc28gY291bnRzIGFsbCBlbnRpdGllcyB0aGF0IG1hdGNoIGdpdmVuIGNvbmRpdGlvbnMsXG4gICAgICogYnV0IGlnbm9yZXMgcGFnaW5hdGlvbiBzZXR0aW5ncyAoZnJvbSBhbmQgdGFrZSBvcHRpb25zKS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kQW5kQ291bnQob3B0aW9uc09yQ29uZGl0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBlbnRpdGllcyBieSBpZHMuXG4gICAgICogT3B0aW9uYWxseSBmaW5kIG9wdGlvbnMgY2FuIGJlIGFwcGxpZWQuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kQnlJZHMgPSBmdW5jdGlvbiAoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kQnlJZHMoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LmZpbmRPbmUgPSBmdW5jdGlvbiAob3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5maW5kT25lKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kcyBmaXJzdCBlbnRpdHkgdGhhdCBtYXRjaGVzIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5maW5kT25lT3JGYWlsID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXBvc2l0b3J5KCkuZmluZE9uZU9yRmFpbChvcHRpb25zT3JDb25kaXRpb25zLCBtYXliZU9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGEgcmF3IGRhdGFiYXNlIHJlc3VsdHMuXG4gICAgICogUmF3IHF1ZXJ5IGV4ZWN1dGlvbiBpcyBzdXBwb3J0ZWQgb25seSBieSByZWxhdGlvbmFsIGRhdGFiYXNlcyAoTW9uZ29EQiBpcyBub3Qgc3VwcG9ydGVkKS5cbiAgICAgKi9cbiAgICBCYXNlRW50aXR5LnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcG9zaXRvcnkoKS5xdWVyeShxdWVyeSwgcGFyYW1ldGVycyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIHRhYmxlL2NvbGxlY3Rpb24gKHRydW5jYXRlcy9kcm9wcyBpdCkuXG4gICAgICovXG4gICAgQmFzZUVudGl0eS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVwb3NpdG9yeSgpLmNsZWFyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUVudGl0eTtcbn0oKSk7XG5leHBvcnQgeyBCYXNlRW50aXR5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VFbnRpdHkuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbW92ZU9wdGlvbnMuanMubWFwXG4iLCJpbXBvcnQgeyBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogUmVwb3NpdG9yeSBpcyBzdXBwb3NlZCB0byB3b3JrIHdpdGggeW91ciBlbnRpdHkgb2JqZWN0cy4gRmluZCBlbnRpdGllcywgaW5zZXJ0LCB1cGRhdGUsIGRlbGV0ZSwgZXRjLlxuICovXG52YXIgUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBvc2l0b3J5KCkge1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBzcWwgcXVlcnkuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzLCBxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmNyZWF0ZVF1ZXJ5QnVpbGRlcih0aGlzLm1ldGFkYXRhLnRhcmdldCwgYWxpYXMgfHwgdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lLCBxdWVyeVJ1bm5lciB8fCB0aGlzLnF1ZXJ5UnVubmVyKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXBvc2l0b3J5LnByb3RvdHlwZSwgXCJ0YXJnZXRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBvYmplY3QgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgICAgICogSWYgdGhpcyByZXBvc2l0b3J5IG1hbmFnZXMgZW50aXR5IGZyb20gc2NoZW1hLFxuICAgICAgICAgKiB0aGVuIGl0IHJldHVybnMgYSBuYW1lIG9mIHRoYXQgc2NoZW1hIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlbnRpdHkgaGFzIGFuIGlkLlxuICAgICAqIElmIGVudGl0eSBjb21wb3NpdGUgY29tcG9zZSBpZHMsIGl0IHdpbGwgY2hlY2sgdGhlbSBhbGwuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuaGFzSWQgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaGFzSWQodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGVudGl0eSBtaXhlZCBpZC5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRJZCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGluc3RhbmNlIG9yIGluc3RhbmNlcy5cbiAgICAgKiBDYW4gY29weSBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdCBpbnRvIG5ldyBlbnRpdGllcy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocGxhaW5FbnRpdHlMaWtlT3JQbGFpbkVudGl0eUxpa2VzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY3JlYXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBwbGFpbkVudGl0eUxpa2VPclBsYWluRW50aXR5TGlrZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWVyZ2VzIG11bHRpcGxlIGVudGl0aWVzIChvciBlbnRpdHktbGlrZSBvYmplY3RzKSBpbnRvIGEgZ2l2ZW4gZW50aXR5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKG1lcmdlSW50b0VudGl0eSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBlbnRpdHlMaWtlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZW50aXR5TGlrZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMubWFuYWdlcikubWVyZ2UuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3RoaXMubWV0YWRhdGEudGFyZ2V0LCBtZXJnZUludG9FbnRpdHldLCBfX3JlYWQoZW50aXR5TGlrZXMpLCBmYWxzZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgZnJvbSB0aGUgZ2l2ZW4gcGxhaW4gamF2YXNjcmlwdCBvYmplY3QuIElmIGVudGl0eSBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZSwgdGhlblxuICAgICAqIGl0IGxvYWRzIGl0IChhbmQgZXZlcnl0aGluZyByZWxhdGVkIHRvIGl0KSwgcmVwbGFjZXMgYWxsIHZhbHVlcyB3aXRoIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBnaXZlbiBvYmplY3RcbiAgICAgKiBhbmQgcmV0dXJucyB0aGlzIG5ldyBlbnRpdHkuIFRoaXMgbmV3IGVudGl0eSBpcyBhY3R1YWxseSBhIGxvYWRlZCBmcm9tIHRoZSBkYiBlbnRpdHkgd2l0aCBhbGwgcHJvcGVydGllc1xuICAgICAqIHJlcGxhY2VkIGZyb20gdGhlIG5ldyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgZ2l2ZW4gZW50aXR5LWxpa2Ugb2JqZWN0IG11c3QgaGF2ZSBhbiBlbnRpdHkgaWQgLyBwcmltYXJ5IGtleSB0byBmaW5kIGVudGl0eSBieS5cbiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBlbnRpdHkgd2l0aCBnaXZlbiBpZCB3YXMgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnByZWxvYWQgPSBmdW5jdGlvbiAoZW50aXR5TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnByZWxvYWQodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eUxpa2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2F2ZXMgb25lIG9yIG1hbnkgZ2l2ZW4gZW50aXRpZXMuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuc2F2ZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucmVtb3ZlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhlIGRlbGV0ZSBkYXRlIG9mIG9uZSBvciBtYW55IGdpdmVuIGVudGl0aWVzLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnNvZnRSZW1vdmUgPSBmdW5jdGlvbiAoZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnNvZnRSZW1vdmUodGhpcy5tZXRhZGF0YS50YXJnZXQsIGVudGl0eU9yRW50aXRpZXMsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnMgb25lIG9yIG1hbnkgZ2l2ZW4gZW50aXRpZXMuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUucmVjb3ZlciA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucmVjb3Zlcih0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5T3JFbnRpdGllcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgZ2l2ZW4gZW50aXR5IGludG8gdGhlIGRhdGFiYXNlLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBJTlNFUlQgcXVlcnkuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgZW50aXR5IGV4aXN0IGluIHRoZSBkYXRhYmFzZSwgc28gcXVlcnkgd2lsbCBmYWlsIGlmIGR1cGxpY2F0ZSBlbnRpdHkgaXMgYmVpbmcgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmluc2VydCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgZW50aXR5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgZW50aXR5IHBhcnRpYWxseS4gRW50aXR5IGNhbiBiZSBmb3VuZCBieSBhIGdpdmVuIGNvbmRpdGlvbnMuXG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IFVQREFURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjcml0ZXJpYSwgcGFydGlhbEVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnVwZGF0ZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgY3JpdGVyaWEsIHBhcnRpYWxFbnRpdHkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIGdpdmVuIGVudGl0eSBpbnRvIHRoZSBkYXRhYmFzZSwgdW5sZXNzIGEgdW5pcXVlIGNvbnN0cmFpbnQgY29uZmxpY3RzIHRoZW4gdXBkYXRlcyB0aGUgZW50aXR5XG4gICAgICogVW5saWtlIHNhdmUgbWV0aG9kIGV4ZWN1dGVzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbiB3aXRob3V0IGNhc2NhZGVzLCByZWxhdGlvbnMgYW5kIG90aGVyIG9wZXJhdGlvbnMgaW5jbHVkZWQuXG4gICAgICogRXhlY3V0ZXMgZmFzdCBhbmQgZWZmaWNpZW50IElOU0VSVCAuLi4gT04gQ09ORkxJQ1QgRE8gVVBEQVRFL09OIERVUExJQ0FURSBLRVkgVVBEQVRFIHF1ZXJ5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnVwc2VydCA9IGZ1bmN0aW9uIChlbnRpdHlPckVudGl0aWVzLCBjb25mbGljdFBhdGhzT3JPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIudXBzZXJ0KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBlbnRpdHlPckVudGl0aWVzLCBjb25mbGljdFBhdGhzT3JPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgZW50aXRpZXMgYnkgYSBnaXZlbiBjcml0ZXJpYS5cbiAgICAgKiBVbmxpa2Ugc2F2ZSBtZXRob2QgZXhlY3V0ZXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uIHdpdGhvdXQgY2FzY2FkZXMsIHJlbGF0aW9ucyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBpbmNsdWRlZC5cbiAgICAgKiBFeGVjdXRlcyBmYXN0IGFuZCBlZmZpY2llbnQgREVMRVRFIHF1ZXJ5LlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIGVudGl0eSBleGlzdCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZGVsZXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIHRoZSBkZWxldGUgZGF0ZSBvZiBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBTT0ZULURFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnNvZnREZWxldGUgPSBmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5zb2Z0RGVsZXRlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyBlbnRpdGllcyBieSBhIGdpdmVuIGNyaXRlcmlhLlxuICAgICAqIFVubGlrZSBzYXZlIG1ldGhvZCBleGVjdXRlcyBhIHByaW1pdGl2ZSBvcGVyYXRpb24gd2l0aG91dCBjYXNjYWRlcywgcmVsYXRpb25zIGFuZCBvdGhlciBvcGVyYXRpb25zIGluY2x1ZGVkLlxuICAgICAqIEV4ZWN1dGVzIGZhc3QgYW5kIGVmZmljaWVudCBTT0ZULURFTEVURSBxdWVyeS5cbiAgICAgKiBEb2VzIG5vdCBjaGVjayBpZiBlbnRpdHkgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5yZXN0b3JlKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjcml0ZXJpYSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb3VudHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgb3IgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY291bnQodGhpcy5tZXRhZGF0YS50YXJnZXQsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZW50aXRpZXMgdGhhdCBtYXRjaCBnaXZlbiBmaW5kIG9wdGlvbnMgb3IgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5maW5kKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gZmluZCBvcHRpb25zIG9yIGNvbmRpdGlvbnMuXG4gICAgICogQWxzbyBjb3VudHMgYWxsIGVudGl0aWVzIHRoYXQgbWF0Y2ggZ2l2ZW4gY29uZGl0aW9ucyxcbiAgICAgKiBidXQgaWdub3JlcyBwYWdpbmF0aW9uIHNldHRpbmdzIChmcm9tIGFuZCB0YWtlIG9wdGlvbnMpLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRBbmRDb3VudCA9IGZ1bmN0aW9uIChvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZEFuZENvdW50KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBvcHRpb25zT3JDb25kaXRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGVudGl0aWVzIGJ5IGlkcy5cbiAgICAgKiBPcHRpb25hbGx5IGZpbmQgb3B0aW9ucyBjYW4gYmUgYXBwbGllZC5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kQnlJZHMgPSBmdW5jdGlvbiAoaWRzLCBvcHRpb25zT3JDb25kaXRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZEJ5SWRzKHRoaXMubWV0YWRhdGEudGFyZ2V0LCBpZHMsIG9wdGlvbnNPckNvbmRpdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmluZHMgZmlyc3QgZW50aXR5IHRoYXQgbWF0Y2hlcyBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRPbmUgPSBmdW5jdGlvbiAob3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZmluZE9uZSh0aGlzLm1ldGFkYXRhLnRhcmdldCwgb3B0aW9uc09yQ29uZGl0aW9ucywgbWF5YmVPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZpbmRzIGZpcnN0IGVudGl0eSB0aGF0IG1hdGNoZXMgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kT25lT3JGYWlsID0gZnVuY3Rpb24gKG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmZpbmRPbmVPckZhaWwodGhpcy5tZXRhZGF0YS50YXJnZXQsIG9wdGlvbnNPckNvbmRpdGlvbnMsIG1heWJlT3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybnMgYSByYXcgZGF0YWJhc2UgcmVzdWx0cy5cbiAgICAgKiBSYXcgcXVlcnkgZXhlY3V0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGJ5IHJlbGF0aW9uYWwgZGF0YWJhc2VzIChNb25nb0RCIGlzIG5vdCBzdXBwb3J0ZWQpLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIucXVlcnkocXVlcnksIHBhcmFtZXRlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBnaXZlbiB0YWJsZS9jb2xsZWN0aW9uICh0cnVuY2F0ZXMvZHJvcHMgaXQpLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgdXNlcyBUUlVOQ0FURSBhbmQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaW4gdHJhbnNhY3Rpb25zIG9uIHNvbWUgcGxhdGZvcm1zLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU5NzI3MzgvOTI1MTUxXG4gICAgICovXG4gICAgUmVwb3NpdG9yeS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuY2xlYXIodGhpcy5tZXRhZGF0YS50YXJnZXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5jcmVtZW50cyBzb21lIGNvbHVtbiBieSBwcm92aWRlZCB2YWx1ZSBvZiB0aGUgZW50aXRpZXMgbWF0Y2hlZCBnaXZlbiBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnkucHJvdG90eXBlLmluY3JlbWVudCA9IGZ1bmN0aW9uIChjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuaW5jcmVtZW50KHRoaXMubWV0YWRhdGEudGFyZ2V0LCBjb25kaXRpb25zLCBwcm9wZXJ0eVBhdGgsIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlY3JlbWVudHMgc29tZSBjb2x1bW4gYnkgcHJvdmlkZWQgdmFsdWUgb2YgdGhlIGVudGl0aWVzIG1hdGNoZWQgZ2l2ZW4gY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBSZXBvc2l0b3J5LnByb3RvdHlwZS5kZWNyZW1lbnQgPSBmdW5jdGlvbiAoY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmRlY3JlbWVudCh0aGlzLm1ldGFkYXRhLnRhcmdldCwgY29uZGl0aW9ucywgcHJvcGVydHlQYXRoLCB2YWx1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVwb3NpdG9yeTtcbn0oKSk7XG5leHBvcnQgeyBSZXBvc2l0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcG9zaXRvcnkuanMubWFwXG4iLCJpbXBvcnQgeyBUcmVlUmVwb3NpdG9yeSB9IGZyb20gXCIuL1RyZWVSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgTW9uZ29Ecml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL21vbmdvZGIvTW9uZ29Ecml2ZXJcIjtcbmltcG9ydCB7IE1vbmdvUmVwb3NpdG9yeSB9IGZyb20gXCIuL01vbmdvUmVwb3NpdG9yeVwiO1xuLyoqXG4gKiBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIGRpZmZlcmVudCB0eXBlcyBvZiByZXBvc2l0b3JpZXMuXG4gKi9cbnZhciBSZXBvc2l0b3J5RmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBvc2l0b3J5RmFjdG9yeSgpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBvc2l0b3J5LlxuICAgICAqL1xuICAgIFJlcG9zaXRvcnlGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAobWFuYWdlciwgbWV0YWRhdGEsIHF1ZXJ5UnVubmVyKSB7XG4gICAgICAgIGlmIChtZXRhZGF0YS50cmVlVHlwZSkge1xuICAgICAgICAgICAgLy8gTk9URTogZHluYW1pYyBhY2Nlc3MgdG8gcHJvdGVjdGVkIHByb3BlcnRpZXMuIFdlIG5lZWQgdGhpcyB0byBwcmV2ZW50IHVud2FudGVkIHByb3BlcnRpZXMgaW4gdGhvc2UgY2xhc3NlcyB0byBiZSBleHBvc2VkLFxuICAgICAgICAgICAgLy8gaG93ZXZlciB3ZSBuZWVkIHRoZXNlIHByb3BlcnRpZXMgZm9yIGludGVybmFsIHdvcmsgb2YgdGhlIGNsYXNzXG4gICAgICAgICAgICB2YXIgcmVwb3NpdG9yeSA9IG5ldyBUcmVlUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBvc2l0b3J5LCB7XG4gICAgICAgICAgICAgICAgbWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IGR5bmFtaWMgYWNjZXNzIHRvIHByb3RlY3RlZCBwcm9wZXJ0aWVzLiBXZSBuZWVkIHRoaXMgdG8gcHJldmVudCB1bndhbnRlZCBwcm9wZXJ0aWVzIGluIHRob3NlIGNsYXNzZXMgdG8gYmUgZXhwb3NlZCxcbiAgICAgICAgICAgIC8vIGhvd2V2ZXIgd2UgbmVlZCB0aGVzZSBwcm9wZXJ0aWVzIGZvciBpbnRlcm5hbCB3b3JrIG9mIHRoZSBjbGFzc1xuICAgICAgICAgICAgdmFyIHJlcG9zaXRvcnkgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAobWFuYWdlci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIE1vbmdvRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IG5ldyBNb25nb1JlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBvc2l0b3J5LCB7XG4gICAgICAgICAgICAgICAgbWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFJlcG9zaXRvcnlGYWN0b3J5O1xufSgpKTtcbmV4cG9ydCB7IFJlcG9zaXRvcnlGYWN0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlcG9zaXRvcnlGYWN0b3J5LmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TYXZlT3B0aW9ucy5qcy5tYXBcbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNxbGl0ZURyaXZlciB9IGZyb20gXCIuLi9kcml2ZXIvc3FsaXRlLWFic3RyYWN0L0Fic3RyYWN0U3FsaXRlRHJpdmVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvVHlwZU9STUVycm9yXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1V0aWxzIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1V0aWxzXCI7XG4vKipcbiAqIFJlcG9zaXRvcnkgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggdHJlZXMuXG4gKlxuICogQHNlZSBSZXBvc2l0b3J5XG4gKi9cbnZhciBUcmVlUmVwb3NpdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJlZVJlcG9zaXRvcnksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJlZVJlcG9zaXRvcnkoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEdldHMgY29tcGxldGUgdHJlZXMgZm9yIGFsbCByb290cyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmRUcmVlcyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByb290cztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZmluZFJvb3RzKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChyb290cy5tYXAoZnVuY3Rpb24gKHJvb3QpIHsgcmV0dXJuIF90aGlzLmZpbmREZXNjZW5kYW50c1RyZWUocm9vdCwgb3B0aW9ucyk7IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByb290c107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUm9vdHMgYXJlIGVudGl0aWVzIHRoYXQgaGF2ZSBubyBhbmNlc3RvcnMuIEZpbmRzIHRoZW0gYWxsLlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5maW5kUm9vdHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXNjYXBlQWxpYXMgPSBmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuIF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTsgfTtcbiAgICAgICAgdmFyIGVzY2FwZUNvbHVtbiA9IGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGNvbHVtbik7IH07XG4gICAgICAgIHZhciBwYXJlbnRQcm9wZXJ0eU5hbWUgPSB0aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5qb2luQ29sdW1uTmFtZSh0aGlzLm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5wcm9wZXJ0eU5hbWUsIHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0ucHJvcGVydHlOYW1lKTtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIpO1xuICAgICAgICBGaW5kT3B0aW9uc1V0aWxzLmFwcGx5T3B0aW9uc1RvVHJlZVF1ZXJ5QnVpbGRlcihxYiwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBxYlxuICAgICAgICAgICAgLndoZXJlKGVzY2FwZUFsaWFzKFwidHJlZUVudGl0eVwiKSArIFwiLlwiICsgZXNjYXBlQ29sdW1uKHBhcmVudFByb3BlcnR5TmFtZSkgKyBcIiBJUyBOVUxMXCIpXG4gICAgICAgICAgICAuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gKGRlc2NlbmRhbnRzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gYWxsIGluIGEgZmxhdCBhcnJheS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZERlc2NlbmRhbnRzID0gZnVuY3Rpb24gKGVudGl0eSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgcWIgPSB0aGlzLmNyZWF0ZURlc2NlbmRhbnRzUXVlcnlCdWlsZGVyKFwidHJlZUVudGl0eVwiLCBcInRyZWVDbG9zdXJlXCIsIGVudGl0eSk7XG4gICAgICAgIEZpbmRPcHRpb25zVXRpbHMuYXBwbHlPcHRpb25zVG9UcmVlUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHFiLmdldE1hbnkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIChkZXNjZW5kYW50cykgb2YgdGhlIGdpdmVuIGVudGl0eS4gUmV0dXJucyB0aGVtIGluIGEgdHJlZSAtIG5lc3RlZCBpbnRvIGVhY2ggb3RoZXIuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmZpbmREZXNjZW5kYW50c1RyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxYiwgZW50aXRpZXMsIHJlbGF0aW9uTWFwcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVEZXNjZW5kYW50c1F1ZXJ5QnVpbGRlcihcInRyZWVFbnRpdHlcIiwgXCJ0cmVlQ2xvc3VyZVwiLCBlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcWIuZ2V0UmF3QW5kRW50aXRpZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NYXBzID0gdGhpcy5jcmVhdGVSZWxhdGlvbk1hcHMoXCJ0cmVlRW50aXR5XCIsIGVudGl0aWVzLnJhdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ2hpbGRyZW5FbnRpdHlUcmVlKGVudGl0eSwgZW50aXRpZXMuZW50aXRpZXMsIHJlbGF0aW9uTWFwcywgX19hc3NpZ24oeyBkZXB0aDogLTEgfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGVudGl0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBudW1iZXIgb2YgZGVzY2VuZGFudHMgb2YgdGhlIGVudGl0eS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuY291bnREZXNjZW5kYW50cyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5jcmVhdGVEZXNjZW5kYW50c1F1ZXJ5QnVpbGRlcihcInRyZWVFbnRpdHlcIiwgXCJ0cmVlQ2xvc3VyZVwiLCBlbnRpdHkpXG4gICAgICAgICAgICAuZ2V0Q291bnQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHVzZWQgdG8gZ2V0IGRlc2NlbmRhbnRzIG9mIHRoZSBlbnRpdGllcyBpbiBhIHRyZWUuXG4gICAgICovXG4gICAgVHJlZVJlcG9zaXRvcnkucHJvdG90eXBlLmNyZWF0ZURlc2NlbmRhbnRzUXVlcnlCdWlsZGVyID0gZnVuY3Rpb24gKGFsaWFzLCBjbG9zdXJlVGFibGVBbGlhcywgZW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGJldHRlciByZWFkYWJpbGl0eVxuICAgICAgICB2YXIgZXNjYXBlID0gZnVuY3Rpb24gKGFsaWFzKSB7IHJldHVybiBfdGhpcy5tYW5hZ2VyLmNvbm5lY3Rpb24uZHJpdmVyLmVzY2FwZShhbGlhcyk7IH07XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcImNsb3N1cmUtdGFibGVcIikge1xuICAgICAgICAgICAgdmFyIGpvaW5Db25kaXRpb24gPSB0aGlzLm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZShjbG9zdXJlVGFibGVBbGlhcykgKyBcIi5cIiArIGVzY2FwZShjb2x1bW4ucHJvcGVydHlQYXRoKSArIFwiID0gXCIgKyBlc2NhcGUoYWxpYXMpICsgXCIuXCIgKyBlc2NhcGUoY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoKTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzXzEgPSB7fTtcbiAgICAgICAgICAgIHZhciB3aGVyZUNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xW2NvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGUoY2xvc3VyZVRhYmxlQWxpYXMpICsgXCIuXCIgKyBlc2NhcGUoY29sdW1uLnByb3BlcnR5UGF0aCkgKyBcIiA9IDpcIiArIGNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAuaW5uZXJKb2luKHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUudGFibGVOYW1lLCBjbG9zdXJlVGFibGVBbGlhcywgam9pbkNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAud2hlcmUod2hlcmVDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgLnNldFBhcmFtZXRlcnMocGFyYW1ldGVyc18xKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm5lc3RlZC1zZXRcIikge1xuICAgICAgICAgICAgdmFyIHdoZXJlQ29uZGl0aW9uID0gYWxpYXMgKyBcIi5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBCRVRXRUVOIFwiICtcbiAgICAgICAgICAgICAgICBcImpvaW5lZC5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0TGVmdENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBBTkQgam9pbmVkLlwiICsgdGhpcy5tZXRhZGF0YS5uZXN0ZWRTZXRSaWdodENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVyc18yID0ge307XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLmpvaW5Db2x1bW5zLm1hcChmdW5jdGlvbiAoam9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJOYW1lID0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18yW3BhcmFtZXRlck5hbWVdID0gam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiam9pbmVkLlwiICsgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgcGFyYW1ldGVyTmFtZTtcbiAgICAgICAgICAgIH0pLmpvaW4oXCIgQU5EIFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAuaW5uZXJKb2luKHRoaXMubWV0YWRhdGEudGFyZ2V0TmFtZSwgXCJqb2luZWRcIiwgd2hlcmVDb25kaXRpb24pXG4gICAgICAgICAgICAgICAgLndoZXJlKGpvaW5Db25kaXRpb24sIHBhcmFtZXRlcnNfMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRhZGF0YS50cmVlVHlwZSA9PT0gXCJtYXRlcmlhbGl6ZWQtcGF0aFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoYWxpYXMpXG4gICAgICAgICAgICAgICAgLndoZXJlKGZ1bmN0aW9uIChxYikge1xuICAgICAgICAgICAgICAgIHZhciBzdWJRdWVyeSA9IHFiLnN1YlF1ZXJ5KClcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChfdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCwgXCJwYXRoXCIpXG4gICAgICAgICAgICAgICAgICAgIC5mcm9tKF90aGlzLm1ldGFkYXRhLnRhcmdldCwgX3RoaXMubWV0YWRhdGEudGFyZ2V0TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlSW5JZHMoX3RoaXMubWV0YWRhdGEuZ2V0RW50aXR5SWRNYXAoZW50aXR5KSk7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFNxbGl0ZURyaXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXMgKyBcIi5cIiArIF90aGlzLm1ldGFkYXRhLm1hdGVyaWFsaXplZFBhdGhDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgTElLRSBcIiArIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiB8fCAnJSdcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlhcyArIFwiLlwiICsgX3RoaXMubWV0YWRhdGEubWF0ZXJpYWxpemVkUGF0aENvbHVtbi5wcm9wZXJ0eVBhdGggKyBcIiBMSUtFIENPTkNBVChcIiArIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiwgJyUnKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJTdXBwb3J0ZWQgb25seSBpbiB0cmVlIGVudGl0aWVzXCIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcGFyZW50cyAoYW5jZXN0b3JzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gYWxsIGluIGEgZmxhdCBhcnJheS5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZEFuY2VzdG9ycyA9IGZ1bmN0aW9uIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHFiID0gdGhpcy5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KTtcbiAgICAgICAgRmluZE9wdGlvbnNVdGlscy5hcHBseU9wdGlvbnNUb1RyZWVRdWVyeUJ1aWxkZXIocWIsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcWIuZ2V0TWFueSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgcGFyZW50cyAoYW5jZXN0b3JzKSBvZiB0aGUgZ2l2ZW4gZW50aXR5LiBSZXR1cm5zIHRoZW0gaW4gYSB0cmVlIC0gbmVzdGVkIGludG8gZWFjaCBvdGhlci5cbiAgICAgKi9cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuZmluZEFuY2VzdG9yc1RyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBxYiwgZW50aXRpZXMsIHJlbGF0aW9uTWFwcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiID0gdGhpcy5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRPcHRpb25zVXRpbHMuYXBwbHlPcHRpb25zVG9UcmVlUXVlcnlCdWlsZGVyKHFiLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHFiLmdldFJhd0FuZEVudGl0aWVzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTWFwcyA9IHRoaXMuY3JlYXRlUmVsYXRpb25NYXBzKFwidHJlZUVudGl0eVwiLCBlbnRpdGllcy5yYXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFBhcmVudEVudGl0eVRyZWUoZW50aXR5LCBlbnRpdGllcy5lbnRpdGllcywgcmVsYXRpb25NYXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbnRpdHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgbnVtYmVyIG9mIGFuY2VzdG9ycyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5jb3VudEFuY2VzdG9ycyA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIC5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIoXCJ0cmVlRW50aXR5XCIsIFwidHJlZUNsb3N1cmVcIiwgZW50aXR5KVxuICAgICAgICAgICAgLmdldENvdW50KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcXVlcnkgYnVpbGRlciB1c2VkIHRvIGdldCBhbmNlc3RvcnMgb2YgdGhlIGVudGl0aWVzIGluIHRoZSB0cmVlLlxuICAgICAqL1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5jcmVhdGVBbmNlc3RvcnNRdWVyeUJ1aWxkZXIgPSBmdW5jdGlvbiAoYWxpYXMsIGNsb3N1cmVUYWJsZUFsaWFzLCBlbnRpdHkpIHtcbiAgICAgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5XG4gICAgICAgIC8vIGNvbnN0IGVzY2FwZSA9IChhbGlhczogc3RyaW5nKSA9PiB0aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIuZXNjYXBlKGFsaWFzKTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGEudHJlZVR5cGUgPT09IFwiY2xvc3VyZS10YWJsZVwiKSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IHRoaXMubWV0YWRhdGEuY2xvc3VyZUp1bmN0aW9uVGFibGUuYW5jZXN0b3JDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb3N1cmVUYWJsZUFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgPSBcIiArIGFsaWFzICsgXCIuXCIgKyBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5wcm9wZXJ0eVBhdGg7XG4gICAgICAgICAgICB9KS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVyc18zID0ge307XG4gICAgICAgICAgICB2YXIgd2hlcmVDb25kaXRpb24gPSB0aGlzLm1ldGFkYXRhLmNsb3N1cmVKdW5jdGlvblRhYmxlLmRlc2NlbmRhbnRDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc18zW2NvbHVtbi5yZWZlcmVuY2VkQ29sdW1uLnByb3BlcnR5TmFtZV0gPSBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbi5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9zdXJlVGFibGVBbGlhcyArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCArIFwiID0gOlwiICsgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKVxuICAgICAgICAgICAgICAgIC5pbm5lckpvaW4odGhpcy5tZXRhZGF0YS5jbG9zdXJlSnVuY3Rpb25UYWJsZS50YWJsZU5hbWUsIGNsb3N1cmVUYWJsZUFsaWFzLCBqb2luQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgIC53aGVyZSh3aGVyZUNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzXzMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0YWRhdGEudHJlZVR5cGUgPT09IFwibmVzdGVkLXNldFwiKSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbmRpdGlvbiA9IFwiam9pbmVkLlwiICsgdGhpcy5tZXRhZGF0YS5uZXN0ZWRTZXRMZWZ0Q29sdW1uLnByb3BlcnR5UGF0aCArIFwiIEJFVFdFRU4gXCIgK1xuICAgICAgICAgICAgICAgIGFsaWFzICsgXCIuXCIgKyB0aGlzLm1ldGFkYXRhLm5lc3RlZFNldExlZnRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgQU5EIFwiICsgYWxpYXMgKyBcIi5cIiArIHRoaXMubWV0YWRhdGEubmVzdGVkU2V0UmlnaHRDb2x1bW4ucHJvcGVydHlQYXRoO1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnNfNCA9IHt9O1xuICAgICAgICAgICAgdmFyIHdoZXJlQ29uZGl0aW9uID0gdGhpcy5tZXRhZGF0YS50cmVlUGFyZW50UmVsYXRpb24uam9pbkNvbHVtbnMubWFwKGZ1bmN0aW9uIChqb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlck5hbWUgPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzRbcGFyYW1ldGVyTmFtZV0gPSBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJqb2luZWQuXCIgKyBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4ucHJvcGVydHlQYXRoICsgXCIgPSA6XCIgKyBwYXJhbWV0ZXJOYW1lO1xuICAgICAgICAgICAgfSkuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKGFsaWFzKVxuICAgICAgICAgICAgICAgIC5pbm5lckpvaW4odGhpcy5tZXRhZGF0YS50YXJnZXROYW1lLCBcImpvaW5lZFwiLCBqb2luQ29uZGl0aW9uKVxuICAgICAgICAgICAgICAgIC53aGVyZSh3aGVyZUNvbmRpdGlvbiwgcGFyYW1ldGVyc180KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLnRyZWVUeXBlID09PSBcIm1hdGVyaWFsaXplZC1wYXRoXCIpIHtcbiAgICAgICAgICAgIC8vIGV4YW1wbGU6IFNFTEVDVCAqIEZST00gY2F0ZWdvcnkgY2F0ZWdvcnkgV0hFUkUgKFNFTEVDVCBtcGF0aCBGUk9NIGBjYXRlZ29yeWAgV0hFUkUgaWQgPSAyKSBMSUtFIENPTkNBVChjYXRlZ29yeS5tcGF0aCwgJyUnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcihhbGlhcylcbiAgICAgICAgICAgICAgICAud2hlcmUoZnVuY3Rpb24gKHFiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YlF1ZXJ5ID0gcWIuc3ViUXVlcnkoKVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KF90aGlzLm1ldGFkYXRhLnRhcmdldE5hbWUgKyBcIi5cIiArIF90aGlzLm1ldGFkYXRhLm1hdGVyaWFsaXplZFBhdGhDb2x1bW4ucHJvcGVydHlQYXRoLCBcInBhdGhcIilcbiAgICAgICAgICAgICAgICAgICAgLmZyb20oX3RoaXMubWV0YWRhdGEudGFyZ2V0LCBfdGhpcy5tZXRhZGF0YS50YXJnZXROYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2hlcmVJbklkcyhfdGhpcy5tZXRhZGF0YS5nZXRFbnRpdHlJZE1hcChlbnRpdHkpKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMubWFuYWdlci5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEFic3RyYWN0U3FsaXRlRHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJRdWVyeS5nZXRRdWVyeSgpICsgXCIgTElLRSBcIiArIGFsaWFzICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiIHx8ICclJ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YlF1ZXJ5LmdldFF1ZXJ5KCkgKyBcIiBMSUtFIENPTkNBVChcIiArIGFsaWFzICsgXCIuXCIgKyBfdGhpcy5tZXRhZGF0YS5tYXRlcmlhbGl6ZWRQYXRoQ29sdW1uLnByb3BlcnR5UGF0aCArIFwiLCAnJScpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIlN1cHBvcnRlZCBvbmx5IGluIHRyZWUgZW50aXRpZXNcIik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNb3ZlcyBlbnRpdHkgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZW4gZ2l2ZW4gZW50aXR5LlxuICAgICAqXG4gICAgbW92ZShlbnRpdHk6IEVudGl0eSwgdG86IEVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSAqL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBUcmVlUmVwb3NpdG9yeS5wcm90b3R5cGUuY3JlYXRlUmVsYXRpb25NYXBzID0gZnVuY3Rpb24gKGFsaWFzLCByYXdSZXN1bHRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiByYXdSZXN1bHRzLm1hcChmdW5jdGlvbiAocmF3UmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgam9pbkNvbHVtbiA9IF90aGlzLm1ldGFkYXRhLnRyZWVQYXJlbnRSZWxhdGlvbi5qb2luQ29sdW1uc1swXTtcbiAgICAgICAgICAgIC8vIGZpeGVzIGlzc3VlICMyNTE4LCBkZWZhdWx0IHRvIGRhdGFiYXNlTmFtZSBwcm9wZXJ0eSB3aGVuIGdpdmVuRGF0YWJhc2VOYW1lIGlzIG5vdCBzZXRcbiAgICAgICAgICAgIHZhciBqb2luQ29sdW1uTmFtZSA9IGpvaW5Db2x1bW4uZ2l2ZW5EYXRhYmFzZU5hbWUgfHwgam9pbkNvbHVtbi5kYXRhYmFzZU5hbWU7XG4gICAgICAgICAgICB2YXIgaWQgPSByYXdSZXN1bHRbYWxpYXMgKyBcIl9cIiArIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZV07XG4gICAgICAgICAgICB2YXIgcGFyZW50SWQgPSByYXdSZXN1bHRbYWxpYXMgKyBcIl9cIiArIGpvaW5Db2x1bW5OYW1lXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQ6IF90aGlzLm1hbmFnZXIuY29ubmVjdGlvbi5kcml2ZXIucHJlcGFyZUh5ZHJhdGVkVmFsdWUoaWQsIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogX3RoaXMubWFuYWdlci5jb25uZWN0aW9uLmRyaXZlci5wcmVwYXJlSHlkcmF0ZWRWYWx1ZShwYXJlbnRJZCwgam9pbkNvbHVtbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5idWlsZENoaWxkcmVuRW50aXR5VHJlZSA9IGZ1bmN0aW9uIChlbnRpdHksIGVudGl0aWVzLCByZWxhdGlvbk1hcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNoaWxkUHJvcGVydHkgPSB0aGlzLm1ldGFkYXRhLnRyZWVDaGlsZHJlblJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIGVudGl0eVtjaGlsZFByb3BlcnR5XSA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRFbnRpdHlJZCA9IHRoaXMubWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0uZ2V0RW50aXR5VmFsdWUoZW50aXR5KTtcbiAgICAgICAgdmFyIGNoaWxkUmVsYXRpb25NYXBzID0gcmVsYXRpb25NYXBzLmZpbHRlcihmdW5jdGlvbiAocmVsYXRpb25NYXApIHsgcmV0dXJuIHJlbGF0aW9uTWFwLnBhcmVudElkID09PSBwYXJlbnRFbnRpdHlJZDsgfSk7XG4gICAgICAgIHZhciBjaGlsZElkcyA9IG5ldyBTZXQoY2hpbGRSZWxhdGlvbk1hcHMubWFwKGZ1bmN0aW9uIChyZWxhdGlvbk1hcCkgeyByZXR1cm4gcmVsYXRpb25NYXAuaWQ7IH0pKTtcbiAgICAgICAgZW50aXR5W2NoaWxkUHJvcGVydHldID0gZW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIGNoaWxkSWRzLmhhcyhfdGhpcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpKTsgfSk7XG4gICAgICAgIGVudGl0eVtjaGlsZFByb3BlcnR5XS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICAgICAgX3RoaXMuYnVpbGRDaGlsZHJlbkVudGl0eVRyZWUoY2hpbGRFbnRpdHksIGVudGl0aWVzLCByZWxhdGlvbk1hcHMsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBkZXB0aDogb3B0aW9ucy5kZXB0aCAtIDEgfSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRyZWVSZXBvc2l0b3J5LnByb3RvdHlwZS5idWlsZFBhcmVudEVudGl0eVRyZWUgPSBmdW5jdGlvbiAoZW50aXR5LCBlbnRpdGllcywgcmVsYXRpb25NYXBzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBwYXJlbnRQcm9wZXJ0eSA9IHRoaXMubWV0YWRhdGEudHJlZVBhcmVudFJlbGF0aW9uLnByb3BlcnR5TmFtZTtcbiAgICAgICAgdmFyIGVudGl0eUlkID0gdGhpcy5tZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5nZXRFbnRpdHlWYWx1ZShlbnRpdHkpO1xuICAgICAgICB2YXIgcGFyZW50UmVsYXRpb25NYXAgPSByZWxhdGlvbk1hcHMuZmluZChmdW5jdGlvbiAocmVsYXRpb25NYXApIHsgcmV0dXJuIHJlbGF0aW9uTWFwLmlkID09PSBlbnRpdHlJZDsgfSk7XG4gICAgICAgIHZhciBwYXJlbnRFbnRpdHkgPSBlbnRpdGllcy5maW5kKGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50UmVsYXRpb25NYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLmdldEVudGl0eVZhbHVlKGVudGl0eSkgPT09IHBhcmVudFJlbGF0aW9uTWFwLnBhcmVudElkO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBhcmVudEVudGl0eSkge1xuICAgICAgICAgICAgZW50aXR5W3BhcmVudFByb3BlcnR5XSA9IHBhcmVudEVudGl0eTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQYXJlbnRFbnRpdHlUcmVlKGVudGl0eVtwYXJlbnRQcm9wZXJ0eV0sIGVudGl0aWVzLCByZWxhdGlvbk1hcHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJlZVJlcG9zaXRvcnk7XG59KFJlcG9zaXRvcnkpKTtcbmV4cG9ydCB7IFRyZWVSZXBvc2l0b3J5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRyZWVSZXBvc2l0b3J5LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ29ja3JvYWNoRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9jb2Nrcm9hY2hkYi9Db2Nrcm9hY2hEcml2ZXJcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUvVGFibGVcIjtcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSBcIi4vdGFibGUvVGFibGVDb2x1bW5cIjtcbmltcG9ydCB7IFRhYmxlRm9yZWlnbktleSB9IGZyb20gXCIuL3RhYmxlL1RhYmxlRm9yZWlnbktleVwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuL3RhYmxlL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiLi91dGlsL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IFBvc3RncmVzRHJpdmVyIH0gZnJvbSBcIi4uL2RyaXZlci9wb3N0Z3Jlcy9Qb3N0Z3Jlc0RyaXZlclwiO1xuaW1wb3J0IHsgTXlzcWxEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL215c3FsL015c3FsRHJpdmVyXCI7XG5pbXBvcnQgeyBUYWJsZVVuaXF1ZSB9IGZyb20gXCIuL3RhYmxlL1RhYmxlVW5pcXVlXCI7XG5pbXBvcnQgeyBUYWJsZUNoZWNrIH0gZnJvbSBcIi4vdGFibGUvVGFibGVDaGVja1wiO1xuaW1wb3J0IHsgVGFibGVFeGNsdXNpb24gfSBmcm9tIFwiLi90YWJsZS9UYWJsZUV4Y2x1c2lvblwiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL3ZpZXcvVmlld1wiO1xuaW1wb3J0IHsgVmlld1V0aWxzIH0gZnJvbSBcIi4vdXRpbC9WaWV3VXRpbHNcIjtcbmltcG9ydCB7IEF1cm9yYURhdGFBcGlEcml2ZXIgfSBmcm9tIFwiLi4vZHJpdmVyL2F1cm9yYS1kYXRhLWFwaS9BdXJvcmFEYXRhQXBpRHJpdmVyXCI7XG4vKipcbiAqIENyZWF0ZXMgY29tcGxldGUgdGFibGVzIHNjaGVtYXMgaW4gdGhlIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBlbnRpdHkgbWV0YWRhdGFzLlxuICpcbiAqIFN0ZXBzIGhvdyBzY2hlbWEgaXMgYmVpbmcgYnVpbHQ6XG4gKiAxLiBsb2FkIGxpc3Qgb2YgYWxsIHRhYmxlcyB3aXRoIGNvbXBsZXRlIGNvbHVtbiBhbmQga2V5cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYlxuICogMi4gZHJvcCBhbGwgKG9sZCkgZm9yZWlnbiBrZXlzIHRoYXQgZXhpc3QgaW4gdGhlIHRhYmxlLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1ldGFkYXRhXG4gKiAzLiBjcmVhdGUgbmV3IHRhYmxlcyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYiwgYnV0IGV4aXN0IGluIHRoZSBtZXRhZGF0YVxuICogNC4gZHJvcCBhbGwgY29sdW1ucyBleGlzdCAobGVmdCBvbGQpIGluIHRoZSBkYiB0YWJsZSwgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBtZXRhZGF0YVxuICogNS4gYWRkIGNvbHVtbnMgZnJvbSBtZXRhZGF0YSB3aGljaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgdGFibGVcbiAqIDYuIHVwZGF0ZSBhbGwgZXhpc3QgY29sdW1ucyB3aGljaCBtZXRhZGF0YSBoYXMgY2hhbmdlZFxuICogNy4gdXBkYXRlIHByaW1hcnkga2V5cyAtIHVwZGF0ZSBvbGQgYW5kIGNyZWF0ZSBuZXcgcHJpbWFyeSBrZXkgZnJvbSBjaGFuZ2VkIGNvbHVtbnNcbiAqIDguIGNyZWF0ZSBmb3JlaWduIGtleXMgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRhYmxlIHlldFxuICogOS4gY3JlYXRlIGluZGljZXMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LCBhbmQgZHJvcHMgaW5kaWNlcyB3aGljaCBleGlzdCBpbiB0aGUgZGIsIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWV0YWRhdGEgYW55bW9yZVxuICovXG52YXIgUmRibXNTY2hlbWFCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBSZGJtc1NjaGVtYUJ1aWxkZXIoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBjb21wbGV0ZSBzY2hlbWFzIGZvciB0aGUgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhcy5cbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaXNVc2luZ1RyYW5zYWN0aW9ucywgdGFibGVQYXRocywgZXJyb3JfMSwgcm9sbGJhY2tFcnJvcl8xO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2UgfHwgdGhpcy5jdXJyZW50RGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuZGF0YWJhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLnNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNpbmdUcmFuc2FjdGlvbnMgPSAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQ29ja3JvYWNoRHJpdmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vcHRpb25zLm1pZ3JhdGlvbnNUcmFuc2FjdGlvbk1vZGUgIT09IFwibm9uZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVc2luZ1RyYW5zYWN0aW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCAxMSwgMTcsIDE5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU1ldGFkYXRhVGFibGVJZk5lY2Vzc2FyeSh0aGlzLnF1ZXJ5UnVubmVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aHMgPSB0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcy5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZ2V0VGFibGVzKHRhYmxlUGF0aHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5nZXRWaWV3cyhbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmV4ZWN1dGVTY2hlbWFTeW5jT3BlcmF0aW9uc0luUHJvcGVyT3JkZXIoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb25uZWN0aW9uLnF1ZXJ5UmVzdWx0Q2FjaGUuc3luY2hyb25pemUodGhpcy5xdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNVc2luZ1RyYW5zYWN0aW9ucykgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMTldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEyLCAxNSwgLCAxNl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nVHJhbnNhY3Rpb25zKSByZXR1cm4gWzMgLypicmVhayovLCAxNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsYmFja0Vycm9yXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxNl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6IHRocm93IGVycm9yXzE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc2NoZW1hIGNvbnRhaW5zIHZpZXdzLCBjcmVhdGUgdGhlIHR5cGVvcm1fbWV0YWRhdGEgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZU1ldGFkYXRhVGFibGVJZk5lY2Vzc2FyeSA9IGZ1bmN0aW9uIChxdWVyeVJ1bm5lcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnZpZXdFbnRpdHlUb1N5bmNNZXRhZGF0YXMubGVuZ3RoID4gMCB8fCAodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyICYmIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNHZW5lcmF0ZWRDb2x1bW5zU3VwcG9ydGVkKSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVUeXBlb3JtTWV0YWRhdGFUYWJsZShxdWVyeVJ1bm5lcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgc3FsIHF1ZXJpZXMgdG8gYmUgZXhlY3V0ZWQgYnkgc2NoZW1hIGJ1aWxkZXIuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZVBhdGhzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIgPSB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAsIDcsIDldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGF0aHMgPSB0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcy5tYXAoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZ2V0VGFibGVzKHRhYmxlUGF0aHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5nZXRWaWV3cyhbXSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmVuYWJsZVNxbE1lbW9yeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5leGVjdXRlU2NoZW1hU3luY09wZXJhdGlvbnNJblByb3Blck9yZGVyKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLnN5bmNocm9uaXplKHRoaXMucXVlcnlSdW5uZXIpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA2O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLnF1ZXJ5UnVubmVyLmdldE1lbW9yeVNxbCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGltcG9ydGFudCB0byBkaXNhYmxlIHRoaXMgbW9kZSBkZXNwaXRlIHRoZSBmYWN0IHdlIGFyZSByZWxlYXNlIHF1ZXJ5IGJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgZXhpc3QgZHJpdmVycyB3aGljaCByZXVzZSBzYW1lIHF1ZXJ5IHJ1bm5lci4gQWxzbyBpdHMgaW1wb3J0YW50IHRvIGRpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNxbCBtZW1vcnkgYWZ0ZXIgY2FsbCBvZiBnZXRNZW1vcnlTcWwoKSBtZXRob2QgYmVjYXVzZSBsYXN0IG9uZSBmbHVzaGVzIHNxbCBtZW1vcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmRpc2FibGVTcWxNZW1vcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIucmVsZWFzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUsIFwiZW50aXR5VG9TeW5jTWV0YWRhdGFzXCIsIHtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIG9ubHkgZW50aXRpZXMgdGhhdCBzaG91bGQgYmUgc3luY2VkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXMuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEuc3luY2hyb25pemUgJiYgbWV0YWRhdGEudGFibGVUeXBlICE9PSBcImVudGl0eS1jaGlsZFwiICYmIG1ldGFkYXRhLnRhYmxlVHlwZSAhPT0gXCJ2aWV3XCI7IH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUsIFwidmlld0VudGl0eVRvU3luY01ldGFkYXRhc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIG9ubHkgZW50aXRpZXMgdGhhdCBzaG91bGQgYmUgc3luY2VkIGluIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5lbnRpdHlNZXRhZGF0YXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gbWV0YWRhdGEudGFibGVUeXBlID09PSBcInZpZXdcIiAmJiBtZXRhZGF0YS5zeW5jaHJvbml6ZTsgfSlcbiAgICAgICAgICAgICAgICAvLyBzb3J0IHZpZXdzIGluIGNyZWF0aW9uIG9yZGVyIGJ5IGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgIC5zb3J0KFZpZXdVdGlscy52aWV3TWV0YWRhdGFDbXApO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc2NoZW1hIHN5bmMgb3BlcmF0aW9ucyBpbiBhIHByb3BlciBvcmRlci5cbiAgICAgKiBPcmRlciBvZiBvcGVyYXRpb25zIG1hdHRlciBoZXJlLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZXhlY3V0ZVNjaGVtYVN5bmNPcGVyYXRpb25zSW5Qcm9wZXJPcmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmRyb3BPbGRWaWV3cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wT2xkRm9yZWlnbktleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcE9sZEluZGljZXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZHJvcE9sZENoZWNrcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wT2xkRXhjbHVzaW9ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wQ29tcG9zaXRlVW5pcXVlQ29uc3RyYWludHMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMucmVuYW1lVGFibGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlbmFtZUNvbHVtbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHRoaXMucmVuYW1lVGFibGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZU5ld1RhYmxlcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kcm9wUmVtb3ZlZENvbHVtbnMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYWRkTmV3Q29sdW1ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMudXBkYXRlUHJpbWFyeUtleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnVwZGF0ZUV4aXN0Q29sdW1ucygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTmV3SW5kaWNlcygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlTmV3Q2hlY2tzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVOZXdFeGNsdXNpb25zKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jcmVhdGVDb21wb3NpdGVVbmlxdWVDb25zdHJhaW50cygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlRm9yZWlnbktleXMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNyZWF0ZVZpZXdzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZ2V0VGFibGVQYXRoID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5wYXJzZVRhYmxlTmFtZSh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShwYXJzZWQudGFibGVOYW1lLCBwYXJzZWQuc2NoZW1hIHx8IHRoaXMuY3VycmVudFNjaGVtYSwgcGFyc2VkLmRhdGFiYXNlIHx8IHRoaXMuY3VycmVudERhdGFiYXNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCAob2xkKSBmb3JlaWduIGtleXMgdGhhdCBleGlzdCBpbiB0aGUgdGFibGVzLCBidXQgZG8gbm90IGV4aXN0IGluIHRoZSBlbnRpdHkgbWV0YWRhdGEuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkRm9yZWlnbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xLCB0aGlzXzEsIF9hLCBfYiwgbWV0YWRhdGEsIGVfMV8xO1xuICAgICAgICAgICAgdmFyIGVfMSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMSA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgdGFibGVGb3JlaWduS2V5c1RvRHJvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMS5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlRm9yZWlnbktleXNUb0Ryb3AgPSB0YWJsZS5mb3JlaWduS2V5cy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFGSyA9IG1ldGFkYXRhLmZvcmVpZ25LZXlzLmZpbmQoZnVuY3Rpb24gKG1ldGFkYXRhRm9yZWlnbktleSkgeyByZXR1cm4gKCh0YWJsZUZvcmVpZ25LZXkubmFtZSA9PT0gbWV0YWRhdGFGb3JlaWduS2V5Lm5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlRm9yZWlnbktleSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YUZvcmVpZ25LZXkucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhKSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtZXRhZGF0YUZLXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YWRhdGFGSy5vbkRlbGV0ZSAmJiBtZXRhZGF0YUZLLm9uRGVsZXRlICE9PSB0YWJsZUZvcmVpZ25LZXkub25EZWxldGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YWRhdGFGSy5vblVwZGF0ZSAmJiBtZXRhZGF0YUZLLm9uVXBkYXRlICE9PSB0YWJsZUZvcmVpZ25LZXkub25VcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUZvcmVpZ25LZXlzVG9Ecm9wLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIGZvcmVpZ24ga2V5cyBvZiBcIiArIHRhYmxlLm5hbWUgKyBcIjogXCIgKyB0YWJsZUZvcmVpZ25LZXlzVG9Ecm9wLm1hcChmdW5jdGlvbiAoZGJGb3JlaWduS2V5KSB7IHJldHVybiBkYkZvcmVpZ25LZXkubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGZvcmVpZ24ga2V5cyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMS5xdWVyeVJ1bm5lci5kcm9wRm9yZWlnbktleXModGFibGUsIHRhYmxlRm9yZWlnbktleXNUb0Ryb3ApXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGZvcmVpZ24ga2V5cyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzEobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzFfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWUgdGFibGVzXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5yZW5hbWVUYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIGNvbHVtbnMuXG4gICAgICogV29ya3MgaWYgb25seSBvbmUgY29sdW1uIHBlciB0YWJsZSB3YXMgY2hhbmdlZC5cbiAgICAgKiBDaGFuZ2VzIG9ubHkgY29sdW1uIG5hbWUuIElmIHNvbWV0aGluZyBiZXNpZGVzIG5hbWUgd2FzIGNoYW5nZWQsIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUucmVuYW1lQ29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzIsIHRoaXNfMiwgX2EsIF9iLCBtZXRhZGF0YSwgZV8yXzE7XG4gICAgICAgICAgICB2YXIgZV8yLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8yID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCByZW5hbWVkTWV0YWRhdGFDb2x1bW5zLCByZW5hbWVkVGFibGVDb2x1bW5zLCByZW5hbWVkQ29sdW1uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpc18yLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbHVtbnMubGVuZ3RoICE9PSB0YWJsZS5jb2x1bW5zLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lZE1ldGFkYXRhQ29sdW1ucyA9IG1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWJsZS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKHRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uLmRhdGFiYXNlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRhYmxlQ29sdW1uLnR5cGUgPT09IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRhYmxlQ29sdW1uLmlzTnVsbGFibGUgPT09IGNvbHVtbi5pc051bGxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFibGVDb2x1bW4uaXNVbmlxdWUgPT09IF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZUlzVW5pcXVlKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVkTWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCByZW5hbWVkTWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZWRUYWJsZUNvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAodGFibGVDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtZXRhZGF0YS5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWUgPT09IHRhYmxlQ29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBfdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKGNvbHVtbikgPT09IHRhYmxlQ29sdW1uLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uaXNOdWxsYWJsZSA9PT0gdGFibGVDb2x1bW4uaXNOdWxsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIF90aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZUlzVW5pcXVlKGNvbHVtbikgPT09IHRhYmxlQ29sdW1uLmlzVW5pcXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lZFRhYmxlQ29sdW1ucy5sZW5ndGggPT09IDAgfHwgcmVuYW1lZFRhYmxlQ29sdW1ucy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVkQ29sdW1uID0gcmVuYW1lZFRhYmxlQ29sdW1uc1swXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZWRDb2x1bW4ubmFtZSA9IHJlbmFtZWRNZXRhZGF0YUNvbHVtbnNbMF0uZGF0YWJhc2VOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMi5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcInJlbmFtaW5nIGNvbHVtbiBcXFwiXCIgKyByZW5hbWVkVGFibGVDb2x1bW5zWzBdLm5hbWUgKyBcIlxcXCIgaW4gdG8gXFxcIlwiICsgcmVuYW1lZENvbHVtbi5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMi5xdWVyeVJ1bm5lci5yZW5hbWVDb2x1bW4odGFibGUsIHJlbmFtZWRUYWJsZUNvbHVtbnNbMF0sIHJlbmFtZWRDb2x1bW4pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18yID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8yKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yXzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkSW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzMsIHRoaXNfMywgX2EsIF9iLCBtZXRhZGF0YSwgZV8zXzE7XG4gICAgICAgICAgICB2YXIgZV8zLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8zID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBkcm9wUXVlcmllcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMy5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BRdWVyaWVzID0gdGFibGUuaW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleE1ldGFkYXRhID0gbWV0YWRhdGEuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZSA9PT0gdGFibGVJbmRleC5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLnN5bmNocm9uaXplID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhNZXRhZGF0YS5pc1VuaXF1ZSAhPT0gdGFibGVJbmRleC5pc1VuaXF1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLmlzU3BhdGlhbCAhPT0gdGFibGVJbmRleC5pc1NwYXRpYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIuaXNGdWxsVGV4dENvbHVtblR5cGVTdXBwb3J0ZWQoKSAmJiBpbmRleE1ldGFkYXRhLmlzRnVsbHRleHQgIT09IHRhYmxlSW5kZXguaXNGdWxsdGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE1ldGFkYXRhLmNvbHVtbnMubGVuZ3RoICE9PSB0YWJsZUluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaW5kZXhNZXRhZGF0YS5jb2x1bW5zLmV2ZXJ5KGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIHRhYmxlSW5kZXguY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW4uZGF0YWJhc2VOYW1lKSAhPT0gLTE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhYmxlSW5kZXgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImRyb3BwaW5nIGFuIGluZGV4OiBcXFwiXCIgKyB0YWJsZUluZGV4Lm5hbWUgKyBcIlxcXCIgZnJvbSB0YWJsZSBcIiArIHRhYmxlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLmRyb3BJbmRleCh0YWJsZSwgdGFibGVJbmRleCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChkcm9wUXVlcmllcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzMobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzNfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmRyb3BPbGRDaGVja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF80LCB0aGlzXzQsIF9hLCBfYiwgbWV0YWRhdGEsIGVfNF8xO1xuICAgICAgICAgICAgdmFyIGVfNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXlzcWwgZG9lcyBub3Qgc3VwcG9ydCBjaGVjayBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5kcml2ZXIgaW5zdGFuY2VvZiBNeXNxbERyaXZlciB8fCB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgQXVyb3JhRGF0YUFwaURyaXZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF80ID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBvbGRDaGVja3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzQucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDaGVja3MgPSB0YWJsZS5jaGVja3MuZmlsdGVyKGZ1bmN0aW9uICh0YWJsZUNoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuY2hlY2tzLmZpbmQoZnVuY3Rpb24gKGNoZWNrTWV0YWRhdGEpIHsgcmV0dXJuIGNoZWNrTWV0YWRhdGEubmFtZSA9PT0gdGFibGVDaGVjay5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQ2hlY2tzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc180LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIGNoZWNrIGNvbnN0cmFpbnQ6IFwiICsgb2xkQ2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHsgcmV0dXJuIFwiXFxcIlwiICsgY2hlY2submFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBmcm9tIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc180LnF1ZXJ5UnVubmVyLmRyb3BDaGVja0NvbnN0cmFpbnRzKHRhYmxlLCBvbGRDaGVja3MpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc180ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF80KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV80XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzQgPSB7IGVycm9yOiBlXzRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29tcG9zaXRlVW5pcXVlQ29uc3RyYWludHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF81LCB0aGlzXzUsIF9hLCBfYiwgbWV0YWRhdGEsIGVfNV8xO1xuICAgICAgICAgICAgdmFyIGVfNSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfNSA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgY29tcG9zaXRlVW5pcXVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfNS5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVVuaXF1ZXMgPSB0YWJsZS51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodGFibGVVbmlxdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlVW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA+IDEgJiYgIW1ldGFkYXRhLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlTWV0YWRhdGEpIHsgcmV0dXJuIHVuaXF1ZU1ldGFkYXRhLm5hbWUgPT09IHRhYmxlVW5pcXVlLm5hbWU7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc181LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgb2xkIHVuaXF1ZSBjb25zdHJhaW50OiBcIiArIGNvbXBvc2l0ZVVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpICsgXCIgZnJvbSB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfNS5xdWVyeVJ1bm5lci5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIGNvbXBvc2l0ZVVuaXF1ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc181ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF81KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV81XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzUgPSB7IGVycm9yOiBlXzVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzUpIHRocm93IGVfNS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wT2xkRXhjbHVzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzYsIHRoaXNfNiwgX2EsIF9iLCBtZXRhZGF0YSwgZV82XzE7XG4gICAgICAgICAgICB2YXIgZV82LCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IFBvc3RncmVTUUwgc3VwcG9ydHMgZXhjbHVzaW9uIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgUG9zdGdyZXNEcml2ZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzYgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG9sZEV4Y2x1c2lvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzYucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFeGNsdXNpb25zID0gdGFibGUuZXhjbHVzaW9ucy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlRXhjbHVzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuZXhjbHVzaW9ucy5maW5kKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gZXhjbHVzaW9uTWV0YWRhdGEubmFtZSA9PT0gdGFibGVFeGNsdXNpb24ubmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEV4Y2x1c2lvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzYuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJkcm9wcGluZyBvbGQgZXhjbHVzaW9uIGNvbnN0cmFpbnQ6IFwiICsgb2xkRXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gXCJcXFwiXCIgKyBleGNsdXNpb24ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBmcm9tIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc182LnF1ZXJ5UnVubmVyLmRyb3BFeGNsdXNpb25Db25zdHJhaW50cyh0YWJsZSwgb2xkRXhjbHVzaW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzYobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzZfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNikgdGhyb3cgZV82LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRhYmxlcyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZGF0YWJhc2UgeWV0LlxuICAgICAqIE5ldyB0YWJsZXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBmb3JlaWduIGFuZCBwcmltYXJ5IGtleXMuXG4gICAgICogUHJpbWFyeSBrZXkgb25seSBjYW4gYmUgY3JlYXRlZCBpbiBjb25jbHVzaW9uIHdpdGggYXV0byBnZW5lcmF0ZWQgY29sdW1uLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3VGFibGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfNywgdGhpc183LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzdfMTtcbiAgICAgICAgICAgIHZhciBlXzcsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzcgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RUYWJsZSwgdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RUYWJsZSA9IHRoaXNfNy5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdFRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzcuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJjcmVhdGluZyBhIG5ldyB0YWJsZTogXCIgKyB0aGlzXzcuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBUYWJsZS5jcmVhdGUobWV0YWRhdGEsIHRoaXNfNy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc183LnF1ZXJ5UnVubmVyLmNyZWF0ZVRhYmxlKHRhYmxlLCBmYWxzZSwgZmFsc2UpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc183LnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5wdXNoKHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzcgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzcobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzdfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfNyA9IHsgZXJyb3I6IGVfN18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfOCwgdGhpc184LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzhfMTtcbiAgICAgICAgICAgIHZhciBlXzgsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzggPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RWaWV3LCB2aWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0VmlldyA9IHRoaXNfOC5xdWVyeVJ1bm5lci5sb2FkZWRWaWV3cy5maW5kKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3RXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3LmV4cHJlc3Npb24gPT09IFwic3RyaW5nXCIgPyB2aWV3LmV4cHJlc3Npb24udHJpbSgpIDogdmlldy5leHByZXNzaW9uKF90aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YUV4cHJlc3Npb24gPSB0eXBlb2YgbWV0YWRhdGEuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IG1ldGFkYXRhLmV4cHJlc3Npb24udHJpbSgpIDogbWV0YWRhdGEuZXhwcmVzc2lvbihfdGhpcy5jb25uZWN0aW9uKS5nZXRRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHZpZXcpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpICYmIHZpZXdFeHByZXNzaW9uID09PSBtZXRhZGF0YUV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0VmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiY3JlYXRpbmcgYSBuZXcgdmlldzogXCIgKyB0aGlzXzguZ2V0VGFibGVQYXRoKG1ldGFkYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IFZpZXcuY3JlYXRlKG1ldGFkYXRhLCB0aGlzXzguY29ubmVjdGlvbi5kcml2ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfOC5xdWVyeVJ1bm5lci5jcmVhdGVWaWV3KHZpZXcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184LnF1ZXJ5UnVubmVyLmxvYWRlZFZpZXdzLnB1c2godmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc184ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMudmlld0VudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfOChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOF8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV84ID0geyBlcnJvcjogZV84XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV84KSB0aHJvdyBlXzguZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZHJvcE9sZFZpZXdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZHJvcHBlZFZpZXdzLCB2aWV3RW50aXR5VG9TeW5jTWV0YWRhdGFzLCB2aWV3VG9NZXRhZGF0YSwgX2xvb3BfOSwgX2EsIF9iLCB2aWV3LCBfYywgX2QsIHZpZXcsIHZpZXdNZXRhZGF0YSwgdmlld0V4cHJlc3Npb24sIG1ldGFkYXRhRXhwcmVzc2lvbiwgdmlld0RlcGVuZGVuY3lDaGFpbiwgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcywgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xLCBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSwgdmlldywgZV85XzE7XG4gICAgICAgICAgICB2YXIgZV8xMCwgX2UsIGVfMTEsIF9mLCBlXzksIF9nO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9oLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0VudGl0eVRvU3luY01ldGFkYXRhcyA9IHRoaXMudmlld0VudGl0eVRvU3luY01ldGFkYXRhcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUb01ldGFkYXRhID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfOSA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdNZXRhZGF0YSA9IHZpZXdFbnRpdHlUb1N5bmNNZXRhZGF0YXMuZmluZChmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh2aWV3KSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUb01ldGFkYXRhLnNldCh2aWV3LCB2aWV3TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFZpZXdzKSwgX2IgPSBfYS5uZXh0KCk7ICFfYi5kb25lOyBfYiA9IF9hLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3ID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzkodmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTBfMSkgeyBlXzEwID0geyBlcnJvcjogZV8xMF8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2UgPSBfYS5yZXR1cm4pKSBfZS5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEwKSB0aHJvdyBlXzEwLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGhlciBhbGwgY2hhbmdlZCB2aWV3LCB0aGF0IG5lZWQgYSBkcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfYyA9IF9fdmFsdWVzKHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVmlld3MpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld01ldGFkYXRhID0gdmlld1RvTWV0YWRhdGEuZ2V0KHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0V4cHJlc3Npb24gPSB0eXBlb2Ygdmlldy5leHByZXNzaW9uID09PSBcInN0cmluZ1wiID8gdmlldy5leHByZXNzaW9uLnRyaW0oKSA6IHZpZXcuZXhwcmVzc2lvbih0aGlzLmNvbm5lY3Rpb24pLmdldFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRXhwcmVzc2lvbiA9IHR5cGVvZiB2aWV3TWV0YWRhdGEuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIiA/IHZpZXdNZXRhZGF0YS5leHByZXNzaW9uLnRyaW0oKSA6IHZpZXdNZXRhZGF0YS5leHByZXNzaW9uKHRoaXMuY29ubmVjdGlvbikuZ2V0UXVlcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdFeHByZXNzaW9uID09PSBtZXRhZGF0YUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImRyb3BwaW5nIGFuIG9sZCB2aWV3OiBcIiArIHZpZXcubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgdmlldyB0byBiZSBkcm9wcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzExXzEpIHsgZV8xMSA9IHsgZXJyb3I6IGVfMTFfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9mID0gX2MucmV0dXJuKSkgX2YuY2FsbChfYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMSkgdGhyb3cgZV8xMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0RlcGVuZGVuY3lDaGFpbiA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVfMTIsIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlldyBtZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3TWV0YWRhdGEgPSB2aWV3VG9NZXRhZGF0YS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdXaXRoRGVwZW5kZW5jaWVzID0gW3ZpZXddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIG1ldGFkYXRhIGlzIGtub3duIGZvciB0aGUgdmlldywgc2ltcGx5IHJldHVybiB0aGUgdmlldyBpdHNlbGZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlld1dpdGhEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwga25vd24gdmlld3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh2aWV3VG9NZXRhZGF0YS5lbnRyaWVzKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQoX2MudmFsdWUsIDIpLCBjdXJyZW50VmlldyA9IF9kWzBdLCBjdXJyZW50TWV0YWRhdGEgPSBfZFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzZWxmIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWV3ID09PSB2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudGx5IGl0ZXJhdGVkIHZpZXcgZGVwZW5kcyBvbiB0aGUgcGFzc2VkIGluIHZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWV0YWRhdGEuZGVwZW5kc09uICYmIChjdXJyZW50TWV0YWRhdGEuZGVwZW5kc09uLmhhcyh2aWV3TWV0YWRhdGEudGFyZ2V0KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZXRhZGF0YS5kZXBlbmRzT24uaGFzKHZpZXdNZXRhZGF0YS5uYW1lKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY3VycmVudGx5IGl0ZXJhdGUgdmlldyBhbmQgaXRzIGRlcGVuZGVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3V2l0aERlcGVuZGVuY2llcyA9IHZpZXdXaXRoRGVwZW5kZW5jaWVzLmNvbmNhdCh2aWV3RGVwZW5kZW5jeUNoYWluKGN1cnJlbnRWaWV3KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMTJfMSkgeyBlXzEyID0geyBlcnJvcjogZV8xMl8xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTIpIHRocm93IGVfMTIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFsbCBjb2xsZWN0ZWQgdmlld3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlld1dpdGhEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBkcm9wcGVkIHZpZXdzLCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkVmlld3MubWFwKGZ1bmN0aW9uICh2aWV3KSB7IHJldHVybiB2aWV3RGVwZW5kZW5jeUNoYWluKHZpZXcpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsYXR0ZW5lZCB0byBzaW5nbGUgQXJyYXkgKCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBmbGF0TWFwLCBvbmNlIHN1cHBvcnRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhbGwsIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsLmNvbmNhdChzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvcnQgdGhlIHZpZXdzIHRvIGJlIGRyb3BwZWQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaWV3VXRpbHMudmlld01ldGFkYXRhQ21wKHZpZXdUb01ldGFkYXRhLmdldChhKSwgdmlld1RvTWV0YWRhdGEuZ2V0KGIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBvcmRlciB0byBnZXQgZHJvcCBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfaC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMSA9IF9fdmFsdWVzKGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXMpLCBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSA9IGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMV8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGRyb3BwZWRWaWV3c1dpdGhEZXBlbmRlbmNpZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5kcm9wVmlldyh2aWV3KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xXzEgPSBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfOV8xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV85ID0geyBlcnJvcjogZV85XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzFfMSAmJiAhZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llc18xXzEuZG9uZSAmJiAoX2cgPSBkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEucmV0dXJuKSkgX2cuY2FsbChkcm9wcGVkVmlld3NXaXRoRGVwZW5kZW5jaWVzXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5sb2FkZWRWaWV3cyA9IHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVmlld3MuZmlsdGVyKGZ1bmN0aW9uICh2aWV3KSB7IHJldHVybiAhZHJvcHBlZFZpZXdzV2l0aERlcGVuZGVuY2llcy5oYXModmlldyk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCBjb2x1bW5zIHRoYXQgZXhpc3QgaW4gdGhlIHRhYmxlLCBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1ldGFkYXRhIChsZWZ0IG9sZCkuXG4gICAgICogV2UgZHJvcCB0aGVpciBrZXlzIHRvbywgc2luY2UgaXQgc2hvdWxkIGJlIHNhZmUuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wUmVtb3ZlZENvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xMCwgdGhpc185LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzEzXzE7XG4gICAgICAgICAgICB2YXIgZV8xMywgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTAgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIGRyb3BwZWRUYWJsZUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzkucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkVGFibGVDb2x1bW5zID0gdGFibGUuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKHRhYmxlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWV0YWRhdGEuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW5NZXRhZGF0YSkgeyByZXR1cm4gY29sdW1uTWV0YWRhdGEuZGF0YWJhc2VOYW1lID09PSB0YWJsZUNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcHBlZFRhYmxlQ29sdW1ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfOS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImNvbHVtbnMgZHJvcHBlZCBpbiBcIiArIHRhYmxlLm5hbWUgKyBcIjogXCIgKyBkcm9wcGVkVGFibGVDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzkucXVlcnlSdW5uZXIuZHJvcENvbHVtbnModGFibGUsIGRyb3BwZWRUYWJsZUNvbHVtbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc185ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xMChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTNfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMTMgPSB7IGVycm9yOiBlXzEzXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMykgdGhyb3cgZV8xMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBjb2x1bW5zIGZyb20gbWV0YWRhdGEgd2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gdGhlIHRhYmxlLlxuICAgICAqIENvbHVtbnMgYXJlIGNyZWF0ZWQgd2l0aG91dCBrZXlzLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuYWRkTmV3Q29sdW1ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzExLCB0aGlzXzEwLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzE0XzE7XG4gICAgICAgICAgICB2YXIgZV8xNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTEgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0NvbHVtbk1ldGFkYXRhcywgbmV3VGFibGVDb2x1bW5PcHRpb25zLCBuZXdUYWJsZUNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzEwLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uTWV0YWRhdGFzID0gbWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uICh0YWJsZUNvbHVtbikgeyByZXR1cm4gdGFibGVDb2x1bW4ubmFtZSA9PT0gY29sdW1uTWV0YWRhdGEuZGF0YWJhc2VOYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uTWV0YWRhdGFzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGVDb2x1bW5PcHRpb25zID0gdGhpc18xMC5tZXRhZGF0YUNvbHVtbnNUb1RhYmxlQ29sdW1uT3B0aW9ucyhuZXdDb2x1bW5NZXRhZGF0YXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlQ29sdW1ucyA9IG5ld1RhYmxlQ29sdW1uT3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikgeyByZXR1cm4gbmV3IFRhYmxlQ29sdW1uKG9wdGlvbik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdUYWJsZUNvbHVtbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEwLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwibmV3IGNvbHVtbnMgYWRkZWQ6IFwiICsgbmV3Q29sdW1uTWV0YWRhdGFzLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTAucXVlcnlSdW5uZXIuYWRkQ29sdW1ucyh0YWJsZSwgbmV3VGFibGVDb2x1bW5zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTAgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzExKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNF8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNCA9IHsgZXJyb3I6IGVfMTRfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE0KSB0aHJvdyBlXzE0LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVQcmltYXJ5S2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzEyLCB0aGlzXzExLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzE1XzE7XG4gICAgICAgICAgICB2YXIgZV8xNSwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTIgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIHByaW1hcnlNZXRhZGF0YUNvbHVtbnMsIHByaW1hcnlUYWJsZUNvbHVtbnMsIGNoYW5nZWRQcmltYXJ5Q29sdW1ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTEucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zID0gbWV0YWRhdGEuY29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmlzUHJpbWFyeTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhYmxlQ29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5pc1ByaW1hcnk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHByaW1hcnlUYWJsZUNvbHVtbnMubGVuZ3RoICE9PSBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLmxlbmd0aCAmJiBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLmxlbmd0aCA+IDEpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJpbWFyeUNvbHVtbnMgPSBwcmltYXJ5TWV0YWRhdGFDb2x1bW5zLm1hcChmdW5jdGlvbiAocHJpbWFyeU1ldGFkYXRhQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVDb2x1bW4oVGFibGVVdGlscy5jcmVhdGVUYWJsZUNvbHVtbk9wdGlvbnMocHJpbWFyeU1ldGFkYXRhQ29sdW1uLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTEucXVlcnlSdW5uZXIudXBkYXRlUHJpbWFyeUtleXModGFibGUsIGNoYW5nZWRQcmltYXJ5Q29sdW1ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTEgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzEyKG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNV8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8xNSA9IHsgZXJyb3I6IGVfMTVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE1KSB0aHJvdyBlXzE1LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYWxsIGV4aXN0IGNvbHVtbnMgd2hpY2ggbWV0YWRhdGEgaGFzIGNoYW5nZWQuXG4gICAgICogU3RpbGwgZG9uJ3QgY3JlYXRlIGtleXMuIEFsc28gd2UgZG9uJ3QgdG91Y2ggZm9yZWlnbiBrZXlzIG9mIHRoZSBjaGFuZ2VkIGNvbHVtbnMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS51cGRhdGVFeGlzdENvbHVtbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xMywgdGhpc18xMiwgX2EsIF9iLCBtZXRhZGF0YSwgZV8xNl8xO1xuICAgICAgICAgICAgdmFyIGVfMTYsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEzID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlLCBjaGFuZ2VkQ29sdW1ucywgY2hhbmdlZENvbHVtbnNfMSwgY2hhbmdlZENvbHVtbnNfMV8xLCBjaGFuZ2VkQ29sdW1uLCBlXzE3XzEsIGNoYW5nZWRDb2x1bW5zXzIsIGNoYW5nZWRDb2x1bW5zXzJfMSwgY2hhbmdlZENvbHVtbiwgZV8xOF8xLCBjaGFuZ2VkQ29sdW1uc18zLCBjaGFuZ2VkQ29sdW1uc18zXzEsIGNoYW5nZWRDb2x1bW4sIGVfMTlfMSwgbmV3QW5kT2xkVGFibGVDb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlXzE3LCBfZSwgZV8xOCwgX2YsIGVfMTksIF9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfaC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gdGhpc18xMi5xdWVyeVJ1bm5lci5sb2FkZWRUYWJsZXMuZmluZChmdW5jdGlvbiAodGFibGUpIHsgcmV0dXJuIF90aGlzLmdldFRhYmxlUGF0aCh0YWJsZSkgPT09IF90aGlzLmdldFRhYmxlUGF0aChtZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zID0gdGhpc18xMi5jb25uZWN0aW9uLmRyaXZlci5maW5kQ2hhbmdlZENvbHVtbnModGFibGUuY29sdW1ucywgbWV0YWRhdGEuY29sdW1ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zXzEgPSAoZV8xNyA9IHZvaWQgMCwgX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpKSwgY2hhbmdlZENvbHVtbnNfMV8xID0gY2hhbmdlZENvbHVtbnNfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIWNoYW5nZWRDb2x1bW5zXzFfMS5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtblJlZmVyZW5jZWRGb3JlaWduS2V5cyh0aGlzXzEyLmdldFRhYmxlUGF0aChtZXRhZGF0YSksIGNoYW5nZWRDb2x1bW4uZGF0YWJhc2VOYW1lKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uc18xXzEgPSBjaGFuZ2VkQ29sdW1uc18xLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xN18xID0gX2guc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMTcgPSB7IGVycm9yOiBlXzE3XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZENvbHVtbnNfMV8xICYmICFjaGFuZ2VkQ29sdW1uc18xXzEuZG9uZSAmJiAoX2UgPSBjaGFuZ2VkQ29sdW1uc18xLnJldHVybikpIF9lLmNhbGwoY2hhbmdlZENvbHVtbnNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xNykgdGhyb3cgZV8xNy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFs4LCAxMywgMTQsIDE1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMiA9IChlXzE4ID0gdm9pZCAwLCBfX3ZhbHVlcyhjaGFuZ2VkQ29sdW1ucykpLCBjaGFuZ2VkQ29sdW1uc18yXzEgPSBjaGFuZ2VkQ29sdW1uc18yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5sYWJlbCA9IDk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfMl8xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtbkNvbXBvc2l0ZUluZGljZXModGhpc18xMi5nZXRUYWJsZVBhdGgobWV0YWRhdGEpLCBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfMl8xID0gY2hhbmdlZENvbHVtbnNfMi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiByZXR1cm4gWzMgLypicmVhayovLCAxNV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVfMThfMSA9IF9oLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzE4ID0geyBlcnJvcjogZV8xOF8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZENvbHVtbnNfMl8xICYmICFjaGFuZ2VkQ29sdW1uc18yXzEuZG9uZSAmJiAoX2YgPSBjaGFuZ2VkQ29sdW1uc18yLnJldHVybikpIF9mLmNhbGwoY2hhbmdlZENvbHVtbnNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xOCkgdGhyb3cgZV8xOC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghISh0aGlzXzEyLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpc18xMi5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpKSByZXR1cm4gWzMgLypicmVhayovLCAyM107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gudHJ5cy5wdXNoKFsxNiwgMjEsIDIyLCAyM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5zXzMgPSAoZV8xOSA9IHZvaWQgMCwgX192YWx1ZXMoY2hhbmdlZENvbHVtbnMpKSwgY2hhbmdlZENvbHVtbnNfM18xID0gY2hhbmdlZENvbHVtbnNfMy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxNztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2hhbmdlZENvbHVtbnNfM18xLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDIwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkQ29sdW1uID0gY2hhbmdlZENvbHVtbnNfM18xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTIuZHJvcENvbHVtbkNvbXBvc2l0ZVVuaXF1ZXModGhpc18xMi5nZXRUYWJsZVBhdGgobWV0YWRhdGEpLCBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2gubGFiZWwgPSAxOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtbnNfM18xID0gY2hhbmdlZENvbHVtbnNfMy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDogcmV0dXJuIFszIC8qYnJlYWsqLywgMjNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzE5XzEgPSBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xOSA9IHsgZXJyb3I6IGVfMTlfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDIzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWRDb2x1bW5zXzNfMSAmJiAhY2hhbmdlZENvbHVtbnNfM18xLmRvbmUgJiYgKF9nID0gY2hhbmdlZENvbHVtbnNfMy5yZXR1cm4pKSBfZy5jYWxsKGNoYW5nZWRDb2x1bW5zXzMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTkpIHRocm93IGVfMTkuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbmRPbGRUYWJsZUNvbHVtbnMgPSBjaGFuZ2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNoYW5nZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFRhYmxlQ29sdW1uID0gdGFibGUuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lID09PSBjaGFuZ2VkQ29sdW1uLmRhdGFiYXNlTmFtZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUYWJsZUNvbHVtbk9wdGlvbnMgPSBUYWJsZVV0aWxzLmNyZWF0ZVRhYmxlQ29sdW1uT3B0aW9ucyhjaGFuZ2VkQ29sdW1uLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdUYWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihuZXdUYWJsZUNvbHVtbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29sdW1uOiBvbGRUYWJsZUNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbHVtbjogbmV3VGFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QW5kT2xkVGFibGVDb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xMi5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImNvbHVtbnMgY2hhbmdlZCBpbiBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiLiB1cGRhdGluZzogXCIgKyBjaGFuZ2VkQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gY29sdW1uLmRhdGFiYXNlTmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzEyLnF1ZXJ5UnVubmVyLmNoYW5nZUNvbHVtbnModGFibGUsIG5ld0FuZE9sZFRhYmxlQ29sdW1ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xMiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMTMobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzE2XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzE2ID0geyBlcnJvcjogZV8xNl8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTYpIHRocm93IGVfMTYuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgY29tcG9zaXRlIGluZGljZXMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3SW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE0LCB0aGlzXzEzLCBfYSwgX2IsIG1ldGFkYXRhLCBlXzIwXzE7XG4gICAgICAgICAgICB2YXIgZV8yMCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTQgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0luZGljZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzEzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5kaWNlcyA9IG1ldGFkYXRhLmluZGljZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaW5kZXhNZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmluZGljZXMuZmluZChmdW5jdGlvbiAodGFibGVJbmRleCkgeyByZXR1cm4gdGFibGVJbmRleC5uYW1lID09PSBpbmRleE1ldGFkYXRhLm5hbWU7IH0pICYmIGluZGV4TWV0YWRhdGEuc3luY2hyb25pemUgPT09IHRydWU7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4TWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlSW5kZXguY3JlYXRlKGluZGV4TWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kaWNlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJhZGRpbmcgbmV3IGluZGljZXMgXCIgKyBuZXdJbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTMucXVlcnlSdW5uZXIuY3JlYXRlSW5kaWNlcyh0YWJsZSwgbmV3SW5kaWNlcyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzEzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xNChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjBfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjAgPSB7IGVycm9yOiBlXzIwXzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yMCkgdGhyb3cgZV8yMC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVOZXdDaGVja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xNSwgdGhpc18xNCwgX2EsIF9iLCBtZXRhZGF0YSwgZV8yMV8xO1xuICAgICAgICAgICAgdmFyIGVfMjEsIF9jO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE15c3FsIGRvZXMgbm90IHN1cHBvcnQgY2hlY2sgY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyIGluc3RhbmNlb2YgTXlzcWxEcml2ZXIgfHwgdGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIEF1cm9yYURhdGFBcGlEcml2ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTUgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0NoZWNrcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTQucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGVja3MgPSBtZXRhZGF0YS5jaGVja3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoY2hlY2tNZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmNoZWNrcy5maW5kKGZ1bmN0aW9uICh0YWJsZUNoZWNrKSB7IHJldHVybiB0YWJsZUNoZWNrLm5hbWUgPT09IGNoZWNrTWV0YWRhdGEubmFtZTsgfSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNoZWNrTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlQ2hlY2suY3JlYXRlKGNoZWNrTWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Q2hlY2tzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNC5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImFkZGluZyBuZXcgY2hlY2sgY29uc3RyYWludHM6IFwiICsgbmV3Q2hlY2tzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIFwiXFxcIlwiICsgaW5kZXgubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTQucXVlcnlSdW5uZXIuY3JlYXRlQ2hlY2tDb25zdHJhaW50cyh0YWJsZSwgbmV3Q2hlY2tzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTQgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzE1KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMV8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMSA9IHsgZXJyb3I6IGVfMjFfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIxKSB0aHJvdyBlXzIxLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNvbXBvc2l0ZSB1bmlxdWVzIHdoaWNoIGFyZSBtaXNzaW5nIGluIGRiIHlldC5cbiAgICAgKi9cbiAgICBSZGJtc1NjaGVtYUJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZUNvbXBvc2l0ZVVuaXF1ZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMTYsIHRoaXNfMTUsIF9hLCBfYiwgbWV0YWRhdGEsIGVfMjJfMTtcbiAgICAgICAgICAgIHZhciBlXzIyLCBfYztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xNiA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgY29tcG9zaXRlVW5pcXVlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTUucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVVbmlxdWVzID0gbWV0YWRhdGEudW5pcXVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh1bmlxdWVNZXRhZGF0YSkgeyByZXR1cm4gdW5pcXVlTWV0YWRhdGEuY29sdW1ucy5sZW5ndGggPiAxICYmICF0YWJsZS51bmlxdWVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlVW5pcXVlKSB7IHJldHVybiB0YWJsZVVuaXF1ZS5uYW1lID09PSB1bmlxdWVNZXRhZGF0YS5uYW1lOyB9KTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodW5pcXVlTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlVW5pcXVlLmNyZWF0ZSh1bmlxdWVNZXRhZGF0YSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGVVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNS5jb25uZWN0aW9uLmxvZ2dlci5sb2dTY2hlbWFCdWlsZChcImFkZGluZyBuZXcgdW5pcXVlIGNvbnN0cmFpbnRzOiBcIiArIGNvbXBvc2l0ZVVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIFwiXFxcIlwiICsgdW5pcXVlLm5hbWUgKyBcIlxcXCJcIjsgfSkuam9pbihcIiwgXCIpICsgXCIgaW4gdGFibGUgXFxcIlwiICsgdGFibGUubmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzXzE1LnF1ZXJ5UnVubmVyLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlLCBjb21wb3NpdGVVbmlxdWVzKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfMTUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX192YWx1ZXModGhpcy5lbnRpdHlUb1N5bmNNZXRhZGF0YXMpLCBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhX2IuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IF9iLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs1IC8qeWllbGQqKi8sIF9sb29wXzE2KG1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMl8xID0gX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZV8yMiA9IHsgZXJyb3I6IGVfMjJfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIyKSB0aHJvdyBlXzIyLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzcgLyplbmRmaW5hbGx5Ki9dO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGV4Y2x1c2lvbnMgd2hpY2ggYXJlIG1pc3NpbmcgaW4gZGIgeWV0LlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlTmV3RXhjbHVzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE3LCB0aGlzXzE2LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzIzXzE7XG4gICAgICAgICAgICB2YXIgZV8yMywgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBQb3N0Z3JlU1FMIHN1cHBvcnRzIGV4Y2x1c2lvbiBjb25zdHJhaW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5jb25uZWN0aW9uLmRyaXZlciBpbnN0YW5jZW9mIFBvc3RncmVzRHJpdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xNyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSwgbmV3RXhjbHVzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXNfMTYucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSBfdGhpcy5nZXRUYWJsZVBhdGgobWV0YWRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeGNsdXNpb25zID0gbWV0YWRhdGEuZXhjbHVzaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gIXRhYmxlLmV4Y2x1c2lvbnMuZmluZChmdW5jdGlvbiAodGFibGVFeGNsdXNpb24pIHsgcmV0dXJuIHRhYmxlRXhjbHVzaW9uLm5hbWUgPT09IGV4Y2x1c2lvbk1ldGFkYXRhLm5hbWU7IH0pOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChleGNsdXNpb25NZXRhZGF0YSkgeyByZXR1cm4gVGFibGVFeGNsdXNpb24uY3JlYXRlKGV4Y2x1c2lvbk1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0V4Y2x1c2lvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgXCJjb250aW51ZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE2LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiYWRkaW5nIG5ldyBleGNsdXNpb24gY29uc3RyYWludHM6IFwiICsgbmV3RXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gXCJcXFwiXCIgKyBleGNsdXNpb24ubmFtZSArIFwiXFxcIlwiOyB9KS5qb2luKFwiLCBcIikgKyBcIiBpbiB0YWJsZSBcXFwiXCIgKyB0YWJsZS5uYW1lICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXNfMTYucXVlcnlSdW5uZXIuY3JlYXRlRXhjbHVzaW9uQ29uc3RyYWludHModGFibGUsIG5ld0V4Y2x1c2lvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18xNiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLnRyeXMucHVzaChbMSwgNiwgNywgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfX3ZhbHVlcyh0aGlzLmVudGl0eVRvU3luY01ldGFkYXRhcyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gX2IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzUgLyp5aWVsZCoqLywgX2xvb3BfMTcobWV0YWRhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Quc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2QubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9hLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIzXzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzIzID0geyBlcnJvcjogZV8yM18xIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMjMpIHRocm93IGVfMjMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZm9yZWlnbiBrZXlzIHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIHRoZSB0YWJsZSB5ZXQuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVGb3JlaWduS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzE4LCB0aGlzXzE3LCBfYSwgX2IsIG1ldGFkYXRhLCBlXzI0XzE7XG4gICAgICAgICAgICB2YXIgZV8yNCwgX2M7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTggPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUsIG5ld0tleXMsIGRiRm9yZWlnbktleXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzXzE3LnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKG1ldGFkYXRhKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFwiY29udGludWVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3S2V5cyA9IG1ldGFkYXRhLmZvcmVpZ25LZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGZvcmVpZ25LZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWJsZS5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChkYkZvcmVpZ25LZXkpIHsgcmV0dXJuICgoZGJGb3JlaWduS2V5Lm5hbWUgPT09IGZvcmVpZ25LZXkubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfdGhpcy5nZXRUYWJsZVBhdGgoZGJGb3JlaWduS2V5KSA9PT0gX3RoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhKSkpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3S2V5cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBcImNvbnRpbnVlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiRm9yZWlnbktleXMgPSBuZXdLZXlzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleU1ldGFkYXRhKSB7IHJldHVybiBUYWJsZUZvcmVpZ25LZXkuY3JlYXRlKGZvcmVpZ25LZXlNZXRhZGF0YSwgX3RoaXMuY29ubmVjdGlvbi5kcml2ZXIpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE3LmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiY3JlYXRpbmcgYSBmb3JlaWduIGtleXM6IFwiICsgbmV3S2V5cy5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5Lm5hbWU7IH0pLmpvaW4oXCIsIFwiKSArIFwiIG9uIHRhYmxlIFxcXCJcIiArIHRhYmxlLm5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpc18xNy5xdWVyeVJ1bm5lci5jcmVhdGVGb3JlaWduS2V5cyh0YWJsZSwgZGJGb3JlaWduS2V5cyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzXzE3ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHRoaXMuZW50aXR5VG9TeW5jTWV0YWRhdGFzKSwgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIV9iLmRvbmUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNSAvKnlpZWxkKiovLCBfbG9vcF8xOChtZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjRfMSA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjQgPSB7IGVycm9yOiBlXzI0XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYiAmJiAhX2IuZG9uZSAmJiAoX2MgPSBfYS5yZXR1cm4pKSBfYy5jYWxsKF9hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yNCkgdGhyb3cgZV8yNC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs3IC8qZW5kZmluYWxseSovXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJvcHMgYWxsIGZvcmVpZ24ga2V5cyB3aGVyZSBnaXZlbiBjb2x1bW4gb2YgdGhlIGdpdmVuIHRhYmxlIGlzIGJlaW5nIHVzZWQuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29sdW1uUmVmZXJlbmNlZEZvcmVpZ25LZXlzID0gZnVuY3Rpb24gKHRhYmxlUGF0aCwgY29sdW1uTmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFibGUsIHRhYmxlc1dpdGhGSywgY29sdW1uRm9yZWlnbktleSwgY2xvbmVkVGFibGUsIF9sb29wXzE5LCBfYSwgX2IsIGxvYWRlZFRhYmxlLCB0YWJsZXNXaXRoRktfMSwgdGFibGVzV2l0aEZLXzFfMSwgdGFibGVXaXRoRkssIGVfMjVfMTtcbiAgICAgICAgICAgIHZhciBlXzI2LCBfYywgZV8yNSwgX2Q7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gdGFibGVQYXRoOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzV2l0aEZLID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JlaWduS2V5ID0gdGFibGUuZm9yZWlnbktleXMuZmluZChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gZm9yZWlnbktleS5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRm9yZWlnbktleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lZFRhYmxlID0gdGFibGUuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5mb3JlaWduS2V5cyA9IFtjb2x1bW5Gb3JlaWduS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRksucHVzaChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlRm9yZWlnbktleShjb2x1bW5Gb3JlaWduS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzE5ID0gZnVuY3Rpb24gKGxvYWRlZFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGVuZEZvcmVpZ25LZXlzID0gbG9hZGVkVGFibGUuZm9yZWlnbktleXMuZmlsdGVyKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSkgPT09IHRhYmxlUGF0aCAmJiBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kRm9yZWlnbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkVGFibGUgPSBsb2FkZWRUYWJsZS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWRUYWJsZS5mb3JlaWduS2V5cyA9IGRlcGVuZEZvcmVpZ25LZXlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRksucHVzaChjbG9uZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZEZvcmVpZ25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGRlcGVuZEZvcmVpZ25LZXkpIHsgcmV0dXJuIGxvYWRlZFRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZGVwZW5kRm9yZWlnbktleSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX2EgPSBfX3ZhbHVlcyh0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcyksIF9iID0gX2EubmV4dCgpOyAhX2IuZG9uZTsgX2IgPSBfYS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkVGFibGUgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMTkobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzI2XzEpIHsgZV8yNiA9IHsgZXJyb3I6IGVfMjZfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2IgJiYgIV9iLmRvbmUgJiYgKF9jID0gX2EucmV0dXJuKSkgX2MuY2FsbChfYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yNikgdGhyb3cgZV8yNi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFibGVzV2l0aEZLLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxLCA2LCA3LCA4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRktfMSA9IF9fdmFsdWVzKHRhYmxlc1dpdGhGSyksIHRhYmxlc1dpdGhGS18xXzEgPSB0YWJsZXNXaXRoRktfMS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRhYmxlc1dpdGhGS18xXzEuZG9uZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVdpdGhGSyA9IHRhYmxlc1dpdGhGS18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgcmVsYXRlZCBmb3JlaWduIGtleXMgb2YgXCIgKyB0YWJsZVdpdGhGSy5uYW1lICsgXCI6IFwiICsgdGFibGVXaXRoRksuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5Lm5hbWU7IH0pLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnF1ZXJ5UnVubmVyLmRyb3BGb3JlaWduS2V5cyh0YWJsZVdpdGhGSywgdGFibGVXaXRoRksuZm9yZWlnbktleXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Uuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2UubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNXaXRoRktfMV8xID0gdGFibGVzV2l0aEZLXzEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjVfMSA9IF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMjUgPSB7IGVycm9yOiBlXzI1XzEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZXNXaXRoRktfMV8xICYmICF0YWJsZXNXaXRoRktfMV8xLmRvbmUgJiYgKF9kID0gdGFibGVzV2l0aEZLXzEucmV0dXJuKSkgX2QuY2FsbCh0YWJsZXNXaXRoRktfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMjUpIHRocm93IGVfMjUuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNyAvKmVuZGZpbmFsbHkqL107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyb3BzIGFsbCBjb21wb3NpdGUgaW5kaWNlcywgcmVsYXRlZCB0byBnaXZlbiBjb2x1bW4uXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5kcm9wQ29sdW1uQ29tcG9zaXRlSW5kaWNlcyA9IGZ1bmN0aW9uICh0YWJsZVBhdGgsIGNvbHVtbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhYmxlLCByZWxhdGVkSW5kaWNlcztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHRoaXMucXVlcnlSdW5uZXIubG9hZGVkVGFibGVzLmZpbmQoZnVuY3Rpb24gKHRhYmxlKSB7IHJldHVybiBfdGhpcy5nZXRUYWJsZVBhdGgodGFibGUpID09PSB0YWJsZVBhdGg7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkSW5kaWNlcyA9IHRhYmxlLmluZGljZXMuZmlsdGVyKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXguY29sdW1uTmFtZXMubGVuZ3RoID4gMSAmJiBpbmRleC5jb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbk5hbWUpICE9PSAtMTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRlZEluZGljZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dnZXIubG9nU2NoZW1hQnVpbGQoXCJkcm9wcGluZyByZWxhdGVkIGluZGljZXMgb2YgXFxcIlwiICsgdGFibGVQYXRoICsgXCJcXFwiLlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCI6IFwiICsgcmVsYXRlZEluZGljZXMubWFwKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZTsgfSkuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucXVlcnlSdW5uZXIuZHJvcEluZGljZXModGFibGUsIHJlbGF0ZWRJbmRpY2VzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbGwgY29tcG9zaXRlIHVuaXF1ZXMsIHJlbGF0ZWQgdG8gZ2l2ZW4gY29sdW1uLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuZHJvcENvbHVtbkNvbXBvc2l0ZVVuaXF1ZXMgPSBmdW5jdGlvbiAodGFibGVQYXRoLCBjb2x1bW5OYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0YWJsZSwgcmVsYXRlZFVuaXF1ZXM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSB0aGlzLnF1ZXJ5UnVubmVyLmxvYWRlZFRhYmxlcy5maW5kKGZ1bmN0aW9uICh0YWJsZSkgeyByZXR1cm4gX3RoaXMuZ2V0VGFibGVQYXRoKHRhYmxlKSA9PT0gdGFibGVQYXRoOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFVuaXF1ZXMgPSB0YWJsZS51bmlxdWVzLmZpbHRlcihmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID4gMSAmJiB1bmlxdWUuY29sdW1uTmFtZXMuaW5kZXhPZihjb2x1bW5OYW1lKSAhPT0gLTE7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRVbmlxdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubG9nZ2VyLmxvZ1NjaGVtYUJ1aWxkKFwiZHJvcHBpbmcgcmVsYXRlZCB1bmlxdWUgY29uc3RyYWludHMgb2YgXFxcIlwiICsgdGFibGVQYXRoICsgXCJcXFwiLlxcXCJcIiArIGNvbHVtbk5hbWUgKyBcIlxcXCI6IFwiICsgcmVsYXRlZFVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIHVuaXF1ZS5uYW1lOyB9KS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5xdWVyeVJ1bm5lci5kcm9wVW5pcXVlQ29uc3RyYWludHModGFibGUsIHJlbGF0ZWRVbmlxdWVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb2x1bW5zIGZyb20gdGhlIGdpdmVuIGNvbHVtbiBtZXRhZGF0YXMuXG4gICAgICovXG4gICAgUmRibXNTY2hlbWFCdWlsZGVyLnByb3RvdHlwZS5tZXRhZGF0YUNvbHVtbnNUb1RhYmxlQ29sdW1uT3B0aW9ucyA9IGZ1bmN0aW9uIChjb2x1bW5zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uTWV0YWRhdGEpIHsgcmV0dXJuIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zKGNvbHVtbk1ldGFkYXRhLCBfdGhpcy5jb25uZWN0aW9uLmRyaXZlcik7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0eXBlb3JtIHNlcnZpY2UgdGFibGUgZm9yIHN0b3JpbmcgdXNlciBkZWZpbmVkIFZpZXdzLlxuICAgICAqL1xuICAgIFJkYm1zU2NoZW1hQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlVHlwZW9ybU1ldGFkYXRhVGFibGUgPSBmdW5jdGlvbiAocXVlcnlSdW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNjaGVtYSwgZGF0YWJhc2UsIHR5cGVvcm1NZXRhZGF0YVRhYmxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gdGhpcy5jdXJyZW50U2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLmN1cnJlbnREYXRhYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvcm1NZXRhZGF0YVRhYmxlID0gdGhpcy5jb25uZWN0aW9uLmRyaXZlci5idWlsZFRhYmxlTmFtZShcInR5cGVvcm1fbWV0YWRhdGFcIiwgc2NoZW1hLCBkYXRhYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBxdWVyeVJ1bm5lci5jcmVhdGVUYWJsZShuZXcgVGFibGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZTogZGF0YWJhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlb3JtTWV0YWRhdGFUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1ldGFkYXRhVHlwZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImRhdGFiYXNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFEYXRhYmFzZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFTY2hlbWEgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdWxsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5ub3JtYWxpemVUeXBlKHsgdHlwZTogdGhpcy5jb25uZWN0aW9uLmRyaXZlci5tYXBwZWREYXRhVHlwZXMubWV0YWRhdGFUYWJsZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubm9ybWFsaXplVHlwZSh7IHR5cGU6IHRoaXMuY29ubmVjdGlvbi5kcml2ZXIubWFwcGVkRGF0YVR5cGVzLm1ldGFkYXRhTmFtZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bGxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm5vcm1hbGl6ZVR5cGUoeyB0eXBlOiB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm1hcHBlZERhdGFUeXBlcy5tZXRhZGF0YVZhbHVlIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVsbGFibGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdHJ1ZSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJkYm1zU2NoZW1hQnVpbGRlcjtcbn0oKSk7XG5leHBvcnQgeyBSZGJtc1NjaGVtYUJ1aWxkZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmRibXNTY2hlbWFCdWlsZGVyLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUNoZWNrT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVDb2x1bW5PcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUV4Y2x1c2lvbk9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlRm9yZWlnbktleU9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlSW5kZXhPcHRpb25zLmpzLm1hcFxuIiwiZXhwb3J0IHt9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZU9wdGlvbnMuanMubWFwXG4iLCJleHBvcnQge307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlVW5pcXVlT3B0aW9ucy5qcy5tYXBcbiIsImV4cG9ydCB7fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Vmlld09wdGlvbnMuanMubWFwXG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi9UYWJsZUNvbHVtblwiO1xuaW1wb3J0IHsgVGFibGVJbmRleCB9IGZyb20gXCIuL1RhYmxlSW5kZXhcIjtcbmltcG9ydCB7IFRhYmxlRm9yZWlnbktleSB9IGZyb20gXCIuL1RhYmxlRm9yZWlnbktleVwiO1xuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IFRhYmxlVW5pcXVlIH0gZnJvbSBcIi4vVGFibGVVbmlxdWVcIjtcbmltcG9ydCB7IFRhYmxlQ2hlY2sgfSBmcm9tIFwiLi9UYWJsZUNoZWNrXCI7XG5pbXBvcnQgeyBUYWJsZUV4Y2x1c2lvbiB9IGZyb20gXCIuL1RhYmxlRXhjbHVzaW9uXCI7XG4vKipcbiAqIFRhYmxlIGluIHRoZSBkYXRhYmFzZSByZXByZXNlbnRlZCBpbiB0aGlzIGNsYXNzLlxuICovXG52YXIgVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENvbnN0cnVjdG9yXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZ1bmN0aW9uIFRhYmxlKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGNvbHVtbnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGluZGljZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGljZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIGZvcmVpZ24ga2V5cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZm9yZWlnbktleXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhYmxlIHVuaXF1ZSBjb25zdHJhaW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgY2hlY2sgY29uc3RyYWludHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoZWNrcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGFibGUgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGNsdXNpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGFibGUgd2FzIGp1c3QgY3JlYXRlZC5cbiAgICAgICAgICogVGhpcyBpcyBuZWVkZWQsIGZvciBleGFtcGxlIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2tpcCBwcmltYXJ5IGtleXMgY3JlYXRpb25cbiAgICAgICAgICogZm9yIG5ldyB0YWJsZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmp1c3RDcmVhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gb3B0aW9ucy5kYXRhYmFzZTtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gb3B0aW9ucy5zY2hlbWE7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb2x1bW5zKVxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikgeyByZXR1cm4gbmV3IFRhYmxlQ29sdW1uKGNvbHVtbik7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5kaWNlcylcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljZXMgPSBvcHRpb25zLmluZGljZXMubWFwKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gbmV3IFRhYmxlSW5kZXgoaW5kZXgpOyB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmVpZ25LZXlzKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleXMgPSBvcHRpb25zLmZvcmVpZ25LZXlzLm1hcChmdW5jdGlvbiAoZm9yZWlnbktleSkgeyByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZm9yZWlnbktleSksIHsgcmVmZXJlbmNlZERhdGFiYXNlOiAoZm9yZWlnbktleSA9PT0gbnVsbCB8fCBmb3JlaWduS2V5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb3JlaWduS2V5LnJlZmVyZW5jZWREYXRhYmFzZSkgfHwgb3B0aW9ucy5kYXRhYmFzZSwgcmVmZXJlbmNlZFNjaGVtYTogKGZvcmVpZ25LZXkgPT09IG51bGwgfHwgZm9yZWlnbktleSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZm9yZWlnbktleS5yZWZlcmVuY2VkU2NoZW1hKSB8fCBvcHRpb25zLnNjaGVtYSB9KSk7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudW5pcXVlcylcbiAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZXMgPSBvcHRpb25zLnVuaXF1ZXMubWFwKGZ1bmN0aW9uICh1bmlxdWUpIHsgcmV0dXJuIG5ldyBUYWJsZVVuaXF1ZSh1bmlxdWUpOyB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNoZWNrcylcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrcyA9IG9wdGlvbnMuY2hlY2tzLm1hcChmdW5jdGlvbiAoY2hlY2spIHsgcmV0dXJuIG5ldyBUYWJsZUNoZWNrKGNoZWNrKTsgfSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5leGNsdXNpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVzaW9ucyA9IG9wdGlvbnMuZXhjbHVzaW9ucy5tYXAoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gbmV3IFRhYmxlRXhjbHVzaW9uKGV4Y2x1c2lvbik7IH0pO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanVzdENyZWF0ZWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0aGlzLmp1c3RDcmVhdGVkID0gb3B0aW9ucy5qdXN0Q3JlYXRlZDtcbiAgICAgICAgICAgIHRoaXMuZW5naW5lID0gb3B0aW9ucy5lbmdpbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRhYmxlLnByb3RvdHlwZSwgXCJwcmltYXJ5Q29sdW1uc1wiLCB7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gQWNjZXNzb3JzXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uaXNQcmltYXJ5OyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhpcyB0YWJsZSB0byBhIG5ldyB0YWJsZSB3aXRoIGFsbCBwcm9wZXJ0aWVzIGNsb25lZC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGUoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmRhdGFiYXNlLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uY2xvbmUoKTsgfSksXG4gICAgICAgICAgICBpbmRpY2VzOiB0aGlzLmluZGljZXMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgZm9yZWlnbktleXM6IHRoaXMuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgdW5pcXVlczogdGhpcy51bmlxdWVzLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludC5jbG9uZSgpOyB9KSxcbiAgICAgICAgICAgIGNoZWNrczogdGhpcy5jaGVja3MubWFwKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7IHJldHVybiBjb25zdHJhaW50LmNsb25lKCk7IH0pLFxuICAgICAgICAgICAgZXhjbHVzaW9uczogdGhpcy5leGNsdXNpb25zLm1hcChmdW5jdGlvbiAoY29uc3RyYWludCkgeyByZXR1cm4gY29uc3RyYWludC5jbG9uZSgpOyB9KSxcbiAgICAgICAgICAgIGp1c3RDcmVhdGVkOiB0aGlzLmp1c3RDcmVhdGVkLFxuICAgICAgICAgICAgZW5naW5lOiB0aGlzLmVuZ2luZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgY29sdW1uIGFuZCBjcmVhdGVzIGl0cyBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkQ29sdW1uID0gZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGNvbHVtbiBhbmQgaXRzIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVDb2x1bW4gPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHZhciBmb3VuZENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLm5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGZvdW5kQ29sdW1uKVxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZSh0aGlzLmNvbHVtbnMuaW5kZXhPZihmb3VuZENvbHVtbiksIDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkVW5pcXVlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh1bmlxdWVDb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMudW5pcXVlcy5wdXNoKHVuaXF1ZUNvbnN0cmFpbnQpO1xuICAgICAgICBpZiAodW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWVDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gdW5pcXVlQ29uc3RyYWludC5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICBpZiAodW5pcXVlQ29sdW1uKVxuICAgICAgICAgICAgICAgIHVuaXF1ZUNvbHVtbi5pc1VuaXF1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdW5pcXVlIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVtb3ZlZFVuaXF1ZSkge1xuICAgICAgICB2YXIgZm91bmRVbmlxdWUgPSB0aGlzLnVuaXF1ZXMuZmluZChmdW5jdGlvbiAodW5pcXVlKSB7IHJldHVybiB1bmlxdWUubmFtZSA9PT0gcmVtb3ZlZFVuaXF1ZS5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGZvdW5kVW5pcXVlKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXF1ZXMuc3BsaWNlKHRoaXMudW5pcXVlcy5pbmRleE9mKGZvdW5kVW5pcXVlKSwgMSk7XG4gICAgICAgICAgICBpZiAoZm91bmRVbmlxdWUuY29sdW1uTmFtZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuaXF1ZUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5uYW1lID09PSBmb3VuZFVuaXF1ZS5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXF1ZUNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29sdW1uLmlzVW5pcXVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkQ2hlY2tDb25zdHJhaW50ID0gZnVuY3Rpb24gKGNoZWNrQ29uc3RyYWludCkge1xuICAgICAgICB0aGlzLmNoZWNrcy5wdXNoKGNoZWNrQ29uc3RyYWludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGNoZWNrIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZUNoZWNrQ29uc3RyYWludCA9IGZ1bmN0aW9uIChyZW1vdmVkQ2hlY2spIHtcbiAgICAgICAgdmFyIGZvdW5kQ2hlY2sgPSB0aGlzLmNoZWNrcy5maW5kKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gY2hlY2submFtZSA9PT0gcmVtb3ZlZENoZWNrLm5hbWU7IH0pO1xuICAgICAgICBpZiAoZm91bmRDaGVjaykge1xuICAgICAgICAgICAgdGhpcy5jaGVja3Muc3BsaWNlKHRoaXMuY2hlY2tzLmluZGV4T2YoZm91bmRDaGVjayksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGV4Y2x1c2lvbiBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5hZGRFeGNsdXNpb25Db25zdHJhaW50ID0gZnVuY3Rpb24gKGV4Y2x1c2lvbkNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5leGNsdXNpb25zLnB1c2goZXhjbHVzaW9uQ29uc3RyYWludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGV4Y2x1c2lvbiBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVFeGNsdXNpb25Db25zdHJhaW50ID0gZnVuY3Rpb24gKHJlbW92ZWRFeGNsdXNpb24pIHtcbiAgICAgICAgdmFyIGZvdW5kRXhjbHVzaW9uID0gdGhpcy5leGNsdXNpb25zLmZpbmQoZnVuY3Rpb24gKGV4Y2x1c2lvbikgeyByZXR1cm4gZXhjbHVzaW9uLm5hbWUgPT09IHJlbW92ZWRFeGNsdXNpb24ubmFtZTsgfSk7XG4gICAgICAgIGlmIChmb3VuZEV4Y2x1c2lvbikge1xuICAgICAgICAgICAgdGhpcy5leGNsdXNpb25zLnNwbGljZSh0aGlzLmV4Y2x1c2lvbnMuaW5kZXhPZihmb3VuZEV4Y2x1c2lvbiksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIGZvcmVpZ24ga2V5cy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuYWRkRm9yZWlnbktleSA9IGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgIHRoaXMuZm9yZWlnbktleXMucHVzaChmb3JlaWduS2V5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZm9yZWlnbiBrZXkuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLnJlbW92ZUZvcmVpZ25LZXkgPSBmdW5jdGlvbiAocmVtb3ZlZEZvcmVpZ25LZXkpIHtcbiAgICAgICAgdmFyIGZrID0gdGhpcy5mb3JlaWduS2V5cy5maW5kKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7IHJldHVybiBmb3JlaWduS2V5Lm5hbWUgPT09IHJlbW92ZWRGb3JlaWduS2V5Lm5hbWU7IH0pO1xuICAgICAgICBpZiAoZmspXG4gICAgICAgICAgICB0aGlzLmZvcmVpZ25LZXlzLnNwbGljZSh0aGlzLmZvcmVpZ25LZXlzLmluZGV4T2YoZmspLCAxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgaW5kZXguXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLmFkZEluZGV4ID0gZnVuY3Rpb24gKGluZGV4LCBpc015c3FsKSB7XG4gICAgICAgIGlmIChpc015c3FsID09PSB2b2lkIDApIHsgaXNNeXNxbCA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuaW5kaWNlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgLy8gaW4gTXlzcWwgdW5pcXVlIGluZGljZXMgYW5kIHVuaXF1ZSBjb25zdHJhaW50cyBhcmUgdGhlIHNhbWUgdGhpbmdcbiAgICAgICAgLy8gaWYgaW5kZXggaXMgdW5pcXVlIGFuZCBoYXZlIG9ubHkgb25lIGNvbHVtbiwgd2UgbWFyayB0aGlzIGNvbHVtbiBhcyB1bmlxdWVcbiAgICAgICAgaWYgKGluZGV4LmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJiBpbmRleC5pc1VuaXF1ZSAmJiBpc015c3FsKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMubmFtZSA9PT0gaW5kZXguY29sdW1uTmFtZXNbMF07IH0pO1xuICAgICAgICAgICAgaWYgKGNvbHVtbilcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNVbmlxdWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGluZGV4LlxuICAgICAqL1xuICAgIFRhYmxlLnByb3RvdHlwZS5yZW1vdmVJbmRleCA9IGZ1bmN0aW9uICh0YWJsZUluZGV4LCBpc015c3FsKSB7XG4gICAgICAgIGlmIChpc015c3FsID09PSB2b2lkIDApIHsgaXNNeXNxbCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kaWNlcy5maW5kKGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gaW5kZXgubmFtZSA9PT0gdGFibGVJbmRleC5uYW1lOyB9KTtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmluZGljZXMuc3BsaWNlKHRoaXMuaW5kaWNlcy5pbmRleE9mKGluZGV4KSwgMSk7XG4gICAgICAgICAgICAvLyBpbiBNeXNxbCB1bmlxdWUgaW5kaWNlcyBhbmQgdW5pcXVlIGNvbnN0cmFpbnRzIGFyZSB0aGUgc2FtZSB0aGluZ1xuICAgICAgICAgICAgLy8gaWYgaW5kZXggaXMgdW5pcXVlIGFuZCBoYXZlIG9ubHkgb25lIGNvbHVtbiwgd2UgbW92ZSBgdW5pcXVlYCBhdHRyaWJ1dGUgZnJvbSBpdHMgY29sdW1uXG4gICAgICAgICAgICBpZiAoaW5kZXguY29sdW1uTmFtZXMubGVuZ3RoID09PSAxICYmIGluZGV4LmlzVW5pcXVlICYmIGlzTXlzcWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sdW1uXzEgPSB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5uYW1lID09PSBpbmRleC5jb2x1bW5OYW1lc1swXTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbl8xKVxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5fMS5pc1VuaXF1ZSA9IHRoaXMuaW5kaWNlcy5zb21lKGZ1bmN0aW9uIChpbmQpIHsgcmV0dXJuIGluZC5jb2x1bW5OYW1lcy5sZW5ndGggPT09IDEgJiYgaW5kLmNvbHVtbk5hbWVzWzBdID09PSBjb2x1bW5fMS5uYW1lICYmICEhaW5kZXguaXNVbmlxdWU7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4ubmFtZSA9PT0gbmFtZTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb2x1bW4gaW5kaWNlcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkluZGljZXMgPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGljZXMuZmlsdGVyKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuICEhaW5kZXguY29sdW1uTmFtZXMuZmluZChmdW5jdGlvbiAoY29sdW1uTmFtZSkgeyByZXR1cm4gY29sdW1uTmFtZSA9PT0gY29sdW1uLm5hbWU7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGNvbHVtbiBmb3JlaWduIGtleXMuXG4gICAgICovXG4gICAgVGFibGUucHJvdG90eXBlLmZpbmRDb2x1bW5Gb3JlaWduS2V5cyA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleXMuZmlsdGVyKGZ1bmN0aW9uIChmb3JlaWduS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gISFmb3JlaWduS2V5LmNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjb2x1bW4gdW5pcXVlcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtblVuaXF1ZXMgPSBmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuaXF1ZXMuZmlsdGVyKGZ1bmN0aW9uICh1bmlxdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXVuaXF1ZS5jb2x1bW5OYW1lcy5maW5kKGZ1bmN0aW9uIChjb2x1bW5OYW1lKSB7IHJldHVybiBjb2x1bW5OYW1lID09PSBjb2x1bW4ubmFtZTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgY29sdW1uIGNoZWNrcy5cbiAgICAgKi9cbiAgICBUYWJsZS5wcm90b3R5cGUuZmluZENvbHVtbkNoZWNrcyA9IGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tzLmZpbHRlcihmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiAhIWNoZWNrLmNvbHVtbk5hbWVzLmZpbmQoZnVuY3Rpb24gKGNvbHVtbk5hbWUpIHsgcmV0dXJuIGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RhdGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0YWJsZSBmcm9tIGEgZ2l2ZW4gZW50aXR5IG1ldGFkYXRhLlxuICAgICAqL1xuICAgIFRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHZhciBkYXRhYmFzZSA9IGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlID09PSBkcml2ZXIuZGF0YWJhc2UgPyB1bmRlZmluZWQgOiBlbnRpdHlNZXRhZGF0YS5kYXRhYmFzZTtcbiAgICAgICAgdmFyIHNjaGVtYSA9IGVudGl0eU1ldGFkYXRhLnNjaGVtYSA9PT0gZHJpdmVyLm9wdGlvbnMuc2NoZW1hID8gdW5kZWZpbmVkIDogZW50aXR5TWV0YWRhdGEuc2NoZW1hO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGRhdGFiYXNlOiBlbnRpdHlNZXRhZGF0YS5kYXRhYmFzZSxcbiAgICAgICAgICAgIHNjaGVtYTogZW50aXR5TWV0YWRhdGEuc2NoZW1hLFxuICAgICAgICAgICAgbmFtZTogZHJpdmVyLmJ1aWxkVGFibGVOYW1lKGVudGl0eU1ldGFkYXRhLnRhYmxlTmFtZSwgc2NoZW1hLCBkYXRhYmFzZSksXG4gICAgICAgICAgICBlbmdpbmU6IGVudGl0eU1ldGFkYXRhLmVuZ2luZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGVudGl0eU1ldGFkYXRhLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbjsgfSlcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zKGNvbHVtbiwgZHJpdmVyKTsgfSksXG4gICAgICAgICAgICBpbmRpY2VzOiBlbnRpdHlNZXRhZGF0YS5pbmRpY2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIGluZGV4LnN5bmNocm9uaXplID09PSB0cnVlOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBUYWJsZUluZGV4LmNyZWF0ZShpbmRleCk7IH0pLFxuICAgICAgICAgICAgdW5pcXVlczogZW50aXR5TWV0YWRhdGEudW5pcXVlcy5tYXAoZnVuY3Rpb24gKHVuaXF1ZSkgeyByZXR1cm4gVGFibGVVbmlxdWUuY3JlYXRlKHVuaXF1ZSk7IH0pLFxuICAgICAgICAgICAgY2hlY2tzOiBlbnRpdHlNZXRhZGF0YS5jaGVja3MubWFwKGZ1bmN0aW9uIChjaGVjaykgeyByZXR1cm4gVGFibGVDaGVjay5jcmVhdGUoY2hlY2spOyB9KSxcbiAgICAgICAgICAgIGV4Y2x1c2lvbnM6IGVudGl0eU1ldGFkYXRhLmV4Y2x1c2lvbnMubWFwKGZ1bmN0aW9uIChleGNsdXNpb24pIHsgcmV0dXJuIFRhYmxlRXhjbHVzaW9uLmNyZWF0ZShleGNsdXNpb24pOyB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZShvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZTtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBEYXRhYmFzZSdzIHRhYmxlIGNoZWNrIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUNoZWNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBUYWJsZUNoZWNrKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiB0aGF0IGNvbnRhaW5zIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gb3B0aW9ucy5jb2x1bW5OYW1lcztcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gb3B0aW9ucy5leHByZXNzaW9uO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb3B5IG9mIHRoaXMgY29uc3RyYWludCB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlQ2hlY2sucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2hlY2soe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IHRoaXMuY29sdW1uTmFtZXMgPyBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5jb2x1bW5OYW1lcyksIGZhbHNlKSA6IFtdLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGNoZWNrcyBmcm9tIHRoZSBjaGVjayBtZXRhZGF0YSBvYmplY3QuXG4gICAgICovXG4gICAgVGFibGVDaGVjay5jcmVhdGUgPSBmdW5jdGlvbiAoY2hlY2tNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQ2hlY2soe1xuICAgICAgICAgICAgbmFtZTogY2hlY2tNZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogY2hlY2tNZXRhZGF0YS5leHByZXNzaW9uXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlQ2hlY2s7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVDaGVjayB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUNoZWNrLmpzLm1hcFxuIiwiLyoqXG4gKiBUYWJsZSdzIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIHJlcHJlc2VudGVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUNvbHVtbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVDb2x1bW4ob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBpcyBOVUxMLCBvciBpcyBOT1QgTlVMTCBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyBpZiBjb2x1bW4gaXMgYXV0by1nZW5lcmF0ZWQgc2VxdWVuY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzR2VuZXJhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY29sdW1uIGlzIGEgcHJpbWFyeSBrZXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBoYXMgdW5pcXVlIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VuaXF1ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIGlmIGNvbHVtbiBzdG9yZXMgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiB0eXBlJ3MgbGVuZ3RoLiBVc2VkIG9ubHkgb24gc29tZSBjb2x1bW4gdHlwZXMuXG4gICAgICAgICAqIEZvciBleGFtcGxlIHR5cGUgPSBcInN0cmluZ1wiIGFuZCBsZW5ndGggPSBcIjEwMFwiIG1lYW5zIHRoYXQgT1JNIHdpbGwgY3JlYXRlIGEgY29sdW1uIHdpdGggdHlwZSB2YXJjaGFyKDEwMCkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxlbmd0aCA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFpFUk9GSUxMIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqIElmIHlvdSBzcGVjaWZ5IFpFUk9GSUxMIGZvciBhIG51bWVyaWMgY29sdW1uLCBNeVNRTCBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIFVOU0lHTkVEIGF0dHJpYnV0ZSB0byB0aGUgY29sdW1uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnplcm9maWxsID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQdXRzIFVOU0lHTkVEIGF0dHJpYnV0ZSBvbiB0byBudW1lcmljIGNvbHVtbi4gV29ya3Mgb25seSBmb3IgTXlTUUwuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuc2lnbmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgXCJcIjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggfHwgXCJcIjtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5jaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgICAgICAgICAgdGhpcy5jb2xsYXRpb24gPSBvcHRpb25zLmNvbGxhdGlvbjtcbiAgICAgICAgICAgIHRoaXMucHJlY2lzaW9uID0gb3B0aW9ucy5wcmVjaXNpb247XG4gICAgICAgICAgICB0aGlzLnNjYWxlID0gb3B0aW9ucy5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuemVyb2ZpbGwgPSBvcHRpb25zLnplcm9maWxsIHx8IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy51bnNpZ25lZCA9IHRoaXMuemVyb2ZpbGwgPyB0cnVlIDogKG9wdGlvbnMudW5zaWduZWQgfHwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZSA9IG9wdGlvbnMub25VcGRhdGU7XG4gICAgICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSBvcHRpb25zLmlzTnVsbGFibGUgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzR2VuZXJhdGVkID0gb3B0aW9ucy5pc0dlbmVyYXRlZCB8fCBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGlvblN0cmF0ZWd5ID0gb3B0aW9ucy5nZW5lcmF0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IG9wdGlvbnMuaXNQcmltYXJ5IHx8IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc1VuaXF1ZSA9IG9wdGlvbnMuaXNVbmlxdWUgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSBvcHRpb25zLmlzQXJyYXkgfHwgZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmVudW0gPSBvcHRpb25zLmVudW07XG4gICAgICAgICAgICB0aGlzLmVudW1OYW1lID0gb3B0aW9ucy5lbnVtTmFtZTtcbiAgICAgICAgICAgIHRoaXMuYXNFeHByZXNzaW9uID0gb3B0aW9ucy5hc0V4cHJlc3Npb247XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFR5cGUgPSBvcHRpb25zLmdlbmVyYXRlZFR5cGU7XG4gICAgICAgICAgICB0aGlzLnNwYXRpYWxGZWF0dXJlVHlwZSA9IG9wdGlvbnMuc3BhdGlhbEZlYXR1cmVUeXBlO1xuICAgICAgICAgICAgdGhpcy5zcmlkID0gb3B0aW9ucy5zcmlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhpcyBjb2x1bW4gdG8gYSBuZXcgY29sdW1uIHdpdGggZXhhY3Qgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoaXMgY29sdW1uIGhhcy5cbiAgICAgKi9cbiAgICBUYWJsZUNvbHVtbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb2x1bW4oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aCxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgY2hhcnNldDogdGhpcy5jaGFyc2V0LFxuICAgICAgICAgICAgY29sbGF0aW9uOiB0aGlzLmNvbGxhdGlvbixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdGhpcy5wcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogdGhpcy5zY2FsZSxcbiAgICAgICAgICAgIHplcm9maWxsOiB0aGlzLnplcm9maWxsLFxuICAgICAgICAgICAgdW5zaWduZWQ6IHRoaXMudW5zaWduZWQsXG4gICAgICAgICAgICBlbnVtOiB0aGlzLmVudW0sXG4gICAgICAgICAgICBlbnVtTmFtZTogdGhpcy5lbnVtTmFtZSxcbiAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogdGhpcy5hc0V4cHJlc3Npb24sXG4gICAgICAgICAgICBnZW5lcmF0ZWRUeXBlOiB0aGlzLmdlbmVyYXRlZFR5cGUsXG4gICAgICAgICAgICBkZWZhdWx0OiB0aGlzLmRlZmF1bHQsXG4gICAgICAgICAgICBvblVwZGF0ZTogdGhpcy5vblVwZGF0ZSxcbiAgICAgICAgICAgIGlzTnVsbGFibGU6IHRoaXMuaXNOdWxsYWJsZSxcbiAgICAgICAgICAgIGlzR2VuZXJhdGVkOiB0aGlzLmlzR2VuZXJhdGVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvblN0cmF0ZWd5OiB0aGlzLmdlbmVyYXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIGlzUHJpbWFyeTogdGhpcy5pc1ByaW1hcnksXG4gICAgICAgICAgICBpc1VuaXF1ZTogdGhpcy5pc1VuaXF1ZSxcbiAgICAgICAgICAgIGlzQXJyYXk6IHRoaXMuaXNBcnJheSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudCxcbiAgICAgICAgICAgIHNwYXRpYWxGZWF0dXJlVHlwZTogdGhpcy5zcGF0aWFsRmVhdHVyZVR5cGUsXG4gICAgICAgICAgICBzcmlkOiB0aGlzLnNyaWRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDb2x1bW47XG59KCkpO1xuZXhwb3J0IHsgVGFibGVDb2x1bW4gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVDb2x1bW4uanMubWFwXG4iLCIvKipcbiAqIERhdGFiYXNlJ3MgdGFibGUgZXhjbHVzaW9uIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZUV4Y2x1c2lvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVFeGNsdXNpb24ob3B0aW9ucykge1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG9wdGlvbnMuZXhwcmVzc2lvbjtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiB0aGlzIGNvbnN0cmFpbnQgd2l0aCBleGFjdGx5IHNhbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBUYWJsZUV4Y2x1c2lvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVFeGNsdXNpb24oe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGV4Y2x1c2lvbnMgZnJvbSB0aGUgZXhjbHVzaW9uIG1ldGFkYXRhIG9iamVjdC5cbiAgICAgKi9cbiAgICBUYWJsZUV4Y2x1c2lvbi5jcmVhdGUgPSBmdW5jdGlvbiAoZXhjbHVzaW9uTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUV4Y2x1c2lvbih7XG4gICAgICAgICAgICBuYW1lOiBleGNsdXNpb25NZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogZXhjbHVzaW9uTWV0YWRhdGEuZXhwcmVzc2lvblxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUV4Y2x1c2lvbjtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZUV4Y2x1c2lvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUV4Y2x1c2lvbi5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBGb3JlaWduIGtleSBmcm9tIHRoZSBkYXRhYmFzZSBzdG9yZWQgaW4gdGhpcyBjbGFzcy5cbiAqL1xudmFyIFRhYmxlRm9yZWlnbktleSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVGb3JlaWduS2V5KG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbHVtbiBuYW1lcyB3aGljaCBpbmNsdWRlZCBieSB0aGlzIGZvcmVpZ24ga2V5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1uIG5hbWVzIHdoaWNoIGluY2x1ZGVkIGJ5IHRoaXMgZm9yZWlnbiBrZXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBvcHRpb25zLmNvbHVtbk5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyA9IG9wdGlvbnMucmVmZXJlbmNlZENvbHVtbk5hbWVzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWREYXRhYmFzZSA9IG9wdGlvbnMucmVmZXJlbmNlZERhdGFiYXNlO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZWRTY2hlbWEgPSBvcHRpb25zLnJlZmVyZW5jZWRTY2hlbWE7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSA9IG9wdGlvbnMucmVmZXJlbmNlZFRhYmxlTmFtZTtcbiAgICAgICAgdGhpcy5vbkRlbGV0ZSA9IG9wdGlvbnMub25EZWxldGU7XG4gICAgICAgIHRoaXMub25VcGRhdGUgPSBvcHRpb25zLm9uVXBkYXRlO1xuICAgICAgICB0aGlzLmRlZmVycmFibGUgPSBvcHRpb25zLmRlZmVycmFibGU7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhpcyBmb3JlaWduIGtleSB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlRm9yZWlnbktleS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb3JlaWduS2V5KHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5jb2x1bW5OYW1lcyksIGZhbHNlKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lczogX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVzKSwgZmFsc2UpLFxuICAgICAgICAgICAgcmVmZXJlbmNlZERhdGFiYXNlOiB0aGlzLnJlZmVyZW5jZWREYXRhYmFzZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRTY2hlbWE6IHRoaXMucmVmZXJlbmNlZFNjaGVtYSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiB0aGlzLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IHRoaXMub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiB0aGlzLmRlZmVycmFibGUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFibGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgZ2l2ZW4gZm9yZWlnbiBrZXkgbWV0YWRhdGEuXG4gICAgICovXG4gICAgVGFibGVGb3JlaWduS2V5LmNyZWF0ZSA9IGZ1bmN0aW9uIChtZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb3JlaWduS2V5KHtcbiAgICAgICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICBjb2x1bW5OYW1lczogbWV0YWRhdGEuY29sdW1uTmFtZXMsXG4gICAgICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZXM6IG1ldGFkYXRhLnJlZmVyZW5jZWRDb2x1bW5OYW1lcyxcbiAgICAgICAgICAgIHJlZmVyZW5jZWREYXRhYmFzZTogbWV0YWRhdGEucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLmRhdGFiYXNlLFxuICAgICAgICAgICAgcmVmZXJlbmNlZFNjaGVtYTogbWV0YWRhdGEucmVmZXJlbmNlZEVudGl0eU1ldGFkYXRhLnNjaGVtYSxcbiAgICAgICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IG1ldGFkYXRhLnJlZmVyZW5jZWRUYWJsZVBhdGgsXG4gICAgICAgICAgICBvbkRlbGV0ZTogbWV0YWRhdGEub25EZWxldGUsXG4gICAgICAgICAgICBvblVwZGF0ZTogbWV0YWRhdGEub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBtZXRhZGF0YS5kZWZlcnJhYmxlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUZvcmVpZ25LZXk7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVGb3JlaWduS2V5IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhYmxlRm9yZWlnbktleS5qcy5tYXBcbiIsImltcG9ydCB7IF9fcmVhZCwgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBEYXRhYmFzZSdzIHRhYmxlIGluZGV4IHN0b3JlZCBpbiB0aGlzIGNsYXNzLlxuICovXG52YXIgVGFibGVJbmRleCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVJbmRleChvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb2x1bW5zIGluY2x1ZGVkIGluIHRoaXMgaW5kZXguXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gW107XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IG9wdGlvbnMuY29sdW1uTmFtZXM7XG4gICAgICAgIHRoaXMuaXNVbmlxdWUgPSAhIW9wdGlvbnMuaXNVbmlxdWU7XG4gICAgICAgIHRoaXMuaXNTcGF0aWFsID0gISFvcHRpb25zLmlzU3BhdGlhbDtcbiAgICAgICAgdGhpcy5pc0Z1bGx0ZXh0ID0gISFvcHRpb25zLmlzRnVsbHRleHQ7XG4gICAgICAgIHRoaXMucGFyc2VyID0gb3B0aW9ucy5wYXJzZXI7XG4gICAgICAgIHRoaXMud2hlcmUgPSBvcHRpb25zLndoZXJlID8gb3B0aW9ucy53aGVyZSA6IFwiXCI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhpcyBpbmRleCB3aXRoIGV4YWN0bHkgc2FtZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIFRhYmxlSW5kZXgucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlSW5kZXgoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmNvbHVtbk5hbWVzKSwgZmFsc2UpLFxuICAgICAgICAgICAgaXNVbmlxdWU6IHRoaXMuaXNVbmlxdWUsXG4gICAgICAgICAgICBpc1NwYXRpYWw6IHRoaXMuaXNTcGF0aWFsLFxuICAgICAgICAgICAgaXNGdWxsdGV4dDogdGhpcy5pc0Z1bGx0ZXh0LFxuICAgICAgICAgICAgcGFyc2VyOiB0aGlzLnBhcnNlcixcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLndoZXJlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgaW5kZXggZnJvbSB0aGUgaW5kZXggbWV0YWRhdGEgb2JqZWN0LlxuICAgICAqL1xuICAgIFRhYmxlSW5kZXguY3JlYXRlID0gZnVuY3Rpb24gKGluZGV4TWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KHtcbiAgICAgICAgICAgIG5hbWU6IGluZGV4TWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBpbmRleE1ldGFkYXRhLmNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHsgcmV0dXJuIGNvbHVtbi5kYXRhYmFzZU5hbWU7IH0pLFxuICAgICAgICAgICAgaXNVbmlxdWU6IGluZGV4TWV0YWRhdGEuaXNVbmlxdWUsXG4gICAgICAgICAgICBpc1NwYXRpYWw6IGluZGV4TWV0YWRhdGEuaXNTcGF0aWFsLFxuICAgICAgICAgICAgaXNGdWxsdGV4dDogaW5kZXhNZXRhZGF0YS5pc0Z1bGx0ZXh0LFxuICAgICAgICAgICAgcGFyc2VyOiBpbmRleE1ldGFkYXRhLnBhcnNlcixcbiAgICAgICAgICAgIHdoZXJlOiBpbmRleE1ldGFkYXRhLndoZXJlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlSW5kZXg7XG59KCkpO1xuZXhwb3J0IHsgVGFibGVJbmRleCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZUluZGV4LmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIERhdGFiYXNlJ3MgdGFibGUgdW5pcXVlIGNvbnN0cmFpbnQgc3RvcmVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBUYWJsZVVuaXF1ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZnVuY3Rpb24gVGFibGVVbmlxdWUob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29sdW1ucyB0aGF0IGNvbnRhaW5zIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29sdW1uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmNvbHVtbk5hbWVzID0gb3B0aW9ucy5jb2x1bW5OYW1lcztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiB0aGlzIGNvbnN0cmFpbnQgd2l0aCBleGFjdGx5IHNhbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBUYWJsZVVuaXF1ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgY29sdW1uTmFtZXM6IF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZCh0aGlzLmNvbHVtbk5hbWVzKSwgZmFsc2UpXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0YXRpYyBNZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdW5pcXVlIGZyb20gdGhlIHVuaXF1ZSBtZXRhZGF0YSBvYmplY3QuXG4gICAgICovXG4gICAgVGFibGVVbmlxdWUuY3JlYXRlID0gZnVuY3Rpb24gKHVuaXF1ZU1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgbmFtZTogdW5pcXVlTWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzOiB1bmlxdWVNZXRhZGF0YS5jb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7IHJldHVybiBjb2x1bW4uZGF0YWJhc2VOYW1lOyB9KVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVVuaXF1ZTtcbn0oKSk7XG5leHBvcnQgeyBUYWJsZVVuaXF1ZSB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZVVuaXF1ZS5qcy5tYXBcbiIsInZhciBUYWJsZVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhYmxlVXRpbHMoKSB7XG4gICAgfVxuICAgIFRhYmxlVXRpbHMuY3JlYXRlVGFibGVDb2x1bW5PcHRpb25zID0gZnVuY3Rpb24gKGNvbHVtbk1ldGFkYXRhLCBkcml2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGNvbHVtbk1ldGFkYXRhLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgIGxlbmd0aDogZHJpdmVyLmdldENvbHVtbkxlbmd0aChjb2x1bW5NZXRhZGF0YSksXG4gICAgICAgICAgICB3aWR0aDogY29sdW1uTWV0YWRhdGEud2lkdGgsXG4gICAgICAgICAgICBjaGFyc2V0OiBjb2x1bW5NZXRhZGF0YS5jaGFyc2V0LFxuICAgICAgICAgICAgY29sbGF0aW9uOiBjb2x1bW5NZXRhZGF0YS5jb2xsYXRpb24sXG4gICAgICAgICAgICBwcmVjaXNpb246IGNvbHVtbk1ldGFkYXRhLnByZWNpc2lvbixcbiAgICAgICAgICAgIHNjYWxlOiBjb2x1bW5NZXRhZGF0YS5zY2FsZSxcbiAgICAgICAgICAgIHplcm9maWxsOiBjb2x1bW5NZXRhZGF0YS56ZXJvZmlsbCxcbiAgICAgICAgICAgIHVuc2lnbmVkOiBjb2x1bW5NZXRhZGF0YS51bnNpZ25lZCxcbiAgICAgICAgICAgIGFzRXhwcmVzc2lvbjogY29sdW1uTWV0YWRhdGEuYXNFeHByZXNzaW9uLFxuICAgICAgICAgICAgZ2VuZXJhdGVkVHlwZTogY29sdW1uTWV0YWRhdGEuZ2VuZXJhdGVkVHlwZSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGRyaXZlci5ub3JtYWxpemVEZWZhdWx0KGNvbHVtbk1ldGFkYXRhKSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjb2x1bW5NZXRhZGF0YS5vblVwZGF0ZSxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGNvbHVtbk1ldGFkYXRhLmNvbW1lbnQsXG4gICAgICAgICAgICBpc0dlbmVyYXRlZDogY29sdW1uTWV0YWRhdGEuaXNHZW5lcmF0ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uU3RyYXRlZ3k6IGNvbHVtbk1ldGFkYXRhLmdlbmVyYXRpb25TdHJhdGVneSxcbiAgICAgICAgICAgIGlzTnVsbGFibGU6IGNvbHVtbk1ldGFkYXRhLmlzTnVsbGFibGUsXG4gICAgICAgICAgICB0eXBlOiBkcml2ZXIubm9ybWFsaXplVHlwZShjb2x1bW5NZXRhZGF0YSksXG4gICAgICAgICAgICBpc1ByaW1hcnk6IGNvbHVtbk1ldGFkYXRhLmlzUHJpbWFyeSxcbiAgICAgICAgICAgIGlzVW5pcXVlOiBkcml2ZXIubm9ybWFsaXplSXNVbmlxdWUoY29sdW1uTWV0YWRhdGEpLFxuICAgICAgICAgICAgaXNBcnJheTogY29sdW1uTWV0YWRhdGEuaXNBcnJheSB8fCBmYWxzZSxcbiAgICAgICAgICAgIGVudW06IGNvbHVtbk1ldGFkYXRhLmVudW0gPyBjb2x1bW5NZXRhZGF0YS5lbnVtLm1hcChmdW5jdGlvbiAodmFsKSB7IHJldHVybiB2YWwgKyBcIlwiOyB9KSA6IGNvbHVtbk1ldGFkYXRhLmVudW0sXG4gICAgICAgICAgICBlbnVtTmFtZTogY29sdW1uTWV0YWRhdGEuZW51bU5hbWUsXG4gICAgICAgICAgICBzcGF0aWFsRmVhdHVyZVR5cGU6IGNvbHVtbk1ldGFkYXRhLnNwYXRpYWxGZWF0dXJlVHlwZSxcbiAgICAgICAgICAgIHNyaWQ6IGNvbHVtbk1ldGFkYXRhLnNyaWRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFRhYmxlVXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFibGVVdGlscy5qcy5tYXBcbiIsInZhciBWaWV3VXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmlld1V0aWxzKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJhdG9yIGZvciAuc29ydCgpIHRoYXQgd2lsbCBvcmRlciB2aWV3cyBiYXNlcyBvbiBkZXBlbmRlbmNpZXMgaW4gY3JlYXRpb24gb3JkZXJcbiAgICAgKi9cbiAgICBWaWV3VXRpbHMudmlld01ldGFkYXRhQ21wID0gZnVuY3Rpb24gKG1ldGFkYXRhQSwgbWV0YWRhdGFCKSB7XG4gICAgICAgIGlmICghbWV0YWRhdGFBIHx8ICFtZXRhZGF0YUIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YUEuZGVwZW5kc09uICYmIChtZXRhZGF0YUEuZGVwZW5kc09uLmhhcyhtZXRhZGF0YUIudGFyZ2V0KSB8fFxuICAgICAgICAgICAgbWV0YWRhdGFBLmRlcGVuZHNPbi5oYXMobWV0YWRhdGFCLm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhQi5kZXBlbmRzT24gJiYgKG1ldGFkYXRhQi5kZXBlbmRzT24uaGFzKG1ldGFkYXRhQS50YXJnZXQpIHx8XG4gICAgICAgICAgICBtZXRhZGF0YUIuZGVwZW5kc09uLmhhcyhtZXRhZGF0YUEubmFtZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld1V0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFZpZXdVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3VXRpbHMuanMubWFwXG4iLCIvKipcbiAqIFZpZXcgaW4gdGhlIGRhdGFiYXNlIHJlcHJlc2VudGVkIGluIHRoaXMgY2xhc3MuXG4gKi9cbnZhciBWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBWaWV3KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBvcHRpb25zLmRhdGFiYXNlO1xuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBvcHRpb25zLnNjaGVtYTtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG9wdGlvbnMuZXhwcmVzc2lvbjtcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxpemVkID0gISFvcHRpb25zLm1hdGVyaWFsaXplZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIE1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoaXMgdGFibGUgdG8gYSBuZXcgdGFibGUgd2l0aCBhbGwgcHJvcGVydGllcyBjbG9uZWQuXG4gICAgICovXG4gICAgVmlldy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlldyh7XG4gICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRoaXMubWF0ZXJpYWxpemVkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHZpZXcgZnJvbSBhIGdpdmVuIGVudGl0eSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBWaWV3LmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnRpdHlNZXRhZGF0YSwgZHJpdmVyKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgZGF0YWJhc2U6IGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlLFxuICAgICAgICAgICAgc2NoZW1hOiBlbnRpdHlNZXRhZGF0YS5zY2hlbWEsXG4gICAgICAgICAgICBuYW1lOiBkcml2ZXIuYnVpbGRUYWJsZU5hbWUoZW50aXR5TWV0YWRhdGEudGFibGVOYW1lLCBlbnRpdHlNZXRhZGF0YS5zY2hlbWEsIGVudGl0eU1ldGFkYXRhLmRhdGFiYXNlKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGVudGl0eU1ldGFkYXRhLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IGVudGl0eU1ldGFkYXRhLnRhYmxlTWV0YWRhdGFBcmdzLm1hdGVyaWFsaXplZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXcob3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gVmlldztcbn0oKSk7XG5leHBvcnQgeyBWaWV3IH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXcuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yLCBfX3JlYWQsIF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEJyb2FkY2FzdGVyUmVzdWx0IH0gZnJvbSBcIi4vQnJvYWRjYXN0ZXJSZXN1bHRcIjtcbi8qKlxuICogQnJvYWRjYXN0ZXIgcHJvdmlkZXMgYSBoZWxwZXIgbWV0aG9kcyB0byBicm9hZGNhc3QgZXZlbnRzIHRvIHRoZSBzdWJzY3JpYmVycy5cbiAqL1xudmFyIEJyb2FkY2FzdGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb25zdHJ1Y3RvclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmdW5jdGlvbiBCcm9hZGNhc3RlcihxdWVyeVJ1bm5lcikge1xuICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyID0gcXVlcnlSdW5uZXI7XG4gICAgfVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQdWJsaWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGJyb2FkY2FzdEZ1bmN0aW9uO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJyb2FkY2FzdGVyUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RGdW5jdGlvbiA9IHRoaXNbXCJicm9hZGNhc3RcIiArIGV2ZW50ICsgXCJFdmVudFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnJvYWRjYXN0RnVuY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfYSA9IGJyb2FkY2FzdEZ1bmN0aW9uKS5jYWxsLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFt0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRdLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXN1bHQud2FpdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJCRUZPUkVfSU5TRVJUXCIgZXZlbnQuXG4gICAgICogQmVmb3JlIGluc2VydCBldmVudCBpcyBleGVjdXRlZCBiZWZvcmUgZW50aXR5IGlzIGJlaW5nIGluc2VydGVkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQWxsIHN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIHdobyBsaXN0ZW5lZCB0byB0aGlzIGV2ZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgKiBTdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyBjYW4gcmV0dXJuIHByb21pc2VzLCBpdCB3aWxsIHdhaXQgdW50aWwgdGhleSBhcmUgcmVzb2x2ZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24sIGRvIG5vdCBjaGFuZ2UgY29kZSBzdHJ1Y3R1cmUuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEJlZm9yZUluc2VydEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0eSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW50aXR5ICYmIG1ldGFkYXRhLmJlZm9yZUluc2VydExpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmJlZm9yZUluc2VydExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5iZWZvcmVJbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlSW5zZXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJCRUZPUkVfVVBEQVRFXCIgZXZlbnQuXG4gICAgICogQmVmb3JlIHVwZGF0ZSBldmVudCBpcyBleGVjdXRlZCBiZWZvcmUgZW50aXR5IGlzIGJlaW5nIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVVcGRhdGVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5LCB1cGRhdGVkQ29sdW1ucywgdXBkYXRlZFJlbGF0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW50aXR5ICYmIG1ldGFkYXRhLmJlZm9yZVVwZGF0ZUxpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmJlZm9yZVVwZGF0ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5iZWZvcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZUVudGl0eTogZGF0YWJhc2VFbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQ29sdW1uczogdXBkYXRlZENvbHVtbnMgfHwgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUmVsYXRpb25zOiB1cGRhdGVkUmVsYXRpb25zIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQkVGT1JFX1JFTU9WRVwiIGV2ZW50LlxuICAgICAqIEJlZm9yZSByZW1vdmUgZXZlbnQgaXMgZXhlY3V0ZWQgYmVmb3JlIGVudGl0eSBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVSZW1vdmVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgbWV0YWRhdGEuYmVmb3JlUmVtb3ZlTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmlzQWxsb3dlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRpb25SZXN1bHQgPSBsaXN0ZW5lci5leGVjdXRlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzQWxsb3dlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWV0YWRhdGEudGFyZ2V0KSAmJiBzdWJzY3JpYmVyLmJlZm9yZVJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5iZWZvcmVSZW1vdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyOiBfdGhpcy5xdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlRW50aXR5OiBkYXRhYmFzZUVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBtZXRhZGF0YS5nZXRFbnRpdHlJZE1peGVkTWFwKGRhdGFiYXNlRW50aXR5KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX0lOU0VSVFwiIGV2ZW50LlxuICAgICAqIEFmdGVyIGluc2VydCBldmVudCBpcyBleGVjdXRlZCBhZnRlciBlbnRpdHkgaXMgYmVpbmcgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICogQWxsIHN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIHdobyBsaXN0ZW5lZCB0byB0aGlzIGV2ZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgKiBTdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyBjYW4gcmV0dXJuIHByb21pc2VzLCBpdCB3aWxsIHdhaXQgdW50aWwgdGhleSBhcmUgcmVzb2x2ZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBoYXMgYSBwZXJmb3JtYW5jZS1vcHRpbWl6ZWQgY29kZSBvcmdhbml6YXRpb24sIGRvIG5vdCBjaGFuZ2UgY29kZSBzdHJ1Y3R1cmUuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVySW5zZXJ0RXZlbnQgPSBmdW5jdGlvbiAocmVzdWx0LCBtZXRhZGF0YSwgZW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJJbnNlcnRMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlckluc2VydExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlckluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlckluc2VydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQkVGT1JFX1RSQU5TQUNUSU9OX1NUQVJUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEJlZm9yZVRyYW5zYWN0aW9uU3RhcnRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25TdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5iZWZvcmVUcmFuc2FjdGlvblN0YXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX1RSQU5TQUNUSU9OX1NUQVJUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVyVHJhbnNhY3Rpb25TdGFydEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlci5hZnRlclRyYW5zYWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvblN0YXJ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9UUkFOU0FDVElPTl9DT01NSVRcIiBldmVudC5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0QmVmb3JlVHJhbnNhY3Rpb25Db21taXRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Db21taXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Db21taXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbjogX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyOiBfdGhpcy5xdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3RzIFwiQUZURVJfVFJBTlNBQ1RJT05fQ09NTUlUXCIgZXZlbnQuXG4gICAgICovXG4gICAgQnJvYWRjYXN0ZXIucHJvdG90eXBlLmJyb2FkY2FzdEFmdGVyVHJhbnNhY3Rpb25Db21taXRFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvbkNvbW1pdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclRyYW5zYWN0aW9uQ29tbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcjogX3RoaXMucXVlcnlSdW5uZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBfdGhpcy5xdWVyeVJ1bm5lci5tYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkJFRk9SRV9UUkFOU0FDVElPTl9ST0xMQkFDS1wiIGV2ZW50LlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RCZWZvcmVUcmFuc2FjdGlvblJvbGxiYWNrRXZlbnQgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmJlZm9yZVRyYW5zYWN0aW9uUm9sbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYmVmb3JlVHJhbnNhY3Rpb25Sb2xsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJBRlRFUl9UUkFOU0FDVElPTl9ST0xMQkFDS1wiIGV2ZW50LlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlclRyYW5zYWN0aW9uUm9sbGJhY2tFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuYWZ0ZXJUcmFuc2FjdGlvblJvbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRpb25SZXN1bHQgPSBzdWJzY3JpYmVyLmFmdGVyVHJhbnNhY3Rpb25Sb2xsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdHMgXCJBRlRFUl9VUERBVEVcIiBldmVudC5cbiAgICAgKiBBZnRlciB1cGRhdGUgZXZlbnQgaXMgZXhlY3V0ZWQgYWZ0ZXIgZW50aXR5IGlzIGJlaW5nIHVwZGF0ZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqIEFsbCBzdWJzY3JpYmVycyBhbmQgZW50aXR5IGxpc3RlbmVycyB3aG8gbGlzdGVuZWQgdG8gdGhpcyBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGF0IHRoaXMgcG9pbnQuXG4gICAgICogU3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgY2FuIHJldHVybiBwcm9taXNlcywgaXQgd2lsbCB3YWl0IHVudGlsIHRoZXkgYXJlIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaGFzIGEgcGVyZm9ybWFuY2Utb3B0aW1pemVkIGNvZGUgb3JnYW5pemF0aW9uLCBkbyBub3QgY2hhbmdlIGNvZGUgc3RydWN0dXJlLlxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyLnByb3RvdHlwZS5icm9hZGNhc3RBZnRlclVwZGF0ZUV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0eSwgZGF0YWJhc2VFbnRpdHksIHVwZGF0ZWRDb2x1bW5zLCB1cGRhdGVkUmVsYXRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJVcGRhdGVMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlclVwZGF0ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlclVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VFbnRpdHk6IGRhdGFiYXNlRW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZENvbHVtbnM6IHVwZGF0ZWRDb2x1bW5zIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFJlbGF0aW9uczogdXBkYXRlZFJlbGF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHJvbWlzZXMucHVzaChleGVjdXRpb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX1JFTU9WRVwiIGV2ZW50LlxuICAgICAqIEFmdGVyIHJlbW92ZSBldmVudCBpcyBleGVjdXRlZCBhZnRlciBlbnRpdHkgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBBbGwgc3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgd2hvIGxpc3RlbmVkIHRvIHRoaXMgZXZlbnQgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGlzIHBvaW50LlxuICAgICAqIFN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIGNhbiByZXR1cm4gcHJvbWlzZXMsIGl0IHdpbGwgd2FpdCB1bnRpbCB0aGV5IGFyZSByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGhhcyBhIHBlcmZvcm1hbmNlLW9wdGltaXplZCBjb2RlIG9yZ2FuaXphdGlvbiwgZG8gbm90IGNoYW5nZSBjb2RlIHN0cnVjdHVyZS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0QWZ0ZXJSZW1vdmVFdmVudCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdHksIGRhdGFiYXNlRW50aXR5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbnRpdHkgJiYgbWV0YWRhdGEuYWZ0ZXJSZW1vdmVMaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5hZnRlclJlbW92ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5pc0FsbG93ZWQoZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24uc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0FsbG93ZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIG1ldGFkYXRhLnRhcmdldCkgJiYgc3Vic2NyaWJlci5hZnRlclJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gc3Vic2NyaWJlci5hZnRlclJlbW92ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcjogX3RoaXMucXVlcnlSdW5uZXIubWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VFbnRpdHk6IGRhdGFiYXNlRW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IG1ldGFkYXRhLmdldEVudGl0eUlkTWl4ZWRNYXAoZGF0YWJhc2VFbnRpdHkpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYGJyb2FkY2FzdExvYWRGb3JBbGxFdmVudGBcbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0TG9hZEV2ZW50c0ZvckFsbCA9IGZ1bmN0aW9uIChyZXN1bHQsIG1ldGFkYXRhLCBlbnRpdGllcykge1xuICAgICAgICByZXR1cm4gdGhpcy5icm9hZGNhc3RMb2FkRXZlbnQocmVzdWx0LCBtZXRhZGF0YSwgZW50aXRpZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0cyBcIkFGVEVSX0xPQURcIiBldmVudCBmb3IgYWxsIGdpdmVuIGVudGl0aWVzLCBhbmQgdGhlaXIgc3ViLWVudGl0aWVzLlxuICAgICAqIEFmdGVyIGxvYWQgZXZlbnQgaXMgZXhlY3V0ZWQgYWZ0ZXIgZW50aXR5IGhhcyBiZWVuIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBBbGwgc3Vic2NyaWJlcnMgYW5kIGVudGl0eSBsaXN0ZW5lcnMgd2hvIGxpc3RlbmVkIHRvIHRoaXMgZXZlbnQgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGlzIHBvaW50LlxuICAgICAqIFN1YnNjcmliZXJzIGFuZCBlbnRpdHkgbGlzdGVuZXJzIGNhbiByZXR1cm4gcHJvbWlzZXMsIGl0IHdpbGwgd2FpdCB1bnRpbCB0aGV5IGFyZSByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGhhcyBhIHBlcmZvcm1hbmNlLW9wdGltaXplZCBjb2RlIG9yZ2FuaXphdGlvbiwgZG8gbm90IGNoYW5nZSBjb2RlIHN0cnVjdHVyZS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuYnJvYWRjYXN0TG9hZEV2ZW50ID0gZnVuY3Rpb24gKHJlc3VsdCwgbWV0YWRhdGEsIGVudGl0aWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIFByb21pc2UpIC8vIHRvZG86IGNoZWNrIHdoeSBuZWVkIHRoaXM/XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29sbGVjdCBsb2FkIGV2ZW50cyBmb3IgYWxsIGNoaWxkcmVuIGVudGl0aWVzIHRoYXQgd2VyZSBsb2FkZWQgd2l0aCB0aGUgbWFpbiBlbnRpdHlcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5yZWxhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEucmVsYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIGxhenkgcmVsYXRpb25zIHdlIGNhbm5vdCBzaW1wbHkgYWNjZXNzIHRvIGVudGl0eSBwcm9wZXJ0eSBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSBnZXR0ZXIgYW5kIGEgZGF0YWJhc2UgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmlzTGF6eSAmJiAhZW50aXR5Lmhhc093blByb3BlcnR5KHJlbGF0aW9uLnByb3BlcnR5TmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlbGF0aW9uLmdldEVudGl0eVZhbHVlKGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmJyb2FkY2FzdExvYWRFdmVudChyZXN1bHQsIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmFmdGVyTG9hZExpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZnRlckxvYWRMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLmlzQWxsb3dlZChlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0aW9uUmVzdWx0ID0gbGlzdGVuZXIuZXhlY3V0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByb21pc2VzLnB1c2goZXhlY3V0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3RoaXMucXVlcnlSdW5uZXIuY29ubmVjdGlvbi5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5xdWVyeVJ1bm5lci5jb25uZWN0aW9uLnN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzQWxsb3dlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgbWV0YWRhdGEudGFyZ2V0KSAmJiBzdWJzY3JpYmVyLmFmdGVyTG9hZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGlvblJlc3VsdCA9IHN1YnNjcmliZXIuYWZ0ZXJMb2FkKGVudGl0eSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IF90aGlzLnF1ZXJ5UnVubmVyLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSdW5uZXI6IF90aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IF90aGlzLnF1ZXJ5UnVubmVyLm1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlcy5wdXNoKGV4ZWN1dGlvblJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgc3Vic2NyaWJlcidzIG1ldGhvZHMgY2FuIGJlIGV4ZWN1dGVkIGJ5IGNoZWNraW5nIGlmIGl0cyBkb24ndCBsaXN0ZW4gdG8gdGhlIHBhcnRpY3VsYXIgZW50aXR5LFxuICAgICAqIG9yIGxpc3RlbnMgb3VyIGVudGl0eS5cbiAgICAgKi9cbiAgICBCcm9hZGNhc3Rlci5wcm90b3R5cGUuaXNBbGxvd2VkU3Vic2NyaWJlciA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuICFzdWJzY3JpYmVyLmxpc3RlblRvIHx8XG4gICAgICAgICAgICAhc3Vic2NyaWJlci5saXN0ZW5UbygpIHx8XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmxpc3RlblRvKCkgPT09IE9iamVjdCB8fFxuICAgICAgICAgICAgc3Vic2NyaWJlci5saXN0ZW5UbygpID09PSB0YXJnZXQgfHxcbiAgICAgICAgICAgIHN1YnNjcmliZXIubGlzdGVuVG8oKS5pc1Byb3RvdHlwZU9mKHRhcmdldCk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvYWRjYXN0ZXI7XG59KCkpO1xuZXhwb3J0IHsgQnJvYWRjYXN0ZXIgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvYWRjYXN0ZXIuanMubWFwXG4iLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEJyb2FkY2FzdGVyIGV4ZWN1dGlvbiByZXN1bHQgLSBwcm9taXNlcyBleGVjdXRlZCBieSBvcGVyYXRpb25zIGFuZCBudW1iZXIgb2YgZXhlY3V0ZWQgbGlzdGVuZXJzIGFuZCBzdWJzY3JpYmVycy5cbiAqL1xudmFyIEJyb2FkY2FzdGVyUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJyb2FkY2FzdGVyUmVzdWx0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGV4ZWN1dGVkIGxpc3RlbmVycyBhbmQgc3Vic2NyaWJlcnMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb21pc2VzIHJldHVybmVkIGJ5IGxpc3RlbmVycyBhbmQgc3Vic2NyaWJlcnMgd2hpY2ggbmVlZHMgdG8gYmUgYXdhaXRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJvbWlzZXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdCBmb3IgYWxsIHByb21pc2VzIHRvIHNldHRsZVxuICAgICAqL1xuICAgIEJyb2FkY2FzdGVyUmVzdWx0LnByb3RvdHlwZS53YWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnByb21pc2VzLmxlbmd0aCA+IDApKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKHRoaXMucHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvYWRjYXN0ZXJSZXN1bHQ7XG59KCkpO1xuZXhwb3J0IHsgQnJvYWRjYXN0ZXJSZXN1bHQgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvYWRjYXN0ZXJSZXN1bHQuanMubWFwXG4iLCJ2YXIgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBcHBseVZhbHVlVHJhbnNmb3JtZXJzKCkge1xuICAgIH1cbiAgICBBcHBseVZhbHVlVHJhbnNmb3JtZXJzLnRyYW5zZm9ybUZyb20gPSBmdW5jdGlvbiAodHJhbnNmb3JtZXIsIGRhdGFiYXNlVmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNmb3JtZXIpKSB7XG4gICAgICAgICAgICB2YXIgcmV2ZXJzZVRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VUcmFuc2Zvcm1lcnMucmVkdWNlKGZ1bmN0aW9uICh0cmFuc2Zvcm1lZFZhbHVlLCBfdHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RyYW5zZm9ybWVyLmZyb20odHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICAgICAgICB9LCBkYXRhYmFzZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuZnJvbShkYXRhYmFzZVZhbHVlKTtcbiAgICB9O1xuICAgIEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbiAodHJhbnNmb3JtZXIsIGVudGl0eVZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLnJlZHVjZShmdW5jdGlvbiAodHJhbnNmb3JtZWRWYWx1ZSwgX3RyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc2Zvcm1lci50byh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgICAgICAgIH0sIGVudGl0eVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIudG8oZW50aXR5VmFsdWUpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnM7XG59KCkpO1xuZXhwb3J0IHsgQXBwbHlWYWx1ZVRyYW5zZm9ybWVycyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBseVZhbHVlVHJhbnNmb3JtZXJzLmpzLm1hcFxuIiwiaW1wb3J0IHsgX19yZWFkIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byB0cmFuc2Zvcm0gaHlkcmF0ZWQgYW5kIHBlcnNpc3RlZCBkYXRhLlxuICovXG52YXIgRGF0ZVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVVdGlscygpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFB1YmxpYyBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGRhdGUgb2JqZWN0IGh5ZHJhdGVkIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIERhdGVVdGlscy5ub3JtYWxpemVIeWRyYXRlZERhdGUgPSBmdW5jdGlvbiAobWl4ZWREYXRlKSB7XG4gICAgICAgIGlmICghbWl4ZWREYXRlKVxuICAgICAgICAgICAgcmV0dXJuIG1peGVkRGF0ZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtaXhlZERhdGUgPT09IFwic3RyaW5nXCIgPyBuZXcgRGF0ZShtaXhlZERhdGUpIDogbWl4ZWREYXRlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gdmFsdWUgaW50byBkYXRlIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERFwiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEZ1bGxZZWFyKCkpICsgXCItXCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0TW9udGgoKSArIDEpICsgXCItXCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gdmFsdWUgaW50byBkYXRlIG9iamVjdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRlID0gZnVuY3Rpb24gKG1peGVkRGF0ZSwgdG9VdGMsIHVzZU1pbGxpc2Vjb25kcykge1xuICAgICAgICBpZiAodG9VdGMgPT09IHZvaWQgMCkgeyB0b1V0YyA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh1c2VNaWxsaXNlY29uZHMgPT09IHZvaWQgMCkgeyB1c2VNaWxsaXNlY29uZHMgPSB0cnVlOyB9XG4gICAgICAgIHZhciBkYXRlID0gdHlwZW9mIG1peGVkRGF0ZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBEYXRlKG1peGVkRGF0ZSkgOiBtaXhlZERhdGU7XG4gICAgICAgIGlmICh0b1V0YylcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCksIGRhdGUuZ2V0VVRDTW9udGgoKSwgZGF0ZS5nZXRVVENEYXRlKCksIGRhdGUuZ2V0VVRDSG91cnMoKSwgZGF0ZS5nZXRVVENNaW51dGVzKCksIGRhdGUuZ2V0VVRDU2Vjb25kcygpLCBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgaWYgKCF1c2VNaWxsaXNlY29uZHMpXG4gICAgICAgICAgICBkYXRlLnNldFVUQ01pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIHRpbWUgc3RyaW5nIGluIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9UaW1lU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlLCBza2lwU2Vjb25kcykge1xuICAgICAgICBpZiAoc2tpcFNlY29uZHMgPT09IHZvaWQgMCkgeyBza2lwU2Vjb25kcyA9IGZhbHNlOyB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICBcIjpcIiArIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAoIXNraXBTZWNvbmRzID8gXCI6XCIgKyB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0U2Vjb25kcygpKSA6IFwiXCIpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIHRpbWUgc3RyaW5nIGluIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWRUaW1lVG9EYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZCh2YWx1ZS5zcGxpdChcIjpcIiksIDMpLCBob3VycyA9IF9hWzBdLCBtaW51dGVzID0gX2FbMV0sIHNlY29uZHMgPSBfYVsyXTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGlmIChob3VycylcbiAgICAgICAgICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KGhvdXJzKSk7XG4gICAgICAgICAgICBpZiAobWludXRlcylcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQobWludXRlcykpO1xuICAgICAgICAgICAgaWYgKHNlY29uZHMpXG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRTZWNvbmRzKHBhcnNlSW50KHNlY29uZHMpKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGdpdmVuIHN0cmluZyB2YWx1ZSB3aXRoIFwiLVwiIHNlcGFyYXRvciBpbnRvIGEgXCJISDptbTpzc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWRUaW1lVG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUsIHNraXBTZWNvbmRzKSB7XG4gICAgICAgIGlmIChza2lwU2Vjb25kcyA9PT0gdm9pZCAwKSB7IHNraXBTZWNvbmRzID0gZmFsc2U7IH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyAodmFsdWUuZ2V0SG91cnMoKSArIFwiOlwiICsgdmFsdWUuZ2V0TWludXRlcygpICsgKCFza2lwU2Vjb25kcyA/IFwiOlwiICsgdmFsdWUuZ2V0U2Vjb25kcygpIDogXCJcIikpIDogdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIjpcIilcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2Lmxlbmd0aCA9PT0gMSA/IFwiMFwiICsgdiA6IHY7IH0pIC8vIGFwcGVuZCB6ZXJvIGF0IGJlZ2lubmluZyBpZiB3ZSBoYXZlIGEgZmlyc3QtemVyby1sZXNzIG51bWJlclxuICAgICAgICAgICAgICAgIC5qb2luKFwiOlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvIGRhdGV0aW1lIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERCBISC1tbS1zc1wiIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMubWl4ZWREYXRlVG9EYXRldGltZVN0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdXNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHZhciBmaW5hbFZhbHVlID0gdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEZ1bGxZZWFyKCkpICsgXCItXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNb250aCgpICsgMSkgKyBcIi1cIiArXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldERhdGUoKSkgKyBcIiBcIiArXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRaZXJvbGVzc1ZhbHVlKHZhbHVlLmdldEhvdXJzKCkpICsgXCI6XCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRNaW51dGVzKCkpICsgXCI6XCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgaWYgKHVzZU1pbGxpc2Vjb25kcylcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlICs9IFwiLlwiICsgdGhpcy5mb3JtYXRNaWxsaXNlY29uZHModmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICAgICAgdmFsdWUgPSBmaW5hbFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGdpdmVuIHZhbHVlIGludG8gdXRjIGRhdGV0aW1lIHN0cmluZyBpbiBhIFwiWVlZWS1NTS1ERCBISC1tbS1zcy5zc3NcIiBmb3JtYXQuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLm1peGVkRGF0ZVRvVXRjRGF0ZXRpbWVTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENGdWxsWWVhcigpKSArIFwiLVwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDTW9udGgoKSArIDEpICsgXCItXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENEYXRlKCkpICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0WmVyb2xlc3NWYWx1ZSh2YWx1ZS5nZXRVVENIb3VycygpKSArIFwiOlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDTWludXRlcygpKSArIFwiOlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFplcm9sZXNzVmFsdWUodmFsdWUuZ2V0VVRDU2Vjb25kcygpKSArIFwiLlwiICtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdE1pbGxpc2Vjb25kcyh2YWx1ZS5nZXRVVENNaWxsaXNlY29uZHMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZWFjaCBpdGVtIGluIHRoZSBnaXZlbiBhcnJheSB0byBzdHJpbmcgam9pbmVkIGJ5IFwiLFwiIHNlcGFyYXRvci5cbiAgICAgKi9cbiAgICBEYXRlVXRpbHMuc2ltcGxlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIFN0cmluZyhpKTsgfSlcbiAgICAgICAgICAgICAgICAuam9pbihcIixcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZ2l2ZW4gc3RyaW5nIHRvIHNpbXBsZSBhcnJheSBzcGxpdCBieSBcIixcIiBzZXBhcmF0b3IuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLnN0cmluZ1RvU2ltcGxlQXJyYXkgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIERhdGVVdGlscy5zaW1wbGVKc29uVG9TdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9O1xuICAgIERhdGVVdGlscy5zdHJpbmdUb1NpbXBsZUpzb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWU7XG4gICAgfTtcbiAgICBEYXRlVXRpbHMuc2ltcGxlRW51bVRvU3RyaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gICAgfTtcbiAgICBEYXRlVXRpbHMuc3RyaW5nVG9TaW1wbGVFbnVtID0gZnVuY3Rpb24gKHZhbHVlLCBjb2x1bW5NZXRhZGF0YSkge1xuICAgICAgICBpZiAoY29sdW1uTWV0YWRhdGEuZW51bVxuICAgICAgICAgICAgJiYgIWlzTmFOKHZhbHVlKVxuICAgICAgICAgICAgJiYgY29sdW1uTWV0YWRhdGEuZW51bS5pbmRleE9mKHBhcnNlSW50KHZhbHVlKSkgPj0gMCkge1xuICAgICAgICAgICAgLy8gY29udmVydCB0byBudW1iZXIgaWYgdGhhdCBleGlzdHMgaW4gcG9vc2libGUgZW51bSBvcHRpb25zXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBTdGF0aWMgTWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGdpdmVuIG51bWJlciB0byBcIjB4XCIgZm9ybWF0LCBlLmcuIGlmIGl0IGlzIDEgdGhlbiBpdCB3aWxsIHJldHVybiBcIjAxXCIuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLmZvcm1hdFplcm9sZXNzVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMTApXG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGdpdmVuIG51bWJlciB0byBcIjB4XCIgZm9ybWF0LCBlLmcuIGlmIGl0IGlzIDEgdGhlbiBpdCB3aWxsIHJldHVybiBcIjAxXCIuXG4gICAgICovXG4gICAgRGF0ZVV0aWxzLmZvcm1hdE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPCAxMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMDBcIiArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgMTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IERhdGVVdGlscyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRlVXRpbHMuanMubWFwXG4iLCIvKipcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanJpZWNrZW4vZGVwZW5kZW5jeS1ncmFwaFxuICogSnVzdCBhZGRlZCBcImFueVwiIHR5cGVzIGhlcmUsIHdyYXBwZXIgZXZlcnl0aGluZyBpbnRvIGV4cG9ydGVkIGNsYXNzLlxuICogV2UgY2FudCB1c2UgYSBwYWNrYWdlIGl0c2VsZiBiZWNhdXNlIHdlIHdhbnQgdG8gcGFja2FnZSBcImV2ZXJ5dGhpbmctaW4taXRcIiBmb3IgdGhlIGZyb250ZW5kIHVzZXJzIG9mIFR5cGVPUk0uXG4gKi9cbi8qKlxuICogQSBzaW1wbGUgZGVwZW5kZW5jeSBncmFwaFxuICovXG5pbXBvcnQgeyBUeXBlT1JNRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbi8qKlxuICogSGVscGVyIGZvciBjcmVhdGluZyBhIERlcHRoLUZpcnN0LVNlYXJjaCBvblxuICogYSBzZXQgb2YgZWRnZXMuXG4gKlxuICogRGV0ZWN0cyBjeWNsZXMgYW5kIHRocm93cyBhbiBFcnJvciBpZiBvbmUgaXMgZGV0ZWN0ZWQuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURGUyhlZGdlcywgbGVhdmVzT25seSwgcmVzdWx0KSB7XG4gICAgdmFyIGN1cnJlbnRQYXRoID0gW107XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24gREZTKGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZpc2l0ZWRbY3VycmVudE5vZGVdID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudFBhdGgucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgIGVkZ2VzW2N1cnJlbnROb2RlXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbm9kZV0pIHtcbiAgICAgICAgICAgICAgICBERlMobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50UGF0aC5pbmRleE9mKG5vZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJEZXBlbmRlbmN5IEN5Y2xlIEZvdW5kOiBcIiArIGN1cnJlbnRQYXRoLmpvaW4oXCIgLT4gXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRQYXRoLnBvcCgpO1xuICAgICAgICBpZiAoKCFsZWF2ZXNPbmx5IHx8IGVkZ2VzW2N1cnJlbnROb2RlXS5sZW5ndGggPT09IDApICYmIHJlc3VsdC5pbmRleE9mKGN1cnJlbnROb2RlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG52YXIgRGVwR3JhcGggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwR3JhcGgoKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSB7fTtcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGVuY3kgTm9kZV1cbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzID0ge307IC8vIE5vZGUgLT4gW0RlcGVuZGFudCBOb2RlXVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBub2RlIHRvIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBDaGVja2luZyB0aGUgYXJndW1lbnRzIGxlbmd0aCBhbGxvd3MgdGhlIHVzZXIgdG8gYWRkIGEgbm9kZSB3aXRoIHVuZGVmaW5lZCBkYXRhXG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbbm9kZV0gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgICAqL1xuICAgIERlcEdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgICAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlZGdlTGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUxpc3Rba2V5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgbm9kZSBleGlzdHMgaW4gdGhlIGdyYXBoXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZURhdGEgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgZGF0YSBmb3IgYSBnaXZlbiBub2RlIG5hbWUuIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLnNldE5vZGVEYXRhID0gZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy4gSWYgZWl0aGVyIG9mIHRoZSBub2RlcyBkb2VzIG5vdCBleGlzdCxcbiAgICAgKiBhbiBFcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICBpZiAoIXRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhhc05vZGUodG8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5pbmRleE9mKHRvKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5wdXNoKHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUucmVtb3ZlRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICB2YXIgaWR4O1xuICAgICAgICBpZiAodGhpcy5oYXNOb2RlKGZyb20pKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0byk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZSh0bykpIHtcbiAgICAgICAgICAgIGlkeCA9IHRoaXMuaW5jb21pbmdFZGdlc1t0b10uaW5kZXhPZihmcm9tKTtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBkZXBlbmRzIG9uICh0cmFuc2l0aXZlbHkpLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgICAqXG4gICAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGFueSBvdGhlciBub2RlcyB3aWxsIGJlIHJldHVybmVkXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqL1xuICAgIERlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbmNpZXNPZiA9IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHZhciBERlMgPSBjcmVhdGVERlModGhpcy5vdXRnb2luZ0VkZ2VzLCBsZWF2ZXNPbmx5LCByZXN1bHQpO1xuICAgICAgICAgICAgREZTKG5vZGUpO1xuICAgICAgICAgICAgdmFyIGlkeCA9IHJlc3VsdC5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgICAqXG4gICAgICogSWYgYGxlYXZlc09ubHlgIGlzIHRydWUsIG9ubHkgbm9kZXMgdGhhdCBkbyBub3QgaGF2ZSBhbnkgZGVwZW5kYW50cyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mID0gZnVuY3Rpb24gKG5vZGUsIGxlYXZlc09ubHkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyh0aGlzLmluY29taW5nRWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCk7XG4gICAgICAgICAgICBERlMobm9kZSk7XG4gICAgICAgICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCB0aGUgb3ZlcmFsbCBwcm9jZXNzaW5nIG9yZGVyIGZvciB0aGUgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgKlxuICAgICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAgICpcbiAgICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgRGVwR3JhcGgucHJvdG90eXBlLm92ZXJhbGxPcmRlciA9IGZ1bmN0aW9uIChsZWF2ZXNPbmx5KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMubm9kZXMpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7IC8vIEVtcHR5IGdyYXBoXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBjeWNsZXMgLSB3ZSBydW4gdGhlIERGUyBzdGFydGluZyBhdCBhbGwgdGhlIG5vZGVzIGluIGNhc2UgdGhlcmVcbiAgICAgICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgICAgIHZhciBDeWNsZURGU18xID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgICAgIEN5Y2xlREZTXzEobik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBERlNfMSA9IGNyZWF0ZURGUyh0aGlzLm91dGdvaW5nRWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCk7XG4gICAgICAgICAgICAvLyBGaW5kIGFsbCBwb3RlbnRpYWwgc3RhcnRpbmcgcG9pbnRzIChub2RlcyB3aXRoIG5vdGhpbmcgZGVwZW5kaW5nIG9uIHRoZW0pIGFuXG4gICAgICAgICAgICAvLyBydW4gYSBERlMgc3RhcnRpbmcgYXQgdGhlc2UgcG9pbnRzIHRvIGdldCB0aGUgb3JkZXJcbiAgICAgICAgICAgIGtleXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgREZTXzEobik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZXBHcmFwaDtcbn0oKSk7XG5leHBvcnQgeyBEZXBHcmFwaCB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZXBHcmFwaC5qcy5tYXBcbiIsImltcG9ydCB7IF9fdmFsdWVzIH0gZnJvbSBcInRzbGliXCI7XG52YXIgT2JqZWN0VXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JqZWN0VXRpbHMoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAgICogdGFyZ2V0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAgICogQHBhcmFtIHNvdXJjZXMgT25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBPYmplY3RVdGlscy5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgc291cmNlc18xID0gX192YWx1ZXMoc291cmNlcyksIHNvdXJjZXNfMV8xID0gc291cmNlc18xLm5leHQoKTsgIXNvdXJjZXNfMV8xLmRvbmU7IHNvdXJjZXNfMV8xID0gc291cmNlc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IChlXzIgPSB2b2lkIDAsIF9fdmFsdWVzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSkpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYiA9IF9jLnJldHVybikpIF9iLmNhbGwoX2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VzXzFfMSAmJiAhc291cmNlc18xXzEuZG9uZSAmJiAoX2EgPSBzb3VyY2VzXzEucmV0dXJuKSkgX2EuY2FsbChzb3VyY2VzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHM7XG59KCkpO1xuZXhwb3J0IHsgT2JqZWN0VXRpbHMgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VXRpbHMuanMubWFwXG4iLCJpbXBvcnQgeyBfX3ZhbHVlcyB9IGZyb20gXCJ0c2xpYlwiO1xudmFyIE9ybVV0aWxzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ybVV0aWxzKCkge1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ2h1bmtzIGFycmF5IGludG8gcGllY2VzLlxuICAgICAqL1xuICAgIE9ybVV0aWxzLmNodW5rID0gZnVuY3Rpb24gKGFycmF5LCBzaXplKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSksIGZ1bmN0aW9uIChfLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2UoaSAqIHNpemUsIGkgKiBzaXplICsgc2l6ZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT3JtVXRpbHMuc3BsaXRDbGFzc2VzQW5kU3RyaW5ncyA9IGZ1bmN0aW9uIChjbHNlc0FuZFN0cmluZ3MpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIChjbHNlc0FuZFN0cmluZ3MpLmZpbHRlcihmdW5jdGlvbiAoY2xzKSB7IHJldHVybiB0eXBlb2YgY2xzICE9PSBcInN0cmluZ1wiOyB9KSxcbiAgICAgICAgICAgIChjbHNlc0FuZFN0cmluZ3MpLmZpbHRlcihmdW5jdGlvbiAoc3RyKSB7IHJldHVybiB0eXBlb2Ygc3RyID09PSBcInN0cmluZ1wiOyB9KSxcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLmdyb3VwQnkgPSBmdW5jdGlvbiAoYXJyYXksIHByb3BlcnR5Q2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAoZ3JvdXBlZEFycmF5LCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IHByb3BlcnR5Q2FsbGJhY2sodmFsdWUpO1xuICAgICAgICAgICAgdmFyIGdyb3VwZWQgPSBncm91cGVkQXJyYXkuZmluZChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5pZCA9PT0ga2V5OyB9KTtcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZCkge1xuICAgICAgICAgICAgICAgIGdyb3VwZWQgPSB7IGlkOiBrZXksIGl0ZW1zOiBbXSB9O1xuICAgICAgICAgICAgICAgIGdyb3VwZWRBcnJheS5wdXNoKGdyb3VwZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBlZC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBncm91cGVkQXJyYXk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLnVuaXEgPSBmdW5jdGlvbiAoYXJyYXksIGNyaXRlcmlhT3JQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uICh1bmlxdWVBcnJheSwgaXRlbSkge1xuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoY3JpdGVyaWFPclByb3BlcnR5IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlXzEgPSBjcml0ZXJpYU9yUHJvcGVydHkoaXRlbSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSAhIXVuaXF1ZUFycmF5LmZpbmQoZnVuY3Rpb24gKHVuaXF1ZUl0ZW0pIHsgcmV0dXJuIGNyaXRlcmlhT3JQcm9wZXJ0eSh1bmlxdWVJdGVtKSA9PT0gaXRlbVZhbHVlXzE7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGNyaXRlcmlhT3JQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gISF1bmlxdWVBcnJheS5maW5kKGZ1bmN0aW9uICh1bmlxdWVJdGVtKSB7IHJldHVybiB1bmlxdWVJdGVtW2NyaXRlcmlhT3JQcm9wZXJ0eV0gPT09IGl0ZW1bY3JpdGVyaWFPclByb3BlcnR5XTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHVuaXF1ZUFycmF5LmluZGV4T2YoaXRlbSkgIT09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgICAgICB1bmlxdWVBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZUFycmF5O1xuICAgICAgICB9LCBbXSk7XG4gICAgfTtcbiAgICAvLyBDaGVja3MgaWYgaXQncyBhbiBvYmplY3QgbWFkZSBieSBPYmplY3QuY3JlYXRlKG51bGwpLCB7fSBvciBuZXcgT2JqZWN0KClcbiAgICBPcm1VdGlscy5pc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpdGVtLmNvbnN0cnVjdG9yIHx8IGl0ZW0uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICB9O1xuICAgIE9ybVV0aWxzLm1lcmdlQXJyYXlLZXkgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIHZhbHVlLCBtZW1vKSB7XG4gICAgICAgIC8vIEhhdmUgd2Ugc2VlbiB0aGlzIGJlZm9yZT8gIFByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICBpZiAobWVtby5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lbW8uZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHByb21pc2VzIGVudGlyZWx5LlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhvbGQtb3ZlciBmcm9tIHRoZSBvbGQgY29kZSAmIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluXG4gICAgICAgICAgICAvLyB0aGUgbGF6eSBmaWVsZHMuICBJZGVhbGx5IHdlJ2QgcmVtb3ZlIHRoZXNlIHByb21pc2VzIHZpYSBhbm90aGVyIGZ1bmN0aW9uIGZpcnN0XG4gICAgICAgICAgICAvLyBidXQgZm9yIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBtZW1vLnNldCh2YWx1ZSwgdGFyZ2V0W2tleV0pO1xuICAgICAgICB0aGlzLm1lcmdlKHRhcmdldFtrZXldLCB2YWx1ZSwgbWVtbyk7XG4gICAgICAgIG1lbW8uZGVsZXRlKHZhbHVlKTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLm1lcmdlT2JqZWN0S2V5ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgbWVtbykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgLy8gSGF2ZSB3ZSBzZWVuIHRoaXMgYmVmb3JlPyAgUHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgICAgIGlmIChtZW1vLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCAoX2EgPSB7fSwgX2Fba2V5XSA9IG1lbW8uZ2V0KHZhbHVlKSwgX2EpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIHByb21pc2VzIGVudGlyZWx5LlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhvbGQtb3ZlciBmcm9tIHRoZSBvbGQgY29kZSAmIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGluXG4gICAgICAgICAgICAvLyB0aGUgbGF6eSBmaWVsZHMuICBJZGVhbGx5IHdlJ2QgcmVtb3ZlIHRoZXNlIHByb21pc2VzIHZpYSBhbm90aGVyIGZ1bmN0aW9uIGZpcnN0XG4gICAgICAgICAgICAvLyBidXQgZm9yIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIChfYiA9IHt9LCBfYltrZXldID0gdmFsdWUsIF9iKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIChfYyA9IHt9LCBfY1trZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9LCBfYykpO1xuICAgICAgICB9XG4gICAgICAgIG1lbW8uc2V0KHZhbHVlLCB0YXJnZXRba2V5XSk7XG4gICAgICAgIHRoaXMubWVyZ2UodGFyZ2V0W2tleV0sIHZhbHVlLCBtZW1vKTtcbiAgICAgICAgbWVtby5kZWxldGUodmFsdWUpO1xuICAgIH07XG4gICAgT3JtVXRpbHMubWVyZ2UgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIG1lbW8pIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIGlmIChtZW1vID09PSB2b2lkIDApIHsgbWVtbyA9IG5ldyBNYXAoKTsgfVxuICAgICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyhzb3VyY2UpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VPYmplY3RLZXkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldLCBtZW1vKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSA9IDA7IGtleSA8IHNvdXJjZS5sZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXJnZUFycmF5S2V5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSwgbWVtbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlZXAgT2JqZWN0LmFzc2lnbi5cbiAgICAgKi9cbiAgICBPcm1VdGlscy5tZXJnZURlZXAgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzb3VyY2VzXzEgPSBfX3ZhbHVlcyhzb3VyY2VzKSwgc291cmNlc18xXzEgPSBzb3VyY2VzXzEubmV4dCgpOyAhc291cmNlc18xXzEuZG9uZTsgc291cmNlc18xXzEgPSBzb3VyY2VzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIE9ybVV0aWxzLm1lcmdlKHRhcmdldCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNfMV8xICYmICFzb3VyY2VzXzFfMS5kb25lICYmIChfYSA9IHNvdXJjZXNfMS5yZXR1cm4pKSBfYS5jYWxsKHNvdXJjZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERlZXAgY29tcGFyZSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTQ0MjQ5XG4gICAgICovXG4gICAgT3JtVXRpbHMuZGVlcENvbXBhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGksIGwsIGxlZnRDaGFpbiwgcmlnaHRDaGFpbjtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRGllIHNpbGVudGx5PyBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgc3VjaCBjYXNlLCBwbGVhc2UgaGVscC4uLlxuICAgICAgICAgICAgLy8gdGhyb3cgXCJOZWVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyB0byBjb21wYXJlXCI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGxlZnRDaGFpbiA9IFtdOyAvLyBUb2RvOiB0aGlzIGNhbiBiZSBjYWNoZWRcbiAgICAgICAgICAgIHJpZ2h0Q2hhaW4gPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb21wYXJlMk9iamVjdHMobGVmdENoYWluLCByaWdodENoYWluLCBhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0d28gZW50aXR5LWlkLW1hcHMgYXJlIHRoZSBzYW1lXG4gICAgICovXG4gICAgT3JtVXRpbHMuY29tcGFyZUlkcyA9IGZ1bmN0aW9uIChmaXJzdElkLCBzZWNvbmRJZCkge1xuICAgICAgICBpZiAoZmlyc3RJZCA9PT0gdW5kZWZpbmVkIHx8IGZpcnN0SWQgPT09IG51bGwgfHwgc2Vjb25kSWQgPT09IHVuZGVmaW5lZCB8fCBzZWNvbmRJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gT3B0aW1pemVkIHZlcnNpb24gZm9yIHRoZSBjb21tb24gY2FzZVxuICAgICAgICBpZiAoKCh0eXBlb2YgZmlyc3RJZC5pZCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2Ygc2Vjb25kSWQuaWQgPT09IFwic3RyaW5nXCIpIHx8XG4gICAgICAgICAgICAodHlwZW9mIGZpcnN0SWQuaWQgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHNlY29uZElkLmlkID09PSBcIm51bWJlclwiKSkgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpcnN0SWQpLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2Vjb25kSWQpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0SWQuaWQgPT09IHNlY29uZElkLmlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPcm1VdGlscy5kZWVwQ29tcGFyZShmaXJzdElkLCBzZWNvbmRJZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIGdpdmVuIHZhbHVlIGludG8gYm9vbGVhbiB2YWx1ZS5cbiAgICAgKi9cbiAgICBPcm1VdGlscy50b0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcIjFcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+IDA7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbXBvc2VzIGFuIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBrZXlzIGFuZCB2YWx1ZXMuXG4gICAgICovXG4gICAgT3JtVXRpbHMuemlwT2JqZWN0ID0gZnVuY3Rpb24gKGtleXMsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKG9iamVjdCwgY29sdW1uLCBpbmRleCkge1xuICAgICAgICAgICAgb2JqZWN0W2NvbHVtbl0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSwge30pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIGFycmF5cy5cbiAgICAgKi9cbiAgICBPcm1VdGlscy5pc0FycmF5c0VxdWFsID0gZnVuY3Rpb24gKGFycjEsIGFycjIpIHtcbiAgICAgICAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGFycjEuZXZlcnkoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnIyLmluZGV4T2YoZWxlbWVudCkgIT09IC0xO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9ybVV0aWxzLmFyZU11dHVhbGx5RXhjbHVzaXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGlzdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGxpc3RzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhdmVTaGFyZWRPYmplY3RzID0gbGlzdHMuc29tZShmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgdmFyIG90aGVyTGlzdHMgPSBsaXN0cy5maWx0ZXIoZnVuY3Rpb24gKG90aGVyTGlzdCkgeyByZXR1cm4gb3RoZXJMaXN0ICE9PSBsaXN0OyB9KTtcbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIG90aGVyTGlzdHMuc29tZShmdW5jdGlvbiAob3RoZXJMaXN0KSB7IHJldHVybiBvdGhlckxpc3QuaW5jbHVkZXMoaXRlbSk7IH0pOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhaGF2ZVNoYXJlZE9iamVjdHM7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUHJpdmF0ZSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIE9ybVV0aWxzLmNvbXBhcmUyT2JqZWN0cyA9IGZ1bmN0aW9uIChsZWZ0Q2hhaW4sIHJpZ2h0Q2hhaW4sIHgsIHkpIHtcbiAgICAgICAgdmFyIHA7XG4gICAgICAgIC8vIHJlbWVtYmVyIHRoYXQgTmFOID09PSBOYU4gcmV0dXJucyBmYWxzZVxuICAgICAgICAvLyBhbmQgaXNOYU4odW5kZWZpbmVkKSByZXR1cm5zIHRydWVcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih4KSAmJiBOdW1iZXIuaXNOYU4oeSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQ29tcGFyZSBwcmltaXRpdmVzIGFuZCBmdW5jdGlvbnMuXG4gICAgICAgIC8vIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGxpbmsgdG8gdGhlIHNhbWUgb2JqZWN0LlxuICAgICAgICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgc3RlcCB3aGVyZSB3ZSBjb21wYXJlIHByb3RvdHlwZXNcbiAgICAgICAgaWYgKHggPT09IHkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gVW5lcXVhbCwgYnV0IGVpdGhlciBpcyBudWxsIG9yIHVuZGVmaW5lZCAodXNlIGNhc2U6IGpzb25iIGNvbXBhcmFzaW9uKVxuICAgICAgICAvLyBQUiAjMzc3NiwgdG9kbzogYWRkIHRlc3RzXG4gICAgICAgIGlmICh4ID09PSBudWxsIHx8IHkgPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gRml4IHRoZSBidWZmZXIgY29tcGFyZSBidWcuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3R5cGVvcm0vdHlwZW9ybS9pc3N1ZXMvMzY1NFxuICAgICAgICBpZiAoKHR5cGVvZiB4LmVxdWFscyA9PT0gXCJmdW5jdGlvblwiIHx8IHguZXF1YWxzIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmIHguZXF1YWxzKHkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIFdvcmtzIGluIGNhc2Ugd2hlbiBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgaW4gY29uc3RydWN0b3IuXG4gICAgICAgIC8vIENvbXBhcmluZyBkYXRlcyBpcyBhIGNvbW1vbiBzY2VuYXJpby4gQW5vdGhlciBidWlsdC1pbnM/XG4gICAgICAgIC8vIFdlIGNhbiBldmVuIGhhbmRsZSBmdW5jdGlvbnMgcGFzc2VkIGFjcm9zcyBpZnJhbWVzXG4gICAgICAgIGlmICgodHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiKSB8fFxuICAgICAgICAgICAgKHggaW5zdGFuY2VvZiBEYXRlICYmIHkgaW5zdGFuY2VvZiBEYXRlKSB8fFxuICAgICAgICAgICAgKHggaW5zdGFuY2VvZiBSZWdFeHAgJiYgeSBpbnN0YW5jZW9mIFJlZ0V4cCkgfHxcbiAgICAgICAgICAgICh4IGluc3RhbmNlb2YgU3RyaW5nICYmIHkgaW5zdGFuY2VvZiBTdHJpbmcpIHx8XG4gICAgICAgICAgICAoeCBpbnN0YW5jZW9mIE51bWJlciAmJiB5IGluc3RhbmNlb2YgTnVtYmVyKSlcbiAgICAgICAgICAgIHJldHVybiB4LnRvU3RyaW5nKCkgPT09IHkudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gQXQgbGFzdCBjaGVja2luZyBwcm90b3R5cGVzIGFzIGdvb2QgYXMgd2UgY2FuXG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QgJiYgeSBpbnN0YW5jZW9mIE9iamVjdCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh4LmlzUHJvdG90eXBlT2YoeSkgfHwgeS5pc1Byb3RvdHlwZU9mKHgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHgucHJvdG90eXBlICE9PSB5LnByb3RvdHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGluZmluaXRpdmUgbGlua2luZyBsb29wc1xuICAgICAgICBpZiAobGVmdENoYWluLmluZGV4T2YoeCkgPiAtMSB8fCByaWdodENoYWluLmluZGV4T2YoeSkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gUXVpY2sgY2hlY2tpbmcgb2Ygb25lIG9iamVjdCBiZWluZyBhIHN1YnNldCBvZiBhbm90aGVyLlxuICAgICAgICAvLyB0b2RvOiBjYWNoZSB0aGUgc3RydWN0dXJlIG9mIGFyZ3VtZW50c1swXSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgZm9yIChwIGluIHkpIHtcbiAgICAgICAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICE9PSB4Lmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHlbcF0gIT09IHR5cGVvZiB4W3BdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocCBpbiB4KSB7XG4gICAgICAgICAgICBpZiAoeS5oYXNPd25Qcm9wZXJ0eShwKSAhPT0geC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB5W3BdICE9PSB0eXBlb2YgeFtwXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mICh4W3BdKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgbGVmdENoYWluLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2hhaW4ucHVzaCh5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBhcmUyT2JqZWN0cyhsZWZ0Q2hhaW4sIHJpZ2h0Q2hhaW4sIHhbcF0sIHlbcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGVmdENoYWluLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICByaWdodENoYWluLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoeFtwXSAhPT0geVtwXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIE9ybVV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IE9ybVV0aWxzIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9ybVV0aWxzLmpzLm1hcFxuIiwidmFyIFJhbmRvbUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5kb21HZW5lcmF0b3IoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBkaXNjdXNzIGF0OiBodHRwOi8vbG9jdXR1cy5pby9waHAvc2hhMS9cbiAgICAgKiBvcmlnaW5hbCBieTogV2VidG9vbGtpdC5pbmZvIChodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby8pXG4gICAgICogaW1wcm92ZWQgYnk6IE1pY2hhZWwgV2hpdGUgKGh0dHA6Ly9nZXRzcHJpbmsuY29tKVxuICAgICAqIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va3Z6LmlvKVxuICAgICAqICAgIGlucHV0IGJ5OiBCcmV0dCBaYW1pciAoaHR0cDovL2JyZXR0LXphbWlyLm1lKVxuICAgICAqICAgICAgbm90ZSAxOiBLZWVwIGluIG1pbmQgdGhhdCBpbiBhY2NvcmRhbmNlIHdpdGggUEhQLCB0aGUgd2hvbGUgc3RyaW5nIGlzIGJ1ZmZlcmVkIGFuZCB0aGVuXG4gICAgICogICAgICBub3RlIDE6IGhhc2hlZC4gSWYgYXZhaWxhYmxlLCB3ZSdkIHJlY29tbWVuZCB1c2luZyBOb2RlJ3MgbmF0aXZlIGNyeXB0byBtb2R1bGVzIGRpcmVjdGx5XG4gICAgICogICAgICBub3RlIDE6IGluIGEgc3RlYW1pbmcgZmFzaGlvbiBmb3IgZmFzdGVyIGFuZCBtb3JlIGVmZmljaWVudCBoYXNoaW5nXG4gICAgICogICBleGFtcGxlIDE6IHNoYTEoJ0tldmluIHZhbiBab25uZXZlbGQnKVxuICAgICAqICAgcmV0dXJucyAxOiAnNTQ5MTZkMmU2MmY2NWIzYWZhNmUxOTJlNmE2MDFjZGJlNWNiNTg5NydcbiAgICAgKi9cbiAgICBSYW5kb21HZW5lcmF0b3Iuc2hhMSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgdmFyIF9yb3RMZWZ0ID0gZnVuY3Rpb24gKG4sIHMpIHtcbiAgICAgICAgICAgIHZhciB0NCA9IChuIDw8IHMpIHwgKG4gPj4+ICgzMiAtIHMpKTtcbiAgICAgICAgICAgIHJldHVybiB0NDtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIF9jdnRIZXggPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHYgPSAodmFsID4+PiAoaSAqIDQpKSAmIDB4MGY7XG4gICAgICAgICAgICAgICAgc3RyICs9IHYudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGJsb2Nrc3RhcnQ7XG4gICAgICAgIHZhciBpLCBqO1xuICAgICAgICB2YXIgVyA9IG5ldyBBcnJheSg4MCk7XG4gICAgICAgIHZhciBIMCA9IDB4Njc0NTIzMDE7XG4gICAgICAgIHZhciBIMSA9IDB4RUZDREFCODk7XG4gICAgICAgIHZhciBIMiA9IDB4OThCQURDRkU7XG4gICAgICAgIHZhciBIMyA9IDB4MTAzMjU0NzY7XG4gICAgICAgIHZhciBINCA9IDB4QzNEMkUxRjA7XG4gICAgICAgIHZhciBBLCBCLCBDLCBELCBFO1xuICAgICAgICB2YXIgdGVtcDtcbiAgICAgICAgLy8gdXRmOF9lbmNvZGVcbiAgICAgICAgc3RyID0gLyp1bmVzY2FwZSovIChlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG4gICAgICAgIHZhciBzdHJMZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICB2YXIgd29yZEFycmF5ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJMZW4gLSAzOyBpICs9IDQpIHtcbiAgICAgICAgICAgIGogPSBzdHIuY2hhckNvZGVBdChpKSA8PCAyNCB8XG4gICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoaSArIDEpIDw8IDE2IHxcbiAgICAgICAgICAgICAgICBzdHIuY2hhckNvZGVBdChpICsgMikgPDwgOCB8XG4gICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoaSArIDMpO1xuICAgICAgICAgICAgd29yZEFycmF5LnB1c2goaik7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChzdHJMZW4gJSA0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaSA9IDB4MDgwMDAwMDAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGkgPSBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PCAyNCB8IDB4MDgwMDAwMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBpID0gc3RyLmNoYXJDb2RlQXQoc3RyTGVuIC0gMikgPDwgMjQgfCBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PCAxNiB8IDB4MDgwMDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgaSA9IHN0ci5jaGFyQ29kZUF0KHN0ckxlbiAtIDMpIDw8IDI0IHxcbiAgICAgICAgICAgICAgICAgICAgc3RyLmNoYXJDb2RlQXQoc3RyTGVuIC0gMikgPDwgMTYgfFxuICAgICAgICAgICAgICAgICAgICBzdHIuY2hhckNvZGVBdChzdHJMZW4gLSAxKSA8PFxuICAgICAgICAgICAgICAgICAgICAgICAgOCB8IDB4ODA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgd29yZEFycmF5LnB1c2goaSk7XG4gICAgICAgIHdoaWxlICgod29yZEFycmF5Lmxlbmd0aCAlIDE2KSAhPT0gMTQpIHtcbiAgICAgICAgICAgIHdvcmRBcnJheS5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIHdvcmRBcnJheS5wdXNoKHN0ckxlbiA+Pj4gMjkpO1xuICAgICAgICB3b3JkQXJyYXkucHVzaCgoc3RyTGVuIDw8IDMpICYgMHgwZmZmZmZmZmYpO1xuICAgICAgICBmb3IgKGJsb2Nrc3RhcnQgPSAwOyBibG9ja3N0YXJ0IDwgd29yZEFycmF5Lmxlbmd0aDsgYmxvY2tzdGFydCArPSAxNikge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBXW2ldID0gd29yZEFycmF5W2Jsb2Nrc3RhcnQgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDE2OyBpIDw9IDc5OyBpKyspIHtcbiAgICAgICAgICAgICAgICBXW2ldID0gX3JvdExlZnQoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBBID0gSDA7XG4gICAgICAgICAgICBCID0gSDE7XG4gICAgICAgICAgICBDID0gSDI7XG4gICAgICAgICAgICBEID0gSDM7XG4gICAgICAgICAgICBFID0gSDQ7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDE5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKChCICYgQykgfCAofkIgJiBEKSkgKyBFICsgV1tpXSArIDB4NUE4Mjc5OTkpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDIwOyBpIDw9IDM5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKEIgXiBDIF4gRCkgKyBFICsgV1tpXSArIDB4NkVEOUVCQTEpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDQwOyBpIDw9IDU5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKChCICYgQykgfCAoQiAmIEQpIHwgKEMgJiBEKSkgKyBFICsgV1tpXSArIDB4OEYxQkJDREMpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDYwOyBpIDw9IDc5OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gKF9yb3RMZWZ0KEEsIDUpICsgKEIgXiBDIF4gRCkgKyBFICsgV1tpXSArIDB4Q0E2MkMxRDYpICYgMHgwZmZmZmZmZmY7XG4gICAgICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICAgICAgQyA9IF9yb3RMZWZ0KEIsIDMwKTtcbiAgICAgICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgICAgICBBID0gdGVtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEgwID0gKEgwICsgQSkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgxID0gKEgxICsgQikgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgyID0gKEgyICsgQykgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEgzID0gKEgzICsgRCkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgICAgIEg0ID0gKEg0ICsgRSkgJiAweDBmZmZmZmZmZjtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wID0gX2N2dEhleChIMCkgKyBfY3Z0SGV4KEgxKSArIF9jdnRIZXgoSDIpICsgX2N2dEhleChIMykgKyBfY3Z0SGV4KEg0KTtcbiAgICAgICAgcmV0dXJuIHRlbXAudG9Mb3dlckNhc2UoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJGQzQxMjIgY29tcGxpYW50IFVVSUQgdjQgZ2VuZXJhdG9yLlxuICAgICAqL1xuICAgIFJhbmRvbUdlbmVyYXRvci51dWlkNCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gXCJ4XCIgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBSYW5kb21HZW5lcmF0b3I7XG59KCkpO1xuZXhwb3J0IHsgUmFuZG9tR2VuZXJhdG9yIH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJhbmRvbUdlbmVyYXRvci5qcy5tYXBcbiIsImltcG9ydCBzaGFqcyBmcm9tIFwic2hhLmpzXCI7XG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBpbnRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjk3MDUyNS9jb252ZXJ0aW5nLWFueS1zdHJpbmctaW50by1jYW1lbC1jYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyLCBmaXJzdENhcGl0YWwpIHtcbiAgICBpZiAoZmlyc3RDYXBpdGFsID09PSB2b2lkIDApIHsgZmlyc3RDYXBpdGFsID0gZmFsc2U7IH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL14oW0EtWl0pfFtcXHMtX10oXFx3KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHAxLCBwMiwgb2Zmc2V0KSB7XG4gICAgICAgIGlmIChmaXJzdENhcGl0YWwgPT09IHRydWUgJiYgb2Zmc2V0ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHAxO1xuICAgICAgICBpZiAocDIpXG4gICAgICAgICAgICByZXR1cm4gcDIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIHAxLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIHN0cmluZyBpbnRvIHNuYWtlX2Nhc2UuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gc25ha2VDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLy8gQUJjIC0+IGFfYmNcbiAgICAgICAgLnJlcGxhY2UoLyhbQS1aXSkoW0EtWl0pKFthLXpdKS9nLCBcIiQxXyQyJDNcIilcbiAgICAgICAgLy8gYUMgLT4gYV9jXG4gICAgICAgIC5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgaW50byBUaXRsZSBDYXNlLlxuICpcbiAqIEBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTY5NzIvY29udmVydC1zdHJpbmctdG8tdGl0bGUtY2FzZS13aXRoLWphdmFzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpdGxlQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkgeyByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpOyB9KTtcbn1cbi8qKlxuICogQnVpbGRzIGFiYnJldmlhdGVkIHN0cmluZyBmcm9tIGdpdmVuIHN0cmluZztcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFiYnJldmlhdGUoc3RyLCBhYmJyTGV0dGVyc0NvdW50KSB7XG4gICAgaWYgKGFiYnJMZXR0ZXJzQ291bnQgPT09IHZvaWQgMCkgeyBhYmJyTGV0dGVyc0NvdW50ID0gMTsgfVxuICAgIHZhciB3b3JkcyA9IHN0ci5yZXBsYWNlKC8oW2EtelxceEUwLVxceEZGXSkoW0EtWlxceEMwXFx4REZdKS9nLCBcIiQxICQyXCIpLnNwbGl0KFwiIFwiKTtcbiAgICByZXR1cm4gd29yZHMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIHdvcmQpIHtcbiAgICAgICAgcmVzICs9IHdvcmQuc3Vic3RyKDAsIGFiYnJMZXR0ZXJzQ291bnQpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIFwiXCIpO1xufVxuLyoqXG4gKiBTaG9ydGVuIGEgZ2l2ZW4gYGlucHV0YC4gVXNlZnVsIGZvciBSREJNUyBpbXBvc2luZyBhIGxpbWl0IG9uIHRoZVxuICogbWF4aW11bSBsZW5ndGggb2YgYWxpYXNlcyBhbmQgY29sdW1uIG5hbWVzIGluIFNRTCBxdWVyaWVzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gYmUgc2hvcnRlbmVkLlxuICogQHBhcmFtIG9wdGlvbnMgRGVmYXVsdCB0byBgNGAgZm9yIHNlZ21lbnRzIGxlbmd0aCwgYDJgIGZvciB0ZXJtcyBsZW5ndGgsIGAnX18nYCBhcyBhIHNlcGFyYXRvci5cbiAqXG4gKiBAcmV0dXJuIFNob3J0ZW5lZCBgaW5wdXRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyByZXR1cm5zOiBcIlVzU2hDYV9fb3JkZV9fbWFya19fZGlyZVwiXG4gKiBzaG9ydGVuKCdVc2VyU2hvcHBpbmdDYXJ0X19vcmRlcl9fbWFya2V0X19kaXJlY3RvcicpXG4gKlxuICogLy8gcmV0dXJuczogXCJjYXRfd2l0X3Zlcl9sb25fbmFtX3Bvc193aXRfdmVyX2xvbl9uYW1fcG9zX3dpdF92ZXJfbG9uX25hbVwiXG4gKiBzaG9ydGVuKFxuICogICAnY2F0ZWdvcnlfd2l0aF92ZXJ5X2xvbmdfbmFtZV9wb3N0c193aXRoX3ZlcnlfbG9uZ19uYW1lX3Bvc3Rfd2l0aF92ZXJ5X2xvbmdfbmFtZScsXG4gKiAgIHsgc2VwYXJhdG9yOiAnXycsIHNlZ21lbnRMZW5ndGg6IDMgfVxuICogKVxuICpcbiAqIC8vIGVxdWFsczogVXNTaENhX19vcmRlX19tYXJrX21hcmtldF9pZFxuICogYCR7c2hvcnRlbignVXNlclNob3BwaW5nQ2FydF9fb3JkZXJfX21hcmtldCcpfV9tYXJrZXRfaWRgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydGVuKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgX2EgPSBvcHRpb25zLnNlZ21lbnRMZW5ndGgsIHNlZ21lbnRMZW5ndGggPSBfYSA9PT0gdm9pZCAwID8gNCA6IF9hLCBfYiA9IG9wdGlvbnMuc2VwYXJhdG9yLCBzZXBhcmF0b3IgPSBfYiA9PT0gdm9pZCAwID8gXCJfX1wiIDogX2IsIF9jID0gb3B0aW9ucy50ZXJtTGVuZ3RoLCB0ZXJtTGVuZ3RoID0gX2MgPT09IHZvaWQgMCA/IDIgOiBfYztcbiAgICB2YXIgc2VnbWVudHMgPSBpbnB1dC5zcGxpdChzZXBhcmF0b3IpO1xuICAgIHZhciBzaG9ydFNlZ21lbnRzID0gc2VnbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHZhbCkge1xuICAgICAgICAvLyBzcGxpdCB0aGUgZ2l2ZW4gc2VnbWVudCBpbnRvIG1hbnkgdGVybXMgYmFzZWQgb24gYW4gZXZlbnR1YWwgY2FtZWwgY2FzZWQgbmFtZVxuICAgICAgICB2YXIgc2VnbWVudFRlcm1zID0gdmFsLnJlcGxhY2UoLyhbYS16XFx4RTAtXFx4RkZdKShbQS1aXFx4QzAtXFx4REZdKS9nLCBcIiQxICQyXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgLy8gXCJPcmRlckl0ZW1MaXN0XCIgYmVjb21lcyBcIk9ySXRMaVwiLCB3aGlsZSBcImNvbXBhbnlcIiBiZWNvbWVzIFwiY29tcFwiXG4gICAgICAgIHZhciBsZW5ndGggPSBzZWdtZW50VGVybXMubGVuZ3RoID4gMSA/IHRlcm1MZW5ndGggOiBzZWdtZW50TGVuZ3RoO1xuICAgICAgICB2YXIgc2hvcnRTZWdtZW50ID0gc2VnbWVudFRlcm1zLm1hcChmdW5jdGlvbiAodGVybSkgeyByZXR1cm4gdGVybS5zdWJzdHIoMCwgbGVuZ3RoKTsgfSkuam9pbihcIlwiKTtcbiAgICAgICAgYWNjLnB1c2goc2hvcnRTZWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHNob3J0U2VnbWVudHMuam9pbihzZXBhcmF0b3IpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgaGFzaGVkIGlucHV0LlxuICpcbiAqIEBwYXJhbSBpbnB1dCBTdHJpbmcgdG8gYmUgaGFzaGVkLlxuICogQHBhcmFtIG9wdGlvbnMubGVuZ3RoIE9wdGlvbmFsbHksIHNob3J0ZW4gdGhlIG91dHB1dCB0byBkZXNpcmVkIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBoYXNoRnVuY3Rpb24gPSBzaGFqcyhcInNoYTI1NlwiKTtcbiAgICBoYXNoRnVuY3Rpb24udXBkYXRlKGlucHV0LCBcInV0ZjhcIik7XG4gICAgdmFyIGhhc2hlZElucHV0ID0gaGFzaEZ1bmN0aW9uLmRpZ2VzdChcImhleFwiKTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hlZElucHV0LnNsaWNlKDAsIG9wdGlvbnMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZElucHV0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJpbmdVdGlscy5qcy5tYXBcbiIsInZhciBWZXJzaW9uVXRpbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmVyc2lvblV0aWxzKCkge1xuICAgIH1cbiAgICBWZXJzaW9uVXRpbHMuaXNHcmVhdGVyT3JFcXVhbCA9IGZ1bmN0aW9uICh2ZXJzaW9uLCB0YXJnZXRWZXJzaW9uKSB7XG4gICAgICAgIHZhciB2MSA9IHBhcnNlVmVyc2lvbih2ZXJzaW9uKTtcbiAgICAgICAgdmFyIHYyID0gcGFyc2VWZXJzaW9uKHRhcmdldFZlcnNpb24pO1xuICAgICAgICByZXR1cm4gdjFbMF0gPiB2MlswXSB8fFxuICAgICAgICAgICAgdjFbMF0gPT09IHYyWzBdICYmIHYxWzFdID4gdjJbMV0gfHxcbiAgICAgICAgICAgIHYxWzBdID09PSB2MlswXSAmJiB2MVsxXSA9PT0gdjJbMV0gJiYgdjFbMl0gPj0gdjJbMl07XG4gICAgfTtcbiAgICByZXR1cm4gVmVyc2lvblV0aWxzO1xufSgpKTtcbmV4cG9ydCB7IFZlcnNpb25VdGlscyB9O1xuZnVuY3Rpb24gcGFyc2VWZXJzaW9uKHZlcnNpb24pIHtcbiAgICBpZiAodmVyc2lvbiA9PT0gdm9pZCAwKSB7IHZlcnNpb24gPSBcIlwiOyB9XG4gICAgdmFyIHYgPSBbMCwgMCwgMF07XG4gICAgdmVyc2lvbi5zcGxpdChcIi5cIikuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHsgcmV0dXJuIHZbaV0gPSBwYXJzZUludCh2YWx1ZSwgMTApOyB9KTtcbiAgICByZXR1cm4gdjtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VmVyc2lvblV0aWxzLmpzLm1hcFxuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcblxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuXG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cblxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gdXNlVW5jb250cm9sbGVkUHJvcChwcm9wVmFsdWUsIGRlZmF1bHRWYWx1ZSwgaGFuZGxlcikge1xuICB2YXIgd2FzUHJvcFJlZiA9IHVzZVJlZihwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgICBzdGF0ZVZhbHVlID0gX3VzZVN0YXRlWzBdLFxuICAgICAgc2V0U3RhdGUgPSBfdXNlU3RhdGVbMV07XG5cbiAgdmFyIGlzUHJvcCA9IHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB2YXIgd2FzUHJvcCA9IHdhc1Byb3BSZWYuY3VycmVudDtcbiAgd2FzUHJvcFJlZi5jdXJyZW50ID0gaXNQcm9wO1xuICAvKipcbiAgICogSWYgYSBwcm9wIHN3aXRjaGVzIGZyb20gY29udHJvbGxlZCB0byBVbmNvbnRyb2xsZWRcbiAgICogcmVzZXQgaXRzIHZhbHVlIHRvIHRoZSBkZWZhdWx0VmFsdWVcbiAgICovXG5cbiAgaWYgKCFpc1Byb3AgJiYgd2FzUHJvcCAmJiBzdGF0ZVZhbHVlICE9PSBkZWZhdWx0VmFsdWUpIHtcbiAgICBzZXRTdGF0ZShkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIFtpc1Byb3AgPyBwcm9wVmFsdWUgOiBzdGF0ZVZhbHVlLCB1c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlcikgaGFuZGxlci5hcHBseSh2b2lkIDAsIFt2YWx1ZV0uY29uY2F0KGFyZ3MpKTtcbiAgICBzZXRTdGF0ZSh2YWx1ZSk7XG4gIH0sIFtoYW5kbGVyXSldO1xufVxuXG5leHBvcnQgeyB1c2VVbmNvbnRyb2xsZWRQcm9wIH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VVbmNvbnRyb2xsZWQocHJvcHMsIGNvbmZpZykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoZnVuY3Rpb24gKHJlc3VsdCwgZmllbGROYW1lKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcmVmID0gcmVzdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBfcmVmW1V0aWxzLmRlZmF1bHRLZXkoZmllbGROYW1lKV0sXG4gICAgICAgIHByb3BzVmFsdWUgPSBfcmVmW2ZpZWxkTmFtZV0sXG4gICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbVXRpbHMuZGVmYXVsdEtleShmaWVsZE5hbWUpLCBmaWVsZE5hbWVdLm1hcChfdG9Qcm9wZXJ0eUtleSkpO1xuXG4gICAgdmFyIGhhbmRsZXJOYW1lID0gY29uZmlnW2ZpZWxkTmFtZV07XG5cbiAgICB2YXIgX3VzZVVuY29udHJvbGxlZFByb3AgPSB1c2VVbmNvbnRyb2xsZWRQcm9wKHByb3BzVmFsdWUsIGRlZmF1bHRWYWx1ZSwgcHJvcHNbaGFuZGxlck5hbWVdKSxcbiAgICAgICAgdmFsdWUgPSBfdXNlVW5jb250cm9sbGVkUHJvcFswXSxcbiAgICAgICAgaGFuZGxlciA9IF91c2VVbmNvbnRyb2xsZWRQcm9wWzFdO1xuXG4gICAgcmV0dXJuIF9leHRlbmRzKHt9LCByZXN0LCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltmaWVsZE5hbWVdID0gdmFsdWUsIF9leHRlbmRzMltoYW5kbGVyTmFtZV0gPSBoYW5kbGVyLCBfZXh0ZW5kczIpKTtcbiAgfSwgcHJvcHMpO1xufSIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdXNlVW5jb250cm9sbGVkLCB1c2VVbmNvbnRyb2xsZWRQcm9wIH0gZnJvbSAnLi9ob29rJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5jb250cm9sbGFibGUgfSBmcm9tICcuL3VuY29udHJvbGxhYmxlJzsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG52YXIgX2pzeEZpbGVOYW1lID0gXCIvVXNlcnMvanF1ZW5zZS9zcmMvdW5jb250cm9sbGFibGUvc3JjL3VuY29udHJvbGxhYmxlLmpzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcG9seWZpbGwgfSBmcm9tICdyZWFjdC1saWZlY3ljbGVzLWNvbXBhdCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVuY29udHJvbGxhYmxlKENvbXBvbmVudCwgY29udHJvbGxlZFZhbHVlcywgbWV0aG9kcykge1xuICBpZiAobWV0aG9kcyA9PT0gdm9pZCAwKSB7XG4gICAgbWV0aG9kcyA9IFtdO1xuICB9XG5cbiAgdmFyIGRpc3BsYXlOYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB2YXIgY2FuQWNjZXB0UmVmID0gVXRpbHMuY2FuQWNjZXB0UmVmKENvbXBvbmVudCk7XG4gIHZhciBjb250cm9sbGVkUHJvcHMgPSBPYmplY3Qua2V5cyhjb250cm9sbGVkVmFsdWVzKTtcbiAgdmFyIFBST1BTX1RPX09NSVQgPSBjb250cm9sbGVkUHJvcHMubWFwKFV0aWxzLmRlZmF1bHRLZXkpO1xuICAhKGNhbkFjY2VwdFJlZiB8fCAhbWV0aG9kcy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCAnW3VuY29udHJvbGxhYmxlXSBzdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgcGFzcyB0aHJvdWdoIG1ldGhvZHMgJyArICdiZWNhdXNlIHRoZXkgaGF2ZSBubyBhc3NvY2lhdGVkIGluc3RhbmNlcy4gQ2hlY2sgY29tcG9uZW50OiAnICsgZGlzcGxheU5hbWUgKyAnLCAnICsgJ2F0dGVtcHRpbmcgdG8gcGFzcyB0aHJvdWdoIG1ldGhvZHM6ICcgKyBtZXRob2RzLmpvaW4oJywgJykpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICB2YXIgVW5jb250cm9sbGVkQ29tcG9uZW50ID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFVuY29udHJvbGxlZENvbXBvbmVudCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBVbmNvbnRyb2xsZWRDb21wb25lbnQoKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgICAgX3RoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHZhciBoYW5kbGVyTmFtZSA9IGNvbnRyb2xsZWRWYWx1ZXNbcHJvcE5hbWVdO1xuXG4gICAgICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHNbaGFuZGxlck5hbWVdKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcylbaGFuZGxlck5hbWVdLmFwcGx5KF90aGlzJHByb3BzLCBbdmFsdWVdLmNvbmNhdChhcmdzKSk7XG5cbiAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIV90aGlzLnVubW91bnRlZCkgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBfcmVmLnZhbHVlcztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlczogX2V4dGVuZHMoT2JqZWN0LmNyZWF0ZShudWxsKSwgdmFsdWVzLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltwcm9wTmFtZV0gPSB2YWx1ZSwgX2V4dGVuZHMyKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuaGFuZGxlcnNbaGFuZGxlck5hbWVdID0gaGFuZGxlQ2hhbmdlO1xuICAgICAgfSk7XG4gICAgICBpZiAobWV0aG9kcy5sZW5ndGgpIF90aGlzLmF0dGFjaFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgX3RoaXMuaW5uZXIgPSByZWY7XG4gICAgICB9O1xuICAgICAgdmFyIHZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb250cm9sbGVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhbHVlc1trZXldID0gX3RoaXMucHJvcHNbVXRpbHMuZGVmYXVsdEtleShrZXkpXTtcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICBwcmV2UHJvcHM6IHt9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8gPSBVbmNvbnRyb2xsZWRDb21wb25lbnQucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgIC8vbGV0IHNldFN0YXRlIHRyaWdnZXIgdGhlIHVwZGF0ZVxuICAgICAgcmV0dXJuICF0aGlzLl9ub3RpZnlpbmc7XG4gICAgfTtcblxuICAgIFVuY29udHJvbGxlZENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgICB2YXIgdmFsdWVzID0gX3JlZjIudmFsdWVzLFxuICAgICAgICAgIHByZXZQcm9wcyA9IF9yZWYyLnByZXZQcm9wcztcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIHZhbHVlczogX2V4dGVuZHMoT2JqZWN0LmNyZWF0ZShudWxsKSwgdmFsdWVzKSxcbiAgICAgICAgcHJldlByb3BzOiB7fVxuICAgICAgfTtcbiAgICAgIGNvbnRyb2xsZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGEgcHJvcCBzd2l0Y2hlcyBmcm9tIGNvbnRyb2xsZWQgdG8gVW5jb250cm9sbGVkXG4gICAgICAgICAqIHJlc2V0IGl0cyB2YWx1ZSB0byB0aGUgZGVmYXVsdFZhbHVlXG4gICAgICAgICAqL1xuICAgICAgICBuZXh0U3RhdGUucHJldlByb3BzW2tleV0gPSBwcm9wc1trZXldO1xuXG4gICAgICAgIGlmICghVXRpbHMuaXNQcm9wKHByb3BzLCBrZXkpICYmIFV0aWxzLmlzUHJvcChwcmV2UHJvcHMsIGtleSkpIHtcbiAgICAgICAgICBuZXh0U3RhdGUudmFsdWVzW2tleV0gPSBwcm9wc1tVdGlscy5kZWZhdWx0S2V5KGtleSldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGlubmVyUmVmID0gX3RoaXMkcHJvcHMyLmlubmVyUmVmLFxuICAgICAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMyLCBbXCJpbm5lclJlZlwiXSk7XG5cbiAgICAgIFBST1BTX1RPX09NSVQuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBkZWxldGUgcHJvcHNbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBfdGhpczIucHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICBuZXdQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCA/IHByb3BWYWx1ZSA6IF90aGlzMi5zdGF0ZS52YWx1ZXNbcHJvcE5hbWVdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHt9LCBwcm9wcywgbmV3UHJvcHMsIHRoaXMuaGFuZGxlcnMsIHtcbiAgICAgICAgcmVmOiBpbm5lclJlZiB8fCB0aGlzLmF0dGFjaFJlZlxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gVW5jb250cm9sbGVkQ29tcG9uZW50O1xuICB9KFJlYWN0LkNvbXBvbmVudCk7XG5cbiAgcG9seWZpbGwoVW5jb250cm9sbGVkQ29tcG9uZW50KTtcbiAgVW5jb250cm9sbGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gXCJVbmNvbnRyb2xsZWQoXCIgKyBkaXNwbGF5TmFtZSArIFwiKVwiO1xuICBVbmNvbnRyb2xsZWRDb21wb25lbnQucHJvcFR5cGVzID0gX2V4dGVuZHMoe1xuICAgIGlubmVyUmVmOiBmdW5jdGlvbiBpbm5lclJlZigpIHt9XG4gIH0sIFV0aWxzLnVuY29udHJvbGxlZFByb3BUeXBlcyhjb250cm9sbGVkVmFsdWVzLCBkaXNwbGF5TmFtZSkpO1xuICBtZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIFVuY29udHJvbGxlZENvbXBvbmVudC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICRwcm94aWVkTWV0aG9kKCkge1xuICAgICAgdmFyIF90aGlzJGlubmVyO1xuXG4gICAgICByZXR1cm4gKF90aGlzJGlubmVyID0gdGhpcy5pbm5lcilbbWV0aG9kXS5hcHBseShfdGhpcyRpbm5lciwgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KTtcbiAgdmFyIFdyYXBwZWRDb21wb25lbnQgPSBVbmNvbnRyb2xsZWRDb21wb25lbnQ7XG5cbiAgaWYgKFJlYWN0LmZvcndhcmRSZWYpIHtcbiAgICBXcmFwcGVkQ29tcG9uZW50ID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVW5jb250cm9sbGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgaW5uZXJSZWY6IHJlZixcbiAgICAgICAgX19zb3VyY2U6IHtcbiAgICAgICAgICBmaWxlTmFtZTogX2pzeEZpbGVOYW1lLFxuICAgICAgICAgIGxpbmVOdW1iZXI6IDEyOFxuICAgICAgICB9LFxuICAgICAgICBfX3NlbGY6IHRoaXNcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgICBXcmFwcGVkQ29tcG9uZW50LnByb3BUeXBlcyA9IFVuY29udHJvbGxlZENvbXBvbmVudC5wcm9wVHlwZXM7XG4gIH1cblxuICBXcmFwcGVkQ29tcG9uZW50LkNvbnRyb2xsZWRDb21wb25lbnQgPSBDb21wb25lbnQ7XG4gIC8qKlxuICAgKiB1c2VmdWwgd2hlbiB3cmFwcGluZyBhIENvbXBvbmVudCBhbmQgeW91IHdhbnQgdG8gY29udHJvbFxuICAgKiBldmVyeXRoaW5nXG4gICAqL1xuXG4gIFdyYXBwZWRDb21wb25lbnQuZGVmZXJDb250cm9sVG8gPSBmdW5jdGlvbiAobmV3Q29tcG9uZW50LCBhZGRpdGlvbnMsIG5leHRNZXRob2RzKSB7XG4gICAgaWYgKGFkZGl0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBhZGRpdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5jb250cm9sbGFibGUobmV3Q29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgY29udHJvbGxlZFZhbHVlcywgYWRkaXRpb25zKSwgbmV4dE1ldGhvZHMpO1xuICB9O1xuXG4gIHJldHVybiBXcmFwcGVkQ29tcG9uZW50O1xufSIsImltcG9ydCBpbnZhcmlhbnQgZnJvbSAnaW52YXJpYW50JztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIHJlYWRPbmx5UHJvcFR5cGUoaGFuZGxlciwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSkge1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwcm9wc1toYW5kbGVyXSkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiWW91IGhhdmUgcHJvdmlkZWQgYSBgXCIgKyBwcm9wTmFtZSArIFwiYCBwcm9wIHRvIGBcIiArIG5hbWUgKyBcImAgXCIgKyAoXCJ3aXRob3V0IGFuIGBcIiArIGhhbmRsZXIgKyBcImAgaGFuZGxlciBwcm9wLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBcIikgKyAoXCJJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBcIiArIGRlZmF1bHRLZXkocHJvcE5hbWUpICsgXCJgLiBcIikgKyAoXCJPdGhlcndpc2UsIHNldCBgXCIgKyBoYW5kbGVyICsgXCJgLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5jb250cm9sbGVkUHJvcFR5cGVzKGNvbnRyb2xsZWRWYWx1ZXMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciBwcm9wVHlwZXMgPSB7fTtcbiAgT2JqZWN0LmtleXMoY29udHJvbGxlZFZhbHVlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIC8vIGFkZCBkZWZhdWx0IHByb3BUeXBlcyBmb3IgZm9sa3MgdGhhdCB1c2UgcnVudGltZSBjaGVja3NcbiAgICBwcm9wVHlwZXNbZGVmYXVsdEtleShwcm9wKV0gPSBub29wO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gY29udHJvbGxlZFZhbHVlc1twcm9wXTtcbiAgICAgICEodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnICYmIGhhbmRsZXIudHJpbSgpLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmNvbnRyb2xsYWJsZSAtIFslc106IHRoZSBwcm9wIGAlc2AgbmVlZHMgYSB2YWxpZCBoYW5kbGVyIGtleSBuYW1lIGluIG9yZGVyIHRvIG1ha2UgaXQgdW5jb250cm9sbGFibGUnLCBkaXNwbGF5TmFtZSwgcHJvcCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgICAgcHJvcFR5cGVzW3Byb3BdID0gcmVhZE9ubHlQcm9wVHlwZShoYW5kbGVyLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHByb3BUeXBlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3AocHJvcHMsIHByb3ApIHtcbiAgcmV0dXJuIHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEtleShrZXkpIHtcbiAgcmV0dXJuICdkZWZhdWx0JyArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHIoMSk7XG59XG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbkFjY2VwdFJlZihjb21wb25lbnQpIHtcbiAgcmV0dXJuICEhY29tcG9uZW50ICYmICh0eXBlb2YgY29tcG9uZW50ICE9PSAnZnVuY3Rpb24nIHx8IGNvbXBvbmVudC5wcm90b3R5cGUgJiYgY29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn0iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIF9fREVWX18gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChfX0RFVl9fKSB7XG4gIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAxID8gbGVuIC0gMSA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDE7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMV0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG5cbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAgICdtZXNzYWdlIGFyZ3VtZW50J1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHByaW50V2FybmluZy5hcHBseShudWxsLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRnVuY3Rpb25Db21wb25lbnQsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSGlkZGVuSW5wdXQsIExpc3QgfSBmcm9tICdyZWFjdC1ib290c3RyYXAtbW9iaWxlJztcbmltcG9ydCB7IHVzZUFwcERpc3BhdGNoLCB1c2VBcHBTZWxlY3RvciB9IGZyb20gJy4uL1N0b3JlL3JlZHV4SG9va3MnO1xuaW1wb3J0IHsgcmVtb3ZlTWVtYmVyLCBzYXZlTWVtYmVyLCBzZWxlY3RNZW1iZXJzIH0gZnJvbSAnLi9wcmF5ZXJDaXJjbGVTbGljZSc7XG5pbXBvcnQgeyBNZW1iZXJUeXBlIH0gZnJvbSAnLi9NZW1iZXJUeXBlJztcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuXG50eXBlIFByb3BzID0ge307XG5cbmV4cG9ydCBjb25zdCBNZW1iZXJMaXN0OiBGdW5jdGlvbkNvbXBvbmVudDxQcm9wcz4gPSBSZWFjdC5tZW1vKCh7fSkgPT4ge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlQXBwRGlzcGF0Y2goKTtcbiAgICBjb25zdCBtZW1iZXJzID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzZWxlY3RNZW1iZXJzKHN0YXRlKSk7XG4gICAgbWVtYmVycy5wdXNoKHtcbiAgICAgICAgaWQ6IG5hbm9pZCgpLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgdXNlZEZvckJhbGFuY2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBrZXlFeHRyYWN0b3IgPSB1c2VDYWxsYmFjaygoaXRlbTogTWVtYmVyVHlwZSkgPT4gaXRlbS5pZCA/PyAndW5kZWZpbmVkJywgW10pO1xuICAgIGNvbnN0IHNhdmVDaGFuZ2VkTWVtYmVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAgICh7IGV4dHJhRGF0YTogbWVtYmVySWQsIHRhcmdldDogeyB2YWx1ZTogbmFtZSB9IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlTWVtYmVyKG1lbWJlcklkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU1lbWJlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbWVtYmVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtkaXNwYXRjaF1cbiAgICApO1xuXG4gICAgLy8gRWZmZWN0c1xuXG4gICAgLy8gT3RoZXJcblxuICAgIC8vIFJlbmRlciBGdW5jdGlvbnNcbiAgICBjb25zdCByZW5kZXJNZW1iZXIgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKG1lbWJlcjogTWVtYmVyVHlwZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8SGlkZGVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAga2V5PXttZW1iZXIuaWR9XG4gICAgICAgICAgICAgICAgICAgIG5vRm9jdXNIaW50PXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bWVtYmVyLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKyBBZGQgUGVyc29uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3NhdmVDaGFuZ2VkTWVtYmVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZURhdGE9e21lbWJlci5pZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgW3NhdmVDaGFuZ2VkTWVtYmVyXVxuICAgICk7XG5cbiAgICByZXR1cm4gPExpc3QgaXRlbXM9e21lbWJlcnN9IHJlbmRlckl0ZW09e3JlbmRlck1lbWJlcn0ga2V5RXh0cmFjdG9yPXtrZXlFeHRyYWN0b3J9IC8+O1xufSk7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUFwcERpc3BhdGNoLCB1c2VBcHBTZWxlY3RvciB9IGZyb20gJy4uL1N0b3JlL3JlZHV4SG9va3MnO1xuaW1wb3J0IHsgc2VsZWN0TWVtYmVySWRzLCBzZXRXZWVrIH0gZnJvbSAnLi9wcmF5ZXJDaXJjbGVTbGljZSc7XG5pbXBvcnQgeyBCb2R5LCBCdXR0b24sIENvbHVtbiwgQ29sdW1uQ2VsbERhdGEsIEZsZXgsIEdyb3csIFRhYmxlIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5pbXBvcnQgeyBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9QcmF5ZXJDaXJjbGVDYWxjdWxhdG9yJztcblxuZXhwb3J0IHR5cGUgUGFydG5lclRhYmxlUHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gUGFydG5lclRhYmxlKHt9OiBQYXJ0bmVyVGFibGVQcm9wcykge1xuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IG1lbWJlcnNJZHMgPSB1c2VBcHBTZWxlY3Rvcigoc3RhdGUpID0+IHNlbGVjdE1lbWJlcklkcyhzdGF0ZSkpO1xuICAgIGNvbnN0IG1lbWJlcnMgPSB1c2VBcHBTZWxlY3Rvcigoc3RhdGUpID0+IHN0YXRlLnByYXllckNpcmNsZS5tZW1iZXJzKTtcbiAgICBjb25zdCB3ZWVrID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5wcmF5ZXJDaXJjbGUud2VlayA/PyAwKTtcbiAgICBjb25zdCB1c2VXZWVrZGF5cyA9IHVzZUFwcFNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUucHJheWVyQ2lyY2xlLnVzZVdlZWtkYXlzKTtcbiAgICBjb25zdCB1c2VQYXJ0bmVycyA9IHVzZUFwcFNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUucHJheWVyQ2lyY2xlLnVzZVBhcnRuZXJzKTtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZUFwcERpc3BhdGNoKCk7XG5cbiAgICBjb25zdCBjb2x1bW5zV2VlayA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW48c3RyaW5nPltdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1BhcnRuZXIgMScsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdwYXJ0bmVyMScsIC8vIGFjY2Vzc29yIGlzIHRoZSBcImtleVwiIGluIHRoZSBkYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1BhcnRuZXIgMicsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdwYXJ0bmVyMicsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCF1c2VQYXJ0bmVycykge1xuICAgICAgICAgICAgY29sdW1ucy5zcGxpY2UoMSwgMCwge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJycsXG4gICAgICAgICAgICAgICAgaWQ6ICdwcmF5aW5nVGl0bGVzJyxcbiAgICAgICAgICAgICAgICBDZWxsOiAoKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Qm9keSBibG9jaz17dHJ1ZX0+SWNoIGJldGUgZsO8cjwvQm9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCb2R5IGJsb2NrPXt0cnVlfSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRsO8ciBtaWNoIGJldGV0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbHVtbnNbMF0uQ2VsbCA9IChjZWxsRGF0YTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHBhcnRuZXIgPSBjZWxsRGF0YS52YWx1ZTtcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnY2VsbERhdGEnLCBjZWxsRGF0YSk7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIC8vICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDxCb2R5PntwYXJ0bmVyfTwvQm9keT5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHsvKiA8Qm9keT5JY2ggYmV0ZSBmw7xyPC9Cb2R5PiAqL31cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICA8Qm9keSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIEbDvHIgbWljaCBiZXRldFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIDwvQm9keT5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIC8vICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAvLyAgICAgKTtcbiAgICAgICAgICAgIC8vIH07XG5cbiAgICAgICAgICAgIGNvbHVtbnNbMl0uQ2VsbCA9ICh7IGNlbGw6IHsgY29sdW1uLCByb3cgfSwgdmFsdWU6IHBhcnRuZXIgfTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyID0gcm93Lm9yaWdpbmFsW2Ake2NvbHVtbi5pZH1PdGhlcmBdO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Qm9keSBibG9jaz17dHJ1ZX0+e3BhcnRuZXJ9PC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9IHByaW89XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3RoZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFt1c2VQYXJ0bmVyc10pO1xuXG4gICAgY29uc3QgY29sdW1uc1dlZWtkYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbjxzdHJpbmc+W10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnUGVyc29uJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ3BlcnNvbicsIC8vIGFjY2Vzc29yIGlzIHRoZSBcImtleVwiIGluIHRoZSBkYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ01vJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBIZWFkZXI6ICdEaScsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdkYXkxJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnTWknLFxuICAgICAgICAgICAgICAgIGFjY2Vzc29yOiAnZGF5MicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ0RvJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBIZWFkZXI6ICdGcicsXG4gICAgICAgICAgICAgICAgYWNjZXNzb3I6ICdkYXk0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgSGVhZGVyOiAnU2EnLFxuICAgICAgICAgICAgICAgIGFjY2Vzc29yOiAnZGF5NScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEhlYWRlcjogJ1NvJyxcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcjogJ2RheTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCF1c2VQYXJ0bmVycykge1xuICAgICAgICAgICAgY29sdW1uc1swXS5DZWxsID0gKHsgdmFsdWU6IHBhcnRuZXIgfTogQ29sdW1uQ2VsbERhdGE8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxGbGV4PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEdyb3c+e3BhcnRuZXJ9PC9Hcm93PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEdyb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9PkljaCBiZXRlIGbDvHI8L0JvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9IHByaW89XCJzZWNvbmRhcnlcIiBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRsO8ciBtaWNoIGJldGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Hcm93PlxuICAgICAgICAgICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckZ1bmN0aW9uID0gKGNlbGxEYXRhOiBDb2x1bW5DZWxsRGF0YTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydG5lciA9IGNlbGxEYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyID0gY2VsbERhdGEuY2VsbC5yb3cub3JpZ2luYWxbYCR7Y2VsbERhdGEuY2VsbC5jb2x1bW4uaWR9T3RoZXJgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJvZHkgYmxvY2s9e3RydWV9PntwYXJ0bmVyfTwvQm9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCb2R5IGJsb2NrPXt0cnVlfSBwcmlvPVwic2Vjb25kYXJ5XCIgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge290aGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Cb2R5PlxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbHVtbnNbMV0uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICAgICAgY29sdW1uc1syXS5DZWxsID0gcmVuZGVyRnVuY3Rpb247XG4gICAgICAgICAgICBjb2x1bW5zWzNdLkNlbGwgPSByZW5kZXJGdW5jdGlvbjtcbiAgICAgICAgICAgIGNvbHVtbnNbNF0uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICAgICAgY29sdW1uc1s1XS5DZWxsID0gcmVuZGVyRnVuY3Rpb247XG4gICAgICAgICAgICBjb2x1bW5zWzZdLkNlbGwgPSByZW5kZXJGdW5jdGlvbjtcbiAgICAgICAgICAgIGNvbHVtbnNbN10uQ2VsbCA9IHJlbmRlckZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0sIFt1c2VQYXJ0bmVyc10pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBpbmNyZW1lbnRXZWVrID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goc2V0V2Vlayh3ZWVrICsgMSkpLCBbd2VlaywgZGlzcGF0Y2hdKTtcbiAgICBjb25zdCBkZWNyZW1lbnRXZWVrID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goc2V0V2Vlayh3ZWVrIC0gMSkpLCBbd2VlaywgZGlzcGF0Y2hdKTtcblxuICAgIC8vIEVmZmVjdHNcblxuICAgIC8vIE90aGVyXG4gICAgY29uc3QgW3BhcnRuZXJUYWJsZSwgaW52ZXJ0ZWRQYXJ0bmVyVGFibGVdID0gdXNlTWVtbyhcbiAgICAgICAgKCkgPT4gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVRhYmxlRm9yKG1lbWJlcnNJZHMsIHVzZVBhcnRuZXJzKSxcbiAgICAgICAgW21lbWJlcnNJZHMsIHVzZVBhcnRuZXJzXVxuICAgICk7XG5cbiAgICBpZiAoIXBhcnRuZXJUYWJsZSB8fCAhaW52ZXJ0ZWRQYXJ0bmVyVGFibGUgfHwgbWVtYmVyc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2cocGFydG5lclRhYmxlLCBpbnZlcnRlZFBhcnRuZXJUYWJsZSk7XG5cbiAgICBjb25zdCBwYXJ0bmVyVGFibGVOYW1lcyA9IHBhcnRuZXJUYWJsZS5tYXAoKHBhcnRuZXJDb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXJ0bmVyQ29sdW1uKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbWVtYmVyc1tpZF0/Lm5hbWUgPz8gaWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJ0bmVyTmFtZSA9IG1lbWJlcnNbcGFydG5lckNvbHVtbltpZF1dPy5uYW1lID8/IHBhcnRuZXJDb2x1bW5baWRdO1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQYXJ0bmVyTmFtZSA9IG1lbWJlcnNbaW52ZXJ0ZWRQYXJ0bmVyVGFibGVbaW5kZXhdW2lkXV0/Lm5hbWUgPz8gaW52ZXJ0ZWRQYXJ0bmVyVGFibGVbaW5kZXhdW2lkXTtcbiAgICAgICAgICAgIHJldHVybiBbbmFtZSwgcGFydG5lck5hbWUsIG90aGVyUGFydG5lck5hbWVdO1xuICAgICAgICB9KSBhcyBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ11bXTtcbiAgICB9KTtcblxuICAgIGxldCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcbiAgICBpZiAoIXVzZVdlZWtkYXlzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHBhcnRuZXJUYWJsZU5hbWVzW3dlZWsgJSBwYXJ0bmVyVGFibGVOYW1lcy5sZW5ndGhdO1xuICAgICAgICBkYXRhID0gY29sdW1uLm1hcCgoW25hbWUxLCBuYW1lMiwgbmFtZTNdKSA9PiAoe1xuICAgICAgICAgICAgcGFydG5lcjE6IG5hbWUxLFxuICAgICAgICAgICAgcGFydG5lcjI6IG5hbWUyLFxuICAgICAgICAgICAgcGFydG5lcjJPdGhlcjogbmFtZTMsXG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xJbmRleCA9ICh3ZWVrICogNyArIGkpICUgcGFydG5lclRhYmxlTmFtZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcGFydG5lclRhYmxlTmFtZXNbY29sSW5kZXhdO1xuICAgICAgICAgICAgY29sdW1uLmZvckVhY2goKFtwZXJzb24sIHBhcnRuZXIxLCBwYXJ0bmVyMl0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2luZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XSA9IHsgcGVyc29uIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGFbaW5kZXhdW2BkYXkke2l9YF0gPSBwYXJ0bmVyMTtcbiAgICAgICAgICAgICAgICBkYXRhW2luZGV4XVtgZGF5JHtpfU90aGVyYF0gPSBwYXJ0bmVyMjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHVzZVdlZWtkYXlzID8gY29sdW1uc1dlZWtkYXlzIDogY29sdW1uc1dlZWs7XG5cbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPEZsZXg+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtkZWNyZW1lbnRXZWVrfT4mbHQ7PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPEdyb3cgY2VudGVyPldvY2hlIHt3ZWVrICsgMX08L0dyb3c+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtpbmNyZW1lbnRXZWVrfT4mZ3Q7PC9CdXR0b24+XG4gICAgICAgICAgICA8L0ZsZXg+XG4gICAgICAgICAgICB7LyogPExpc3QgcmVuZGVySXRlbT17cmVuZGVyUGFydG5lclBhYXJ9IGtleUV4dHJhY3Rvcj17cGFydG5lcktleUV4dHJhY3Rvcn0gaXRlbXM9e3BhcnRuZXJzfS8+ICovfVxuICAgICAgICAgICAgPFRhYmxlIGRhdGE9e2RhdGF9IGNvbHVtbnM9e2NvbHVtbnN9IC8+XG4gICAgICAgIDwvPlxuICAgICk7XG59XG5cbmNvbnN0IHRtcCA9IFJlYWN0Lm1lbW8oUGFydG5lclRhYmxlKSBhcyB0eXBlb2YgUGFydG5lclRhYmxlO1xuZXhwb3J0IHsgdG1wIGFzIFBhcnRuZXJUYWJsZSB9O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2l0ZXMsIHVzZVRvcEJhciB9IGZyb20gJ2NvcmRvdmEtc2l0ZXMnO1xuaW1wb3J0IHsgTWVtYmVyTGlzdCB9IGZyb20gJy4vTWVtYmVyTGlzdCc7XG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwLW1vYmlsZSc7XG5pbXBvcnQgeyBQYXJ0bmVyVGFibGUgfSBmcm9tICcuL1BhcnRuZXJUYWJsZSc7XG5pbXBvcnQgeyBDb2wsIFJvdyB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBQcmF5ZXJDaXJjbGVTZXR0aW5ncyB9IGZyb20gJy4vUHJheWVyY2lyY2xlU2V0dGluZ3MnO1xuXG5leHBvcnQgdHlwZSBQcmF5ZXJDaXJjbGVQcm9wcyA9IHt9O1xuXG5mdW5jdGlvbiBQcmF5ZXJDaXJjbGUoe306IFByYXllckNpcmNsZVByb3BzKSB7XG4gICAgLy8gVmFyaWFibGVzXG5cbiAgICAvLyBTdGF0ZXNcblxuICAgIC8vIFJlZnNcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgLy8gRWZmZWN0c1xuICAgIHVzZVRvcEJhcih7XG4gICAgICAgIHRpdGxlOiAnUHJheWVyY2lyY2xlJyxcbiAgICB9KTtcblxuICAgIC8vIE90aGVyXG5cbiAgICAvLyBSZW5kZXIgRnVuY3Rpb25zXG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPFJvdyBsZz17M30gbWQ9ezJ9IHNtPXsxfT5cbiAgICAgICAgICAgICAgICA8Q29sPlxuICAgICAgICAgICAgICAgICAgICA8Q2FyZCBmdWxsSGVpZ2h0PXt0cnVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQcmF5ZXJDaXJjbGVTZXR0aW5ncyAvPlxuICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgICAgICAgPENvbCBjbGFzc05hbWU9XCJvcmRlci1tZC1maXJzdFwiIG1kPXs2fSBsZz17OH0+XG4gICAgICAgICAgICAgICAgICAgIDxDYXJkIG5vUGFkZGluZ0hlaWdodD17dHJ1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVtYmVyTGlzdCAvPlxuICAgICAgICAgICAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgICA8L1Jvdz5cbiAgICAgICAgICAgIDxDYXJkPlxuICAgICAgICAgICAgICAgIDxQYXJ0bmVyVGFibGUgLz5cbiAgICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC8+XG4gICAgKTtcbn1cblxuY29uc3QgdG1wID0gUmVhY3QubWVtbyhQcmF5ZXJDaXJjbGUpIGFzIHR5cGVvZiBQcmF5ZXJDaXJjbGU7XG5leHBvcnQgeyB0bXAgYXMgUHJheWVyQ2lyY2xlIH07XG5cbi8vIFNpdGVzLmFkZEluaXRpYWxpemF0aW9uKChhcHApID0+IGFwcC5hZGREZWVwTGluaygnL1ByYXllckNpcmNsZScsIHRtcCkpO1xuIiwiaW1wb3J0IHsgSnNvbkhlbHBlciB9IGZyb20gJ2pzLWhlbHBlcic7XG5cbnR5cGUgQ29sdW1uID0gUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbnR5cGUgUG9zc2libGVQYXJ0bmVycyA9IFJlY29yZDxudW1iZXIsIG51bWJlcltdPjtcblxuZXhwb3J0IGNsYXNzIFByYXllckNpcmNsZUNhbGN1bGF0b3Ige1xuICAgIHN0YXRpYyB0YWJsZXM6IFJlY29yZDxudW1iZXIsIFJlY29yZDxudW1iZXIsIG51bWJlcj5bXSB8IGZhbHNlPiA9IHtcbiAgICAgICAgMjogW3sgMDogMSwgMTogMCB9XSxcbiAgICAgICAgNDogW1xuICAgICAgICAgICAgeyAwOiAxLCAxOiAwLCAyOiAzLCAzOiAyIH0sXG4gICAgICAgICAgICB7IDA6IDIsIDE6IDMsIDI6IDAsIDM6IDEgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogMiwgMjogMSwgMzogMCB9LFxuICAgICAgICBdLFxuICAgICAgICA2OiBbXG4gICAgICAgICAgICB7IDA6IDEsIDE6IDAsIDI6IDMsIDM6IDIsIDQ6IDUsIDU6IDQgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDMsIDE6IDUsIDI6IDQsIDM6IDAsIDQ6IDIsIDU6IDEgfSxcbiAgICAgICAgICAgIHsgMDogNCwgMTogMywgMjogNSwgMzogMSwgNDogMCwgNTogMiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgODogW1xuICAgICAgICAgICAgeyAwOiAxLCAxOiAwLCAyOiAzLCAzOiAyLCA0OiA1LCA1OiA0LCA2OiA3LCA3OiA2IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogMiwgMjogMSwgMzogMCwgNDogNywgNTogNiwgNjogNSwgNzogNCB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDUsIDE6IDQsIDI6IDcsIDM6IDYsIDQ6IDEsIDU6IDAsIDY6IDMsIDc6IDIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogNCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyAwOiA3LCAxOiA2LCAyOiA1LCAzOiA0LCA0OiAzLCA1OiAyLCA2OiAxLCA3OiAwIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDEwOiBbXG4gICAgICAgICAgICB7IDA6IDEsIDE6IDAsIDI6IDMsIDM6IDIsIDQ6IDUsIDU6IDQsIDY6IDcsIDc6IDYsIDg6IDksIDk6IDggfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDgsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMSxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogMywgMTogNSwgMjogOCwgMzogMCwgNDogNywgNTogMSwgNjogOSwgNzogNCwgODogMiwgOTogNiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyAwOiA1LCAxOiAyLCAyOiAxLCAzOiA3LCA0OiA5LCA1OiAwLCA2OiA4LCA3OiAzLCA4OiA2LCA5OiA0IH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDcsIDE6IDksIDI6IDQsIDM6IDYsIDQ6IDIsIDU6IDgsIDY6IDMsIDc6IDAsIDg6IDUsIDk6IDEgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiA0LFxuICAgICAgICAgICAgICAgIDQ6IDMsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgMDogOSwgMTogMywgMjogNiwgMzogMSwgNDogOCwgNTogNywgNjogMiwgNzogNSwgODogNCwgOTogMCB9LFxuICAgICAgICBdLFxuICAgICAgICAxMjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAwLFxuICAgICAgICAgICAgICAgIDQ6IDcsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDQsXG4gICAgICAgICAgICAgICAgODogMTEsXG4gICAgICAgICAgICAgICAgOTogMTAsXG4gICAgICAgICAgICAgICAgMTA6IDksXG4gICAgICAgICAgICAgICAgMTE6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDAsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAyLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogMTEsXG4gICAgICAgICAgICAgICAgNzogMTAsXG4gICAgICAgICAgICAgICAgODogMixcbiAgICAgICAgICAgICAgICA5OiAzLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA5LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDcsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAxLFxuICAgICAgICAgICAgICAgIDEwOiA2LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNixcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDcsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IDA6IDExLCAxOiAxMCwgMjogNCwgMzogNywgNDogMiwgNTogOCwgNjogOSwgNzogMywgODogNSwgOTogNiwgMTA6IDEsIDExOiAwIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDE0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIsXG4gICAgICAgICAgICAgICAgMTogMTIsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiA1LFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogOCxcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogMTMsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogMTIsXG4gICAgICAgICAgICAgICAgMTI6IDExLFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiAxLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMTEsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDgsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogNCxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAyLFxuICAgICAgICAgICAgICAgIDU6IDYsXG4gICAgICAgICAgICAgICAgNjogNSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiAzLFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAxLFxuICAgICAgICAgICAgICAgIDc6IDEyLFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMyxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDEsXG4gICAgICAgICAgICAgICAgNDogMTMsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDExLFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTIsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAwLFxuICAgICAgICAgICAgICAgIDEyOiA2LFxuICAgICAgICAgICAgICAgIDEzOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogMCxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDksXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAxNjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIsXG4gICAgICAgICAgICAgICAgMTogMyxcbiAgICAgICAgICAgICAgICAyOiAwLFxuICAgICAgICAgICAgICAgIDM6IDEsXG4gICAgICAgICAgICAgICAgNDogNixcbiAgICAgICAgICAgICAgICA1OiA3LFxuICAgICAgICAgICAgICAgIDY6IDQsXG4gICAgICAgICAgICAgICAgNzogNSxcbiAgICAgICAgICAgICAgICA4OiAxMCxcbiAgICAgICAgICAgICAgICA5OiAxMSxcbiAgICAgICAgICAgICAgICAxMDogOCxcbiAgICAgICAgICAgICAgICAxMTogOSxcbiAgICAgICAgICAgICAgICAxMjogMTQsXG4gICAgICAgICAgICAgICAgMTM6IDE1LFxuICAgICAgICAgICAgICAgIDE0OiAxMixcbiAgICAgICAgICAgICAgICAxNTogMTMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgICAgICA4OiAxMixcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDE1LFxuICAgICAgICAgICAgICAgIDEyOiA4LFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDUsXG4gICAgICAgICAgICAgICAgMTogNCxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAxMyxcbiAgICAgICAgICAgICAgICA5OiAxMixcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDE0LFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA4LFxuICAgICAgICAgICAgICAgIDE0OiAxMSxcbiAgICAgICAgICAgICAgICAxNTogMTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDgsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAyLFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxNSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDksXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDgsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMCxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAxMixcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAxNCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDUsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxMCxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDMsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDcsXG4gICAgICAgICAgICAgICAgMTU6IDYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDgsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAxNSxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDQsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDExLFxuICAgICAgICAgICAgICAgIDE6IDEwLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxMyxcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDcsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDUsXG4gICAgICAgICAgICAgICAgMTU6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAxMCxcbiAgICAgICAgICAgICAgICA3OiAxMSxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDEyLFxuICAgICAgICAgICAgICAgIDI6IDE1LFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogOCxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE0LFxuICAgICAgICAgICAgICAgIDE6IDE1LFxuICAgICAgICAgICAgICAgIDI6IDEyLFxuICAgICAgICAgICAgICAgIDM6IDEzLFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDgsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE0LFxuICAgICAgICAgICAgICAgIDI6IDEzLFxuICAgICAgICAgICAgICAgIDM6IDEyLFxuICAgICAgICAgICAgICAgIDQ6IDExLFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDIsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAxODogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICAgICAgMTY6IDE3LFxuICAgICAgICAgICAgICAgIDE3OiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAxNixcbiAgICAgICAgICAgICAgICAyOiAwLFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogNixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDQsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAxMCxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiAxMyxcbiAgICAgICAgICAgICAgICAxMjogMTQsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAxMixcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMTYsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAxNSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDE3LFxuICAgICAgICAgICAgICAgIDE1OiAxMixcbiAgICAgICAgICAgICAgICAxNjogMixcbiAgICAgICAgICAgICAgICAxNzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxLFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDE2LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAxNCxcbiAgICAgICAgICAgICAgICAxNDogMTMsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDcsXG4gICAgICAgICAgICAgICAgMTc6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAxNixcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE3LFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICAgICAgMTY6IDUsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogNSxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDE2LFxuICAgICAgICAgICAgICAgIDE2OiAxNSxcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxNyxcbiAgICAgICAgICAgICAgICAxMjogMSxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiA3LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiA2LFxuICAgICAgICAgICAgICAgIDE0OiAzLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMTIsXG4gICAgICAgICAgICAgICAgMTc6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMTQsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMTUsXG4gICAgICAgICAgICAgICAgNzogMTcsXG4gICAgICAgICAgICAgICAgODogMTYsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogNCxcbiAgICAgICAgICAgICAgICAxNTogNixcbiAgICAgICAgICAgICAgICAxNjogOCxcbiAgICAgICAgICAgICAgICAxNzogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAxNyxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDE1LFxuICAgICAgICAgICAgICAgIDEwOiA1LFxuICAgICAgICAgICAgICAgIDExOiAwLFxuICAgICAgICAgICAgICAgIDEyOiAzLFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiA4LFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiAyLFxuICAgICAgICAgICAgICAgIDc6IDMsXG4gICAgICAgICAgICAgICAgODogMSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDE2LFxuICAgICAgICAgICAgICAgIDEyOiAwLFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiA0LFxuICAgICAgICAgICAgICAgIDE2OiAxMSxcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDExLFxuICAgICAgICAgICAgICAgIDc6IDE0LFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMTYsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiAwLFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAxMCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogNixcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDE1LFxuICAgICAgICAgICAgICAgIDY6IDEsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogNCxcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTYsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDcsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDEwLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNSxcbiAgICAgICAgICAgICAgICAxOiAyLFxuICAgICAgICAgICAgICAgIDI6IDEsXG4gICAgICAgICAgICAgICAgMzogOSxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogMTMsXG4gICAgICAgICAgICAgICAgMTc6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE2LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxNCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMCxcbiAgICAgICAgICAgICAgICAxNzogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogMTUsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogOCxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA0LFxuICAgICAgICAgICAgICAgIDExOiAyLFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiAxLFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgMjA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxLFxuICAgICAgICAgICAgICAgIDE6IDAsXG4gICAgICAgICAgICAgICAgMjogMyxcbiAgICAgICAgICAgICAgICAzOiAyLFxuICAgICAgICAgICAgICAgIDQ6IDUsXG4gICAgICAgICAgICAgICAgNTogNCxcbiAgICAgICAgICAgICAgICA2OiA3LFxuICAgICAgICAgICAgICAgIDc6IDYsXG4gICAgICAgICAgICAgICAgODogOSxcbiAgICAgICAgICAgICAgICA5OiA4LFxuICAgICAgICAgICAgICAgIDEwOiAxMSxcbiAgICAgICAgICAgICAgICAxMTogMTAsXG4gICAgICAgICAgICAgICAgMTI6IDEzLFxuICAgICAgICAgICAgICAgIDEzOiAxMixcbiAgICAgICAgICAgICAgICAxNDogMTUsXG4gICAgICAgICAgICAgICAgMTU6IDE0LFxuICAgICAgICAgICAgICAgIDE2OiAxNyxcbiAgICAgICAgICAgICAgICAxNzogMTYsXG4gICAgICAgICAgICAgICAgMTg6IDE5LFxuICAgICAgICAgICAgICAgIDE5OiAxOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxOCxcbiAgICAgICAgICAgICAgICAxODogMTcsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA0LFxuICAgICAgICAgICAgICAgIDE6IDE2LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogMTgsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDEzLFxuICAgICAgICAgICAgICAgIDE4OiAzLFxuICAgICAgICAgICAgICAgIDE5OiAxNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDE2LFxuICAgICAgICAgICAgICAgIDM6IDE3LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxMCxcbiAgICAgICAgICAgICAgICA4OiAxMyxcbiAgICAgICAgICAgICAgICA5OiAxMixcbiAgICAgICAgICAgICAgICAxMDogNyxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogOSxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTksXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiAyLFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAxNSxcbiAgICAgICAgICAgICAgICAxOTogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNSxcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogOSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiA3LFxuICAgICAgICAgICAgICAgIDEwOiAxMixcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogMTAsXG4gICAgICAgICAgICAgICAgMTM6IDE5LFxuICAgICAgICAgICAgICAgIDE0OiA4LFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMyxcbiAgICAgICAgICAgICAgICAxNzogMTUsXG4gICAgICAgICAgICAgICAgMTg6IDIsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA3LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxLFxuICAgICAgICAgICAgICAgIDc6IDAsXG4gICAgICAgICAgICAgICAgODogMTUsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMTksXG4gICAgICAgICAgICAgICAgMTE6IDUsXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAzLFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogNCxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDE0LFxuICAgICAgICAgICAgICAgIDE5OiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiAxNyxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDE0LFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE4LFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgICAgICAxNDogNCxcbiAgICAgICAgICAgICAgICAxNTogOSxcbiAgICAgICAgICAgICAgICAxNjogNSxcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgICAgICAxODogNixcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDE3LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTYsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMTEsXG4gICAgICAgICAgICAgICAgMTg6IDEyLFxuICAgICAgICAgICAgICAgIDE5OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMCxcbiAgICAgICAgICAgICAgICAxOiAxMSxcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogMTksXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA0LFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogMTQsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogMTUsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogNixcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgICAgIDE0OiAyLFxuICAgICAgICAgICAgICAgIDE1OiA3LFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICAgICAgMTg6IDgsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDE0LFxuICAgICAgICAgICAgICAgIDI6IDE1LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMyxcbiAgICAgICAgICAgICAgICA5OiAxNyxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMTksXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICAgICAgMTY6IDcsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMyxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMixcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDE3LFxuICAgICAgICAgICAgICAgIDk6IDE4LFxuICAgICAgICAgICAgICAgIDEwOiAxLFxuICAgICAgICAgICAgICAgIDExOiAxNSxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogMCxcbiAgICAgICAgICAgICAgICAxNDogMTYsXG4gICAgICAgICAgICAgICAgMTU6IDExLFxuICAgICAgICAgICAgICAgIDE2OiAxNCxcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogMTAsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxOCxcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDIsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDYsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDUsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE4LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDksXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogMTksXG4gICAgICAgICAgICAgICAgODogMTYsXG4gICAgICAgICAgICAgICAgOTogNCxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAzLFxuICAgICAgICAgICAgICAgIDE1OiAwLFxuICAgICAgICAgICAgICAgIDE2OiA4LFxuICAgICAgICAgICAgICAgIDE3OiA2LFxuICAgICAgICAgICAgICAgIDE4OiAxLFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNixcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDExLFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogOSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDAsXG4gICAgICAgICAgICAgICAgMTc6IDE0LFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxMCxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiA4LFxuICAgICAgICAgICAgICAgIDc6IDE0LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMTgsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDUsXG4gICAgICAgICAgICAgICAgMTQ6IDcsXG4gICAgICAgICAgICAgICAgMTU6IDE2LFxuICAgICAgICAgICAgICAgIDE2OiAxNSxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogMTEsXG4gICAgICAgICAgICAgICAgMTk6IDMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE4LFxuICAgICAgICAgICAgICAgIDE6IDEyLFxuICAgICAgICAgICAgICAgIDI6IDE5LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDE3LFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTMsXG4gICAgICAgICAgICAgICAgODogNSxcbiAgICAgICAgICAgICAgICA5OiAxNCxcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDksXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOSxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTMsXG4gICAgICAgICAgICAgICAgNTogMTcsXG4gICAgICAgICAgICAgICAgNjogMTIsXG4gICAgICAgICAgICAgICAgNzogMTgsXG4gICAgICAgICAgICAgICAgODogMixcbiAgICAgICAgICAgICAgICA5OiAzLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAxLFxuICAgICAgICAgICAgICAgIDE2OiAxMCxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDIyOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICAgICAgMTQ6IDE1LFxuICAgICAgICAgICAgICAgIDE1OiAxNCxcbiAgICAgICAgICAgICAgICAxNjogMTcsXG4gICAgICAgICAgICAgICAgMTc6IDE2LFxuICAgICAgICAgICAgICAgIDE4OiAxOSxcbiAgICAgICAgICAgICAgICAxOTogMTgsXG4gICAgICAgICAgICAgICAgMjA6IDIxLFxuICAgICAgICAgICAgICAgIDIxOiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMixcbiAgICAgICAgICAgICAgICAxOiAzLFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDcsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDExLFxuICAgICAgICAgICAgICAgIDEwOiA4LFxuICAgICAgICAgICAgICAgIDExOiA5LFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTUsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxMyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDIwLFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDE3LFxuICAgICAgICAgICAgICAgIDIxOiAxOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMyxcbiAgICAgICAgICAgICAgICAxOiAyLFxuICAgICAgICAgICAgICAgIDI6IDEsXG4gICAgICAgICAgICAgICAgMzogMCxcbiAgICAgICAgICAgICAgICA0OiA3LFxuICAgICAgICAgICAgICAgIDU6IDYsXG4gICAgICAgICAgICAgICAgNjogNSxcbiAgICAgICAgICAgICAgICA3OiA0LFxuICAgICAgICAgICAgICAgIDg6IDExLFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiA4LFxuICAgICAgICAgICAgICAgIDEyOiAxNSxcbiAgICAgICAgICAgICAgICAxMzogMTQsXG4gICAgICAgICAgICAgICAgMTQ6IDEzLFxuICAgICAgICAgICAgICAgIDE1OiAxMixcbiAgICAgICAgICAgICAgICAxNjogMTksXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiAyMCxcbiAgICAgICAgICAgICAgICAxOTogMTYsXG4gICAgICAgICAgICAgICAgMjA6IDE4LFxuICAgICAgICAgICAgICAgIDIxOiAxNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAwLFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDEwLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMjAsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAyMSxcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICAgICAgMjA6IDE2LFxuICAgICAgICAgICAgICAgIDIxOiAxOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNSxcbiAgICAgICAgICAgICAgICAxOiA0LFxuICAgICAgICAgICAgICAgIDI6IDcsXG4gICAgICAgICAgICAgICAgMzogNixcbiAgICAgICAgICAgICAgICA0OiAxLFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogMyxcbiAgICAgICAgICAgICAgICA3OiAyLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiAxNSxcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDksXG4gICAgICAgICAgICAgICAgMTM6IDgsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAxMCxcbiAgICAgICAgICAgICAgICAxNjogMjEsXG4gICAgICAgICAgICAgICAgMTc6IDE4LFxuICAgICAgICAgICAgICAgIDE4OiAxNyxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDQsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiAyLFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogMCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAxNyxcbiAgICAgICAgICAgICAgICAxMTogMTgsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAyMCxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogMjEsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICAgICAgMjA6IDEzLFxuICAgICAgICAgICAgICAgIDIxOiAxNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE3LFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTksXG4gICAgICAgICAgICAgICAgMTI6IDE4LFxuICAgICAgICAgICAgICAgIDEzOiAyMSxcbiAgICAgICAgICAgICAgICAxNDogMjAsXG4gICAgICAgICAgICAgICAgMTU6IDgsXG4gICAgICAgICAgICAgICAgMTY6IDEwLFxuICAgICAgICAgICAgICAgIDE3OiA5LFxuICAgICAgICAgICAgICAgIDE4OiAxMixcbiAgICAgICAgICAgICAgICAxOTogMTEsXG4gICAgICAgICAgICAgICAgMjA6IDE0LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOCxcbiAgICAgICAgICAgICAgICAxOiA5LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE3LFxuICAgICAgICAgICAgICAgIDc6IDE4LFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMyxcbiAgICAgICAgICAgICAgICAxMjogNCxcbiAgICAgICAgICAgICAgICAxMzogMTksXG4gICAgICAgICAgICAgICAgMTQ6IDIxLFxuICAgICAgICAgICAgICAgIDE1OiAyMCxcbiAgICAgICAgICAgICAgICAxNjogNSxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogMTMsXG4gICAgICAgICAgICAgICAgMjA6IDE1LFxuICAgICAgICAgICAgICAgIDIxOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOSxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDExLFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDEzLFxuICAgICAgICAgICAgICAgIDU6IDE3LFxuICAgICAgICAgICAgICAgIDY6IDE2LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDEsXG4gICAgICAgICAgICAgICAgOTogMCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMjEsXG4gICAgICAgICAgICAgICAgMTM6IDQsXG4gICAgICAgICAgICAgICAgMTQ6IDE4LFxuICAgICAgICAgICAgICAgIDE1OiAxOSxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiAxMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMTEsXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiA5LFxuICAgICAgICAgICAgICAgIDQ6IDE0LFxuICAgICAgICAgICAgICAgIDU6IDE4LFxuICAgICAgICAgICAgICAgIDY6IDE5LFxuICAgICAgICAgICAgICAgIDc6IDIxLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMjAsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMTMsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiA2LFxuICAgICAgICAgICAgICAgIDIwOiAxMixcbiAgICAgICAgICAgICAgICAyMTogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTEsXG4gICAgICAgICAgICAgICAgMTogMTAsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiA4LFxuICAgICAgICAgICAgICAgIDQ6IDE1LFxuICAgICAgICAgICAgICAgIDU6IDIwLFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDE2LFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMixcbiAgICAgICAgICAgICAgICAxMDogMSxcbiAgICAgICAgICAgICAgICAxMTogMCxcbiAgICAgICAgICAgICAgICAxMjogMTcsXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDEzLFxuICAgICAgICAgICAgICAgIDE5OiAxNCxcbiAgICAgICAgICAgICAgICAyMDogNSxcbiAgICAgICAgICAgICAgICAyMTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTIsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogMTQsXG4gICAgICAgICAgICAgICAgMzogMTUsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxOSxcbiAgICAgICAgICAgICAgICA2OiAxOCxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDIwLFxuICAgICAgICAgICAgICAgIDEwOiAyMSxcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDEsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDMsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA3LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiA1LFxuICAgICAgICAgICAgICAgIDIwOiA5LFxuICAgICAgICAgICAgICAgIDIxOiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogMTIsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogOSxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiAxNixcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMTcsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDExLFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogNyxcbiAgICAgICAgICAgICAgICAyMDogNixcbiAgICAgICAgICAgICAgICAyMTogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTQsXG4gICAgICAgICAgICAgICAgMTogMTUsXG4gICAgICAgICAgICAgICAgMjogMTYsXG4gICAgICAgICAgICAgICAgMzogMTcsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogOCxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxMyxcbiAgICAgICAgICAgICAgICA4OiA1LFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogMjEsXG4gICAgICAgICAgICAgICAgMTI6IDYsXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDIsXG4gICAgICAgICAgICAgICAgMTc6IDMsXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDksXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTUsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMTcsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTAsXG4gICAgICAgICAgICAgICAgNjogMTMsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDIwLFxuICAgICAgICAgICAgICAgIDEyOiA3LFxuICAgICAgICAgICAgICAgIDEzOiA2LFxuICAgICAgICAgICAgICAgIDE0OiAxLFxuICAgICAgICAgICAgICAgIDE1OiAwLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiA4LFxuICAgICAgICAgICAgICAgIDE5OiA0LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTYsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogMTIsXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMjAsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiA1LFxuICAgICAgICAgICAgICAgIDEwOiAxOSxcbiAgICAgICAgICAgICAgICAxMTogNixcbiAgICAgICAgICAgICAgICAxMjogMixcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogNyxcbiAgICAgICAgICAgICAgICAxNTogMTgsXG4gICAgICAgICAgICAgICAgMTY6IDAsXG4gICAgICAgICAgICAgICAgMTc6IDEsXG4gICAgICAgICAgICAgICAgMTg6IDE1LFxuICAgICAgICAgICAgICAgIDE5OiAxMCxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTcsXG4gICAgICAgICAgICAgICAgMTogMTYsXG4gICAgICAgICAgICAgICAgMjogMTMsXG4gICAgICAgICAgICAgICAgMzogMTksXG4gICAgICAgICAgICAgICAgNDogMjEsXG4gICAgICAgICAgICAgICAgNTogMTEsXG4gICAgICAgICAgICAgICAgNjogMTQsXG4gICAgICAgICAgICAgICAgNzogMTUsXG4gICAgICAgICAgICAgICAgODogMjAsXG4gICAgICAgICAgICAgICAgOTogMTgsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMSxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogMyxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTgsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMjAsXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMTAsXG4gICAgICAgICAgICAgICAgNTogMTIsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDYsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMTMsXG4gICAgICAgICAgICAgICAgMTI6IDUsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiAxNyxcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMCxcbiAgICAgICAgICAgICAgICAxOTogMSxcbiAgICAgICAgICAgICAgICAyMDogMixcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTksXG4gICAgICAgICAgICAgICAgMTogMTgsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMjAsXG4gICAgICAgICAgICAgICAgNDogMTEsXG4gICAgICAgICAgICAgICAgNTogMTMsXG4gICAgICAgICAgICAgICAgNjogMTUsXG4gICAgICAgICAgICAgICAgNzogMTAsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMTQsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogMSxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogMyxcbiAgICAgICAgICAgICAgICAyMTogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjAsXG4gICAgICAgICAgICAgICAgMTogMjEsXG4gICAgICAgICAgICAgICAgMjogMTgsXG4gICAgICAgICAgICAgICAgMzogMTIsXG4gICAgICAgICAgICAgICAgNDogMTYsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogOCxcbiAgICAgICAgICAgICAgICAyMDogMCxcbiAgICAgICAgICAgICAgICAyMTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjEsXG4gICAgICAgICAgICAgICAgMTogMjAsXG4gICAgICAgICAgICAgICAgMjogMTksXG4gICAgICAgICAgICAgICAgMzogMTgsXG4gICAgICAgICAgICAgICAgNDogMTcsXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogOSxcbiAgICAgICAgICAgICAgICA3OiA4LFxuICAgICAgICAgICAgICAgIDg6IDcsXG4gICAgICAgICAgICAgICAgOTogNixcbiAgICAgICAgICAgICAgICAxMDogMTMsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMTAsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiA1LFxuICAgICAgICAgICAgICAgIDE2OiAxNCxcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgICAgICAxODogMyxcbiAgICAgICAgICAgICAgICAxOTogMixcbiAgICAgICAgICAgICAgICAyMDogMSxcbiAgICAgICAgICAgICAgICAyMTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIDI0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMSxcbiAgICAgICAgICAgICAgICAxOiAwLFxuICAgICAgICAgICAgICAgIDI6IDMsXG4gICAgICAgICAgICAgICAgMzogMixcbiAgICAgICAgICAgICAgICA0OiA1LFxuICAgICAgICAgICAgICAgIDU6IDQsXG4gICAgICAgICAgICAgICAgNjogNyxcbiAgICAgICAgICAgICAgICA3OiA2LFxuICAgICAgICAgICAgICAgIDg6IDksXG4gICAgICAgICAgICAgICAgOTogOCxcbiAgICAgICAgICAgICAgICAxMDogMTEsXG4gICAgICAgICAgICAgICAgMTE6IDEwLFxuICAgICAgICAgICAgICAgIDEyOiAxMyxcbiAgICAgICAgICAgICAgICAxMzogMTIsXG4gICAgICAgICAgICAgICAgMTQ6IDE1LFxuICAgICAgICAgICAgICAgIDE1OiAxNCxcbiAgICAgICAgICAgICAgICAxNjogMTcsXG4gICAgICAgICAgICAgICAgMTc6IDE2LFxuICAgICAgICAgICAgICAgIDE4OiAxOSxcbiAgICAgICAgICAgICAgICAxOTogMTgsXG4gICAgICAgICAgICAgICAgMjA6IDIxLFxuICAgICAgICAgICAgICAgIDIxOiAyMCxcbiAgICAgICAgICAgICAgICAyMjogMjMsXG4gICAgICAgICAgICAgICAgMjM6IDIyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiAxLFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE0LFxuICAgICAgICAgICAgICAgIDEzOiAxNSxcbiAgICAgICAgICAgICAgICAxNDogMTIsXG4gICAgICAgICAgICAgICAgMTU6IDEzLFxuICAgICAgICAgICAgICAgIDE2OiAxOCxcbiAgICAgICAgICAgICAgICAxNzogMTksXG4gICAgICAgICAgICAgICAgMTg6IDE2LFxuICAgICAgICAgICAgICAgIDE5OiAxNyxcbiAgICAgICAgICAgICAgICAyMDogMjIsXG4gICAgICAgICAgICAgICAgMjE6IDIzLFxuICAgICAgICAgICAgICAgIDIyOiAyMCxcbiAgICAgICAgICAgICAgICAyMzogMjEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDMsXG4gICAgICAgICAgICAgICAgMTogMixcbiAgICAgICAgICAgICAgICAyOiAxLFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiAxMCxcbiAgICAgICAgICAgICAgICAxMDogOSxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxOCxcbiAgICAgICAgICAgICAgICAxODogMTcsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgICAgIDIwOiAyMyxcbiAgICAgICAgICAgICAgICAyMTogMjIsXG4gICAgICAgICAgICAgICAgMjI6IDIxLFxuICAgICAgICAgICAgICAgIDIzOiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNCxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAwLFxuICAgICAgICAgICAgICAgIDU6IDEsXG4gICAgICAgICAgICAgICAgNjogMixcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDksXG4gICAgICAgICAgICAgICAgMTQ6IDEwLFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMjAsXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiAyMixcbiAgICAgICAgICAgICAgICAxOTogMjMsXG4gICAgICAgICAgICAgICAgMjA6IDE2LFxuICAgICAgICAgICAgICAgIDIxOiAxNyxcbiAgICAgICAgICAgICAgICAyMjogMTgsXG4gICAgICAgICAgICAgICAgMjM6IDE5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMCxcbiAgICAgICAgICAgICAgICA2OiAzLFxuICAgICAgICAgICAgICAgIDc6IDIsXG4gICAgICAgICAgICAgICAgODogMTMsXG4gICAgICAgICAgICAgICAgOTogMTIsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogOSxcbiAgICAgICAgICAgICAgICAxMzogOCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAyMSxcbiAgICAgICAgICAgICAgICAxNzogMjAsXG4gICAgICAgICAgICAgICAgMTg6IDIzLFxuICAgICAgICAgICAgICAgIDE5OiAyMixcbiAgICAgICAgICAgICAgICAyMDogMTcsXG4gICAgICAgICAgICAgICAgMjE6IDE2LFxuICAgICAgICAgICAgICAgIDIyOiAxOSxcbiAgICAgICAgICAgICAgICAyMzogMTgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDYsXG4gICAgICAgICAgICAgICAgMTogNyxcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiAzLFxuICAgICAgICAgICAgICAgIDY6IDAsXG4gICAgICAgICAgICAgICAgNzogMSxcbiAgICAgICAgICAgICAgICA4OiAxNCxcbiAgICAgICAgICAgICAgICA5OiAxNSxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxMCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDgsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICAgICAgMTY6IDIyLFxuICAgICAgICAgICAgICAgIDE3OiAyMyxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDIxLFxuICAgICAgICAgICAgICAgIDIwOiAxOCxcbiAgICAgICAgICAgICAgICAyMTogMTksXG4gICAgICAgICAgICAgICAgMjI6IDE2LFxuICAgICAgICAgICAgICAgIDIzOiAxNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDUsXG4gICAgICAgICAgICAgICAgMzogNCxcbiAgICAgICAgICAgICAgICA0OiAzLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE1LFxuICAgICAgICAgICAgICAgIDk6IDE0LFxuICAgICAgICAgICAgICAgIDEwOiAxMyxcbiAgICAgICAgICAgICAgICAxMTogMTIsXG4gICAgICAgICAgICAgICAgMTI6IDExLFxuICAgICAgICAgICAgICAgIDEzOiAxMCxcbiAgICAgICAgICAgICAgICAxNDogOSxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogMjMsXG4gICAgICAgICAgICAgICAgMTc6IDIyLFxuICAgICAgICAgICAgICAgIDE4OiAyMSxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxOCxcbiAgICAgICAgICAgICAgICAyMjogMTcsXG4gICAgICAgICAgICAgICAgMjM6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDE2LFxuICAgICAgICAgICAgICAgIDI6IDEwLFxuICAgICAgICAgICAgICAgIDM6IDE4LFxuICAgICAgICAgICAgICAgIDQ6IDEyLFxuICAgICAgICAgICAgICAgIDU6IDIwLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDIyLFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDE5LFxuICAgICAgICAgICAgICAgIDEyOiA0LFxuICAgICAgICAgICAgICAgIDEzOiAyMSxcbiAgICAgICAgICAgICAgICAxNDogNixcbiAgICAgICAgICAgICAgICAxNTogMjMsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDksXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDExLFxuICAgICAgICAgICAgICAgIDIwOiA1LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogNyxcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDksXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAxNixcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAyMSxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE5LFxuICAgICAgICAgICAgICAgIDExOiAxOCxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogMjMsXG4gICAgICAgICAgICAgICAgMTU6IDIyLFxuICAgICAgICAgICAgICAgIDE2OiAyLFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMTAsXG4gICAgICAgICAgICAgICAgMjA6IDYsXG4gICAgICAgICAgICAgICAgMjE6IDcsXG4gICAgICAgICAgICAgICAgMjI6IDE1LFxuICAgICAgICAgICAgICAgIDIzOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTAsXG4gICAgICAgICAgICAgICAgMTogMTcsXG4gICAgICAgICAgICAgICAgMjogOCxcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAyMixcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiAyLFxuICAgICAgICAgICAgICAgIDk6IDE4LFxuICAgICAgICAgICAgICAgIDEwOiAwLFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogNixcbiAgICAgICAgICAgICAgICAxMzogMjMsXG4gICAgICAgICAgICAgICAgMTQ6IDQsXG4gICAgICAgICAgICAgICAgMTU6IDIxLFxuICAgICAgICAgICAgICAgIDE2OiAzLFxuICAgICAgICAgICAgICAgIDE3OiAxLFxuICAgICAgICAgICAgICAgIDE4OiA5LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogMTUsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyMSxcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAyMCxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDE4LFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMjMsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDE5LFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiAyMixcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDQsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiAxMixcbiAgICAgICAgICAgICAgICAyMDogMyxcbiAgICAgICAgICAgICAgICAyMTogMSxcbiAgICAgICAgICAgICAgICAyMjogMTQsXG4gICAgICAgICAgICAgICAgMjM6IDksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEyLFxuICAgICAgICAgICAgICAgIDE6IDIwLFxuICAgICAgICAgICAgICAgIDI6IDE5LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTAsXG4gICAgICAgICAgICAgICAgNTogMTUsXG4gICAgICAgICAgICAgICAgNjogMjIsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMjEsXG4gICAgICAgICAgICAgICAgOTogMyxcbiAgICAgICAgICAgICAgICAxMDogNCxcbiAgICAgICAgICAgICAgICAxMTogMjMsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogNSxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTMsXG4gICAgICAgICAgICAgICAgMTg6IDE0LFxuICAgICAgICAgICAgICAgIDE5OiAyLFxuICAgICAgICAgICAgICAgIDIwOiAxLFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiA2LFxuICAgICAgICAgICAgICAgIDIzOiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTMsXG4gICAgICAgICAgICAgICAgMTogOSxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAyMSxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiAxNixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAxLFxuICAgICAgICAgICAgICAgIDEwOiAyMyxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMjIsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDE5LFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiA1LFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiA3LFxuICAgICAgICAgICAgICAgIDE5OiAxNCxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgICAgICAyMjogMTIsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiAyMixcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAyMSxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDIzLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDE4LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxNyxcbiAgICAgICAgICAgICAgICAxMzogMyxcbiAgICAgICAgICAgICAgICAxNDogMCxcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAxMixcbiAgICAgICAgICAgICAgICAxODogMTAsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDIsXG4gICAgICAgICAgICAgICAgMjE6IDQsXG4gICAgICAgICAgICAgICAgMjI6IDEsXG4gICAgICAgICAgICAgICAgMjM6IDgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE1LFxuICAgICAgICAgICAgICAgIDE6IDE4LFxuICAgICAgICAgICAgICAgIDI6IDIzLFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogMTcsXG4gICAgICAgICAgICAgICAgNjogMTAsXG4gICAgICAgICAgICAgICAgNzogMTMsXG4gICAgICAgICAgICAgICAgODogMyxcbiAgICAgICAgICAgICAgICA5OiAxNixcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMjIsXG4gICAgICAgICAgICAgICAgMTI6IDIwLFxuICAgICAgICAgICAgICAgIDEzOiA3LFxuICAgICAgICAgICAgICAgIDE0OiAyMSxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMSxcbiAgICAgICAgICAgICAgICAxOTogNCxcbiAgICAgICAgICAgICAgICAyMDogMTIsXG4gICAgICAgICAgICAgICAgMjE6IDE0LFxuICAgICAgICAgICAgICAgIDIyOiAxMSxcbiAgICAgICAgICAgICAgICAyMzogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTYsXG4gICAgICAgICAgICAgICAgMTogMjMsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMTAsXG4gICAgICAgICAgICAgICAgNDogMjAsXG4gICAgICAgICAgICAgICAgNTogMTgsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAzLFxuICAgICAgICAgICAgICAgIDExOiAxNyxcbiAgICAgICAgICAgICAgICAxMjogMjEsXG4gICAgICAgICAgICAgICAgMTM6IDIyLFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAwLFxuICAgICAgICAgICAgICAgIDE3OiAxMSxcbiAgICAgICAgICAgICAgICAxODogNSxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogMTIsXG4gICAgICAgICAgICAgICAgMjI6IDEzLFxuICAgICAgICAgICAgICAgIDIzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxOSxcbiAgICAgICAgICAgICAgICAyOiAxNCxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAyMixcbiAgICAgICAgICAgICAgICA1OiAyMyxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiAxOCxcbiAgICAgICAgICAgICAgICA5OiAyMCxcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDE2LFxuICAgICAgICAgICAgICAgIDE0OiAyLFxuICAgICAgICAgICAgICAgIDE1OiA3LFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMCxcbiAgICAgICAgICAgICAgICAxODogOCxcbiAgICAgICAgICAgICAgICAxOTogMSxcbiAgICAgICAgICAgICAgICAyMDogOSxcbiAgICAgICAgICAgICAgICAyMTogMTAsXG4gICAgICAgICAgICAgICAgMjI6IDQsXG4gICAgICAgICAgICAgICAgMjM6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE4LFxuICAgICAgICAgICAgICAgIDE6IDE1LFxuICAgICAgICAgICAgICAgIDI6IDEyLFxuICAgICAgICAgICAgICAgIDM6IDIyLFxuICAgICAgICAgICAgICAgIDQ6IDIzLFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDIxLFxuICAgICAgICAgICAgICAgIDEwOiAxNyxcbiAgICAgICAgICAgICAgICAxMTogNyxcbiAgICAgICAgICAgICAgICAxMjogMixcbiAgICAgICAgICAgICAgICAxMzogNixcbiAgICAgICAgICAgICAgICAxNDogMjAsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiA1LFxuICAgICAgICAgICAgICAgIDIwOiAxNCxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogMyxcbiAgICAgICAgICAgICAgICAyMzogNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTksXG4gICAgICAgICAgICAgICAgMTogMTEsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMTUsXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDIyLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDIwLFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiAzLFxuICAgICAgICAgICAgICAgIDE2OiAxMCxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogNCxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogMTMsXG4gICAgICAgICAgICAgICAgMjE6IDIsXG4gICAgICAgICAgICAgICAgMjI6IDksXG4gICAgICAgICAgICAgICAgMjM6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiAxNCxcbiAgICAgICAgICAgICAgICAyOiAxNyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDIzLFxuICAgICAgICAgICAgICAgIDg6IDIyLFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxOCxcbiAgICAgICAgICAgICAgICAxNDogMSxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDEyLFxuICAgICAgICAgICAgICAgIDE3OiAyLFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogMTUsXG4gICAgICAgICAgICAgICAgMjA6IDAsXG4gICAgICAgICAgICAgICAgMjE6IDYsXG4gICAgICAgICAgICAgICAgMjI6IDgsXG4gICAgICAgICAgICAgICAgMjM6IDcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIxLFxuICAgICAgICAgICAgICAgIDE6IDEwLFxuICAgICAgICAgICAgICAgIDI6IDIyLFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDgsXG4gICAgICAgICAgICAgICAgNTogOSxcbiAgICAgICAgICAgICAgICA2OiAyMyxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiA0LFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDE2LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTksXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDIwLFxuICAgICAgICAgICAgICAgIDE2OiAxMSxcbiAgICAgICAgICAgICAgICAxNzogNyxcbiAgICAgICAgICAgICAgICAxODogMTIsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgICAgIDIwOiAxNSxcbiAgICAgICAgICAgICAgICAyMTogMCxcbiAgICAgICAgICAgICAgICAyMjogMixcbiAgICAgICAgICAgICAgICAyMzogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjIsXG4gICAgICAgICAgICAgICAgMTogMTMsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiAxMSxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAxMixcbiAgICAgICAgICAgICAgICA4OiAxOSxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiA2LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDgsXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiA1LFxuICAgICAgICAgICAgICAgIDIyOiAwLFxuICAgICAgICAgICAgICAgIDIzOiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAxMyxcbiAgICAgICAgICAgICAgICA2OiA5LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDE3LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAyMSxcbiAgICAgICAgICAgICAgICAxMjogMSxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgICAgICAxNDogMTYsXG4gICAgICAgICAgICAgICAgMTU6IDQsXG4gICAgICAgICAgICAgICAgMTY6IDE0LFxuICAgICAgICAgICAgICAgIDE3OiA4LFxuICAgICAgICAgICAgICAgIDE4OiAyLFxuICAgICAgICAgICAgICAgIDE5OiAzLFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiAxMSxcbiAgICAgICAgICAgICAgICAyMjogMTAsXG4gICAgICAgICAgICAgICAgMjM6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAyNjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEsXG4gICAgICAgICAgICAgICAgMTogMCxcbiAgICAgICAgICAgICAgICAyOiAzLFxuICAgICAgICAgICAgICAgIDM6IDIsXG4gICAgICAgICAgICAgICAgNDogNSxcbiAgICAgICAgICAgICAgICA1OiA0LFxuICAgICAgICAgICAgICAgIDY6IDcsXG4gICAgICAgICAgICAgICAgNzogNixcbiAgICAgICAgICAgICAgICA4OiA5LFxuICAgICAgICAgICAgICAgIDk6IDgsXG4gICAgICAgICAgICAgICAgMTA6IDExLFxuICAgICAgICAgICAgICAgIDExOiAxMCxcbiAgICAgICAgICAgICAgICAxMjogMTMsXG4gICAgICAgICAgICAgICAgMTM6IDEyLFxuICAgICAgICAgICAgICAgIDE0OiAxNSxcbiAgICAgICAgICAgICAgICAxNTogMTQsXG4gICAgICAgICAgICAgICAgMTY6IDE3LFxuICAgICAgICAgICAgICAgIDE3OiAxNixcbiAgICAgICAgICAgICAgICAxODogMTksXG4gICAgICAgICAgICAgICAgMTk6IDE4LFxuICAgICAgICAgICAgICAgIDIwOiAyMSxcbiAgICAgICAgICAgICAgICAyMTogMjAsXG4gICAgICAgICAgICAgICAgMjI6IDIzLFxuICAgICAgICAgICAgICAgIDIzOiAyMixcbiAgICAgICAgICAgICAgICAyNDogMjUsXG4gICAgICAgICAgICAgICAgMjU6IDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDI0LFxuICAgICAgICAgICAgICAgIDI6IDAsXG4gICAgICAgICAgICAgICAgMzogNSxcbiAgICAgICAgICAgICAgICA0OiA2LFxuICAgICAgICAgICAgICAgIDU6IDMsXG4gICAgICAgICAgICAgICAgNjogNCxcbiAgICAgICAgICAgICAgICA3OiA5LFxuICAgICAgICAgICAgICAgIDg6IDEwLFxuICAgICAgICAgICAgICAgIDk6IDcsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDEzLFxuICAgICAgICAgICAgICAgIDEyOiAxNCxcbiAgICAgICAgICAgICAgICAxMzogMTEsXG4gICAgICAgICAgICAgICAgMTQ6IDEyLFxuICAgICAgICAgICAgICAgIDE1OiAxNyxcbiAgICAgICAgICAgICAgICAxNjogMTgsXG4gICAgICAgICAgICAgICAgMTc6IDE1LFxuICAgICAgICAgICAgICAgIDE4OiAxNixcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDIyLFxuICAgICAgICAgICAgICAgIDIxOiAxOSxcbiAgICAgICAgICAgICAgICAyMjogMjAsXG4gICAgICAgICAgICAgICAgMjM6IDI1LFxuICAgICAgICAgICAgICAgIDI0OiAxLFxuICAgICAgICAgICAgICAgIDI1OiAyMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMyxcbiAgICAgICAgICAgICAgICAxOiA1LFxuICAgICAgICAgICAgICAgIDI6IDI0LFxuICAgICAgICAgICAgICAgIDM6IDAsXG4gICAgICAgICAgICAgICAgNDogNyxcbiAgICAgICAgICAgICAgICA1OiAxLFxuICAgICAgICAgICAgICAgIDY6IDksXG4gICAgICAgICAgICAgICAgNzogNCxcbiAgICAgICAgICAgICAgICA4OiAxMSxcbiAgICAgICAgICAgICAgICA5OiA2LFxuICAgICAgICAgICAgICAgIDEwOiAxMyxcbiAgICAgICAgICAgICAgICAxMTogOCxcbiAgICAgICAgICAgICAgICAxMjogMTUsXG4gICAgICAgICAgICAgICAgMTM6IDEwLFxuICAgICAgICAgICAgICAgIDE0OiAxNyxcbiAgICAgICAgICAgICAgICAxNTogMTIsXG4gICAgICAgICAgICAgICAgMTY6IDE5LFxuICAgICAgICAgICAgICAgIDE3OiAxNCxcbiAgICAgICAgICAgICAgICAxODogMjEsXG4gICAgICAgICAgICAgICAgMTk6IDE2LFxuICAgICAgICAgICAgICAgIDIwOiAyMyxcbiAgICAgICAgICAgICAgICAyMTogMTgsXG4gICAgICAgICAgICAgICAgMjI6IDI1LFxuICAgICAgICAgICAgICAgIDIzOiAyMCxcbiAgICAgICAgICAgICAgICAyNDogMixcbiAgICAgICAgICAgICAgICAyNTogMjIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDQsXG4gICAgICAgICAgICAgICAgMTogMjIsXG4gICAgICAgICAgICAgICAgMjogMjMsXG4gICAgICAgICAgICAgICAgMzogMjQsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDEwLFxuICAgICAgICAgICAgICAgIDc6IDExLFxuICAgICAgICAgICAgICAgIDg6IDEyLFxuICAgICAgICAgICAgICAgIDk6IDUsXG4gICAgICAgICAgICAgICAgMTA6IDYsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDIwLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiAxNixcbiAgICAgICAgICAgICAgICAyMTogMjUsXG4gICAgICAgICAgICAgICAgMjI6IDEsXG4gICAgICAgICAgICAgICAgMjM6IDIsXG4gICAgICAgICAgICAgICAgMjQ6IDMsXG4gICAgICAgICAgICAgICAgMjU6IDIxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDAsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxNSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDQsXG4gICAgICAgICAgICAgICAgMTA6IDE4LFxuICAgICAgICAgICAgICAgIDExOiAxMixcbiAgICAgICAgICAgICAgICAxMjogMTEsXG4gICAgICAgICAgICAgICAgMTM6IDE0LFxuICAgICAgICAgICAgICAgIDE0OiAxMyxcbiAgICAgICAgICAgICAgICAxNTogNyxcbiAgICAgICAgICAgICAgICAxNjogMjEsXG4gICAgICAgICAgICAgICAgMTc6IDE5LFxuICAgICAgICAgICAgICAgIDE4OiAxMCxcbiAgICAgICAgICAgICAgICAxOTogMTcsXG4gICAgICAgICAgICAgICAgMjA6IDI1LFxuICAgICAgICAgICAgICAgIDIxOiAxNixcbiAgICAgICAgICAgICAgICAyMjogMjQsXG4gICAgICAgICAgICAgICAgMjM6IDMsXG4gICAgICAgICAgICAgICAgMjQ6IDIyLFxuICAgICAgICAgICAgICAgIDI1OiAyMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogNixcbiAgICAgICAgICAgICAgICAxOiAyMCxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDksXG4gICAgICAgICAgICAgICAgNDogMTgsXG4gICAgICAgICAgICAgICAgNTogMixcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDE3LFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDEyLFxuICAgICAgICAgICAgICAgIDExOiAxNCxcbiAgICAgICAgICAgICAgICAxMjogMTAsXG4gICAgICAgICAgICAgICAgMTM6IDgsXG4gICAgICAgICAgICAgICAgMTQ6IDExLFxuICAgICAgICAgICAgICAgIDE1OiAyMSxcbiAgICAgICAgICAgICAgICAxNjogMjIsXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDQsXG4gICAgICAgICAgICAgICAgMTk6IDI1LFxuICAgICAgICAgICAgICAgIDIwOiAxLFxuICAgICAgICAgICAgICAgIDIxOiAxNSxcbiAgICAgICAgICAgICAgICAyMjogMTYsXG4gICAgICAgICAgICAgICAgMjM6IDI0LFxuICAgICAgICAgICAgICAgIDI0OiAyMyxcbiAgICAgICAgICAgICAgICAyNTogMTksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDcsXG4gICAgICAgICAgICAgICAgMTogMTAsXG4gICAgICAgICAgICAgICAgMjogOSxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAyMSxcbiAgICAgICAgICAgICAgICA1OiAxNSxcbiAgICAgICAgICAgICAgICA2OiAxMSxcbiAgICAgICAgICAgICAgICA3OiAwLFxuICAgICAgICAgICAgICAgIDg6IDE0LFxuICAgICAgICAgICAgICAgIDk6IDIsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDYsXG4gICAgICAgICAgICAgICAgMTI6IDIyLFxuICAgICAgICAgICAgICAgIDEzOiAyNSxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogNSxcbiAgICAgICAgICAgICAgICAxNjogMjMsXG4gICAgICAgICAgICAgICAgMTc6IDE4LFxuICAgICAgICAgICAgICAgIDE4OiAxNyxcbiAgICAgICAgICAgICAgICAxOTogMyxcbiAgICAgICAgICAgICAgICAyMDogMjQsXG4gICAgICAgICAgICAgICAgMjE6IDQsXG4gICAgICAgICAgICAgICAgMjI6IDEyLFxuICAgICAgICAgICAgICAgIDIzOiAxNixcbiAgICAgICAgICAgICAgICAyNDogMjAsXG4gICAgICAgICAgICAgICAgMjU6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDYsXG4gICAgICAgICAgICAgICAgMjogMTEsXG4gICAgICAgICAgICAgICAgMzogMTcsXG4gICAgICAgICAgICAgICAgNDogMjQsXG4gICAgICAgICAgICAgICAgNTogMjIsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAwLFxuICAgICAgICAgICAgICAgIDk6IDIwLFxuICAgICAgICAgICAgICAgIDEwOiAyNSxcbiAgICAgICAgICAgICAgICAxMTogMixcbiAgICAgICAgICAgICAgICAxMjogMTgsXG4gICAgICAgICAgICAgICAgMTM6IDE5LFxuICAgICAgICAgICAgICAgIDE0OiA3LFxuICAgICAgICAgICAgICAgIDE1OiAxNixcbiAgICAgICAgICAgICAgICAxNjogMTUsXG4gICAgICAgICAgICAgICAgMTc6IDMsXG4gICAgICAgICAgICAgICAgMTg6IDEyLFxuICAgICAgICAgICAgICAgIDE5OiAxMyxcbiAgICAgICAgICAgICAgICAyMDogOSxcbiAgICAgICAgICAgICAgICAyMTogMjMsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDIxLFxuICAgICAgICAgICAgICAgIDI0OiA0LFxuICAgICAgICAgICAgICAgIDI1OiAxMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogOSxcbiAgICAgICAgICAgICAgICAxOiAyMyxcbiAgICAgICAgICAgICAgICAyOiA2LFxuICAgICAgICAgICAgICAgIDM6IDIwLFxuICAgICAgICAgICAgICAgIDQ6IDI1LFxuICAgICAgICAgICAgICAgIDU6IDE5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogOCxcbiAgICAgICAgICAgICAgICA4OiA3LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE0LFxuICAgICAgICAgICAgICAgIDExOiAyMSxcbiAgICAgICAgICAgICAgICAxMjogMTcsXG4gICAgICAgICAgICAgICAgMTM6IDE1LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTMsXG4gICAgICAgICAgICAgICAgMTY6IDI0LFxuICAgICAgICAgICAgICAgIDE3OiAxMixcbiAgICAgICAgICAgICAgICAxODogMjIsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICAgICAgMjA6IDMsXG4gICAgICAgICAgICAgICAgMjE6IDExLFxuICAgICAgICAgICAgICAgIDIyOiAxOCxcbiAgICAgICAgICAgICAgICAyMzogMSxcbiAgICAgICAgICAgICAgICAyNDogMTYsXG4gICAgICAgICAgICAgICAgMjU6IDQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEwLFxuICAgICAgICAgICAgICAgIDE6IDEzLFxuICAgICAgICAgICAgICAgIDI6IDQsXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMixcbiAgICAgICAgICAgICAgICA1OiA2LFxuICAgICAgICAgICAgICAgIDY6IDUsXG4gICAgICAgICAgICAgICAgNzogMTIsXG4gICAgICAgICAgICAgICAgODogMTksXG4gICAgICAgICAgICAgICAgOTogMTQsXG4gICAgICAgICAgICAgICAgMTA6IDAsXG4gICAgICAgICAgICAgICAgMTE6IDIzLFxuICAgICAgICAgICAgICAgIDEyOiA3LFxuICAgICAgICAgICAgICAgIDEzOiAxLFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiAyMCxcbiAgICAgICAgICAgICAgICAxNjogMjUsXG4gICAgICAgICAgICAgICAgMTc6IDIyLFxuICAgICAgICAgICAgICAgIDE4OiAyNCxcbiAgICAgICAgICAgICAgICAxOTogOCxcbiAgICAgICAgICAgICAgICAyMDogMTUsXG4gICAgICAgICAgICAgICAgMjE6IDMsXG4gICAgICAgICAgICAgICAgMjI6IDE3LFxuICAgICAgICAgICAgICAgIDIzOiAxMSxcbiAgICAgICAgICAgICAgICAyNDogMTgsXG4gICAgICAgICAgICAgICAgMjU6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyNSxcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiA4LFxuICAgICAgICAgICAgICAgIDQ6IDE2LFxuICAgICAgICAgICAgICAgIDU6IDEwLFxuICAgICAgICAgICAgICAgIDY6IDE0LFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDMsXG4gICAgICAgICAgICAgICAgOTogMTIsXG4gICAgICAgICAgICAgICAgMTA6IDUsXG4gICAgICAgICAgICAgICAgMTE6IDAsXG4gICAgICAgICAgICAgICAgMTI6IDksXG4gICAgICAgICAgICAgICAgMTM6IDcsXG4gICAgICAgICAgICAgICAgMTQ6IDYsXG4gICAgICAgICAgICAgICAgMTU6IDE4LFxuICAgICAgICAgICAgICAgIDE2OiA0LFxuICAgICAgICAgICAgICAgIDE3OiAyMyxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDIyLFxuICAgICAgICAgICAgICAgIDIwOiAyLFxuICAgICAgICAgICAgICAgIDIxOiAyNCxcbiAgICAgICAgICAgICAgICAyMjogMTksXG4gICAgICAgICAgICAgICAgMjM6IDE3LFxuICAgICAgICAgICAgICAgIDI0OiAyMSxcbiAgICAgICAgICAgICAgICAyNTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTIsXG4gICAgICAgICAgICAgICAgMTogMTYsXG4gICAgICAgICAgICAgICAgMjogMTcsXG4gICAgICAgICAgICAgICAgMzogMTQsXG4gICAgICAgICAgICAgICAgNDogMTksXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiAxMyxcbiAgICAgICAgICAgICAgICA3OiA1LFxuICAgICAgICAgICAgICAgIDg6IDI0LFxuICAgICAgICAgICAgICAgIDk6IDEwLFxuICAgICAgICAgICAgICAgIDEwOiA5LFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogMCxcbiAgICAgICAgICAgICAgICAxMzogNixcbiAgICAgICAgICAgICAgICAxNDogMyxcbiAgICAgICAgICAgICAgICAxNTogMjUsXG4gICAgICAgICAgICAgICAgMTY6IDEsXG4gICAgICAgICAgICAgICAgMTc6IDIsXG4gICAgICAgICAgICAgICAgMTg6IDIzLFxuICAgICAgICAgICAgICAgIDE5OiA0LFxuICAgICAgICAgICAgICAgIDIwOiAxMSxcbiAgICAgICAgICAgICAgICAyMTogMjIsXG4gICAgICAgICAgICAgICAgMjI6IDIxLFxuICAgICAgICAgICAgICAgIDIzOiAxOCxcbiAgICAgICAgICAgICAgICAyNDogOCxcbiAgICAgICAgICAgICAgICAyNTogMTUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDEzLFxuICAgICAgICAgICAgICAgIDE6IDE3LFxuICAgICAgICAgICAgICAgIDI6IDE2LFxuICAgICAgICAgICAgICAgIDM6IDEwLFxuICAgICAgICAgICAgICAgIDQ6IDExLFxuICAgICAgICAgICAgICAgIDU6IDgsXG4gICAgICAgICAgICAgICAgNjogMTksXG4gICAgICAgICAgICAgICAgNzogMjUsXG4gICAgICAgICAgICAgICAgODogNSxcbiAgICAgICAgICAgICAgICA5OiAyNCxcbiAgICAgICAgICAgICAgICAxMDogMyxcbiAgICAgICAgICAgICAgICAxMTogNCxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDAsXG4gICAgICAgICAgICAgICAgMTQ6IDIxLFxuICAgICAgICAgICAgICAgIDE1OiAyMixcbiAgICAgICAgICAgICAgICAxNjogMixcbiAgICAgICAgICAgICAgICAxNzogMSxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDE4LFxuICAgICAgICAgICAgICAgIDIxOiAxNCxcbiAgICAgICAgICAgICAgICAyMjogMTUsXG4gICAgICAgICAgICAgICAgMjM6IDEyLFxuICAgICAgICAgICAgICAgIDI0OiA5LFxuICAgICAgICAgICAgICAgIDI1OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDEzLFxuICAgICAgICAgICAgICAgIDM6IDE4LFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDE2LFxuICAgICAgICAgICAgICAgIDY6IDE3LFxuICAgICAgICAgICAgICAgIDc6IDEsXG4gICAgICAgICAgICAgICAgODogMjIsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDI1LFxuICAgICAgICAgICAgICAgIDEyOiAyMCxcbiAgICAgICAgICAgICAgICAxMzogMixcbiAgICAgICAgICAgICAgICAxNDogMCxcbiAgICAgICAgICAgICAgICAxNTogMjMsXG4gICAgICAgICAgICAgICAgMTY6IDUsXG4gICAgICAgICAgICAgICAgMTc6IDYsXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDI0LFxuICAgICAgICAgICAgICAgIDIwOiAxMixcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogOCxcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICAgICAgMjQ6IDE5LFxuICAgICAgICAgICAgICAgIDI1OiAxMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTUsXG4gICAgICAgICAgICAgICAgMTogNCxcbiAgICAgICAgICAgICAgICAyOiA3LFxuICAgICAgICAgICAgICAgIDM6IDExLFxuICAgICAgICAgICAgICAgIDQ6IDEsXG4gICAgICAgICAgICAgICAgNTogMjUsXG4gICAgICAgICAgICAgICAgNjogMjQsXG4gICAgICAgICAgICAgICAgNzogMixcbiAgICAgICAgICAgICAgICA4OiAxNyxcbiAgICAgICAgICAgICAgICA5OiAyMixcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDE2LFxuICAgICAgICAgICAgICAgIDEzOiAxOCxcbiAgICAgICAgICAgICAgICAxNDogMjMsXG4gICAgICAgICAgICAgICAgMTU6IDAsXG4gICAgICAgICAgICAgICAgMTY6IDEyLFxuICAgICAgICAgICAgICAgIDE3OiA4LFxuICAgICAgICAgICAgICAgIDE4OiAxMyxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiAxMCxcbiAgICAgICAgICAgICAgICAyMjogOSxcbiAgICAgICAgICAgICAgICAyMzogMTQsXG4gICAgICAgICAgICAgICAgMjQ6IDYsXG4gICAgICAgICAgICAgICAgMjU6IDUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE2LFxuICAgICAgICAgICAgICAgIDE6IDIxLFxuICAgICAgICAgICAgICAgIDI6IDE0LFxuICAgICAgICAgICAgICAgIDM6IDYsXG4gICAgICAgICAgICAgICAgNDogOCxcbiAgICAgICAgICAgICAgICA1OiAxMSxcbiAgICAgICAgICAgICAgICA2OiAzLFxuICAgICAgICAgICAgICAgIDc6IDIyLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIwLFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxOSxcbiAgICAgICAgICAgICAgICAxMzogMjMsXG4gICAgICAgICAgICAgICAgMTQ6IDIsXG4gICAgICAgICAgICAgICAgMTU6IDI0LFxuICAgICAgICAgICAgICAgIDE2OiAwLFxuICAgICAgICAgICAgICAgIDE3OiA5LFxuICAgICAgICAgICAgICAgIDE4OiAyNSxcbiAgICAgICAgICAgICAgICAxOTogMTIsXG4gICAgICAgICAgICAgICAgMjA6IDEwLFxuICAgICAgICAgICAgICAgIDIxOiAxLFxuICAgICAgICAgICAgICAgIDIyOiA3LFxuICAgICAgICAgICAgICAgIDIzOiAxMyxcbiAgICAgICAgICAgICAgICAyNDogMTUsXG4gICAgICAgICAgICAgICAgMjU6IDE4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDIyLFxuICAgICAgICAgICAgICAgIDQ6IDIwLFxuICAgICAgICAgICAgICAgIDU6IDEzLFxuICAgICAgICAgICAgICAgIDY6IDI1LFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMTYsXG4gICAgICAgICAgICAgICAgMTA6IDcsXG4gICAgICAgICAgICAgICAgMTE6IDE4LFxuICAgICAgICAgICAgICAgIDEyOiAyMSxcbiAgICAgICAgICAgICAgICAxMzogNSxcbiAgICAgICAgICAgICAgICAxNDogMjQsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDksXG4gICAgICAgICAgICAgICAgMTc6IDAsXG4gICAgICAgICAgICAgICAgMTg6IDExLFxuICAgICAgICAgICAgICAgIDE5OiAyMyxcbiAgICAgICAgICAgICAgICAyMDogNCxcbiAgICAgICAgICAgICAgICAyMTogMTIsXG4gICAgICAgICAgICAgICAgMjI6IDMsXG4gICAgICAgICAgICAgICAgMjM6IDE5LFxuICAgICAgICAgICAgICAgIDI0OiAxNCxcbiAgICAgICAgICAgICAgICAyNTogNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMTgsXG4gICAgICAgICAgICAgICAgMTogOCxcbiAgICAgICAgICAgICAgICAyOiAyNSxcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxNCxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiAyMixcbiAgICAgICAgICAgICAgICA3OiAyMyxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDMsXG4gICAgICAgICAgICAgICAgMTM6IDIwLFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAxMSxcbiAgICAgICAgICAgICAgICAxNjogMTAsXG4gICAgICAgICAgICAgICAgMTc6IDI0LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiA5LFxuICAgICAgICAgICAgICAgIDIwOiAxMyxcbiAgICAgICAgICAgICAgICAyMTogNSxcbiAgICAgICAgICAgICAgICAyMjogNixcbiAgICAgICAgICAgICAgICAyMzogNyxcbiAgICAgICAgICAgICAgICAyNDogMTcsXG4gICAgICAgICAgICAgICAgMjU6IDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDE5LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDIyLFxuICAgICAgICAgICAgICAgIDM6IDQsXG4gICAgICAgICAgICAgICAgNDogMyxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAyMyxcbiAgICAgICAgICAgICAgICA3OiAyMSxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAxOCxcbiAgICAgICAgICAgICAgICAxMDogMTUsXG4gICAgICAgICAgICAgICAgMTE6IDEsXG4gICAgICAgICAgICAgICAgMTI6IDI0LFxuICAgICAgICAgICAgICAgIDEzOiAxNixcbiAgICAgICAgICAgICAgICAxNDogMjUsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogOSxcbiAgICAgICAgICAgICAgICAxOTogMCxcbiAgICAgICAgICAgICAgICAyMDogOCxcbiAgICAgICAgICAgICAgICAyMTogNyxcbiAgICAgICAgICAgICAgICAyMjogMixcbiAgICAgICAgICAgICAgICAyMzogNixcbiAgICAgICAgICAgICAgICAyNDogMTIsXG4gICAgICAgICAgICAgICAgMjU6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxOSxcbiAgICAgICAgICAgICAgICAzOiAxNSxcbiAgICAgICAgICAgICAgICA0OiAyMixcbiAgICAgICAgICAgICAgICA1OiAxNCxcbiAgICAgICAgICAgICAgICA2OiAyMSxcbiAgICAgICAgICAgICAgICA3OiAxNixcbiAgICAgICAgICAgICAgICA4OiAxOCxcbiAgICAgICAgICAgICAgICA5OiAyNSxcbiAgICAgICAgICAgICAgICAxMDogMjMsXG4gICAgICAgICAgICAgICAgMTE6IDE3LFxuICAgICAgICAgICAgICAgIDEyOiAxLFxuICAgICAgICAgICAgICAgIDEzOiAyNCxcbiAgICAgICAgICAgICAgICAxNDogNSxcbiAgICAgICAgICAgICAgICAxNTogMyxcbiAgICAgICAgICAgICAgICAxNjogNyxcbiAgICAgICAgICAgICAgICAxNzogMTEsXG4gICAgICAgICAgICAgICAgMTg6IDgsXG4gICAgICAgICAgICAgICAgMTk6IDIsXG4gICAgICAgICAgICAgICAgMjA6IDAsXG4gICAgICAgICAgICAgICAgMjE6IDYsXG4gICAgICAgICAgICAgICAgMjI6IDQsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgICAgIDI0OiAxMyxcbiAgICAgICAgICAgICAgICAyNTogOSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjEsXG4gICAgICAgICAgICAgICAgMTogMTksXG4gICAgICAgICAgICAgICAgMjogMTAsXG4gICAgICAgICAgICAgICAgMzogMTYsXG4gICAgICAgICAgICAgICAgNDogMTIsXG4gICAgICAgICAgICAgICAgNTogMjMsXG4gICAgICAgICAgICAgICAgNjogMTgsXG4gICAgICAgICAgICAgICAgNzogMjQsXG4gICAgICAgICAgICAgICAgODogMTUsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDIsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDIyLFxuICAgICAgICAgICAgICAgIDE0OiAyMCxcbiAgICAgICAgICAgICAgICAxNTogOCxcbiAgICAgICAgICAgICAgICAxNjogMyxcbiAgICAgICAgICAgICAgICAxNzogMjUsXG4gICAgICAgICAgICAgICAgMTg6IDYsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICAgICAgMjA6IDE0LFxuICAgICAgICAgICAgICAgIDIxOiAwLFxuICAgICAgICAgICAgICAgIDIyOiAxMyxcbiAgICAgICAgICAgICAgICAyMzogNSxcbiAgICAgICAgICAgICAgICAyNDogNyxcbiAgICAgICAgICAgICAgICAyNTogMTcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDIyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMTUsXG4gICAgICAgICAgICAgICAgMzogMSxcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAyMCxcbiAgICAgICAgICAgICAgICA2OiAxMixcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAyNSxcbiAgICAgICAgICAgICAgICA5OiAyMyxcbiAgICAgICAgICAgICAgICAxMDogMjQsXG4gICAgICAgICAgICAgICAgMTE6IDE5LFxuICAgICAgICAgICAgICAgIDEyOiA2LFxuICAgICAgICAgICAgICAgIDEzOiA0LFxuICAgICAgICAgICAgICAgIDE0OiAxNixcbiAgICAgICAgICAgICAgICAxNTogMixcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDIxLFxuICAgICAgICAgICAgICAgIDE4OiA3LFxuICAgICAgICAgICAgICAgIDE5OiAxMSxcbiAgICAgICAgICAgICAgICAyMDogNSxcbiAgICAgICAgICAgICAgICAyMTogMTcsXG4gICAgICAgICAgICAgICAgMjI6IDAsXG4gICAgICAgICAgICAgICAgMjM6IDksXG4gICAgICAgICAgICAgICAgMjQ6IDEwLFxuICAgICAgICAgICAgICAgIDI1OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxOCxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAyNSxcbiAgICAgICAgICAgICAgICA0OiAxNSxcbiAgICAgICAgICAgICAgICA1OiAyNCxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAyMCxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiAxMyxcbiAgICAgICAgICAgICAgICAxMDogMTcsXG4gICAgICAgICAgICAgICAgMTE6IDIyLFxuICAgICAgICAgICAgICAgIDEyOiAyLFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogMTAsXG4gICAgICAgICAgICAgICAgMTg6IDEsXG4gICAgICAgICAgICAgICAgMTk6IDE0LFxuICAgICAgICAgICAgICAgIDIwOiA3LFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiAxMSxcbiAgICAgICAgICAgICAgICAyMzogMCxcbiAgICAgICAgICAgICAgICAyNDogNSxcbiAgICAgICAgICAgICAgICAyNTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgMDogMjQsXG4gICAgICAgICAgICAgICAgMTogMTQsXG4gICAgICAgICAgICAgICAgMjogMjEsXG4gICAgICAgICAgICAgICAgMzogMTMsXG4gICAgICAgICAgICAgICAgNDogMTcsXG4gICAgICAgICAgICAgICAgNTogMTgsXG4gICAgICAgICAgICAgICAgNjogMjAsXG4gICAgICAgICAgICAgICAgNzogMTksXG4gICAgICAgICAgICAgICAgODogMjMsXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAxNixcbiAgICAgICAgICAgICAgICAxMjogMjUsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDksXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiA0LFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiA2LFxuICAgICAgICAgICAgICAgIDIxOiAyLFxuICAgICAgICAgICAgICAgIDIyOiAxMCxcbiAgICAgICAgICAgICAgICAyMzogOCxcbiAgICAgICAgICAgICAgICAyNDogMCxcbiAgICAgICAgICAgICAgICAyNTogMTIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIDA6IDI1LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogMTgsXG4gICAgICAgICAgICAgICAgMzogNyxcbiAgICAgICAgICAgICAgICA0OiAyMyxcbiAgICAgICAgICAgICAgICA1OiAxMixcbiAgICAgICAgICAgICAgICA2OiAxNSxcbiAgICAgICAgICAgICAgICA3OiAzLFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDEsXG4gICAgICAgICAgICAgICAgMTA6IDE5LFxuICAgICAgICAgICAgICAgIDExOiAyNCxcbiAgICAgICAgICAgICAgICAxMjogNSxcbiAgICAgICAgICAgICAgICAxMzogMjEsXG4gICAgICAgICAgICAgICAgMTQ6IDIyLFxuICAgICAgICAgICAgICAgIDE1OiA2LFxuICAgICAgICAgICAgICAgIDE2OiA4LFxuICAgICAgICAgICAgICAgIDE3OiAyMCxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogMTAsXG4gICAgICAgICAgICAgICAgMjA6IDE3LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogMTQsXG4gICAgICAgICAgICAgICAgMjM6IDQsXG4gICAgICAgICAgICAgICAgMjQ6IDExLFxuICAgICAgICAgICAgICAgIDI1OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgMjg6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxLFxuICAgICAgICAgICAgICAgIDE6IDAsXG4gICAgICAgICAgICAgICAgMjogMyxcbiAgICAgICAgICAgICAgICAzOiAyLFxuICAgICAgICAgICAgICAgIDQ6IDUsXG4gICAgICAgICAgICAgICAgNTogNCxcbiAgICAgICAgICAgICAgICA2OiA3LFxuICAgICAgICAgICAgICAgIDc6IDYsXG4gICAgICAgICAgICAgICAgODogOSxcbiAgICAgICAgICAgICAgICA5OiA4LFxuICAgICAgICAgICAgICAgIDEwOiAxMSxcbiAgICAgICAgICAgICAgICAxMTogMTAsXG4gICAgICAgICAgICAgICAgMTI6IDEzLFxuICAgICAgICAgICAgICAgIDEzOiAxMixcbiAgICAgICAgICAgICAgICAxNDogMTUsXG4gICAgICAgICAgICAgICAgMTU6IDE0LFxuICAgICAgICAgICAgICAgIDE2OiAxNyxcbiAgICAgICAgICAgICAgICAxNzogMTYsXG4gICAgICAgICAgICAgICAgMTg6IDE5LFxuICAgICAgICAgICAgICAgIDE5OiAxOCxcbiAgICAgICAgICAgICAgICAyMDogMjEsXG4gICAgICAgICAgICAgICAgMjE6IDIwLFxuICAgICAgICAgICAgICAgIDIyOiAyMyxcbiAgICAgICAgICAgICAgICAyMzogMjIsXG4gICAgICAgICAgICAgICAgMjQ6IDI1LFxuICAgICAgICAgICAgICAgIDI1OiAyNCxcbiAgICAgICAgICAgICAgICAyNjogMjcsXG4gICAgICAgICAgICAgICAgMjc6IDI2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyLFxuICAgICAgICAgICAgICAgIDE6IDMsXG4gICAgICAgICAgICAgICAgMjogMCxcbiAgICAgICAgICAgICAgICAzOiAxLFxuICAgICAgICAgICAgICAgIDQ6IDYsXG4gICAgICAgICAgICAgICAgNTogNyxcbiAgICAgICAgICAgICAgICA2OiA0LFxuICAgICAgICAgICAgICAgIDc6IDUsXG4gICAgICAgICAgICAgICAgODogMTAsXG4gICAgICAgICAgICAgICAgOTogMTEsXG4gICAgICAgICAgICAgICAgMTA6IDgsXG4gICAgICAgICAgICAgICAgMTE6IDksXG4gICAgICAgICAgICAgICAgMTI6IDE0LFxuICAgICAgICAgICAgICAgIDEzOiAxNSxcbiAgICAgICAgICAgICAgICAxNDogMTIsXG4gICAgICAgICAgICAgICAgMTU6IDEzLFxuICAgICAgICAgICAgICAgIDE2OiAxOCxcbiAgICAgICAgICAgICAgICAxNzogMTksXG4gICAgICAgICAgICAgICAgMTg6IDE2LFxuICAgICAgICAgICAgICAgIDE5OiAxNyxcbiAgICAgICAgICAgICAgICAyMDogMjIsXG4gICAgICAgICAgICAgICAgMjE6IDIzLFxuICAgICAgICAgICAgICAgIDIyOiAyMCxcbiAgICAgICAgICAgICAgICAyMzogMjEsXG4gICAgICAgICAgICAgICAgMjQ6IDI2LFxuICAgICAgICAgICAgICAgIDI1OiAyNyxcbiAgICAgICAgICAgICAgICAyNjogMjQsXG4gICAgICAgICAgICAgICAgMjc6IDI1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAzLFxuICAgICAgICAgICAgICAgIDE6IDIsXG4gICAgICAgICAgICAgICAgMjogMSxcbiAgICAgICAgICAgICAgICAzOiAwLFxuICAgICAgICAgICAgICAgIDQ6IDcsXG4gICAgICAgICAgICAgICAgNTogNixcbiAgICAgICAgICAgICAgICA2OiA1LFxuICAgICAgICAgICAgICAgIDc6IDQsXG4gICAgICAgICAgICAgICAgODogMTEsXG4gICAgICAgICAgICAgICAgOTogMTAsXG4gICAgICAgICAgICAgICAgMTA6IDksXG4gICAgICAgICAgICAgICAgMTE6IDgsXG4gICAgICAgICAgICAgICAgMTI6IDE1LFxuICAgICAgICAgICAgICAgIDEzOiAxNCxcbiAgICAgICAgICAgICAgICAxNDogMTMsXG4gICAgICAgICAgICAgICAgMTU6IDEyLFxuICAgICAgICAgICAgICAgIDE2OiAxOSxcbiAgICAgICAgICAgICAgICAxNzogMTgsXG4gICAgICAgICAgICAgICAgMTg6IDE3LFxuICAgICAgICAgICAgICAgIDE5OiAxNixcbiAgICAgICAgICAgICAgICAyMDogMjMsXG4gICAgICAgICAgICAgICAgMjE6IDIyLFxuICAgICAgICAgICAgICAgIDIyOiAyMSxcbiAgICAgICAgICAgICAgICAyMzogMjAsXG4gICAgICAgICAgICAgICAgMjQ6IDI3LFxuICAgICAgICAgICAgICAgIDI1OiAyNixcbiAgICAgICAgICAgICAgICAyNjogMjUsXG4gICAgICAgICAgICAgICAgMjc6IDI0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA0LFxuICAgICAgICAgICAgICAgIDE6IDI0LFxuICAgICAgICAgICAgICAgIDI6IDYsXG4gICAgICAgICAgICAgICAgMzogMjYsXG4gICAgICAgICAgICAgICAgNDogMCxcbiAgICAgICAgICAgICAgICA1OiA5LFxuICAgICAgICAgICAgICAgIDY6IDIsXG4gICAgICAgICAgICAgICAgNzogMTEsXG4gICAgICAgICAgICAgICAgODogMTIsXG4gICAgICAgICAgICAgICAgOTogNSxcbiAgICAgICAgICAgICAgICAxMDogMTQsXG4gICAgICAgICAgICAgICAgMTE6IDcsXG4gICAgICAgICAgICAgICAgMTI6IDgsXG4gICAgICAgICAgICAgICAgMTM6IDE3LFxuICAgICAgICAgICAgICAgIDE0OiAxMCxcbiAgICAgICAgICAgICAgICAxNTogMTksXG4gICAgICAgICAgICAgICAgMTY6IDIwLFxuICAgICAgICAgICAgICAgIDE3OiAxMyxcbiAgICAgICAgICAgICAgICAxODogMjIsXG4gICAgICAgICAgICAgICAgMTk6IDE1LFxuICAgICAgICAgICAgICAgIDIwOiAxNixcbiAgICAgICAgICAgICAgICAyMTogMjUsXG4gICAgICAgICAgICAgICAgMjI6IDE4LFxuICAgICAgICAgICAgICAgIDIzOiAyNyxcbiAgICAgICAgICAgICAgICAyNDogMSxcbiAgICAgICAgICAgICAgICAyNTogMjEsXG4gICAgICAgICAgICAgICAgMjY6IDMsXG4gICAgICAgICAgICAgICAgMjc6IDIzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA1LFxuICAgICAgICAgICAgICAgIDE6IDQsXG4gICAgICAgICAgICAgICAgMjogMjQsXG4gICAgICAgICAgICAgICAgMzogMjUsXG4gICAgICAgICAgICAgICAgNDogMSxcbiAgICAgICAgICAgICAgICA1OiAwLFxuICAgICAgICAgICAgICAgIDY6IDExLFxuICAgICAgICAgICAgICAgIDc6IDEwLFxuICAgICAgICAgICAgICAgIDg6IDEzLFxuICAgICAgICAgICAgICAgIDk6IDEyLFxuICAgICAgICAgICAgICAgIDEwOiA3LFxuICAgICAgICAgICAgICAgIDExOiA2LFxuICAgICAgICAgICAgICAgIDEyOiA5LFxuICAgICAgICAgICAgICAgIDEzOiA4LFxuICAgICAgICAgICAgICAgIDE0OiAxOSxcbiAgICAgICAgICAgICAgICAxNTogMTgsXG4gICAgICAgICAgICAgICAgMTY6IDIxLFxuICAgICAgICAgICAgICAgIDE3OiAyMCxcbiAgICAgICAgICAgICAgICAxODogMTUsXG4gICAgICAgICAgICAgICAgMTk6IDE0LFxuICAgICAgICAgICAgICAgIDIwOiAxNyxcbiAgICAgICAgICAgICAgICAyMTogMTYsXG4gICAgICAgICAgICAgICAgMjI6IDI3LFxuICAgICAgICAgICAgICAgIDIzOiAyNixcbiAgICAgICAgICAgICAgICAyNDogMixcbiAgICAgICAgICAgICAgICAyNTogMyxcbiAgICAgICAgICAgICAgICAyNjogMjMsXG4gICAgICAgICAgICAgICAgMjc6IDIyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA2LFxuICAgICAgICAgICAgICAgIDE6IDUsXG4gICAgICAgICAgICAgICAgMjogMjYsXG4gICAgICAgICAgICAgICAgMzogMjQsXG4gICAgICAgICAgICAgICAgNDogMTEsXG4gICAgICAgICAgICAgICAgNTogMSxcbiAgICAgICAgICAgICAgICA2OiAwLFxuICAgICAgICAgICAgICAgIDc6IDksXG4gICAgICAgICAgICAgICAgODogMTQsXG4gICAgICAgICAgICAgICAgOTogNyxcbiAgICAgICAgICAgICAgICAxMDogMTIsXG4gICAgICAgICAgICAgICAgMTE6IDQsXG4gICAgICAgICAgICAgICAgMTI6IDEwLFxuICAgICAgICAgICAgICAgIDEzOiAxOSxcbiAgICAgICAgICAgICAgICAxNDogOCxcbiAgICAgICAgICAgICAgICAxNTogMTcsXG4gICAgICAgICAgICAgICAgMTY6IDIyLFxuICAgICAgICAgICAgICAgIDE3OiAxNSxcbiAgICAgICAgICAgICAgICAxODogMjAsXG4gICAgICAgICAgICAgICAgMTk6IDEzLFxuICAgICAgICAgICAgICAgIDIwOiAxOCxcbiAgICAgICAgICAgICAgICAyMTogMjcsXG4gICAgICAgICAgICAgICAgMjI6IDE2LFxuICAgICAgICAgICAgICAgIDIzOiAyNSxcbiAgICAgICAgICAgICAgICAyNDogMyxcbiAgICAgICAgICAgICAgICAyNTogMjMsXG4gICAgICAgICAgICAgICAgMjY6IDIsXG4gICAgICAgICAgICAgICAgMjc6IDIxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA3LFxuICAgICAgICAgICAgICAgIDE6IDExLFxuICAgICAgICAgICAgICAgIDI6IDksXG4gICAgICAgICAgICAgICAgMzogMjEsXG4gICAgICAgICAgICAgICAgNDogMjQsXG4gICAgICAgICAgICAgICAgNTogMTQsXG4gICAgICAgICAgICAgICAgNjogMTcsXG4gICAgICAgICAgICAgICAgNzogMCxcbiAgICAgICAgICAgICAgICA4OiAxNSxcbiAgICAgICAgICAgICAgICA5OiAyLFxuICAgICAgICAgICAgICAgIDEwOiAyNyxcbiAgICAgICAgICAgICAgICAxMTogMSxcbiAgICAgICAgICAgICAgICAxMjogMTksXG4gICAgICAgICAgICAgICAgMTM6IDE4LFxuICAgICAgICAgICAgICAgIDE0OiA1LFxuICAgICAgICAgICAgICAgIDE1OiA4LFxuICAgICAgICAgICAgICAgIDE2OiAyMyxcbiAgICAgICAgICAgICAgICAxNzogNixcbiAgICAgICAgICAgICAgICAxODogMTMsXG4gICAgICAgICAgICAgICAgMTk6IDEyLFxuICAgICAgICAgICAgICAgIDIwOiAyNSxcbiAgICAgICAgICAgICAgICAyMTogMyxcbiAgICAgICAgICAgICAgICAyMjogMjYsXG4gICAgICAgICAgICAgICAgMjM6IDE2LFxuICAgICAgICAgICAgICAgIDI0OiA0LFxuICAgICAgICAgICAgICAgIDI1OiAyMCxcbiAgICAgICAgICAgICAgICAyNjogMjIsXG4gICAgICAgICAgICAgICAgMjc6IDEwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA4LFxuICAgICAgICAgICAgICAgIDE6IDksXG4gICAgICAgICAgICAgICAgMjogNyxcbiAgICAgICAgICAgICAgICAzOiAyMyxcbiAgICAgICAgICAgICAgICA0OiAyNSxcbiAgICAgICAgICAgICAgICA1OiAxMCxcbiAgICAgICAgICAgICAgICA2OiAyNixcbiAgICAgICAgICAgICAgICA3OiAyLFxuICAgICAgICAgICAgICAgIDg6IDAsXG4gICAgICAgICAgICAgICAgOTogMSxcbiAgICAgICAgICAgICAgICAxMDogNSxcbiAgICAgICAgICAgICAgICAxMTogMTQsXG4gICAgICAgICAgICAgICAgMTI6IDE3LFxuICAgICAgICAgICAgICAgIDEzOiAyMCxcbiAgICAgICAgICAgICAgICAxNDogMTEsXG4gICAgICAgICAgICAgICAgMTU6IDIxLFxuICAgICAgICAgICAgICAgIDE2OiAyNCxcbiAgICAgICAgICAgICAgICAxNzogMTIsXG4gICAgICAgICAgICAgICAgMTg6IDI3LFxuICAgICAgICAgICAgICAgIDE5OiAyMixcbiAgICAgICAgICAgICAgICAyMDogMTMsXG4gICAgICAgICAgICAgICAgMjE6IDE1LFxuICAgICAgICAgICAgICAgIDIyOiAxOSxcbiAgICAgICAgICAgICAgICAyMzogMyxcbiAgICAgICAgICAgICAgICAyNDogMTYsXG4gICAgICAgICAgICAgICAgMjU6IDQsXG4gICAgICAgICAgICAgICAgMjY6IDYsXG4gICAgICAgICAgICAgICAgMjc6IDE4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiA5LFxuICAgICAgICAgICAgICAgIDE6IDIyLFxuICAgICAgICAgICAgICAgIDI6IDE3LFxuICAgICAgICAgICAgICAgIDM6IDE0LFxuICAgICAgICAgICAgICAgIDQ6IDI3LFxuICAgICAgICAgICAgICAgIDU6IDExLFxuICAgICAgICAgICAgICAgIDY6IDI1LFxuICAgICAgICAgICAgICAgIDc6IDIwLFxuICAgICAgICAgICAgICAgIDg6IDE5LFxuICAgICAgICAgICAgICAgIDk6IDAsXG4gICAgICAgICAgICAgICAgMTA6IDE1LFxuICAgICAgICAgICAgICAgIDExOiA1LFxuICAgICAgICAgICAgICAgIDEyOiAxOCxcbiAgICAgICAgICAgICAgICAxMzogMTYsXG4gICAgICAgICAgICAgICAgMTQ6IDMsXG4gICAgICAgICAgICAgICAgMTU6IDEwLFxuICAgICAgICAgICAgICAgIDE2OiAxMyxcbiAgICAgICAgICAgICAgICAxNzogMixcbiAgICAgICAgICAgICAgICAxODogMTIsXG4gICAgICAgICAgICAgICAgMTk6IDgsXG4gICAgICAgICAgICAgICAgMjA6IDcsXG4gICAgICAgICAgICAgICAgMjE6IDI2LFxuICAgICAgICAgICAgICAgIDIyOiAxLFxuICAgICAgICAgICAgICAgIDIzOiAyNCxcbiAgICAgICAgICAgICAgICAyNDogMjMsXG4gICAgICAgICAgICAgICAgMjU6IDYsXG4gICAgICAgICAgICAgICAgMjY6IDIxLFxuICAgICAgICAgICAgICAgIDI3OiA0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMCxcbiAgICAgICAgICAgICAgICAxOiAxOCxcbiAgICAgICAgICAgICAgICAyOiAxMixcbiAgICAgICAgICAgICAgICAzOiAxNixcbiAgICAgICAgICAgICAgICA0OiAxOSxcbiAgICAgICAgICAgICAgICA1OiAyNixcbiAgICAgICAgICAgICAgICA2OiAyNCxcbiAgICAgICAgICAgICAgICA3OiAxNyxcbiAgICAgICAgICAgICAgICA4OiAyMixcbiAgICAgICAgICAgICAgICA5OiAyNSxcbiAgICAgICAgICAgICAgICAxMDogMCxcbiAgICAgICAgICAgICAgICAxMTogMTUsXG4gICAgICAgICAgICAgICAgMTI6IDIsXG4gICAgICAgICAgICAgICAgMTM6IDIxLFxuICAgICAgICAgICAgICAgIDE0OiAyMyxcbiAgICAgICAgICAgICAgICAxNTogMTEsXG4gICAgICAgICAgICAgICAgMTY6IDMsXG4gICAgICAgICAgICAgICAgMTc6IDcsXG4gICAgICAgICAgICAgICAgMTg6IDEsXG4gICAgICAgICAgICAgICAgMTk6IDQsXG4gICAgICAgICAgICAgICAgMjA6IDI3LFxuICAgICAgICAgICAgICAgIDIxOiAxMyxcbiAgICAgICAgICAgICAgICAyMjogOCxcbiAgICAgICAgICAgICAgICAyMzogMTQsXG4gICAgICAgICAgICAgICAgMjQ6IDYsXG4gICAgICAgICAgICAgICAgMjU6IDksXG4gICAgICAgICAgICAgICAgMjY6IDUsXG4gICAgICAgICAgICAgICAgMjc6IDIwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMSxcbiAgICAgICAgICAgICAgICAxOiAyMyxcbiAgICAgICAgICAgICAgICAyOiA1LFxuICAgICAgICAgICAgICAgIDM6IDE1LFxuICAgICAgICAgICAgICAgIDQ6IDIxLFxuICAgICAgICAgICAgICAgIDU6IDIsXG4gICAgICAgICAgICAgICAgNjogOCxcbiAgICAgICAgICAgICAgICA3OiAxOSxcbiAgICAgICAgICAgICAgICA4OiA2LFxuICAgICAgICAgICAgICAgIDk6IDE0LFxuICAgICAgICAgICAgICAgIDEwOiAyMCxcbiAgICAgICAgICAgICAgICAxMTogMCxcbiAgICAgICAgICAgICAgICAxMjogMTYsXG4gICAgICAgICAgICAgICAgMTM6IDI3LFxuICAgICAgICAgICAgICAgIDE0OiA5LFxuICAgICAgICAgICAgICAgIDE1OiAzLFxuICAgICAgICAgICAgICAgIDE2OiAxMixcbiAgICAgICAgICAgICAgICAxNzogMjQsXG4gICAgICAgICAgICAgICAgMTg6IDI2LFxuICAgICAgICAgICAgICAgIDE5OiA3LFxuICAgICAgICAgICAgICAgIDIwOiAxMCxcbiAgICAgICAgICAgICAgICAyMTogNCxcbiAgICAgICAgICAgICAgICAyMjogMjUsXG4gICAgICAgICAgICAgICAgMjM6IDEsXG4gICAgICAgICAgICAgICAgMjQ6IDE3LFxuICAgICAgICAgICAgICAgIDI1OiAyMixcbiAgICAgICAgICAgICAgICAyNjogMTgsXG4gICAgICAgICAgICAgICAgMjc6IDEzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMixcbiAgICAgICAgICAgICAgICAxOiAxNCxcbiAgICAgICAgICAgICAgICAyOiAyMSxcbiAgICAgICAgICAgICAgICAzOiAyMixcbiAgICAgICAgICAgICAgICA0OiA5LFxuICAgICAgICAgICAgICAgIDU6IDE1LFxuICAgICAgICAgICAgICAgIDY6IDEzLFxuICAgICAgICAgICAgICAgIDc6IDgsXG4gICAgICAgICAgICAgICAgODogNyxcbiAgICAgICAgICAgICAgICA5OiA0LFxuICAgICAgICAgICAgICAgIDEwOiAxOSxcbiAgICAgICAgICAgICAgICAxMTogMjUsXG4gICAgICAgICAgICAgICAgMTI6IDAsXG4gICAgICAgICAgICAgICAgMTM6IDYsXG4gICAgICAgICAgICAgICAgMTQ6IDEsXG4gICAgICAgICAgICAgICAgMTU6IDUsXG4gICAgICAgICAgICAgICAgMTY6IDI2LFxuICAgICAgICAgICAgICAgIDE3OiAyNyxcbiAgICAgICAgICAgICAgICAxODogMjMsXG4gICAgICAgICAgICAgICAgMTk6IDEwLFxuICAgICAgICAgICAgICAgIDIwOiAyNCxcbiAgICAgICAgICAgICAgICAyMTogMixcbiAgICAgICAgICAgICAgICAyMjogMyxcbiAgICAgICAgICAgICAgICAyMzogMTgsXG4gICAgICAgICAgICAgICAgMjQ6IDIwLFxuICAgICAgICAgICAgICAgIDI1OiAxMSxcbiAgICAgICAgICAgICAgICAyNjogMTYsXG4gICAgICAgICAgICAgICAgMjc6IDE3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxMyxcbiAgICAgICAgICAgICAgICAxOiAyNSxcbiAgICAgICAgICAgICAgICAyOiAxOSxcbiAgICAgICAgICAgICAgICAzOiA5LFxuICAgICAgICAgICAgICAgIDQ6IDEwLFxuICAgICAgICAgICAgICAgIDU6IDEyLFxuICAgICAgICAgICAgICAgIDY6IDE1LFxuICAgICAgICAgICAgICAgIDc6IDIxLFxuICAgICAgICAgICAgICAgIDg6IDI2LFxuICAgICAgICAgICAgICAgIDk6IDMsXG4gICAgICAgICAgICAgICAgMTA6IDQsXG4gICAgICAgICAgICAgICAgMTE6IDE4LFxuICAgICAgICAgICAgICAgIDEyOiA1LFxuICAgICAgICAgICAgICAgIDEzOiAwLFxuICAgICAgICAgICAgICAgIDE0OiAyMCxcbiAgICAgICAgICAgICAgICAxNTogNixcbiAgICAgICAgICAgICAgICAxNjogMjcsXG4gICAgICAgICAgICAgICAgMTc6IDIzLFxuICAgICAgICAgICAgICAgIDE4OiAxMSxcbiAgICAgICAgICAgICAgICAxOTogMixcbiAgICAgICAgICAgICAgICAyMDogMTQsXG4gICAgICAgICAgICAgICAgMjE6IDcsXG4gICAgICAgICAgICAgICAgMjI6IDI0LFxuICAgICAgICAgICAgICAgIDIzOiAxNyxcbiAgICAgICAgICAgICAgICAyNDogMjIsXG4gICAgICAgICAgICAgICAgMjU6IDEsXG4gICAgICAgICAgICAgICAgMjY6IDgsXG4gICAgICAgICAgICAgICAgMjc6IDE2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNCxcbiAgICAgICAgICAgICAgICAxOiAyMSxcbiAgICAgICAgICAgICAgICAyOiAxNSxcbiAgICAgICAgICAgICAgICAzOiA2LFxuICAgICAgICAgICAgICAgIDQ6IDE4LFxuICAgICAgICAgICAgICAgIDU6IDIzLFxuICAgICAgICAgICAgICAgIDY6IDMsXG4gICAgICAgICAgICAgICAgNzogMjIsXG4gICAgICAgICAgICAgICAgODogMTcsXG4gICAgICAgICAgICAgICAgOTogMjQsXG4gICAgICAgICAgICAgICAgMTA6IDEzLFxuICAgICAgICAgICAgICAgIDExOiAyNixcbiAgICAgICAgICAgICAgICAxMjogMjAsXG4gICAgICAgICAgICAgICAgMTM6IDEwLFxuICAgICAgICAgICAgICAgIDE0OiAwLFxuICAgICAgICAgICAgICAgIDE1OiAyLFxuICAgICAgICAgICAgICAgIDE2OiAyNSxcbiAgICAgICAgICAgICAgICAxNzogOCxcbiAgICAgICAgICAgICAgICAxODogNCxcbiAgICAgICAgICAgICAgICAxOTogMjcsXG4gICAgICAgICAgICAgICAgMjA6IDEyLFxuICAgICAgICAgICAgICAgIDIxOiAxLFxuICAgICAgICAgICAgICAgIDIyOiA3LFxuICAgICAgICAgICAgICAgIDIzOiA1LFxuICAgICAgICAgICAgICAgIDI0OiA5LFxuICAgICAgICAgICAgICAgIDI1OiAxNixcbiAgICAgICAgICAgICAgICAyNjogMTEsXG4gICAgICAgICAgICAgICAgMjc6IDE5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNSxcbiAgICAgICAgICAgICAgICAxOiAxNixcbiAgICAgICAgICAgICAgICAyOiAxMyxcbiAgICAgICAgICAgICAgICAzOiAxMSxcbiAgICAgICAgICAgICAgICA0OiAyMCxcbiAgICAgICAgICAgICAgICA1OiAxNyxcbiAgICAgICAgICAgICAgICA2OiAxOSxcbiAgICAgICAgICAgICAgICA3OiAyNixcbiAgICAgICAgICAgICAgICA4OiAyMyxcbiAgICAgICAgICAgICAgICA5OiAyNyxcbiAgICAgICAgICAgICAgICAxMDogMjUsXG4gICAgICAgICAgICAgICAgMTE6IDMsXG4gICAgICAgICAgICAgICAgMTI6IDIyLFxuICAgICAgICAgICAgICAgIDEzOiAyLFxuICAgICAgICAgICAgICAgIDE0OiAxOCxcbiAgICAgICAgICAgICAgICAxNTogMCxcbiAgICAgICAgICAgICAgICAxNjogMSxcbiAgICAgICAgICAgICAgICAxNzogNSxcbiAgICAgICAgICAgICAgICAxODogMTQsXG4gICAgICAgICAgICAgICAgMTk6IDYsXG4gICAgICAgICAgICAgICAgMjA6IDQsXG4gICAgICAgICAgICAgICAgMjE6IDI0LFxuICAgICAgICAgICAgICAgIDIyOiAxMixcbiAgICAgICAgICAgICAgICAyMzogOCxcbiAgICAgICAgICAgICAgICAyNDogMjEsXG4gICAgICAgICAgICAgICAgMjU6IDEwLFxuICAgICAgICAgICAgICAgIDI2OiA3LFxuICAgICAgICAgICAgICAgIDI3OiA5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNixcbiAgICAgICAgICAgICAgICAxOiAyNixcbiAgICAgICAgICAgICAgICAyOiA0LFxuICAgICAgICAgICAgICAgIDM6IDIwLFxuICAgICAgICAgICAgICAgIDQ6IDIsXG4gICAgICAgICAgICAgICAgNTogMjUsXG4gICAgICAgICAgICAgICAgNjogMTQsXG4gICAgICAgICAgICAgICAgNzogMjQsXG4gICAgICAgICAgICAgICAgODogMTgsXG4gICAgICAgICAgICAgICAgOTogMTcsXG4gICAgICAgICAgICAgICAgMTA6IDIyLFxuICAgICAgICAgICAgICAgIDExOiAxMyxcbiAgICAgICAgICAgICAgICAxMjogMjMsXG4gICAgICAgICAgICAgICAgMTM6IDExLFxuICAgICAgICAgICAgICAgIDE0OiA2LFxuICAgICAgICAgICAgICAgIDE1OiAyNyxcbiAgICAgICAgICAgICAgICAxNjogMCxcbiAgICAgICAgICAgICAgICAxNzogOSxcbiAgICAgICAgICAgICAgICAxODogOCxcbiAgICAgICAgICAgICAgICAxOTogMjEsXG4gICAgICAgICAgICAgICAgMjA6IDMsXG4gICAgICAgICAgICAgICAgMjE6IDE5LFxuICAgICAgICAgICAgICAgIDIyOiAxMCxcbiAgICAgICAgICAgICAgICAyMzogMTIsXG4gICAgICAgICAgICAgICAgMjQ6IDcsXG4gICAgICAgICAgICAgICAgMjU6IDUsXG4gICAgICAgICAgICAgICAgMjY6IDEsXG4gICAgICAgICAgICAgICAgMjc6IDE1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxNyxcbiAgICAgICAgICAgICAgICAxOiAxOSxcbiAgICAgICAgICAgICAgICAyOiAxMSxcbiAgICAgICAgICAgICAgICAzOiAxOCxcbiAgICAgICAgICAgICAgICA0OiAxNixcbiAgICAgICAgICAgICAgICA1OiAyNCxcbiAgICAgICAgICAgICAgICA2OiAyMCxcbiAgICAgICAgICAgICAgICA3OiAxNCxcbiAgICAgICAgICAgICAgICA4OiAyNSxcbiAgICAgICAgICAgICAgICA5OiAyMyxcbiAgICAgICAgICAgICAgICAxMDogMjEsXG4gICAgICAgICAgICAgICAgMTE6IDIsXG4gICAgICAgICAgICAgICAgMTI6IDI3LFxuICAgICAgICAgICAgICAgIDEzOiAyMixcbiAgICAgICAgICAgICAgICAxNDogNyxcbiAgICAgICAgICAgICAgICAxNTogMjYsXG4gICAgICAgICAgICAgICAgMTY6IDQsXG4gICAgICAgICAgICAgICAgMTc6IDAsXG4gICAgICAgICAgICAgICAgMTg6IDMsXG4gICAgICAgICAgICAgICAgMTk6IDEsXG4gICAgICAgICAgICAgICAgMjA6IDYsXG4gICAgICAgICAgICAgICAgMjE6IDEwLFxuICAgICAgICAgICAgICAgIDIyOiAxMyxcbiAgICAgICAgICAgICAgICAyMzogOSxcbiAgICAgICAgICAgICAgICAyNDogNSxcbiAgICAgICAgICAgICAgICAyNTogOCxcbiAgICAgICAgICAgICAgICAyNjogMTUsXG4gICAgICAgICAgICAgICAgMjc6IDEyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOCxcbiAgICAgICAgICAgICAgICAxOiAxNSxcbiAgICAgICAgICAgICAgICAyOiAyMixcbiAgICAgICAgICAgICAgICAzOiAxMixcbiAgICAgICAgICAgICAgICA0OiAxMyxcbiAgICAgICAgICAgICAgICA1OiAyMSxcbiAgICAgICAgICAgICAgICA2OiA5LFxuICAgICAgICAgICAgICAgIDc6IDI1LFxuICAgICAgICAgICAgICAgIDg6IDE2LFxuICAgICAgICAgICAgICAgIDk6IDYsXG4gICAgICAgICAgICAgICAgMTA6IDIzLFxuICAgICAgICAgICAgICAgIDExOiAyMCxcbiAgICAgICAgICAgICAgICAxMjogMyxcbiAgICAgICAgICAgICAgICAxMzogNCxcbiAgICAgICAgICAgICAgICAxNDogMjcsXG4gICAgICAgICAgICAgICAgMTU6IDEsXG4gICAgICAgICAgICAgICAgMTY6IDgsXG4gICAgICAgICAgICAgICAgMTc6IDI2LFxuICAgICAgICAgICAgICAgIDE4OiAwLFxuICAgICAgICAgICAgICAgIDE5OiAyNCxcbiAgICAgICAgICAgICAgICAyMDogMTEsXG4gICAgICAgICAgICAgICAgMjE6IDUsXG4gICAgICAgICAgICAgICAgMjI6IDIsXG4gICAgICAgICAgICAgICAgMjM6IDEwLFxuICAgICAgICAgICAgICAgIDI0OiAxOSxcbiAgICAgICAgICAgICAgICAyNTogNyxcbiAgICAgICAgICAgICAgICAyNjogMTcsXG4gICAgICAgICAgICAgICAgMjc6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAxOSxcbiAgICAgICAgICAgICAgICAxOiA3LFxuICAgICAgICAgICAgICAgIDI6IDIzLFxuICAgICAgICAgICAgICAgIDM6IDUsXG4gICAgICAgICAgICAgICAgNDogMTUsXG4gICAgICAgICAgICAgICAgNTogMyxcbiAgICAgICAgICAgICAgICA2OiAxOCxcbiAgICAgICAgICAgICAgICA3OiAxLFxuICAgICAgICAgICAgICAgIDg6IDI3LFxuICAgICAgICAgICAgICAgIDk6IDEzLFxuICAgICAgICAgICAgICAgIDEwOiAxNixcbiAgICAgICAgICAgICAgICAxMTogMjIsXG4gICAgICAgICAgICAgICAgMTI6IDI0LFxuICAgICAgICAgICAgICAgIDEzOiA5LFxuICAgICAgICAgICAgICAgIDE0OiAyMSxcbiAgICAgICAgICAgICAgICAxNTogNCxcbiAgICAgICAgICAgICAgICAxNjogMTAsXG4gICAgICAgICAgICAgICAgMTc6IDI1LFxuICAgICAgICAgICAgICAgIDE4OiA2LFxuICAgICAgICAgICAgICAgIDE5OiAwLFxuICAgICAgICAgICAgICAgIDIwOiAyNixcbiAgICAgICAgICAgICAgICAyMTogMTQsXG4gICAgICAgICAgICAgICAgMjI6IDExLFxuICAgICAgICAgICAgICAgIDIzOiAyLFxuICAgICAgICAgICAgICAgIDI0OiAxMixcbiAgICAgICAgICAgICAgICAyNTogMTcsXG4gICAgICAgICAgICAgICAgMjY6IDIwLFxuICAgICAgICAgICAgICAgIDI3OiA4LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMCxcbiAgICAgICAgICAgICAgICAxOiA4LFxuICAgICAgICAgICAgICAgIDI6IDI3LFxuICAgICAgICAgICAgICAgIDM6IDcsXG4gICAgICAgICAgICAgICAgNDogMTQsXG4gICAgICAgICAgICAgICAgNTogMTMsXG4gICAgICAgICAgICAgICAgNjogMjMsXG4gICAgICAgICAgICAgICAgNzogMyxcbiAgICAgICAgICAgICAgICA4OiAxLFxuICAgICAgICAgICAgICAgIDk6IDE2LFxuICAgICAgICAgICAgICAgIDEwOiAxOCxcbiAgICAgICAgICAgICAgICAxMTogMjEsXG4gICAgICAgICAgICAgICAgMTI6IDI2LFxuICAgICAgICAgICAgICAgIDEzOiA1LFxuICAgICAgICAgICAgICAgIDE0OiA0LFxuICAgICAgICAgICAgICAgIDE1OiAyNCxcbiAgICAgICAgICAgICAgICAxNjogOSxcbiAgICAgICAgICAgICAgICAxNzogMjIsXG4gICAgICAgICAgICAgICAgMTg6IDEwLFxuICAgICAgICAgICAgICAgIDE5OiAyNSxcbiAgICAgICAgICAgICAgICAyMDogMCxcbiAgICAgICAgICAgICAgICAyMTogMTEsXG4gICAgICAgICAgICAgICAgMjI6IDE3LFxuICAgICAgICAgICAgICAgIDIzOiA2LFxuICAgICAgICAgICAgICAgIDI0OiAxNSxcbiAgICAgICAgICAgICAgICAyNTogMTksXG4gICAgICAgICAgICAgICAgMjY6IDEyLFxuICAgICAgICAgICAgICAgIDI3OiAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMSxcbiAgICAgICAgICAgICAgICAxOiAyNyxcbiAgICAgICAgICAgICAgICAyOiAxNCxcbiAgICAgICAgICAgICAgICAzOiAxNyxcbiAgICAgICAgICAgICAgICA0OiA4LFxuICAgICAgICAgICAgICAgIDU6IDIyLFxuICAgICAgICAgICAgICAgIDY6IDEyLFxuICAgICAgICAgICAgICAgIDc6IDEzLFxuICAgICAgICAgICAgICAgIDg6IDQsXG4gICAgICAgICAgICAgICAgOTogMjAsXG4gICAgICAgICAgICAgICAgMTA6IDI0LFxuICAgICAgICAgICAgICAgIDExOiAyMyxcbiAgICAgICAgICAgICAgICAxMjogNixcbiAgICAgICAgICAgICAgICAxMzogNyxcbiAgICAgICAgICAgICAgICAxNDogMixcbiAgICAgICAgICAgICAgICAxNTogMTYsXG4gICAgICAgICAgICAgICAgMTY6IDE1LFxuICAgICAgICAgICAgICAgIDE3OiAzLFxuICAgICAgICAgICAgICAgIDE4OiAyNSxcbiAgICAgICAgICAgICAgICAxOTogMjYsXG4gICAgICAgICAgICAgICAgMjA6IDksXG4gICAgICAgICAgICAgICAgMjE6IDAsXG4gICAgICAgICAgICAgICAgMjI6IDUsXG4gICAgICAgICAgICAgICAgMjM6IDExLFxuICAgICAgICAgICAgICAgIDI0OiAxMCxcbiAgICAgICAgICAgICAgICAyNTogMTgsXG4gICAgICAgICAgICAgICAgMjY6IDE5LFxuICAgICAgICAgICAgICAgIDI3OiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMixcbiAgICAgICAgICAgICAgICAxOiAxMyxcbiAgICAgICAgICAgICAgICAyOiAxNixcbiAgICAgICAgICAgICAgICAzOiAxMCxcbiAgICAgICAgICAgICAgICA0OiAyMyxcbiAgICAgICAgICAgICAgICA1OiA4LFxuICAgICAgICAgICAgICAgIDY6IDIxLFxuICAgICAgICAgICAgICAgIDc6IDE1LFxuICAgICAgICAgICAgICAgIDg6IDUsXG4gICAgICAgICAgICAgICAgOTogMjYsXG4gICAgICAgICAgICAgICAgMTA6IDMsXG4gICAgICAgICAgICAgICAgMTE6IDI3LFxuICAgICAgICAgICAgICAgIDEyOiAyNSxcbiAgICAgICAgICAgICAgICAxMzogMSxcbiAgICAgICAgICAgICAgICAxNDogMTcsXG4gICAgICAgICAgICAgICAgMTU6IDcsXG4gICAgICAgICAgICAgICAgMTY6IDIsXG4gICAgICAgICAgICAgICAgMTc6IDE0LFxuICAgICAgICAgICAgICAgIDE4OiAyNCxcbiAgICAgICAgICAgICAgICAxOTogMjAsXG4gICAgICAgICAgICAgICAgMjA6IDE5LFxuICAgICAgICAgICAgICAgIDIxOiA2LFxuICAgICAgICAgICAgICAgIDIyOiAwLFxuICAgICAgICAgICAgICAgIDIzOiA0LFxuICAgICAgICAgICAgICAgIDI0OiAxOCxcbiAgICAgICAgICAgICAgICAyNTogMTIsXG4gICAgICAgICAgICAgICAgMjY6IDksXG4gICAgICAgICAgICAgICAgMjc6IDExLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyMyxcbiAgICAgICAgICAgICAgICAxOiAxMixcbiAgICAgICAgICAgICAgICAyOiAxMCxcbiAgICAgICAgICAgICAgICAzOiAxMyxcbiAgICAgICAgICAgICAgICA0OiAxNyxcbiAgICAgICAgICAgICAgICA1OiAxOSxcbiAgICAgICAgICAgICAgICA2OiAxNixcbiAgICAgICAgICAgICAgICA3OiAyNyxcbiAgICAgICAgICAgICAgICA4OiAyMCxcbiAgICAgICAgICAgICAgICA5OiAyMixcbiAgICAgICAgICAgICAgICAxMDogMixcbiAgICAgICAgICAgICAgICAxMTogMjQsXG4gICAgICAgICAgICAgICAgMTI6IDEsXG4gICAgICAgICAgICAgICAgMTM6IDMsXG4gICAgICAgICAgICAgICAgMTQ6IDI2LFxuICAgICAgICAgICAgICAgIDE1OiAyNSxcbiAgICAgICAgICAgICAgICAxNjogNixcbiAgICAgICAgICAgICAgICAxNzogNCxcbiAgICAgICAgICAgICAgICAxODogMjEsXG4gICAgICAgICAgICAgICAgMTk6IDUsXG4gICAgICAgICAgICAgICAgMjA6IDgsXG4gICAgICAgICAgICAgICAgMjE6IDE4LFxuICAgICAgICAgICAgICAgIDIyOiA5LFxuICAgICAgICAgICAgICAgIDIzOiAwLFxuICAgICAgICAgICAgICAgIDI0OiAxMSxcbiAgICAgICAgICAgICAgICAyNTogMTUsXG4gICAgICAgICAgICAgICAgMjY6IDE0LFxuICAgICAgICAgICAgICAgIDI3OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNCxcbiAgICAgICAgICAgICAgICAxOiAyMCxcbiAgICAgICAgICAgICAgICAyOiA4LFxuICAgICAgICAgICAgICAgIDM6IDI3LFxuICAgICAgICAgICAgICAgIDQ6IDI2LFxuICAgICAgICAgICAgICAgIDU6IDE4LFxuICAgICAgICAgICAgICAgIDY6IDIyLFxuICAgICAgICAgICAgICAgIDc6IDEyLFxuICAgICAgICAgICAgICAgIDg6IDIsXG4gICAgICAgICAgICAgICAgOTogMjEsXG4gICAgICAgICAgICAgICAgMTA6IDE3LFxuICAgICAgICAgICAgICAgIDExOiAxOSxcbiAgICAgICAgICAgICAgICAxMjogNyxcbiAgICAgICAgICAgICAgICAxMzogMjUsXG4gICAgICAgICAgICAgICAgMTQ6IDE2LFxuICAgICAgICAgICAgICAgIDE1OiAyMyxcbiAgICAgICAgICAgICAgICAxNjogMTQsXG4gICAgICAgICAgICAgICAgMTc6IDEwLFxuICAgICAgICAgICAgICAgIDE4OiA1LFxuICAgICAgICAgICAgICAgIDE5OiAxMSxcbiAgICAgICAgICAgICAgICAyMDogMSxcbiAgICAgICAgICAgICAgICAyMTogOSxcbiAgICAgICAgICAgICAgICAyMjogNixcbiAgICAgICAgICAgICAgICAyMzogMTUsXG4gICAgICAgICAgICAgICAgMjQ6IDAsXG4gICAgICAgICAgICAgICAgMjU6IDEzLFxuICAgICAgICAgICAgICAgIDI2OiA0LFxuICAgICAgICAgICAgICAgIDI3OiAzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNSxcbiAgICAgICAgICAgICAgICAxOiAxMCxcbiAgICAgICAgICAgICAgICAyOiAxOCxcbiAgICAgICAgICAgICAgICAzOiA0LFxuICAgICAgICAgICAgICAgIDQ6IDMsXG4gICAgICAgICAgICAgICAgNTogMjAsXG4gICAgICAgICAgICAgICAgNjogMjcsXG4gICAgICAgICAgICAgICAgNzogMTYsXG4gICAgICAgICAgICAgICAgODogMjQsXG4gICAgICAgICAgICAgICAgOTogMTUsXG4gICAgICAgICAgICAgICAgMTA6IDEsXG4gICAgICAgICAgICAgICAgMTE6IDEyLFxuICAgICAgICAgICAgICAgIDEyOiAxMSxcbiAgICAgICAgICAgICAgICAxMzogMjYsXG4gICAgICAgICAgICAgICAgMTQ6IDIyLFxuICAgICAgICAgICAgICAgIDE1OiA5LFxuICAgICAgICAgICAgICAgIDE2OiA3LFxuICAgICAgICAgICAgICAgIDE3OiAyMSxcbiAgICAgICAgICAgICAgICAxODogMixcbiAgICAgICAgICAgICAgICAxOTogMjMsXG4gICAgICAgICAgICAgICAgMjA6IDUsXG4gICAgICAgICAgICAgICAgMjE6IDE3LFxuICAgICAgICAgICAgICAgIDIyOiAxNCxcbiAgICAgICAgICAgICAgICAyMzogMTksXG4gICAgICAgICAgICAgICAgMjQ6IDgsXG4gICAgICAgICAgICAgICAgMjU6IDAsXG4gICAgICAgICAgICAgICAgMjY6IDEzLFxuICAgICAgICAgICAgICAgIDI3OiA2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNixcbiAgICAgICAgICAgICAgICAxOiAxNyxcbiAgICAgICAgICAgICAgICAyOiAyMCxcbiAgICAgICAgICAgICAgICAzOiAxOSxcbiAgICAgICAgICAgICAgICA0OiAxMixcbiAgICAgICAgICAgICAgICA1OiAyNyxcbiAgICAgICAgICAgICAgICA2OiAxMCxcbiAgICAgICAgICAgICAgICA3OiAyMyxcbiAgICAgICAgICAgICAgICA4OiAyMSxcbiAgICAgICAgICAgICAgICA5OiAxOCxcbiAgICAgICAgICAgICAgICAxMDogNixcbiAgICAgICAgICAgICAgICAxMTogMTYsXG4gICAgICAgICAgICAgICAgMTI6IDQsXG4gICAgICAgICAgICAgICAgMTM6IDI0LFxuICAgICAgICAgICAgICAgIDE0OiAyNSxcbiAgICAgICAgICAgICAgICAxNTogMjIsXG4gICAgICAgICAgICAgICAgMTY6IDExLFxuICAgICAgICAgICAgICAgIDE3OiAxLFxuICAgICAgICAgICAgICAgIDE4OiA5LFxuICAgICAgICAgICAgICAgIDE5OiAzLFxuICAgICAgICAgICAgICAgIDIwOiAyLFxuICAgICAgICAgICAgICAgIDIxOiA4LFxuICAgICAgICAgICAgICAgIDIyOiAxNSxcbiAgICAgICAgICAgICAgICAyMzogNyxcbiAgICAgICAgICAgICAgICAyNDogMTMsXG4gICAgICAgICAgICAgICAgMjU6IDE0LFxuICAgICAgICAgICAgICAgIDI2OiAwLFxuICAgICAgICAgICAgICAgIDI3OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAwOiAyNyxcbiAgICAgICAgICAgICAgICAxOiA2LFxuICAgICAgICAgICAgICAgIDI6IDI1LFxuICAgICAgICAgICAgICAgIDM6IDgsXG4gICAgICAgICAgICAgICAgNDogMjIsXG4gICAgICAgICAgICAgICAgNTogMTYsXG4gICAgICAgICAgICAgICAgNjogMSxcbiAgICAgICAgICAgICAgICA3OiAxOCxcbiAgICAgICAgICAgICAgICA4OiAzLFxuICAgICAgICAgICAgICAgIDk6IDE5LFxuICAgICAgICAgICAgICAgIDEwOiAyNixcbiAgICAgICAgICAgICAgICAxMTogMTcsXG4gICAgICAgICAgICAgICAgMTI6IDIxLFxuICAgICAgICAgICAgICAgIDEzOiAyMyxcbiAgICAgICAgICAgICAgICAxNDogMjQsXG4gICAgICAgICAgICAgICAgMTU6IDIwLFxuICAgICAgICAgICAgICAgIDE2OiA1LFxuICAgICAgICAgICAgICAgIDE3OiAxMSxcbiAgICAgICAgICAgICAgICAxODogNyxcbiAgICAgICAgICAgICAgICAxOTogOSxcbiAgICAgICAgICAgICAgICAyMDogMTUsXG4gICAgICAgICAgICAgICAgMjE6IDEyLFxuICAgICAgICAgICAgICAgIDIyOiA0LFxuICAgICAgICAgICAgICAgIDIzOiAxMyxcbiAgICAgICAgICAgICAgICAyNDogMTQsXG4gICAgICAgICAgICAgICAgMjU6IDIsXG4gICAgICAgICAgICAgICAgMjY6IDEwLFxuICAgICAgICAgICAgICAgIDI3OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICB9O1xuXG4gICAgc3RhdGljIGdlbmVyYXRlVGFibGVGb3IyKG1lbWJlcklkczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlcklkcyA9IG1lbWJlcklkcy5zbGljZSgpO1xuICAgICAgICBpZiAobWVtYmVySWRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIG1lbWJlcklkcy5wdXNoKCdKT0tFUicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbnVtYmVyVGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlVGFibGUyKG1lbWJlcklkcy5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChudW1iZXJUYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVGFibGUubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWRDb2x1bW5bbWVtYmVySWRzW051bWJlcihpbmRleCldXSA9IG1lbWJlcklkc1tjb2x1bW5bTnVtYmVyKGluZGV4KV1dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWRDb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZW5lcmF0ZVRhYmxlMihudW1QcmF5ZXJzOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bVByYXllcnMgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlUGFydG5lcnM6IFBvc3NpYmxlUGFydG5lcnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHBvc3NpYmxlUGFydG5lcnNbaV0gPSBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5LmZpbHRlcigoaWQpID0+IGlkICE9PSBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYmxlOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnMgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHRhYmxlLnB1c2goe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVDb2x1bW4yKHRhYmxlLCAwLCBwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNvbHVtbjIoXG4gICAgICAgIHRhYmxlOiBDb2x1bW5bXSxcbiAgICAgICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICAgICAgcG9zc2libGVQYXJ0bmVyczogUG9zc2libGVQYXJ0bmVyc1xuICAgICk6IENvbHVtbltdIHwgZmFsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0YWJsZVtjb2x1bW5JbmRleF07XG4gICAgICAgIGNvbnN0IG5ld1Bvc3NpYmxlUGFydG5lcnMgPSBKc29uSGVscGVyLmRlZXBDb3B5KHBvc3NpYmxlUGFydG5lcnMpO1xuICAgICAgICBjb25zdCByZXMgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlUGFpcjIoY29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhYmxlW2NvbHVtbkluZGV4XSA9IHJlcy5jb2x1bW47XG4gICAgICAgIC8vIGNoZWNrIHNvbHZlZFxuICAgICAgICBpZiAoY29sdW1uSW5kZXggPT09IHRhYmxlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzID0gcmVzLnBvc3NpYmxlUGFydG5lcnM7XG4gICAgICAgIHJldHVybiBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlQ29sdW1uMih0YWJsZSwgY29sdW1uSW5kZXggKyAxLCBwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVBhaXIyKFxuICAgICAgICBjb2x1bW46IENvbHVtbixcbiAgICAgICAgcG9zc2libGVQYXJ0bmVyczogUG9zc2libGVQYXJ0bmVyc1xuICAgICk6IHsgY29sdW1uOiBDb2x1bW47IHBvc3NpYmxlUGFydG5lcnM6IFBvc3NpYmxlUGFydG5lcnMgfSB8IGZhbHNlIHtcbiAgICAgICAgY29uc3QgbWVtYmVyV2l0aG91dFBhcnRuZXIgPSBOdW1iZXIoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwb3NzaWJsZVBhcnRuZXJzKS5maW5kKChpZCkgPT4gY29sdW1uW051bWJlcihpZCldID09PSB1bmRlZmluZWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtZW1iZXJXaXRob3V0UGFydG5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbHVtbiwgcG9zc2libGVQYXJ0bmVycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld0NvbHVtbjogQ29sdW1uID0ge307XG4gICAgICAgIGxldCBuZXdQb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzID0ge307XG4gICAgICAgIGNvbnN0IGZvdW5kU29sdXRpb24gPSBwb3NzaWJsZVBhcnRuZXJzW21lbWJlcldpdGhvdXRQYXJ0bmVyXS5zb21lKChwYXJ0bmVySWQsIHBhcnRuZXJJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbltwYXJ0bmVySWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0bXBDb2x1bW4gPSBKc29uSGVscGVyLmRlZXBDb3B5KGNvbHVtbik7XG4gICAgICAgICAgICB0bXBDb2x1bW5bbWVtYmVyV2l0aG91dFBhcnRuZXJdID0gcGFydG5lcklkO1xuICAgICAgICAgICAgdG1wQ29sdW1uW3BhcnRuZXJJZF0gPSBtZW1iZXJXaXRob3V0UGFydG5lcjtcblxuICAgICAgICAgICAgY29uc3QgdG1wUG9zc2libGVQYXJ0bmVycyA9IEpzb25IZWxwZXIuZGVlcENvcHkocG9zc2libGVQYXJ0bmVycyk7XG4gICAgICAgICAgICB0bXBQb3NzaWJsZVBhcnRuZXJzW21lbWJlcldpdGhvdXRQYXJ0bmVyXS5zcGxpY2UocGFydG5lckluZGV4LCAxKTtcbiAgICAgICAgICAgIGNvbnN0IG90aGVySW5kZXggPSB0bXBQb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXJJZF0uZmluZEluZGV4KChpZCkgPT4gaWQgPT09IG1lbWJlcldpdGhvdXRQYXJ0bmVyKTtcbiAgICAgICAgICAgIHRtcFBvc3NpYmxlUGFydG5lcnNbcGFydG5lcklkXS5zcGxpY2Uob3RoZXJJbmRleCwgMSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVQYWlyMih0bXBDb2x1bW4sIHRtcFBvc3NpYmxlUGFydG5lcnMpO1xuICAgICAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdDb2x1bW4gPSByZXMuY29sdW1uO1xuICAgICAgICAgICAgbmV3UG9zc2libGVQYXJ0bmVycyA9IHJlcy5wb3NzaWJsZVBhcnRuZXJzO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChmb3VuZFNvbHV0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW46IG5ld0NvbHVtbiwgcG9zc2libGVQYXJ0bmVyczogbmV3UG9zc2libGVQYXJ0bmVycyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVUYWJsZXMoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlczogUmVjb3JkPG51bWJlciwgQ29sdW1uW10gfCBmYWxzZT4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPD0gMjg7IGkgKz0gMikge1xuICAgICAgICAgICAgdGFibGVzW2ldID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVRhYmxlKGkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdUQUJMRVMnLCBKU09OLnN0cmluZ2lmeSh0YWJsZXMpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVUYWJsZUZvcihcbiAgICAgICAgbWVtYmVySWRzOiBzdHJpbmdbXSxcbiAgICAgICAgdXNlUGFydG5lcnMgPSB0cnVlXG4gICAgKTogW2ZhbHNlLCBmYWxzZV0gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPltdLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W11dIHtcbiAgICAgICAgaWYgKG1lbWJlcklkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbW10sIFtdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbWJlcklkcyA9IG1lbWJlcklkcy5zbGljZSgpO1xuICAgICAgICBpZiAodXNlUGFydG5lcnMgJiYgbWVtYmVySWRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIG1lbWJlcklkcy5wdXNoKCdKT0tFUicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG51bWJlclRhYmxlOiBDb2x1bW5bXSB8IGZhbHNlO1xuICAgICAgICBpZiAoIXVzZVBhcnRuZXJzKSB7XG4gICAgICAgICAgICBudW1iZXJUYWJsZSA9IHRoaXMuZ2VuZXJhdGVDaGFpblRhYmxlRm9yKG1lbWJlcklkcy5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnVtYmVyVGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlVGFibGUobWVtYmVySWRzLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtYmVyVGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGUgPSBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmluZmxhdGVUYWJsZShtZW1iZXJJZHMsIG51bWJlclRhYmxlKTtcbiAgICAgICAgY29uc3QgaW52ZXJ0ZWRUYWJsZSA9IFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2V0SW52ZXJ0ZWRDaGFpblRhYmxlRm9yKHRhYmxlKTtcbiAgICAgICAgcmV0dXJuIFt0YWJsZSwgaW52ZXJ0ZWRUYWJsZV07XG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlVGFibGUobnVtUHJheWVyczogbnVtYmVyKTogUmVjb3JkPG51bWJlciwgbnVtYmVyPltdIHwgZmFsc2Uge1xuICAgICAgICBpZiAobnVtUHJheWVycyAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnRhYmxlc1tudW1QcmF5ZXJzXSkge1xuICAgICAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IudGFibGVzW251bVByYXllcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJlcGFyZSBwb3NzaWJsZSBwYXJ0bmVyc1xuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzQmFzZUFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvc3NpYmxlUGFydG5lcnM6IFJlY29yZDxudW1iZXIsIG51bWJlcltdPiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnM7IGkrKykge1xuICAgICAgICAgICAgcG9zc2libGVQYXJ0bmVyc1tpXSA9IHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkuZmlsdGVyKChpZCkgPT4gaWQgIT09IGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGU6IFJlY29yZDxudW1iZXIsIG51bWJlcj5bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHJheWVycyAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZUNvbHVtbihwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByYXllckNpcmNsZUNhbGN1bGF0b3IuZ2VuZXJhdGVUYWJsZTIobnVtUHJheWVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbLCBwb3NzaWJsZVBhcnRuZXJzXSA9IHJlcztcbiAgICAgICAgICAgIHRhYmxlLnB1c2gocmVzWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNvbHVtbihwb3NzaWJsZVBhcnRuZXJzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcnRuZXJCYXNlOiBudW1iZXJbXSA9IE9iamVjdC5rZXlzKHBvc3NpYmxlUGFydG5lcnMpLm1hcCgoaWQpID0+IE51bWJlcihpZCkpO1xuXG4gICAgICAgIHJldHVybiBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLmdlbmVyYXRlUGFpcihjb2x1bW4sIHBvc3NpYmxlUGFydG5lcnMsIHBhcnRuZXJCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZVBhaXIoXG4gICAgICAgIGNvbHVtbjogQ29sdW1uLFxuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4sXG4gICAgICAgIG9wZW5QcmF5ZXJzOiBudW1iZXJbXVxuICAgICk6IGZhbHNlIHwgW0NvbHVtbiwgUG9zc2libGVQYXJ0bmVyc10ge1xuICAgICAgICBjb25zdCBuZXdQb3NzaWJsZVBhcnRuZXJzID0gSnNvbkhlbHBlci5kZWVwQ29weShwb3NzaWJsZVBhcnRuZXJzKTtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gSnNvbkhlbHBlci5kZWVwQ29weShjb2x1bW4pO1xuXG4gICAgICAgIGlmIChvcGVuUHJheWVycy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdFBhcnRuZXIsIHNlY29uZFBhcnRuZXJdID0gb3BlblByYXllcnM7XG4gICAgICAgICAgICBQcmF5ZXJDaXJjbGVDYWxjdWxhdG9yLnNldFBhcnRuZXJzKG5ld0NvbHVtbiwgbmV3UG9zc2libGVQYXJ0bmVycywgZmlyc3RQYXJ0bmVyLCBzZWNvbmRQYXJ0bmVyKTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3Q29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXJbXT4gPSB7fTtcbiAgICAgICAgY29uc3QgW2ZpcnN0UGFydG5lcl0gPSBvcGVuUHJheWVycy5yZWR1Y2UoXG4gICAgICAgICAgICAoW3ByZXZJZCwgcHJldlZhbF06IFtudW1iZXIsIG51bWJlcl0sIGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhbFBvc3NpYmxlUGFydG5lcnMgPSBuZXdQb3NzaWJsZVBhcnRuZXJzW2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChvdGhlcklkKSA9PiAobmV3Q29sdW1uW290aGVySWRdID8/IC0xKSA9PT0gLTFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2lkXSA9IHJlYWxQb3NzaWJsZVBhcnRuZXJzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZWYWwgPiByZWFsUG9zc2libGVQYXJ0bmVycy5sZW5ndGggPyBbaWQsIHJlYWxQb3NzaWJsZVBhcnRuZXJzLmxlbmd0aF0gOiBbcHJldklkLCBwcmV2VmFsXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbLTEsIEluZmluaXR5XVxuICAgICAgICApO1xuXG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IFtzZWNvbmRQYXJ0bmVyXSA9IHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2ZpcnN0UGFydG5lcl0ucmVkdWNlKFxuICAgICAgICAgICAgICAgIChbcHJldklkLCBwcmV2VmFsXSwgaWQpID0+XG4gICAgICAgICAgICAgICAgICAgIHByZXZWYWwgPiByZWFsUG9zc2libGVQYXJ0bmVyc01hcFtpZF0ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtpZCwgcmVhbFBvc3NpYmxlUGFydG5lcnNNYXBbaWRdLmxlbmd0aF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW3ByZXZJZCwgcHJldlZhbF0sXG4gICAgICAgICAgICAgICAgWy0xLCBJbmZpbml0eV1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWNvbmRQYXJ0bmVyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5zZXRQYXJ0bmVycyhuZXdDb2x1bW4sIG5ld1Bvc3NpYmxlUGFydG5lcnMsIGZpcnN0UGFydG5lciwgc2Vjb25kUGFydG5lcik7XG4gICAgICAgICAgICBjb25zdCBuZXdPcGVuUHJheWVycyA9IG9wZW5QcmF5ZXJzLmZpbHRlcigoaWQpID0+IGlkICE9PSBmaXJzdFBhcnRuZXIgJiYgaWQgIT09IHNlY29uZFBhcnRuZXIpO1xuICAgICAgICAgICAgcmVzID0gUHJheWVyQ2lyY2xlQ2FsY3VsYXRvci5nZW5lcmF0ZVBhaXIobmV3Q29sdW1uLCBuZXdQb3NzaWJsZVBhcnRuZXJzLCBuZXdPcGVuUHJheWVycyk7XG4gICAgICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJlYWxQb3NzaWJsZVBhcnRuZXJzTWFwW2ZpcnN0UGFydG5lcl0uc3BsaWNlKFxuICAgICAgICAgICAgICAgICAgICByZWFsUG9zc2libGVQYXJ0bmVyc01hcFtmaXJzdFBhcnRuZXJdLmluZGV4T2Yoc2Vjb25kUGFydG5lciksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghcmVzKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNldFBhcnRuZXJzKGNvbHVtbjogQ29sdW1uLCBwb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzLCBwYXJ0bmVyMTogbnVtYmVyLCBwYXJ0bmVyMjogbnVtYmVyKSB7XG4gICAgICAgIGNvbHVtbltwYXJ0bmVyMV0gPSBwYXJ0bmVyMjtcbiAgICAgICAgY29sdW1uW3BhcnRuZXIyXSA9IHBhcnRuZXIxO1xuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXIxXS5zcGxpY2UocG9zc2libGVQYXJ0bmVyc1twYXJ0bmVyMV0uaW5kZXhPZihwYXJ0bmVyMiksIDEpO1xuICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW3BhcnRuZXIyXS5zcGxpY2UocG9zc2libGVQYXJ0bmVyc1twYXJ0bmVyMl0uaW5kZXhPZihwYXJ0bmVyMSksIDEpO1xuXG4gICAgICAgIHJldHVybiBbY29sdW1uLCBwb3NzaWJsZVBhcnRuZXJzXSBhcyBbQ29sdW1uLCBQb3NzaWJsZVBhcnRuZXJzXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZW5lcmF0ZUNoYWluVGFibGVGb3IobnVtUHJheWVyczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1QcmF5ZXJzIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzOyBpKyspIHtcbiAgICAgICAgICAgIHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NzaWJsZVBhcnRuZXJzOiBQb3NzaWJsZVBhcnRuZXJzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHJheWVyczsgaSsrKSB7XG4gICAgICAgICAgICBwb3NzaWJsZVBhcnRuZXJzW2ldID0gcG9zc2libGVQYXJ0bmVyc0Jhc2VBcnJheS5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gaSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJsZTogUmVjb3JkPG51bWJlciwgbnVtYmVyPltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1QcmF5ZXJzIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB0YWJsZS5wdXNoKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc3NpYmxlUGFydG5lcnNCYXNlQXJyYXkuZm9yRWFjaCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJNZW1iZXJzID0gcG9zc2libGVQYXJ0bmVyc1ttZW1iZXJdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVByYXllcnMgLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWJsZVtpXVttZW1iZXJdID0gb3RoZXJNZW1iZXJzWyhpbmRleCArIGkpICUgb3RoZXJNZW1iZXJzLmxlbmd0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW52ZXJ0ZWRDaGFpblRhYmxlRm9yKHRhYmxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10pIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnZlcnRlZENvbHVtbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKChpZDEpID0+IHtcbiAgICAgICAgICAgICAgICBpbnZlcnRlZENvbHVtbltjb2x1bW5baWQxXV0gPSBpZDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZlcnRlZENvbHVtbjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5mbGF0ZVRhYmxlKG1lbWJlcklkczogc3RyaW5nW10sIHRhYmxlOiBDb2x1bW5bXSkge1xuICAgICAgICByZXR1cm4gdGFibGUubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkQ29sdW1uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW4pLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWRDb2x1bW5bbWVtYmVySWRzW051bWJlcihpbmRleCldXSA9IG1lbWJlcklkc1tjb2x1bW5bTnVtYmVyKGluZGV4KV1dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWRDb2x1bW47XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoZWNrYm94LCBTd2l0Y2ggfSBmcm9tICdyZWFjdC1ib290c3RyYXAtbW9iaWxlJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQXBwRGlzcGF0Y2gsIHVzZUFwcFNlbGVjdG9yIH0gZnJvbSAnLi4vU3RvcmUvcmVkdXhIb29rcyc7XG5pbXBvcnQgeyBzZXRVc2VQYXJ0bmVycywgc2V0VXNlV2Vla2RheXMgfSBmcm9tICcuL3ByYXllckNpcmNsZVNsaWNlJztcbmltcG9ydCB7IHNldERlc2lnbiB9IGZyb20gJy4uL1NldHRpbmdzL3NldHRpbmdzU2xpY2UnO1xuXG5leHBvcnQgdHlwZSBQcmF5ZXJDaXJjbGVTZXR0aW5nc1Byb3BzID0ge307XG5cbmZ1bmN0aW9uIFByYXllckNpcmNsZVNldHRpbmdzKHt9OiBQcmF5ZXJDaXJjbGVTZXR0aW5nc1Byb3BzKSB7XG4gICAgLy8gVmFyaWFibGVzXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VBcHBEaXNwYXRjaCgpO1xuICAgIGNvbnN0IHVzZVdlZWtkYXlzID0gdXNlQXBwU2VsZWN0b3IoKHN0b3JlKSA9PiBzdG9yZS5wcmF5ZXJDaXJjbGUudXNlV2Vla2RheXMgPz8gZmFsc2UpO1xuICAgIGNvbnN0IHVzZVBhcnRuZXJzID0gdXNlQXBwU2VsZWN0b3IoKHN0b3JlKSA9PiBzdG9yZS5wcmF5ZXJDaXJjbGUudXNlUGFydG5lcnMgPz8gdHJ1ZSk7XG4gICAgY29uc3QgZGVzaWduID0gdXNlQXBwU2VsZWN0b3IoKHN0YXRlKSA9PiBzdGF0ZS5zZXR0aW5ncy5kZXNpZ24pO1xuXG4gICAgLy8gU3RhdGVzXG5cbiAgICAvLyBSZWZzXG5cbiAgICAvLyBDYWxsYmFja3NcbiAgICBjb25zdCBvbkNoYW5nZVVzZVdlZWtkYXlzID0gdXNlQ2FsbGJhY2soKHsgdGFyZ2V0OiB7IGNoZWNrZWQgfSB9KSA9PiBkaXNwYXRjaChzZXRVc2VXZWVrZGF5cyhjaGVja2VkKSksIFtkaXNwYXRjaF0pO1xuICAgIGNvbnN0IG9uQ2hhbmdlVXNlUGFydG5lcnMgPSB1c2VDYWxsYmFjaygoeyB0YXJnZXQ6IHsgY2hlY2tlZCB9IH0pID0+IGRpc3BhdGNoKHNldFVzZVBhcnRuZXJzKGNoZWNrZWQpKSwgW2Rpc3BhdGNoXSk7XG4gICAgY29uc3QgdG9nZ2xlVGhlbWVDYWxsYmFjayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgaWYgKGRlc2lnbiA9PT0gJ21hdGVyaWFsJykge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0RGVzaWduKCdmbGF0JykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0RGVzaWduKCdtYXRlcmlhbCcpKTtcbiAgICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgZGVzaWduXSk7XG5cbiAgICAvLyBFZmZlY3RzXG5cbiAgICAvLyBPdGhlclxuXG4gICAgLy8gUmVuZGVyIEZ1bmN0aW9uc1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxTd2l0Y2ggcHJlTGFiZWw9XCJLZXR0ZVwiIG9uQ2hhbmdlPXtvbkNoYW5nZVVzZVBhcnRuZXJzfSBjaGVja2VkPXt1c2VQYXJ0bmVyc30+XG4gICAgICAgICAgICAgICAgUGFydG5lclxuICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxDaGVja2JveCBsYWJlbD1cIkJlbnV0emUgV29jaGVudGFnZVwiIGNoZWNrZWQ9e3VzZVdlZWtkYXlzfSBvbkNoYW5nZT17b25DaGFuZ2VVc2VXZWVrZGF5c30gLz5cbiAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgIGlkPVwic3dpdGNoVGhlbWVcIlxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2Rlc2lnbiA9PT0gJ2ZsYXQnfVxuICAgICAgICAgICAgICAgIHByZUxhYmVsPVwiYW5kcm9pZFwiXG4gICAgICAgICAgICAgICAgaXNEdWFsPXt0cnVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0b2dnbGVUaGVtZUNhbGxiYWNrfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIGlvc1xuICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgIDwvPlxuICAgICk7XG59XG5cbmNvbnN0IHRtcCA9IFJlYWN0Lm1lbW8oUHJheWVyQ2lyY2xlU2V0dGluZ3MpIGFzIHR5cGVvZiBQcmF5ZXJDaXJjbGVTZXR0aW5ncztcbmV4cG9ydCB7IHRtcCBhcyBQcmF5ZXJDaXJjbGVTZXR0aW5ncyB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UsIFBheWxvYWRBY3Rpb24gfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcbmltcG9ydCB7IE1lbWJlclR5cGUgfSBmcm9tICcuL01lbWJlclR5cGUnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAncHJveHktbWVtb2l6ZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlU3RhdGUgfSBmcm9tICcuLi9TdG9yZS9zdG9yZSc7XG5cbmV4cG9ydCBjb25zdCBwcmF5ZXJDaXJjbGVTbGljZSA9IGNyZWF0ZVNsaWNlKHtcbiAgICBuYW1lOiAncHJheWVyQ2lyY2xlJyxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgbWVtYmVyczoge30gYXMgUmVjb3JkPHN0cmluZywgTWVtYmVyVHlwZT4sXG4gICAgICAgIHdlZWs6IDAsXG4gICAgICAgIHVzZVdlZWtkYXlzOiBmYWxzZSxcbiAgICAgICAgdXNlUGFydG5lcnM6IHRydWUsXG4gICAgfSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgICBzYXZlTWVtYmVyOiAoc3RhdGUsIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxNZW1iZXJUeXBlPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgICAgICBzdGF0ZS5tZW1iZXJzW21lbWJlci5pZF0gPSBtZW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZU1lbWJlcjogKHN0YXRlLCB7IHBheWxvYWQ6IG1lbWJlcklkIH06IFBheWxvYWRBY3Rpb248c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLm1lbWJlcnNbbWVtYmVySWRdO1xuICAgICAgICB9LFxuICAgICAgICBzZXRXZWVrOiAoc3RhdGUsIHsgcGF5bG9hZDogd2VlayB9OiBQYXlsb2FkQWN0aW9uPG51bWJlcj4pID0+IHtcbiAgICAgICAgICAgIHN0YXRlLndlZWsgPSB3ZWVrO1xuICAgICAgICB9LFxuICAgICAgICBzZXRVc2VXZWVrZGF5czogKHN0YXRlLCB7IHBheWxvYWQ6IHVzZVdlZWtkYXlzIH06IFBheWxvYWRBY3Rpb248Ym9vbGVhbj4pID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnVzZVdlZWtkYXlzID0gdXNlV2Vla2RheXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFVzZVBhcnRuZXJzOiAoc3RhdGUsIHsgcGF5bG9hZDogdXNlUGFydG5lcnMgfTogUGF5bG9hZEFjdGlvbjxib29sZWFuPikgPT4ge1xuICAgICAgICAgICAgc3RhdGUudXNlUGFydG5lcnMgPSB1c2VQYXJ0bmVycztcbiAgICAgICAgfSxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCB7IHNhdmVNZW1iZXIsIHJlbW92ZU1lbWJlciwgc2V0V2Vlaywgc2V0VXNlV2Vla2RheXMsIHNldFVzZVBhcnRuZXJzIH0gPSBwcmF5ZXJDaXJjbGVTbGljZS5hY3Rpb25zO1xuZXhwb3J0IGNvbnN0IHsgcmVkdWNlcjogcHJheWVyQ2lyY2xlIH0gPSBwcmF5ZXJDaXJjbGVTbGljZTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE1lbWJlcnMgPSBtZW1vaXplKChzdGF0ZTogU3RvcmVTdGF0ZSkgPT4gT2JqZWN0LnZhbHVlcyhzdGF0ZS5wcmF5ZXJDaXJjbGUubWVtYmVycykpO1xuZXhwb3J0IGNvbnN0IHNlbGVjdE1lbWJlcklkcyA9IG1lbW9pemUoKHN0YXRlOiBTdG9yZVN0YXRlKSA9PiBPYmplY3Qua2V5cyhzdGF0ZS5wcmF5ZXJDaXJjbGUubWVtYmVycykpO1xuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UsIFBheWxvYWRBY3Rpb24gfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzU2xpY2UgPSBjcmVhdGVTbGljZSh7XG4gICAgbmFtZTogJ3NldHRpbmdzJyxcbiAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgZGVzaWduOiAnbWF0ZXJpYWwnIGFzICdtYXRlcmlhbCcgfCAnZmxhdCcsXG4gICAgfSxcbiAgICByZWR1Y2Vyczoge1xuICAgICAgICBzZXREZXNpZ246IChzdGF0ZSwgeyBwYXlsb2FkOiBkZXNpZ24gfTogUGF5bG9hZEFjdGlvbjwnbWF0ZXJpYWwnIHwgJ2ZsYXQnPikgPT4ge1xuICAgICAgICAgICAgc3RhdGUuZGVzaWduID0gZGVzaWduO1xuICAgICAgICB9LFxuICAgIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IHsgc2V0RGVzaWduIH0gPSBzZXR0aW5nc1NsaWNlLmFjdGlvbnM7XG5leHBvcnQgY29uc3QgeyByZWR1Y2VyOiBzZXR0aW5ncyB9ID0gc2V0dGluZ3NTbGljZTtcbiIsImltcG9ydCB7IFR5cGVkVXNlU2VsZWN0b3JIb29rLCB1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3IgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlU3RhdGUsIEFwcERpc3BhdGNoIH0gZnJvbSAnLi9zdG9yZSc7XG5cbi8vIFVzZSB0aHJvdWdob3V0IHlvdXIgYXBwIGluc3RlYWQgb2YgcGxhaW4gYHVzZURpc3BhdGNoYCBhbmQgYHVzZVNlbGVjdG9yYFxuZXhwb3J0IGNvbnN0IHVzZUFwcERpc3BhdGNoID0gKCkgPT4gdXNlRGlzcGF0Y2g8QXBwRGlzcGF0Y2g+KCk7XG5leHBvcnQgY29uc3QgdXNlQXBwU2VsZWN0b3I6IFR5cGVkVXNlU2VsZWN0b3JIb29rPFN0b3JlU3RhdGU+ID0gdXNlU2VsZWN0b3I7XG4iLCJpbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMsIGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSAnQHJlZHV4anMvdG9vbGtpdCc7XG5pbXBvcnQgeyBwcmF5ZXJDaXJjbGUgfSBmcm9tICcuLi9QcmF5ZXJDaXJjbGUvcHJheWVyQ2lyY2xlU2xpY2UnO1xuaW1wb3J0IHsgTmF0aXZlU3RvcmFnZVByb21pc2UgfSBmcm9tICdjb3Jkb3ZhLXNpdGVzJztcbmltcG9ydCB7IHBlcnNpc3RSZWR1Y2VyLCBwZXJzaXN0U3RvcmUsIEZMVVNILCBSRUhZRFJBVEUsIFBBVVNFLCBQRVJTSVNULCBQVVJHRSwgUkVHSVNURVIgfSBmcm9tICdyZWR1eC1wZXJzaXN0JztcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSAnLi4vU2V0dGluZ3Mvc2V0dGluZ3NTbGljZSc7XG5cbmNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAgICBwcmF5ZXJDaXJjbGUsXG4gICAgc2V0dGluZ3MsXG59KTtcblxuY29uc3QgcGVyc2lzdENvbmZpZyA9IHtcbiAgICBrZXk6ICdyZWR1eC1zdG9yZScsXG4gICAgdmVyc2lvbjogMSxcbiAgICBzdG9yYWdlOiBOYXRpdmVTdG9yYWdlUHJvbWlzZSxcbn07XG5cbmNvbnN0IHBlcnNpc3RlZFJlZHVjZXIgPSBwZXJzaXN0UmVkdWNlcihwZXJzaXN0Q29uZmlnLCByZWR1Y2Vycyk7XG5cbmV4cG9ydCBjb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICByZWR1Y2VyOiBwZXJzaXN0ZWRSZWR1Y2VyLFxuICAgIG1pZGRsZXdhcmU6IChnZXREZWZhdWx0TWlkZGxld2FyZSkgPT5cbiAgICAgICAgZ2V0RGVmYXVsdE1pZGRsZXdhcmUoe1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQ2hlY2s6IHsgaWdub3JlZEFjdGlvbnM6IFtGTFVTSCwgUkVIWURSQVRFLCBQQVVTRSwgUEVSU0lTVCwgUFVSR0UsIFJFR0lTVEVSXSB9LFxuICAgICAgICB9KSxcbn0pO1xuXG4vLyBsZXQgc2F2ZVRpbWVvdXQ6IFRpbWVvdXRJZCB8IHVuZGVmaW5lZDtcbi8vIHN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4vLyAgICAgaWYgKCFzYXZlVGltZW91dCkge1xuLy8gICAgICAgICBzYXZlVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuLy8gICAgICAgICAgICAgc2F2ZVRpbWVvdXQgPSB1bmRlZmluZWQ7XG4vLyAgICAgICAgICAgICBjb25zdCBkYXRhID0gc3RvcmUuZ2V0U3RhdGUoKTtcbi8vICAgICAgICAgICAgIGF3YWl0IE5hdGl2ZVN0b3JhZ2VQcm9taXNlLnNldEl0ZW0oYHN0b3JlLWRhdGFgLCBkYXRhKTtcbi8vICAgICAgICAgfSwgNTAwKTtcbi8vICAgICB9XG4vLyB9KTtcbmV4cG9ydCBjb25zdCBwZXJzaXN0b3IgPSBwZXJzaXN0U3RvcmUoc3RvcmUpO1xuXG5leHBvcnQgdHlwZSBTdG9yZVN0YXRlID0gUmV0dXJuVHlwZTx0eXBlb2Ygc3RvcmUuZ2V0U3RhdGU+O1xuZXhwb3J0IHR5cGUgQXBwRGlzcGF0Y2ggPSB0eXBlb2Ygc3RvcmUuZGlzcGF0Y2g7XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgU2l0ZXMgfSBmcm9tICdjb3Jkb3ZhLXNpdGVzL2Rpc3QvY2xpZW50JztcblxuaW1wb3J0ICdib290c3RyYXAvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MnO1xuaW1wb3J0ICcuLi9zYXNzL2luZGV4LnNjc3MnO1xuXG5pbXBvcnQgeyBwZXJzaXN0b3IsIHN0b3JlIH0gZnJvbSAnLi9TdG9yZS9zdG9yZSc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFByYXllckNpcmNsZSB9IGZyb20gJy4vUHJheWVyQ2lyY2xlL1ByYXllckNpcmNsZSc7XG5pbXBvcnQgeyBQZXJzaXN0R2F0ZSB9IGZyb20gJ3JlZHV4LXBlcnNpc3QvaW50ZWdyYXRpb24vcmVhY3QnO1xuXG5jb25zdCBXcmFwcGVyID0gUmVhY3QubWVtbygoeyBjaGlsZHJlbiB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPFBlcnNpc3RHYXRlIHBlcnNpc3Rvcj17cGVyc2lzdG9yfSBsb2FkaW5nPXtudWxsfT5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9QZXJzaXN0R2F0ZT5cbiAgICApO1xufSk7XG5cblJlYWN0RE9NLnJlbmRlcihcbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlfT5cbiAgICAgICAgPFNpdGVzIHN0YXJ0U2l0ZT17UHJheWVyQ2lyY2xlfSBiYXNlUGF0aD17d2luZG93LmxvY2F0aW9uLm9yaWdpbn0gY29udGVudFdyYXBwZXI9e1dyYXBwZXJ9IC8+XG4gICAgPC9Qcm92aWRlcj4sXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWNvbnRhaW5lcicpXG4pO1xuXG5sZXQgb2xkRGVzaWduOiAnbWF0ZXJpYWwnIHwgJ2ZsYXQnID0gJ21hdGVyaWFsJztcbnN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgY29uc3QgbmV3RGVzaWduID0gc3RvcmUuZ2V0U3RhdGUoKS5zZXR0aW5ncy5kZXNpZ247XG4gICAgaWYgKG9sZERlc2lnbiAhPT0gbmV3RGVzaWduKSB7XG4gICAgICAgIG9sZERlc2lnbiA9IG5ld0Rlc2lnbjtcblxuICAgICAgICBpZiAobmV3RGVzaWduID09PSAnbWF0ZXJpYWwnKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2ZsYXQtZGVzaWduJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ21hdGVyaWFsLWRlc2lnbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtYXRlcmlhbC1kZXNpZ24nKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnZmxhdC1kZXNpZ24nKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/src/client/ts/PrayerCircle/PrayerCircle.tsx b/src/client/ts/PrayerCircle/PrayerCircle.tsx index 534d18b..6c5cbfa 100644 --- a/src/client/ts/PrayerCircle/PrayerCircle.tsx +++ b/src/client/ts/PrayerCircle/PrayerCircle.tsx @@ -50,4 +50,4 @@ function PrayerCircle({}: PrayerCircleProps) { const tmp = React.memo(PrayerCircle) as typeof PrayerCircle; export { tmp as PrayerCircle }; -Sites.addInitialization((app) => app.addDeepLink('/PrayerCircle', tmp)); +// Sites.addInitialization((app) => app.addDeepLink('/PrayerCircle', tmp));